Hi Gerwin,
Inside your failure route, you are always attempting a retry of any
failed request. This logic conflicts with your initial statement that
"The intent is to ensure that the response code gets sent through to
A-party".
Best regards,
Liviu Chircu
OpenSIPS Developer
http://www.opensips-solutions.com
On 17.07.2018 14:35, Gerwin van de Steeg wrote:
Folks,
I'm trying to narrow down a 482 Merged Request problem on calls from
one SIP device to another via OpenSIPS 2.4.1. Yealink T41P SIP device
(A-party), calls via OpenSIPS, to another AOR owned by a Zoiper5
device (B-party).
The intent is to ensure that when the B-party rejects the call with a
486 Busy Here, that the response code gets sent through to A-party.
However what I'm seeing is the 486 gets sent to OpenSIPS which ACK's
it, but doesn't go anywhere from there, and then something causes a
second invite to be sent from OpenSIPS to the B-party which then
responds of course with 482 Merged Request.
The call as it is progressing through the call flow seems to be
starting a second branch to the AOR (only one SIP device registered
using UDP per AOR).
What would be causing that second call so that I can eliminate it and
get to the behaviour I'm expecting. Just using a slightly modified
residential default config template with websocket support (the
problem was noticed using SIP.JS but exists also in generic SIP device
to SIP device calls).
Image containing sngrep of call: https://imgur.com/RCZXkO6
Subscribers are in the form of <username>@<domain>
With an alias setup for an extension number.
ie.
alfred.anderson@... = 552
alice.bell@... = 553
excerpt from opensips.cfg
if ($rU==NULL) {
# request with no Username in RURI
send_reply("484","Address Incomplete");
exit;
}
$acc_extra(src_ip) = $si; # source IP of the request
$acc_leg(caller) = $fu;
$acc_leg(callee) = $ru;
# apply DB based aliases
if (alias_db_lookup("dbaliases")) {
xlog("Alias lookup success [$fu/$tu/$ru/$ci]");
}
else {
xlog("Alias lookup failure [$fu/$tu/$ru/$ci]");
}
# do blind callforward lookup
if (avp_db_load("rU", "$avp(callfwd)")) {
t_reply("181", "Call Is Being Forwarded");
$ru = $avp(callfwd);
xlog("forwarded call to: $avp(callfwd)");
route(relay);
exit;
}
# apply transformations from dialplan table
dp_translate("0", "$rU/$rU");
# check if the call needs to be routed to freeswitch
route(freeswitch);
# here we would set the redirect URI if it had one
route(lookup);
}
route[lookup] {
script_trace(1, "$rm from $si, rur=$ru", "me");
xlog("route:lookup");
# do lookup with method filtering
if (!lookup("location","m")) {
xlog("lookup failure");
t_newtran();
if (!db_does_uri_exist()) {
xlog("$cfg_line: URI doesn't exist");
send_reply("420", "Bad Extension");
exit;
}
t_reply("404", "Not Found");
exit;
}
# when routing via usrloc, log the missed calls also
do_accounting("db","missed");
route(relay);
}
route[freeswitch] {
xlog("route:freeswitch");
if (!is_method("INVITE")) {
return;
}
# if the called number begins with the right dialplan redirect
it to freeswitch
# here we take everythign prefixed with a *, strip it, and send
it to freeswitch
if ($rU=~"^\*") {
strip(1);
$du = "sip:10.23.4.192:50600 <http://10.23.4.192:50600>";
route(relay);
}
}
route[relay] {
xlog("route:relay: Relaying: method=$rm");
# for INVITEs enable some additional helper routes
if (is_method("INVITE")) {
t_on_branch("per_branch_ops");
t_on_reply("handle_nat");
t_on_failure("missed_call");
}
else if (is_method("BYE|CANCEL")) {
# cancel the rtpengine transcoding
rtpengine_delete();
}
if (!t_relay()) {
send_reply("500","Internal Error");
}
exit;
}
branch_route[per_branch_ops] {
script_trace(1, "$rm from $si, rur=$ru", "me");
xlog("[$ci/$T_branch_idx] branch_route:per_branch_ops: new
branch at $ru\n");
# WebSocket specific handling with NORMAL SDP negotiation
# assumes SDP offer in the INVITE from the UAC, and SDP
# answer is in 200 OK from the UAS
if (!is_method("INVITE") || !has_body("application/sdp"))
return;
if (isflagset(SRC_WS) && isbflagset(DST_WS))
$var(rtpengine_flags) = "ICE=force-relay DTLS=passive";
else if (isflagset(SRC_WS) && !isbflagset(DST_WS))
$var(rtpengine_flags) = "RTP/AVP
replace-session-connection replace-origin ICE=remove";
else if (!isflagset(SRC_WS) && isbflagset(DST_WS))
$var(rtpengine_flags) = "UDP/TLS/RTP/SAVPF ICE=force";
else if (!isflagset(SRC_WS) && !isbflagset(DST_WS))
$var(rtpengine_flags) = "RTP/AVP
replace-session-connection replace-origin ICE=remove";
# only enable transcoding if websocket call for now
if (isflagset(SRC_WS) || isbflagset(DST_WS)) {
rtpengine_offer("$var(rtpengine_flags)");
}
}
onreply_route[handle_nat] {
script_trace(1, "$rm from $si, rur=$ru", "me");
xlog("[$ci/$T_branch_idx] onreply_route:handle_nat: $ru\n");
# WebSocket specific handling with NORMAL SDP negotiation
# assumes SDP offer in the INVITE from the UAC, and SDP
# answer is in 200 OK from the UAS
if (!has_body("application/sdp"))
return;
if (isflagset(SRC_WS) && isbflagset(DST_WS))
$var(rtpengine_flags) = "ICE=force-relay DTLS=passive";
else if (isflagset(SRC_WS) && !isbflagset(DST_WS))
$var(rtpengine_flags) = "UDP/TLS/RTP/SAVPF ICE=force";
else if (!isflagset(SRC_WS) && isbflagset(DST_WS))
$var(rtpengine_flags) = "RTP/AVP
replace-session-connection replace-origin ICE=remove";
else if (!isflagset(SRC_WS) && !isbflagset(DST_WS))
$var(rtpengine_flags) = "RTP/AVP
replace-session-connection replace-origin ICE=remove";
# only enable transcoding if websocket call for now
if (isflagset(SRC_WS) || isbflagset(DST_WS)) {
rtpengine_answer("$var(rtpengine_flags)");
}
}
failure_route[missed_call] {
script_trace(1, "$rm from $si, rur=$ru", "me");
xlog("[$ci/$T_branch_idx] failure_route:missed_call: incoming
failure response to $rm <- $T_reply_code/$T_ruri");
if (t_was_cancelled()) {
xlog("[$ci/$T_branch_idx] was cancelled");
exit;
}
do_accounting("db", "missed");
if (!t_relay()) {
send_reply("500","Internal Error");
}
else {
xlog("[$ci/$T_branch_idx] Relay success
$rm/$T_reply_code");
}
}
Cheers,
Gerwin
_______________________________________________
Users mailing list
[email protected]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users
_______________________________________________
Users mailing list
[email protected]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users