Hello,
We have configured SER 0.9.4 and SEMS last cvs version in order to implement a conference funcionallity. Everything is working fine when the clients are using public IPs. When a client starts a conference, he listens a message that in on a wav file. When a client is behind NAT, when he tries to start a conference, he doen's listen to any message and in the soft phone (X-Lite) it appears a message saying "connected". We have captured the traffic with tcpdump, on the machine that ser and sems is running, and we've noticed that the RTP packets that the client behind NAT send are well received, however, there is only one RTP packet sent by the SER to the Client, and the Client does not get that message, maybe because he is behind NAT. Any ideia?
In the ser.cfg file, to the conference funcionallity we have : _________________________________________________________ route[1] {
# ----------------------------------------------------------------- # Default Message Handler # -----------------------------------------------------------------
t_on_reply("1");
if (!t_relay()) { if (method=="INVITE" && isflagset(6)) { unforce_rtp_proxy(); }; sl_reply_error(); }; }
route[4] {
# ----------------------------------------------------------------- # NAT Traversal Section # -----------------------------------------------------------------
if (isflagset(6)) { force_rport(); fix_nated_contact(); force_rtp_proxy(); }; }
route[5] {
# select messages to redirect: if ( method=="ACK" || method=="INVITE" || method=="BYE" || method=="CANCEL" ){
# switch to stateful mode: if (!t_newtran()){ sl_send_reply("500","could not create transaction"); break; };
# prevent timeout on the other side: t_reply("100","Trying - just wait a minute !");
# actively absorb ACKs if (method == "ACK") { t_relay(); break; }
if (method=="INVITE"){
if (nat_uac_test("19")) { setflag(6); }
# redirect the call to the 'conference' plug-in # if the URI begin with 100 if (uri=~"sip:100.*@") {
# assumes that Sems configuration parameter 'socket_name=' # has been set to /tmp/am_sock if(!t_write_req("/tmp/am_fifo","conference")) { t_reply("500","error contacting sems"); }; break;
route(4); route(1); };
} else if (method=="BYE" || method=="CANCEL") {
# Sems should already know which plug-in is handling that # call. "bye" is no plug-in name. It is a reserved name which # tells Sems to terminate the call.
if(!t_write_req("/tmp/am_fifo","bye")) { t_reply("500","error contacting sems"); }; }; };
}
_______________________________________________________
Best regards,
Ravic Costa