diff mbox

[IPoIB] Identify Multicast packets and fix IGMP breakage

Message ID alpine.DEB.2.00.1008261453510.21466@router.home (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Christoph Lameter (Ampere) Aug. 26, 2010, 7:55 p.m. UTC
None
diff mbox

Patch

Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2010-08-26 14:11:39.000000000 -0500
+++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2010-08-26 14:51:31.000000000 -0500
@@ -271,6 +271,14 @@ 
 	ipoib_ud_dma_unmap_rx(priv, mapping);
 	ipoib_ud_skb_put_frags(priv, skb, wc->byte_len);

+	/* According to Jason Gunthorpe byte 24 in the GRH has the MGID */
+	if (IN6_IS_ADDR_MULTICAST(skb->data + 24))
+
+		skb->pkt_type = PACKET_MULTICAST;
+
+	else
+		skb->pkt_type = PACKET_HOST;
+
 	skb_pull(skb, IB_GRH_BYTES);

 	skb->protocol = ((struct ipoib_header *) skb->data)->proto;
@@ -281,9 +289,6 @@ 
 	dev->stats.rx_bytes += skb->len;

 	skb->dev = dev;
-	/* XXX get correct PACKET_ type here */
-	skb->pkt_type = PACKET_HOST;
-
 	if (test_bit(IPOIB_FLAG_CSUM, &priv->flags) && likely(wc->csum_ok))
 		skb->ip_summed = CHECKSUM_UNNECESSARY;

Index: linux-2.6/include/linux/in6.h
===================================================================
--- linux-2.6.orig/include/linux/in6.h	2010-08-26 14:11:39.000000000 -0500
+++ linux-2.6/include/linux/in6.h	2010-08-26 14:11:52.000000000 -0500
@@ -53,6 +53,9 @@ 
 extern const struct in6_addr in6addr_linklocal_allrouters;
 #define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
 		{ { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2 } } }
+
+#define IN6_IS_ADDR_MULTICAST(a) (((const __u8 *) (a))[0] == 0xff)
+
 #endif

 struct sockaddr_in6 {