[PATCH] Make tcpconns run on OpenBSD

Michael Stapelberg michael+collectd at stapelberg.de
Fri Aug 8 03:42:05 CEST 2008


---
 tcpconns.c |  197 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 193 insertions(+), 4 deletions(-)

diff --git a/tcpconns.c b/tcpconns.c
index 655c53e..ea0ad79 100644
--- a/tcpconns.c
+++ b/tcpconns.c
@@ -23,7 +23,7 @@
 #include "common.h"
 #include "plugin.h"
 
-#if !KERNEL_LINUX && !HAVE_SYSCTLBYNAME
+#if !KERNEL_LINUX && !HAVE_SYSCTLBYNAME && !__OpenBSD__
 # error "No applicable input method."
 #endif
 
@@ -57,7 +57,27 @@
 # include <netinet/tcpip.h>
 # include <netinet/tcp_seq.h>
 # include <netinet/tcp_var.h>
-#endif /* HAVE_SYSCTLBYNAME */
+/* #endif HAVE_SYSCTLBYNAME */
+#elif __OpenBSD__
+
+# include <sys/queue.h>
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <net/route.h>
+# include <netinet/in.h>
+# include <netinet/in_systm.h>
+# include <netinet/ip.h>
+# include <netinet/in_pcb.h>
+# include <netinet/tcp.h>
+# include <netinet/tcp_timer.h>
+# include <netinet/tcp_var.h>
+# include <netdb.h>
+# include <arpa/inet.h>
+# include <nlist.h>
+# include <kvm.h>
+# include <fcntl.h>
+# include <limits.h>
+#endif /* __OpenBSD__ */
 
 #if KERNEL_LINUX
 static const char *tcp_state[] =
@@ -100,7 +120,120 @@ static const char *tcp_state[] =
 # define TCP_STATE_LISTEN 1
 # define TCP_STATE_MIN 0
 # define TCP_STATE_MAX 10
-#endif /* HAVE_SYSCTLBYNAME */
+/* #endif HAVE_SYSCTLBYNAME */
+
+#elif __OpenBSD__
+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"
+};
+
+kvm_t *kvmd;
+
+struct nlist nl[] = {
+#define N_MBSTAT        0
+        { "_mbstat" },
+#define N_IPSTAT        1
+        { "_ipstat" },
+#define N_TCBTABLE      2
+        { "_tcbtable" },  
+#define N_TCPSTAT       3
+        { "_tcpstat" },   
+#define N_UDBTABLE      4 
+        { "_udbtable" },  
+#define N_UDPSTAT       5
+        { "_udpstat" },   
+#define N_IFNET         6
+        { "_ifnet" },
+#define N_ICMPSTAT      7 
+        { "_icmpstat" },  
+#define N_RTSTAT        8
+        { "_rtstat" },
+#define N_UNIXSW        9  
+        { "_unixsw" },
+#define N_RTREE         10
+        { "_rt_tables"},  
+#define N_FILE          11
+        { "_file" },
+#define N_IGMPSTAT      12 
+        { "_igmpstat" },  
+#define N_MRTPROTO      13 
+        { "_ip_mrtproto" },
+#define N_MRTSTAT       14
+        { "_mrtstat" },
+#define N_MFCHASHTBL    15
+        { "_mfchashtbl" },
+#define N_MFCHASH       16
+        { "_mfchash" },
+        { "_viftable" },
+#define N_AHSTAT        18
+        { "_ahstat"},
+#define N_ESPSTAT       19  
+        { "_espstat"},
+#define N_IP4STAT       20
+        { "_ipipstat"},
+#define N_DDPSTAT       21
+        { "_ddpstat"},
+#define N_DDPCB         22
+        { "_ddpcb"},
+#define N_ETHERIPSTAT   23 
+        { "_etheripstat"},
+#define N_IP6STAT       24
+        { "_ip6stat" },
+#define N_ICMP6STAT     25  
+        { "_icmp6stat" },
+#define N_PIM6STAT      26
+        { "_pim6stat" },
+#define N_MRT6PROTO     27 
+        { "_ip6_mrtproto" },
+#define N_MRT6STAT      28
+        { "_mrt6stat" },
+#define N_MF6CTABLE     29
+        { "_mf6ctable" },
+#define N_MIF6TABLE     30
+        { "_mif6table" },   
+#define N_MBPOOL        31
+        { "_mbpool" },
+#define N_MCLPOOL       32
+        { "_mclpool" },
+#define N_IPCOMPSTAT    33
+        { "_ipcompstat" },
+#define N_RIP6STAT      34
+        { "_rip6stat" }, 
+#define N_CARPSTAT      35
+        { "_carpstats" },
+#define N_RAWIPTABLE    36
+        { "_rawcbtable" },
+#define N_RAWIP6TABLE   37
+        { "_rawin6pcbtable" },
+#define N_PFSYNCSTAT    38
+        { "_pfsyncstats" },
+#define N_PIMSTAT       39
+        { "_pimstat" },   
+#define N_AF2RTAFIDX    40
+        { "_af2rtafidx" },
+#define N_RTBLIDMAX     41
+        { "_rtbl_id_max" },
+#define N_RTMASK        42
+        { "_mask_rnhead" },
+        
+        { "" }
+};
+
+# define TCP_STATE_LISTEN 1
+# define TCP_STATE_MIN 1
+# define TCP_STATE_MAX 10
+#endif /* __OpenBSD__ */
 
 #define PORT_COLLECT_LOCAL  0x01
 #define PORT_COLLECT_REMOTE 0x02
@@ -440,6 +573,62 @@ static int conn_read (void)
 } /* int conn_read */
 /* #endif KERNEL_LINUX */
 
+#elif __OpenBSD__
+static int kread(u_long addr, void *buf, int size)
+{
+  if (kvm_read(kvmd, addr, buf, size) != size)
+  {
+    ERROR ("tcpconns plugin: %s\n", kvm_geterr(kvmd));
+    return (-1);
+  }
+  return (0);
+}
+
+static int conn_init (void)
+{
+  char buf[_POSIX2_LINE_MAX];
+  if ((kvmd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, buf)) == NULL)
+  {
+    ERROR("tcpconns plugin: %s", buf);
+    return (-1);
+  }
+  if (kvm_nlist(kvmd, nl) < 0 || nl[0].n_type == 0)
+  {
+    ERROR("tcpconns plugin: No namelist.");
+    return (-1);
+  }
+  return (0);
+}
+
+static int conn_read (void)
+{
+  u_long off = nl[2].n_value;
+  struct inpcbtable table;
+  struct inpcb *head, *next, *prev;
+  struct inpcb inpcb;
+  struct tcpcb tcpcb;
+
+  conn_reset_port_entry ();
+
+  kread(off, &table, sizeof(table));
+  prev = head = (struct inpcb *)&CIRCLEQ_FIRST(&((struct inpcbtable *)off)->inpt_queue);
+  next = CIRCLEQ_FIRST(&table.inpt_queue);
+
+  while (next != head) {
+    kread((u_long)next, &inpcb, sizeof(inpcb));
+    prev = next;
+    next = CIRCLEQ_NEXT(&inpcb, inp_queue);
+    if (inet_lnaof(inpcb.inp_laddr) == INADDR_ANY)
+      continue;
+    kread((u_long)inpcb.inp_ppcb, &tcpcb, sizeof(tcpcb));
+    conn_handle_ports (ntohs(inpcb.inp_lport), ntohs(inpcb.inp_fport), tcpcb.t_state);
+  }
+
+  conn_submit_all ();
+
+  return (0);
+}
+
 #elif HAVE_SYSCTLBYNAME
 static int conn_read (void)
 {
@@ -520,7 +709,7 @@ void module_register (void)
 {
 	plugin_register_config ("tcpconns", conn_config,
 			config_keys, config_keys_num);
-#if KERNEL_LINUX
+#if KERNEL_LINUX || __OpenBSD__
 	plugin_register_init ("tcpconns", conn_init);
 #endif
 	plugin_register_read ("tcpconns", conn_read);
-- 
1.5.2.4


--AjmyJqqohANyBN/e--



More information about the collectd mailing list