[sr-dev] git:master:ce661240: tm: execute on_sl_reply callback via kemi

Daniel-Constantin Mierla miconda at gmail.com
Mon Aug 26 15:53:15 CEST 2019


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2019-08-26T15:49:42+02:00

tm: execute on_sl_reply callback via kemi

- the value of the parameter on_sl_reply has to be the kemi function
name

---

Modified: src/modules/tm/t_reply.c
Modified: src/modules/tm/tm.c

---

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

---

diff --git a/src/modules/tm/t_reply.c b/src/modules/tm/t_reply.c
index 1fa7f9dda8..30006ae8a6 100644
--- a/src/modules/tm/t_reply.c
+++ b/src/modules/tm/t_reply.c
@@ -2162,7 +2162,6 @@ enum rps local_reply( struct cell *t, struct sip_msg *p_msg, int branch,
  */
 int reply_received( struct sip_msg  *p_msg )
 {
-
 	int msg_status;
 	int last_uac_status;
 	char *ack;
@@ -2192,6 +2191,8 @@ int reply_received( struct sip_msg  *p_msg )
 	struct run_act_ctx ctx;
 	struct run_act_ctx *bctx;
 	sr_kemi_eng_t *keng = NULL;
+	int ret;
+	str evname = str_init("on_sl_reply");
 
 	/* make sure we know the associated transaction ... */
 	branch = T_BR_UNDEFINED;
@@ -2566,17 +2567,40 @@ int reply_received( struct sip_msg  *p_msg )
 
 trans_not_found:
 	/* transaction context was not found */
-	if (goto_on_sl_reply) {
-		/* The script writer has a chance to decide whether to
-		 * forward the reply or not.
-		 * Pre- and post-script callbacks have already
-		 * been execueted by the core. (Miklos)
-		 */
-		return run_top_route(onreply_rt.rlist[goto_on_sl_reply], p_msg, 0);
-	} else {
-		/* let the core forward the reply */
-		return 1;
+ 	if(on_sl_reply_name.s!=NULL && on_sl_reply_name.len>0) {
+		keng = sr_kemi_eng_get();
+		if(keng==NULL) {
+			if (goto_on_sl_reply) {
+				/* The script writer has a chance to decide whether to
+				 * forward the reply or not.
+				 * Pre- and post-script callbacks have already
+				 * been execueted by the core. (Miklos)
+			 */
+				return run_top_route(onreply_rt.rlist[goto_on_sl_reply], p_msg, 0);
+			} else {
+				/* let the core forward the reply */
+				return 1;
+			}
+		} else {
+			bctx = sr_kemi_act_ctx_get();
+			init_run_actions_ctx(&ctx);
+			sr_kemi_act_ctx_set(&ctx);
+			ret = sr_kemi_ctx_route(keng, &ctx, p_msg, EVENT_ROUTE,
+						&on_sl_reply_name, &evname);
+			sr_kemi_act_ctx_set(bctx);
+			if(ret<0) {
+				LM_ERR("error running on sl reply callback\n");
+				return -1;
+			}
+			if(unlikely(ctx.run_flags & DROP_R_F)) {
+				LM_DBG("drop flag set - skip forwarding the reply\n");
+				return 0;
+			}
+			/* let the core forward the reply */
+			return 1;
+		}
 	}
+	return 1;
 }
 
 
diff --git a/src/modules/tm/tm.c b/src/modules/tm/tm.c
index 105bbaf1f2..99e20afcd3 100644
--- a/src/modules/tm/tm.c
+++ b/src/modules/tm/tm.c
@@ -689,6 +689,8 @@ static int script_init( struct sip_msg *foo, unsigned int flags, void *bar)
 
 static int mod_init(void)
 {
+	sr_kemi_eng_t *keng = NULL;
+
 	DBG( "TM - (sizeof cell=%ld, sip_msg=%ld) initializing...\n",
 			(long)sizeof(struct cell), (long)sizeof(struct sip_msg));
 
@@ -701,10 +703,13 @@ static int mod_init(void)
 	}
 
 	if(on_sl_reply_name.s!=NULL && on_sl_reply_name.len>0) {
-		goto_on_sl_reply=route_get(&onreply_rt, on_sl_reply_name.s);
-		if (goto_on_sl_reply==-1){
-			LM_ERR("route get failed for on_sl_reply\n");
-			return -1;
+		keng = sr_kemi_eng_get();
+		if(keng==NULL) {
+			goto_on_sl_reply=route_get(&onreply_rt, on_sl_reply_name.s);
+			if (goto_on_sl_reply==-1){
+				LM_ERR("route get failed for on_sl_reply\n");
+				return -1;
+			}
 		}
 	}
 	if (init_callid() < 0) {




More information about the sr-dev mailing list