Skip to content

Commit 7b85627

Browse files
monis410rolandd
authored andcommitted
IB/cma: IBoE (RoCE) IP-based GID addressing
Currently, the IB core and specifically the RDMA-CM assumes that IBoE (RoCE) gids encode related Ethernet netdevice interface MAC address and possibly VLAN id. Change GIDs to be treated as they encode interface IP address. Since Ethernet layer 2 address parameters are not longer encoded within gids, we have to extend the Infiniband address structures (e.g. ib_ah_attr) with layer 2 address parameters, namely mac and vlan. Signed-off-by: Moni Shoua <[email protected]> Signed-off-by: Or Gerlitz <[email protected]> Signed-off-by: Roland Dreier <[email protected]>
1 parent dd5f03b commit 7b85627

File tree

3 files changed

+28
-47
lines changed

3 files changed

+28
-47
lines changed

drivers/infiniband/core/cma.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,9 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv,
365365
return -EINVAL;
366366

367367
mutex_lock(&lock);
368-
iboe_addr_get_sgid(dev_addr, &iboe_gid);
368+
rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr,
369+
&iboe_gid);
370+
369371
memcpy(&gid, dev_addr->src_dev_addr +
370372
rdma_addr_gid_offset(dev_addr), sizeof gid);
371373
if (listen_id_priv &&
@@ -1943,10 +1945,10 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
19431945
memcpy(route->path_rec->dmac, addr->dev_addr.dst_dev_addr, ETH_ALEN);
19441946
memcpy(route->path_rec->smac, ndev->dev_addr, ndev->addr_len);
19451947

1946-
iboe_mac_vlan_to_ll(&route->path_rec->sgid, addr->dev_addr.src_dev_addr,
1947-
route->path_rec->vlan_id);
1948-
iboe_mac_vlan_to_ll(&route->path_rec->dgid, addr->dev_addr.dst_dev_addr,
1949-
route->path_rec->vlan_id);
1948+
rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr,
1949+
&route->path_rec->sgid);
1950+
rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.dst_addr,
1951+
&route->path_rec->dgid);
19501952

19511953
route->path_rec->hop_limit = 1;
19521954
route->path_rec->reversible = 1;
@@ -2109,6 +2111,7 @@ static void addr_handler(int status, struct sockaddr *src_addr,
21092111
RDMA_CM_ADDR_RESOLVED))
21102112
goto out;
21112113

2114+
memcpy(cma_src_addr(id_priv), src_addr, rdma_addr_size(src_addr));
21122115
if (!status && !id_priv->cma_dev)
21132116
status = cma_acquire_dev(id_priv, NULL);
21142117

@@ -2118,10 +2121,8 @@ static void addr_handler(int status, struct sockaddr *src_addr,
21182121
goto out;
21192122
event.event = RDMA_CM_EVENT_ADDR_ERROR;
21202123
event.status = status;
2121-
} else {
2122-
memcpy(cma_src_addr(id_priv), src_addr, rdma_addr_size(src_addr));
2124+
} else
21232125
event.event = RDMA_CM_EVENT_ADDR_RESOLVED;
2124-
}
21252126

21262127
if (id_priv->id.event_handler(&id_priv->id, &event)) {
21272128
cma_exch(id_priv, RDMA_CM_DESTROYING);
@@ -2602,6 +2603,7 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
26022603
if (ret)
26032604
goto err1;
26042605

2606+
memcpy(cma_src_addr(id_priv), addr, rdma_addr_size(addr));
26052607
if (!cma_any_addr(addr)) {
26062608
ret = cma_translate_addr(addr, &id->route.addr.dev_addr);
26072609
if (ret)
@@ -2612,7 +2614,6 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
26122614
goto err1;
26132615
}
26142616

2615-
memcpy(cma_src_addr(id_priv), addr, rdma_addr_size(addr));
26162617
if (!(id_priv->options & (1 << CMA_OPTION_AFONLY))) {
26172618
if (addr->sa_family == AF_INET)
26182619
id_priv->afonly = 1;
@@ -3341,7 +3342,8 @@ static int cma_iboe_join_multicast(struct rdma_id_private *id_priv,
33413342
err = -EINVAL;
33423343
goto out2;
33433344
}
3344-
iboe_addr_get_sgid(dev_addr, &mc->multicast.ib->rec.port_gid);
3345+
rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr,
3346+
&mc->multicast.ib->rec.port_gid);
33453347
work->id = id_priv;
33463348
work->mc = mc;
33473349
INIT_WORK(&work->work, iboe_mcast_work_handler);

drivers/infiniband/core/ucma.c

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -655,24 +655,14 @@ static void ucma_copy_ib_route(struct rdma_ucm_query_route_resp *resp,
655655
static void ucma_copy_iboe_route(struct rdma_ucm_query_route_resp *resp,
656656
struct rdma_route *route)
657657
{
658-
struct rdma_dev_addr *dev_addr;
659-
struct net_device *dev;
660-
u16 vid = 0;
661658

662659
resp->num_paths = route->num_paths;
663660
switch (route->num_paths) {
664661
case 0:
665-
dev_addr = &route->addr.dev_addr;
666-
dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if);
667-
if (dev) {
668-
vid = rdma_vlan_dev_vlan_id(dev);
669-
dev_put(dev);
670-
}
671-
672-
iboe_mac_vlan_to_ll((union ib_gid *) &resp->ib_route[0].dgid,
673-
dev_addr->dst_dev_addr, vid);
674-
iboe_addr_get_sgid(dev_addr,
675-
(union ib_gid *) &resp->ib_route[0].sgid);
662+
rdma_ip2gid((struct sockaddr *)&route->addr.dst_addr,
663+
(union ib_gid *)&resp->ib_route[0].dgid);
664+
rdma_ip2gid((struct sockaddr *)&route->addr.src_addr,
665+
(union ib_gid *)&resp->ib_route[0].sgid);
676666
resp->ib_route[0].pkey = cpu_to_be16(0xffff);
677667
break;
678668
case 2:

include/rdma/ib_addr.h

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,12 @@
3838
#include <linux/in6.h>
3939
#include <linux/if_arp.h>
4040
#include <linux/netdevice.h>
41+
#include <linux/inetdevice.h>
4142
#include <linux/socket.h>
4243
#include <linux/if_vlan.h>
44+
#include <net/ipv6.h>
45+
#include <net/if_inet6.h>
46+
#include <net/ip.h>
4347
#include <rdma/ib_verbs.h>
4448
#include <rdma/ib_pack.h>
4549
#include <net/ipv6.h>
@@ -132,20 +136,10 @@ static inline int rdma_addr_gid_offset(struct rdma_dev_addr *dev_addr)
132136
return dev_addr->dev_type == ARPHRD_INFINIBAND ? 4 : 0;
133137
}
134138

135-
static inline void iboe_mac_vlan_to_ll(union ib_gid *gid, u8 *mac, u16 vid)
139+
static inline u16 rdma_vlan_dev_vlan_id(const struct net_device *dev)
136140
{
137-
memset(gid->raw, 0, 16);
138-
*((__be32 *) gid->raw) = cpu_to_be32(0xfe800000);
139-
if (vid < 0x1000) {
140-
gid->raw[12] = vid & 0xff;
141-
gid->raw[11] = vid >> 8;
142-
} else {
143-
gid->raw[12] = 0xfe;
144-
gid->raw[11] = 0xff;
145-
}
146-
memcpy(gid->raw + 13, mac + 3, 3);
147-
memcpy(gid->raw + 8, mac, 3);
148-
gid->raw[8] ^= 2;
141+
return dev->priv_flags & IFF_802_1Q_VLAN ?
142+
vlan_dev_vlan_id(dev) : 0xffff;
149143
}
150144

151145
static inline int rdma_ip2gid(struct sockaddr *addr, union ib_gid *gid)
@@ -182,25 +176,20 @@ static inline int rdma_gid2ip(struct sockaddr *out, union ib_gid *gid)
182176
return 0;
183177
}
184178

185-
static inline u16 rdma_vlan_dev_vlan_id(const struct net_device *dev)
186-
{
187-
return dev->priv_flags & IFF_802_1Q_VLAN ?
188-
vlan_dev_vlan_id(dev) : 0xffff;
189-
}
190-
191179
static inline void iboe_addr_get_sgid(struct rdma_dev_addr *dev_addr,
192180
union ib_gid *gid)
193181
{
194182
struct net_device *dev;
195-
u16 vid = 0xffff;
183+
struct in_device *ip4;
196184

197185
dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if);
198186
if (dev) {
199-
vid = rdma_vlan_dev_vlan_id(dev);
187+
ip4 = (struct in_device *)dev->ip_ptr;
188+
if (ip4 && ip4->ifa_list && ip4->ifa_list->ifa_address)
189+
ipv6_addr_set_v4mapped(ip4->ifa_list->ifa_address,
190+
(struct in6_addr *)gid);
200191
dev_put(dev);
201192
}
202-
203-
iboe_mac_vlan_to_ll(gid, dev_addr->src_dev_addr, vid);
204193
}
205194

206195
static inline void rdma_addr_get_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid)

0 commit comments

Comments
 (0)