diff --git a/kamailio/acl-role.cfg b/kamailio/acl-role.cfg index d0cbcb4..69bf722 100644 --- a/kamailio/acl-role.cfg +++ b/kamailio/acl-role.cfg @@ -82,6 +82,7 @@ route[ACL_CHECK] { else $var(query) = "{'Event-Category': 'acl', 'Event-Name': 'query', 'Entity': '" + $var(realm) + "'}"; xlog("L_DBG", "$ci|ACL log|Query: $var(query)"); + sl_send_reply("100", "Attempting Kazoo query"); if (kazoo_query("frontier", "sbc_config", $var(query), "$var(acl-response)")) { xlog("L_DBG", "$ci|ACL log|Response: $var(acl-response)"); diff --git a/kamailio/default.cfg b/kamailio/default.cfg index 644f244..b942694 100644 --- a/kamailio/default.cfg +++ b/kamailio/default.cfg @@ -217,6 +217,9 @@ include_file "nodes-role.cfg" #!ifdef REGISTRAR_SYNC-ROLE include_file "registrar-sync-role.cfg" #!endif +#!ifdef FAST_PICKUP-ROLE +include_file "fast-pickup-role.cfg" +#!endif ####### Permissions module ########## loadmodule "permissions.so" @@ -568,12 +571,9 @@ route[EXTERNAL_TO_INTERNAL_RELAY] } #!endif - ##### CALL-PARK #### - if(is_method("REFER")) { - $avp(refer_to) = $hdr(Refer-To); - $avp(refer_to_uri) = $rt; - $avp(referred_by) = $hdr(Referred-By); - } + #!ifdef FAST_PICKUP-ROLE + route(FAST_PICKUP_REFER); + #!endif remove_hf_re("^X-.*"); append_hf("X-AUTH-IP: $si\r\n"); @@ -630,6 +630,10 @@ onreply_route[INTERNAL_REPLY] route(DOS_PREVENTION); #!endif + #!ifdef FAST_PICKUP-ROLE + route(FAST_PICKUP_REPLY); + #!endif + if (is_method("INVITE") && !isflagset(FLAG_SESSION_PROGRESS) && t_check_status("(180)|(183)|(200)") @@ -644,12 +648,6 @@ onreply_route[INTERNAL_REPLY] setflag(FLAG_SESSION_PROGRESS); } - ##### CALL-PARK #### - if (is_method("REFER") && t_check_status("(200)|(202)") ) { - $sht(park=>$(avp(refer_to_uri){uri.user})@$(avp(refer_to_uri){uri.domain})) = "sip:" + $(ct{tobody.uri}{uri.host}) + ":" + $(ct{tobody.uri}{uri.port}); - xlog("L_INFO", "caching park info $(avp(refer_to_uri){uri.user})@$(avp(refer_to_uri){uri.domain}) = sip:$(ct{tobody.uri}{uri.host}):$(ct{tobody.uri}{uri.port})"); - } - if ($rs < 300) { xlog("L_INFO", "$ci|pass|$T_req($si):$T_req($sp)"); } @@ -695,7 +693,7 @@ failure_route[INTERNAL_FAULT] # if the failure case was something that we should recover # from then try to find a new media server - } else if ("$var(reply_reason)" =~ "call barred") { + } else if ($var(reply_reason) =~ "call barred") { xlog("L_INFO", "$ci|log|failure route ignoring call barred"); } else if (isflagset(FLAG_SESSION_PROGRESS)) { xlog("L_INFO", "$ci|log|failure route ignoring failure after session progress"); diff --git a/kamailio/dispatcher-role.cfg b/kamailio/dispatcher-role.cfg index cfb4046..6b22f9c 100644 --- a/kamailio/dispatcher-role.cfg +++ b/kamailio/dispatcher-role.cfg @@ -1,6 +1,5 @@ ######## Generic Hash Table container in shared memory ######## modparam("htable", "htable", "failover=>size=16;autoexpire=120") -modparam("htable", "htable", "park=>size=4;autoexpire=600") ####### Dispatcher module ######## loadmodule "dispatcher.so" @@ -69,61 +68,9 @@ route[DISPATCHER_FIND_ROUTES] } #!endif - if (is_method("INVITE")) { - - $var(replaced_call_id) = "none"; - - if( $(ou{uri.param,kazoo-id}{s.len}) > 0) { - if($hdr(Replaces)== $null) { - $var(replaced_call_id) = $(ou{uri.param,kazoo-id}{s.unescape.param}); - append_hf("Replaces: $var(replaced_call_id)\r\n"); - } - } - - if($hdr(Replaces)!= $null) { - $var(replaced_call_id) = $(hdr(Replaces){s.select,0,;}); - } - - if($var(replaced_call_id) != "none") { - xlog("L_INFO", "$ci|log|replaces call-id $var(replaced_call_id)"); - $var(amqp_payload_request) = '{"Event-Category" : "call_event" , "Event-Name" : "channel_status_req", "Call-ID" : "' + $var(replaced_call_id) + '", "Active-Only" : true }'; - $var(amqp_routing_key) = "call.status_req." + $(var(replaced_call_id){kz.encode}); - if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request))) { - $du = $(kzR{kz.json,Switch-URL}); - if($du != $null) { - xlog("L_INFO", "$ci|log|call-id $var(replaced_call_id) found redirecting call to $du, courtesy of kazoo"); - return; - } - } - } - - ##### CALL-PARK #### - if($(ru{uri.user}) =~ "\*3" && $sht(park=>$(ru{uri.user})@$(ru{uri.domain})) != $null) { - $du = $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})); - xlog("L_INFO", "$ci|log|redirecting park request to $du"); - if ($hdr(Proxy-Authorization) != $null) { - xlog("L_INFO", "$ci|log|removed park redirect"); - $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})) = $null; - } - return; - } - - - ##### CALL-PARK IN KAZOO #### - if($(ru{uri.user}) =~ "\*3" && !($rd =~ "[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}\.[0-9]{1,3}") ) { - xlog("L_INFO", "$ci|log|checking park request to $(ru{uri.user})@$(ru{uri.domain})"); - $var(amqp_payload_request) = '{"Event-Category" : "call_event" , "Event-Name" : "query_user_channels_req", "Username" : "$(ru{uri.user})", "Realm" : "$(ru{uri.domain})", "Active-Only" : true }'; - $var(amqp_routing_key) = "call.status_req." + $(var(replaced_call_id){kz.encode}); - if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request))) { - $du = $(kzR{kz.json,Channels[0].switch_url}); - if($du != $null) { - xlog("L_INFO", "$ci|log|redirecting park request to $du, courtesy of kazoo"); - return; - } - } - } - - } + #!ifdef FAST_PICKUP-ROLE + route(FAST_PICKUP_ATTEMPT); + #!endif if (!ds_select_dst("$var(ds_group)", "0") || $(avp(ds_dst)[0]) == $null) { # if we selected from group 1, try again in group 2 diff --git a/kamailio/fast-pickup-role.cfg b/kamailio/fast-pickup-role.cfg new file mode 100644 index 0000000..968a5bf --- /dev/null +++ b/kamailio/fast-pickup-role.cfg @@ -0,0 +1,96 @@ +######## FAST PICKUP ROLE ######## +modparam("htable", "htable", "park=>size=4;autoexpire=600") +modparam("htable", "htable", "fp=>size=32;autoexpire=3600;"); + +route[FAST_PICKUP_ATTEMPT] +{ + if (!is_method("INVITE")) { + return; + } + + $var(replaced_call_id) = "none"; + + if($ru =~ "sip:kfp+") { + $var(Cookie) = $(ru{s.rm,sip:kfp+}); + if($sht(fp=>$var(Cookie)::Call-ID) != $null) { + $var(replaced_call_id) = $sht(fp=>$var(Cookie)::Call-ID); + if($hdr(Replaces)!= $null) { + remove_hf_re("^Replaces"); + } + append_hf("Replaces: $var(replaced_call_id)\r\n"); + $ru = $sht(fp=>$var(Cookie)::URI); + $tu = $sht(fp=>$var(Cookie)::URI); + $du = $sht(fp=>$var(Cookie)::Switch-URI); + route(EXTERNAL_TO_INTERNAL_RELAY); + exit(); + } + } + + if($hdr(Replaces)!= $null) { + $var(replaced_call_id) = $(hdr(Replaces){s.select,0,;}); + } + + if($var(replaced_call_id) != "none") { + xlog("L_INFO", "$ci|log|replaces call-id $var(replaced_call_id)"); + $var(amqp_payload_request) = '{"Event-Category" : "call_event" , "Event-Name" : "channel_status_req", "Call-ID" : "' + $var(replaced_call_id) + '", "Active-Only" : true }'; + $var(amqp_routing_key) = "call.status_req." + $(var(replaced_call_id){kz.encode}); + sl_send_reply("100", "Attempting Kazoo query"); + if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request))) { + $du = $(kzR{kz.json,Switch-URL}); + if($du != $null) { + xlog("L_INFO", "$ci|log|call-id $var(replaced_call_id) found redirecting call to $du, courtesy of kazoo"); + route(EXTERNAL_TO_INTERNAL_RELAY); + exit(); + } + } + } + + ##### CALL-PARK #### + if($(ru{uri.user}) =~ "\*3" && $sht(park=>$(ru{uri.user})@$(ru{uri.domain})) != $null) { + $du = $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})); + xlog("L_INFO", "$ci|log|redirecting park request to $du"); + if ($hdr(Proxy-Authorization) != $null) { + xlog("L_INFO", "$ci|log|removed park redirect"); + $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})) = $null; + } + route(EXTERNAL_TO_INTERNAL_RELAY); + exit(); + } +} + +route[FAST_PICKUP_REFER] +{ + if(!is_method("REFER")) { + return; + } + + $avp(refer_to) = $hdr(Refer-To); + $avp(referred_by) = $hdr(Referred-By); + $avp(refer_to_uri) = $rt; +} + +route[FAST_PICKUP_REPLY] { + if (!is_method("REFER") || !t_check_status("(200)|(202)") ) { + return; + } + + $var(contact) = "sip:" + $(ct{tobody.uri}{uri.host}) + ":" + $(ct{tobody.uri}{uri.port}); + xlog("L_INFO", "$ci|log|caching park info $(avp(refer_to_uri){uri.user})@$(avp(refer_to_uri){uri.domain}) = $var(contact)"); + + $sht(park=>$(avp(refer_to_uri){uri.user})@$(avp(refer_to_uri){uri.domain})) = $var(contact); +} + +route[FAST_PICKUP_INIT] +{ + $var(AppName) = $(kzE{kz.json,App-Name}); + if($var(AppName) == "park") { + $var(Pickup) = ";kazoo-pickup=true"; + } else { + $var(Pickup) = ""; + } + $sht(fp=>$(kzE{kz.json,Call-Cookie})::Switch-URI) = $(kzE{kz.json,Switch-URI}); + $sht(fp=>$(kzE{kz.json,Call-Cookie})::Call-ID) = $(kzE{kz.json,Target-Call-ID}); + $sht(fp=>$(kzE{kz.json,Call-Cookie})::URI) = "sip:" + $(kzE{kz.json,From-User}) + "@" + $(kzE{kz.json,To-Realm}) + $var(Pickup); +} + +# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab diff --git a/kamailio/local.cfg b/kamailio/local.cfg index de5a18e..1f8f058 100644 --- a/kamailio/local.cfg +++ b/kamailio/local.cfg @@ -13,6 +13,7 @@ debug = L_INFO #!trydef PRESENCE-ROLE #!trydef RESPONDER-ROLE #!trydef NODES-ROLE +#!trydef FAST_PICKUP-ROLE ## Disabled Roles - remove all but the last '#' to enable # # #!trydef TRAFFIC_FILTER-ROLE diff --git a/kamailio/presence-role.cfg b/kamailio/presence-role.cfg index 343a938..b287583 100644 --- a/kamailio/presence-role.cfg +++ b/kamailio/presence-role.cfg @@ -3,7 +3,7 @@ #!trydef PRESENCE_MIN_EXPIRES_ACTION 1 #!trydef PRESENCE_MAX_EXPIRES 3600 -modparam("htable", "htable", "p=>size=32;autoexpire=600;") +modparam("htable", "htable", "p=>size=32;autoexpire=3600;") loadmodule "presence.so" loadmodule "presence_dialoginfo.so" @@ -103,19 +103,22 @@ route[HANDLE_PUBLISH] event_route[kazoo:consumer-event-presence-update] { + $var(call-id) = $(kzE{kz.json,Call-ID}); if( $(kzE{kz.json,Event-Package}) == "dialog") { - if($sht(p=>$(kzE{kz.json,Call-ID})-$(kzE{kz.json,From})) != $(kzE{kz.json,State})) { - xlog("L_INFO", "received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From})"); - xlog("L_INFO", "payload $kzE"); - $sht(p=>$(kzE{kz.json,Call-ID})-$(kzE{kz.json,From})) = $(kzE{kz.json,State}); + if($sht(p=>$var(call-id)) != $(kzE{kz.json,State})) { + xlog("L_INFO", "$var(call-id)|log|received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State})"); + $sht(p=>$(kzE{kz.json,Call-ID})) = $(kzE{kz.json,State}); + #!ifdef FAST_PICKUP-ROLE + route(FAST_PICKUP_INIT); + #!endif kazoo_pua_publish($kzE); pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1); } else { - xlog("L_INFO", "received duplicate $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From})"); - xlog("L_INFO", "payload $kzE"); + xlog("L_INFO", "$var(call-id)|log|received duplicate $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State})"); + xlog("L_INFO", "$var(call-id)|log|payload $kzE"); } } else { - xlog("L_INFO", "received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) $kzE"); + xlog("L_INFO", "$var(call-id)|log|received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) $kzE"); kazoo_pua_publish($kzE); pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1); } diff --git a/kamailio/pusher-role.cfg b/kamailio/pusher-role.cfg index 2bd8c61..7134106 100644 --- a/kamailio/pusher-role.cfg +++ b/kamailio/pusher-role.cfg @@ -15,6 +15,7 @@ route[INTERNAL_TO_EXTERNAL_PUSH] $var(RoutingKey) = "notification.push." + $var(TokenType) + "." + $var(TokenID); $var(exchange) = "pushes"; $avp(kz_timeout) = 20000; + sl_send_reply("100", "Attempting Kazoo query"); kazoo_query($var(exchange), $var(RoutingKey), $var(Payload)); } diff --git a/kamailio/rate-limiter-role.cfg b/kamailio/rate-limiter-role.cfg index f39a184..a1b11a5 100644 --- a/kamailio/rate-limiter-role.cfg +++ b/kamailio/rate-limiter-role.cfg @@ -105,6 +105,7 @@ route[DOS_PREVENTION] { avp_printf("$avp(s:query-request)", "{\"Entity\" : \"$var(entity)\", \"$var(method-key)\" : $var(method-value), \"Event-Category\" : \"rate_limit\", \"Event-Name\" : \"query\", \"With-Realm\" : $var(with-realm-request)}"); xlog("L_INFO", "$ci|RL log| Query: $avp(s:query-request)"); + sl_send_reply("100", "Attempting Kazoo query"); if (kazoo_query("frontier", "sbc_config", $avp(s:query-request), "$var(amqp_result)")) { xlog("L_INFO", "$ci|RL log| Response: $var(amqp_result)"); diff --git a/kamailio/registrar-role.cfg b/kamailio/registrar-role.cfg index 741c1c2..b1ffeaf 100644 --- a/kamailio/registrar-role.cfg +++ b/kamailio/registrar-role.cfg @@ -82,6 +82,7 @@ route[ATTEMPT_AUTHORIZATION] } else { $var(amqp_payload_request) = "{'Event-Category' : 'directory' , 'Event-Name' : 'authn_req', 'Method' : 'REGISTER', 'Auth-Realm' : '" + $fd + "', 'Auth-User' : '" + $fU + "', 'From' : '" + $fu + "', 'To' : '" + $tu +"' }"; $var(amqp_routing_key) = "authn.req." + $(fd{kz.encode}); + sl_send_reply("100", "Attempting Kazoo query"); if(kazoo_query("callmgr", $var(amqp_routing_key), $var(amqp_payload_request))) { $var(password) = $(kzR{kz.json,Auth-Password}); $xavp(ulattrs=>custom_channel_vars) = $(kzR{kz.json,Custom-Channel-Vars});