X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Futils_dns.c;h=e9aec38f6b8a010b6510652eb72cb6971c533bf7;hb=c4d01367a1c5dd7dde3dbaf9dc374f38f8a1020a;hp=221bac4bfdcb27c9022e75b20a406946e19bc842;hpb=55ffd0b2b51d27fa7192a2db57e9a6537b18362b;p=collectd.git 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);