Hello all,
I've a small problem that causes a lot of problems and is in some way
specific:
I've a Openser 1.1.1 Server running on a public rootserver. User are
registered with FritzBox ( DSL-Router with Voip-Stack) or a
Soft/Hardphone being Nated. For the PSTN connectivity i've access to a
PSTN Gateway from the BT.
Everything works very nice with just one problem remaining. When one
User gets a call from PSTN and picks it up, no problems. But the problem
comes when a second call is made to the same User. His phone tells him
that somebody is knocking and he can pickup the phone without any problem.
The problem is on the callers side because he doesn't get any feedback
that he is ringing/knocking, so most of the time he will just cancel the
call.
I did some research about it and here are my conclusions:
The INVITE from the second call isn't answered with a "180 Ringing.."
but with a "182 Queued.." which doesn't trigger a Ringing for the PSTN
Call. When I talked to the BT support they did not really know about the
status code 182 and could not give me an answer how their mediagateway
will handle it ( They promised me to get the informtion :-) ).
On the other side I can't change the Firmware so there's no way of
persuading the DSL-Router to use 180 instead of 182.
So my questions are:
Can i change the status code at the proxy?
If so, in which part of the routing logic do I have to change it?
I tried a lot of different subst() and replace() commands but none had
any effect on the sip messages it always kept being 182.
Below you can see my configuration which is based on the template from
ixcall (
http://www.ixcall.net/?q=node/32 ) with a lot of changes and
support from the "getting started" guide from
onsip.org, of course
adapted to the openser 1.1.1 version
I have attached my config. Keep in mind that this config will get
through a m4 parser before being ready to be used ( mechanism can be
seen at ixcall ).
I hope my english is good enough to have my problem explained in a
understandable manner
Have fun
Marc
/*
====================================================================
Schnuffle Openser Configuration V6.3
Based on IxCall template V2.4 (
http://www.ixcall.net/?q=node/32)
And
OnSip.org "Getting Started" Guid
(
http://siprouter.onsip.org/doc/gettingstarted/)
====================================================================
list of flags used
1 - Accounting
2 - Missed calls Accouting
3 - NAT SIP ping flag
4 - NAT invite detected
5 - registrar module nat_flag
6 - Enable NAT support
7 - Enable Trunk (pstn, asterisk or yate)
13 - Enable debugging
--------------------------------------------------------------------
Routes
1 - Relay with NAT helper and no proxy authentication
2 - Method Register handler
3 - Method Invite handler (call routing)
4 - Trunk and PSTN gateway routing
5 - TLS routing ( not really used but still in config to keep the given message flow
intact )
6 - Relay with no NAT support and no proxy authentication
7 - User verify
10 - Relay with NAT helper and proxy authentication
Reply 1 - NAT helper
Fail 1 - Voicemail and message store ( stripped from all the voicemail and message storage
stuff, so in fact just empty )
--------------------------------------------------------------------
*/
#Global settings
debug=3
log_facility=LOG_LOCAL7
fork=yes
log_stderror=no
mhomed=no # Multihomed - set this to no if you set a "listen" addres
listen=OPENSER_IP # only want to bind to this ip
port=OPENSER_PORT
children=4
tcp_children=4
tcp_accept_aliases=yes
alias=OPENSER_REALM # your realm
alias=OPENSER_HOST # alias domains of your SRV records
alias=OPENSER_IP # and for the die hard ip users.
# uncomment to override config values for debugging
/*
debug=7 # debug level (cmd line: -ddd)
fork=no
port=OPENSER_PORT
log_stderror=yes # (cmd line: -E)
fifo="OPENSER_FIFO"
*/
dns=no
rev_dns=no
fifo="OPENSER_FIFO"
fifo_mode=OPENSER_FIFO_MODE
#TLS specific settings
disable_tls = DISABLE_TLS
#listen = tls:OPENSER_TLS_IP:OPENSER_TLS_PORT
#tls_verify = 1
#tls_require_certificate = 0
#tls_method = SSLv23
#tls_certificate = "DEFAULT_TLS_CERTIFICATE"
#tls_private_key = "DEFAULT_TLS_PRIVATE_KEY"
#tls_ca_list = "DEFAULT_TLS_CA_LIST"
mpath="OPENSER_MODULE_PATH" #path to openser modules
loadmodule "mysql.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "acc.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "alias_db.so"
loadmodule "uri.so"
loadmodule "uri_db.so"
loadmodule "mediaproxy.so"
loadmodule "nathelper.so"
loadmodule "textops.so"
loadmodule "avpops.so"
loadmodule "domain.so"
loadmodule "permissions.so"
loadmodule "group.so"
loadmodule "xlog.so"
loadmodule "enum.so"
loadmodule "lcr.so"
fifo_db_url="mysql://OPENSER_DB_USER:OPENSER_DB_PW@OPENSER_DB_HOST/OPENSER_DB"
modparam("avpops|auth_db|alias_db|permissions|uri_db|usrloc|acc|msilo|group|domain|lcr|pdt","db_url",
"mysql://OPENSER_DB_USER:OPENSER_DB_PW@OPENSER_DB_HOST/OPENSER_DB")
modparam("auth_db", "calculate_ha1", CALCULATE_HA1)
modparam("auth_db", "password_column", "PASSWORD_COLUMN")
modparam("auth_db", "password_column_2", "ha1b")
modparam("auth", "secret", "OPENSER_DIGEST_PW")
#nathelper, mediaproxy or both can be used
#we will only be using mediaproxy
modparam("nathelper", "rtpproxy_disable", 1)
modparam("nathelper", "natping_interval", 0)
modparam("mediaproxy","natping_interval", 30)
modparam("mediaproxy","mediaproxy_socket",
"MEDIAPROXY_SOCKET")
#modparam("mediaproxy","sip_asymmetrics","MEDIAPROXY_SIP_ASYMMETRICS")
#modparam("mediaproxy","rtp_asymmetrics","MEDIAPROXY_RTP_ASYMMETRICS")
# -- lcr params --
modparam("lcr","gw_table","gw")
modparam("lcr","gw_name_column","gw_name")
modparam("lcr","ip_addr_column","ip_addr")
modparam("lcr","port_column","port")
modparam("lcr","uri_scheme_column","uri_scheme")
modparam("lcr","transport_column","transport")
modparam("lcr","grp_id_column","grp_id")
modparam("lcr","db_mode",0)
# -- group params --
modparam("group", "table", "grp")
modparam("group", "use_domain", 0) # might be usefull for future
expansions
modparam("group", "user_column", "username")
modparam("group", "domain_column", "domain")
modparam("group", "group_column", "grp")
# -- usrloc params --
modparam("usrloc", "db_mode", 1)
modparam("usrloc", "desc_time_order", 1)
# -- registrar params --
modparam("registrar", "sip_natping_flag", 3)
modparam("registrar", "nat_flag", 5)
modparam("registrar", "desc_time_order", 1)
# -- rr params --
modparam("rr", "enable_full_lr", 1)
# -- tm params --
#modparam("tm", "fr_timer", 20 )
modparam("tm", "fr_inv_timer", 90 )
#modparam("tm", "wt_timer", 20 )
modparam("tm", "via1_matching", 1)
modparam("tm", "fr_inv_timer_avp", "s:inv_timeout")
# -- permission params --
modparam("permissions", "db_mode", 0)
modparam("permissions", "trusted_table", "trusted")
# -- acc params --
modparam("acc", "db_flag", 1 )
modparam("acc", "db_missed_flag", 2)
modparam("acc", "report_cancels", 1)
modparam("acc", "log_flag", 1)
# -- alias_db params --
modparam("alias_db", "user_column", "username")
modparam("alias_db", "domain_column", "domain")
modparam("alias_db", "alias_user_column", "alias_username")
modparam("alias_db", "alias_domain_column", "alias_domain")
#--enum params --
#modparam("enum", "domain_suffix", "e164.arpa.")
# -- domain params --
modparam("domain", "domain_table", "domain")
modparam("domain", "domain_col", "domain")
# -- avpops params --
# avpops is used to store the local prefix from each customer in subscriber table
# and append it as soon as a local call is done (meaning a call matching [^0][0-9]*)
modparam("avpops","db_scheme","prefix-scheme:username_col=username;domain_col=domain;value_col=prefix;value_type=string;table=subscriber")
modparam("avpops","avp_table","subscriber")
modparam("avpops","use_domain",0)
modparam("avpops","username_column","username")
modparam("avpops","domain_column","domain")
modparam("avpops","avp_aliases","prefix=s:800")
# ------------------------- request routing logic -------------------
# main routing logic
route {
# -----------------------------------------------------------------
# Configuration flags
# -----------------------------------------------------------------
NAT_SUPPORT_FLAG_6
TRUNK_ENABLED_FLAG_7
DEBUG_FLAG_13
# changing return code 182 to 180 so that the calling phone will ring
# does not work at all
#if (status=="182") {
# xlog("Changing Status Code from 182 to 180");
# subst('/182 Queued/180 Ringing/ig');
#}
#xlog("Replacing Status 1820 with 180");
#replace_all("182 Queued","180 Ringing");
if (isflagset(13) && !is_method("ACK") &&
!is_method("REGISTER")) {
#debug route
route(13);
};
# -----------------------------------------------------------------
# Sanity Check Section
# -----------------------------------------------------------------
if (!mf_process_maxfwd_header("10")) {
if (method!="ACK") {
sl_send_reply("483", "Too Many Hops");
};
return;
};
if (msg:len > max_len) {
if (method!="ACK") {
sl_send_reply("513", "Message Overflow");
};
return;
};
if (status=="482") {
#loop detection
xlog("L_ERR", "OPENSER_NAME: $mi $rm $fu -> $ru status 482 Loop
Detected\n");
return;
};
# -----------------------------------------------------------------
# Record Route Section
# -----------------------------------------------------------------
if (method=="INVITE") {
record_route();
if (client_nat_test("3") && isflagset(6)) {
add_rr_param(";nat=yes");
};
};
# -----------------------------------------------------------------
# Loose Route Section
# -----------------------------------------------------------------
if (loose_route()) {
if (isflagset(6)) {
if (has_totag() && (method=="INVITE" ||
method=="ACK" || method=="BYE")) {
setflag(1); # not really clear which of the setflags triggered the "BYE" and
"CANCEL" to be accounted
setflag(2);
if
(client_nat_test("3")||search("^Route:.*;nat=yes")){
xlog("L_NOTICE","Loose Route: Using MediaProxy");
use_media_proxy();
};
};
};
route(6);
return;
};
# -----------------------------------------------------------------
# Call Tear Down Section
# -----------------------------------------------------------------
if (isflagset(6)) {
if (method=="BYE" || method=="CANCEL") {
setflag(1);
setflag(2);
end_media_session();
};
};
# -----------------------------------------------------------------
# Unauthorized relay
# -----------------------------------------------------------------
if (!is_uri_host_local()) {
xlog("L_NOTICE","Prevent unauthorized Access is_uri_host_local=false,
URI: $u, From: $fu -> Request: $ru\n");
if (is_from_local() || allow_trusted()) { # We prevent unautherised relays
xlog("is_from_local or allow_trusted is true\n");
append_hf("P-hint: outbound\r\n");
route(10); # need auth
} else {
xlog("L_NOTICE","Uauthorized Relay: Reply a Forbidden\n");
sl_send_reply("403", "Forbidden");
};
return;
};
# -----------------------------------------------------------------
# Call Type Processing Section
# -----------------------------------------------------------------
if (uri=~"sip:daemon@" ) {
sl_send_reply("410", "daemon has gone for a beer");
return;
};
# Calls matching means it is a local call without prefix
# So prefix needs to be added expect for special numbers
if (uri=~"sip:[1-9][0-9]*@" ) {
# Check if uri contains special numbers ( 110,112 and some other 11[0-9]+ numbers )
# that should not be changed
if (!uri=~"sip:11.*") {
# add prefix to number
# load user prefix and store it in $avp(s:800)
# the prefix is stored in the subscriber table in an supplement attribute prefix
if(!avp_db_load("$fu","$avp(s:800)/$prefix-scheme")) {
xlog("Failed to load User Prefix");
} else {;
# prefix R-URI
xlog("Adding Prefix: $avp(s:800) to $ru");
subst_uri('/^sip:([0-9]+)@(.*)$/sip:$avp(s:800)\1@\2;orig_uri=\1-\2/i');
xlog("R-URI: $ru");
}
}
}
if (method=="INVITE") {
route(3);
return;
} else if (method=="ACK") {
route(1);
return;
} else if (method=="BYE" || method=="CANCEL") {
setflag(1);
setflag(2);
route(1);
return;
} else if (method=="REGISTER") {
route(2);
return;
};
lookup("aliases");
#alias_db_lookup("dbaliases");
if (uri!=myself) {
xlog("L_NOTICE", "Lookup Aliases failed");
route(10);
return;
};
if (!lookup("location")) {
xlog("L_NOTICE", "Lookup Location failed");
route(8);
return;
};
route(1); # Do not proxy authenticate - needed by system to send messages
return;
}
route[1] {
# -----------------------------------------------------------------
# Default Route relay Handler with NAT ENABLED
# -----------------------------------------------------------------
if (isflagset(6)) {
if (client_nat_test("3")) {
setflag(4);
force_rport();
fix_contact();
};
if (isflagset(4) || isflagset(5)) {
xlog("L_NOTICE","Route(1) using Mediaproxy");
use_media_proxy();
};
t_on_reply("1");
};
route(6); # Relay the call
return;
}
route[2] {
# -----------------------------------------------------------------
# REGISTER Message Handler
# -----------------------------------------------------------------
# This cool register script came from
http://openser.org/docs/scripting.html
sl_send_reply("100", "Trying");
if (!route(7)) { # verify the user
return(0);
};
if (!search("^Contact:[ ]*\*") && client_nat_test("7")
&& isflagset(6)) {
setflag(3);
setflag(5);
force_rport();
fix_contact();
};
if (!is_user_in("From", "noauth")) { #no authentication required
if (!www_authorize("", "subscriber")) {
if (isflagset(13)) {
xlog("L_NOTICE", "OPENSER_NAME: $mi route[$rm][2] \
$fu Authorization for $fu ($si) requested\n");
};
www_challenge("", "0");
return(0);
} else {
if (isflagset(13)){
xlog("L_NOTICE","OPENSER_NAME: $mi route[$rm][2] \
$fu Authorization OK\n");
};
};
# Prohibit attempts to grab someone else's To address using valid credentials
if (!check_to()) {
if (isflagset(13)){
xlog("L_NOTICE", "OPENSER_NAME: $mi route[$rm][2] \
$fu -> $ru REPLY 401 - Unauthorized check_to() failed\n");
};
sl_send_reply("401", "Unauthorized - account and username must
match");
return(0);
};
consume_credentials();
};
if (!save("location")) {
if (isflagset(13)) {
xlog("L_NOTICE", "OPENSER_NAME: $mi route[$rm][2] \
$fu save(location) Failed\n");
};
sl_reply_error();
return(0);
}else {
if (isflagset(13)) {
xlog("L_NOTICE", "OPENSER_NAME: $mi route[$rm][2] \
$fu save(location)OK\n");
};
};
return;
}
route[3] {
# -----------------------------------------------------------------
# INVITE Message Handler
# -----------------------------------------------------------------
setflag(1); #turn on accounting
setflag(2); #also missed calls
lookup("aliases"); #in the event that an alias resolves to another domain.
#alias_db_lookup("dbaliases");
if (uri!=myself) {
xlog("L_NOTICE","No Local Call Check Auth I: r-uri: <$ru>
from-uri:<$fu>\n");
route(10); #check authentication
return;
};
if (!lookup("location")) {
xlog("L_NOTICE","Lookup Location Failed: r-uri: <$ru>
from-uri:<$fu>\n");
if (src_ip==OPENSER_PBX_IP || !isflagset(7)) { # loopback prevention
route(8);
return;
} else { # if it's not here, go hassle asterisk.
xlog("L_NOTICE","Trunk Routing: r-uri: <$ru>
from-uri:<$fu>\n");
route(4);
return;
};
};
t_on_failure("1"); #call waiting,busy,DND,voicemail
route(1); # local normal routing
return;
}
route[4] {
# -----------------------------------------------------------------
# PSTN Handler
# -----------------------------------------------------------------
avp_write("$avp(i:120)", "$avp(s:inv_timeout)");
xlog("L_NOTICE","Loading Gateways form Database");
if (!load_gws()){
xlog("L_ERR","****************************** LoadGateways Failed
**********************");
sl_send_reply("500", "Internal server error, unable to load phone
gateways");
return;
};
if (!next_gw()) {
xlog("L_NOTICE","******************** Didn'T found Any Gateways
*************************");
sl_send_reply("503", "Service not available - No gateways");
return;
};
# check if we route through BT
# if so, change From Header domain to IP ( @callway-voip.de -> @212.65.6.4 )
# BT Gateway is in GatewayGroup 1
if (to_gw("2")) {
xlog("L_NOTICE","Relaying to External Gateway, so rewriting
From-HEADER:$fu\n");
#subst('/182 Queued/180 Ringing/ig');
#replace_all("182 Queued","180 Ringing");
subst('/From:([^@]*)@callway-voip.de/From:\1@212.65.6.4/ig');
};
#if (isflagset(13)){
xlog("L_NOTICE", "OPENSER_NAME: $mi route[$rm][4] \
time [$Tf] Next Gateway $ruri_user_avp method <$rm> r-uri <$ru> 2nd via
<$hdr(via[1])>\n");
#};
route(1);
return;
}
route[5] {
# -----------------------------------------------------------------
# TLS Handling
# -----------------------------------------------------------------
# if (!is_uri_host_local()) { # if you have some interdomain
connections via TLS
# if(uri=~"(a)tls_domain1.net") {
# t_relay_to_tls("IP_domain1","port_domain1");
# exit;
# } else if(uri=~"(a)tls_domain2.net") {
# t_relay_to_tls("IP_domain2","port_domain2");
# exit;
# };
# };
if (!is_uri_host_local()) {
remove_hf("Alert-Info");
if (method=="INVITE" && proto==tls) {
append_hf("Alert-info: 1\r\n"); #cisco 7960
append_hf("Alert-info: Bellcore-dr4\r\n"); #cisco ATA
# append_hf("Alert-info:
http://foo.bar/x.wav\r\n")uot;); #snom
};
};
return;
}
route[6] {
# -----------------------------------------------------------------
# Route relay Handler
# -----------------------------------------------------------------
#subst('/182 Queued/180 Ringing/ig');
#replace_all("182 Queued","180 Ringing");
if (!t_relay()) {
if (isflagset(6)) {
if (method=="INVITE" || method=="ACK") {
end_media_session();
};
};
xlog("L_NOTICE","Route6: T_relay failed");
sl_reply_error();
};
return;
}
route[7] {
# -----------------------------------------------------------------
# User verify
# -----------------------------------------------------------------
# Check for known domain(s)
if (!is_from_local()) {
if (isflagset(13)){
xlog("L_NOTICE", "OPENSER_NAME: $mi route[$rm][2] \
$fu Unknown domain\n");
sl_send_reply("403", "Unknown domain");
};
return(0);
};
# Check to see that the user has not been disabled
if (is_user_in("From", "disabled")) {
if (isflagset(13)){
xlog("L_NOTICE", "OPENSER_NAME: $mi route[$rm][2] \
$fu Your account has been disabled\n");
};
sl_send_reply("403", "Your account has been disabled");
return(0);
};
if (is_user_in("To", "disabled")) {
if (isflagset(13)) {
xlog("L_NOTICE", "OPENSER_NAME: $mi route[$rm][2] \
$tu That account has been disabled\n");
};
sl_send_reply("403", "That account has been disabled");
return(0);
};
return(1);
}
route[8] {
# -----------------------------------------------------------------
# Handling of unavailable user
# -----------------------------------------------------------------
# non-Voip -- just send "off-line"
if (!(method=="INVITE" || method=="ACK" ||
method=="CANCEL")) {
sl_send_reply("404", "Not Found");
return;
};
t_newtran();
t_reply("404", "Not Found");
# we account missed incoming calls; previous statteful processing
# guarantees that retransmissions are not accounted
acc_db_request("404 missed call", "missed_calls");
return;
}
route[10] {
# -----------------------------------------------------------------
# Default Message Handler with Proxy Authentication
# -----------------------------------------------------------------
if(method=="ACK") { #these you never proxy authenticate
route(1);
return;
};
if(method=="BYE" || method=="CANCEL") { #these you never
proxy authenticate
setflag(1);
route(1);
return;
};
xlog("L_INFO", "Proxy auth $fd $dP destination:$du $dd $ds");
if (!route(7)) { #verify the user
return(0);
};
if (!is_user_in("From", "noauth")) { #no authentication required
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","0");
return;
} else if (!check_from()) {
sl_send_reply("403", "Use From=ID");
return;
};
consume_credentials();
};
# if (is_user_in("Credentials", "local")) { # Uncomment to use the
group options
route(1);
# }else{
# sl_send_reply("403", "Denied, you are not allowed this route");
# };
return;
}
onreply_route[1] {
# -----------------------------------------------------------------
# Return Route
# -----------------------------------------------------------------
#replace_all("182 Queued","180 Ringing");
if ((isflagset(4) || isflagset(5)) && isflagset(6) &&
(status=~"(180)|(183)|2[0-9][0-9]")) {
if (!search("^Content-Length:[ ]*0")) {
xlog("L_NOTICE","OnReplyRoute(1) Using Mediaproxy");
use_media_proxy();
};
};
if (client_nat_test("1") && isflagset(6)) {
fix_contact();
};
return;
}
failure_route[1] {
# -----------------------------------------------------------------
# No answer, cancel, busy handling
# -----------------------------------------------------------------
return;
}
route[13] {
# -----------------------------------------------------------------
# Debuging info
# -----------------------------------------------------------------
if (status=="100") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 100 Trying\n");
} else if (status=="180") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 180 Ringing\n");
} else if (status=="181") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 181 Call Is Being
Forwarded\n");
} else if (status=="182") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 182 Queued\n");
} else if (status=="183") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 183 Session Progress\n");
} else if (status=="200") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 200 OK\n");
} else if (status=="202") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 202 Accepted\n");
} else if (status=="300") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 300 Multiple Choices $ct\n");
} else if (status=="301") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 301 Moved Permanently $ct\n");
} else if (status=="302") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 302 Moved Temporarily $ct\n");
} else if (status=="305") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 305 Use Proxy\n");
} else if (status=="380") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 380 Alternative Service\n");
} else if (status=="400") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 400 Bad Request\n");
} else if (status=="401") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 401 Unauthorized\n");
} else if (status=="402") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 402 Payment Required\n");
} else if (status=="403") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 403 Forbidden\n");
} else if (status=="404") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 404 Not Found\n");
} else if (status=="405") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 405 Method Not Allowed\n");
} else if (status=="406") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 406 Not Acceptable\n");
} else if (status=="407") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 407 Proxy Authentication
Required\n");
} else if (status=="408") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 408 Request Timeout\n");
} else if (status=="409") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 409 Conflict\n");
} else if (status=="410") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 410 Gone\n");
} else if (status=="411") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 411 Length Required\n");
} else if (status=="412") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 412 Conditional Request
Failed\n");
} else if (status=="413") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 413 Request Entity Too
Large\n");
} else if (status=="414") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 414 Request-URI Too Long\n");
} else if (status=="415") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 415 Unsupported Media Type\n");
} else if (status=="416") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 416 Unsupported URI Scheme\n");
} else if (status=="420") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 420 Bad Extension\n");
} else if (status=="421") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 421 Extension Required\n");
} else if (status=="422") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 422 Session Interval Too
Small\n");
} else if (status=="423") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 423 Interval Too Brief\n");
} else if (status=="429") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 429 Provide Referrer
Identity\n");
} else if (status=="480") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 480 Temporarily
Unavailable\n");
} else if (status=="481") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 481 Call Leg/Transaction Does Not
Exist\n");
} else if (status=="482") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 482 Loop Detected\n");
} else if (status=="483") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 483 Too Many Hops\n");
} else if (status=="484") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 484 Address Incomplete\n");
} else if (status=="485") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 485 Ambiguous\n");
} else if (status=="486") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 486 Busy Here\n");
} else if (status=="487") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 487 Busy Here; Request
Terminated\n");
} else if (status=="488") {
xlog("L_NOTICE", "OPENSER_NAME: $mi $rm $fu -> $ru status 488 Not
Acceptable Here\n");
} else if (status=="489") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 489 Bad Event\n");
} else if (status=="491") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 491 Request Pending\n");
} else if (status=="493") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 493 Undecipherable\n");
} else if (status=="494") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 494 Security Agreement
Required\n");
} else if (status=="500") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 500 Server Internal Error\n");
} else if (status=="501") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 501 Not Implemented\n");
} else if (status=="502") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 502 Bad Gateway\n");
} else if (status=="503") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 503 Service Unavailable\n");
} else if (status=="504") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 504 Server Timeout\n");
} else if (status=="505") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 505 Version Not Supported\n");
} else if (status=="513") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 513 Message Too Large\n");
} else if (status=="580") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 580 Precondition Failure\n");
} else if (status=="600") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 600 Busy Everywhere\n");
} else if (status=="603") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 603 Decline\n");
} else if (status=="604") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 604 Does Not Exist
Anywhere\n");
} else if (status=="606") {
xlog("L_NOTICE",
"OPENSER_NAME: $mi $rm $fu -> $ru status 606 Not Acceptable\n");
} else {
xlog("L_NOTICE", "OPENSER_NAME: $mi $rm $fu -> $ru status not
listed\n");
};
xlog("L_NOTICE", "OPENSER_NAME: $mi $mb\n");
return;
}