Re: [collectd] [PATCH] tcpconns plugin: add support for AIX

2011-09-20 Thread Manuel Luis Sanmartín Rozada
Compiled and working on AIX 7.

On Tue, Aug 23, 2011 at 3:57 PM, Florian Forster o...@collectd.org wrote:
 Hi Manuel,

 On Mon, Jun 06, 2011 at 02:14:27PM +0200, Manuel Luis Sanmartín Rozada wrote:
 In AIX there is a undocumented function/syscall in libc: netinfo
 returns a structure with the state of the tcp connections.

 thank you very much for your patch! I've applied it to the master
 branch. I'd be great if you could verify that it compiles since I don't
 have access to any AIX machine myself.

 Best regards,
 —octo
 --
 Florian octo Forster
 Hacker in training
 GnuPG: 0x0C705A15
 http://octo.it/

 -BEGIN PGP SIGNATURE-
 Version: GnuPG v1.4.10 (GNU/Linux)

 iQIcBAEBAgAGBQJOU7HNAAoJEMPSHpbi2Mmg5hAP/i4I9gKva18nsBbJ8FxunfHE
 RLKKsv4eUAQB/b9TNA7JBkfMCmOOSa6ht0BiiZWXsrw2E1YIcZXKNJ45wG3w1P6A
 Eh+Skr8/y42LV8QsaKxcsZ0D3hdBzfj/UPBBc1eZv7Sb3pfAtKJSvQ690WPe56We
 IMAbp+aCBgc4xuUOX9EIwcPUvE/si/jzjIWFvDaC6gd0tFUFvetVhL9eto8Z4a6K
 YRWE+GZNcRuOlkEzqYS//5WcfDfLUQOBuGrnYB6a+MjUn41P+cbAOnYQDQV2ONXY
 Bu3GBf9dVQVutvN/hH8bpl5mBPoYfJs7t7yswbU0r+r9znMVCrOylhI/p0iytN5l
 Cs9Q5+GOeTOTGMgc0hotmhr5ZPmhaQq0SvPSVsGFZv2beqjmhqrSe9HlThffVDId
 5tRzFhp3Afvq7I+fnemxkax/9zUJCrTSEoEcoKnz350At9CngA/UB3p2NaIbipXN
 k42N+nUG1SY1+DjLcjo6TC48BAvSoqkgX25ZJHfXAd+rxql0E0X6oKOV6NoA1L85
 RSb/TwLatGANXGpNWHXti8aboZlK+bx8NDTgjpFVGTDi1sGr/cSNgZjKiXeTH6FX
 JrUy0NJxXwSW1BgkjRAiF9eRRoUTbzvuelL+AnyjURCuLE4aYsutMEYrcB7tXzxq
 2Ru9iti3XJFbVX2GNe3V
 =2llZ
 -END PGP SIGNATURE-



___
collectd mailing list
collectd@verplant.org
http://mailman.verplant.org/listinfo/collectd


[collectd] [PATCH] tcpconns plugin: add support for AIX

2011-06-06 Thread Manuel Luis Sanmartín Rozada
Hi.

In AIX there is a undocumented function/syscall in libc: netinfo
returns a structure with the state of the tcp connections.

I didn't found the description or info abut this syscall,  I guess is
something like this:

int netinfo (int proto, void *data, int *size,  int n);

and the struct something like this: (with some work we can guess the
unknow remaining bytes)

struct netinfo_header {
unsigned int proto;
unsigned int size;
struct netinfo_entry e[];
};
struct netinfo_entry {
uint32_t unknow1;
uint32_t unknow2;
uint16_t dstport;
uint16_t unknow3;
struct in6_addr dstaddr;
uint16_t srcport;
uint16_t unknow4;
struct in6_addr srcaddr;
uint32_t unknow01[4];
uint32_t unknow02[2];
uint16_t so_options;
uint16_t unknow02a;
uint16_t so_q0len;
uint16_t so_qlen;
uint16_t so_qlimit;
uint16_t so_dqlen;
uint32_t unknow03[4];
struct {
uint32_t sb_hiwat;
uint32_t unknow01;
uint32_t unknow02;
uint32_t unknow03;
uint32_t sb_mbmax;
uint32_t unknow04;
uint32_t sb_lowat;
uint16_t sb_flags;
uint16_t unknow05;
} rcvbuf;
uint32_t unknow07;
uint32_t unknow08[2];
uint32_t unknow09;
struct {
uint32_t sb_hiwat;
uint32_t unknow01;
uint32_t unknow02;
uint32_t unknow03;
uint32_t sb_mbmax;
uint32_t unknow04;
uint32_t sb_lowat;
uint16_t sb_flags;
uint16_t unknow05;
} sndbuf;
uint32_t unknow11;
uint32_t so_uid;
uint16_t so_special;
uint16_t so_special2;
uint16_t tcp_state;
uint16_t unknow12;
uint32_t tcp_flags;
uint32_t tcp_mss;
uint32_t unknow15;
};


---
 configure.in   |6 +++
 src/tcpconns.c |  117 ++--
 2 files changed, 119 insertions(+), 4 deletions(-)

diff --git a/configure.in b/configure.in
index 8043d9a..4fd08ce 100644
--- a/configure.in
+++ b/configure.in
@@ -4361,6 +4361,12 @@ then
 fi

 # AIX
+
+if test x$ac_system = xAIX
+then
+plugin_tcpconns=yes
+fi
+
 if test x$with_perfstat = xyes
 then
plugin_cpu=yes
diff --git a/src/tcpconns.c b/src/tcpconns.c
index d68cd09..ae1fabb 100644
--- a/src/tcpconns.c
+++ b/src/tcpconns.c
@@ -65,7 +65,7 @@
 #undef HAVE_SYSCTLBYNAME /* force HAVE_LIBKVM_NLIST path */
 #endif

-#if !KERNEL_LINUX  !HAVE_SYSCTLBYNAME  !HAVE_LIBKVM_NLIST
+#if !KERNEL_LINUX  !HAVE_SYSCTLBYNAME  !HAVE_LIBKVM_NLIST  !KERNEL_AIX
 # error No applicable input method.
 #endif

@@ -118,7 +118,12 @@
 # include arpa/inet.h
 # include nlist.h
 # include kvm.h
-#endif /* HAVE_LIBKVM_NLIST */
+/* #endif HAVE_LIBKVM_NLIST */
+
+#elif KERNEL_AIX
+# include arpa/inet.h
+# include sys/socketvar.h
+#endif /* KERNEL_AIX */

 #if KERNEL_LINUX
 static const char *tcp_state[] =
@@ -186,7 +191,49 @@ struct inpcbtable *inpcbtable_ptr = NULL;
 # define TCP_STATE_LISTEN 1
 # define TCP_STATE_MIN 1
 # define TCP_STATE_MAX 10
-#endif /* HAVE_LIBKVM_NLIST */
+/* #endif HAVE_LIBKVM_NLIST */
+
+#elif KERNEL_AIX
+static const char *tcp_state[] =
+{
+  CLOSED,
+  LISTEN,
+  SYN_SENT,
+  SYN_RCVD,
+  ESTABLISHED,
+  CLOSE_WAIT,
+  FIN_WAIT_1,
+  CLOSING,
+  LAST_ACK,
+  FIN_WAIT_2,
+  TIME_WAIT
+};
+
+# define TCP_STATE_LISTEN 1
+# define TCP_STATE_MIN 0
+# define TCP_STATE_MAX 10
+
+struct netinfo_conn {
+  uint32_t unknow1[2];
+  uint16_t dstport;
+  uint16_t unknow2;
+  struct in6_addr dstaddr;
+  uint16_t srcport;
+  uint16_t unknow3;
+  struct in6_addr srcaddr;
+  uint32_t unknow4[36];
+  uint16_t tcp_state;
+  uint16_t unknow5[7];
+};
+
+struct netinfo_header {
+  unsigned int proto;
+  unsigned int size;
+};
+
+# define NETINFO_TCP 3
+extern int netinfo (int proto, void *data, int *size,  int n);
+#endif /* KERNEL_AIX */

 #define PORT_COLLECT_LOCAL  0x01
 #define PORT_COLLECT_REMOTE 0x02
@@ -706,7 +753,67 @@ static int conn_read (void)

   return (0);
 }
-#endif /* HAVE_LIBKVM_NLIST */
+/* #endif HAVE_LIBKVM_NLIST */
+
+#elif KERNEL_AIX
+
+static int conn_read (void)
+{
+  int size;
+  int i;
+  int nconn;
+  void *data;
+  struct netinfo_header *header;
+  struct netinfo_conn *conn;
+
+  conn_reset_port_entry ();
+
+  size = netinfo(NETINFO_TCP, 0, 0, 0);
+  if (size  0)
+  {
+ERROR (tcpconns plugin: netinfo failed return: %d, size);
+return (-1);
+  }
+
+  if (size == 0)
+return 0;
+
+  if ((size - sizeof(struct netinfo_header)) % sizeof(struct netinfo_conn))
+  {
+ERROR (tcpconns plugin: invalid buffer size);
+return (-1);
+  }
+
+  data = malloc(size);
+  if (data == NULL)
+  {
+ERROR (tcpconns plugin: malloc failed);
+return (-1);
+  }
+
+  if (netinfo(NETINFO_TCP,