From d3b11c3ad0815c6fab122e3c5ea0f0f4a4636a4f Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Tue, 5 Dec 2006 21:42:16 +0100 Subject: [PATCH] src/utils_dns.c: Implemented a handler for `DLT_LINUX_SLL'. This is the ``Linux cooked capture encapsulation'', which is at least returned when capturing the `any' device under Linux. This patch will strip off the header and pass the packet to the IPv4 or IPv6 handler, whichever one is ppropriate. --- src/utils_dns.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/utils_dns.c b/src/utils_dns.c index 221bac4b..e9aec38f 100644 --- a/src/utils_dns.c +++ b/src/utils_dns.c @@ -599,6 +599,40 @@ handle_ether(const u_char * pkt, int len) return handle_ip((struct ip *) buf, len); } +#ifdef DLT_LINUX_SLL +static int +handle_linux_sll (const u_char *pkt, int len) +{ + struct sll_header + { + uint16_t pkt_type; + uint16_t dev_type; + uint16_t addr_len; + uint8_t addr[8]; + uint16_t proto_type; + } *hdr; + uint16_t etype; + + if (len < sizeof (struct sll_header)) + return (0); + + hdr = (struct sll_header *) pkt; + pkt = (u_char *) (hdr + 1); + len -= sizeof (struct sll_header); + + etype = ntohs (hdr->proto_type); + + if ((ETHERTYPE_IP != etype) + && (ETHERTYPE_IPV6 != etype)) + return 0; + + if (ETHERTYPE_IPV6 == etype) + return (handle_ipv6 ((struct ip6_hdr *) pkt, len)); + else + return handle_ip((struct ip *) pkt, len); +} +#endif /* DLT_LINUX_SLL */ + /* public function */ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt) { @@ -630,6 +664,11 @@ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt case DLT_RAW: status = handle_raw (pkt, hdr->caplen); break; +#endif +#ifdef DLT_LINUX_SLL + case DLT_LINUX_SLL: + status = handle_linux_sll (pkt, hdr->caplen); + break; #endif case DLT_NULL: status = handle_null (pkt, hdr->caplen); -- 2.30.2