Browse Source

further tweaks to opensips conf

3.12
K Anderson 14 years ago
parent
commit
079ddedd56
1 changed files with 82 additions and 62 deletions
  1. +82
    -62
      opensips/opensips.tmp

+ 82
- 62
opensips/opensips.tmp View File

@ -122,6 +122,7 @@ loadmodule "textops.so"
loadmodule "usrloc.so" loadmodule "usrloc.so"
loadmodule "nathelper.so" loadmodule "nathelper.so"
loadmodule "nat_traversal.so" loadmodule "nat_traversal.so"
loadmodule "uac_redirect.so"
loadmodule "dispatcher.so" loadmodule "dispatcher.so"
loadmodule "mi_fifo.so" loadmodule "mi_fifo.so"
# loadmodule "mi_datagram.so" # loadmodule "mi_datagram.so"
@ -242,6 +243,15 @@ modparam("nat_traversal", "keepalive_method", "OPTIONS")
modparam("nat_traversal", "keepalive_from", "sip:keepalive@{{SIP_IP}}:{{SIP_PORT}}") modparam("nat_traversal", "keepalive_from", "sip:keepalive@{{SIP_IP}}:{{SIP_PORT}}")
modparam("nat_traversal", "keepalive_state_file", "/tmp/opensips_keepalive_state") modparam("nat_traversal", "keepalive_state_file", "/tmp/opensips_keepalive_state")
######################################################################
## UAC Redirect Module Parameters
######################################################################
modparam("uac_redirect", "default_filter", "accept")
# modparam("uac_redirect", "deny_filter", NULL)
# modparam("uac_redirect", "accept_filter", NULL)
# modparam("uac_redirect", "acc_function", "acc_log_request")
# modparam("uac_redirect", "acc_db_table", "acc")
###################################################################### ######################################################################
## Dispatcher Module Parameters ## Dispatcher Module Parameters
###################################################################### ######################################################################
@ -316,7 +326,7 @@ route
# this happens because the server is the destination of the request but # this happens because the server is the destination of the request but
# we mangle it to send it else where. When that mangeling fails and we # we mangle it to send it else where. When that mangeling fails and we
# still relay it then it just comes right back to us... # still relay it then it just comes right back to us...
if (src_ip==myself)
if (src_ip==myself)
{ {
xlog("L_WARN", "$ci|end|sourced from this server"); xlog("L_WARN", "$ci|end|sourced from this server");
@ -337,18 +347,20 @@ route
# if the source IP/port are in one of the server dispatch lists # if the source IP/port are in one of the server dispatch lists
# then this request originated from one of our media servers, mark it # then this request originated from one of our media servers, mark it
# as such by setting flag 26 # as such by setting flag 26
if (ds_is_in_list("$si", "$sp", "1"))
if (ds_is_in_list("$si", "", "1"))
{ {
xlog("L_INFO", "$ci|log|inception on-net");
xlog("L_INFO", "$ci|log|internal inception (from media server)");
# Flag 26 marks the source as a on-net server
# Flag 26 marks the source as a on-net server
setflag(26); setflag(26);
setbflag(26);
} }
# if the request source IP/port was not in any dispatcher lists # if the request source IP/port was not in any dispatcher lists
# this this originated outside our equipment (carrier, client, ect) # this this originated outside our equipment (carrier, client, ect)
else else
{ {
xlog("L_INFO", "$ci|log|inception off-net");
xlog("L_INFO", "$ci|log|external inception");
} }
# if the to header has a tag attached then it implies this request # if the to header has a tag attached then it implies this request
@ -364,7 +376,7 @@ route
# if the request is an ACK from our media servers with a IP in the from domain # if the request is an ACK from our media servers with a IP in the from domain
# then bump the association # then bump the association
#if ($(fd{ip.isip}) && isflagset(26) && is_method("ACK"))
#if ($(fd{ip.isip}) && isflagset(26) && is_method("ACK"))
#{ #{
#cache_store("local", "$tU", "$fd", 3600); #cache_store("local", "$tU", "$fd", 3600);
@ -373,7 +385,7 @@ route
xlog("L_INFO", "$ci|log|forwarding based on the route set"); xlog("L_INFO", "$ci|log|forwarding based on the route set");
route(1);
route(correct_transmit_and_die);
} }
else if ( is_method("ACK") ) else if ( is_method("ACK") )
{ {
@ -383,7 +395,7 @@ route
# a 487 or e.g. 404 from upstream server # a 487 or e.g. 404 from upstream server
xlog("L_INFO", "$ci|log|in dialog request belongs to a known transaction"); xlog("L_INFO", "$ci|log|in dialog request belongs to a known transaction");
route(1);
route(correct_transmit_and_die);
} }
else else
{ {
@ -413,9 +425,9 @@ route
{ {
xlog("L_INFO", "$ci|log|request belogs to a known transaction"); xlog("L_INFO", "$ci|log|request belogs to a known transaction");
route(1);
route(correct_transmit_and_die);
} }
# if the cancel does not belong to a known transaction or a
# if the cancel does not belong to a known transaction or a
# request that has not progressed outside this server dont relay it # request that has not progressed outside this server dont relay it
else else
{ {
@ -448,7 +460,7 @@ route
# to add the path header (along with the received IP/port info) # to add the path header (along with the received IP/port info)
if (is_method("REGISTER")) if (is_method("REGISTER"))
{ {
# if we fail to add the path header then dont let it
# if we fail to add the path header then dont let it
# register because it will cause issues later... # register because it will cause issues later...
if (!add_path_received()) if (!add_path_received())
{ {
@ -462,12 +474,9 @@ route
xlog("L_INFO", "$ci|log|added path"); xlog("L_INFO", "$ci|log|added path");
} }
# if the request is from on of our media servers then dont change the routing
if (isflagset(26))
{
xlog("L_INFO", "$ci|log|originated from internal source");
}
else
# if the request is not from a media server it must be for one, load a list of
# currently active servers
if (!isflagset(26))
{ {
if (ds_select_domain("1", "4")) if (ds_select_domain("1", "4"))
{ {
@ -479,15 +488,15 @@ route
{ {
xlog("L_ERR", "$ci|end|no servers avaliable"); xlog("L_ERR", "$ci|end|no servers avaliable");
sl_send_reply("486", "All servers busy");
sl_send_reply("503", "The cake is a lie!");
exit; exit;
} }
} }
# if the request is not from our media severs but has a contact uri in localcache
# if the request is not from our media severs but has a contact uri in localcache
# then change the routing to go to the server previously associated with it. # then change the routing to go to the server previously associated with it.
if ($ct.fields(uri) && cache_fetch("local", "$(ct.fields(uri){uri.user})", $avp(i:55)))
if ($ct.fields(uri) && cache_fetch("local", "$(ct.fields(uri){uri.user})", $avp(i:55)))
{ {
xlog("L_INFO", "$ci|log|contact $(ct.fields(uri){uri.user}) is associated with media server $avp(i:55)"); xlog("L_INFO", "$ci|log|contact $(ct.fields(uri){uri.user}) is associated with media server $avp(i:55)");
@ -545,7 +554,7 @@ route
} }
} }
} }
# if the request is not from our media severs but has a call-id in localcache
# if the request is not from our media severs but has a call-id in localcache
# then change the routing to go to the server previously associated with it. # then change the routing to go to the server previously associated with it.
else if (cache_fetch("local", "$ci", $avp(i:55))) else if (cache_fetch("local", "$ci", $avp(i:55)))
{ {
@ -605,16 +614,16 @@ route
} }
} }
if ($ct.fields(uri) && is_method("INVITE"))
if ($ct.fields(uri) && is_method("INVITE"))
{ {
cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$rd:$rp", 3600); cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$rd:$rp", 3600);
xlog("L_INFO", "$ci|log|associated contact $(ct.fields(uri){uri.user}) with media server sip:$rd:$rp"); xlog("L_INFO", "$ci|log|associated contact $(ct.fields(uri){uri.user}) with media server sip:$rd:$rp");
} }
} }
# if the request is not from our media servers and no associations in localcache
# if the request is not from our media servers and no associations in localcache
# then used the distribute list as is # then used the distribute list as is
else
else if (!isflagset(26))
{ {
xlog("L_INFO", "$ci|log|routing call to arbitrary media server $rd:$rp"); xlog("L_INFO", "$ci|log|routing call to arbitrary media server $rd:$rp");
} }
@ -631,22 +640,32 @@ route
xlog("L_INFO", "$ci|log|added this server to the route set"); xlog("L_INFO", "$ci|log|added this server to the route set");
} }
route(1);
route(correct_transmit_and_die);
} }
route[1]
route[correct_transmit_and_die]
{ {
route("nat_test_and_correct");
# if the request is from a media server then assume it is going somewhere
# outside our control and give that equipment longer to respond.
# Also arm a branch to log the replies
if (isflagset(26) || isbflagset(26))
{
xlog("L_INFO", "$ci|log|provisional reply required in 6 seconds");
$avp(s:final_reply_timer) = 6;
# if the request domain is an IP and it exists in the list of our media servers (irregardless of the port)
# then...
t_on_reply("external_reply");
}
# otherwise the request must be for a media server
# 1. remove any X-AUTH-IP headers so we will be the only one to set it # 1. remove any X-AUTH-IP headers so we will be the only one to set it
# 2. set the X-AUTH-IP header for freeswitch ACLs # 2. set the X-AUTH-IP header for freeswitch ACLs
# 3. set the final reply timer to two seconds, so we failover faster # 3. set the final reply timer to two seconds, so we failover faster
# 4. arm a logging branch for replies # 4. arm a logging branch for replies
# 5. arm a failure branch that will try another one of our media servers when possible # 5. arm a failure branch that will try another one of our media servers when possible
if ($(rd{ip.isip}) && ds_is_in_list("$rd", "", "1"))
else
{ {
route("nat_test_and_correct");
remove_hf("X-AUTH-IP"); remove_hf("X-AUTH-IP");
xlog("L_INFO", "$ci|log|X-AUTH-IP: $si"); xlog("L_INFO", "$ci|log|X-AUTH-IP: $si");
@ -657,23 +676,19 @@ route[1]
$avp(s:final_reply_timer) = 2; $avp(s:final_reply_timer) = 2;
t_on_reply("on_net_reply");
t_on_reply("internal_reply");
t_on_failure("on_net_fault");
t_on_failure("internal_fault");
} }
# if the request domain is not an IP or in our list of media servers then
# assume it is going somewhere outside our control and give that equipment
# longer to respond. Also arm a branch to log the replies
else
{
xlog("L_INFO", "$ci|log|provisional reply required in 6 seconds");
$avp(s:final_reply_timer) = 6;
route("logged_relay");
t_on_reply("off_net_reply");
}
exit;
}
# try to send the request on its way, if it fails send back a
route[logged_relay]
{
# try to send the request on its way, if it fails send back a
# stateless error to the requestor # stateless error to the requestor
if (t_relay()) if (t_relay())
{ {
@ -685,8 +700,6 @@ route[1]
sl_reply_error(); sl_reply_error();
} }
exit;
} }
route[nat_test_and_correct] route[nat_test_and_correct]
@ -695,21 +708,21 @@ route[nat_test_and_correct]
# this check looks at: # this check looks at:
# 1. if client has a private IP address (as defined by RFC1918) in the Contact field of the SIP message # 1. if client has a private IP address (as defined by RFC1918) in the Contact field of the SIP message
# 2. if client has contacted OpenSIPS from an address that is different from the one in the Via field # 2. if client has contacted OpenSIPS from an address that is different from the one in the Via field
if (client_nat_test("3"))
if (client_nat_test("3"))
{ {
xlog("L_INFO", "$ci|log|via address differs from source or RFC1918 address in contact"); xlog("L_INFO", "$ci|log|via address differs from source or RFC1918 address in contact");
# adds the rport parameter to the first Via header # adds the rport parameter to the first Via header
force_rport(); force_rport();
# will replace the IP and port in the Contact header with the IP and port
# will replace the IP and port in the Contact header with the IP and port
# the SIP message was received from # the SIP message was received from
fix_contact(); fix_contact();
} }
# if the request has a body see if it needs NAT corrections as well, # if the request has a body see if it needs NAT corrections as well,
# this check looks at: # this check looks at:
# 8. SDP is searched for occurrence of RFC1918 addresses
# 8. SDP is searched for occurrence of RFC1918 addresses
if (has_body("application/sdp") && nat_uac_test("8")) if (has_body("application/sdp") && nat_uac_test("8"))
{ {
xlog("L_INFO", "$ci|log|SDP contains a RFC1918 address"); xlog("L_INFO", "$ci|log|SDP contains a RFC1918 address");
@ -721,27 +734,28 @@ route[nat_test_and_correct]
} }
} }
onreply_route[off_net_reply]
onreply_route[external_reply]
{ {
# this branch handles replies that are comming from equipment # this branch handles replies that are comming from equipment
# outside our control, just logging and NAT corrections # outside our control, just logging and NAT corrections
xlog("L_INFO", "$ci|start|recieved off-net reply $rs $rr");
xlog("L_INFO", "$ci|start|recieved external reply $rs $rr");
xlog("L_INFO", "$ci|log|source $si:$sp"); xlog("L_INFO", "$ci|log|source $si:$sp");
route("nat_test_and_correct"); route("nat_test_and_correct");
xlog("L_INFO", "$ci|pass|$(<request>si):$(<request>sp)"); xlog("L_INFO", "$ci|pass|$(<request>si):$(<request>sp)");
# if the reply is not dropped (only provisional replies can be),
# it will be injected and processed by the transaction engine.
} }
onreply_route[on_net_reply]
onreply_route[internal_reply]
{ {
# this branch handles replies that are comming from our # this branch handles replies that are comming from our
# media server, just logging and NAT corrections # media server, just logging and NAT corrections
xlog("L_INFO", "$ci|start|recieved on-net reply $rs $rr");
xlog("L_INFO", "$ci|start|recieved internal reply $rs $rr");
xlog("L_INFO", "$ci|log|source $si:$sp"); xlog("L_INFO", "$ci|log|source $si:$sp");
route("nat_test_and_correct");
# if one of our media servers has replied with a 407 or 401 associate # if one of our media servers has replied with a 407 or 401 associate
# this call-id with that media server so the next "initial" requests # this call-id with that media server so the next "initial" requests
# go to it (IE: the reply to the challenge) # go to it (IE: the reply to the challenge)
@ -753,13 +767,16 @@ onreply_route[on_net_reply]
} }
xlog("L_INFO", "$ci|pass|$(<request>si):$(<request>sp)"); xlog("L_INFO", "$ci|pass|$(<request>si):$(<request>sp)");
# if the reply is not dropped (only provisional replies can be),
# it will be injected and processed by the transaction engine.
} }
failure_route[on_net_fault]
failure_route[internal_fault]
{ {
# if the failure cause was due to the transaction being # if the failure cause was due to the transaction being
# cancelled then we are complete # cancelled then we are complete
if (t_was_cancelled())
if (t_was_cancelled())
{ {
xlog("L_INFO", "$ci|end|transaction was cancelled"); xlog("L_INFO", "$ci|end|transaction was cancelled");
@ -770,7 +787,7 @@ failure_route[on_net_fault]
# from then try to find a new media server # from then try to find a new media server
if (t_check_status("(408)|(5[0-9][0-9])")) if (t_check_status("(408)|(5[0-9][0-9])"))
{ {
xlog("L_INFO", "$ci|start|recieved or generated negative reply");
xlog("L_INFO", "$ci|start|recieved or generated negative reply (>=300)");
xlog("L_INFO", "$ci|log|source $si:$sp"); xlog("L_INFO", "$ci|log|source $si:$sp");
xlog("L_ERR", "$ci|log|moving media server $rd:$rp to probing mode"); xlog("L_ERR", "$ci|log|moving media server $rd:$rp to probing mode");
@ -793,7 +810,7 @@ failure_route[on_net_fault]
# if the request has a contact and is an INVITE then store the new # if the request has a contact and is an INVITE then store the new
# association # association
if ($ct.fields(uri) && is_method("INVITE"))
if ($ct.fields(uri) && is_method("INVITE"))
{ {
cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$rd:$rp", 3600); cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$rd:$rp", 3600);
@ -805,13 +822,13 @@ failure_route[on_net_fault]
# reset the final reply timer # reset the final reply timer
$avp(s:final_reply_timer) = 2; $avp(s:final_reply_timer) = 2;
t_on_reply("on_net_reply");
t_on_reply("internal_reply");
t_on_failure("on_net_fault");
t_on_failure("internal_fault");
# relay the request to the new media server
# relay the request to the new media server
t_relay(); t_relay();
exit(); exit();
} }
else else
@ -819,4 +836,7 @@ failure_route[on_net_fault]
xlog("L_ERR", "$ci|end|no other media servers avaliable"); xlog("L_ERR", "$ci|end|no other media servers avaliable");
} }
} }
}
# if no new branch is generated or no reply is forced over, by default,
# the winning reply will be sent back to UAC.
}

Loading…
Cancel
Save