RDMA/cxgb4: Fix RDMA_CM_EVENT_UNREACHABLE error for iWARP
authorAnumula Murali Mohan Reddy <anumula@chelsio.com>
Mon, 7 Oct 2024 13:23:11 +0000 (18:53 +0530)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 11 Oct 2024 16:55:53 +0000 (13:55 -0300)
ip_dev_find() always returns real net_device address, whether traffic is
running on a vlan or real device, if traffic is over vlan, filling
endpoint struture with real ndev and an attempt to send a connect request
will results in RDMA_CM_EVENT_UNREACHABLE error.  This patch fixes the
issue by using vlan_dev_real_dev().

Fixes: 830662f6f032 ("RDMA/cxgb4: Add support for active and passive open connection with IPv6 address")
Link: https://patch.msgid.link/r/20241007132311.70593-1-anumula@chelsio.com
Signed-off-by: Anumula Murali Mohan Reddy <anumula@chelsio.com>
Signed-off-by: Potnuri Bharat Teja <bharat@chelsio.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/cxgb4/cm.c

index b3757c6..8d753e6 100644 (file)
@@ -2086,7 +2086,7 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip,
        err = -ENOMEM;
        if (n->dev->flags & IFF_LOOPBACK) {
                if (iptype == 4)
-                       pdev = ip_dev_find(&init_net, *(__be32 *)peer_ip);
+                       pdev = __ip_dev_find(&init_net, *(__be32 *)peer_ip, false);
                else if (IS_ENABLED(CONFIG_IPV6))
                        for_each_netdev(&init_net, pdev) {
                                if (ipv6_chk_addr(&init_net,
@@ -2101,12 +2101,12 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip,
                        err = -ENODEV;
                        goto out;
                }
+               if (is_vlan_dev(pdev))
+                       pdev = vlan_dev_real_dev(pdev);
                ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t,
                                        n, pdev, rt_tos2priority(tos));
-               if (!ep->l2t) {
-                       dev_put(pdev);
+               if (!ep->l2t)
                        goto out;
-               }
                ep->mtu = pdev->mtu;
                ep->tx_chan = cxgb4_port_chan(pdev);
                ep->smac_idx = ((struct port_info *)netdev_priv(pdev))->smt_idx;
@@ -2119,7 +2119,6 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip,
                ep->rss_qid = cdev->rdev.lldi.rxq_ids[
                        cxgb4_port_idx(pdev) * step];
                set_tcp_window(ep, (struct port_info *)netdev_priv(pdev));
-               dev_put(pdev);
        } else {
                pdev = get_real_dev(n->dev);
                ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t,