sl: added kemi callbacks for event routes
authorDaniel-Constantin Mierla <miconda@gmail.com>
Wed, 28 Aug 2019 15:55:15 +0000 (17:55 +0200)
committerDaniel-Constantin Mierla <miconda@gmail.com>
Wed, 28 Aug 2019 18:55:39 +0000 (20:55 +0200)
- new parameters
  * event_callback_fl_ack - name of callback function for filtered-ack
  * event_callback_lres_sent - name of callback function for
  local-response

src/modules/sl/sl.c
src/modules/sl/sl_funcs.c

index 10361b1..930a576 100644 (file)
@@ -66,6 +66,9 @@ static str default_reason = STR_STATIC_INIT("Internal Server Error");
 static int sl_bind_tm = 1;
 static struct tm_binds tmb;
 
+str _sl_event_callback_fl_ack = STR_NULL;
+str _sl_event_callback_lres_sent = STR_NULL;
+
 static int w_sl_send_reply(struct sip_msg* msg, char* str1, char* str2);
 static int w_send_reply(struct sip_msg* msg, char* str1, char* str2);
 static int w_sl_reply_error(struct sip_msg* msg, char* str1, char* str2);
@@ -117,6 +120,8 @@ static param_export_t params[] = {
        {"default_reason", PARAM_STR, &default_reason},
        {"bind_tm",        PARAM_INT, &sl_bind_tm},
        {"rich_redirect",  PARAM_INT, &sl_rich_redirect},
+       {"event_callback_fl_ack",    PARAM_STR, &_sl_event_callback_fl_ack},
+       {"event_callback_lres_sent", PARAM_STR, &_sl_event_callback_lres_sent},
 
        {0, 0, 0}
 };
index 7cdce0c..83cf15b 100644 (file)
@@ -37,6 +37,7 @@
 #include "../../core/route.h"
 #include "../../core/receive.h"
 #include "../../core/onsend.h"
+#include "../../core/kemi.h"
 #include "sl_stats.h"
 #include "sl_funcs.h"
 #include "sl.h"
@@ -58,6 +59,9 @@ static int _sl_evrt_local_response = -1; /* default disabled */
 /* send path and flags in 3xx class reply */
 int sl_rich_redirect = 0;
 
+extern str _sl_event_callback_fl_ack;
+extern str _sl_event_callback_lres_sent;
+
 /*!
  * lookup sl event routes
  */
@@ -131,6 +135,9 @@ int sl_reply_helper(struct sip_msg *msg, int code, char *reason, str *tag)
 
        int backup_rt;
        struct run_act_ctx ctx;
+       run_act_ctx_t *bctx;
+       sr_kemi_eng_t *keng = NULL;
+       str evname = str_init("sl:local-response");
        struct sip_msg pmsg;
 
        if (msg->first_line.u.request.method_value==METHOD_ACK)
@@ -206,7 +213,8 @@ int sl_reply_helper(struct sip_msg *msg, int code, char *reason, str *tag)
        ret = msg_send(&dst, buf.s, buf.len);
        mhomed=backup_mhomed;
 
-       if (unlikely(_sl_evrt_local_response >= 0))
+       keng = sr_kemi_eng_get();
+       if (_sl_evrt_local_response >= 0 || keng!=NULL)
        {
                if (likely(build_sip_msg_from_buf(&pmsg, buf.s, buf.len,
                                inc_msg_no()) == 0))
@@ -279,7 +287,16 @@ int sl_reply_helper(struct sip_msg *msg, int code, char *reason, str *tag)
                        backup_rt = get_route_type();
                        set_route_type(LOCAL_ROUTE);
                        init_run_actions_ctx(&ctx);
-                       run_top_route(event_rt.rlist[_sl_evrt_local_response], &pmsg, 0);
+
+                       if(_sl_evrt_local_response>=0) {
+                               run_top_route(event_rt.rlist[_sl_evrt_local_response], &pmsg, 0);
+                       } else if (keng!=NULL) {
+                               bctx = sr_kemi_act_ctx_get();
+                               sr_kemi_act_ctx_set(&ctx);
+                               sr_kemi_route(keng, msg, EVENT_ROUTE,
+                                                       &_sl_event_callback_lres_sent, &evname);
+                               sr_kemi_act_ctx_set(bctx);
+                       }
                        set_route_type(backup_rt);
                        p_onsend=0;
 
@@ -390,6 +407,10 @@ int sl_reply_error(struct sip_msg *msg )
 int sl_filter_ACK(struct sip_msg *msg, unsigned int flags, void *bar )
 {
        str *tag_str;
+       run_act_ctx_t ctx;
+       run_act_ctx_t *bctx;
+       sr_kemi_eng_t *keng = NULL;
+       str evname = str_init("sl:filtered-ack");
 
        if (msg->first_line.u.request.method_value!=METHOD_ACK)
                goto pass_it;
@@ -419,9 +440,17 @@ int sl_filter_ACK(struct sip_msg *msg, unsigned int flags, void *bar )
                                LM_DBG("SL local ACK found -> dropping it!\n" );
                                update_sl_filtered_acks();
                                sl_run_callbacks(SLCB_ACK_FILTERED, msg, 0, 0, 0, 0);
+                               keng = sr_kemi_eng_get();
                                if(unlikely(_sl_filtered_ack_route>=0)) {
                                        run_top_route(event_rt.rlist[_sl_filtered_ack_route],
                                                        msg, 0);
+                               } else if(keng!=NULL) {
+                                       init_run_actions_ctx(&ctx);
+                                       bctx = sr_kemi_act_ctx_get();
+                                       sr_kemi_act_ctx_set(&ctx);
+                                       sr_kemi_route(keng, msg, EVENT_ROUTE,
+                                                       &_sl_event_callback_fl_ack, &evname);
+                                       sr_kemi_act_ctx_set(bctx);
                                }
                                return 0;
                        }