[sr-dev] git:master: core: added core.tcp_list rpc command

Daniel-Constantin Mierla miconda at gmail.com
Tue Dec 13 15:03:08 CET 2011


Module: sip-router
Branch: master
Commit: e567b3fde3165fd752d72a86de3b13d5bdf76ddd
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=e567b3fde3165fd752d72a86de3b13d5bdf76ddd

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Tue Dec 13 15:02:02 2011 +0100

core: added core.tcp_list rpc command

- print details about tcp connections

---

 core_cmd.c |   85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 85 insertions(+), 0 deletions(-)

diff --git a/core_cmd.c b/core_cmd.c
index c023b59..6f55e12b 100644
--- a/core_cmd.c
+++ b/core_cmd.c
@@ -40,6 +40,7 @@
 #include "pt.h"
 #include "ut.h"
 #include "tcp_info.h"
+#include "tcp_conn.h"
 #include "tcp_options.h"
 #include "core_cmd.h"
 #include "cfg_core.h"
@@ -739,6 +740,89 @@ static void core_tcp_options(rpc_t* rpc, void* c)
 }
 
 
+static const char* core_tcp_list_doc[] = {
+	"Returns tcp connections details.",    /* Documentation string */
+	0                               /* Method signature(s) */
+};
+
+extern gen_lock_t* tcpconn_lock;
+extern struct tcp_connection** tcpconn_id_hash;
+
+static void core_tcp_list(rpc_t* rpc, void* c)
+{
+#ifdef USE_TCP
+	char src_ip[IP_ADDR_MAX_STR_SIZE];
+	char dst_ip[IP_ADDR_MAX_STR_SIZE];
+	void* handle;
+	char* state;
+	char* type;
+	struct tcp_connection* con;
+	int i, len, timeout;
+
+	TCPCONN_LOCK;
+	for(i = 0; i < TCP_ID_HASH_SIZE; i++) {
+		for (con = tcpconn_id_hash[i]; con; con = con->id_next) {
+			rpc->add(c, "{", &handle);
+			/* tcp data */
+			if (con->rcv.proto == PROTO_TCP)
+				type = "TCP";
+			else if (con->rcv.proto == PROTO_TCP)
+				type = "TLS";
+			else
+				type = "UNKNOWN";
+
+			if ((len = ip_addr2sbuf(&con->rcv.src_ip, src_ip, sizeof(src_ip)))
+					== 0)
+				BUG("failed to convert source ip");
+			src_ip[len] = 0;
+			if ((len = ip_addr2sbuf(&con->rcv.dst_ip, dst_ip, sizeof(dst_ip)))
+					== 0)
+				BUG("failed to convert destination ip");
+			dst_ip[len] = 0;
+			timeout = TICKS_TO_S(con->timeout - get_ticks_raw());
+			switch(con->state) {
+				case S_CONN_ERROR:
+					state = "CONN_ERROR";
+				break;
+				case S_CONN_BAD:
+					state = "CONN_BAD";
+				break;
+				case S_CONN_OK:
+					state = "CONN_OK";
+				break;
+				case S_CONN_INIT:
+					state = "CONN_INIT";
+				break;
+				case S_CONN_EOF:
+					state = "CONN_EOF";
+				break;
+				case S_CONN_ACCEPT:
+					state = "CONN_ACCEPT";
+				break;
+				case S_CONN_CONNECT:
+					state = "CONN_CONNECT";
+				break;
+				default:
+					state = "UNKNOWN";
+			}
+			rpc->struct_add(handle, "dssdsdsd",
+					"id", con->id,
+					"type", type,
+					"state", state,
+					"timeout", timeout,
+					"src_ip", src_ip,
+					"src_port", con->rcv.src_port,
+					"dst_ip", dst_ip,
+					"dst_port", con->rcv.dst_port);
+		}
+	}
+	TCPCONN_UNLOCK;
+#else
+	rpc->fault(c, 500, "tcp support not compiled");
+#endif
+}
+
+
 
 static const char* core_sctp_options_doc[] = {
 	"Returns active sctp options. With one parameter"
@@ -920,6 +1004,7 @@ static rpc_export_t core_rpc_methods[] = {
 #endif
 	{"core.tcp_info",          core_tcpinfo,           core_tcpinfo_doc,    0},
 	{"core.tcp_options",       core_tcp_options,       core_tcp_options_doc,0},
+	{"core.tcp_list",          core_tcp_list,          core_tcp_list_doc,0},
 	{"core.sctp_options",      core_sctp_options,      core_sctp_options_doc,
 		0},
 	{"core.sctp_info",         core_sctpinfo,          core_sctpinfo_doc,   0},




More information about the sr-dev mailing list