[sr-dev] git:hpw/branch_failure_route: core: Initial revision of branch_failure_route

Hugh Waite hugh.waite at crocodile-rcs.com
Tue Mar 19 16:45:32 CET 2013


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

Author: Hugh Waite <hugh.waite at crocodile-rcs.com>
Committer: Hugh Waite <hugh.waite at crocodile-rcs.com>
Date:   Tue Mar 19 15:43:46 2013 +0000

core: Initial revision of branch_failure_route

- New branch_failure_route defined
- cfg route is called but xlog() causes segfault

---

 cfg.lex     |    3 +++
 cfg.y       |   24 ++++++++++++++++++++++++
 route.c     |    4 ++++
 route.h     |    2 ++
 script_cb.c |    2 +-
 script_cb.h |    5 +++--
 6 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/cfg.lex b/cfg.lex
index 5a7ce8a..bafab4b 100644
--- a/cfg.lex
+++ b/cfg.lex
@@ -200,6 +200,7 @@ ERROR	error
 ROUTE	route
 ROUTE_REQUEST request_route
 ROUTE_FAILURE failure_route
+ROUTE_BRANCH_FAILURE branch_failure_route
 ROUTE_REPLY reply_route
 ROUTE_ONREPLY onreply_route
 ROUTE_BRANCH branch_route
@@ -623,6 +624,8 @@ IMPORTFILE      "import_file"
 <INITIAL>{ROUTE_REPLY}	{ count(); yylval.strval=yytext; return ROUTE_REPLY; }
 <INITIAL>{ROUTE_FAILURE}	{ count(); yylval.strval=yytext;
 								return ROUTE_FAILURE; }
+<INITIAL>{ROUTE_BRANCH_FAILURE}	{ count(); yylval.strval=yytext;
+								return ROUTE_BRANCH_FAILURE; }
 <INITIAL>{ROUTE_BRANCH} { count(); yylval.strval=yytext; return ROUTE_BRANCH; }
 <INITIAL>{ROUTE_SEND} { count(); yylval.strval=yytext; return ROUTE_SEND; }
 <INITIAL>{ROUTE_EVENT} { count(); yylval.strval=yytext; return ROUTE_EVENT; }
diff --git a/cfg.y b/cfg.y
index 0c4fb5d..477991f 100644
--- a/cfg.y
+++ b/cfg.y
@@ -314,6 +314,7 @@ extern char *finame;
 %token ROUTE
 %token ROUTE_REQUEST
 %token ROUTE_FAILURE
+%token ROUTE_BRANCH_FAILURE
 %token ROUTE_ONREPLY
 %token ROUTE_REPLY
 %token ROUTE_BRANCH
@@ -705,6 +706,7 @@ statement:
 	| module_stm
 	| {rt=REQUEST_ROUTE;} route_stm
 	| {rt=FAILURE_ROUTE;} failure_route_stm
+	| {rt=BRANCH_FAILURE_ROUTE;} branch_failure_route_stm
 	| onreply_route_stm
 	| {rt=BRANCH_ROUTE;} branch_route_stm
 	| {rt=ONSEND_ROUTE;}   send_route_stm
@@ -1970,6 +1972,28 @@ failure_route_stm:
 	| ROUTE_FAILURE error { yyerror("invalid failure_route statement"); }
 	;
 
+branch_failure_route_stm:
+	ROUTE_BRANCH_FAILURE LBRACK route_name RBRACK 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(&branch_failure_rt, $3);
+		if (i_tmp==-1){
+			yyerror("internal error");
+			YYABORT;
+		}
+		if (branch_failure_rt.rlist[i_tmp]){
+			yyerror("duplicate route");
+			YYABORT;
+		}
+		push($6, &branch_failure_rt.rlist[i_tmp]);
+	}
+	| ROUTE_BRANCH_FAILURE error { yyerror("invalid branch_failure_route statement"); }
+	;
+
 
 route_reply_main:	ROUTE_ONREPLY { ; }
 		  | ROUTE_REPLY { ; }
diff --git a/route.c b/route.c
index 17c1b56..42fc496 100644
--- a/route.c
+++ b/route.c
@@ -102,6 +102,7 @@
 struct route_list main_rt;
 struct route_list onreply_rt;
 struct route_list failure_rt;
+struct route_list branch_failure_rt;
 struct route_list branch_rt;
 struct route_list onsend_rt;
 struct route_list event_rt;
@@ -142,6 +143,7 @@ void destroy_routes()
 	destroy_rlist(&main_rt);
 	destroy_rlist(&onreply_rt);
 	destroy_rlist(&failure_rt);
+	destroy_rlist(&branch_failure_rt);
 	destroy_rlist(&branch_rt);
 	destroy_rlist(&event_rt);
 }
@@ -210,6 +212,8 @@ int init_routes()
 		goto error;
 	if (init_rlist("failure", &failure_rt, FAILURE_RT_NO, RT_HASH_SIZE)<0)
 		goto error;
+	if (init_rlist("branch_failure", &branch_failure_rt, FAILURE_RT_NO, RT_HASH_SIZE)<0)
+		goto error;
 	if (init_rlist("branch", &branch_rt, BRANCH_RT_NO, RT_HASH_SIZE)<0)
 		goto error;
 	if (init_rlist("on_send", &onsend_rt, ONSEND_RT_NO, RT_HASH_SIZE)<0)
diff --git a/route.h b/route.h
index 8f25fe3..f824c0e 100644
--- a/route.h
+++ b/route.h
@@ -53,6 +53,7 @@
 #define ERROR_ROUTE   (1 << 5)
 #define LOCAL_ROUTE   (1 << 6)
 #define CORE_ONREPLY_ROUTE (1 << 7)
+#define BRANCH_FAILURE_ROUTE (1 << 8)
 #define ONREPLY_ROUTE (TM_ONREPLY_ROUTE|CORE_ONREPLY_ROUTE)
 #define EVENT_ROUTE   REQUEST_ROUTE
 #define ANY_ROUTE     (0xFFFFFFFF)
@@ -85,6 +86,7 @@ extern struct route_list main_rt;
 /* main reply route table */
 extern struct route_list onreply_rt;
 extern struct route_list failure_rt;
+extern struct route_list branch_failure_rt;
 extern struct route_list branch_rt;
 extern struct route_list onsend_rt;
 extern struct route_list event_rt;
diff --git a/script_cb.c b/script_cb.c
index a10df7d..27156e2 100644
--- a/script_cb.c
+++ b/script_cb.c
@@ -53,7 +53,7 @@
 #include "mem/mem.h"
 
 /* Number of cb types = last cb type */
-#define SCRIPT_CB_NUM	EVENT_CB_TYPE
+#define SCRIPT_CB_NUM	(CB_TYPE_MAX-1)
 
 static struct script_cb *pre_script_cb[SCRIPT_CB_NUM];
 static struct script_cb *post_script_cb[SCRIPT_CB_NUM];
diff --git a/script_cb.h b/script_cb.h
index af557c7..596a503 100644
--- a/script_cb.h
+++ b/script_cb.h
@@ -49,14 +49,15 @@ typedef int (cb_function)(struct sip_msg *msg, unsigned int flags, void *param);
  */
 enum script_cb_flag { REQUEST_CB=1, FAILURE_CB=2, ONREPLY_CB=4,
 			BRANCH_CB=8, ONSEND_CB=16, ERROR_CB=32,
-			LOCAL_CB=64, EVENT_CB=128 };
+			LOCAL_CB=64, EVENT_CB=128, BRANCH_FAILURE_CB=256 };
 
 /* Callback types used for executing the callbacks.
  * Keep in sync with script_cb_flag!!!
  */
 enum script_cb_type { REQUEST_CB_TYPE=1, FAILURE_CB_TYPE, ONREPLY_CB_TYPE,
 			BRANCH_CB_TYPE, ONSEND_CB_TYPE, ERROR_CB_TYPE,
-			LOCAL_CB_TYPE, EVENT_CB_TYPE };
+			LOCAL_CB_TYPE, EVENT_CB_TYPE, BRANCH_FAILURE_CB_TYPE,
+			CB_TYPE_MAX};
 
 struct script_cb{
 	cb_function *cbf;




More information about the sr-dev mailing list