[Devel] Improving force_rtp_proxy

Bogdan-Andrei Iancu bogdan at voice-system.ro
Wed Feb 22 16:35:21 CET 2006


Hi Marc,

you are right...I made a superficial evaluation of the problem :(.

as an implementation alternative, we can use the flags to be able to 
create session for replies and to confirm it for requests (ACKs).
    http://openser.org/docs/modules/1.1.x/nathelper.html#AEN267

there are 2 options:
1) use a single flag called "revert" or "swap"
    -> force_rtp_proxy("s");
2) use 2 flags - create and confirm - in this case you will have full 
liberty to decide when to
    create and when to confirm the session
    -> force_rtp_proxy("C");  # create the session
    -> force_rtp_proxy("c");  # confirm the session

this flags will override the default behaviour:
    request -> create
    reply -> confirm.

regards,
bogdan

Marc Haisenko wrote:

>On Tuesday 21 February 2006 19:24, Bogdan-Andrei Iancu wrote:
>  
>
>>Hi Marc,
>>
>>indeed, the code limits the force_rtp_proxy() usage to INVITEs when
>>comes to requests. There are 2 solutions here:
>>    1) remove the method limitation - anyhow you decide from script for
>>what request you call or not the function
>>    2) along with INVITE, add ACK.
>>
>>my personal option is 1) .
>>
>>In both cases, the change is trivial :).
>>
>>regards,
>>bogdan
>>    
>>
>
>Hmmm, it doesn't seem to be /that/ trivial. The problem is that I need to 
>decide what to do on an "OK": I have no idea whether the corresponding INVITE 
>had SDP or not. So my current solution is to handle the OK as always, but 
>when the RTP proxy communication result shows that no entry is present I 
>rerun the whole force_rtp_proxy2_f function where I set an additional 
>argument so the "OK" gets handled like an "INVITE" (I renamed the original 
>force_rtp_proxy2_f and put a wrapper in its place). ACKs are handled like 
>INVITES... but it just occurs to me that they should be handled like OKs 
>instead.
>
>I hope you understand what I mean :-)
>
>Now what I don't like in this approach is that one additional RTP proxy 
>message exchange occurs... but it /seems/ like it works and the code changes 
>are trivial. I've attached my patch so you can actually see what I mean, but 
>I hope you have an idea to solve this problem in a more elegant way :-)
>
>  
>
>------------------------------------------------------------------------
>
>diff -ur sip-server.orig/modules/nathelper/nathelper.c sip-server/modules/nathelper/nathelper.c
>--- sip-server.orig/modules/nathelper/nathelper.c	2005-06-16 14:41:52.000000000 +0200
>+++ sip-server/modules/nathelper/nathelper.c	2006-02-21 14:47:02.000000000 +0100
>@@ -1599,8 +1599,17 @@
> }
> 
> static int
>+force_rtp_proxy2_f_real(struct sip_msg* msg, char* str1, char* str2, int inverted);
>+
>+static int
> force_rtp_proxy2_f(struct sip_msg* msg, char* str1, char* str2)
> {
>+	return force_rtp_proxy2_f_real(msg, str1, str2, 0);
>+}
>+
>+static int
>+force_rtp_proxy2_f_real(struct sip_msg* msg, char* str1, char* str2, int inverted)
>+{
> 	str body, body1, oldport, oldip, newport, newip;
> 	str callid, from_tag, to_tag, tmp;
> 	int create, port, len, asymmetric, flookup, argc, proxied, real;
>@@ -1677,10 +1686,11 @@
> 	}
> 
> 	if (msg->first_line.type == SIP_REQUEST &&
>-	    msg->first_line.u.request.method_value == METHOD_INVITE) {
>-		create = 1;
>+	    (msg->first_line.u.request.method_value == METHOD_INVITE ||
>+	     msg->first_line.u.request.method_value == METHOD_ACK)) {
>+		create = 1 - inverted;
> 	} else if (msg->first_line.type == SIP_REPLY) {
>-		create = 0;
>+		create = inverted;
> 	} else {
> 		return -1;
> 	}
>@@ -1853,6 +1863,10 @@
> 			}
> 			port = atoi(argv[0]);
> 			if (port <= 0 || port > 65535) {
>+				if ((port == 0) && (inverted == 0) && (msg->first_line.type == SIP_REPLY)) {
>+					LOG(L_ERR, "force_rtp_proxy2: retrying inverted\n");
>+					return force_rtp_proxy2_f_real(msg, str1, str2, 1);
>+				}
> 				LOG(L_ERR, "force_rtp_proxy2: incorrect port in reply from rtp proxy\n");
> 				return -1;
> 			}
>  
>




More information about the Devel mailing list