diff options
author | Rolf Manderscheid <rvm@obsidianresearch.com> | 2007-12-10 15:38:41 -0500 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2008-01-25 17:15:37 -0500 |
commit | a9e527e3f9f4510e9f3450ca3bc51bc3ef2854fd (patch) | |
tree | 519458581cf3b8dd7c7a6d19c29572efb3405df1 /net | |
parent | 755807a296f77ca7c31dc000afdfe1e5172bbf72 (diff) |
IPoIB: improve IPv4/IPv6 to IB mcast mapping functions
An IPoIB subnet on an IB fabric that spans multiple IB subnets can't
use link-local scope in multicast GIDs. The existing routines that
map IP/IPv6 multicast addresses into IB link-level addresses hard-code
the scope to link-local, and they also leave the partition key field
uninitialised. This patch adds a parameter (the link-level broadcast
address) to the mapping routines, allowing them to initialise both the
scope and the P_Key appropriately, and fixes up the call sites.
The next step will be to add a way to configure the scope for an IPoIB
interface.
Signed-off-by: Rolf Manderscheid <rvm@obsidianresearch.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/arp.c | 2 | ||||
-rw-r--r-- | net/ipv6/ndisc.c | 2 |
2 files changed, 2 insertions, 2 deletions
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) { |