Please find attached updated patch as requested.

On Fri, Mar 28, 2014 at 8:49 PM, Daniel-Constantin Mierla <mico...@gmail.com
> wrote:

> Thanks for the patch. Can you resend it without commented code? Just
> remove the lines that are no longer used, to have clean code.
>
> Cheers,
> Daniel
>
>
> On 28/03/14 01:29, Muhammad Shahzad wrote:
>
>> Hi,
>>
>> After wasting most of the day trying to make mi_datagram over UDP socket
>> work. I eventually realize that it does asymmetric UDP communication, which
>> creates a lot of trouble for writing a useful MI script using PERL or
>> Python etc.
>>
>> Anyhow, i go through the module code and was able to write a patch for
>> symmetric UDP communication using mi_datagram.
>>
>> I have tested the patch using both Kamailio 4.1 and trunk branches and it
>> seems to compile and run flawlessly.
>>
>> I am attaching here with this patch for Kamailio community. It would be
>> great if Kamailio developers would review and commit this patch to source
>> trunk.
>>
>> Thank you.
>>
>>
>>
> --
> Daniel-Constantin Mierla - http://www.asipto.com
> http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
> Kamailio World Conference - April 2-4, 2014, Berlin, Germany
> http://www.kamailioworld.com
>
>
diff --git a/modules/mi_datagram/datagram_fnc.c b/modules/mi_datagram/datagram_fnc.c
index 3952580..5c6c546 100644
--- a/modules/mi_datagram/datagram_fnc.c
+++ b/modules/mi_datagram/datagram_fnc.c
@@ -147,19 +147,20 @@ int  mi_init_datagram_server(sockaddr_dtgram *addr, unsigned int socket_domain,
 				LM_ERR("bind: %s\n", strerror(errno));
 				goto err_rx;
 			}
+			socks->tx_sock = socks->rx_sock;
 			break;
 	case AF_INET6: 
 			if(bind(socks->rx_sock, (struct sockaddr*)&addr->udp_addr.sin6, sizeof(addr->udp_addr)) < 0) {
 				LM_ERR("bind: %s\n", strerror(errno));
 				goto err_rx;
 			}
+			socks->tx_sock = socks->rx_sock;
 			break;
 	default:
 			LM_ERR("domain not supported\n");
 			goto err_both;
 
 	}
-	mi_create_dtgram_replysocket(socks->tx_sock,socket_domain, err_both);
 
 	return 0;
 err_both:
@@ -325,15 +326,12 @@ static void datagram_close_async(struct mi_root *mi_rpl,struct mi_handler *hdl,
 	datagram_stream dtgram;
 	int ret;
 	my_socket_address *p;
-	int reply_sock, flags;
 
 	p = (my_socket_address *)hdl->param;
 
 	LM_DBG("the socket domain is %i and af_local is %i\n", p->domain, AF_LOCAL);
 
-	mi_create_dtgram_replysocket(reply_sock, p->domain, err);
-
-        memset(&dtgram, 0, sizeof(dtgram));
+	memset(&dtgram, 0, sizeof(dtgram));
 
 	if (mi_rpl!=0) {
 		/*allocate the response datagram*/	
@@ -350,7 +348,7 @@ static void datagram_close_async(struct mi_root *mi_rpl,struct mi_handler *hdl,
 		LM_DBG("the response is %s", dtgram.start);
 
 		/*send the response*/
-		ret = mi_send_dgram(reply_sock, dtgram.start, dtgram.current - dtgram.start, 
+		ret = mi_send_dgram(p->tx_sock, dtgram.start, dtgram.current - dtgram.start, 
 			(struct sockaddr *)&p->address, p->address_len, mi_socket_timeout);
 		if (ret>0) {
 			LM_DBG("the response: %s has been sent in %i octets\n", dtgram.start, ret);
@@ -360,25 +358,23 @@ static void datagram_close_async(struct mi_root *mi_rpl,struct mi_handler *hdl,
 		free_mi_tree(mi_rpl);
 		pkg_free(dtgram.start);
 	} else if (done) {
-		mi_send_dgram(reply_sock, MI_COMMAND_FAILED, MI_COMMAND_FAILED_LEN,
+		mi_send_dgram(p->tx_sock, MI_COMMAND_FAILED, MI_COMMAND_FAILED_LEN,
 				(struct sockaddr*)&reply_addr, reply_addr_len, mi_socket_timeout);
 		free_async_handler( hdl );
 	}
 
-	close(reply_sock);
 	return;
 
 err:
 	if(dtgram.start)
 		pkg_free(dtgram.start);
-	close(reply_sock);
 	return;
 }
 
 
 
 static inline struct mi_handler *build_async_handler(unsigned int sock_domain,
-			struct sockaddr *reply_addr, unsigned int reply_addr_len)
+			struct sockaddr *reply_addr, unsigned int reply_addr_len, int tx_sock)
 {
 	struct mi_handler *hdl;
 	void *p;
@@ -410,6 +406,7 @@ static inline struct mi_handler *build_async_handler(unsigned int sock_domain,
 	}
 	repl_address->domain = sock_domain;
 	repl_address->address_len  = reply_addr_len;
+	repl_address->tx_sock = tx_sock;
 
 	hdl->handler_f = datagram_close_async;
 	hdl->param = (void*)repl_address;
@@ -486,7 +483,7 @@ void mi_datagram_server(int rx_sock, int tx_sock)
 		/* if asyncron cmd, build the async handler */
 		if (f->flags&MI_ASYNC_RPL_FLAG) {
 			hdl = build_async_handler(mi_socket_domain,
-					(struct sockaddr* )&reply_addr, reply_addr_len);
+					(struct sockaddr* )&reply_addr, reply_addr_len, tx_sock);
 			if (hdl==0) {
 				LM_ERR("failed to build async handler\n");
 				mi_send_dgram(tx_sock, MI_INTERNAL_ERROR,
diff --git a/modules/mi_datagram/mi_datagram.h b/modules/mi_datagram/mi_datagram.h
index 35a25e4..d9f9f34 100644
--- a/modules/mi_datagram/mi_datagram.h
+++ b/modules/mi_datagram/mi_datagram.h
@@ -65,6 +65,7 @@ typedef struct{
 	my_sock_address address;
 	unsigned int domain;
 	int address_len;
+	int tx_sock;
 } my_socket_address;
 
 
_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users

Reply via email to