diff options
-rw-r--r-- | drivers/infiniband/core/cma.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 4 | ||||
-rw-r--r-- | include/net/if_inet6.h | 11 | ||||
-rw-r--r-- | include/net/ip.h | 10 | ||||
-rw-r--r-- | net/ipv4/arp.c | 2 | ||||
-rw-r--r-- | net/ipv6/ndisc.c | 2 |
6 files changed, 16 insertions, 17 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 312ec74f3d18..982836e69f55 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c | |||
@@ -2610,11 +2610,9 @@ static void cma_set_mgid(struct rdma_id_private *id_priv, | |||
2610 | /* IPv6 address is an SA assigned MGID. */ | 2610 | /* IPv6 address is an SA assigned MGID. */ |
2611 | memcpy(mgid, &sin6->sin6_addr, sizeof *mgid); | 2611 | memcpy(mgid, &sin6->sin6_addr, sizeof *mgid); |
2612 | } else { | 2612 | } else { |
2613 | ip_ib_mc_map(sin->sin_addr.s_addr, mc_map); | 2613 | ip_ib_mc_map(sin->sin_addr.s_addr, dev_addr->broadcast, mc_map); |
2614 | if (id_priv->id.ps == RDMA_PS_UDP) | 2614 | if (id_priv->id.ps == RDMA_PS_UDP) |
2615 | mc_map[7] = 0x01; /* Use RDMA CM signature */ | 2615 | mc_map[7] = 0x01; /* Use RDMA CM signature */ |
2616 | mc_map[8] = ib_addr_get_pkey(dev_addr) >> 8; | ||
2617 | mc_map[9] = (unsigned char) ib_addr_get_pkey(dev_addr); | ||
2618 | *mgid = *(union ib_gid *) (mc_map + 4); | 2616 | *mgid = *(union ib_gid *) (mc_map + 4); |
2619 | } | 2617 | } |
2620 | } | 2618 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 858ada17f980..2628339e3a99 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
@@ -788,10 +788,6 @@ void ipoib_mcast_restart_task(struct work_struct *work) | |||
788 | 788 | ||
789 | memcpy(mgid.raw, mclist->dmi_addr + 4, sizeof mgid); | 789 | memcpy(mgid.raw, mclist->dmi_addr + 4, sizeof mgid); |
790 | 790 | ||
791 | /* Add in the P_Key */ | ||
792 | mgid.raw[4] = (priv->pkey >> 8) & 0xff; | ||
793 | mgid.raw[5] = priv->pkey & 0xff; | ||
794 | |||
795 | mcast = __ipoib_mcast_find(dev, &mgid); | 791 | mcast = __ipoib_mcast_find(dev, &mgid); |
796 | if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { | 792 | if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { |
797 | struct ipoib_mcast *nmcast; | 793 | struct ipoib_mcast *nmcast; |
diff --git a/include/net/if_inet6.h b/include/net/if_inet6.h index 448eccb20638..b24508abb850 100644 --- a/include/net/if_inet6.h +++ b/include/net/if_inet6.h | |||
@@ -269,18 +269,21 @@ static inline void ipv6_arcnet_mc_map(const struct in6_addr *addr, char *buf) | |||
269 | buf[0] = 0x00; | 269 | buf[0] = 0x00; |
270 | } | 270 | } |
271 | 271 | ||
272 | static inline void ipv6_ib_mc_map(struct in6_addr *addr, char *buf) | 272 | static inline void ipv6_ib_mc_map(const struct in6_addr *addr, |
273 | const unsigned char *broadcast, char *buf) | ||
273 | { | 274 | { |
275 | unsigned char scope = broadcast[5] & 0xF; | ||
276 | |||
274 | buf[0] = 0; /* Reserved */ | 277 | buf[0] = 0; /* Reserved */ |
275 | buf[1] = 0xff; /* Multicast QPN */ | 278 | buf[1] = 0xff; /* Multicast QPN */ |
276 | buf[2] = 0xff; | 279 | buf[2] = 0xff; |
277 | buf[3] = 0xff; | 280 | buf[3] = 0xff; |
278 | buf[4] = 0xff; | 281 | buf[4] = 0xff; |
279 | buf[5] = 0x12; /* link local scope */ | 282 | buf[5] = 0x10 | scope; /* scope from broadcast address */ |
280 | buf[6] = 0x60; /* IPv6 signature */ | 283 | buf[6] = 0x60; /* IPv6 signature */ |
281 | buf[7] = 0x1b; | 284 | buf[7] = 0x1b; |
282 | buf[8] = 0; /* P_Key */ | 285 | buf[8] = broadcast[8]; /* P_Key */ |
283 | buf[9] = 0; | 286 | buf[9] = broadcast[9]; |
284 | memcpy(buf + 10, addr->s6_addr + 6, 10); | 287 | memcpy(buf + 10, addr->s6_addr + 6, 10); |
285 | } | 288 | } |
286 | #endif | 289 | #endif |
diff --git a/include/net/ip.h b/include/net/ip.h index 840dd91b513b..50c8889b1b8d 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
@@ -266,20 +266,22 @@ static inline void ip_eth_mc_map(__be32 naddr, char *buf) | |||
266 | * Leave P_Key as 0 to be filled in by driver. | 266 | * Leave P_Key as 0 to be filled in by driver. |
267 | */ | 267 | */ |
268 | 268 | ||
269 | static inline void ip_ib_mc_map(__be32 naddr, char *buf) | 269 | static inline void ip_ib_mc_map(__be32 naddr, const unsigned char *broadcast, char *buf) |
270 | { | 270 | { |
271 | __u32 addr; | 271 | __u32 addr; |
272 | unsigned char scope = broadcast[5] & 0xF; | ||
273 | |||
272 | buf[0] = 0; /* Reserved */ | 274 | buf[0] = 0; /* Reserved */ |
273 | buf[1] = 0xff; /* Multicast QPN */ | 275 | buf[1] = 0xff; /* Multicast QPN */ |
274 | buf[2] = 0xff; | 276 | buf[2] = 0xff; |
275 | buf[3] = 0xff; | 277 | buf[3] = 0xff; |
276 | addr = ntohl(naddr); | 278 | addr = ntohl(naddr); |
277 | buf[4] = 0xff; | 279 | buf[4] = 0xff; |
278 | buf[5] = 0x12; /* link local scope */ | 280 | buf[5] = 0x10 | scope; /* scope from broadcast address */ |
279 | buf[6] = 0x40; /* IPv4 signature */ | 281 | buf[6] = 0x40; /* IPv4 signature */ |
280 | buf[7] = 0x1b; | 282 | buf[7] = 0x1b; |
281 | buf[8] = 0; /* P_Key */ | 283 | buf[8] = broadcast[8]; /* P_Key */ |
282 | buf[9] = 0; | 284 | buf[9] = broadcast[9]; |
283 | buf[10] = 0; | 285 | buf[10] = 0; |
284 | buf[11] = 0; | 286 | buf[11] = 0; |
285 | buf[12] = 0; | 287 | buf[12] = 0; |
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 08174a2aa878..54a76b8b803a 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -211,7 +211,7 @@ int arp_mc_map(__be32 addr, u8 *haddr, struct net_device *dev, int dir) | |||
211 | ip_tr_mc_map(addr, haddr); | 211 | ip_tr_mc_map(addr, haddr); |
212 | return 0; | 212 | return 0; |
213 | case ARPHRD_INFINIBAND: | 213 | case ARPHRD_INFINIBAND: |
214 | ip_ib_mc_map(addr, haddr); | 214 | ip_ib_mc_map(addr, dev->broadcast, haddr); |
215 | return 0; | 215 | return 0; |
216 | default: | 216 | default: |
217 | if (dir) { | 217 | if (dir) { |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 777ed733b2d7..85947eae5bf7 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -337,7 +337,7 @@ int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int d | |||
337 | ipv6_arcnet_mc_map(addr, buf); | 337 | ipv6_arcnet_mc_map(addr, buf); |
338 | return 0; | 338 | return 0; |
339 | case ARPHRD_INFINIBAND: | 339 | case ARPHRD_INFINIBAND: |
340 | ipv6_ib_mc_map(addr, buf); | 340 | ipv6_ib_mc_map(addr, dev->broadcast, buf); |
341 | return 0; | 341 | return 0; |
342 | default: | 342 | default: |
343 | if (dir) { | 343 | if (dir) { |