On Thu, Nov 14, 2019 at 10:05:32AM +1100, Duncan Roe wrote: > 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; You can save one level of indentation here, right? case AF_BRIDGE: { 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 >