From: Florian Forster Date: Tue, 5 Dec 2006 20:42:16 +0000 (+0100) Subject: src/utils_dns.c: Implemented a handler for `DLT_LINUX_SLL'. X-Git-Tag: collectd-3.11.0~26^2~2 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=d3b11c3ad0815c6fab122e3c5ea0f0f4a4636a4f;p=collectd.git 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. --- 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) { @@ -631,6 +665,11 @@ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt 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); break;