diff options
author | Tobias Klauser <tklauser@distanz.ch> | 2014-06-13 14:53:00 +0200 |
---|---|---|
committer | Tobias Klauser <tklauser@distanz.ch> | 2014-06-13 15:01:13 +0200 |
commit | 1cc762aa8f89a5e4324f1482d97affa5ef6298bd (patch) | |
tree | 17e75a3aaf2c8564a06e1619e2e5ace481a1cfc0 /dissector_eth.c | |
parent | 8130ced723d3226b1f4b1b83bb12c9e26b9d02d1 (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>
Diffstat (limited to 'dissector_eth.c')
-rw-r--r-- | dissector_eth.c | 146 |
1 files changed, 7 insertions, 139 deletions
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(); |