[sr-dev] git:master:ac55488b: tcpops: added tcp_close_connection([conid])

Daniel-Constantin Mierla miconda at gmail.com
Tue Jun 22 19:01:56 CEST 2021


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2021-06-22T19:01:02+02:00

tcpops: added tcp_close_connection([conid])

- close connection for current sip message or by conid

---

Modified: src/modules/tcpops/tcpops_mod.c

---

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

---

diff --git a/src/modules/tcpops/tcpops_mod.c b/src/modules/tcpops/tcpops_mod.c
index 23036fd771..8590e4b6b6 100644
--- a/src/modules/tcpops/tcpops_mod.c
+++ b/src/modules/tcpops/tcpops_mod.c
@@ -39,6 +39,7 @@
 #include "../../core/mod_fix.h"
 #include "../../core/events.h"
 #include "../../core/kemi.h"
+#include "../../core/pass_fd.h"
 
 #include "tcpops.h"
 
@@ -63,6 +64,8 @@ static int w_tcp_conid_alive(sip_msg_t* msg, char* con, char *p2);
 static int w_tcp_get_conid(sip_msg_t* msg, char *paddr, char *pvn);
 static int w_tcp_set_otcpid(sip_msg_t* msg, char* conid, char *p2);
 static int w_tcp_set_otcpid_flag(sip_msg_t* msg, char* mode, char *p2);
+static int w_tcp_close_connection(sip_msg_t* msg, char* p1, char *p2);
+static int w_tcp_close_connection_id(sip_msg_t* msg, char* pconid, char *p2);
 
 str tcpops_event_callback = STR_NULL;
 
@@ -103,6 +106,10 @@ static cmd_export_t cmds[]={
 			fixup_igp_all, fixup_free_igp_all, ANY_ROUTE},
 	{"tcp_set_otcpid_flag", (cmd_function)w_tcp_set_otcpid_flag, 1,
 			fixup_igp_all, fixup_free_igp_all, ANY_ROUTE},
+	{"tcp_close_connection", (cmd_function)w_tcp_close_connection, 0,
+			0, 0, ANY_ROUTE},
+	{"tcp_close_connection", (cmd_function)w_tcp_close_connection_id, 1,
+			fixup_igp_all, fixup_free_igp_all, ANY_ROUTE},
 	{0, 0, 0, 0, 0, 0}
 };
 
@@ -665,6 +672,65 @@ static int w_tcp_set_otcpid_flag(sip_msg_t* msg, char* mode, char *p2)
 	return ki_tcp_set_otcpid_flag(msg, vmode);
 }
 
+/*!
+ * \brief Close a TCP connection
+ *
+ * Requests the TCP main process to close the specified TCP connection
+ * \param conid the internal connection ID
+ */
+static int ki_tcp_close_connection_id(sip_msg_t *msg, int conid)
+{
+	struct tcp_connection *con;
+	long mcmd[2];
+	int n;
+
+	if ((con = tcpconn_get(conid, 0, 0, 0, 0))) {
+		mcmd[0] = (long)con;
+		mcmd[1] = CONN_EOF;
+
+		con->send_flags.f |= SND_F_CON_CLOSE;
+		con->flags |= F_CONN_FORCE_EOF;
+
+		n = send_all(unix_tcp_sock, mcmd, sizeof(mcmd));
+		if (unlikely(n <= 0)){
+			LM_ERR("failed to send close request: %s (%d)\n", strerror(errno), errno);
+			return -2;
+		}
+		return 1;
+	}
+	return -1;
+}
+
+/**
+ *
+ */
+static int ki_tcp_close_connection(sip_msg_t *msg)
+{
+	return ki_tcp_close_connection_id(msg, msg->rcv.proto_reserved1);
+}
+
+/**
+ *
+ */
+static int w_tcp_close_connection_id(sip_msg_t* msg, char* pconid, char *p2)
+{
+	int conid = 0;
+
+	if(fixup_get_ivalue(msg, (gparam_t*)pconid, &conid)<0) {
+		LM_ERR("failed to get conid parameter\n");
+		return -1;
+	}
+	return ki_tcp_close_connection_id(msg, conid);
+}
+
+/**
+ *
+ */
+static int w_tcp_close_connection(sip_msg_t* msg, char* p1, char *p2)
+{
+	return ki_tcp_close_connection_id(msg, msg->rcv.proto_reserved1);
+}
+
 /**
  *
  */
@@ -799,6 +865,16 @@ static sr_kemi_t sr_kemi_tcpops_exports[] = {
 		{ SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE,
 			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
 	},
+	{ str_init("tcpops"), str_init("tcp_close_connection"),
+		SR_KEMIP_INT, ki_tcp_close_connection,
+		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("tcpops"), str_init("tcp_close_connection_id"),
+		SR_KEMIP_INT, ki_tcp_close_connection_id,
+		{ SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
 
 	{ {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } }
 };




More information about the sr-dev mailing list