Hi,
Sorry guyz, the problem is not solved as i thought. The script worked perfectly in my lab where i did'nt know that the wifi router is a so called "sip friendly router". It fixes broken contacts so it worked perfectly in my lab.
But in my production server it did'nt work.
Problem is when i put "contact" in hash table entry like following :
sht(a=>$ci) = $ct;
it puts the broken contact adress( I mean contact address with private IP) into the hashtable.
At first i put my code after the execution of "fix_nated_contact()". But it did'nt work. Then i put a xlog() to print $ct. And to my surprise i saw that its printing the private IP instead of the public one. After searching through mailing list archives i came across this :
http://lists.iptel.org/pipermail/serusers/2006-September/030511.html
According to this although the contact is fixed with received IP and port, its not applied to the message buffer and kept in temporary storage. when the message is about to be sent over sockets this temporary storage is applied over the the original message buffer. pseudo variables like $ct will always reference to the original message, not the modified one after fix_nated_contact().
So to populate my hashtable, i have to choices:
1. I can reference src_ip and src_port , put a ":" between them like following :
sht(a=>$ci) = $fU + src_ip + ":" + src_port (Please help with the correct syntax for string concatenation).
2. Or if possible i reference the changed contact from the temporary storage, and put this into my hashtable.
Please direct me which way should i go.
Cheers.
On Mon, May 28, 2012 at 8:25 PM, Aft nix aftnix@gmail.com wrote:
Hi all, I'm posting the script which worked. In future if anybody faces the same problem can get a solution out of this.
In request_route:
#!ifdef WITH_HASH if (is_method("INVITE") && !has_totag()){ xdbg ("Contact [$ct] with Callid [$ci]"); $sht(a=>$ci) = $ct; } #!endif
in route[WITHINDLG]
#!ifdef WITH_HASH xdbg ("ruri [$ru]"); if ($(sht(a=>$ci){nameaddr.uri}) != $ru){ xdbg ("hash table entry [$sht(a=>$ci)]"); $ru = $(sht(a=>$ci){nameaddr.uri}); sht_rm_name_re("ha=>$ci"); xdbg ("rewriting ruri to [$ru]"); } #!endif
Thanks everyone for the help. I'm marking this thread as solved.
-aft
-- -aft