Browse Source

nat with loop

4.3
lazedo 7 years ago
committed by Luis Azedo
parent
commit
dad34428b7
4 changed files with 56 additions and 17 deletions
  1. +23
    -2
      kamailio/default.cfg
  2. +29
    -14
      kamailio/presence-nat.cfg
  3. +0
    -1
      kamailio/presence-role.cfg
  4. +4
    -0
      kamailio/sip_trace-role.cfg

+ 23
- 2
kamailio/default.cfg View File

@ -13,6 +13,7 @@
#!trydef FLT_T38 10 #!trydef FLT_T38 10
#!trydef FLT_NATS 11 #!trydef FLT_NATS 11
#!trydef FLAG_LOCAL_REQUEST 12 #!trydef FLAG_LOCAL_REQUEST 12
#!trydef FLAG_LOCAL_ROUTE 17
####### Global Parameters ######### ####### Global Parameters #########
fork = yes fork = yes
@ -309,9 +310,15 @@ loadmodule "permissions.so"
modparam("permissions", "db_url", "KAZOO_DB_URL") modparam("permissions", "db_url", "KAZOO_DB_URL")
modparam("permissions", "db_mode", 1) modparam("permissions", "db_mode", 1)
###### local route ######
tcp_children = 5
listen=tcp:127.0.0.1:5090
####### Routing Logic ######## ####### Routing Logic ########
route route
{ {
route(LOCAL_REQUEST);
route(SANITY_CHECK); route(SANITY_CHECK);
route(CHECK_RETRANS); route(CHECK_RETRANS);
@ -889,14 +896,16 @@ onsend_route {
xlog("L_INFO", "$ci|log|associate traffic from $var(user_source) with media server sip:$sndto(ip):$sndto(port)\n"); xlog("L_INFO", "$ci|log|associate traffic from $var(user_source) with media server sip:$sndto(ip):$sndto(port)\n");
$sht(associations=>$var(user_source))= "sip:" + $sndto(ip) + ":" + $sndto(port); $sht(associations=>$var(user_source))= "sip:" + $sndto(ip) + ":" + $sndto(port);
} }
#!ifdef SIP_TRACE_ROLE #!ifdef SIP_TRACE_ROLE
if (is_method("ACK") && isflagset(FLAG_SIP_TRACE)) { if (is_method("ACK") && isflagset(FLAG_SIP_TRACE)) {
sip_trace(); sip_trace();
} }
#!endif #!endif
xlog("L_INFO", "$ci|pass|$sndfrom(ip):$sndfrom(port) -> $sndto(ip):$sndto(port)\n");
if(!isflagset(FLAG_LOCAL_ROUTE)) {
xlog("L_INFO", "$ci|pass|$sndfrom(ip):$sndfrom(port) -> $sndto(ip):$sndto(port)\n");
}
} }
route[ROUTE_TO_AOR] route[ROUTE_TO_AOR]
@ -957,5 +966,17 @@ event_route[evrexec:DEFERRED_INIT]
} }
route[LOCAL_REQUEST]
{
if(src_ip != myself || $hdr(X-TM-Local) == $null) {
return;
}
xlog("L_DEBUG", "internal route $hdr(X-TM-Local)\n");
$var(LocalRoute) = $hdr(X-TM-Local);
remove_hf_re("^X-TM-Local");
route_if_exists("$var(LocalRoute)");
exit;
}
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab

+ 29
- 14
kamailio/presence-nat.cfg View File

@ -79,37 +79,52 @@ route[PRESENCE_NAT_PING]
{ {
$var(CallId) = $uuid(g); $var(CallId) = $uuid(g);
xlog("L_DEBUG", "$var(CallId)|$rtimer_worker|timer|SENDING PING FROM $(xavp(ra=>local_contact){uri.tosocket}) TO => $xavp(ra=>contact)\n"); xlog("L_DEBUG", "$var(CallId)|$rtimer_worker|timer|SENDING PING FROM $(xavp(ra=>local_contact){uri.tosocket}) TO => $xavp(ra=>contact)\n");
t_uac_send("OPTIONS", "$xavp(ra=>contact)", "", "$(xavp(ra=>local_contact){uri.tosocket})", "CSeq: 1 OPTIONS\r\nFrom: PRESENCE_NAT_S_FROM_URI\r\nTo: $xavp(ra=>contact);nat_id=$xavp(ra=>id)\r\nContact: <$xavp(ra=>local_contact)>\r\nCall-ID: $var(CallId)\r\n", "");
$uac_req(method)="OPTIONS";
$uac_req(hdrs) = "X-TM-Local: PRESENCE_ROUTE_NAT_PING\r\nX-TM-Contact: " + $xavp(ra=>local_contact) + "\r\n";
$uac_req(turi) = $xavp(ra=>contact);
$uac_req(ruri) = $xavp(ra=>contact);
$uac_req(furi) = $_s(PRESENCE_NAT_S_FROM_URI;nat_id=$xavp(ra=>id));
$uac_req(ouri) = "sip:127.0.0.1:5090;transport=tcp";
$uac_req(callid) = $var(CallId);
uac_req_send();
} }
onreply_route[PRESENCE_NAT_REPLY] onreply_route[PRESENCE_NAT_REPLY]
{ {
xlog("L_DEBUG", "$ci|nat|NAT REPLY $(tu{nameaddr.uri})\n"); xlog("L_DEBUG", "$ci|nat|NAT REPLY $(tu{nameaddr.uri})\n");
$var(Query) = $_s(UPDATE presence_nat SET selected = 0, time_sent = datetime('now') WHERE id = $(tu{uri.param,nat_id}););
$var(Query) = $_s(UPDATE presence_nat SET selected = 0, time_sent = datetime('now') WHERE id = $(fu{uri.param,nat_id}););
xlog("L_DEBUG", "$ci|nat|NAT UPDATE SQL => '$var(Query)'\n"); xlog("L_DEBUG", "$ci|nat|NAT UPDATE SQL => '$var(Query)'\n");
mq_add("presence_last_notity", "$uuid(g)", "$var(Query)"); mq_add("presence_last_notity", "$uuid(g)", "$var(Query)");
t_drop();
} }
failure_route[PRESENCE_NAT_FAULT] failure_route[PRESENCE_NAT_FAULT]
{ {
xlog("L_WARNING", "$ci|nat|received error $T_reply_code $T_reply_reason from $(tu{nameaddr.uri})\n"); xlog("L_WARNING", "$ci|nat|received error $T_reply_code $T_reply_reason from $(tu{nameaddr.uri})\n");
$var(Query) = $_s(DELETE FROM presence_nat WHERE id = $(tu{uri.param,nat_id}););
$var(Query) = $_s(DELETE FROM presence_nat WHERE id = $(fu{uri.param,nat_id}););
xlog("L_DEBUG", "$ci|nat|NAT REMOVE SQL => '$var(Query)'\n"); xlog("L_DEBUG", "$ci|nat|NAT REMOVE SQL => '$var(Query)'\n");
mq_add("presence_last_notity", "$uuid(g)", "$var(Query)"); mq_add("presence_last_notity", "$uuid(g)", "$var(Query)");
t_drop();
} }
route[PRESENCE_LOCAL_REQ_NAT]
route[PRESENCE_ROUTE_NAT_PING]
{ {
#!ifdef NAT_TRAVERSAL_ROLE
if($rm == "OPTIONS" && $fu == "PRESENCE_NAT_S_FROM_URI") {
t_on_reply("PRESENCE_NAT_REPLY");
t_on_failure("PRESENCE_NAT_FAULT");
t_set_fr(0, PRESENCE_NAT_TIMEOUT);
handle_ruri_alias();
record_route();
}
#!endif
return;
$fs = $(hdr(X-TM-Contact){uri.tosocket});
remove_hf_re("^X-TM-Contact");
force_rport();
handle_ruri_alias();
record_route();
xlog("L_DEBUG", "$ci|local|sending nat keepalive from $fu to $ru => $du => $tu\n");
setflag(FLAG_LOCAL_ROUTE);
t_on_reply("PRESENCE_NAT_REPLY");
t_on_failure("PRESENCE_NAT_FAULT");
t_set_fr(0, PRESENCE_NAT_TIMEOUT);
t_relay();
} }
route[PRESENCE_NAT_ON_REGISTRATION] route[PRESENCE_NAT_ON_REGISTRATION]


+ 0
- 1
kamailio/presence-role.cfg View File

@ -519,7 +519,6 @@ route[PRESENCE_API_BINDINGS]
route[PRESENCE_LOCAL_REQUEST] route[PRESENCE_LOCAL_REQUEST]
{ {
route(PRESENCE_LOCAL_REQ_NOTIFY); route(PRESENCE_LOCAL_REQ_NOTIFY);
route(PRESENCE_LOCAL_REQ_NAT);
} }
route[PRESENCE_ON_REGISTRATION] route[PRESENCE_ON_REGISTRATION]


+ 4
- 0
kamailio/sip_trace-role.cfg View File

@ -75,6 +75,10 @@ route[SIP_TRACE_LOCAL]
route[SIP_TRACE] route[SIP_TRACE]
{ {
if(src_ip == 127.0.0.1 || dst_ip == 127.0.0.1) {
return;
}
if (isflagset(FLAG_INTERNALLY_SOURCED)) { if (isflagset(FLAG_INTERNALLY_SOURCED)) {
route(SIP_TRACE_INTERNAL); route(SIP_TRACE_INTERNAL);
} else if (isflagset(FLAG_LOCAL_REQUEST)) { } else if (isflagset(FLAG_LOCAL_REQUEST)) {


Loading…
Cancel
Save