diff --git a/debian/patches/series b/debian/patches/series index cebabac61..b534c8ef5 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -45,3 +45,4 @@ sipwise/dtmf-blocking.patch sipwise/media-blocking.patch sipwise/tt41650.patch sipwise/rtpengine-trickle-ice-sdp.patch +upstream/topos_execute_event_route_topos_sending.patch diff --git a/debian/patches/upstream/topos_execute_event_route_topos_sending.patch b/debian/patches/upstream/topos_execute_event_route_topos_sending.patch new file mode 100644 index 000000000..0523a950a --- /dev/null +++ b/debian/patches/upstream/topos_execute_event_route_topos_sending.patch @@ -0,0 +1,211 @@ +From 40d971af44b60b2c14dcc22693d41ec4ee4af33b Mon Sep 17 00:00:00 2001 +From: Daniel-Constantin Mierla +Date: Tue, 3 Jul 2018 08:46:58 +0200 +Subject: [PATCH] topos: execute event_route[topos:sending] with current sip + message to be sent + +- if drop is used, then the message processing with topos is skipped +- event route is executed after event_route[topos:outgoing] +- new parameter event_mode to control what event_route blocks are +executed +--- + src/modules/topos/topos_mod.c | 51 ++++++++++++++++++++++++++--------- + 1 file changed, 38 insertions(+), 13 deletions(-) + +diff --git a/src/modules/topos/topos_mod.c b/src/modules/topos/topos_mod.c +index 30090b6b16..1bd9eb6571 100644 +--- a/src/modules/topos/topos_mod.c ++++ b/src/modules/topos/topos_mod.c +@@ -84,16 +84,22 @@ extern int _tps_dialog_expire; + + int _tps_clean_interval = 60; + ++#define TPS_EVENTRT_OUTGOING 1 ++#define TPS_EVENTRT_SENDING 2 ++static int _tps_eventrt_mode = TPS_EVENTRT_OUTGOING | TPS_EVENTRT_SENDING; + static int _tps_eventrt_outgoing = -1; + static str _tps_eventrt_callback = STR_NULL; +-static str _tps_eventrt_name = str_init("topos:msg-outgoing"); ++static str _tps_eventrt_outgoing_name = str_init("topos:msg-outgoing"); ++static int _tps_eventrt_sending = -1; ++static str _tps_eventrt_sending_name = str_init("topos:msg-sending"); + + sanity_api_t scb; + + int tps_msg_received(sr_event_param_t *evp); + int tps_msg_sent(sr_event_param_t *evp); + +-static int tps_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp); ++static int tps_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp, ++ int evtype, int evidx, str *evname); + + /** module functions */ + /* Module init function prototype */ +@@ -121,6 +127,7 @@ static param_export_t params[]={ + {"dialog_expire", PARAM_INT, &_tps_dialog_expire}, + {"clean_interval", PARAM_INT, &_tps_clean_interval}, + {"event_callback", PARAM_STR, &_tps_eventrt_callback}, ++ {"event_mode", PARAM_STR, &_tps_eventrt_mode}, + {0,0,0} + }; + +@@ -146,11 +153,16 @@ struct module_exports exports= { + */ + static int mod_init(void) + { +- _tps_eventrt_outgoing = route_lookup(&event_rt, _tps_eventrt_name.s); ++ _tps_eventrt_outgoing = route_lookup(&event_rt, _tps_eventrt_outgoing_name.s); + if(_tps_eventrt_outgoing<0 + || event_rt.rlist[_tps_eventrt_outgoing]==NULL) { + _tps_eventrt_outgoing = -1; + } ++ _tps_eventrt_sending = route_lookup(&event_rt, _tps_eventrt_sending_name.s); ++ if(_tps_eventrt_sending<0 ++ || event_rt.rlist[_tps_eventrt_sending]==NULL) { ++ _tps_eventrt_sending = -1; ++ } + + if(faked_msg_init()<0) { + LM_ERR("failed to init fmsg\n"); +@@ -380,7 +392,8 @@ int tps_msg_sent(sr_event_param_t *evp) + + obuf = (str*)evp->data; + +- if(tps_execute_event_route(NULL, evp)==1) { ++ if(tps_execute_event_route(NULL, evp, TPS_EVENTRT_OUTGOING, ++ _tps_eventrt_outgoing, &_tps_eventrt_outgoing_name)==1) { + return 0; + } + +@@ -396,7 +409,14 @@ int tps_msg_sent(sr_event_param_t *evp) + goto done; + } + ++ if(tps_execute_event_route(&msg, evp, TPS_EVENTRT_SENDING, ++ _tps_eventrt_sending, &_tps_eventrt_sending_name)==1) { ++ goto done; ++ } ++ + if(msg.first_line.type==SIP_REQUEST) { ++ ++ + dialog = (get_to(&msg)->tag_value.len>0)?1:0; + + local = 0; +@@ -451,7 +471,8 @@ int tps_get_branch_expire(void) + /** + * + */ +-static int tps_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp) ++static int tps_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp, ++ int evtype, int evidx, str *evname) + { + struct sip_msg *fmsg; + struct run_act_ctx ctx; +@@ -459,7 +480,11 @@ static int tps_execute_event_route(sip_m + sr_kemi_eng_t *keng = NULL; + struct onsend_info onsnd_info = {0}; + +- if(_tps_eventrt_outgoing<0) { ++ if(!(_tps_eventrt_mode & evtype)) { ++ return 0; ++ } ++ ++ if(evidx<0) { + if(_tps_eventrt_callback.s!=NULL || _tps_eventrt_callback.len>0) { + keng = sr_kemi_eng_get(); + if(keng==NULL) { +@@ -470,12 +495,12 @@ static int tps_execute_event_route(sip_m + } + } + +- if(_tps_eventrt_outgoing<0 && keng==NULL) { ++ if(evidx<0 && keng==NULL) { + return 0; + } + +- LM_DBG("executing event_route[topos:...] (%d)\n", +- _tps_eventrt_outgoing); ++ LM_DBG("executing event_route[topos:%.*s] (%d)\n", evname->len, evname->s, ++ evidx); + fmsg = faked_msg_next(); + + onsnd_info.to = &evp->dst->to; +@@ -494,12 +519,12 @@ static int tps_execute_event_route(sip_m + rtb = get_route_type(); + set_route_type(REQUEST_ROUTE); + init_run_actions_ctx(&ctx); +- if(_tps_eventrt_outgoing>=0) { +- run_top_route(event_rt.rlist[_tps_eventrt_outgoing], fmsg, &ctx); ++ if(evidx>=0) { ++ run_top_route(event_rt.rlist[evidx], (msg)?msg:fmsg, &ctx); + } else { + if(keng!=NULL) { +- if(keng->froute(fmsg, EVENT_ROUTE, +- &_tps_eventrt_callback, &_tps_eventrt_name)<0) { ++ if(keng->froute((msg)?msg:fmsg, EVENT_ROUTE, ++ &_tps_eventrt_callback, evname)<0) { + LM_ERR("error running event route kemi callback\n"); + p_onsend=NULL; + return -1; +--- a/src/modules/topos/doc/topos_admin.xml ++++ b/src/modules/topos/doc/topos_admin.xml +@@ -257,6 +257,27 @@ end + + + ++
++ <varname>event_mode</varname> (int) ++ ++ Control what event_route blocks to be executed. It is a bitmask of: ++ 1 - execute event_route[topos:outgoing]; 2 - execute ++ event_route[topos:sending]. ++ ++ ++ ++ Default value is 3 (execute both event_route blocks). ++ ++ ++ ++ Set <varname>event_mode</varname> parameter ++ ++... ++modparam("topos", "event_mode", 2) ++... ++ ++ ++
+ +
+ Event Routes +@@ -283,6 +304,30 @@ event_route[topos:msg-outgoing] { + drop; + } + } ++... ++ ++ ++
++
++ event_route[topos:msg-sending] ++ ++ It is executed before doing topology stripping processing for a SIP ++ message to be sent out, being executed after event_route[topos:sending]. ++ ++ ++ Inside the event route the variables $sndto(ip), $sndto(port) and ++ $sndto(proto) point to the destination. The SIP message is the one ++ to be sent out. ++ ++ ++ Usage of event_route[topos:msg-sending] ++ ++... ++event_route[topos:msg-sending] { ++ if(is_request() and $fU=="alice") { ++ drop; ++ } ++} + ... + +