summaryrefslogtreecommitdiff
path: root/dissector_eth.c
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 /dissector_eth.c
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>
Diffstat (limited to 'dissector_eth.c')
-rw-r--r--dissector_eth.c146
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, &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();