diff --git a/src/core/action.c b/src/core/action.c index f7d3aaf4658..bfd488ae033 100644 --- a/src/core/action.c +++ b/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; } diff --git a/src/core/cfg.lex b/src/core/cfg.lex index 62283088b77..67803e9b582 100644 --- a/src/core/cfg.lex +++ b/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" {KEMI} { count(); yylval.strval=yytext; return KEMI;} {REPLY_ROUTE_CALLBACK} { count(); yylval.strval=yytext; return REPLY_ROUTE_CALLBACK;} {ONSEND_ROUTE_CALLBACK} { count(); yylval.strval=yytext; return ONSEND_ROUTE_CALLBACK;} +{EVENT_ROUTE_CALLBACK} { count(); yylval.strval=yytext; return EVENT_ROUTE_CALLBACK;} {MAX_RECURSIVE_LEVEL} { count(); yylval.strval=yytext; return MAX_RECURSIVE_LEVEL;} {MAX_BRANCHES_PARAM} { count(); yylval.strval=yytext; return MAX_BRANCHES_PARAM;} {LATENCY_LOG} { count(); yylval.strval=yytext; return LATENCY_LOG;} diff --git a/src/core/cfg.y b/src/core/cfg.y index 3301b1a5931..ff94b604b21 100644 --- a/src/core/cfg.y +++ b/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; } diff --git a/src/core/kemi.c b/src/core/kemi.c index 625c55905c9..26e4e26b1b8 100644 --- a/src/core/kemi.c +++ b/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(""); /** * diff --git a/src/core/kemi.h b/src/core/kemi.h index 89327e11df9..db8595977d8 100644 --- a/src/core/kemi.h +++ b/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 */