diff options
Diffstat (limited to 'dissector.c')
-rw-r--r-- | dissector.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/dissector.c b/dissector.c new file mode 100644 index 0000000..167d946 --- /dev/null +++ b/dissector.c @@ -0,0 +1,115 @@ +/* + * netsniff-ng - the packet sniffing beast + * Copyright 2009, 2010, 2011, 2012 Daniel Borkmann. + * Subject to the GPL, version 2. + */ + +#include <stdint.h> +#include <stdlib.h> +#include <unistd.h> + +#include "built_in.h" +#include "tprintf.h" +#include "pkt_buff.h" +#include "proto.h" +#include "protos.h" +#include "dissector.h" +#include "dissector_eth.h" +#include "dissector_80211.h" + +int dissector_set_print_type(void *ptr, int type) +{ + struct protocol *proto; + + for (proto = ptr; proto; proto = proto->next) { + switch (type) { + case PRINT_NORM: + proto->process = proto->print_full; + break; + case PRINT_LESS: + proto->process = proto->print_less; + break; + default: + proto->process = NULL; + break; + } + } + + return 0; +} + +static void dissector_main(struct pkt_buff *pkt, struct protocol *start, + struct protocol *end) +{ + struct protocol *proto; + + if (!start) + return; + + for (pkt->proto = start; pkt->proto; ) { + if (unlikely(!pkt->proto->process)) + break; + + proto = pkt->proto; + pkt->proto = NULL; + proto->process(pkt); + } + + if (end && likely(end->process)) + end->process(pkt); +} + +void dissector_entry_point(uint8_t *packet, size_t len, int linktype, int mode) +{ + struct protocol *proto_start, *proto_end; + struct pkt_buff *pkt = NULL; + + if (mode == PRINT_NONE) + return; + + pkt = pkt_alloc(packet, len); + + switch (linktype) { + case LINKTYPE_EN10MB: + case ___constant_swab32(LINKTYPE_EN10MB): + proto_start = dissector_get_ethernet_entry_point(); + proto_end = dissector_get_ethernet_exit_point(); + break; + case LINKTYPE_IEEE802_11: + case ___constant_swab32(LINKTYPE_IEEE802_11): + proto_start = dissector_get_ieee80211_entry_point(); + proto_end = dissector_get_ieee80211_exit_point(); + break; + default: + panic("Linktype not supported!\n"); + }; + + dissector_main(pkt, proto_start, proto_end); + + switch (mode) { + case PRINT_HEX: + hex(pkt); + break; + case PRINT_ASCII: + ascii(pkt); + break; + case PRINT_HEX_ASCII: + hex_ascii(pkt); + break; + } + + tprintf_flush(); + pkt_free(pkt); +} + +void dissector_init_all(int fnttype) +{ + dissector_init_ethernet(fnttype); + dissector_init_ieee80211(fnttype); +} + +void dissector_cleanup_all(void) +{ + dissector_cleanup_ethernet(); + dissector_cleanup_ieee80211(); +} |