diff options
-rwxr-xr-x | configure | 1 | ||||
-rw-r--r-- | dissector_eth.c | 146 | ||||
-rw-r--r-- | dissector_eth.h | 4 | ||||
-rw-r--r-- | flowtop.c | 8 | ||||
-rw-r--r-- | flowtop/Makefile | 9 | ||||
-rw-r--r-- | lookup.c | 138 | ||||
-rw-r--r-- | lookup.h | 25 | ||||
-rw-r--r-- | netsniff-ng/Makefile | 1 | ||||
-rw-r--r-- | proto_arp.c | 1 | ||||
-rw-r--r-- | proto_ethernet.c | 1 | ||||
-rw-r--r-- | proto_tcp.c | 1 | ||||
-rw-r--r-- | proto_udp.c | 1 |
12 files changed, 182 insertions, 154 deletions
@@ -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, ð_ports_udp, port); -} - -char *lookup_port_tcp(unsigned int id) -{ - return __do_lookup_inline(id, port, ð_ports_tcp, port); -} - -char *lookup_ether_type(unsigned int id) -{ - return __do_lookup_inline(id, port, ð_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 = ð_ports_udp; - break; - case PORTS_TCP: - file = ETCDIRE_STRING "/tcp.conf"; - table = ð_ports_tcp; - break; - case PORTS_ETHER: - file = ETCDIRE_STRING "/ether.conf"; - table = ð_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(ð_lay2); free_hash(ð_lay3); - for_each_hash(ð_ether_types, dissector_cleanup_ports); - for_each_hash(ð_ports_udp, dissector_cleanup_ports); - for_each_hash(ð_ports_tcp, dissector_cleanup_ports); - - free_hash(ð_ether_types); - free_hash(ð_ports_udp); - free_hash(ð_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) { @@ -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 { |