summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure1
-rw-r--r--dissector_eth.c146
-rw-r--r--dissector_eth.h4
-rw-r--r--flowtop.c8
-rw-r--r--flowtop/Makefile9
-rw-r--r--lookup.c138
-rw-r--r--lookup.h25
-rw-r--r--netsniff-ng/Makefile1
-rw-r--r--proto_arp.c1
-rw-r--r--proto_ethernet.c1
-rw-r--r--proto_tcp.c1
-rw-r--r--proto_udp.c1
12 files changed, 182 insertions, 154 deletions
diff --git a/configure b/configure
index 7d3da70..d9cebff 100755
--- a/configure
+++ b/configure
@@ -178,7 +178,6 @@ EOF
MISSING_DEFS=1
tools_remove "trafgen"
tools_remove "netsniff-ng"
- tools_remove "flowtop"
else
echo "[YES]"
fi
diff --git a/dissector_eth.c b/dissector_eth.c
index 4a696c5..035cdfa 100644
--- a/dissector_eth.c
+++ b/dissector_eth.c
@@ -8,51 +8,16 @@
#include "hash.h"
#include "oui.h"
-#include "str.h"
#include "proto.h"
#include "protos.h"
#include "dissector.h"
#include "dissector_eth.h"
+#include "lookup.h"
#include "xmalloc.h"
struct hash_table eth_lay2;
struct hash_table eth_lay3;
-static struct hash_table eth_ether_types;
-static struct hash_table eth_ports_udp;
-static struct hash_table eth_ports_tcp;
-
-struct port {
- unsigned int id;
- char *port;
- struct port *next;
-};
-
-#define __do_lookup_inline(id, struct_name, hash_ptr, struct_member) \
- ({ \
- struct struct_name *entry = lookup_hash(id, hash_ptr); \
- \
- while (entry && id != entry->id) \
- entry = entry->next; \
- \
- (entry && id == entry->id ? entry->struct_member : NULL); \
- })
-
-char *lookup_port_udp(unsigned int id)
-{
- return __do_lookup_inline(id, port, &eth_ports_udp, port);
-}
-
-char *lookup_port_tcp(unsigned int id)
-{
- return __do_lookup_inline(id, port, &eth_ports_tcp, port);
-}
-
-char *lookup_ether_type(unsigned int id)
-{
- return __do_lookup_inline(id, port, &eth_ether_types, port);
-}
-
#ifdef HAVE_DISSECTOR_PROTOS
static inline void dissector_init_entry(int type)
{
@@ -103,99 +68,6 @@ static void dissector_init_layer_2(int type __maybe_unused) {}
static void dissector_init_layer_3(int type __maybe_unused) {}
#endif
-enum ports {
- PORTS_UDP,
- PORTS_TCP,
- PORTS_ETHER,
-};
-
-static void dissector_init_ports(enum ports which)
-{
- FILE *fp;
- char buff[128], *ptr, *file, *end;
- struct hash_table *table;
- struct port *p;
- void **pos;
-
- switch (which) {
- case PORTS_UDP:
- file = ETCDIRE_STRING "/udp.conf";
- table = &eth_ports_udp;
- break;
- case PORTS_TCP:
- file = ETCDIRE_STRING "/tcp.conf";
- table = &eth_ports_tcp;
- break;
- case PORTS_ETHER:
- file = ETCDIRE_STRING "/ether.conf";
- table = &eth_ether_types;
- break;
- default:
- bug();
- }
-
- fp = fopen(file, "r");
- if (!fp)
- panic("No %s found!\n", file);
-
- memset(buff, 0, sizeof(buff));
-
- while (fgets(buff, sizeof(buff), fp) != NULL) {
- buff[sizeof(buff) - 1] = 0;
- ptr = buff;
-
- p = xmalloc(sizeof(*p));
- p->id = strtol(ptr, &end, 0);
- /* not a valid line, skip */
- if (p->id == 0 && end == ptr) {
- xfree(p);
- continue;
- }
-
- ptr = strstr(buff, ", ");
- /* likewise */
- if (!ptr) {
- xfree(p);
- continue;
- }
-
- ptr += strlen(", ");
- ptr = strtrim_right(ptr, '\n');
- ptr = strtrim_right(ptr, ' ');
-
- p->port = xstrdup(ptr);
- p->next = NULL;
-
- pos = insert_hash(p->id, p, table);
- if (pos) {
- p->next = *pos;
- *pos = p;
- }
-
- memset(buff, 0, sizeof(buff));
- }
-
- fclose(fp);
-}
-
-static int dissector_cleanup_ports(void *ptr)
-{
- struct port *tmp, *p = ptr;
-
- if (!ptr)
- return 0;
-
- while ((tmp = p->next)) {
- xfree(p->port);
- xfree(p);
- p = tmp;
- }
-
- xfree(p->port);
- xfree(p);
-
- return 0;
-}
void dissector_init_ethernet(int fnttype)
{
@@ -207,9 +79,9 @@ void dissector_init_ethernet(int fnttype)
#ifdef __WITH_PROTOS
dissector_init_oui();
#endif
- dissector_init_ports(PORTS_UDP);
- dissector_init_ports(PORTS_TCP);
- dissector_init_ports(PORTS_ETHER);
+ lookup_init_ports(PORTS_UDP);
+ lookup_init_ports(PORTS_TCP);
+ lookup_init_ports(PORTS_ETHER);
}
void dissector_cleanup_ethernet(void)
@@ -217,13 +89,9 @@ void dissector_cleanup_ethernet(void)
free_hash(&eth_lay2);
free_hash(&eth_lay3);
- for_each_hash(&eth_ether_types, dissector_cleanup_ports);
- for_each_hash(&eth_ports_udp, dissector_cleanup_ports);
- for_each_hash(&eth_ports_tcp, dissector_cleanup_ports);
-
- free_hash(&eth_ether_types);
- free_hash(&eth_ports_udp);
- free_hash(&eth_ports_tcp);
+ lookup_cleanup_ports(PORTS_ETHER);
+ lookup_cleanup_ports(PORTS_TCP);
+ lookup_cleanup_ports(PORTS_UDP);
#ifdef __WITH_PROTOS
dissector_cleanup_oui();
diff --git a/dissector_eth.h b/dissector_eth.h
index c02213f..6d14809 100644
--- a/dissector_eth.h
+++ b/dissector_eth.h
@@ -16,10 +16,6 @@ extern struct hash_table eth_lay3;
extern void dissector_init_ethernet(int fnttype);
extern void dissector_cleanup_ethernet(void);
-extern char *lookup_port_udp(unsigned int id);
-extern char *lookup_port_tcp(unsigned int id);
-extern char *lookup_ether_type(unsigned int id);
-
#ifdef HAVE_DISSECTOR_PROTOS
static inline struct protocol *dissector_get_ethernet_entry_point(void)
{
diff --git a/flowtop.c b/flowtop.c
index ce43d93..506883b 100644
--- a/flowtop.c
+++ b/flowtop.c
@@ -31,10 +31,10 @@
#include "config.h"
#include "str.h"
#include "sig.h"
+#include "lookup.h"
#include "geoip.h"
#include "built_in.h"
#include "locking.h"
-#include "dissector_eth.h"
#include "pkt_buff.h"
#include "screen.h"
@@ -981,7 +981,8 @@ static void presenter(void)
int skip_lines = 0;
WINDOW *screen;
- dissector_init_ethernet(0);
+ lookup_init_ports(PORTS_TCP);
+ lookup_init_ports(PORTS_UDP);
screen = screen_init(false);
rcu_register_thread();
@@ -1015,7 +1016,8 @@ static void presenter(void)
rcu_unregister_thread();
screen_end();
- dissector_cleanup_ethernet();
+ lookup_cleanup_ports(PORTS_UDP);
+ lookup_cleanup_ports(PORTS_TCP);
}
static int collector_cb(enum nf_conntrack_msg_type type,
diff --git a/flowtop/Makefile b/flowtop/Makefile
index fcef59e..4f9eef3 100644
--- a/flowtop/Makefile
+++ b/flowtop/Makefile
@@ -19,11 +19,7 @@ flowtop-objs = xmalloc.o \
dev.o \
link.o \
hash.o \
- dissector_eth.o \
- dissector_80211.o \
- dissector_netlink.o \
- dissector.o \
- proto_none.o \
+ lookup.o \
tprintf.o \
screen.o \
flowtop.o
@@ -32,8 +28,7 @@ ifeq ($(CONFIG_GEOIP), 1)
flowtop-objs += geoip.o
endif
-flowtop-eflags = $(shell pkg-config --cflags ncurses) \
- $(shell pkg-config --cflags libnl-3.0)
+flowtop-eflags = $(shell pkg-config --cflags ncurses)
flowtop-confs = tcp.conf \
udp.conf \
diff --git a/lookup.c b/lookup.c
new file mode 100644
index 0000000..36d03da
--- /dev/null
+++ b/lookup.c
@@ -0,0 +1,138 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Copyright 2014 Tobias Klauser
+ * Subject to the GPL, version 2.
+ */
+
+#include <string.h>
+
+#include "hash.h"
+#include "str.h"
+#include "lookup.h"
+#include "xmalloc.h"
+
+static struct hash_table lookup_port_tables[PORTS_MAX];
+static const char * const lookup_port_files[] = {
+ [PORTS_UDP] = ETCDIRE_STRING "/udp.conf",
+ [PORTS_TCP] = ETCDIRE_STRING "/tcp.conf",
+ [PORTS_ETHER] = ETCDIRE_STRING "/ether.conf",
+};
+
+struct port {
+ unsigned int id;
+ char *port;
+ struct port *next;
+};
+
+void lookup_init_ports(enum ports which)
+{
+ FILE *fp;
+ char buff[128], *ptr, *end;
+ const char *file;
+ struct hash_table *table;
+ struct port *p;
+ void **pos;
+
+ bug_on(which >= PORTS_MAX);
+ table = &lookup_port_tables[which];
+ file = lookup_port_files[which];
+
+ fp = fopen(file, "r");
+ if (!fp)
+ panic("No %s found!\n", file);
+
+ memset(buff, 0, sizeof(buff));
+
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+ ptr = buff;
+
+ p = xmalloc(sizeof(*p));
+ p->id = strtol(ptr, &end, 0);
+ /* not a valid line, skip */
+ if (p->id == 0 && end == ptr) {
+ xfree(p);
+ continue;
+ }
+
+ ptr = strstr(buff, ", ");
+ /* likewise */
+ if (!ptr) {
+ xfree(p);
+ continue;
+ }
+
+ ptr += strlen(", ");
+ ptr = strtrim_right(ptr, '\n');
+ ptr = strtrim_right(ptr, ' ');
+
+ p->port = xstrdup(ptr);
+ p->next = NULL;
+
+ pos = insert_hash(p->id, p, table);
+ if (pos) {
+ p->next = *pos;
+ *pos = p;
+ }
+
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+}
+
+static int __lookup_cleanup_single(void *ptr)
+{
+ struct port *tmp, *p = ptr;
+
+ if (!ptr)
+ return 0;
+
+ while ((tmp = p->next)) {
+ xfree(p->port);
+ xfree(p);
+ p = tmp;
+ }
+
+ xfree(p->port);
+ xfree(p);
+
+ return 0;
+}
+
+void lookup_cleanup_ports(enum ports which)
+{
+ struct hash_table *table;
+
+ bug_on(which >= PORTS_MAX);
+ table = &lookup_port_tables[which];
+
+ for_each_hash(table, __lookup_cleanup_single);
+ free_hash(table);
+}
+
+#define __do_lookup_inline(id, struct_name, hash_ptr, struct_member) \
+ ({ \
+ struct struct_name *entry = lookup_hash(id, hash_ptr); \
+ \
+ while (entry && id != entry->id) \
+ entry = entry->next; \
+ \
+ (entry && id == entry->id ? entry->struct_member : NULL); \
+ })
+
+char *lookup_ether_type(unsigned int id)
+{
+ return __do_lookup_inline(id, port, &lookup_port_tables[PORTS_ETHER], port);
+}
+
+char *lookup_port_udp(unsigned int id)
+{
+ return __do_lookup_inline(id, port, &lookup_port_tables[PORTS_UDP], port);
+}
+
+char *lookup_port_tcp(unsigned int id)
+{
+ return __do_lookup_inline(id, port, &lookup_port_tables[PORTS_TCP], port);
+}
diff --git a/lookup.h b/lookup.h
new file mode 100644
index 0000000..7cc2d31
--- /dev/null
+++ b/lookup.h
@@ -0,0 +1,25 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Copyright 2014 Tobias Klauser
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef LOOKUP_H
+#define LOOKUP_H
+
+enum ports {
+ PORTS_UDP,
+ PORTS_TCP,
+ PORTS_ETHER,
+ PORTS_MAX,
+};
+
+extern void lookup_init_ports(enum ports which);
+extern void lookup_cleanup_ports(enum ports which);
+
+extern char *lookup_port_udp(unsigned int id);
+extern char *lookup_port_tcp(unsigned int id);
+extern char *lookup_ether_type(unsigned int id);
+
+#endif /* LOOKUP_H */
diff --git a/netsniff-ng/Makefile b/netsniff-ng/Makefile
index 745bb1d..c89d32b 100644
--- a/netsniff-ng/Makefile
+++ b/netsniff-ng/Makefile
@@ -14,6 +14,7 @@ netsniff-ng-objs = dissector.o \
dissector_eth.o \
dissector_80211.o \
dissector_netlink.o \
+ lookup.o \
proto_arp.o \
proto_ethernet.o \
proto_icmpv4.o \
diff --git a/proto_arp.c b/proto_arp.c
index bf585d1..d677b3d 100644
--- a/proto_arp.c
+++ b/proto_arp.c
@@ -9,6 +9,7 @@
#include "proto.h"
#include "dissector_eth.h"
+#include "lookup.h"
#include "pkt_buff.h"
#include "built_in.h"
diff --git a/proto_ethernet.c b/proto_ethernet.c
index 3b3a9e6..98d40e5 100644
--- a/proto_ethernet.c
+++ b/proto_ethernet.c
@@ -12,6 +12,7 @@
#include "proto.h"
#include "dissector_eth.h"
+#include "lookup.h"
#include "pkt_buff.h"
#include "oui.h"
diff --git a/proto_tcp.c b/proto_tcp.c
index f0e28f8..893b0b3 100644
--- a/proto_tcp.c
+++ b/proto_tcp.c
@@ -12,6 +12,7 @@
#include "proto.h"
#include "dissector_eth.h"
+#include "lookup.h"
#include "built_in.h"
#include "pkt_buff.h"
diff --git a/proto_udp.c b/proto_udp.c
index f9f052c..4b4ed80 100644
--- a/proto_udp.c
+++ b/proto_udp.c
@@ -10,6 +10,7 @@
#include "proto.h"
#include "dissector_eth.h"
+#include "lookup.h"
#include "pkt_buff.h"
struct udphdr {