[openib-general] [PATCH][RFC/v1][10/12] IPoIB IPv4 multicast
Roland Dreier
roland at topspin.com
Thu Nov 18 10:58:50 PST 2004
Add ip_ib_mc_map() to convert IPv$ multicast addresses to IPoIB
hardware addresses.
The mapping for multicast addresses is described in
http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-07.txt
Signed-off-by: Roland Dreier <roland at topspin.com>
Index: linux-bk/include/net/ip.h
===================================================================
--- linux-bk.orig/include/net/ip.h 2004-11-17 19:52:25.000000000 -0800
+++ linux-bk/include/net/ip.h 2004-11-18 10:51:45.214387812 -0800
@@ -229,6 +229,39 @@
buf[3]=addr&0x7F;
}
+/*
+ * Map a multicast IP onto multicast MAC for type IP-over-InfiniBand.
+ * Leave P_Key as 0 to be filled in by driver.
+ */
+
+static inline void ip_ib_mc_map(u32 addr, char *buf)
+{
+ buf[0] = 0; /* Reserved */
+ buf[1] = 0xff; /* Multicast QPN */
+ buf[2] = 0xff;
+ buf[3] = 0xff;
+ addr = ntohl(addr);
+ buf[4] = 0xff;
+ buf[5] = 0x12; /* link local scope */
+ buf[6] = 0x40; /* IPv4 signature */
+ buf[7] = 0x1b;
+ buf[8] = 0; /* P_Key */
+ buf[9] = 0;
+ buf[10] = 0;
+ buf[11] = 0;
+ buf[12] = 0;
+ buf[13] = 0;
+ buf[14] = 0;
+ buf[15] = 0;
+ buf[19] = addr & 0xff;
+ addr >>= 8;
+ buf[18] = addr & 0xff;
+ addr >>= 8;
+ buf[17] = addr & 0xff;
+ addr >>= 8;
+ buf[16] = addr & 0x0f;
+}
+
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
#include <linux/ipv6.h>
#endif
Index: linux-bk/net/ipv4/arp.c
===================================================================
--- linux-bk.orig/net/ipv4/arp.c 2004-11-17 19:52:34.000000000 -0800
+++ linux-bk/net/ipv4/arp.c 2004-11-18 10:51:45.214387812 -0800
@@ -213,6 +213,9 @@
case ARPHRD_IEEE802_TR:
ip_tr_mc_map(addr, haddr);
return 0;
+ case ARPHRD_INFINIBAND:
+ ip_ib_mc_map(addr, haddr);
+ return 0;
default:
if (dir) {
memcpy(haddr, dev->broadcast, dev->addr_len);
More information about the general
mailing list