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

Author: Andrei Pelinescu-Onciul <[email protected]>
Committer: Andrei Pelinescu-Onciul <[email protected]>
Date:   Mon Feb 22 14:49:37 2010 +0100

core: distinct core and tm onreply route tests

- added TM_ONREPLY_ROUTE and CORE_ONREPLY_ROUTE to the possible
route types. This allows to distinguish between the main reply
route (executed by the core) and onreply routes executed by tm.
ONREPLY_ROUTE was changed to TM_ONREPLY_ROUTE|CORE_ONREPLY_ROUTE,
so that is_route_type(ONREPLY_ROUTE) will return true both for
 CORE_ONREPLY_ROUTE and TM_ONREPLY_ROUTE.

- onreply_route[0] {} is equivalent with onreply_route{}.

- use different route types when parsing the script for
 onreply_route{} (CORE_ONREPLY_ROUTE) and onreply_route[x]{},
  where x!=0 (TM_ONREPLY_ROUTE).

---

 cfg.y     |   39 +++++++++++++++++++++++++--------------
 receive.c |    2 +-
 route.h   |    6 ++++--
 3 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/cfg.y b/cfg.y
index 763879a..453e6a1 100644
--- a/cfg.y
+++ b/cfg.y
@@ -647,7 +647,7 @@ statement:
        | module_stm
        | {rt=REQUEST_ROUTE;} route_stm
        | {rt=FAILURE_ROUTE;} failure_route_stm
-       | {rt=ONREPLY_ROUTE;} onreply_route_stm
+       | onreply_route_stm
        | {rt=BRANCH_ROUTE;} branch_route_stm
        | {rt=ONSEND_ROUTE;}   send_route_stm
        | {rt=EVENT_ROUTE;}   event_route_stm
@@ -1775,35 +1775,46 @@ failure_route_stm:
        }
        | ROUTE_FAILURE error { yyerror("invalid failure_route statement"); }
        ;
+
 onreply_route_stm:
-       ROUTE_ONREPLY LBRACE actions RBRACE {
+       ROUTE_ONREPLY LBRACE {rt=CORE_ONREPLY_ROUTE;} actions RBRACE {
        #ifdef SHM_MEM
                if (!shm_initialized() && init_shm()<0) {
                        yyerror("Can't initialize shared memory");
                        YYABORT;
                }
        #endif /* SHM_MEM */
-               push($3, &onreply_rt.rlist[DEFAULT_RT]);
+               push($4, &onreply_rt.rlist[DEFAULT_RT]);
        }
-       | ROUTE_ONREPLY LBRACK route_name RBRACK LBRACE actions RBRACE {
+       | ROUTE_ONREPLY error { yyerror("invalid onreply_route statement"); }
+       | ROUTE_ONREPLY LBRACK route_name RBRACK 
+               {rt=(*$3=='0' && $3[1]==0)?CORE_ONREPLY_ROUTE:TM_ONREPLY_ROUTE;}
+               LBRACE actions RBRACE {
        #ifdef SHM_MEM
                if (!shm_initialized() && init_shm()<0) {
                        yyerror("Can't initialize shared memory");
                        YYABORT;
                }
        #endif /* SHM_MEM */
-               i_tmp=route_get(&onreply_rt, $3);
-               if (i_tmp==-1){
-                       yyerror("internal error");
-                       YYABORT;
-               }
-               if (onreply_rt.rlist[i_tmp]){
-                       yyerror("duplicate route");
-                       YYABORT;
+               if (*$3=='0' && $3[1]==0){
+                       /* onreply_route[0] {} is equivalent with onreply_route 
{}*/
+                       push($7, &onreply_rt.rlist[DEFAULT_RT]);
+               }else{
+                       i_tmp=route_get(&onreply_rt, $3);
+                       if (i_tmp==-1){
+                               yyerror("internal error");
+                               YYABORT;
+                       }
+                       if (onreply_rt.rlist[i_tmp]){
+                               yyerror("duplicate route");
+                               YYABORT;
+                       }
+                       push($7, &onreply_rt.rlist[i_tmp]);
                }
-               push($6, &onreply_rt.rlist[i_tmp]);
        }
-       | ROUTE_ONREPLY error { yyerror("invalid onreply_route statement"); }
+       | ROUTE_ONREPLY LBRACK route_name RBRACK error {
+               yyerror("invalid onreply_route statement");
+       }
        ;
 branch_route_stm:
        ROUTE_BRANCH LBRACE actions RBRACE {
diff --git a/receive.c b/receive.c
index a045e3a..df26196 100644
--- a/receive.c
+++ b/receive.c
@@ -247,7 +247,7 @@ int receive_msg(char* buf, unsigned int len, struct 
receive_info* rcv_info)
 
                /* exec the onreply routing script */
                if (onreply_rt.rlist[DEFAULT_RT]){
-                       set_route_type(ONREPLY_ROUTE);
+                       set_route_type(CORE_ONREPLY_ROUTE);
                        ret=run_top_route(onreply_rt.rlist[DEFAULT_RT], msg, 
&ctx);
 #ifndef NO_ONREPLY_ROUTE_ERROR
                        if (unlikely(ret<0)){
diff --git a/route.h b/route.h
index e346ebd..5e3e04d 100644
--- a/route.h
+++ b/route.h
@@ -47,11 +47,13 @@
  */
 #define REQUEST_ROUTE (1 << 0)
 #define FAILURE_ROUTE (1 << 1)
-#define ONREPLY_ROUTE (1 << 2)
+#define TM_ONREPLY_ROUTE (1 << 2)
 #define BRANCH_ROUTE  (1 << 3)
 #define ONSEND_ROUTE  (1 << 4)
 #define ERROR_ROUTE   (1 << 5)
 #define LOCAL_ROUTE   (1 << 6)
+#define CORE_ONREPLY_ROUTE (1 << 7)
+#define ONREPLY_ROUTE (TM_ONREPLY_ROUTE|CORE_ONREPLY_ROUTE)
 #define EVENT_ROUTE   REQUEST_ROUTE
 #define ANY_ROUTE     (0xFFFFFFFF)
 
@@ -68,7 +70,7 @@ extern int route_type;
 
 #define get_route_type()       route_type
 
-#define is_route_type(type) (route_type == (type))
+#define is_route_type(type) (route_type & (type))
 
 struct route_list{
        struct action** rlist;


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

Reply via email to