2
0
Эх сурвалжийг харах

core: new parameter kemi.event_route_callback

- set the name of kemi function to be executed for core event route
equivalet
- default value is not set (no callback function name). If set to
"none", it is also not executed.
- callback function receives a string parameter with the name of the event
- execute kemi event callback for "core:worker-one-init"
Daniel-Constantin Mierla 7 жил өмнө
parent
commit
77beeb5d76

+ 26 - 8
src/core/action.c

@@ -1663,23 +1663,41 @@ int run_top_route(struct action* a, sip_msg_t* msg, struct run_act_ctx *c)
 int run_child_one_init_route(void)
 {
 	struct sip_msg *fmsg;
-	struct run_act_ctx ctx;
+	run_act_ctx_t ctx;
+	run_act_ctx_t *bctx;
 	int rtb, rt;
+	sr_kemi_eng_t *keng = NULL;
+	str evname = str_init("core:worker-one-init");
 
-	LM_DBG("attempting to run event_route[core:worker-one-init]\n");
+	LM_DBG("attempting to run event_route[%s]\n", evname.s);
 
-	rt = route_get(&event_rt, "core:worker-one-init");
-	if(rt>=0 && event_rt.rlist[rt]!=NULL) {
-		LM_DBG("executing event_route[core:worker-one-init] (%d)\n", rt);
+	if(kemi_event_route_callback.s!=NULL && kemi_event_route_callback.len>0) {
+		keng = sr_kemi_eng_get();
+		rt = -1;
+	} else {
+		rt = route_get(&event_rt, evname.s);
+	}
+	if((keng!=NULL) || (rt>=0 && event_rt.rlist[rt]!=NULL)) {
+		LM_DBG("executing event_route[%s] (%d)\n", evname.s, rt);
 		if(faked_msg_init()<0)
 			return -1;
 		fmsg = faked_msg_next();
 		rtb = get_route_type();
 		set_route_type(REQUEST_ROUTE);
 		init_run_actions_ctx(&ctx);
-		run_top_route(event_rt.rlist[rt], fmsg, &ctx);
-		if(ctx.run_flags&DROP_R_F)
-		{
+		if(keng==NULL) {
+			run_top_route(event_rt.rlist[rt], fmsg, &ctx);
+		} else {
+			bctx = sr_kemi_act_ctx_get();
+			sr_kemi_act_ctx_set(&ctx);
+			if(keng->froute(fmsg, EVENT_ROUTE,
+						&kemi_event_route_callback, &evname)<0) {
+				LM_ERR("error running event route kemi callback\n");
+				return -1;
+			}
+			sr_kemi_act_ctx_set(bctx);
+		}
+		if(ctx.run_flags&DROP_R_F) {
 			LM_ERR("exit due to 'drop' in event route\n");
 			return -1;
 		}

+ 2 - 0
src/core/cfg.lex

@@ -449,6 +449,7 @@ ROUTE_LOCKS_SIZE     "route_locks_size"
 KEMI     "kemi"
 ONSEND_ROUTE_CALLBACK	"onsend_route_callback"
 REPLY_ROUTE_CALLBACK	"reply_route_callback"
+EVENT_ROUTE_CALLBACK	"event_route_callback"
 
 MAX_RECURSIVE_LEVEL		"max_recursive_level"
 MAX_BRANCHES_PARAM		"max_branches"|"max_branches"
@@ -938,6 +939,7 @@ IMPORTFILE      "import_file"
 <INITIAL>{KEMI}  { count(); yylval.strval=yytext; return KEMI;}
 <INITIAL>{REPLY_ROUTE_CALLBACK}  { count(); yylval.strval=yytext; return REPLY_ROUTE_CALLBACK;}
 <INITIAL>{ONSEND_ROUTE_CALLBACK}  { count(); yylval.strval=yytext; return ONSEND_ROUTE_CALLBACK;}
+<INITIAL>{EVENT_ROUTE_CALLBACK}  { count(); yylval.strval=yytext; return EVENT_ROUTE_CALLBACK;}
 <INITIAL>{MAX_RECURSIVE_LEVEL}  { count(); yylval.strval=yytext; return MAX_RECURSIVE_LEVEL;}
 <INITIAL>{MAX_BRANCHES_PARAM}  { count(); yylval.strval=yytext; return MAX_BRANCHES_PARAM;}
 <INITIAL>{LATENCY_LOG}  { count(); yylval.strval=yytext; return LATENCY_LOG;}

+ 11 - 0
src/core/cfg.y

@@ -486,6 +486,7 @@ extern char *default_routename;
 %token KEMI
 %token ONSEND_ROUTE_CALLBACK
 %token REPLY_ROUTE_CALLBACK
+%token EVENT_ROUTE_CALLBACK
 %token MAX_RECURSIVE_LEVEL
 %token MAX_BRANCHES_PARAM
 %token LATENCY_CFG_LOG
@@ -1594,6 +1595,16 @@ assign_stm:
 			}
 		}
 	| KEMI DOT REPLY_ROUTE_CALLBACK EQUAL error { yyerror("string expected"); }
+	| KEMI DOT EVENT_ROUTE_CALLBACK EQUAL STRING {
+			kemi_event_route_callback.s = $5;
+			kemi_event_route_callback.len = strlen($5);
+			if(kemi_event_route_callback.len==4
+					&& strcasecmp(kemi_event_route_callback.s, "none")==0) {
+				kemi_event_route_callback.s = "";
+				kemi_event_route_callback.len = 0;
+			}
+		}
+	| KEMI DOT EVENT_ROUTE_CALLBACK EQUAL error { yyerror("string expected"); }
     | MAX_RECURSIVE_LEVEL EQUAL NUMBER { set_max_recursive_level($3); }
     | MAX_BRANCHES_PARAM EQUAL NUMBER { sr_dst_max_branches = $3; }
     | LATENCY_LOG EQUAL intno { default_core_cfg.latency_log=$3; }

+ 1 - 0
src/core/kemi.c

@@ -45,6 +45,7 @@
 /* names for kemi callback functions */
 str kemi_onsend_route_callback = str_init("ksr_onsend_route");
 str kemi_reply_route_callback = str_init("ksr_reply_route");
+str kemi_event_route_callback = str_init("");
 
 /**
  *

+ 1 - 0
src/core/kemi.h

@@ -39,6 +39,7 @@
 
 extern str kemi_onsend_route_callback;
 extern str kemi_reply_route_callback;
+extern str kemi_event_route_callback;
 
 typedef struct sr_kemi {
 	str mname; /* sub-module name */