Hi!
Maybe the Lucent GW is a strict router (RFC 2534). Strict routers will put the next hop in the request URI, and the final destination into the last Route: header.
Using loose_route should take care of this.
if (loose_route()) { ... do some authentication stuff ... xlog("...loose_route() processed"); t_relay; break; }
regards, klaus
Jorge Crichigno wrote:
Hi all,
I have a problem with in the following scenario: Lucent GW SER IPPhone
IP: 1.2.3.4 IP:5.6.7.8 IP:8.9.5.5
INVITE--> <-- 100 INVITE--> <--100 <--180 <--180 <--200 <--200 ACK-->(Request-Uri = sip:5.6.7.8:5060) <-- PROBLEM HERE
The problem arises only with the Lucent Gateway, because it sends the ACK with the Request-Uri as showed above (Request-Uri has the IP and port of the SER). I also found the same problem with BYEs. I attach the ser.cfg at this mail.
I think this is a bug of Lucent, because I expected that Request-Uri of the ACKs should equal to the contact uri of the 200 message sent by the ipphone. The same for BYEs. Could some one clarify me that?
Thanks in advance !!!
debug=5 # debug level (cmd line: -dddddddddd) fork=yes log_stderror=yes # (cmd line: -E)
check_via=no # (cmd. line: -v) dns=no # (cmd. line: -r) rev_dns=no # (cmd. line: -R) port=5060 children=20 fifo="/tmp/ser_fifo" listen=5.6.7.8 alias = "mydomain.com"
# --------------------------------------------------------------------------- loadmodule "/usr/local/lib/ser/modules/mysql.so" # needed for domain.so loadmodule "/usr/local/lib/ser/modules/registrar.so" loadmodule "/usr/local/lib/ser/modules/dbtext.so" # necesario para domain.so loadmodule "/usr/local/lib/ser/modules/usrloc.so" loadmodule "/usr/local/lib/ser/modules/domain.so" # necesario para mediaproxy.so (is_from_local) loadmodule "/usr/local/lib/ser/modules/mediaproxy.so"
loadmodule "/usr/local/lib/ser/modules/rr.so" loadmodule "/usr/local/lib/ser/modules/sl.so" # stateless loadmodule "/usr/local/lib/ser/modules/tm.so" # statefull loadmodule "/usr/local/lib/ser/modules/acc.so" loadmodule "/usr/local/lib/ser/modules/maxfwd.so" loadmodule "/usr/local/lib/ser/modules/textops.so" loadmodule "/usr/local/lib/ser/modules/auth.so" # needed for xml_socket loadmodule "/usr/local/lib/ser/modules/xml_socket.so" # our module
# --------------------------------------------------------------------------- modparam("usrloc", "db_mode", 0) modparam("domain", "db_mode", 0) #modparam("domain", "db_url", "mysql://serro:47serro11@216.55.240.66/ser") modparam("domain", "db_url", "mysql://serro:47serro11@localhost/ser") #Default value is "mysql://serro:47serro11@localhost/ser" modparam("mediaproxy", "natping_interval", 60) # unix socket to send commands to proxy dispatcher modparam("mediaproxy", "mediaproxy_socket", "/var/run/proxydispatcher.sock") modparam("registrar","nat_flag",2) modparam("rr", "enable_full_lr", 1) #modparam("rr", "enable_double_rr", 0) modparam("tm", "fr_timer", 50) modparam("tm", "fr_inv_timer", 50) # ---------------------------------------------------------------------------
route{
if (!mf_process_maxfwd_header("10")) { sl_send_reply("483","Too Many Hops"); break; };
if (msg:len >= max_len ) { sl_send_reply("513", "Message too big"); break; };
# NAT control if (client_nat_test("3")) { setflag(2); force_rport(); fix_contact(); };
if (method=="REGISTER") { route(1); break; };
if (method == "INVITE"){ route(2); break; };
if (method == "BYE"){ route(3); break; };
route(4);
}
#-------------------------------------------------------------------------------------- # Aqui se procesan los REGISTERs - REGISTERs here #-------------------------------------------------------------------------------------- route[1]{
if (xml_www_authorize_register("")) { # challenge - response auth www_challenge("", "0"); break;
}; consume_credentials(); sl_send_reply("200", "Ok"); }
#-------------------------------------------------------------------------------------- # Aqui se procesan los INVITEs - INVITEs here #-------------------------------------------------------------------------------------- route[2]{ t_on_reply("1"); sl_send_reply("100"," Trying");
if (t_lookup_request()){ log(1, "route[2]: Transaction already in progress\n"); break; };
if (!xml_www_authorize_invite("")) { # chanllenge - response auth - load msg->new_uri www_challenge("", "0"); break;
}; consume_credentials();
record_route(); # use_media_proxy(); log(1, "routing the invite...\n"); if (!t_relay()){ sl_reply_error(); # end_media_session(); break; };
}
#-------------------------------------------------------------------------------------- # Aqui se procesan los BYEs - BYEs here #-------------------------------------------------------------------------------------- route[3]{ t_on_reply("1"); # p/ q en los reply tb cambiemos contact
if (t_lookup_request()){ sl_send_reply("100", "Trying"); log(1, "route[3]: Transaction already in progress\n"); break; }; #end_media_session(); xml_acc(); # accounting if (!t_relay()) { sl_reply_error(); break; }; } #-------------------------------------------------------------------------------------- # Aqui se procesan los metodos que no son INVITEs ni BYEs, i.e., ACKs & CANCELs #-------------------------------------------------------------------------------------- route[4]{
xml_acc();
if (!t_relay()) {
sl_reply_error(); break;
};
}
# Cuando hay NAT, en la respuesta 200 (OK) del telefono destino se debe cambiar el campo # contact este uri (el del campo contact) sera usado en las siguientes transacciones #-------------------------------------------------------------------------------------- # Aqui se procesan los replies: 1xx, 200, 4xx, etc - #--------------------------------------------------------------------------------------
onreply_route[1] {
xml_acc(); if (status=~"(183)|(2[0-9][0-9])") { if (client_nat_test("1")) { fix_contact(); }; };
}
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers