[PATCH libnetfilter_queue] src: Make sure pktb_alloc() works for IPv6 over AF_BRIDGE

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux