RDMA/core: Simplify roce_resolve_route_from_path()
authorParav Pandit <parav@mellanox.com>
Wed, 5 Sep 2018 09:54:24 +0000 (12:54 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 12 Sep 2018 22:32:17 +0000 (16:32 -0600)
Currently RoCE route resolve functionality is split between two
functions. (a) roce_resolve_route_from_path() and its helper function
rdma_resolve_ip_route().

Due to this multiple sockaddr src structures are created in both functions
with rdma_dev_addr is an interface between the two for checks.

Since there is only one user of rdma_resolve_ip_route() as RoCE, combine
the functionality of both functions to roce_resolve_route_from_path() and
further reduce the scope of rdma_dev_addr to core/addr.c

This also allow to extend addr_resolve() in subsequent patch to consider
netdev properties of GID in safer way under rcu lock.

Additionally src and dst addresses were always provided, so skip the src
addr NULL pointer check as they are present on the stack now.

Signed-off-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/addr.c
drivers/infiniband/core/core_priv.h
drivers/infiniband/core/sa_query.c

index 316a53f59ee84525102ba465845fe3764bd678d1..c4c6203349571ea2e266f786df47fc2484858147 100644 (file)
@@ -45,6 +45,7 @@
 #include <net/addrconf.h>
 #include <net/ip6_route.h>
 #include <rdma/ib_addr.h>
+#include <rdma/ib_sa.h>
 #include <rdma/ib.h>
 #include <rdma/rdma_netlink.h>
 #include <net/netlink.h>
@@ -659,23 +660,47 @@ err:
 }
 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;
 }
 
 /**
index c3d93350413ce5055aa1976500305f4379ad1721..4dfcf41d83c0840ead27ae0b5f3bcbea1139a428 100644 (file)
@@ -343,4 +343,7 @@ int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid,
 void rdma_copy_src_l2_addr(struct rdma_dev_addr *dev_addr,
                           const struct net_device *dev);
 
+struct sa_path_rec;
+int roce_resolve_route_from_path(struct sa_path_rec *rec,
+                                const struct ib_gid_attr *attr);
 #endif /* _CORE_PRIV_H */
index 7b794a14d6e851fbc4afc82711ecdb6ecf336c61..d3d6275b3b7efa2320d4faefaa745f953bcdf37e 100644 (file)
@@ -1227,46 +1227,6 @@ static u8 get_src_path_mask(struct ib_device *device, u8 port_num)
        return src_path_mask;
 }
 
-static int roce_resolve_route_from_path(struct sa_path_rec *rec,
-                                       const struct ib_gid_attr *attr)
-{
-       struct rdma_dev_addr dev_addr = {};
-       union {
-               struct sockaddr     _sockaddr;
-               struct sockaddr_in  _sockaddr_in;
-               struct sockaddr_in6 _sockaddr_in6;
-       } sgid_addr, dgid_addr;
-       int ret;
-
-       if (rec->roce.route_resolved)
-               return 0;
-       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;
-
-       rdma_gid2ip(&sgid_addr._sockaddr, &rec->sgid);
-       rdma_gid2ip(&dgid_addr._sockaddr, &rec->dgid);
-
-       /* validate the route */
-       ret = rdma_resolve_ip_route(&sgid_addr._sockaddr,
-                                   &dgid_addr._sockaddr, &dev_addr);
-       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;
-}
-
 static int init_ah_attr_grh_fields(struct ib_device *device, u8 port_num,
                                   struct sa_path_rec *rec,
                                   struct rdma_ah_attr *ah_attr,