[Serusers] help: fix_nated_contact_f

Ahmed Kellal ahmedkellal at hotmail.com
Tue Aug 23 13:06:04 CEST 2005


I am trying to add a function to SER, in order to only alter the host part 
of the Contact URI.
To do that, I'm trying to draw inspiration from the existing 
fix_nated_contact_f function written in nathelper.c
Problem is there are various points I just don't seem to understand.
If anyone can help me answer these questions, I would sure appreciate it!!

1- the parameters declared for the fix_nated_contact_f function are (struct 
sip_msg* msg, char* str1, char* str2)
But the code itself only exploits the first parameter, if I am not mistaken. 
If that is the case, what are the others here for?

2- the lines:
    if (uri.port.len==0)
        uri.port.s = uri.host.s + uri.host.len;

What I understand from this is the following: If there isn't a port 
specified in the original message (the port pointer is not pointing to 
anything), set the pointer's value (the pointer in the port part of the URI 
structure) to point to the memory location right after where the host part 
in the URI ends.
Is that correct? And, if so, is that done in order to prepare for an 
eventual insertion of a port when going through the NAT?

3- the line:
    offset = c->uri.s - msg->buf;

I won't even venture a guess here. A total mystery to me.

4- the line:
    len = c->uri.len + strlen(cp) + 6 /* :port */ - (uri.port.s + 
uri.port.len - uri.host.s) + 1;

What I gather here is that we're computing the relative difference in size 
(length) between the already existing ip:port field in the message, and the 
one we're about to replace it with (source address of the packet), is that 

5- the part:
    temp[0] = uri.host.s[0];
    temp[1] = c->uri.s[c->uri.len];

Euh!! Is he taking just the first and last characters from the URI host 
string, putting them in a "safe place" (to be later restored) and putting 
'\0' characters instead to "delimit" something or other? Or am I totally off 

6- the line:
    len1 = snprintf(buf, len, "%s%s:%d%s", c->uri.s, cp, 
msg->rcv.src_port,uri.port.s + uri.port.len);

Here, len1 will hold the size of the memory size (buffer) needed to insert 
the new data, right?

7- the condition:
    if (len1 < len)
    len = len1;

You'll have to enlighten me on that one, cause I don't see it...

I'm sorry to bother you with such a long mail, but I need the help!
And if someone has a better approach to my original problem(cf. first line 
of the mail) please do not hesitate :-)

Thank you in advance

Express yourself instantly with MSN Messenger! Download today it's FREE! 

More information about the sr-users mailing list