Hi,

In response to the previous mail, I have attempted to create a suitable patch for calling onsend_route in the replies. However, I need some input from somebody more knowledgeable.

You will find I changed the following code locations:

forward.c  -> do_forward_reply() function
sl_funcs.c -> sl_reply_helper() function
t_reply.c  -> _reply_light() function

Am I missing out any location where the onsend function should be called? I am particularly thinking of such cases as relayed replies, retransmitted replies (t_retransmit_reply).

Additionally, in t_reply.c, I force the parsing of the message buffer into a sip_msg; do you see this as a perceivable slowdown in general kamailio performance?

Any input is valuable.

Thank you,
Lucian

On 08/04/2014 05:16 PM, Daniel-Constantin Mierla wrote:
Hello,

the reason for onsend_route was to get access to outgoing buffer (what is sent to network) as well as the local socket and remote socket attributes (proto, ip, port). There is no option to make changes on the outgoing buffer anymore, the action that could be done is stop sending to the network (discarding).

It was done for requests, but there were discussions to make this available for replies as well. The code you provided in not in public repository, but it seems it aims for that (at least for stateless replies). The onsend callback should be indeed called before msg_send() to get the behavior expected (to be able to drop the reply, for example).

If you get a patch to have the onsend_route for replies, it would be welcomed on the public repo.

Cheers,
Daniel

On 04/08/14 15:57, Lucian Balaceanu wrote:
Hi,

I am currently trying to understand some kamailio code and came across this construct inside do_forward_reply() function (code in italics is not part of upstream kamailio):

*do_forward_reply(struct sip_msg* msg, int mode){*
    ...
    ...
    apply_force_send_socket(&dst, msg);

    if (msg_send(&dst, new_buf, new_len)<0)
    {
        STATS_RPL_FWD_DROP();
        goto error;
    }
/*    ...
    dst.send_sock=get_send_socket(msg, &dst.to, dst.proto);
    ...
    run_onsend(msg, &dst, new_buf, new_len);*/
*}*

Is there really a sense in calling run_onsend() after the msg_send() function? In my understanding (based on onsend_route uasge) run_onsend() is used to make some last minute changes before a message is sent to a destination.

Thank you,
Lucian Balaceanu


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

--
Daniel-Constantin Mierla -http://www.asipto.com
http://twitter.com/#!/miconda  -http://www.linkedin.com/in/miconda


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

>From f807c41f382cbb988d73fe97091e11d36a689bcb Mon Sep 17 00:00:00 2001
From: lucian balanceanu <[email protected]>
Date: Wed, 27 Aug 2014 14:06:13 +0300
Subject: [PATCH] core: onsend_route also called for replies

---
 forward.c             |   21 +++++++++++++++------
 modules/sl/sl_funcs.c |   12 ++++++++++++
 modules/tm/t_reply.c  |   36 +++++++++++++++++++++++++++++++++---
 3 files changed, 60 insertions(+), 9 deletions(-)

diff --git a/forward.c b/forward.c
index 849325f..dab5897 100644
--- a/forward.c
+++ b/forward.c
@@ -777,6 +777,7 @@ static int do_forward_reply(struct sip_msg* msg, int mode)
 #endif
 	init_dest_info(&dst);
 	new_buf=0;
+	struct ip_addr ip; /* debugging */
 	/*check if first via host = us */
 	if (check_via){
 		if (check_self(&msg->via1->host,
@@ -851,11 +852,6 @@ static int do_forward_reply(struct sip_msg* msg, int mode)
 
 	apply_force_send_socket(&dst, msg);
 
-	if (msg_send(&dst, new_buf, new_len)<0)
-	{
-		STATS_RPL_FWD_DROP();
-		goto error;
-	}
 	/* call onsend_route */
 	if(dst.send_sock == NULL) {
 		dst.send_sock=get_send_socket(msg, &dst.to, dst.proto);
@@ -864,7 +860,20 @@ static int do_forward_reply(struct sip_msg* msg, int mode)
 			goto done;
 		}
 	}
-	run_onsend(msg, &dst, new_buf, new_len);
+
+	if (run_onsend(msg, &dst, new_buf, new_len)==0){
+		su2ip_addr(&ip, &(dst.to));
+		LOG(L_ERR, "forward_reply: reply to %s:%d(%d) dropped"
+				" (onsend_route)\n", ip_addr2a(&ip),
+					su_getport(&(dst.to)), dst.proto);
+		goto error; /* error ? */
+	}
+
+	if (msg_send(&dst, new_buf, new_len)<0)
+	{
+		STATS_RPL_FWD_DROP();
+		goto error;
+	}
 
 	done:
 #ifdef STATS
diff --git a/modules/sl/sl_funcs.c b/modules/sl/sl_funcs.c
index bfaa76f..a56aae9 100644
--- a/modules/sl/sl_funcs.c
+++ b/modules/sl/sl_funcs.c
@@ -149,6 +149,7 @@ int sl_reply_helper(struct sip_msg *msg, int code, char *reason, str *tag)
 	struct bookmark dummy_bm;
 	int backup_mhomed, ret;
 	str text;
+	struct ip_addr ip; /* debugging */
 
 	int backup_rt;
 	struct run_act_ctx ctx;
@@ -221,6 +222,17 @@ int sl_reply_helper(struct sip_msg *msg, int code, char *reason, str *tag)
 	dst.comp=msg->via1->comp_no;
 #endif
 	dst.send_flags=msg->rpl_send_flags;
+
+	//
+	//
+	if (run_onsend(msg, &dst, buf.s, buf.len)==0){
+		su2ip_addr(&ip, &(dst.to));
+		LOG(L_ERR, "forward_reply: reply to %s:%d(%d) dropped"
+				" (onsend_route)\n", ip_addr2a(&ip),
+					su_getport(&(dst.to)), dst.proto);
+		goto error; /* error ? */
+	}
+
 	ret = msg_send(&dst, buf.s, buf.len);
 	mhomed=backup_mhomed;
 
diff --git a/modules/tm/t_reply.c b/modules/tm/t_reply.c
index f258c75..eccd0e7 100644
--- a/modules/tm/t_reply.c
+++ b/modules/tm/t_reply.c
@@ -595,6 +595,8 @@ static int _reply_light( struct cell *trans, char* buf, unsigned int len,
 	int rt, backup_rt;
 	struct run_act_ctx ctx;
 	struct sip_msg pmsg;
+	int msg_built = 0;
+	struct ip_addr ip; /* debugging */
 
 	init_cancel_info(&cancel_data);
 	if (!buf)
@@ -682,6 +684,31 @@ static int _reply_light( struct cell *trans, char* buf, unsigned int len,
 	if (unlikely(!trans->uas.response.dst.send_sock)) {
 		LOG(L_ERR, "ERROR: _reply_light: no resolved dst to send reply to\n");
 	} else {
+
+		/* call onsend_route */
+		/*
+		if(dst.send_sock == NULL) {
+			dst.send_sock=get_send_socket(msg, &dst.to, dst.proto);
+			if (dst.send_sock==0){
+				LOG(L_ERR, "forward_reply: ERROR: cannot forward reply\n");
+				goto done;
+			}
+		}
+		*/
+		if (likely(build_sip_msg_from_buf(&pmsg, buf, len, inc_msg_no()) == 0))
+		{
+			msg_built = 1;
+			if (run_onsend(&pmsg, &rb->dst, buf, len)==0){
+				su2ip_addr(&ip, &(rb->dst.to));
+				LOG(L_INFO, "_reply_light: reply to %s:%d(%d) dropped"
+						" (onsend_route)\n", ip_addr2a(&ip),
+							su_getport(&(rb->dst.to)), rb->dst.proto);
+				free_sip_msg(&pmsg);
+				//TODO - should this be error3?
+				goto error2; /* error? */
+			}
+		}
+
 		if (likely(SEND_PR_BUFFER( rb, buf, len )>=0)){
 			if (unlikely(code>=200 && !is_local(trans) &&
 						has_tran_tmcbs(trans, TMCB_RESPONSE_OUT)) ){
@@ -702,7 +729,7 @@ static int _reply_light( struct cell *trans, char* buf, unsigned int len,
 			rt = route_lookup(&event_rt, "tm:local-response");
 			if (unlikely(rt >= 0 && event_rt.rlist[rt] != NULL))
 			{
-				if (likely(build_sip_msg_from_buf(&pmsg, buf, len, inc_msg_no()) == 0))
+				if (likely(msg_built == 1))
 				{
 					struct onsend_info onsnd_info;
 
@@ -718,15 +745,18 @@ static int _reply_light( struct cell *trans, char* buf, unsigned int len,
 					run_top_route(event_rt.rlist[rt], &pmsg, 0);
 					set_route_type(backup_rt);
 					p_onsend=0;
-
-					free_sip_msg(&pmsg);
 				}
 			}
 
 		}
+
+		if (msg_built)
+			free_sip_msg(&pmsg);
+
 		DBG("DEBUG: reply sent out. buf=%p: %.20s..., shmem=%p: %.20s\n",
 			buf, buf, rb->buffer, rb->buffer );
 	}
+
 	if (code>=200) {
 		/* start wait timer after finishing with t so that this function can
 		 * be safely called from a fr_timer which allows quick timer dels
-- 
1.7.4.1

_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to