IPoIB: improve IPv4/IPv6 to IB mcast mapping functions
[safe/jmp/linux-2.6] / include / net / ip.h
index e6aa955..50c8889 100644 (file)
@@ -160,6 +160,7 @@ DECLARE_SNMP_STAT(struct ipstats_mib, ip_statistics);
 #define IP_INC_STATS(field)            SNMP_INC_STATS(ip_statistics, field)
 #define IP_INC_STATS_BH(field)         SNMP_INC_STATS_BH(ip_statistics, field)
 #define IP_INC_STATS_USER(field)       SNMP_INC_STATS_USER(ip_statistics, field)
+#define IP_ADD_STATS_BH(field, val)    SNMP_ADD_STATS_BH(ip_statistics, field, val)
 DECLARE_SNMP_STAT(struct linux_mib, net_statistics);
 #define NET_INC_STATS(field)           SNMP_INC_STATS(net_statistics, field)
 #define NET_INC_STATS_BH(field)                SNMP_INC_STATS_BH(net_statistics, field)
@@ -265,20 +266,22 @@ static inline void ip_eth_mc_map(__be32 naddr, char *buf)
  *     Leave P_Key as 0 to be filled in by driver.
  */
 
-static inline void ip_ib_mc_map(__be32 naddr, char *buf)
+static inline void ip_ib_mc_map(__be32 naddr, const unsigned char *broadcast, char *buf)
 {
        __u32 addr;
+       unsigned char scope = broadcast[5] & 0xF;
+
        buf[0]  = 0;            /* Reserved */
        buf[1]  = 0xff;         /* Multicast QPN */
        buf[2]  = 0xff;
        buf[3]  = 0xff;
        addr    = ntohl(naddr);
        buf[4]  = 0xff;
-       buf[5]  = 0x12;         /* link local scope */
+       buf[5]  = 0x10 | scope; /* scope from broadcast address */
        buf[6]  = 0x40;         /* IPv4 signature */
        buf[7]  = 0x1b;
-       buf[8]  = 0;            /* P_Key */
-       buf[9]  = 0;
+       buf[8]  = broadcast[8];         /* P_Key */
+       buf[9]  = broadcast[9];
        buf[10] = 0;
        buf[11] = 0;
        buf[12] = 0;