Module: sip-router
Branch: master
Commit: c37c22b4af29fed88c5655a5405876ffc640e5b2
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c37c22b4af29fed88c5655a5405876ffc640e5b2

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date:   Thu Aug 20 12:57:01 2009 +0300

core: support to add rport parameter to local via hdr

- new cfg function - add_local_rport() - to add rport parameter to local
  via header (rfc3581)

---

 action.c            |    4 ++++
 cfg.lex             |    3 +++
 cfg.y               |    3 +++
 msg_translator.c    |   25 +++++++++++++++++++++----
 parser/msg_parser.h |    1 +
 route_struct.h      |    1 +
 6 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/action.c b/action.c
index 848ec59..8e21ee6 100644
--- a/action.c
+++ b/action.c
@@ -1129,6 +1129,10 @@ match_cleanup:
                        msg->msg_flags|=FL_FORCE_RPORT;
                        ret=1; /* continue processing */
                        break;
+               case ADD_LOCAL_RPORT_T:
+                       msg->msg_flags|=FL_ADD_LOCAL_RPORT;
+                       ret=1; /* continue processing */
+                       break;
                case UDP_MTU_TRY_PROTO_T:
                        msg->msg_flags|= (unsigned int)a->val[0].u.number & 
FL_MTU_FB_MASK;
                        ret=1; /* continue processing */
diff --git a/cfg.lex b/cfg.lex
index e15c71b..ebe2b6d 100644
--- a/cfg.lex
+++ b/cfg.lex
@@ -166,6 +166,7 @@ ROUTE_SEND onsend_route
 ROUTE_EVENT event_route
 EXEC   exec
 FORCE_RPORT            "force_rport"|"add_rport"
+ADD_LOCAL_RPORT                "add_local_rport"
 FORCE_TCP_ALIAS                "force_tcp_alias"|"add_tcp_alias"
 UDP_MTU                "udp_mtu"
 UDP_MTU_TRY_PROTO      "udp_mtu_try_proto"
@@ -534,6 +535,8 @@ EAT_ABLE    [\ \t\b\r]
 <INITIAL>{SET_USERPHONE}       { count(); yylval.strval=yytext;
                                                                return 
SET_USERPHONE; }
 <INITIAL>{FORCE_RPORT} { count(); yylval.strval=yytext; return FORCE_RPORT; }
+<INITIAL>{ADD_LOCAL_RPORT}     { count(); yylval.strval=yytext;
+                                                               return 
ADD_LOCAL_RPORT; }
 <INITIAL>{FORCE_TCP_ALIAS}     { count(); yylval.strval=yytext;
                                                                return 
FORCE_TCP_ALIAS; }
 <INITIAL>{UDP_MTU}     { count(); yylval.strval=yytext; return UDP_MTU; }
diff --git a/cfg.y b/cfg.y
index 8a240c6..6950d88 100644
--- a/cfg.y
+++ b/cfg.y
@@ -295,6 +295,7 @@ static int case_check_default(struct case_stms* stms);
 %token SET_URI
 %token REVERT_URI
 %token FORCE_RPORT
+%token ADD_LOCAL_RPORT
 %token FORCE_TCP_ALIAS
 %token UDP_MTU
 %token UDP_MTU_TRY_PROTO
@@ -2886,6 +2887,8 @@ cmd:
        | REVERT_URI { $$=mk_action(REVERT_URI_T, 0); }
        | FORCE_RPORT LPAREN RPAREN     { $$=mk_action(FORCE_RPORT_T, 0); }
        | FORCE_RPORT   {$$=mk_action(FORCE_RPORT_T, 0); }
+       | ADD_LOCAL_RPORT LPAREN RPAREN { $$=mk_action(ADD_LOCAL_RPORT_T, 0); }
+       | ADD_LOCAL_RPORT       {$$=mk_action(ADD_LOCAL_RPORT_T, 0); }
        | FORCE_TCP_ALIAS LPAREN NUMBER RPAREN  {
                #ifdef USE_TCP
                        $$=mk_action(FORCE_TCP_ALIAS_T, 1, NUMBER_ST, 
(void*)$3);
diff --git a/msg_translator.c b/msg_translator.c
index b6273b0..e486579 100644
--- a/msg_translator.c
+++ b/msg_translator.c
@@ -2382,14 +2382,31 @@ char* create_via_hf( unsigned int *len,
        }
 #endif /* USE_TCP || USE_SCTP */
 
+       /* test and add rport parameter to local via - rfc3581 */
+       if(msg->msg_flags&FL_ADD_LOCAL_RPORT) {
+               /* params so far + ';rport' + '\0' */
+               via = (char*)pkg_malloc(extra_params.len+RPORT_LEN);
+               if(via==0) {
+                       LM_ERR("building local rport via param failed\n");
+                       if (extra_params.s) pkg_free(extra_params.s);
+                       return 0;
+               }
+               if(extra_params.len!=0) {
+                       memcpy(via, extra_params.s, extra_params.len);
+                       pkg_free(extra_params.s);
+               }
+               memcpy(via + extra_params.len, RPORT, RPORT_LEN-1);
+               extra_params.s = via;
+               extra_params.len += RPORT_LEN-1;
+               extra_params.s[extra_params.len]='\0';
+       }
+
        set_hostport(&hp, msg);
        via = via_builder( len, send_info, branch,
                                                        
extra_params.len?&extra_params:0, &hp);
 
-#if defined USE_TCP || defined USE_SCTP
-       /* we do not need id_buf any more, the id is already in the new via 
header */
-       if (id_buf) pkg_free(id_buf);
-#endif
+       /* we do not need extra_params any more, already in the new via header 
*/
+       if (extra_params.s) pkg_free(extra_params.s);
        return via;
 }
 
diff --git a/parser/msg_parser.h b/parser/msg_parser.h
index a811b61..1ce00bb 100644
--- a/parser/msg_parser.h
+++ b/parser/msg_parser.h
@@ -109,6 +109,7 @@ enum request_method {
 #define FL_MTU_TCP_FB   (1 << 8)
 #define FL_MTU_TLS_FB   (1 << 9)
 #define FL_MTU_SCTP_FB  (1 << 10)
+#define FL_ADD_LOCAL_RPORT  (1 << 11) /* add 'rport' to local via hdr */
 
 /* WARNING: Value (1 << 29) is temporarily reserved for use in kamailio acc
  * module (flag FL_REQ_UPSTREAM)! */
diff --git a/route_struct.h b/route_struct.h
index 090388c..9274340 100644
--- a/route_struct.h
+++ b/route_struct.h
@@ -97,6 +97,7 @@ enum action_type{
                FORWARD_SCTP_T,
                SEND_TCP_T,
                FORCE_RPORT_T,
+               ADD_LOCAL_RPORT_T,
                SET_ADV_ADDR_T,
                SET_ADV_PORT_T,
                FORCE_TCP_ALIAS_T,


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to