|
@@ -45,6 +45,7 @@
|
|
#include <net/addrconf.h>
|
|
#include <net/addrconf.h>
|
|
#include <net/ip6_route.h>
|
|
#include <net/ip6_route.h>
|
|
#include <rdma/ib_addr.h>
|
|
#include <rdma/ib_addr.h>
|
|
|
|
+#include <rdma/ib_sa.h>
|
|
#include <rdma/ib.h>
|
|
#include <rdma/ib.h>
|
|
#include <rdma/rdma_netlink.h>
|
|
#include <rdma/rdma_netlink.h>
|
|
#include <net/netlink.h>
|
|
#include <net/netlink.h>
|
|
@@ -659,23 +660,47 @@ err:
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(rdma_resolve_ip);
|
|
EXPORT_SYMBOL(rdma_resolve_ip);
|
|
|
|
|
|
-int rdma_resolve_ip_route(struct sockaddr *src_addr,
|
|
|
|
- const struct sockaddr *dst_addr,
|
|
|
|
- struct rdma_dev_addr *addr)
|
|
|
|
|
|
+int roce_resolve_route_from_path(struct sa_path_rec *rec,
|
|
|
|
+ const struct ib_gid_attr *attr)
|
|
{
|
|
{
|
|
- struct sockaddr_storage ssrc_addr = {};
|
|
|
|
- struct sockaddr *src_in = (struct sockaddr *)&ssrc_addr;
|
|
|
|
|
|
+ union {
|
|
|
|
+ struct sockaddr _sockaddr;
|
|
|
|
+ struct sockaddr_in _sockaddr_in;
|
|
|
|
+ struct sockaddr_in6 _sockaddr_in6;
|
|
|
|
+ } sgid, dgid;
|
|
|
|
+ struct rdma_dev_addr dev_addr = {};
|
|
|
|
+ int ret;
|
|
|
|
|
|
- if (src_addr) {
|
|
|
|
- if (src_addr->sa_family != dst_addr->sa_family)
|
|
|
|
- return -EINVAL;
|
|
|
|
|
|
+ if (rec->roce.route_resolved)
|
|
|
|
+ return 0;
|
|
|
|
|
|
- memcpy(src_in, src_addr, rdma_addr_size(src_addr));
|
|
|
|
- } else {
|
|
|
|
- src_in->sa_family = dst_addr->sa_family;
|
|
|
|
- }
|
|
|
|
|
|
+ rdma_gid2ip(&sgid._sockaddr, &rec->sgid);
|
|
|
|
+ rdma_gid2ip(&dgid._sockaddr, &rec->dgid);
|
|
|
|
+
|
|
|
|
+ if (sgid._sockaddr.sa_family != dgid._sockaddr.sa_family)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ if (!attr || !attr->ndev)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ dev_addr.bound_dev_if = attr->ndev->ifindex;
|
|
|
|
+ /* TODO: Use net from the ib_gid_attr once it is added to it,
|
|
|
|
+ * until than, limit itself to init_net.
|
|
|
|
+ */
|
|
|
|
+ dev_addr.net = &init_net;
|
|
|
|
|
|
- return addr_resolve(src_in, dst_addr, addr, false, 0);
|
|
|
|
|
|
+ ret = addr_resolve(&sgid._sockaddr, &dgid._sockaddr,
|
|
|
|
+ &dev_addr, false, 0);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ if ((dev_addr.network == RDMA_NETWORK_IPV4 ||
|
|
|
|
+ dev_addr.network == RDMA_NETWORK_IPV6) &&
|
|
|
|
+ rec->rec_type != SA_PATH_REC_TYPE_ROCE_V2)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ rec->roce.route_resolved = true;
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|