[Devel] Extended nathelper

Bogdan-Andrei Iancu bogdan at voice-system.ro
Fri Mar 3 17:07:44 CET 2006


Hi,

in this case shouldn't be simpler just to add an parameter to 
add_rvc_param() to tell if the received should be added as URI param or 
header param?

will this cover your scenario?

regards,
Bogdan


Walter Schober wrote:

>Hi!
>
>The difference is, that a received parameter is added behind the Contact URI
>not as URI parameter, but a contact parameter:
>Contact:
><sip:0123456 at 1.2.3.4:5060;x-orig=11.11.11.11:5064;x-orig-nat=192.168.40.99:5
>064>;received="sip:11.11.11.11:5064"
>
>And that one is not stored in the ContactDB of the next proxy. That one
>stores the SIP URI in the contact only.
>Thus the received parameter is not included in the sucessive Invite.
>
>BTW: I cannot change the behaviour of that proxy.
>
>Br
>Walter
>
>-----Original Message-----
>From: Bogdan-Andrei Iancu [mailto:bogdan at voice-system.ro] 
>Sent: Friday, March 03, 2006 12:51 PM
>To: Walter Schober
>Cc: devel at openser.org
>Subject: Re: [Devel] Extended nathelper
>
>Hi Walter,
>
>thanks for email.
>
>First I want to see if there is some difference between the new function 
>you add and the already existing function add_rcv_param().
>    http://openser.org/docs/modules/1.0.x/nathelper.html#AEN331
>
>Regards,
>Bogdan
>
>
>Walter Schober wrote:
>
>  
>
>>Hi!
>> 
>>Maybe someone find's that useful. It's nearly the same than mangler, 
>>but the difference is, that it stores the old values, too.
>> 
>>Short description: nathelper stores original contact + addr:port from 
>>where the request was received and puts itself in the list to register 
>>a client on the next proxy. Keepalive has to be done by other methods.
>> 
>>See details in attached readme.
>> 
>>/Walter
>> 
>>
>>------------------------------------------------------------------------
>>
>>Nathelper Patch for registering on remote proxies
>>-------------------------------------------------
>>
>>V 0.2 
>>20060212
>>WSC walter.schober at neotel.at
>>
>>-------------------------------------------------
>>
>>Description: Openser is placed in front of another proxy not supporting RFC
>>    
>>
>3327 (Patch Header Support).
>  
>
>>Using module nathelper the OpenSER detects nated clients and modifies the
>>    
>>
>Contact field of the register. 
>  
>
>>The Contact header is expanded by a new "route", which is substituted
>>    
>>
>instead of the IP:Port the 
>  
>
>>register is received from. 
>>The operation is done after fixing the Contact in
>>	fix_nated_contact();
>>Original fix_nated_contact() just replaces the host:port with host:port
>>    
>>
>from where the request was 
>  
>
>>received from.
>>If the module parameter "contact_expander" is set, this value is inserted
>>    
>>
>behind the user@ replacing the 
>  
>
>>fixed original host port.
>>e.g. original Contact is
>>	Contact:
>>    
>>
><sip:user at 192.168.1.1:5555;some-uri-param>;additional-params
>  
>
>>the fix_nated_contact() replaces that with the IP from where the request
>>    
>>
>was received from:
>  
>
>>	Contact: <sip:user at some_ip:port;some-uri-param>;additional-params
>>
>>If contact_expander is set, this string is inserted as
>>	Contact:
>>    
>>
><sip:user at value-of-contact-expander;x-orig=some_ip:port;x-orig-nat=original-
>contact;some-uri-param>;additional-params
>  
>
>>e.g. contact_exander = 1.2.3.4:5066, resulting in
>>	Contact:
>>    
>>
><sip:user at 1.2.3.4:5066;x-orig=33.44.55.66:5066;x-orig-nat=192.168.1.1:5062;s
>ome-uri-param>;additional-params
>  
>
>>	
>>A Invite to such a contact results in 
>>	INVITE
>>    
>>
>sip:user at 1.2.3.4:5066;x-orig=33.44.55.66:5066;x-orig-nat=192.168.1.1:5062;so
>me-uri-param
>  
>
>>which could be replaced by e.g. textops and avp_ops
>>       avp_write("$ruri","$x-orig");
>>       if (subst_uri('/^sip:(.+)@.*;x-orig-nat=(.*)$/sip:\1@\2/i')) {
>>
>>    
>>
>avp_subst("$x-orig","/^(.*)@.*;x-orig=(.*);x-orig-nat=.*$/\1@\2/");
>  
>
>>               avp_pushto("$duri","$x-orig");
>>		route(1);
>>
>>forwarding to the original contact address, but to NATed contact address.
>>
>>
>>New Module Param:
>>--------------------------------------------------
>>modparam("nathelper", "contact_expander", "1.2.3.4:5066")
>>
>>
>>New Function Call:
>>--------------------------------------------------
>>None.
>>
>>
>>Example:
>>--------------------------------------------------
>># add myself as an alias
>>alias=1.2.3.4:5066
>>
>># set contact_expander to myself
>>modparam("nathelper", "contact_expander", "1.2.3.4:5066")
>>
>># avpops
>>modparam("avpops", "avp_aliases", "x-orig=i:32")
>>
>># is request is directed to me
>>if (uri==myself) {
>>	# check, if we have to restore old destination
>>       avp_write("$ruri","$x-orig");
>>       if (subst_uri('/^sip:(.+)@.*;x-orig-nat=(.*)$/sip:\1@\2/i')) {
>>
>>    
>>
>avp_subst("$x-orig","/^(.*)@.*;x-orig=(.*);x-orig-nat=.*$/\1@\2/");
>  
>
>>               avp_pushto("$duri","$x-orig");
>>		# forwared to destination
>>		route(1);
>>		return;
>>	}
>>}
>>
>># ... do something ...
>>
>># fix the Register as usual
>>if (method=="REGISTER" || method=="INVITE" || method=="REFER") {
>>	if (nat_uac_test("18")) {
>>		fix_nated_contact();
>>		force_rport();
>>		append_hf("P-hint: nathelper applied\r\n");
>>	} else {
>>		append_hf("P-hint: nathelper not applied\r\n");
>>	};
>>};
>>
>># ... continue ... do something with the request
>>
>>
>>Installation
>>----------------------------------------------------
>>Patch the nathelper.c located in modules/nathelper executing
>>	cp nathelper.c nathelper.c.orig
>>	patch nathelper.c <nathelper.patch
>>	
>>Rebuild module nathelper
>>	make modules=modules/nathelper modules
>>	make install
>>
>>The patch is based on OpenSER 1.0.0.
>>
>>Changes are in function fix_nated_contact_f() only + parameter definitions.
>>	
>>Restart OpenSER.
>>
>>
>>-----------------------------------------------------
>>
>>
>>New function fix_nated_contact_f():
>>
>>static int
>>fix_nated_contact_f(struct sip_msg* msg, char* str1, char* str2)
>>{
>>       int offset, len, len1;
>>       char *cp, *buf, temp[2];
>>       contact_t *c;
>>       struct lump *anchor;
>>       struct sip_uri uri;
>>       str hostport;
>>
>>       if (get_contact_uri(msg, &uri, &c) == -1)
>>               return -1;
>>       if ((c->uri.s < msg->buf) || (c->uri.s > (msg->buf + msg->len))) {
>>               LOG(L_ERR, "ERROR: you can't call fix_nated_contact twice,
>>    
>>
>"
>  
>
>>                   "check your config!\n");
>>               return -1;
>>       }
>>
>>       offset = c->uri.s - msg->buf;
>>       anchor = del_lump(msg, offset, c->uri.len, HDR_CONTACT_T);
>>       if (anchor == 0)
>>               return -1;
>>
>>       hostport = uri.host;
>>       if (uri.port.len > 0)
>>               hostport.len = uri.port.s + uri.port.len - uri.host.s;
>>
>>       cp = ip_addr2a(&msg->rcv.src_ip);
>>       len = c->uri.len + strlen(cp) + 6 /* :port */ - hostport.len + 1;
>>
>>       if (contact_expander.len) {
>>               LOG(L_DBG, "Expanding Contact: %s\n", contact_expander.s);
>>               len += contact_expander.len + hostport.len + 20;
>>       }
>>       buf = pkg_malloc(len);
>>
>>       if (buf == NULL) {
>>               LOG(L_ERR, "ERROR: fix_nated_contact: out of memory\n");
>>               return -1;
>>       }
>>
>>       temp[0] = hostport.s[0];
>>       temp[1] = c->uri.s[c->uri.len];
>>       c->uri.s[c->uri.len] = hostport.s[0] = '\0';
>>
>>       if (contact_expander.len) {
>>               // sip:user:password at host:port ->
>>               //
>>    
>>
>sip:user:password at HOST:PORT;x-orig=host:port;x-orig-nat=priv-host:priv-port
>  
>
>>               len1 = snprintf(buf, len,
>>    
>>
>"%s%s;x-orig=%s:%d;x-orig-nat=%c%s", c->uri.s,
>  
>
>>                       contact_expander.s,
>>                       cp, msg->rcv.src_port,
>>                       temp[0],
>>                       hostport.s + 1);
>>       } else {
>>               len1 = snprintf(buf, len, "%s%s:%d%s", c->uri.s, cp,
>>    
>>
>msg->rcv.src_port,
>  
>
>>                       hostport.s + hostport.len);
>>       }
>>
>>       if (len1 < len)
>>               len = len1;
>>       hostport.s[0] = temp[0];
>>       c->uri.s[c->uri.len] = temp[1];
>>       if (insert_new_lump_after(anchor, buf, len, HDR_CONTACT_T) == 0) {
>>               pkg_free(buf);
>>               return -1;
>>       }
>>       c->uri.s = buf;
>>       c->uri.len = len;
>>
>>       return 1;
>>}
>>
>> 
>>
>>------------------------------------------------------------------------
>>
>>_______________________________________________
>>Devel mailing list
>>Devel at openser.org
>>http://openser.org/cgi-bin/mailman/listinfo/devel
>> 
>>
>>    
>>
>
>
>
>  
>




More information about the Devel mailing list