|
@@ -22,6 +22,7 @@
|
|
|
# $rtp_dlg_sess_ids ... list of confirmed (INVITE/200OK/ACK, INVITE/180/PRACK, UPDATE/200OK ) RTP sessions
|
|
|
# $rtp_dlg_sess_ids2 ... list of non-confirmed sessions
|
|
|
# $rtp_method_flag ... request method passed to onreply/failure
|
|
|
+# $rtp_dlg_state ... ""..no offer yet, "o"..offered, "a"..answered
|
|
|
#
|
|
|
# rtpproxy.* configuration params
|
|
|
#
|
|
@@ -35,7 +36,7 @@ loadmodule "iptrtpproxy"
|
|
|
modparam("iptrtpproxy", "config", "/etc/iptrtpproxy.cfg");
|
|
|
|
|
|
#DEBCONF-RTTPPROXY-START
|
|
|
-modparam("iptrtpproxy", "switchboard", "name=*;sip-addr=213.192.59.75"); ## TODO change back to .75
|
|
|
+modparam("iptrtpproxy", "switchboard", "name=*;sip-addr=213.192.30.136");
|
|
|
#modparam("iptrtpproxy", "switchboard", "name=gate_a;sip-addr=1.2.3.4;aggregation=AA")
|
|
|
#modparam("iptrtpproxy", "switchboard", "name=gate_b;aggregation=A")
|
|
|
modparam("iptrtpproxy", "codec_set", "name=any;media_type=*;rights=0;codecs=*;max_streams=9999");
|
|
@@ -81,7 +82,7 @@ route[RTPPROXY_PROCESS_REQUEST] {
|
|
|
}
|
|
|
if (!defined $dialog_id) { # AVP loaded from route cookie
|
|
|
if (@method != "ACK")
|
|
|
- t_reply("400", "Missing cookie"); # 500 (=our bug) in case of init request because it'd been generated by ourselves
|
|
|
+ t_reply("400", "Missing cookie"); # 500 (=our bug) in case of init request because it had been generated by ourselves
|
|
|
xlog("L_EDEBUG", "RTPPROXY_PROCESS_REQUEST: missing cookie: %@hf_value.route[0]\n");
|
|
|
drop;
|
|
|
}
|
|
@@ -125,7 +126,7 @@ route[RTPPROXY_PROCESS_REQUEST] {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if ((method == "INVITE" || method == "UPDATE") && @msg.body!="") {
|
|
|
+ if ((method == "INVITE" || method == "UPDATE" || method == "PRACK") && @msg.body!="") {
|
|
|
if (@iptrtpproxy.active_media_num == "0") break;
|
|
|
iptrtpproxy_set_param("codec_set", "@cfg_get.rtp_proxy.codec_set");
|
|
|
iptrtpproxy_set_param("remove_codec_mask", "1");
|
|
@@ -146,7 +147,7 @@ route[RTPPROXY_PROCESS_REQUEST] {
|
|
|
xlog("L_EDEBUG", "RTPPROXY_PROCESS_REQUEST: find switchboard-a for '%@received.ip'\n");
|
|
|
if (!iptrtpproxy_set_param("switchboard_by_sip_ip_a", "@received.ip")) {
|
|
|
xlog("L_ERR", "RTPPROXY_PROCESS_REQUEST: Cannot find switchboard-a for routing '%@received.ip'\n");
|
|
|
- t_reply("500", "RTP proxy error");
|
|
|
+ t_reply("500", "RTP proxy error (switchboard-a)");
|
|
|
drop;
|
|
|
}
|
|
|
eval_push("x:%@next_hop.src_ip");
|
|
@@ -157,7 +158,7 @@ route[RTPPROXY_PROCESS_REQUEST] {
|
|
|
xlog("L_EDEBUG", "RTPPROXY_PROCESS_REQUEST: find switchboard-b for '%@eval.get[-1]'\n");
|
|
|
if (!iptrtpproxy_set_param("switchboard_by_sip_ip_b", "@eval.get[-1]")) {
|
|
|
xlog("L_ERR", "RTPPROXY_PROCESS_REQUEST: Cannot find switchboard for routing '%@eval.get[-1]'\n");
|
|
|
- t_reply("500", "RTP proxy error");
|
|
|
+ t_reply("500", "RTP proxy error (switchboard-b)");
|
|
|
drop;
|
|
|
}
|
|
|
}
|
|
@@ -215,16 +216,19 @@ route[RTPPROXY_PROCESS_REQUEST] {
|
|
|
} else {
|
|
|
eval_push("1"); # caller -> callee
|
|
|
}
|
|
|
- if (!iptrtpproxy_alloc("@eval.pop[-1]")) {
|
|
|
- t_reply("500", "RTP proxy error");
|
|
|
+ if (!iptrtpproxy_alloc("@eval.pop[-1]")) {
|
|
|
+ t_reply("503", "RTP proxy error (no free port)");
|
|
|
drop;
|
|
|
}
|
|
|
# we need save in dialog as non-confirmed sess_ids (not only in transaction) because
|
|
|
# UPDATE in non-confirmed INVITE and ACK to 200OK are considered as separate transactions.
|
|
|
- if (@iptrtpproxy.session_ids != "")
|
|
|
+ if (@iptrtpproxy.session_ids != "") {
|
|
|
$rtp_dlg_sess_ids2 = @iptrtpproxy.session_ids;
|
|
|
- else
|
|
|
+ $rtp_dlg_state = "o"; # offered
|
|
|
+ } else {
|
|
|
del_attr("$rtp_dlg_sess_ids2");
|
|
|
+ del_attr("$rtp_dlg_state");
|
|
|
+ }
|
|
|
|
|
|
xlog("L_EDEBUG", "RTPPROXY_PROCESS_REQUEST: allocated ids2=%$rtp_dlg_sess_ids2\n");
|
|
|
# session_ids are stored in AVP to let commit (on_reply) or rollback (on_failure) allocated sessions
|
|
@@ -245,10 +249,14 @@ route[RTPPROXY_PROCESS_REQUEST] {
|
|
|
if (strempty($rtp_dlg_sess_ids2)) {
|
|
|
break; /* do not save, non SDP related re-INVITE or retrasmission which is not eaten by tm module, SDP in ACK is not supported */
|
|
|
}
|
|
|
+ if (!defined $rtp_dlg_state || $rtp_dlg_state != "a") {
|
|
|
+ break; /* e.g. PRACK to 180 without SDP */
|
|
|
+ }
|
|
|
iptrtpproxy_set_param("protected_session_ids", "$rtp_dlg_sess_ids2");
|
|
|
iptrtpproxy_delete("$rtp_dlg_sess_ids");
|
|
|
$rtp_dlg_sess_ids = $rtp_dlg_sess_ids2;
|
|
|
del_attr("$rtp_dlg_sess_ids2");
|
|
|
+ del_attr("$rtp_dlg_state");
|
|
|
route("RTPPROXY_SAVE_ATTRS");
|
|
|
}
|
|
|
else if (method == "BYE") { # CANCEL ???
|
|
@@ -291,7 +299,7 @@ route[RTPPROXY_PROCESS_REPLY] {
|
|
|
# (probably) no retransmission
|
|
|
route("RTPPROXY_LOAD_ATTRS");
|
|
|
$rtp_last_code = @msg.res.code;
|
|
|
- if (isflagset(FLAG_INIT_DLG) && status=~"18[0-9]") {
|
|
|
+ if (isflagset(FLAG_INIT_DLG) && status=~"1[0-9][0-9]") { # 100 is impossible, eaten by tm
|
|
|
iptrtpproxy_set_param("learning_timeout", "@cfg_get.rtp_proxy.ringing_timeout");
|
|
|
}
|
|
|
else {
|
|
@@ -342,6 +350,7 @@ route[RTPPROXY_PROCESS_REPLY] {
|
|
|
;
|
|
|
# drop; ???
|
|
|
}
|
|
|
+ $rtp_dlg_state = "a"; # answered
|
|
|
route("RTPPROXY_SAVE_ATTRS");
|
|
|
}
|
|
|
else {
|
|
@@ -362,9 +371,13 @@ route[RTPPROXY_PROCESS_REPLY] {
|
|
|
else if ($rtp_method_flag == "UPDATE" && status=~"2[0-9][0-9]" && $rtp_dlg_sess_ids2!="") {
|
|
|
# confirm pending offer (UPDATE is not followed by ACK/PRACK)
|
|
|
route("RTPPROXY_LOAD_ATTRS");
|
|
|
- xlog("L_EDEBUG", "RTPPROXY_PROCESS_REPLY: %@method, delete(ids=%$rtp_dlg_sess_ids), protect(ids2=%$rtp_dlg_sess_ids2)\n");
|
|
|
+ xlog("L_EDEBUG", "RTPPROXY_PROCESS_REPLY: %@method, delete(ids=%$rtp_dlg_sess_ids), protect(ids2=%$rtp_dlg_sess_ids2, state=%$rtp_dlg_state)\n");
|
|
|
+ if (!defined $rtp_dlg_state || $rtp_dlg_state != "o") {
|
|
|
+ break;
|
|
|
+ }
|
|
|
iptrtpproxy_set_param("protected_session_ids", "$rtp_dlg_sess_ids2");
|
|
|
iptrtpproxy_delete("$rtp_dlg_sess_ids");
|
|
|
+ $rtp_dlg_state = "a"; # answered
|
|
|
$rtp_dlg_sess_ids = $rtp_dlg_sess_ids2;
|
|
|
del_attr("$rtp_dlg_sess_ids2");
|
|
|
route("RTPPROXY_SAVE_ATTRS");
|
|
@@ -385,13 +398,14 @@ route[RTPPROXY_PROCESS_FAILURE] {
|
|
|
iptrtpproxy_delete("$rtp_dlg_sess_ids"); # early media are considered as confirmed
|
|
|
iptrtpproxy_delete("$rtp_dlg_sess_ids2");
|
|
|
route("RTPPROXY_REMOVE_ATTRS");
|
|
|
- } else if ($rtp_method_flag == "INVITE" || $rtp_method_flag == "UPDATE") {
|
|
|
+ } else if ($rtp_method_flag == "INVITE" || $rtp_method_flag == "UPDATE" || $rtp_method_flag == "PRACK") {
|
|
|
route("RTPPROXY_LOAD_ATTRS");
|
|
|
#remove only unconfirmed sessiosn
|
|
|
xlog("L_EDEBUG", "RTPPROXY_PROCESS_FAILURE: %@method, delete(ids2=%$rtp_dlg_sess_ids2), protect(ids=%$rtp_dlg_sess_ids)\n");
|
|
|
iptrtpproxy_set_param("protected_session_ids", "$rtp_dlg_sess_ids");
|
|
|
iptrtpproxy_delete("$rtp_dlg_sess_ids2");
|
|
|
del_attr("$rtp_dlg_sess_ids2");
|
|
|
+ del_attr("$rtp_dlg_state");
|
|
|
route("RTPPROXY_SAVE_ATTRS");
|
|
|
}
|
|
|
|
|
@@ -407,23 +421,27 @@ route[RTPPROXY_PROCESS_FAILURE] {
|
|
|
route[RTPPROXY_LOAD_ATTRS] {
|
|
|
del_attr("$rtp_dlg_sess_ids");
|
|
|
del_attr("$rtp_dlg_sess_ids2");
|
|
|
+ del_attr("$rtp_dlg_state");
|
|
|
load_extra_attrs("rtp_dlg", "$dialog_id");
|
|
|
- xlog("L_EDEBUG", "RTPPROXY_LOAD_ATTRS: dialog_id=%$dialog_id, method/flag='%@method'/'%$rtp_method_flag', ids=%$rtp_dlg_sess_ids, ids2=%$rtp_dlg_sess_ids2\n");
|
|
|
+ xlog("L_EDEBUG", "RTPPROXY_LOAD_ATTRS: dialog_id=%$dialog_id, method/flag='%@method'/'%$rtp_method_flag', ids=%$rtp_dlg_sess_ids, ids2=%$rtp_dlg_sess_ids2, state=%$rtp_dlg_state\n");
|
|
|
}
|
|
|
|
|
|
route[RTPPROXY_SAVE_ATTRS] {
|
|
|
xlog("L_EDEBUG", "RTPPROXY_SAVE_ATTRS: dialog_id=%$dialog_id, method='%@method', ids=%$rtp_dlg_sess_ids, ids2=%$rtp_dlg_sess_ids2\n");
|
|
|
setavpflag("$f.rtp_dlg_sess_ids", "rtpproxy_dlg");
|
|
|
setavpflag("$f.rtp_dlg_sess_ids2", "rtpproxy_dlg");
|
|
|
+ setavpflag("$f.rtp_dlg_state", "rtpproxy_dlg");
|
|
|
save_extra_attrs("rtp_dlg", "$dialog_id");
|
|
|
del_attr("$rtp_dlg_sess_ids");
|
|
|
del_attr("$rtp_dlg_sess_ids2");
|
|
|
+ del_attr("$rtp_dlg_state");
|
|
|
}
|
|
|
|
|
|
route[RTPPROXY_REMOVE_ATTRS] {
|
|
|
xlog("L_EDEBUG", "RTPPROXY_REMOVE_ATTRS: dialog_id=%$dialog_id, method='%@method'\n");
|
|
|
del_attr("$rtp_dlg_sess_ids");
|
|
|
del_attr("$rtp_dlg_sess_ids2");
|
|
|
+ del_attr("$rtp_dlg_state");
|
|
|
remove_extra_attrs("rtp_dlg", "$dialog_id");
|
|
|
}
|
|
|
|