$OpenBSD: patch-src_datalink_c,v 1.2 2009/05/13 09:47:43 sthen Exp $ --- src/datalink.c.orig Fri Mar 29 23:19:03 2002 +++ src/datalink.c Wed May 13 10:41:44 2009 @@ -137,7 +137,26 @@ void dl_ppp(u_char *user, const struct pcap_pkthdr *h, process_ip(p + PPP_HDRLEN, caplen - PPP_HDRLEN); } +#define PPP_ETHER_HDRLEN 8 +void dl_ppp_ether(u_char *user, const struct pcap_pkthdr *h, const u_char *p) +{ + u_int caplen = h->caplen; + u_int length = h->len; + + if (length != caplen) { + DEBUG(6) ("warning: only captured %d bytes of %d byte PPPoE frame", + caplen, length); + } + + if (caplen < PPP_ETHER_HDRLEN) { + DEBUG(6) ("warning: received incomplete PPP frame"); + return; + } + + process_ip(p + PPP_ETHER_HDRLEN, caplen - PPP_ETHER_HDRLEN); +} + /* DLT_RAW: just a raw IP packet, no encapsulation or link-layer * headers. Used for PPP connections under some OSs including Linux * and IRIX. */ @@ -188,7 +207,9 @@ pcap_handler find_handler(int datalink_type, char *dev #endif { dl_ethernet, DLT_EN10MB }, { dl_ethernet, DLT_IEEE802 }, + { dl_null, DLT_LOOP }, { dl_ppp, DLT_PPP }, + { dl_ppp_ether, DLT_PPP_ETHER }, #ifdef DLT_LINUX_SLL { dl_linux_sll, DLT_LINUX_SLL }, #endif