|
|
|
@ -6,50 +6,70 @@ loadmodule "nathelper.so" |
|
|
|
modparam("nathelper", "received_avp", "$avp(AVP_RECV_PARAM)") |
|
|
|
modparam("nathelper", "sipping_from", "sip:sipcheck@MY_HOSTNAME") |
|
|
|
|
|
|
|
#!trydef KZ_NAT_CONTACT_DETECT "1" |
|
|
|
#!trydef KZ_NAT_PORT_DETECT "2" |
|
|
|
#!trydef KZ_NAT_DETECT "19" |
|
|
|
|
|
|
|
####### NAT Traversal Logic ######## |
|
|
|
route[NAT_TEST_AND_CORRECT] |
|
|
|
route[NAT_INITIAL_TEST] |
|
|
|
{ |
|
|
|
if (is_present_hf("Record-Route")) { |
|
|
|
$var(i) = 0; |
|
|
|
$var(rr_count) = $rr_count; |
|
|
|
while($var(i) < $var(rr_count)) { |
|
|
|
$var(rr_base) = $(hdr(Record-Route)[$var(i)]); |
|
|
|
$var(rr_idx) = 0; |
|
|
|
$var(rr) = $(var(rr_base){s.select,$var(rr_idx),,}); |
|
|
|
while($var(rr) != $null && $var(rr) != "") { |
|
|
|
$var(i) = $var(i) + 1; |
|
|
|
if (!is_myself("$(var(rr){nameaddr.uri})")) { |
|
|
|
setflag(FLAG_SKIP_NAT_CORRECTION); |
|
|
|
xlog("L_DEBUG", "$ci|log|skipping nat correction on record-route $(var(rr){nameaddr.uri})\n"); |
|
|
|
} |
|
|
|
$var(rr_idx) = $var(rr_idx) + 1; |
|
|
|
$var(rr) = $(var(rr_base){s.select,$var(rr_idx),,}); |
|
|
|
} |
|
|
|
} |
|
|
|
} else if ($Rp == "5080") { |
|
|
|
setflag(FLAG_SKIP_NAT_CORRECTION); |
|
|
|
} |
|
|
|
|
|
|
|
if (isflagset(FLAG_SKIP_NAT_CORRECTION)) { |
|
|
|
return(); |
|
|
|
} |
|
|
|
|
|
|
|
if (nat_uac_test(KZ_NAT_PORT_DETECT)) { |
|
|
|
xlog("L_DEBUG", "$ci|nat|forcing rport\n"); |
|
|
|
force_rport(); |
|
|
|
} |
|
|
|
|
|
|
|
if (nat_uac_test(KZ_NAT_CONTACT_DETECT)) { |
|
|
|
xlog("L_DEBUG", "$ci|nat|contact correction\n"); |
|
|
|
fix_nated_contact(); |
|
|
|
} |
|
|
|
|
|
|
|
if (has_body("application/sdp") && nat_uac_test("8")) { |
|
|
|
fix_nated_sdp("10"); |
|
|
|
} |
|
|
|
if(nat_uac_test(64)) return(); |
|
|
|
|
|
|
|
if(!is_method("INVITE|REGISTER|SUBSCRIBE")) return(); |
|
|
|
|
|
|
|
if ($Rp == "5080") { |
|
|
|
setflag(FLAG_SKIP_NAT_CORRECTION); |
|
|
|
} else { |
|
|
|
if (is_present_hf("Record-Route")) { |
|
|
|
$var(i) = 0; |
|
|
|
$var(rr_count) = $rr_count; |
|
|
|
while($var(i) < $var(rr_count)) { |
|
|
|
$var(rr_base) = $(hdr(Record-Route)[$var(i)]); |
|
|
|
$var(rr_idx) = 0; |
|
|
|
$var(rr) = $(var(rr_base){s.select,$var(rr_idx),,}); |
|
|
|
while($var(rr) != $null && $var(rr) != "") { |
|
|
|
$var(i) = $var(i) + 1; |
|
|
|
if (!is_myself("$(var(rr){nameaddr.uri})")) { |
|
|
|
setflag(FLAG_SKIP_NAT_CORRECTION); |
|
|
|
xlog("L_DEBUG", "$ci|log|skipping nat correction on record-route $(var(rr){nameaddr.uri})\n"); |
|
|
|
} |
|
|
|
$var(rr_idx) = $var(rr_idx) + 1; |
|
|
|
$var(rr) = $(var(rr_base){s.select,$var(rr_idx),,}); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (isflagset(FLAG_SKIP_NAT_CORRECTION)) { |
|
|
|
return(); |
|
|
|
} |
|
|
|
|
|
|
|
if(nat_uac_test(KZ_NAT_DETECT)) { |
|
|
|
force_rport(); |
|
|
|
setflag(FLAG_NAT); |
|
|
|
if (!is_method("REGISTER")) { |
|
|
|
if(is_first_hop()) set_contact_alias(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (has_body("application/sdp") && nat_uac_test("8")) { |
|
|
|
fix_nated_sdp("10"); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
route[NAT_REPLY_TEST] |
|
|
|
{ |
|
|
|
if(nat_uac_test(64)) return(); |
|
|
|
|
|
|
|
if(nat_uac_test(KZ_NAT_DETECT)) { |
|
|
|
setflag(FLAG_NAT); |
|
|
|
force_rport(); |
|
|
|
set_contact_alias(); |
|
|
|
} |
|
|
|
|
|
|
|
if (has_body("application/sdp") && nat_uac_test("8")) { |
|
|
|
fix_nated_sdp("10"); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab |