summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Klauser <tklauser@distanz.ch>2014-06-13 14:53:00 +0200
committerTobias Klauser <tklauser@distanz.ch>2014-06-13 15:01:13 +0200
commit1cc762aa8f89a5e4324f1482d97affa5ef6298bd (patch)
tree17e75a3aaf2c8564a06e1619e2e5ace481a1cfc0
parent8130ced723d3226b1f4b1b83bb12c9e26b9d02d1 (diff)
lookup: Move UDP/TCP port and Ethernet type lookup into own module
Up to now, the lookup of TCP/UDP port names and Ethernet types was tightly integrated with the dissector infrastructure, since it is its main user. However, flowtop also makes use of the name lookup functionality without needing the actual dissector infrastructure. Thus, the basic dissector infrastructure also needs to be linked into flowtop without actually being used. Fix this by extracting the port/ethertype lookup into an own module which can then be used either directly (for flowtop) or as part of the dissector infrastructure (for netsniff-ng). This also reverts the quick & dirty fix introduced in commit f3322c6 ("flowtop: Include netlink dissector to fix build temporarily"). Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
-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 {