[Serusers] Rewriting URI in the Contact field
Jiri Kuthan
jiri at iptel.org
Tue Jan 14 12:01:50 CET 2003
There are two design options how to rewrite replies too.
I think the easieast one is to create a reply processing
function in your module and rewrite replies from it.
(Look how for example TM module registers a reply processing
function.)
The other way around would be to hook yourself to transaction
management and do the rewrite from a TM callback.
I like the first method better, because it does not
require stateful processing.
-Jiri
At 10:25 PM 1/12/2003, Maxim Sobolev wrote:
>I've almost done with add_rport() and fix_nated_contact(), it sorta
>works, but I've bumped to a problem, I have no good solution for.
>My setup is as follows:
>
>private public
>[UA1]---[NAT]---[SER]---[UA2]
>
>UA1 is Cisco ATA186
>UA2 is eStara SoftPHONE
>
>Since eStara doesn't support symmetric signalling, my config looks
>like the following:
>
> if (search("User-Agent: Cisco ATA.*") || search("Server: Cisco ATA.*")) {
> add_rport();
> fix_nated_contact();
> };
> rewriteFromRoute();
>
> [REGISTRATION STUFF STRIPPED]
>
> if (method=="INVITE") {
> addRecordRoute();
> };
>
> # forward to current uri now
> if (!t_relay()) {
> sl_reply_error();
> };
>
>Everything works just fine when I'm calling from UA1 to UA2, i.e.
>from behind the NAT to the "outside world", however there are
>some problems when I'm doing it in reverse direction. The problem
>is that OK INVITE that the UA1 sends in reply to UA2's INVITE when
>the user picks up the phone is not passed to my helper functions
>and hence UA2 makes a wrong conclusion about where to send ACK and
>BYE to.
>
>Do you have any ideas on how to overcome this problem?
>
>-Maxim
>
>On Sun, Jan 12, 2003 at 08:23:37PM +0200, Maxim Sobolev wrote:
>> On Sun, Jan 12, 2003 at 06:02:35PM +0100, Jan Janak wrote:
>> > Hello,
>> >
>> > I will review the patch and let you know.
>>
>> Thanks! In the meantime, I've located and fixed several bugs in it,
>> so that please don't hurry up applying it to the repository yet.
>>
>> -Maxim
>>
>> >
>> > regards, Jan.
>> >
>> > On 11-01 06:50, Maxim Sobolev wrote:
>> > > Thank you for the explanation! Attached please find first version
>> > > of `rport' support for SER (we need it in the core engine), the
>> > > module will follow probably tomorrow. Please note that the code
>> > > is quite raw (6:20 am here ;) and I did not perform any seriuos
>> > > tests yet.
>> > >
>> > > The code does the following:
>> > >
>> > > 1. Adds support for `rport' Via field parameter into the message
>> > > parser;
>> > >
>> > > 2. Extends parser to allow valueless parameters as requred by
>> > > the draft RFC. This will probably requre additional code
>> > > review, as there may be places in the code where it is
>> > > assumed that parameter value could not be a NULL pointer;
>> > >
>> > > 3. Fills in blank rport parameter if present before forwarding
>> > > a request or replying to it;
>> > >
>> > > 4. Changes the code, so that if `rport' is present, then this
>> > > port is used for connecting to that UA.
>> > >
>> > > Any comments, corrections or suggestions are highly appreciated!
>> > >
>> > > -Maxim
>> > >
>> > > On Sat, Jan 11, 2003 at 12:04:34AM +0100, Jiri Kuthan wrote:
>> > > > that's correct.
>> > > >
>> > > > >1. Check that _m->somefield is NULL and call parse_headers() with the
>> > > > >appropriate HDR_FOO flag.
>> > > >
>> > > > yes. you can skip the first check, parse_headers will do it;
>> > > > don't forget to handle errors if parse_headers returns -1
>> > > > (most likely mem alloc failure)
>> > > >
>> > > > >2. Check that _m->somefield is non-NULL and return if false.
>> > > >
>> > > > yes, that means, that the header field is not in message.
>> > > >
>> > > > note too that some header fields may occur multiple times; in which case
>> > > > msg->hdr_foo points to the first occurence; if you wish to
>> > > > process all of them, you need to traverse the list
>> > > > msg->headers
>> > > >
>> > > > example from record-routing (XXX are my extra comments):
>> > > >
>> > > > int find_first_route(struct sip_msg* _m)
>> > > > {
>> > > > /* XXX don't look at _m->route ... parse_headers will do it for you */
>> > > > if (parse_headers(_m, HDR_ROUTE, 0) == -1) {
>> > > > /* XXX -1 is some bad error, most likely lack of memory -- leave! */
>> > > > LOG(L_ERR, "find_first_route(): Error while parsing headers\n");
>> > > > return -1;
>> > > > } else {
>> > > >
>> > > > if (_m->route) {
>> > > > return 0;
>> > > > } else { /* XXX not found .... the header field is not there */
>> > > > DBG("find_first_route(): No Route headers found\n");
>> > > > return 1;
>> > > > }
>> > > > }
>> > > > }
>> > > >
>> > > >
>> > > >
>> > > > >3. Modify _m->somefield according to the type of that field.
>> > > > >4. Using del_lump() mark original version of the header for deletion and
>> > > > >using insert_new_lump() indicate where modified version should be placed
>> > > > >before sending a message out.
>> > > >
>> > > > 3 is the same as 4, isn't it. you modify a header field by creating
>> > > > a delete lump refering the old value and an insert lump with the new
>> > > > value. the new value must be created using pkg_malloc. the replace
>> > > > action in textops module is a good example. (The lump lists, sort
>> > > > of "diffs", is processed when later on the message is printed and forwarded.)
>> > > >
>> > > > -Jiri
>> >
>> > > --- modules/sl/sl_funcs.c.orig Mon Oct 21 23:30:15 2002
>> > > +++ modules/sl/sl_funcs.c Sat Jan 11 06:09:54 2003
>> > > @@ -121,7 +121,7 @@
>> > > to.sin_family = AF_INET; */
>> > >
>> > > if (reply_to_via) {
>> > > - if (update_sock_struct_from_via( &(to), msg->via1 )==-1)
>> > > + if (update_sock_struct_from_via( &(to), msg->via1, msg)==-1)
>> > > {
>> > > LOG(L_ERR, "ERROR: sl_send_reply: "
>> > > "cannot lookup reply dst: %s\n",
>> > > --- modules/tm/t_lookup.c.orig Mon Oct 21 22:21:50 2002
>> > > +++ modules/tm/t_lookup.c Sat Jan 11 06:09:54 2003
>> > > @@ -717,7 +717,7 @@
>> > > } else {
>> > > via=msg->via1;
>> > > /*init retrans buffer*/
>> > > - if (update_sock_struct_from_via( &(rb->to),via )==-1) {
>> > > + if (update_sock_struct_from_via( &(rb->to),via,msg )==-1) {
>> > > LOG(L_ERR, "ERROR: init_rb: cannot lookup reply dst: %.*s\n",
>> > > via->host.len, via->host.s );
>> > > ser_error=E_BAD_VIA;
>> > > --- parser/msg_parser.h.orig Wed Oct 23 18:12:20 2002
>> > > +++ parser/msg_parser.h Sat Jan 11 06:15:11 2003
>> > > @@ -118,6 +118,7 @@
>> > > char* unparsed; /* here we stopped parsing*/
>> > >
>> > > struct ip_addr src_ip;
>> > > + unsigned short src_port_no;
>> > > struct ip_addr dst_ip;
>> > >
>> > > char* orig; /* original message copy */
>> > > --- parser/parse_via.c.orig Thu Sep 19 15:23:55 2002
>> > > +++ parser/parse_via.c Sat Jan 11 06:09:54 2003
>> > > @@ -87,8 +87,10 @@
>> > > MADDR1, MADDR2, MADDR3, MADDR4,
>> > > RECEIVED1, RECEIVED2, RECEIVED3, RECEIVED4, RECEIVED5, RECEIVED6,
>> > > RECEIVED7,
>> > > + RPORT1, RPORT2, RPORT3,
>> > > /* fin states (227-...)*/
>> > > FIN_HIDDEN = 230, FIN_TTL, FIN_BRANCH, FIN_MADDR, FIN_RECEIVED,
>> > > + FIN_RPORT,
>> > > /*GEN_PARAM,
>> > > PARAM_ERROR*/ /* declared in msg_parser.h*/
>> > > };
>> > > @@ -125,6 +127,7 @@
>> > > case FIN_TTL:
>> > > case FIN_MADDR:
>> > > case FIN_RECEIVED:
>> > > + case FIN_RPORT:
>> > > *tmp=0;
>> > > param->type=state;
>> > > param->name.len=tmp-param->name.s;
>> > > @@ -160,6 +163,7 @@
>> > > case FIN_TTL:
>> > > case FIN_MADDR:
>> > > case FIN_RECEIVED:
>> > > + case FIN_RPORT:
>> > > *tmp=0;
>> > > param->type=state;
>> > > param->name.len=tmp-param->name.s;
>> > > @@ -200,6 +204,7 @@
>> > > case FIN_TTL:
>> > > case FIN_MADDR:
>> > > case FIN_RECEIVED:
>> > > + case FIN_RPORT:
>> > > *tmp=0;
>> > > param->type=state;
>> > > param->name.len=tmp-param->name.s;
>> > > @@ -231,6 +236,7 @@
>> > > case FIN_TTL:
>> > > case FIN_MADDR:
>> > > case FIN_RECEIVED:
>> > > + case FIN_RPORT:
>> > > *tmp=0;
>> > > param->type=state;
>> > > param->name.len=tmp-param->name.s;
>> > > @@ -267,6 +273,7 @@
>> > > case FIN_MADDR:
>> > > case FIN_TTL:
>> > > case FIN_RECEIVED:
>> > > + case FIN_RPORT:
>> > > LOG(L_ERR, "ERROR: parse_via: invalid char <%c> in"
>> > > " state %d\n", *tmp, state);
>> > > goto error;
>> > > @@ -296,6 +303,7 @@
>> > > case FIN_MADDR:
>> > > case FIN_TTL:
>> > > case FIN_RECEIVED:
>> > > + case FIN_RPORT:
>> > > LOG(L_ERR, "ERROR: parse_via_param: new via found"
>> > > "(',') when '=' expected (state %d=)\n",
>> > > state);
>> > > @@ -458,6 +466,9 @@
>> > > case TTL1:
>> > > state=TTL2;
>> > > break;
>> > > + case RPORT3:
>> > > + state=FIN_RPORT;
>> > > + break;
>> > > case GEN_PARAM:
>> > > break;
>> > > case F_CR:
>> > > @@ -545,6 +556,9 @@
>> > > case BRANCH1:
>> > > state=BRANCH2;
>> > > break;
>> > > + case RPORT2:
>> > > + state=RPORT3;
>> > > + break;
>> > > case GEN_PARAM:
>> > > break;
>> > > case F_CR:
>> > > @@ -619,7 +633,36 @@
>> > > state=GEN_PARAM;
>> > > }
>> > > break;
>> > > -
>> > > + case 'p':
>> > > + case 'P':
>> > > + switch(state){
>> > > + case RECEIVED1:
>> > > + state=RPORT1;
>> > > + break;
>> > > + case F_CR:
>> > > + case F_LF:
>> > > + case F_CRLF:
>> > > + state=END_OF_HEADER;
>> > > + goto end_via;
>> > > + default:
>> > > + state=GEN_PARAM;
>> > > + }
>> > > + break;
>> > > + case 'o':
>> > > + case 'O':
>> > > + switch(state){
>> > > + case RPORT1:
>> > > + state=RPORT2;
>> > > + break;
>> > > + case F_CR:
>> > > + case F_LF:
>> > > + case F_CRLF:
>> > > + state=END_OF_HEADER;
>> > > + goto end_via;
>> > > + default:
>> > > + state=GEN_PARAM;
>> > > + }
>> > > + break;
>> > > default:
>> > > switch(state){
>> > > case F_PARAM:
>> > > @@ -750,6 +793,11 @@
>> > > param->value.len=tmp-param->value.s;
>> > > state=F_PARAM;
>> > > goto endofvalue;
>> > > + case F_VALUE:
>> > > + *tmp=0;
>> > > + param->value.len=0;
>> > > + state=F_PARAM;
>> > > + goto endofvalue;
>> > > case P_STRING:
>> > > break; /* what to do? */
>> > > case F_LF:
>> > > @@ -1681,6 +1729,8 @@
>> > > vb->branch=param;
>> > > else if (param->type==PARAM_RECEIVED)
>> > > vb->received=param;
>> > > + else if (param->type==PARAM_RPORT)
>> > > + vb->rport=param;
>> > > break;
>> > > case P_PARAM:
>> > > break;
>> > > --- parser/parse_via.h.orig Mon Oct 21 18:46:27 2002
>> > > +++ parser/parse_via.h Sat Jan 11 06:09:54 2003
>> > > @@ -36,7 +36,7 @@
>> > > */
>> > > enum {
>> > > PARAM_HIDDEN=230, PARAM_TTL, PARAM_BRANCH,
>> > > - PARAM_MADDR, PARAM_RECEIVED, GEN_PARAM,
>> > > + PARAM_MADDR, PARAM_RECEIVED, PARAM_RPORT, GEN_PARAM,
>> > > PARAM_ERROR
>> > > };
>> > >
>> > > @@ -70,6 +70,7 @@
>> > > struct via_param* branch;
>> > > str tid; /* transaction id, part of branch */
>> > > struct via_param* received;
>> > > + struct via_param* rport;
>> > >
>> > > struct via_body* next; /* pointer to next via body string if
>> > > compact via or null */
>> > > --- config.h.orig Mon Oct 21 22:21:50 2002
>> > > +++ config.h Sat Jan 11 06:09:54 2003
>> > > @@ -82,6 +82,9 @@
>> > > #define RECEIVED ";received="
>> > > #define RECEIVED_LEN 10
>> > >
>> > > +#define RPORT ";rport="
>> > > +#define RPORT_LEN 7
>> > > +
>> > > #define SRV_PREFIX "_sip._udp."
>> > > #define SRV_PREFIX_LEN 10
>> > >
>> > > @@ -112,6 +115,7 @@
>> > > /* forwarding -- Via buffer dimensioning */
>> > > #define MAX_VIA_LINE_SIZE 240
>> > > #define MAX_RECEIVED_SIZE 57
>> > > +#define MAX_RPORT_SIZE 13
>> > >
>> > > /* maximum number of branches per transaction */
>> > > #define MAX_BRANCHES 4
>> > > --- forward.h.orig Wed Oct 23 18:12:20 2002
>> > > +++ forward.h Sat Jan 11 06:09:54 2003
>> > > @@ -40,7 +40,7 @@
>> > > int check_self(str* host, unsigned short port);
>> > > int forward_request( struct sip_msg* msg, struct proxy_l* p);
>> > > int update_sock_struct_from_via( union sockaddr_union* to,
>> > > - struct via_body* via );
>> > > + struct via_body* via, struct sip_msg *msg );
>> > > int update_sock_struct_from_ip( union sockaddr_union* to,
>> > > struct sip_msg *msg );
>> > > int forward_reply( struct sip_msg* msg);
>> > > --- ip_addr.h.orig Mon Nov 4 19:05:32 2002
>> > > +++ ip_addr.h Sat Jan 11 06:09:54 2003
>> > > @@ -201,6 +201,21 @@
>> > > }
>> > > }
>> > >
>> > > +static inline unsigned int su2port_no(union sockaddr_union* su)
>> > > +{
>> > > + switch(su->s.sa_family){
>> > > + case AF_INET:
>> > > + return ntohs(su->sin.sin_port);
>> > > +#ifdef USE_IPV6
>> > > + case AF_INET6:
>> > > + return ntohs(su->sin6.sin6_port);
>> > > +#endif
>> > > + default:
>> > > + LOG(L_CRIT,"su2port_no: BUG: unknown address family %d\n",
>> > > + su->s.sa_family);
>> > > + }
>> > > + return 0;
>> > > +}
>> > >
>> > > /* ip_addr2su -> the same as init_su*/
>> > > #define ip_addr2su init_su
>> > > --- msg_translator.c.orig Mon Oct 21 22:21:50 2002
>> > > +++ msg_translator.c Sat Jan 11 06:09:54 2003
>> > > @@ -145,9 +145,10 @@
>> > > else
>> > > foo=&(msg->first_line.u.request.uri);
>> > > print_len=snprintf(buf+fix_len, MAX_WARNING_LEN-fix_len,
>> > > - "pid=%d req_src_ip=%s in_uri=%.*s out_uri=%.*s via_cnt%c=%d\"",
>> > > + "pid=%d req_src_ip=%s req_src_port=%d in_uri=%.*s out_uri=%.*s via_cnt%c=%d\"",
>> > > my_pid(),
>> > > ip_addr2a(&msg->src_ip),
>> > > + msg->src_port_no,
>> > > msg->first_line.u.request.uri.len, msg->first_line.u.request.uri.s,
>> > > foo->len, foo->s,
>> > > msg->parsed_flag & HDR_EOH ? '=' : '>', /* should be = */
>> > > @@ -208,7 +209,26 @@
>> > > return buf;
>> > > }
>> > >
>> > > +char *rport_builder(struct sip_msg *msg, unsigned int *rport_len)
>> > > +{
>> > > + char *buf;
>> > >
>> > > + buf=pkg_malloc(sizeof(char)*MAX_RPORT_SIZE);
>> > > + if (buf==0){
>> > > + ser_error=E_OUT_OF_MEM;
>> > > + LOG(L_ERR, "ERROR: rport_builder: out of memory\n");
>> > > + return 0;
>> > > + }
>> > > + /*
>> > > + * Don't need any sanity checks here, because
>> > > + * msg->src_port_no is unsigned int, which means
>> > > + * that it couldn't be more than 5 chars long in
>> > > + * string representation.
>> > > + */
>> > > + *rport_len = snprintf(buf, MAX_RPORT_SIZE, "%s%u", RPORT, msg->src_port_no);
>> > > +
>> > > + return buf;
>> > > +}
>> > >
>> > > /* computes the "unpacked" len of a lump list,
>> > > code moved from build_req_from_req */
>> > > @@ -395,9 +415,10 @@
>> > > unsigned int *returned_len,
>> > > struct socket_info* send_sock)
>> > > {
>> > > - unsigned int len, new_len, received_len, uri_len, via_len;
>> > > + unsigned int len, new_len, received_len, rport_len, uri_len, via_len;
>> > > char* line_buf;
>> > > char* received_buf;
>> > > + char* rport_buf;
>> > > char* new_buf;
>> > > char* orig;
>> > > char* buf;
>> > > @@ -411,8 +432,10 @@
>> > > buf=msg->buf;
>> > > len=msg->len;
>> > > received_len=0;
>> > > + rport_len=0;
>> > > new_buf=0;
>> > > received_buf=0;
>> > > + rport_buf=0;
>> > >
>> > >
>> > > line_buf = via_builder( &via_len, send_sock,
>> > > @@ -430,6 +453,11 @@
>> > > if ((received_buf=received_builder(msg,&received_len))==0)
>> > > goto error01; /* free also line_buf */
>> > > }
>> > > + /* check if rport needs to be updated */
>> > > + if (msg->via1->rport && msg->via1->rport->value.s==0) {
>> > > + if ((rport_buf=rport_builder(msg,&rport_len))==0)
>> > > + goto error01; /* free also line_buf */
>> > > + }
>> > >
>> > > /* add via header to the list */
>> > > /* try to add it before msg. 1st via */
>> > > @@ -459,6 +487,14 @@
>> > > if (insert_new_lump_after(anchor, received_buf, received_len, HDR_VIA)
>> > > ==0 ) goto error02; /* free also line_buf */
>> > > }
>> > > + /* if rport needs to be updated do it */
>> > > + if (rport_len){
>> > > + offset = msg->via1->rport->value.s - buf - 1;
>> > > + anchor=del_lump(&msg->add_rm, offset, msg->via1->rport->size + 1, HDR_VIA);
>> > > + if (anchor==0) goto error02; /* free also line_buf */
>> > > + if (insert_new_lump_after(anchor, rport_buf, rport_len, HDR_VIA)
>> > > + ==0 ) goto error02; /* free also line_buf */
>> > > + }
>> > >
>> > > /* compute new msg len and fix overlapping zones*/
>> > > new_len=len+lumps_len(msg->add_rm);
>> > > @@ -507,6 +543,7 @@
>> > > pkg_free(line_buf);
>> > > error02:
>> > > if (received_buf) pkg_free(received_buf);
>> > > + if (rport_buf) pkg_free(rport_buf);
>> > > error00:
>> > > *returned_len=0;
>> > > return 0;
>> > > @@ -587,14 +624,18 @@
>> > > int i;
>> > > char backup;
>> > > char *received_buf;
>> > > + char *rport_buf;
>> > > unsigned int received_len;
>> > > + unsigned int rport_len;
>> > > char *warning;
>> > > unsigned int warning_len;
>> > > int r;
>> > > str to_tag;
>> > >
>> > > received_buf=0;
>> > > + rport_buf=0;
>> > > received_len=0;
>> > > + rport_len=0;
>> > > buf=0;
>> > > /* make -Wall happy */
>> > > warning=0;
>> > > @@ -621,6 +662,15 @@
>> > > goto error00;
>> > > }
>> > > }
>> > > + /* check if rport needs to be updated */
>> > > + if (msg->via1->rport && msg->via1->rport->value.s==0) {
>> > > + if ((rport_buf=rport_builder(msg,&rport_len))==0) {
>> > > + LOG(L_ERR, "ERROR: build_res_buf_from_sip_req: "
>> > > + "alas, rport_builder failed\n");
>> > > + goto error00;
>> > > + }
>> > > + rport_len -= msg->via1->rport->size;
>> > > + }
>> > >
>> > > /*computes the lenght of the new response buffer*/
>> > > len = 0;
>> > > @@ -641,7 +691,7 @@
>> > > len+=new_tag_len+5/*";tag="*/;
>> > > }
>> > > case HDR_VIA:
>> > > - if (hdr==msg->h_via1) len += received_len;
>> > > + if (hdr==msg->h_via1) len += received_len + rport_len;
>> > > case HDR_FROM:
>> > > case HDR_CALLID:
>> > > case HDR_CSEQ:
>> > > @@ -716,10 +766,23 @@
>> > > break;
>> > > }
>> > > case HDR_VIA:
>> > > - append_str_trans( p, hdr->name.s ,
>> > > + if (hdr==msg->h_via1 && rport_buf) {
>> > > + append_str_trans( p, hdr->name.s ,
>> > > + msg->via1->rport->name.s - hdr->name.s - 1, msg);
>> > > + append_str( p, rport_buf,
>> > > + rport_len + msg->via1->rport->size, msg);
>> > > + append_str_trans( p, msg->via1->rport->name.s +
>> > > + msg->via1->rport->size,
>> > > + hdr->body.s + hdr->body.len -
>> > > + msg->via1->rport->name.s -
>> > > + msg->via1->rport->size, msg);
>> > > + } else {
>> > > + append_str_trans( p, hdr->name.s ,
>> > > ((hdr->body.s+hdr->body.len )-hdr->name.s ),msg);
>> > > + }
>> > > if (hdr==msg->h_via1 && received_buf)
>> > > append_str( p, received_buf, received_len, msg);
>> > > +
>> > > append_str( p, CRLF,CRLF_LEN,msg);
>> > > break;
>> > > case HDR_FROM:
>> > > @@ -763,10 +826,12 @@
>> > > needs to be deleted here
>> > > */
>> > > if (received_buf) pkg_free(received_buf);
>> > > + if (rport_buf) pkg_free(rport_buf);
>> > > return buf;
>> > >
>> > > error01:
>> > > if (received_buf) pkg_free(received_buf);
>> > > + if (rport_buf) pkg_free(rport_buf);
>> > > error00:
>> > > *returned_len=0;
>> > > return 0;
>> > > --- receive.c.orig Thu Oct 3 23:06:10 2002
>> > > +++ receive.c Sat Jan 11 06:09:54 2003
>> > > @@ -77,6 +77,7 @@
>> > > useful as most of the work is done with scrath-pad; -jiri */
>> > > buf[len]=0;
>> > > su2ip_addr(&msg->src_ip, src_su);
>> > > + msg->src_port_no=su2port_no(src_su);
>> > > msg->dst_ip=bind_address->address; /* won't work if listening on 0.0.0.0 */
>> > > msg->id=msg_no;
>> > > /* make a copy of the message */
>> > > --- forward.c.orig Thu Oct 24 17:21:08 2002
>> > > +++ forward.c Sat Jan 11 06:21:11 2003
>> > > @@ -240,14 +240,21 @@
>> > > int update_sock_struct_from_ip( union sockaddr_union* to,
>> > > struct sip_msg *msg )
>> > > {
>> > > + unsigned short port_no;
>> > >
>> > > - init_su(to, &msg->src_ip,
>> > > - (msg->via1->port)?htons(msg->via1->port): htons(SIP_PORT) );
>> > > + if (msg->src_port_no)
>> > > + port_no = msg->src_port_no;
>> > > + else if (msg->via1->port)
>> > > + port_no = msg->via1->port;
>> > > + else
>> > > + port_no = SIP_PORT;
>> > > +
>> > > + init_su(to, &msg->src_ip, htons(port_no));
>> > > return 1;
>> > > }
>> > >
>> > > int update_sock_struct_from_via( union sockaddr_union* to,
>> > > - struct via_body* via )
>> > > + struct via_body* via, struct sip_msg *msg )
>> > > {
>> > > struct hostent* he;
>> > > char *host_copy;
>> > > @@ -266,6 +273,11 @@
>> > > name=&(via->host);
>> > > port=via->port;
>> > > }
>> > > + if (via->rport && via->rport->value.s) {
>> > > + port=atoi(via->rport->value.s);
>> > > + } else if (via->rport && via->rport->value.s==0 && !via->received) {
>> > > + return update_sock_struct_from_ip( to, msg);
>> > > + }
>> > > /* we do now a malloc/memcpy because gethostbyname loves \0-terminated
>> > > strings; -jiri
>> > > but only if host is not null terminated
>> > > @@ -353,7 +365,7 @@
>> > > goto error;
>> > > }
>> > >
>> > > - if (update_sock_struct_from_via( to, msg->via2 )==-1) goto error;
>> > > + if (update_sock_struct_from_via( to, msg->via2, msg)==-1) goto error;
>> > > send_sock=get_send_socket(to);
>> > > if (send_sock==0){
>> > > LOG(L_ERR, "forward_reply: ERROR: no sending socket found\n");
>> >
>>
>>
>> _______________________________________________
>> Serusers mailing list
>> serusers at lists.iptel.org
>> http://lists.iptel.org/mailman/listinfo/serusers
--
Jiri Kuthan http://iptel.org/~jiri/
More information about the sr-users
mailing list