Hi all,
I have the following setup:
Phone <-> private net using TCP transport <-> (172.30.0.156) Kamailio
v5.6.3 + RTPEngine v9.3.1 (22.33.177.156) <-> public net using UDP
transport <-> Asterisk (22.33.178.77)
Phone is registered on Kamailio and forward calls on no answer or when
ext is unregistered, to Asterisk's custom IVR (nodejs app + CouchDB),
using failure_route() [1].
The problem is that when the none answer the phone and the call is
redirected to Asterisk, Kamailio announce its private IP address in
the SDP connection endpoint, hence there is no audio [2]. From
RTPEngine debug logs, it seems that RTPEngine replies with the correct
SDP connection endpoint IP [3]. See also RTPEngine interfaces
definition [4].
What am I missing? Why Kamailio is offering its private IP address in
the SDP connection, instead of its public address when forwarding the
call? If comment "route(SDP_MANAGE_IN)" in route[IN], Kamailio uses
the correct IP endpoint address in the SDP offer when forwarding the
call to Asterisk. But of course this breaks audio when someone answer
the phone. It seems that Kamailio is storing the initial SDP offer
settings and does not update it upon RTPEngine's request, even though
I have added "replace-session-connection" in route[SDP_OFFER_IVR].
Thanks for any help!
leo
[1]
route[IN] {
if (!lookup('location')) {
t_on_reply("SDP_MANAGE");
route(TOIVR);
} else {
xlog("L_INFO", "Route(IN) Req $mi $rm From <$fu> To
<$tu> RURI
<$ru>\n");
record_route();
t_on_reply("SDP_MANAGE");
route(SDP_MANAGE_IN);
t_on_failure("TOIVR");
t_relay();
exit;
}
}
route[SDP_MANAGE] {
if (has_body("application/sdp")) {
rtpengine_manage();
}
}
route[SDP_MANAGE_IN] {
if (has_body("application/sdp")) {
rtpengine_manage("direction=public direction=private via-branch=1");
}
}
...
route[SDP_OFFER_IVR] {
if (has_body("application/sdp")) {
rtpengine_offer("direction=public direction=public
replace-session-connection via-branch=1");
}
}
failure_route[TOIVR] {
if (t_is_canceled()) {
exit;
}
append_branch();
route(SDP_OFFER_IVR);
# using t_relay_to so that UDP is used with the correct IP address
if (!t_relay_to("xh.voip.net")) {
xlog("L_INFO", "No answer - Failure Route(TOIVR) Req $mi $rm
From <$fu> To <$tu> RURI <$ru> failed\n");
t_reply("500", "Unable to route");
} else {
xlog("L_INFO", "No answer - Failure Route(TOIVR) Req $mi $rm
From <$fu> To <$tu> RURI <$ru>\n");
}
}
[2]
U 2023/10/11 09:05:43.797393 22.33.177.156:5060 -> 22.33.176.8:5060 #3
SIP/2.0 180 Ringing.
Via: SIP/2.0/UDP
22.33.176.8;branch=z9hG4bK2cb2.e559c4a326678f69ae9b4656be7bc36c.0.
Via: SIP/2.0/UDP
22.33.176.20;branch=z9hG4bK2cb2.2920561c845ee5279051359f40cb7c0f.0.
Via: SIP/2.0/UDP 44.55.73.157:5060;branch=z9hG4bK0cBdccef20c0d8bfefb.
Record-Route: <sip:172.30.0.156;transport=TCP;r2=on;lr=on;ftag=gK0c1bb12e>.
Record-Route: <sip:22.33.177.156;r2=on;lr=on;ftag=gK0c1bb12e>.
Record-Route: <sip:22.33.176.8;lr=on;ftag=gK0c1bb12e;did=7ffe.26c8>.
Record-Route: <sip:22.33.176.20;lr=on;ftag=gK0c1bb12e>.
From: "Unavailable" <sip:013335553222@44.55.73.157>;tag=gK0c1bb12e.
To: <sip:8555000033@22.33.176.20>;tag=660096088.
Call-ID: 474758100_116775912(a)44.55.73.157.
CSeq: 704680 INVITE.
Contact: <sip:+18555000033@172.30.96.2:11815;transport=TCP>.
Allow: INVITE, INFO, PRACK, ACK, BYE, CANCEL, OPTIONS, NOTIFY,
REGISTER, SUBSCRIBE, REFER, PUBLISH, UPDATE, MESSAGE.
User-Agent: Yealink SIP-T31P 124.86.0.40.
Allow-Events: talk,hold,conference,refer,check-sync.
Content-Length: 0.
.
U 2023/10/11 09:06:03.751585 22.33.177.156:5060 -> 22.33.178.77:5060 #4
INVITE sip:+18555000033@172.30.96.2:11815;transport=TCP SIP/2.0.
Record-Route: <sip:22.33.177.156;lr=on;ftag=gK0c1bb12e>.
Record-Route: <sip:22.33.176.8;lr=on;ftag=gK0c1bb12e;did=7ffe.26c8>.
Record-Route: <sip:22.33.176.20;lr=on;ftag=gK0c1bb12e>.
Via: SIP/2.0/UDP
22.33.177.156;branch=z9hG4bK2cb2.afb825e30e294872c72c5e21ef26f3f3.1.
Via: SIP/2.0/UDP
22.33.176.8;branch=z9hG4bK2cb2.e559c4a326678f69ae9b4656be7bc36c.0.
Via: SIP/2.0/UDP
22.33.176.20;branch=z9hG4bK2cb2.2920561c845ee5279051359f40cb7c0f.0.
Via: SIP/2.0/UDP 44.55.73.157:5060;branch=z9hG4bK0cBdccef20c0d8bfefb.
f: "Unavailable" <sip:013335553222@44.55.73.157>;tag=gK0c1bb12e.
t: <sip:8555000033@22.33.176.20>.
i: 474758100_116775912(a)44.55.73.157.
CSeq: 704680 INVITE.
Max-Forwards: 32.
Allow:
INVITE,ACK,CANCEL,BYE,REGISTER,REFER,INFO,SUBSCRIBE,NOTIFY,PRACK,UPDATE,OPTIONS,MESSAGE,PUBLISH.
Accept: application/sdp, application/isup, application/dtmf,
application/dtmf-relay, multipart/mixed.
m: "Unavailable" <sip:013335553222@44.55.73.157:5060>.
Remote-Party-ID: "Unavailable"
<sip:013335553222@44.55.73.157:5060>;privacy=off.
k: timer,100rel,precondition.
Session-Expires: 1800.
Min-SE: 90.
l: 604.
Content-Disposition: session; handling=required.
c: application/sdp.
.
v=0.
o=Sonus_UAC 525653 764118 IN IP4 44.55.73.157.
s=SIP Media Capabilities.
c=IN IP4 172.30.0.156.
t=0 0.
m=audio 30030 RTP/AVP 0 18 101.
a=maxptime:20.
a=rtpmap:0 PCMU/8000.
a=rtpmap:18 G729/8000.
a=fmtp:18 annexb=n
[3]
Oct 11 09:06:03 voipsipr7 daemon.info rtpengine[35061]: INFO:
[474758100_116775912(a)44.55.73.157]: [control] Received command 'offer'
from 127.0.0.1:39942
Oct 11 09:06:03 voipsipr7 daemon.debug rtpengine[35061]: DEBUG:
[474758100_116775912(a)44.55.73.157]: [control] Dump for 'offer' from
127.0.0.1:39942: { "supports": [ "load limit" ], "sdp":
"v=0^M
o=Sonus_UAC 5
25653 764118 IN IP4 44.55.73.157^M s=SIP Media Capabilities^M c=IN IP4
44.55.78.60^M t=0 0^M m=audio 61610 RTP/AVP 0 18 101^M a=rtpmap:0
PCMU/8000^M a=rtpmap:18 G729/8000^M a=fmtp:18 annexb=no^M a=rtpmap:101
telephone-event/8000^M a=fmtp:101 0-15^M a=sendrecv^M a=maxptime:20^M
", "direction": [ "public", "public" ],
"replace": [
"session-connection" ], "call-id":
"474758100_116775912(a)44.55.73.157
...
Oct 11 09:06:03 voipsipr7 daemon.debug rtpengine[35061]: DEBUG:
[474758100_116775912(a)44.55.73.157]: ... ", "via-branch":
"z9hG4bK2cb2.e559c4a326678f69ae9b4656be7bc36c.0", "received-from": [
"IP4", "22.33.176
.8" ], "from-tag": "gK0c1bb12e", "command":
"offer" }
...
Oct 11 09:06:03 voipsipr7 daemon.info rtpengine[35061]: INFO:
[474758100_116775912(a)44.55.73.157]: [control] Replying to 'offer' from
127.0.0.1:39942 (elapsed time 0.000638 sec)
Oct 11 09:06:03 voipsipr7 daemon.debug rtpengine[35061]: DEBUG:
[474758100_116775912(a)44.55.73.157]: [control] Response dump for
'offer' to 127.0.0.1:39942: { "sdp": "v=0^M o=Sonus_UAC 525653
764118
IN IP4 207
.223.73.157^M s=SIP Media Capabilities^M c=IN IP4 22.33.177.156^M t=0
0^M m=audio 30068 RTP/AVP 0 18 101^M a=maxptime:20^M a=rtpmap:0
PCMU/8000^M a=rtpmap:18 G729/8000^M a=fmtp:18 annexb=no^M a=rtpmap:101
teleph
one-event/8000^M a=fmtp:101 0-15^M a=sendrecv^M a=rtcp:30069^M ",
"result": "ok" }
Oct 11 09:06:03 voipsipr7 daemon.info /usr/sbin/kamailio[35261]: INFO:
<script>: No answer - Failure Route(TOIVR) Req 4 INVITE From
<sip:013335553222@44.55.73.157> To <sip:8555000033@22.33.176.20> RURI
<sip:
+18555000033@172.30.96.2:11815;transport=TCP>
Oct 11 09:06:03 voipsipr7 daemon.info rtpengine[35061]: INFO:
[474758100_116775912(a)44.55.73.157]: [control] Received command
'answer' from 127.0.0.1:53245
Oct 11 09:06:03 voipsipr7 daemon.debug rtpengine[35061]: DEBUG:
[474758100_116775912(a)44.55.73.157]: [control] Dump for 'answer' from
127.0.0.1:53245: { "supports": [ "load limit" ], "sdp":
"v=0^M o=-
525653 7
64120 IN IP4 22.33.178.77^M s=Asterisk^M c=IN IP4 22.33.178.77^M t=0
0^M m=audio 11264 RTP/AVP 0 101^M a=rtpmap:0 PCMU/8000^M a=rtpmap:101
telephone-event/8000^M a=fmtp:101 0-16^M a=ptime:20^M a=maxptime:150^M
a=sendrecv^M m=audio 0 RTP/AVP 0 18 101^M ", "call-id":
"474758100_116775912(a)44.55.73.157".157", "received-from": [
"IP4",
"22.33.178.77" ], "from-tag": "gK0c1bb12e",
"to-tag":
"a21c53b6-ca33-43b ...
Oct 11 09:06:03 voipsipr7 daemon.debug rtpengine[35061]: DEBUG:
[474758100_116775912(a)44.55.73.157]: ... 4-a585-af9b568a5ecb",
"command": "answer" }
...
Oct 11 09:06:03 voipsipr7 daemon.info rtpengine[35061]: INFO:
[474758100_116775912(a)44.55.73.157]: [control] Replying to 'answer'
from 127.0.0.1:53245 (elapsed time 0.000915 sec)
Oct 11 09:06:03 voipsipr7 daemon.debug rtpengine[35061]: DEBUG:
[474758100_116775912(a)44.55.73.157]: [control] Response dump for
'answer' to 127.0.0.1:53245: { "sdp": "v=0^M o=- 525653 764120 IN
IP4
22.33.178
.77^M s=Asterisk^M c=IN IP4 22.33.177.156^M t=0 0^M m=audio 30056
RTP/AVP 0 101^M a=maxptime:150^M a=rtpmap:0 PCMU/8000^M a=rtpmap:101
telephone-event/8000^M a=fmtp:101 0-16^M a=sendrecv^M a=rtcp:30057^M
a=ptime
:20^M m=audio 0 RTP/AVP 0 18 101^M ", "result": "ok" }
Oct 11 09:06:03 voipsipr7 daemon.debug rtpengine[35061]: DEBUG:
[474758100_116775912(a)44.55.73.157]: [core] Forward to sink endpoint:
22.33.178.77:11264 (RTP seq 0 TS 0)
[4]
Interface definition in RTPEngine:
interface = public/22.33.177.156;public/22:33:201:105::156;private/172.30.0.156