At least on the local interface, the MAC header of an IPv6 packet specifies IPv6 protocol (rather than IP). This surprised me, since the first octet of the IP datagram is the IP version, but I guess it's an efficiency thing. Without this patch, pktb_alloc() returns NULL when an IPv6 packet is encountered. Updated: src/extra/pktbuff.c: - Treat ETH_P_IPV6 the same as ETH_P_IP. - Fix indenting around the affected code. Signed-off-by: Duncan Roe <duncan_roe@xxxxxxxxxxxxxxx> --- src/extra/pktbuff.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/extra/pktbuff.c b/src/extra/pktbuff.c index c52b674..c99a872 100644 --- a/src/extra/pktbuff.c +++ b/src/extra/pktbuff.c @@ -67,21 +67,22 @@ struct pkt_buff *pktb_alloc(int family, void *data, size_t len, size_t extra) pktb->network_header = pktb->data; break; case AF_BRIDGE: { - struct ethhdr *ethhdr = (struct ethhdr *)pktb->data; - - pktb->mac_header = pktb->data; - - switch(ethhdr->h_proto) { - case ETH_P_IP: - pktb->network_header = pktb->data + ETH_HLEN; + struct ethhdr *ethhdr = (struct ethhdr *)pktb->data; + + pktb->mac_header = pktb->data; + + switch(ethhdr->h_proto) { + case ETH_P_IP: + case ETH_P_IPV6: + pktb->network_header = pktb->data + ETH_HLEN; + break; + default: + /* This protocol is unsupported. */ + free(pktb); + return NULL; + } break; - default: - /* This protocol is unsupported. */ - free(pktb); - return NULL; } - break; - } } return pktb; } -- 2.14.5