[asterisk-bugs] [JIRA] (ASTERISK-24889) Possible bug: PJSIP: stateless behavior when transport=tcp

Joshua Colp (JIRA) noreply at issues.asterisk.org
Tue Mar 17 05:41:34 CDT 2015


    [ https://issues.asterisk.org/jira/browse/ASTERISK-24889?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=225483#comment-225483 ] 

Joshua Colp commented on ASTERISK-24889:
----------------------------------------

This is a duplicate of ASTERISK-22658. If a "transport" is specified PJSIP will currently never reuse TCP connections. As well in order to have the existing connection reused the "rewrite_contact" option needs to be set to yes so the target address is the source.

> Possible bug: PJSIP: stateless behavior when transport=tcp
> ----------------------------------------------------------
>
>                 Key: ASTERISK-24889
>                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-24889
>             Project: Asterisk
>          Issue Type: Bug
>      Security Level: None
>          Components: pjproject/pjsip
>    Affects Versions: 13.2.0
>         Environment: OS: Ubuntu 14.04, with all updates
> Kernel: 3.13.0-44-generic
> pjsip: 2.3 from http://www.pjsip.org/release/2.3/pjproject-2.3.tar.bz2 (./configure --prefix=/usr --enable-shared --enable-epoll; make; sudo make install)
> Asterisk: 13.2.0 from http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13.2.0.tar.gz (./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var; make; sudo make install) 
>            Reporter: Anatoli
>
> When an endpoint registers via TCP, PJSIP processes everything as corresponds: the communication is via TCP, REGISTER/ACK pass OK, the endpoint can even establish calls. But, when another endpoint calls to the first one, PJSIP sends INVITE message in a new TCP session to the already opened port.
> So if the registration was performed from TCP 55880 to 5060 and everything except INVITE flows in the same TCP session, INVITE is sent via a new TCP session from a random port on asterisk server (e.g. 32926) to the already opened 55880 port. With tcpdump I see a new SYN packet (and the already established TCP session was not closed/reset yet):
> {noformat}
> From: 10.101.10.1 (asterisk IP)
> To: 10.101.100.100 (endpoint IP)
> Source port: 32926
> Destination port: 55880
> Protocol: TCP
> TCP Data: [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=9227246 TSecr=0 WS=128
> {noformat}
> Naturally, the endpoint responds with a RST,ACK.
> The CLI shows the following:
> {noformat}
> ERROR[19352]: pjsip:0 <?>:    tcpc0x7fcdb404 TCP connect() error: Connection refused [code=120111]
> WARNING[19352]: pjsip:0 <?>:  tsx0x7fcdb402e Failed to send Request msg INVITE/cseq=31054 (tdta0x7fcdb4034260)! err=120111 (Connection refused)
> {noformat}
> Investigating the code, I've found that to send the INVITE message PJSIP calls pjsip_endpt_send_request_stateless, which, as the name indicates, behaves statelessly, though using TCP.
> Call trace:
> {noformat}
> sip_dialog.c at 1164 pjsip_dlg_send_request(INVITE) => @1214 call to pjsip_tsx_create_uac
> sip_transaction.c at 1266 pjsip_tsx_create_uac  => call to pjsip_tsx_create_uac2
> sip_transaction.c at 1273 pjsip_tsx_create_uac2  => @1367 tsx_on_state_null  callback assignment
> sip_transaction.c at 2311 tsx_on_state_null => @2351 call to tsx_send_msg
> sip_transaction.c at 2006 tsx_send_msg => @2120 call to pjsip_endpt_send_request_stateless
> {noformat}
> Asterisk 13.2.0, PJSIP 2.3, everything compiled from sources.
> Config: same as in the examples except for one endpoint the transport=<tcp_transport> option is specified.
> Client: a number of softphones, tested with latest Linphone on iPhone, SessionChat (freeware from AppStore), Jitsi on Windows.
> Please let me know if additional information is required.
> Regards,
> Anatoli



--
This message was sent by Atlassian JIRA
(v6.2#6252)



More information about the asterisk-bugs mailing list