Module: kamailio
Branch: master
Commit: f39eca3d9926372dd005ed60418f55a29a17a715
URL: 
https://github.com/kamailio/kamailio/commit/f39eca3d9926372dd005ed60418f55a29a17a715

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2020-07-13T12:24:44+02:00

siptrace: exec event_route[siptrace:msg] on message replication with core events

- new parameter evcb_msg to set the kemi function name to be executed
for this event callback
- alternative to GH #2374

---

Modified: src/modules/siptrace/siptrace.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/f39eca3d9926372dd005ed60418f55a29a17a715.diff
Patch: 
https://github.com/kamailio/kamailio/commit/f39eca3d9926372dd005ed60418f55a29a17a715.patch

---

diff --git a/src/modules/siptrace/siptrace.c b/src/modules/siptrace/siptrace.c
index 1368e954a6..1b7b014d0e 100644
--- a/src/modules/siptrace/siptrace.c
+++ b/src/modules/siptrace/siptrace.c
@@ -178,6 +178,9 @@ socket_info_t *trace_send_sock_info = 0;
 str trace_dup_uri_str = {0, 0};
 sip_uri_t *trace_dup_uri = 0;
 
+static str _siptrace_evcb_msg = STR_NULL;
+static int _siptrace_evrt_msg_idx = -1;
+
 static unsigned short traced_user_avp_type = 0;
 static int_str traced_user_avp;
 static str traced_user_avp_str = {NULL, 0};
@@ -254,6 +257,7 @@ static param_export_t params[] = {
        {"trace_db_mode", INT_PARAM, &trace_db_mode},
        {"trace_init_mode", PARAM_INT, &_siptrace_init_mode},
        {"trace_mode", PARAM_INT, &_siptrace_mode},
+       {"evcb_msg", PARAM_STR, &_siptrace_evcb_msg},
        {0, 0, 0}
 };
 /* clang-format on */
@@ -302,6 +306,8 @@ static int mod_init(void)
        }
 #endif
 
+       _siptrace_evrt_msg_idx = route_lookup(&event_rt, "siptrace:msg");
+
        if(trace_db_delayed!=0) {
                trace_db_mode = 1;
        }
@@ -2017,6 +2023,56 @@ static void trace_free_info(void* trace_info)
        shm_free(trace_info);
 }
 
+static int siptrace_exec_evcb_msg(siptrace_data_t *sto)
+{
+       int backup_rt;
+       run_act_ctx_t ctx;
+       run_act_ctx_t *bctx;
+       sr_kemi_eng_t *keng = NULL;
+       str evname = str_init("siptrace:msg");
+       sip_msg_t msg;
+
+       if(_siptrace_evrt_msg_idx < 0 && _siptrace_evcb_msg.len<=0) {
+               return 0;
+       }
+
+       if(sto == NULL || sto->body.s == NULL || sto->body.len <= 0) {
+               return -1;
+       }
+
+       memset(&msg, 0, sizeof(sip_msg_t));
+       msg.buf = sto->body.s;
+       msg.len = sto->body.len;
+       if(parse_msg(msg.buf, msg.len, &msg) != 0) {
+               LM_DBG("parse_msg failed\n");
+               return -1;
+       }
+
+       backup_rt = get_route_type();
+       set_route_type(EVENT_ROUTE);
+       init_run_actions_ctx(&ctx);
+
+       if(_siptrace_evrt_msg_idx>=0) {
+               run_top_route(event_rt.rlist[_siptrace_evrt_msg_idx], &msg, 0);
+       } else {
+               keng = sr_kemi_eng_get();
+               if (keng!=NULL) {
+                       bctx = sr_kemi_act_ctx_get();
+                       sr_kemi_act_ctx_set(&ctx);
+                       (void)sr_kemi_route(keng, &msg, EVENT_ROUTE,
+                                               &_siptrace_evcb_msg, &evname);
+                       sr_kemi_act_ctx_set(bctx);
+               }
+       }
+
+       free_sip_msg(&msg);
+       set_route_type(backup_rt);
+       if(ctx.run_flags & DROP_R_F) {
+               return DROP_R_F;
+       }
+       return RETURN_R_F;
+}
+
 /**
  *
  */
@@ -2067,6 +2123,11 @@ int siptrace_net_data_recv(sr_event_param_t *evp)
 
        sto.dir = "in";
 
+       if(siptrace_exec_evcb_msg(&sto) == DROP_R_F) {
+               /* drop() used in event_route - all done */
+               return 0;
+       }
+
        if(_siptrace_mode & SIPTRACE_MODE_HEP) {
                trace_send_hep_duplicate(&sto.body, &sto.fromip, &sto.toip, 
NULL, NULL);
        }
@@ -2187,6 +2248,11 @@ int siptrace_net_data_send(sr_event_param_t *evp)
 
        sto.dir = "out";
 
+       if(siptrace_exec_evcb_msg(&sto) == DROP_R_F) {
+               /* drop() used in event_route - all done */
+               return 0;
+       }
+
        if(_siptrace_mode & SIPTRACE_MODE_HEP) {
                trace_send_hep_duplicate(&sto.body, &sto.fromip, &sto.toip, 
NULL, NULL);
        }


_______________________________________________
Kamailio (SER) - Development Mailing List
[email protected]
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to