Module: sip-router
Branch: master
Commit: 5e0e999ad320688e41f338bc7c6fc5f8fa76678f
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=5e0e999…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
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;