Browse Source

Merge pull request #42 from 2600hz/KAZOO-3494

KAZOO-3494 fast pickup
3.20
bitbashing 11 years ago
parent
commit
ce4d749a33
9 changed files with 126 additions and 77 deletions
  1. +1
    -0
      kamailio/acl-role.cfg
  2. +11
    -13
      kamailio/default.cfg
  3. +3
    -56
      kamailio/dispatcher-role.cfg
  4. +96
    -0
      kamailio/fast-pickup-role.cfg
  5. +1
    -0
      kamailio/local.cfg
  6. +11
    -8
      kamailio/presence-role.cfg
  7. +1
    -0
      kamailio/pusher-role.cfg
  8. +1
    -0
      kamailio/rate-limiter-role.cfg
  9. +1
    -0
      kamailio/registrar-role.cfg

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

@ -82,6 +82,7 @@ route[ACL_CHECK] {
else else
$var(query) = "{'Event-Category': 'acl', 'Event-Name': 'query', 'Entity': '" + $var(realm) + "'}"; $var(query) = "{'Event-Category': 'acl', 'Event-Name': 'query', 'Entity': '" + $var(realm) + "'}";
xlog("L_DBG", "$ci|ACL log|Query: $var(query)"); 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)")) { if (kazoo_query("frontier", "sbc_config", $var(query), "$var(acl-response)")) {
xlog("L_DBG", "$ci|ACL log|Response: $var(acl-response)"); xlog("L_DBG", "$ci|ACL log|Response: $var(acl-response)");


+ 11
- 13
kamailio/default.cfg View File

@ -217,6 +217,9 @@ include_file "nodes-role.cfg"
#!ifdef REGISTRAR_SYNC-ROLE #!ifdef REGISTRAR_SYNC-ROLE
include_file "registrar-sync-role.cfg" include_file "registrar-sync-role.cfg"
#!endif #!endif
#!ifdef FAST_PICKUP-ROLE
include_file "fast-pickup-role.cfg"
#!endif
####### Permissions module ########## ####### Permissions module ##########
loadmodule "permissions.so" loadmodule "permissions.so"
@ -568,12 +571,9 @@ route[EXTERNAL_TO_INTERNAL_RELAY]
} }
#!endif #!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-.*"); remove_hf_re("^X-.*");
append_hf("X-AUTH-IP: $si\r\n"); append_hf("X-AUTH-IP: $si\r\n");
@ -630,6 +630,10 @@ onreply_route[INTERNAL_REPLY]
route(DOS_PREVENTION); route(DOS_PREVENTION);
#!endif #!endif
#!ifdef FAST_PICKUP-ROLE
route(FAST_PICKUP_REPLY);
#!endif
if (is_method("INVITE") && if (is_method("INVITE") &&
!isflagset(FLAG_SESSION_PROGRESS) && !isflagset(FLAG_SESSION_PROGRESS) &&
t_check_status("(180)|(183)|(200)") t_check_status("(180)|(183)|(200)")
@ -644,12 +648,6 @@ onreply_route[INTERNAL_REPLY]
setflag(FLAG_SESSION_PROGRESS); 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) { if ($rs < 300) {
xlog("L_INFO", "$ci|pass|$T_req($si):$T_req($sp)"); 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 # if the failure case was something that we should recover
# from then try to find a new media server # 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"); xlog("L_INFO", "$ci|log|failure route ignoring call barred");
} else if (isflagset(FLAG_SESSION_PROGRESS)) { } else if (isflagset(FLAG_SESSION_PROGRESS)) {
xlog("L_INFO", "$ci|log|failure route ignoring failure after session progress"); xlog("L_INFO", "$ci|log|failure route ignoring failure after session progress");


+ 3
- 56
kamailio/dispatcher-role.cfg View File

@ -1,6 +1,5 @@
######## Generic Hash Table container in shared memory ######## ######## Generic Hash Table container in shared memory ########
modparam("htable", "htable", "failover=>size=16;autoexpire=120") modparam("htable", "htable", "failover=>size=16;autoexpire=120")
modparam("htable", "htable", "park=>size=4;autoexpire=600")
####### Dispatcher module ######## ####### Dispatcher module ########
loadmodule "dispatcher.so" loadmodule "dispatcher.so"
@ -69,61 +68,9 @@ route[DISPATCHER_FIND_ROUTES]
} }
#!endif #!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 (!ds_select_dst("$var(ds_group)", "0") || $(avp(ds_dst)[0]) == $null) {
# if we selected from group 1, try again in group 2 # if we selected from group 1, try again in group 2


+ 96
- 0
kamailio/fast-pickup-role.cfg View File

@ -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

+ 1
- 0
kamailio/local.cfg View File

@ -13,6 +13,7 @@ debug = L_INFO
#!trydef PRESENCE-ROLE #!trydef PRESENCE-ROLE
#!trydef RESPONDER-ROLE #!trydef RESPONDER-ROLE
#!trydef NODES-ROLE #!trydef NODES-ROLE
#!trydef FAST_PICKUP-ROLE
## Disabled Roles - remove all but the last '#' to enable ## Disabled Roles - remove all but the last '#' to enable
# # #!trydef TRAFFIC_FILTER-ROLE # # #!trydef TRAFFIC_FILTER-ROLE


+ 11
- 8
kamailio/presence-role.cfg View File

@ -3,7 +3,7 @@
#!trydef PRESENCE_MIN_EXPIRES_ACTION 1 #!trydef PRESENCE_MIN_EXPIRES_ACTION 1
#!trydef PRESENCE_MAX_EXPIRES 3600 #!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.so"
loadmodule "presence_dialoginfo.so" loadmodule "presence_dialoginfo.so"
@ -103,19 +103,22 @@ route[HANDLE_PUBLISH]
event_route[kazoo:consumer-event-presence-update] event_route[kazoo:consumer-event-presence-update]
{ {
$var(call-id) = $(kzE{kz.json,Call-ID});
if( $(kzE{kz.json,Event-Package}) == "dialog") { 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); kazoo_pua_publish($kzE);
pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1); pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1);
} else { } 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 { } 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); kazoo_pua_publish($kzE);
pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1); pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1);
} }


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

@ -15,6 +15,7 @@ route[INTERNAL_TO_EXTERNAL_PUSH]
$var(RoutingKey) = "notification.push." + $var(TokenType) + "." + $var(TokenID); $var(RoutingKey) = "notification.push." + $var(TokenType) + "." + $var(TokenID);
$var(exchange) = "pushes"; $var(exchange) = "pushes";
$avp(kz_timeout) = 20000; $avp(kz_timeout) = 20000;
sl_send_reply("100", "Attempting Kazoo query");
kazoo_query($var(exchange), $var(RoutingKey), $var(Payload)); kazoo_query($var(exchange), $var(RoutingKey), $var(Payload));
} }


+ 1
- 0
kamailio/rate-limiter-role.cfg View File

@ -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)}"); 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)"); 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)")) { if (kazoo_query("frontier", "sbc_config", $avp(s:query-request), "$var(amqp_result)")) {
xlog("L_INFO", "$ci|RL log| Response: $var(amqp_result)"); xlog("L_INFO", "$ci|RL log| Response: $var(amqp_result)");


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

@ -82,6 +82,7 @@ route[ATTEMPT_AUTHORIZATION]
} else { } 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_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}); $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))) { if(kazoo_query("callmgr", $var(amqp_routing_key), $var(amqp_payload_request))) {
$var(password) = $(kzR{kz.json,Auth-Password}); $var(password) = $(kzR{kz.json,Auth-Password});
$xavp(ulattrs=>custom_channel_vars) = $(kzR{kz.json,Custom-Channel-Vars}); $xavp(ulattrs=>custom_channel_vars) = $(kzR{kz.json,Custom-Channel-Vars});


Loading…
Cancel
Save