diff options
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(); |