===================================================================
@@ -114,6 +114,9 @@ enum {
#define IPOIB_OP_CM (0)
#endif
+#define IPOIB_MGID_IPV4_SIGNATURE 0x401B
+#define IPOIB_MGID_IPV6_SIGNATURE 0x601B
+
/* structs */
struct ipoib_header {
@@ -125,6 +128,16 @@ struct ipoib_pseudoheader {
u8 hwaddr[INFINIBAND_ALEN];
};
+int ipoib_is_ipv4_multicast(u8 *p)
+{
+ return *((u16 *)(p + 2)) == htonl(IPOIB_MGID_IPV4_SIGNATURE);
+}
+
+int ipoib_is_ipv6_multicast(u8 *p)
+{
+ return *((u16 *)(p + 2)) == htonl(IPOIB_MGID_IPV6_SIGNATURE);
+}
+
/* Used for all multicast joins (broadcast, IPv4 mcast and IPv6 mcast) */
struct ipoib_mcast {
struct ib_sa_mcmember_rec mcmember;
===================================================================
@@ -281,8 +281,10 @@ static void ipoib_ib_handle_rx_wc(struct
dev->stats.rx_bytes += skb->len;
skb->dev = dev;
- /* XXX get correct PACKET_ type here */
- skb->pkt_type = PACKET_HOST;
+ if (ipoib_is_ipv4_multicast(skb_mac_header(skb)))
+ skb->pkt_type = PACKET_MULTICAST;
+ else
+ skb->pkt_type = PACKET_HOST;
if (test_bit(IPOIB_FLAG_CSUM, &priv->flags) && likely(wc->csum_ok))
skb->ip_summed = CHECKSUM_UNNECESSARY;