######## NAT Traversal module - signaling functions ######## #!ifndef NATHELPER_LOADED loadmodule "nathelper.so" #!trydef NATHELPER_LOADED #!endif modparam("nathelper", "received_avp", "$avp(AVP_RECV_PARAM)") modparam("nathelper", "sipping_from", "sip:sipcheck@MY_HOSTNAME") #!trydef KZ_NAT_DETECT "19" ####### NAT Traversal Logic ######## route[NAT_INITIAL_TEST] { 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