Thank you for that Greger. I have altered my script so that it exactly mimics the one in the onsip document besides the has_totag and fix_nated register. All is good when I ring from a private phone to a public phone i.e. the audio is very clear and the following messages are in /var/log.
ERROR: extract_body: message body has length zero ERROR: force_rtp_proxy2: cant extract body from the message.
I assume this is because of the 200 OK to a register message where theres no sdp?? Is this correct?
However when I try to phone from public into private I get:
ERROR: send_rtpp_command: cant read reply from a RTP Proxy.
I find this confusing because I know the rtpproxy is working.
BR Vivienne.
"Greger V. Teigre" greger@teigre.com wrote: Yes, you can use fix_nated_contact instead. It is not entirely RFC-compliant, but that's what you have in 0.8.14. The has_totag() only tests to see if the INVITE has a To header, which means that it is in-dialog and thus is a re-INVITE. An INVITE will normally not have loose routing unless you have another SIP proxy forwarding an INVITE to you (in which case you should assume that the other proxy handles NAT and thus not trigger NAT-related code). You can safely remove the has_totag() if you use force_rtp_proxy("l") g-)
---- Original Message ---- From: Vivienne Curran To: Greger V. Teigre ; serusers@lists.iptel.org Sent: Tuesday, April 05, 2005 02:25 PM Subject: Re: [Serusers] Contact Header and SDP not rewritten
Greger,
Since fix_nated_register does not exist with 0.8.14, will fix_nated_contact do instead? Also if I am leaving out the has_totag() at the start of the script, will this greatly effect its functionality?
Thank you, Vivienne
"Greger V. Teigre" greger@teigre.com wrote: Vivienne,
This is the first INVITE going from SER to your public phone. I have prefixed my comments with *==>
U 84.203.148.146:5060 -> 157.190.74.151:5060 INVITE sip:2092@157.190.74.151 SIP/2.0..Via: SIP/2.0/UDP 84.203.148.146;branch=z9hG4bK77bc.b54ca216.0.. Via: SIP/2.0/UDP 172.16.3.31;rport=5060;received=84.203.148.14;branch=z9hG4bK1a48edc121f5bc1f.. From: "2093" sip:2093@84.203.148.146;tag=2dc376dcd4655094.. To: sip:2092@84.203.148.146.. Contact: sip:2093@84.203.148.14:5060.. *==> Correctly changed to the public address and port of 2093 Supported: replaces..Call-ID: 44e1ae63c476fbff@172.16.3.31..CSeq: 10327 INVITE.. User-Agent: Grandstream BT100 1.0.5.18.. Max-Forwards: 69..Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SUBSCRIBE.. Content-Type: application/sdp.. Content-Length: 443....v=0.. o=2093 8000 0 IN IP4 172.16.3.31.. s=SIP Call.. c=IN IP4 84.203.148.1484.203.148.146.. *==> Here it seems that first fix_nated_sdp("3") is called (replace private IP with public IP), then force_rtp_proxy() (replace with proxy IP). You must only call one of them (fix_nated_sdp("1") is ok) t=0 0.. m=audio 35006 RTP/AVP 0 8 4 18 2 15 99 9.. a=sendrecv.. a=rtpmap:0 PCMU/8000/3.. a=rtpmap:8 PCMA/8000/3.. a=rtpmap:4 G723/8000/3..a=rtpmap:18 G729/8000/3.. a=rtpmap:2 G726-32/8000/3.. a=rtpmap:15 G728/8000/3.. a=rtpmap:99 iLBC/8000/3.. a=fmtp:99 mode=20.. a=rtpmap:9 G722/8000/3.. a=ptime:20.. a=direction:active.. *==> Added by fix_nated_sdp("1") (and "3") a=oldmediaip:172.16.3.31.. *==> Added by fix_nated_sdp("3") a=nortpproxy:yes.. *==> Added by force_rtp_proxy()
So, your call is proxied. Try using fix_nated_sdp("1"). It should make the INVITE correct. You have not posted the OK, so I don't know what is happening there. If you have followed the rtpproxy ONsip.org example in your onreply_route, you should be fine.
Good luck! g-)
---- Original Message ---- From: Vivienne Curran To: serusers@lists.iptel.org Sent: Tuesday, April 05, 2005 01:23 PM Subject: [Serusers] Contact Header and SDP not rewritten
Hello,
I have a problem whereby when a private client rings a public client only the public user can hear voice and when the public user rings the private user, no audio is transmitted. After looking at the messages I have have determined that the contact header and sdp part of the invite contains the private address of the natted client. This would lead me to believe that the registration process is incorrect. My problem is that I believe my script should handle the registration process correctly and I suspect that the following code is being skipped: I tried changing it to nat_uac_test("19") and fix_nated_sdp("3") but that didnt help.
if (nat_uac_test("3")){
if (method == "REGISTER" || ! search("^Record-Route:")){ log("Log: Someone trying to register from private IP,rewriting\n"); fix_nated_contact(); #Rewrite contact with source IP if (method == "INVITE"){ fix_nated_sdp("1"); #Add direction=active to SDP force_rtp_proxy(); }; force_rport(); # Add rport parameter to topmost Via setflag(6); # Mark as Nated }; };
I have included the log message below and my ser.cfg as an attachment. Please let me know where I could be going wrong.
Thank you, Vivienne.
2093 (private) ringing 2092 (public)
U 84.203.148.14:5060 -> 84.203.148.146:5060 ! INVITE sip:2092@84.203.148.146 SIP/2.0..Via: SIP/2.0/UDP 172.16.3.31;branch =z9hG4bK1a48edc121f5bc1f..From: "2093" sip:2093@84.203.148.146;tag=2dc376 dcd4655094..To: sip:2092@84.203.148.146..Contact: sip:2093@172.16.3.31. .Supported: replaces..Call-ID: 44e1ae63c476fbff@172.16.3.31..CSeq: 10327 IN VITE..User-Agent: Grandstream BT100 1.0.5.18..Max-Forwards: 70..Allow: INVI
TE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SUBSCRIBE..Content-Type: applic ation/sdp..Content-Length: 362....v=0..o=2093 8000 0 IN IP4 172.16.3.31..s= SIP Call..c=IN IP4 172.16.3.31..t=0 0..m=audio 5004 RTP/AVP 0 8 4 18 2 15 9 9 9..a=sendrecv..a=rtpmap:0 PCMU/8000/3..a=rtpmap:8 PCMA/8000/3..a=rtpmap:4 G723/8000/3..a=rt! pmap:18 G729/8000/3..a=rtpmap:2 G726-32/8000/3..a=rtpmap: 15 G728/8000/3..a=rtpmap:99 iLBC/8000/3..a=fmtp:99 mode=20..a=rtpmap:9 G722 /8000/3..a=ptime:20..
U 84.203.148.146:5060 -> 84.203.148.14:5060 SIP/2.0 100 trying -- your call is important to us..Via: SIP/2.0/UDP 172.16
.3.31;branch=z9hG4bK1a48edc121f5bc1f;rport=5060;received=84.203.148.14..Fro m: "2093" sip:2093@84.203.148.146;tag=2dc376dcd4655094..To: <sip:2092@84. 203.148.146>..Call-ID: 44e1ae63c476fbff@172.16.3.31..CSeq: 10327 INVITE..Se rver: Sip EXpress router (0.8.14 (i386/linux))..Content-Length: 0..Warning: 392 84.203.148.146:5060 "Noisy feedback tells: pid=4732 req_src_ip=84.203 .148.14 req_src_port=5060 in_uri=sip:2092@84.203.148.146 out_uri=sip:2092@1 57.190.74.151 via_cnt==1"....
U 84.203.148.146:5060 -> 157.190.74.151:5060 INVITE sip:2092@157.190.74.151 SIP/2.0..Via: SIP/2.0/UDP 84.203.148.146;bra nch=z9hG4bK77bc.b54ca216.0..Via: SIP/2.0/UDP 172.16.3.31;rport=5060;receive d=84.203.148.14;branch=z9hG4bK1a48edc121f5bc1f..From: "2093" <sip:2093@84.2 03.148.146>;tag=2dc376dcd4655094..To: sip:2092@84.203.148.146..Contact: < sip:2093@84.203.148.14:5060>..Supported: replaces..Call-ID: 44e1ae63c476fbf f@172.16.3.31..CSeq: 10327 INVITE..User-Agent: Grandstream BT100 1.0.5.18.. Max-Forwards: 69..Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SU BSCRIBE..Content-Type: application/sdp..Content-Length: 443....v=0..o=2093 8000 0 IN IP4 172.16.3.31..s=SIP Call..c=IN IP4 84.203.148.1484.203.148.146 ..t=0 0..m=audio 35006 RTP/AVP 0 8 4 18 2 15 99 9..a=sendrecv..a=rtpmap:0 P CMU/8000/3..a=rtpmap:8 PCMA/8000/3..a=rtpmap:4 G723/8000/3..a=rtpmap:18 G72 9/8000/3..a=rtpmap:2 G726-32/8000/3..a=rtpmap:15 G728/8000/3..a=rtpmap:99 i LBC/8000/3..a=fmtp:99 mode=20..a=rtpmap:9 G722/8000/3..a=ptime:20..a=direct ion:active..a=oldmediaip:172.16.3.31..a=nortpproxy:yes..
U 84.203.148.146:5060 -> 157.190.74.150:5060 INVITE sip:2092@157.190.74.150 SIP/2.0..Via: SIP/2.0/UDP 84.203.148.146;bra nch=z9hG4bK77bc.b54ca216.1..Via: SIP/2.0/UDP 172.16.3.31;rport=5060;receive d=84.203.148.14;branch=z9hG4bK1a48edc121f5bc1f..From: "2093" <sip:2093@84.2 03.148.146>;tag=2dc376dcd4655094..To: sip:2092@84.203.148.146..Contact: < sip:2093@84.203.148.14:5060>..Supported: replaces..Call-ID: 44e1ae63c476fbf f@172.16.3.31..CSeq: 10327 INVITE..User-Agent: Grandstream BT100 1.0.5.18.. Max-Forwards: 69..Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SU BSCRIBE..Content-Type: application/sdp..Content-Length: 443....v=0..o=2093 8000 0 IN IP4 172.16.3.31..s=SIP Call..c=IN IP4 84.203.148.1484.203.148.146 ..t=0 0..m=audio 35006 RTP/AVP 0 8 4 18 2 15 99 9..a=sendrecv..a=rtpmap:0 P CMU/8000/3..a=rtpmap:8 PCMA/8000/3..a=rtpmap:4 G723/8000/3..a=rtpmap:18 G72 9/8000/3..a=rtpmap:2 G726-32/8000/3..a=rtpmap:15 G728/8000/3..a=rtpmap:99 i LBC/8000/3..a=fmtp:99 mode=20..a=rtpmap:9 G722/8000/3..a=ptime:20..a=direct ion:active..a=oldmediaip:172.16.3.31..a=nortpproxy:yes..
U 157.190.74.151:5060 -> 84.203.148.146:5060 SIP/2.0 100 Trying..Via: SIP/2.0/UDP 84.203.148.146;branch=z9hG4bK77bc.b54c a216.0..Via: SIP/2.0/UDP 172.16.3.31;rport=5060;received=84.203.148.14;bran ch=z9hG4bK1a48edc121f5bc1f..From: "2093" sip:2093@84.203.148.146;tag=2dc3 76dcd4655094..To: sip:2092@84.203.148.146..Call-ID: 44e1ae63c476fbff@172. 16.3.31..CSeq: 10327 INVITE..User-Agent: Grandstream BT100 1.0.5.18..Conten t-Length: 0....
U 157.190.74.151:5060 -> 84.203.148.146:5060 SIP/2.0 180 Ringing! ..Via: SIP/2.0/UDP 84.203.148.146;branch=z9hG4bK77bc.b54 ca216.0..Via: SIP/2.0/UDP 172.16.3.31;rport=5060;received=84.203.148.14;bra nch=z9hG4bK1a48edc121f5bc1f..From: "2093" sip:2093@84.203.148.146;tag=2dc 376dcd4655094..To: sip:2092@84.203.148.146;tag=10bdf2044401a257..Call-ID: 44e1ae63c476fbff@172.16.3.31..CSeq: 10327 INVITE..User-Agent: Grandstream BT100 1.0.5.18..Content-Length: 0....
Send instant messages to your online friends http://uk.messenger.yahoo.com
# # $Id: ser.cfg,v 1.21.4.1 2003/11/10 15:35:15 andrei Exp $ # # simple quick-start config script #
# ----------- global configuration parameters
#debug=3 # deb! ug level (cmd line: -dddddddddd) #fork=yes #log_stderror=no # (cmd line: -E)
/* Uncomment these lines to enter debugging mode debug=7 fork=no log_stderror=yes */
check_via=no # (cmd. line: -v) dns=no # (cmd. line: -r) rev_dns=no # (cmd. line: -R) #port=5060 #children=4 fifo="/tmp/ser_fifo"
alias="157.190.74.152:5060"
# ------------------ module loading
# Uncomment this if you want to use SQL database loadmodule "/usr/lib/ser/modules/mysql.so"
loadmodule "/usr/lib/ser/modules/sl.so" loadmodule "/usr/lib/ser/modules/tm.so" loadmodule "/usr/lib/ser/modules/rr.so" loadmodule "/usr/lib/ser/modules/maxfwd.so" loadmodule "/usr/lib/ser/modules/usrloc.so" loadmodule "/usr/lib/ser/modules/registrar.so" loadmodule "/usr/lib/ser/modules/textops.so" loadmodule "/usr/lib/ser/modules/nathelper.so" #loadmodule "/usr/lib/ser/modules/pa.so" loadmodule "/usr/lib/ser/modules/cpl-c.so"
# Uncomment this if you want digest authentication # mysql.so must be loaded ! loadmodule "/usr/lib/ser/modules/auth.so" loadmodule "/usr/lib/ser/modules/auth_db.so"
# ----------------- setting module-specific parameters
# -- usrloc params --
#modparam("usrloc", "db_mode", 0)
# Uncomment this if you want to use SQL database # for persistent storage and comment the previous line modparam("usrloc", "db_mode", 2)
# -- auth params -- # Uncomment if you are using auth module # modparam("auth_db", "calculate_ha1", yes) # # If you set "calculate_ha1" parameter to yes (which true in this config), # uncomment also the following parameter) # modparam("auth_db", "password_column", "password")
# -- rr params -- # add value to ;lr param to make some broken UAs happy #NB Had to up this value from 1 to 11 because reinvites were bombarding called phone modparam("rr", "enable_full_lr", 11)
#!! Nathelper modparam("registrar", "nat_flag", 60) modparam("nathelper", "natping_interval", 30) #Ping interval 30 s modparam("nathelper", "ping_nated_only", 1) #Ping only clients behind NAT modparam("nathelper", "rtpproxy_sock", "/var/run/rtpproxy.sock")
modparam("tm", "fr_inv_timer", 20)
#modparam("pa", "default_expires", 3600)
modparam("usrloc", "db_url", "sql://root:1alfa156@localhost/ser")
#modparam("cpl-c", "cpl_db", "mysql://root:1alfa156@localhost/ser") #modparam("cpl-c", "cpl_table", "cpl") #modparam("cpl-c", "cpl_dtd_file", "/work/sip_router/modules/cpl-ccpl-06.dtd")
# ------------------------- request routing logic
# main routing logic
route{
# initial sanity checks -- messages with # max_forwards==0, or excessively long requests 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; };
####################################################################################### if (nat_uac_test("3")){ if (method == "REGISTER" || ! search("^Record-Route:")){ log("Log: So! meone trying to register from private IP,rewriting\n"); fix_nated_contact(); #Rewrite contact with source IP if (method == "INVITE"){ fix_nated_sdp("1"); #Add direction=active to SDP force_rtp_proxy(); }; force_rport(); # Add rport parameter to topmost Via setflag(6); # Mark as Nated }; }; ########################################################################################
# we record-route all messages -- to make sure that # subsequent messages will go through our proxy; that's # particularly good if upstream and downstream entities # use different transport protocol
if (method =="REGISTER") record_route();
# loose-route processing if (loose_route()) { #commented 11/02/05 #t_relay(); route(1); break; };
# if the request is for other domain use UsrLoc ! # (in case, it does not work, use the following command # with proper names and addresses in it) if (uri==myself) {
log(1,"into loop"); if (method=="REGISTER") {
# Uncomment this if you want to use digest authentication # if (!www_authorize("157.190.74.152", "subscriber")) { # www_challenge("157.190.74.152", "0"); # break; # };
#cpl_process_register();
save("location"); break; };
# if (method=="SUBSCRIBE") # { # log(1, "Subscribe\n"); # if(t_newtran()) # { # log(1, "Registrar\n"); # handle_subscription("registrar"); # }; # break; # };
lookup("aliases"); if (!uri==myself) { append_hf("P-hint: outbound alias\r\n"); route(1); break; };
if (method=="INVITE"){
log(1,"in ! invite loop"); #break; #no 100 trying #if (!cpl_run_script("incoming","is_stateless")) #{ # #script execution failed # t_reply("500", "CPL script execution failed"); #};
t_on_failure("1"); };
# native SIP destinations are handled using our USRLOC DB if (!lookup("location")) { #sl_send_reply("404", "Not Found"); route(2); break; }; };
# forward to current uri now; use stateful forwarding; that # works reliably even if we forward from TCP to UDP #commented 11/02/05####################### if (!t_relay()) { sl_reply_error(); };
#route(1); }
######################################entered 11/02/05############################################################ route[1] { #!!Nathelper if(uri=~"[@:](192.168.|10.|172.(1[6-9]|2[0-9]|3[0-1]).)" && !search("^Route:")){ sl_send_reply("479", "We don't forward to private IP addresses"); break; };
if (isflagset(6)){ force_rtp_proxy(); }
t_on_reply("1");
if(!t_relay()){ sl_reply_error(); break; };
}
######################################entered 11/02/05############################################################ #!! Nathelper onreply_route[1] { if(isflagset(6) && status =~ "(183)|2[0-9][0-9]"){ fix_nated_contact(); force_rtp_proxy(); }else if (nat_uac_test("1")){ fix_nated_contact(); }; } #################################################################################################################
# ------------- handling of unavai! lable user ------------------ route[2] {
# non-Voip -- just send "off-line" if (!(method == "INVITE" || method == "ACK" || method ==
"CANCEL")) { sl_send_reply("404", "Not Found"); break; };
# forward to voicemail now rewritehostport("157.190.74.152:5062"); t_relay_to_udp("157.190.74.152", "5062");
}
# if forwarding downstream did not succeed, try voicemail running # at 172.16.2.120:5062
failure_route[1] { revert_uri(); rewritehostport("157.190.74.152:5062"); append_branch(); t_relay_to_udp("157.190.74.152", "5062"); }
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
Send instant messages to your online friends http://uk.messenger.yahoo.com
Send instant messages to your online friends http://uk.messenger.yahoo.com