Yikes, I don't have pcaps of this issue anymore and it is difficult to reproduce because it involves a random collision of port numbers on the customer's network with NAT involved.
On top of that I seem to be having trouble getting my issue across.

In this case I have two connections created by phones with the same destination but different sources, then a third which has a the same source but different destination.
Device A: tcp:CustomerIP:10042 -> tcp:KamailioIP:4242
Device B: tcp:CustomerIP:11042 -> tcp:KamailioIP:4242
Device A new connection for a 200 OK response: tcp:CustomerIP:11042 -> tcp:KamailioIP:5062

Kamailio sees this as:
Device A: tcp:KamailioIP:4242 -> tcp:CustomerIP:10042
Device B: tcp:KamailioIP:4242 -> tcp:CustomerIP:11042
Device A receives a SIP message with a contact telling them to respond to Kamailio on 5062, which causes it to create a new TCP connection which in turn confuses Kamailio.
Device A tcp:KamailioIP:5062 -> tcp:CustomerIP:11042

Kamailio is reusing the tcp connection whenever the destination address is matching an active one.
As seen above, Kamailio thinks Device A has two connections with the same destination.
This invite is not in response to any packet, it is being relayed from my PBX as the first packet of a new transaction and I am using lookup() and then t_relay() to set the Request-URI and then relay the packet to that destination.
If t_relay uses the R-URI destination to find the TCP socket it should send from, how does it choose between these two sockets?
The problem I am seeing is that it incorrectly chooses to send the INVITE from the `socket' that has a source port of 5062 because the newest connection it has become aware of for that destination is the socket with 5062.

I hope I've been able to clearly describe what, I think, is happening here. If not, we currently have a mitigation strategy to avoid sending a packet with a contact that makes phones want to create another connection to Kamailio.


You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.