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.
diff --git a/modules/mi_datagram/datagram_fnc.c b/modules/mi_datagram/datagram_fnc.c index 3952580..1c97da9 100644 --- a/modules/mi_datagram/datagram_fnc.c +++ b/modules/mi_datagram/datagram_fnc.c @@ -147,19 +147,21 @@ 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); + //mi_create_dtgram_replysocket(socks->tx_sock,socket_domain, err_both); return 0; err_both: @@ -325,13 +327,13 @@ 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; + //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); + //mi_create_dtgram_replysocket(reply_sock, p->domain, err); memset(&dtgram, 0, sizeof(dtgram)); @@ -350,7 +352,8 @@ 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(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 +363,27 @@ 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(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); + //close(reply_sock); return; err: if(dtgram.start) pkg_free(dtgram.start); - close(reply_sock); + //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) + struct sockaddr *reply_addr, unsigned int reply_addr_len, int tx_sock) { struct mi_handler *hdl; void *p; @@ -410,6 +415,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 +492,8 @@ 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); + (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