The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/ofed/drivers/infiniband/core/ib_cma.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
    3  *
    4  * Copyright (c) 2005 Voltaire Inc.  All rights reserved.
    5  * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
    6  * Copyright (c) 1999-2005, Mellanox Technologies, Inc. All rights reserved.
    7  * Copyright (c) 2005-2006 Intel Corporation.  All rights reserved.
    8  *
    9  * This software is available to you under a choice of one of two
   10  * licenses.  You may choose to be licensed under the terms of the GNU
   11  * General Public License (GPL) Version 2, available from the file
   12  * COPYING in the main directory of this source tree, or the
   13  * OpenIB.org BSD license below:
   14  *
   15  *     Redistribution and use in source and binary forms, with or
   16  *     without modification, are permitted provided that the following
   17  *     conditions are met:
   18  *
   19  *      - Redistributions of source code must retain the above
   20  *        copyright notice, this list of conditions and the following
   21  *        disclaimer.
   22  *
   23  *      - Redistributions in binary form must reproduce the above
   24  *        copyright notice, this list of conditions and the following
   25  *        disclaimer in the documentation and/or other materials
   26  *        provided with the distribution.
   27  *
   28  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
   29  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   30  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   31  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
   32  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
   33  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
   34  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
   35  * SOFTWARE.
   36  */
   37 
   38 #include <sys/cdefs.h>
   39 __FBSDID("$FreeBSD$");
   40 
   41 #define LINUXKPI_PARAM_PREFIX ibcore_
   42 
   43 #include "opt_inet.h"
   44 #include "opt_inet6.h"
   45 
   46 #include <linux/completion.h>
   47 #include <linux/in.h>
   48 #include <linux/in6.h>
   49 #include <linux/mutex.h>
   50 #include <linux/random.h>
   51 #include <linux/idr.h>
   52 #include <linux/slab.h>
   53 #include <linux/module.h>
   54 #include <net/route.h>
   55 #include <net/route/nhop.h>
   56 
   57 #include <net/tcp.h>
   58 #include <net/ipv6.h>
   59 
   60 #include <netinet/in_fib.h>
   61 
   62 #include <netinet6/in6_fib.h>
   63 #include <netinet6/scope6_var.h>
   64 #include <netinet6/ip6_var.h>
   65 
   66 #include <rdma/rdma_cm.h>
   67 #include <rdma/rdma_cm_ib.h>
   68 #include <rdma/rdma_sdp.h>
   69 #include <rdma/ib.h>
   70 #include <rdma/ib_addr.h>
   71 #include <rdma/ib_cache.h>
   72 #include <rdma/ib_cm.h>
   73 #include <rdma/ib_sa.h>
   74 #include <rdma/iw_cm.h>
   75 
   76 #include <sys/priv.h>
   77 
   78 #include "core_priv.h"
   79 
   80 MODULE_AUTHOR("Sean Hefty");
   81 MODULE_DESCRIPTION("Generic RDMA CM Agent");
   82 MODULE_LICENSE("Dual BSD/GPL");
   83 
   84 #define CMA_CM_RESPONSE_TIMEOUT 20
   85 #define CMA_QUERY_CLASSPORT_INFO_TIMEOUT 3000
   86 #define CMA_MAX_CM_RETRIES 15
   87 #define CMA_CM_MRA_SETTING (IB_CM_MRA_FLAG_DELAY | 24)
   88 #define CMA_IBOE_PACKET_LIFETIME 18
   89 
   90 static const char * const cma_events[] = {
   91         [RDMA_CM_EVENT_ADDR_RESOLVED]    = "address resolved",
   92         [RDMA_CM_EVENT_ADDR_ERROR]       = "address error",
   93         [RDMA_CM_EVENT_ROUTE_RESOLVED]   = "route resolved ",
   94         [RDMA_CM_EVENT_ROUTE_ERROR]      = "route error",
   95         [RDMA_CM_EVENT_CONNECT_REQUEST]  = "connect request",
   96         [RDMA_CM_EVENT_CONNECT_RESPONSE] = "connect response",
   97         [RDMA_CM_EVENT_CONNECT_ERROR]    = "connect error",
   98         [RDMA_CM_EVENT_UNREACHABLE]      = "unreachable",
   99         [RDMA_CM_EVENT_REJECTED]         = "rejected",
  100         [RDMA_CM_EVENT_ESTABLISHED]      = "established",
  101         [RDMA_CM_EVENT_DISCONNECTED]     = "disconnected",
  102         [RDMA_CM_EVENT_DEVICE_REMOVAL]   = "device removal",
  103         [RDMA_CM_EVENT_MULTICAST_JOIN]   = "multicast join",
  104         [RDMA_CM_EVENT_MULTICAST_ERROR]  = "multicast error",
  105         [RDMA_CM_EVENT_ADDR_CHANGE]      = "address change",
  106         [RDMA_CM_EVENT_TIMEWAIT_EXIT]    = "timewait exit",
  107 };
  108 
  109 const char *__attribute_const__ rdma_event_msg(enum rdma_cm_event_type event)
  110 {
  111         size_t index = event;
  112 
  113         return (index < ARRAY_SIZE(cma_events) && cma_events[index]) ?
  114                         cma_events[index] : "unrecognized event";
  115 }
  116 EXPORT_SYMBOL(rdma_event_msg);
  117 
  118 const char *__attribute_const__ rdma_reject_msg(struct rdma_cm_id *id,
  119                                                 int reason)
  120 {
  121         if (rdma_ib_or_roce(id->device, id->port_num))
  122                 return ibcm_reject_msg(reason);
  123 
  124         if (rdma_protocol_iwarp(id->device, id->port_num))
  125                 return iwcm_reject_msg(reason);
  126 
  127         WARN_ON_ONCE(1);
  128         return "unrecognized transport";
  129 }
  130 EXPORT_SYMBOL(rdma_reject_msg);
  131 
  132 static int cma_check_linklocal(struct rdma_dev_addr *, struct sockaddr *);
  133 static void cma_add_one(struct ib_device *device);
  134 static void cma_remove_one(struct ib_device *device, void *client_data);
  135 static enum rdma_port_space rdma_ps_from_service_id(__be64 service_id);
  136 
  137 static struct ib_client cma_client = {
  138         .name   = "cma",
  139         .add    = cma_add_one,
  140         .remove = cma_remove_one
  141 };
  142 
  143 static struct ib_sa_client sa_client;
  144 static struct rdma_addr_client addr_client;
  145 static LIST_HEAD(dev_list);
  146 static LIST_HEAD(listen_any_list);
  147 static DEFINE_MUTEX(lock);
  148 static struct workqueue_struct *cma_wq;
  149 
  150 struct cma_pernet {
  151         struct idr tcp_ps;
  152         struct idr udp_ps;
  153         struct idr ipoib_ps;
  154         struct idr ib_ps;
  155         struct idr sdp_ps;
  156 };
  157 
  158 VNET_DEFINE(struct cma_pernet, cma_pernet);
  159 
  160 static struct cma_pernet *cma_pernet_ptr(struct vnet *vnet)
  161 {
  162         struct cma_pernet *retval;
  163 
  164         CURVNET_SET_QUIET(vnet);
  165         retval = &VNET(cma_pernet);
  166         CURVNET_RESTORE();
  167 
  168         return (retval);
  169 }
  170 
  171 static struct idr *cma_pernet_idr(struct vnet *net, enum rdma_port_space ps)
  172 {
  173         struct cma_pernet *pernet = cma_pernet_ptr(net);
  174 
  175         switch (ps) {
  176         case RDMA_PS_TCP:
  177                 return &pernet->tcp_ps;
  178         case RDMA_PS_UDP:
  179                 return &pernet->udp_ps;
  180         case RDMA_PS_IPOIB:
  181                 return &pernet->ipoib_ps;
  182         case RDMA_PS_IB:
  183                 return &pernet->ib_ps;
  184         case RDMA_PS_SDP:
  185                 return &pernet->sdp_ps;
  186         default:
  187                 return NULL;
  188         }
  189 }
  190 
  191 struct cma_device {
  192         struct list_head        list;
  193         struct ib_device        *device;
  194         struct completion       comp;
  195         atomic_t                refcount;
  196         struct list_head        id_list;
  197         struct sysctl_ctx_list  sysctl_ctx;
  198         enum ib_gid_type        *default_gid_type;
  199 };
  200 
  201 struct rdma_bind_list {
  202         enum rdma_port_space    ps;
  203         struct hlist_head       owners;
  204         unsigned short          port;
  205 };
  206 
  207 struct class_port_info_context {
  208         struct ib_class_port_info       *class_port_info;
  209         struct ib_device                *device;
  210         struct completion               done;
  211         struct ib_sa_query              *sa_query;
  212         u8                              port_num;
  213 };
  214 
  215 static int cma_ps_alloc(struct vnet *vnet, enum rdma_port_space ps,
  216                         struct rdma_bind_list *bind_list, int snum)
  217 {
  218         struct idr *idr = cma_pernet_idr(vnet, ps);
  219 
  220         return idr_alloc(idr, bind_list, snum, snum + 1, GFP_KERNEL);
  221 }
  222 
  223 static struct rdma_bind_list *cma_ps_find(struct vnet *net,
  224                                           enum rdma_port_space ps, int snum)
  225 {
  226         struct idr *idr = cma_pernet_idr(net, ps);
  227 
  228         return idr_find(idr, snum);
  229 }
  230 
  231 static void cma_ps_remove(struct vnet *net, enum rdma_port_space ps, int snum)
  232 {
  233         struct idr *idr = cma_pernet_idr(net, ps);
  234 
  235         idr_remove(idr, snum);
  236 }
  237 
  238 enum {
  239         CMA_OPTION_AFONLY,
  240 };
  241 
  242 void cma_ref_dev(struct cma_device *cma_dev)
  243 {
  244         atomic_inc(&cma_dev->refcount);
  245 }
  246 
  247 struct cma_device *cma_enum_devices_by_ibdev(cma_device_filter  filter,
  248                                              void               *cookie)
  249 {
  250         struct cma_device *cma_dev;
  251         struct cma_device *found_cma_dev = NULL;
  252 
  253         mutex_lock(&lock);
  254 
  255         list_for_each_entry(cma_dev, &dev_list, list)
  256                 if (filter(cma_dev->device, cookie)) {
  257                         found_cma_dev = cma_dev;
  258                         break;
  259                 }
  260 
  261         if (found_cma_dev)
  262                 cma_ref_dev(found_cma_dev);
  263         mutex_unlock(&lock);
  264         return found_cma_dev;
  265 }
  266 
  267 int cma_get_default_gid_type(struct cma_device *cma_dev,
  268                              unsigned int port)
  269 {
  270         if (!rdma_is_port_valid(cma_dev->device, port))
  271                 return -EINVAL;
  272 
  273         return cma_dev->default_gid_type[port - rdma_start_port(cma_dev->device)];
  274 }
  275 
  276 int cma_set_default_gid_type(struct cma_device *cma_dev,
  277                              unsigned int port,
  278                              enum ib_gid_type default_gid_type)
  279 {
  280         unsigned long supported_gids;
  281 
  282         if (!rdma_is_port_valid(cma_dev->device, port))
  283                 return -EINVAL;
  284 
  285         supported_gids = roce_gid_type_mask_support(cma_dev->device, port);
  286 
  287         if (!(supported_gids & 1 << default_gid_type))
  288                 return -EINVAL;
  289 
  290         cma_dev->default_gid_type[port - rdma_start_port(cma_dev->device)] =
  291                 default_gid_type;
  292 
  293         return 0;
  294 }
  295 
  296 struct ib_device *cma_get_ib_dev(struct cma_device *cma_dev)
  297 {
  298         return cma_dev->device;
  299 }
  300 
  301 /*
  302  * Device removal can occur at anytime, so we need extra handling to
  303  * serialize notifying the user of device removal with other callbacks.
  304  * We do this by disabling removal notification while a callback is in process,
  305  * and reporting it after the callback completes.
  306  */
  307 struct rdma_id_private {
  308         struct rdma_cm_id       id;
  309 
  310         struct rdma_bind_list   *bind_list;
  311         struct hlist_node       node;
  312         struct list_head        list; /* listen_any_list or cma_device.list */
  313         struct list_head        listen_list; /* per device listens */
  314         struct cma_device       *cma_dev;
  315         struct list_head        mc_list;
  316 
  317         int                     internal_id;
  318         enum rdma_cm_state      state;
  319         spinlock_t              lock;
  320         struct mutex            qp_mutex;
  321 
  322         struct completion       comp;
  323         atomic_t                refcount;
  324         struct mutex            handler_mutex;
  325 
  326         int                     backlog;
  327         int                     timeout_ms;
  328         struct ib_sa_query      *query;
  329         int                     query_id;
  330         union {
  331                 struct ib_cm_id *ib;
  332                 struct iw_cm_id *iw;
  333         } cm_id;
  334 
  335         u32                     seq_num;
  336         u32                     qkey;
  337         u32                     qp_num;
  338         pid_t                   owner;
  339         u32                     options;
  340         u8                      srq;
  341         u8                      tos;
  342         u8                      timeout_set:1;
  343         u8                      reuseaddr;
  344         u8                      afonly;
  345         u8                      timeout;
  346         enum ib_gid_type        gid_type;
  347 };
  348 
  349 struct cma_multicast {
  350         struct rdma_id_private *id_priv;
  351         union {
  352                 struct ib_sa_multicast *ib;
  353         } multicast;
  354         struct list_head        list;
  355         void                    *context;
  356         struct sockaddr_storage addr;
  357         struct kref             mcref;
  358         bool                    igmp_joined;
  359         u8                      join_state;
  360 };
  361 
  362 struct cma_work {
  363         struct work_struct      work;
  364         struct rdma_id_private  *id;
  365         enum rdma_cm_state      old_state;
  366         enum rdma_cm_state      new_state;
  367         struct rdma_cm_event    event;
  368 };
  369 
  370 struct cma_ndev_work {
  371         struct work_struct      work;
  372         struct rdma_id_private  *id;
  373         struct rdma_cm_event    event;
  374 };
  375 
  376 struct iboe_mcast_work {
  377         struct work_struct       work;
  378         struct rdma_id_private  *id;
  379         struct cma_multicast    *mc;
  380 };
  381 
  382 struct cma_hdr {
  383         u8 cma_version;
  384         u8 ip_version;  /* IP version: 7:4 */
  385         __be16 port;
  386         union cma_ip_addr src_addr;
  387         union cma_ip_addr dst_addr;
  388 };
  389 
  390 #define CMA_VERSION 0x00
  391 #define SDP_MAJ_VERSION 0x2
  392 
  393 struct cma_req_info {
  394         struct ib_device *device;
  395         int port;
  396         union ib_gid local_gid;
  397         __be64 service_id;
  398         u16 pkey;
  399         bool has_gid:1;
  400 };
  401 
  402 static int cma_comp(struct rdma_id_private *id_priv, enum rdma_cm_state comp)
  403 {
  404         unsigned long flags;
  405         int ret;
  406 
  407         spin_lock_irqsave(&id_priv->lock, flags);
  408         ret = (id_priv->state == comp);
  409         spin_unlock_irqrestore(&id_priv->lock, flags);
  410         return ret;
  411 }
  412 
  413 static int cma_comp_exch(struct rdma_id_private *id_priv,
  414                          enum rdma_cm_state comp, enum rdma_cm_state exch)
  415 {
  416         unsigned long flags;
  417         int ret;
  418 
  419         spin_lock_irqsave(&id_priv->lock, flags);
  420         if ((ret = (id_priv->state == comp)))
  421                 id_priv->state = exch;
  422         spin_unlock_irqrestore(&id_priv->lock, flags);
  423         return ret;
  424 }
  425 
  426 static enum rdma_cm_state cma_exch(struct rdma_id_private *id_priv,
  427                                    enum rdma_cm_state exch)
  428 {
  429         unsigned long flags;
  430         enum rdma_cm_state old;
  431 
  432         spin_lock_irqsave(&id_priv->lock, flags);
  433         old = id_priv->state;
  434         id_priv->state = exch;
  435         spin_unlock_irqrestore(&id_priv->lock, flags);
  436         return old;
  437 }
  438 
  439 static inline u8 cma_get_ip_ver(const struct cma_hdr *hdr)
  440 {
  441         return hdr->ip_version >> 4;
  442 }
  443 
  444 static inline void cma_set_ip_ver(struct cma_hdr *hdr, u8 ip_ver)
  445 {
  446         hdr->ip_version = (ip_ver << 4) | (hdr->ip_version & 0xF);
  447 }
  448 
  449 static inline u8 sdp_get_majv(u8 sdp_version)
  450 {
  451         return sdp_version >> 4;
  452 }
  453 
  454 static inline u8 sdp_get_ip_ver(const struct sdp_hh *hh)
  455 {
  456         return hh->ipv_cap >> 4;
  457 }
  458 
  459 static inline void sdp_set_ip_ver(struct sdp_hh *hh, u8 ip_ver)
  460 {
  461         hh->ipv_cap = (ip_ver << 4) | (hh->ipv_cap & 0xF);
  462 }
  463 
  464 static int cma_igmp_send(struct ifnet *ndev, const union ib_gid *mgid, bool join)
  465 {
  466         int retval;
  467 
  468         if (ndev) {
  469                 union rdma_sockaddr addr;
  470 
  471                 rdma_gid2ip(&addr._sockaddr, mgid);
  472 
  473                 CURVNET_SET_QUIET(ndev->if_vnet);
  474                 if (join)
  475                         retval = -if_addmulti(ndev, &addr._sockaddr, NULL);
  476                 else
  477                         retval = -if_delmulti(ndev, &addr._sockaddr);
  478                 CURVNET_RESTORE();
  479         } else {
  480                 retval = -ENODEV;
  481         }
  482         return retval;
  483 }
  484 
  485 static void _cma_attach_to_dev(struct rdma_id_private *id_priv,
  486                                struct cma_device *cma_dev)
  487 {
  488         cma_ref_dev(cma_dev);
  489         id_priv->cma_dev = cma_dev;
  490         id_priv->gid_type = 0;
  491         id_priv->id.device = cma_dev->device;
  492         id_priv->id.route.addr.dev_addr.transport =
  493                 rdma_node_get_transport(cma_dev->device->node_type);
  494         list_add_tail(&id_priv->list, &cma_dev->id_list);
  495 }
  496 
  497 static void cma_attach_to_dev(struct rdma_id_private *id_priv,
  498                               struct cma_device *cma_dev)
  499 {
  500         _cma_attach_to_dev(id_priv, cma_dev);
  501         id_priv->gid_type =
  502                 cma_dev->default_gid_type[id_priv->id.port_num -
  503                                           rdma_start_port(cma_dev->device)];
  504 }
  505 
  506 void cma_deref_dev(struct cma_device *cma_dev)
  507 {
  508         if (atomic_dec_and_test(&cma_dev->refcount))
  509                 complete(&cma_dev->comp);
  510 }
  511 
  512 static inline void release_mc(struct kref *kref)
  513 {
  514         struct cma_multicast *mc = container_of(kref, struct cma_multicast, mcref);
  515 
  516         kfree(mc->multicast.ib);
  517         kfree(mc);
  518 }
  519 
  520 static void cma_release_dev(struct rdma_id_private *id_priv)
  521 {
  522         mutex_lock(&lock);
  523         list_del(&id_priv->list);
  524         cma_deref_dev(id_priv->cma_dev);
  525         id_priv->cma_dev = NULL;
  526         mutex_unlock(&lock);
  527 }
  528 
  529 static inline struct sockaddr *cma_src_addr(struct rdma_id_private *id_priv)
  530 {
  531         return (struct sockaddr *) &id_priv->id.route.addr.src_addr;
  532 }
  533 
  534 static inline struct sockaddr *cma_dst_addr(struct rdma_id_private *id_priv)
  535 {
  536         return (struct sockaddr *) &id_priv->id.route.addr.dst_addr;
  537 }
  538 
  539 static inline unsigned short cma_family(struct rdma_id_private *id_priv)
  540 {
  541         return id_priv->id.route.addr.src_addr.ss_family;
  542 }
  543 
  544 static int cma_set_qkey(struct rdma_id_private *id_priv, u32 qkey)
  545 {
  546         struct ib_sa_mcmember_rec rec;
  547         int ret = 0;
  548 
  549         if (id_priv->qkey) {
  550                 if (qkey && id_priv->qkey != qkey)
  551                         return -EINVAL;
  552                 return 0;
  553         }
  554 
  555         if (qkey) {
  556                 id_priv->qkey = qkey;
  557                 return 0;
  558         }
  559 
  560         switch (id_priv->id.ps) {
  561         case RDMA_PS_UDP:
  562         case RDMA_PS_IB:
  563                 id_priv->qkey = RDMA_UDP_QKEY;
  564                 break;
  565         case RDMA_PS_IPOIB:
  566                 ib_addr_get_mgid(&id_priv->id.route.addr.dev_addr, &rec.mgid);
  567                 ret = ib_sa_get_mcmember_rec(id_priv->id.device,
  568                                              id_priv->id.port_num, &rec.mgid,
  569                                              &rec);
  570                 if (!ret)
  571                         id_priv->qkey = be32_to_cpu(rec.qkey);
  572                 break;
  573         default:
  574                 break;
  575         }
  576         return ret;
  577 }
  578 
  579 static void cma_translate_ib(struct sockaddr_ib *sib, struct rdma_dev_addr *dev_addr)
  580 {
  581         dev_addr->dev_type = ARPHRD_INFINIBAND;
  582         rdma_addr_set_sgid(dev_addr, (union ib_gid *) &sib->sib_addr);
  583         ib_addr_set_pkey(dev_addr, ntohs(sib->sib_pkey));
  584 }
  585 
  586 static int cma_translate_addr(struct sockaddr *addr, struct rdma_dev_addr *dev_addr)
  587 {
  588         int ret;
  589 
  590         if (addr->sa_family != AF_IB) {
  591                 ret = rdma_translate_ip(addr, dev_addr);
  592         } else {
  593                 cma_translate_ib((struct sockaddr_ib *) addr, dev_addr);
  594                 ret = 0;
  595         }
  596 
  597         return ret;
  598 }
  599 
  600 static inline int cma_validate_port(struct ib_device *device, u8 port,
  601                                     enum ib_gid_type gid_type,
  602                                     union ib_gid *gid,
  603                                     const struct rdma_dev_addr *dev_addr)
  604 {
  605         const int dev_type = dev_addr->dev_type;
  606         struct ifnet *ndev;
  607         int ret = -ENODEV;
  608 
  609         if ((dev_type == ARPHRD_INFINIBAND) && !rdma_protocol_ib(device, port))
  610                 return ret;
  611 
  612         if ((dev_type != ARPHRD_INFINIBAND) && rdma_protocol_ib(device, port))
  613                 return ret;
  614 
  615         if (dev_type == ARPHRD_ETHER && rdma_protocol_roce(device, port)) {
  616                 ndev = dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if);
  617         } else {
  618                 ndev = NULL;
  619                 gid_type = IB_GID_TYPE_IB;
  620         }
  621 
  622         ret = ib_find_cached_gid_by_port(device, gid, gid_type, port,
  623                                          ndev, NULL);
  624 
  625         if (ndev)
  626                 dev_put(ndev);
  627 
  628         return ret;
  629 }
  630 
  631 static int cma_acquire_dev(struct rdma_id_private *id_priv,
  632                            struct rdma_id_private *listen_id_priv)
  633 {
  634         struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
  635         struct cma_device *cma_dev;
  636         union ib_gid gid, iboe_gid, *gidp;
  637         int ret = -ENODEV;
  638         u8 port;
  639 
  640         if (dev_addr->dev_type != ARPHRD_INFINIBAND &&
  641             id_priv->id.ps == RDMA_PS_IPOIB)
  642                 return -EINVAL;
  643 
  644         mutex_lock(&lock);
  645         rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr,
  646                     &iboe_gid);
  647 
  648         memcpy(&gid, dev_addr->src_dev_addr +
  649                rdma_addr_gid_offset(dev_addr), sizeof gid);
  650 
  651         if (listen_id_priv) {
  652                 cma_dev = listen_id_priv->cma_dev;
  653                 port = listen_id_priv->id.port_num;
  654 
  655                 if (rdma_is_port_valid(cma_dev->device, port)) {
  656                         gidp = rdma_protocol_roce(cma_dev->device, port) ?
  657                                &iboe_gid : &gid;
  658 
  659                         ret = cma_validate_port(cma_dev->device, port,
  660                                 rdma_protocol_ib(cma_dev->device, port) ?
  661                                 IB_GID_TYPE_IB :
  662                                 listen_id_priv->gid_type, gidp, dev_addr);
  663                         if (!ret) {
  664                                 id_priv->id.port_num = port;
  665                                 goto out;
  666                         }
  667                 }
  668         }
  669 
  670         list_for_each_entry(cma_dev, &dev_list, list) {
  671                 for (port = 1; port <= cma_dev->device->phys_port_cnt; ++port) {
  672                         if (listen_id_priv &&
  673                             listen_id_priv->cma_dev == cma_dev &&
  674                             listen_id_priv->id.port_num == port)
  675                                 continue;
  676 
  677                         gidp = rdma_protocol_roce(cma_dev->device, port) ?
  678                                &iboe_gid : &gid;
  679 
  680                         ret = cma_validate_port(cma_dev->device, port,
  681                                                 rdma_protocol_ib(cma_dev->device, port) ?
  682                                                 IB_GID_TYPE_IB :
  683                                                 cma_dev->default_gid_type[port - 1],
  684                                                 gidp, dev_addr);
  685                         if (!ret) {
  686                                 id_priv->id.port_num = port;
  687                                 goto out;
  688                         }
  689                 }
  690         }
  691 
  692 out:
  693         if (!ret)
  694                 cma_attach_to_dev(id_priv, cma_dev);
  695 
  696         mutex_unlock(&lock);
  697         return ret;
  698 }
  699 
  700 /*
  701  * Select the source IB device and address to reach the destination IB address.
  702  */
  703 static int cma_resolve_ib_dev(struct rdma_id_private *id_priv)
  704 {
  705         struct cma_device *cma_dev, *cur_dev;
  706         struct sockaddr_ib *addr;
  707         union ib_gid gid, sgid, *dgid;
  708         u16 pkey, index;
  709         u8 p;
  710         int i;
  711 
  712         cma_dev = NULL;
  713         addr = (struct sockaddr_ib *) cma_dst_addr(id_priv);
  714         dgid = (union ib_gid *) &addr->sib_addr;
  715         pkey = ntohs(addr->sib_pkey);
  716 
  717         list_for_each_entry(cur_dev, &dev_list, list) {
  718                 for (p = 1; p <= cur_dev->device->phys_port_cnt; ++p) {
  719                         if (!rdma_cap_af_ib(cur_dev->device, p))
  720                                 continue;
  721 
  722                         if (ib_find_cached_pkey(cur_dev->device, p, pkey, &index))
  723                                 continue;
  724 
  725                         for (i = 0; !ib_get_cached_gid(cur_dev->device, p, i,
  726                                                        &gid, NULL);
  727                              i++) {
  728                                 if (!memcmp(&gid, dgid, sizeof(gid))) {
  729                                         cma_dev = cur_dev;
  730                                         sgid = gid;
  731                                         id_priv->id.port_num = p;
  732                                         goto found;
  733                                 }
  734 
  735                                 if (!cma_dev && (gid.global.subnet_prefix ==
  736                                                  dgid->global.subnet_prefix)) {
  737                                         cma_dev = cur_dev;
  738                                         sgid = gid;
  739                                         id_priv->id.port_num = p;
  740                                 }
  741                         }
  742                 }
  743         }
  744 
  745         if (!cma_dev)
  746                 return -ENODEV;
  747 
  748 found:
  749         cma_attach_to_dev(id_priv, cma_dev);
  750         addr = (struct sockaddr_ib *) cma_src_addr(id_priv);
  751         memcpy(&addr->sib_addr, &sgid, sizeof sgid);
  752         cma_translate_ib(addr, &id_priv->id.route.addr.dev_addr);
  753         return 0;
  754 }
  755 
  756 static void cma_deref_id(struct rdma_id_private *id_priv)
  757 {
  758         if (atomic_dec_and_test(&id_priv->refcount))
  759                 complete(&id_priv->comp);
  760 }
  761 
  762 struct rdma_cm_id *rdma_create_id(struct vnet *net,
  763                                   rdma_cm_event_handler event_handler,
  764                                   void *context, enum rdma_port_space ps,
  765                                   enum ib_qp_type qp_type)
  766 {
  767         struct rdma_id_private *id_priv;
  768 
  769 #ifdef VIMAGE
  770         if (net == NULL)
  771                 return ERR_PTR(-EINVAL);
  772 #endif
  773         id_priv = kzalloc(sizeof *id_priv, GFP_KERNEL);
  774         if (!id_priv)
  775                 return ERR_PTR(-ENOMEM);
  776 
  777         id_priv->owner = task_pid_nr(current);
  778         id_priv->state = RDMA_CM_IDLE;
  779         id_priv->id.context = context;
  780         id_priv->id.event_handler = event_handler;
  781         id_priv->id.ps = ps;
  782         id_priv->id.qp_type = qp_type;
  783         id_priv->timeout_set = false;
  784         spin_lock_init(&id_priv->lock);
  785         mutex_init(&id_priv->qp_mutex);
  786         init_completion(&id_priv->comp);
  787         atomic_set(&id_priv->refcount, 1);
  788         mutex_init(&id_priv->handler_mutex);
  789         INIT_LIST_HEAD(&id_priv->listen_list);
  790         INIT_LIST_HEAD(&id_priv->mc_list);
  791         get_random_bytes(&id_priv->seq_num, sizeof id_priv->seq_num);
  792         id_priv->id.route.addr.dev_addr.net = net;
  793 
  794         return &id_priv->id;
  795 }
  796 EXPORT_SYMBOL(rdma_create_id);
  797 
  798 static int cma_init_ud_qp(struct rdma_id_private *id_priv, struct ib_qp *qp)
  799 {
  800         struct ib_qp_attr qp_attr;
  801         int qp_attr_mask, ret;
  802 
  803         qp_attr.qp_state = IB_QPS_INIT;
  804         ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
  805         if (ret)
  806                 return ret;
  807 
  808         ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask);
  809         if (ret)
  810                 return ret;
  811 
  812         qp_attr.qp_state = IB_QPS_RTR;
  813         ret = ib_modify_qp(qp, &qp_attr, IB_QP_STATE);
  814         if (ret)
  815                 return ret;
  816 
  817         qp_attr.qp_state = IB_QPS_RTS;
  818         qp_attr.sq_psn = 0;
  819         ret = ib_modify_qp(qp, &qp_attr, IB_QP_STATE | IB_QP_SQ_PSN);
  820 
  821         return ret;
  822 }
  823 
  824 static int cma_init_conn_qp(struct rdma_id_private *id_priv, struct ib_qp *qp)
  825 {
  826         struct ib_qp_attr qp_attr;
  827         int qp_attr_mask, ret;
  828 
  829         qp_attr.qp_state = IB_QPS_INIT;
  830         ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
  831         if (ret)
  832                 return ret;
  833 
  834         return ib_modify_qp(qp, &qp_attr, qp_attr_mask);
  835 }
  836 
  837 int rdma_create_qp(struct rdma_cm_id *id, struct ib_pd *pd,
  838                    struct ib_qp_init_attr *qp_init_attr)
  839 {
  840         struct rdma_id_private *id_priv;
  841         struct ib_qp *qp;
  842         int ret;
  843 
  844         id_priv = container_of(id, struct rdma_id_private, id);
  845         if (id->device != pd->device)
  846                 return -EINVAL;
  847 
  848         qp_init_attr->port_num = id->port_num;
  849         qp = ib_create_qp(pd, qp_init_attr);
  850         if (IS_ERR(qp))
  851                 return PTR_ERR(qp);
  852 
  853         if (id->qp_type == IB_QPT_UD)
  854                 ret = cma_init_ud_qp(id_priv, qp);
  855         else
  856                 ret = cma_init_conn_qp(id_priv, qp);
  857         if (ret)
  858                 goto err;
  859 
  860         id->qp = qp;
  861         id_priv->qp_num = qp->qp_num;
  862         id_priv->srq = (qp->srq != NULL);
  863         return 0;
  864 err:
  865         ib_destroy_qp(qp);
  866         return ret;
  867 }
  868 EXPORT_SYMBOL(rdma_create_qp);
  869 
  870 void rdma_destroy_qp(struct rdma_cm_id *id)
  871 {
  872         struct rdma_id_private *id_priv;
  873 
  874         id_priv = container_of(id, struct rdma_id_private, id);
  875         mutex_lock(&id_priv->qp_mutex);
  876         ib_destroy_qp(id_priv->id.qp);
  877         id_priv->id.qp = NULL;
  878         mutex_unlock(&id_priv->qp_mutex);
  879 }
  880 EXPORT_SYMBOL(rdma_destroy_qp);
  881 
  882 static int cma_modify_qp_rtr(struct rdma_id_private *id_priv,
  883                              struct rdma_conn_param *conn_param)
  884 {
  885         struct ib_qp_attr qp_attr;
  886         int qp_attr_mask, ret;
  887         union ib_gid sgid;
  888 
  889         mutex_lock(&id_priv->qp_mutex);
  890         if (!id_priv->id.qp) {
  891                 ret = 0;
  892                 goto out;
  893         }
  894 
  895         /* Need to update QP attributes from default values. */
  896         qp_attr.qp_state = IB_QPS_INIT;
  897         ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
  898         if (ret)
  899                 goto out;
  900 
  901         ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
  902         if (ret)
  903                 goto out;
  904 
  905         qp_attr.qp_state = IB_QPS_RTR;
  906         ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
  907         if (ret)
  908                 goto out;
  909 
  910         ret = ib_query_gid(id_priv->id.device, id_priv->id.port_num,
  911                            qp_attr.ah_attr.grh.sgid_index, &sgid, NULL);
  912         if (ret)
  913                 goto out;
  914 
  915         BUG_ON(id_priv->cma_dev->device != id_priv->id.device);
  916 
  917         if (conn_param)
  918                 qp_attr.max_dest_rd_atomic = conn_param->responder_resources;
  919         ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
  920 out:
  921         mutex_unlock(&id_priv->qp_mutex);
  922         return ret;
  923 }
  924 
  925 static int cma_modify_qp_rts(struct rdma_id_private *id_priv,
  926                              struct rdma_conn_param *conn_param)
  927 {
  928         struct ib_qp_attr qp_attr;
  929         int qp_attr_mask, ret;
  930 
  931         mutex_lock(&id_priv->qp_mutex);
  932         if (!id_priv->id.qp) {
  933                 ret = 0;
  934                 goto out;
  935         }
  936 
  937         qp_attr.qp_state = IB_QPS_RTS;
  938         ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
  939         if (ret)
  940                 goto out;
  941 
  942         if (conn_param)
  943                 qp_attr.max_rd_atomic = conn_param->initiator_depth;
  944         ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
  945 out:
  946         mutex_unlock(&id_priv->qp_mutex);
  947         return ret;
  948 }
  949 
  950 static int cma_modify_qp_err(struct rdma_id_private *id_priv)
  951 {
  952         struct ib_qp_attr qp_attr;
  953         int ret;
  954 
  955         mutex_lock(&id_priv->qp_mutex);
  956         if (!id_priv->id.qp) {
  957                 ret = 0;
  958                 goto out;
  959         }
  960 
  961         qp_attr.qp_state = IB_QPS_ERR;
  962         ret = ib_modify_qp(id_priv->id.qp, &qp_attr, IB_QP_STATE);
  963 out:
  964         mutex_unlock(&id_priv->qp_mutex);
  965         return ret;
  966 }
  967 
  968 static int cma_ib_init_qp_attr(struct rdma_id_private *id_priv,
  969                                struct ib_qp_attr *qp_attr, int *qp_attr_mask)
  970 {
  971         struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
  972         int ret;
  973         u16 pkey;
  974 
  975         if (rdma_cap_eth_ah(id_priv->id.device, id_priv->id.port_num))
  976                 pkey = 0xffff;
  977         else
  978                 pkey = ib_addr_get_pkey(dev_addr);
  979 
  980         ret = ib_find_cached_pkey(id_priv->id.device, id_priv->id.port_num,
  981                                   pkey, &qp_attr->pkey_index);
  982         if (ret)
  983                 return ret;
  984 
  985         qp_attr->port_num = id_priv->id.port_num;
  986         *qp_attr_mask = IB_QP_STATE | IB_QP_PKEY_INDEX | IB_QP_PORT;
  987 
  988         if (id_priv->id.qp_type == IB_QPT_UD) {
  989                 ret = cma_set_qkey(id_priv, 0);
  990                 if (ret)
  991                         return ret;
  992 
  993                 qp_attr->qkey = id_priv->qkey;
  994                 *qp_attr_mask |= IB_QP_QKEY;
  995         } else {
  996                 qp_attr->qp_access_flags = 0;
  997                 *qp_attr_mask |= IB_QP_ACCESS_FLAGS;
  998         }
  999         return 0;
 1000 }
 1001 
 1002 int rdma_init_qp_attr(struct rdma_cm_id *id, struct ib_qp_attr *qp_attr,
 1003                        int *qp_attr_mask)
 1004 {
 1005         struct rdma_id_private *id_priv;
 1006         int ret = 0;
 1007 
 1008         id_priv = container_of(id, struct rdma_id_private, id);
 1009         if (rdma_cap_ib_cm(id->device, id->port_num)) {
 1010                 if (!id_priv->cm_id.ib || (id_priv->id.qp_type == IB_QPT_UD))
 1011                         ret = cma_ib_init_qp_attr(id_priv, qp_attr, qp_attr_mask);
 1012                 else
 1013                         ret = ib_cm_init_qp_attr(id_priv->cm_id.ib, qp_attr,
 1014                                                  qp_attr_mask);
 1015 
 1016                 if (qp_attr->qp_state == IB_QPS_RTR)
 1017                         qp_attr->rq_psn = id_priv->seq_num;
 1018         } else if (rdma_cap_iw_cm(id->device, id->port_num)) {
 1019                 if (!id_priv->cm_id.iw) {
 1020                         qp_attr->qp_access_flags = 0;
 1021                         *qp_attr_mask = IB_QP_STATE | IB_QP_ACCESS_FLAGS;
 1022                 } else
 1023                         ret = iw_cm_init_qp_attr(id_priv->cm_id.iw, qp_attr,
 1024                                                  qp_attr_mask);
 1025                 qp_attr->port_num = id_priv->id.port_num;
 1026                 *qp_attr_mask |= IB_QP_PORT;
 1027         } else
 1028                 ret = -ENOSYS;
 1029 
 1030         if ((*qp_attr_mask & IB_QP_TIMEOUT) && id_priv->timeout_set)
 1031                 qp_attr->timeout = id_priv->timeout;
 1032 
 1033         return ret;
 1034 }
 1035 EXPORT_SYMBOL(rdma_init_qp_attr);
 1036 
 1037 static inline int cma_zero_addr(struct sockaddr *addr)
 1038 {
 1039         switch (addr->sa_family) {
 1040         case AF_INET:
 1041                 return ipv4_is_zeronet(((struct sockaddr_in *)addr)->sin_addr.s_addr);
 1042         case AF_INET6:
 1043                 return ipv6_addr_any(&((struct sockaddr_in6 *) addr)->sin6_addr);
 1044         case AF_IB:
 1045                 return ib_addr_any(&((struct sockaddr_ib *) addr)->sib_addr);
 1046         default:
 1047                 return 0;
 1048         }
 1049 }
 1050 
 1051 static inline int cma_loopback_addr(struct sockaddr *addr)
 1052 {
 1053         switch (addr->sa_family) {
 1054 #ifdef INET
 1055         /*
 1056          * ipv4_is_loopback() requires an inet variable via vnet,
 1057          * not present if INET is not included.
 1058          */
 1059         case AF_INET:
 1060                 return ipv4_is_loopback(((struct sockaddr_in *) addr)->sin_addr.s_addr);
 1061 #endif
 1062 #ifdef INET6
 1063         case AF_INET6:
 1064                 return ipv6_addr_loopback(&((struct sockaddr_in6 *) addr)->sin6_addr);
 1065 #endif
 1066         case AF_IB:
 1067                 return ib_addr_loopback(&((struct sockaddr_ib *) addr)->sib_addr);
 1068         default:
 1069                 return 0;
 1070         }
 1071 }
 1072 
 1073 static inline bool cma_any_addr(struct vnet *vnet, struct sockaddr *addr)
 1074 {
 1075         bool ret;
 1076 
 1077         CURVNET_SET_QUIET(vnet);
 1078         ret = cma_zero_addr(addr) || cma_loopback_addr(addr);
 1079         CURVNET_RESTORE();
 1080 
 1081         return (ret);
 1082 }
 1083 
 1084 static int cma_addr_cmp(struct sockaddr *src, struct sockaddr *dst)
 1085 {
 1086         if (src->sa_family != dst->sa_family)
 1087                 return -1;
 1088 
 1089         switch (src->sa_family) {
 1090         case AF_INET:
 1091                 return ((struct sockaddr_in *) src)->sin_addr.s_addr !=
 1092                        ((struct sockaddr_in *) dst)->sin_addr.s_addr;
 1093         case AF_INET6:
 1094                 return ipv6_addr_cmp(&((struct sockaddr_in6 *) src)->sin6_addr,
 1095                                      &((struct sockaddr_in6 *) dst)->sin6_addr);
 1096         default:
 1097                 return ib_addr_cmp(&((struct sockaddr_ib *) src)->sib_addr,
 1098                                    &((struct sockaddr_ib *) dst)->sib_addr);
 1099         }
 1100 }
 1101 
 1102 static __be16 cma_port(struct sockaddr *addr)
 1103 {
 1104         struct sockaddr_ib *sib;
 1105 
 1106         switch (addr->sa_family) {
 1107         case AF_INET:
 1108                 return ((struct sockaddr_in *) addr)->sin_port;
 1109         case AF_INET6:
 1110                 return ((struct sockaddr_in6 *) addr)->sin6_port;
 1111         case AF_IB:
 1112                 sib = (struct sockaddr_ib *) addr;
 1113                 return htons((u16) (be64_to_cpu(sib->sib_sid) &
 1114                                     be64_to_cpu(sib->sib_sid_mask)));
 1115         default:
 1116                 return 0;
 1117         }
 1118 }
 1119 
 1120 static inline int cma_any_port(struct sockaddr *addr)
 1121 {
 1122         return !cma_port(addr);
 1123 }
 1124 
 1125 static void cma_save_ib_info(struct sockaddr *src_addr,
 1126                              struct sockaddr *dst_addr,
 1127                              struct rdma_cm_id *listen_id,
 1128                              struct ib_sa_path_rec *path)
 1129 {
 1130         struct sockaddr_ib *listen_ib, *ib;
 1131 
 1132         listen_ib = (struct sockaddr_ib *) &listen_id->route.addr.src_addr;
 1133         if (src_addr) {
 1134                 ib = (struct sockaddr_ib *)src_addr;
 1135                 ib->sib_family = AF_IB;
 1136                 if (path) {
 1137                         ib->sib_pkey = path->pkey;
 1138                         ib->sib_flowinfo = path->flow_label;
 1139                         memcpy(&ib->sib_addr, &path->sgid, 16);
 1140                         ib->sib_sid = path->service_id;
 1141                         ib->sib_scope_id = 0;
 1142                 } else {
 1143                         ib->sib_pkey = listen_ib->sib_pkey;
 1144                         ib->sib_flowinfo = listen_ib->sib_flowinfo;
 1145                         ib->sib_addr = listen_ib->sib_addr;
 1146                         ib->sib_sid = listen_ib->sib_sid;
 1147                         ib->sib_scope_id = listen_ib->sib_scope_id;
 1148                 }
 1149                 ib->sib_sid_mask = cpu_to_be64(0xffffffffffffffffULL);
 1150         }
 1151         if (dst_addr) {
 1152                 ib = (struct sockaddr_ib *)dst_addr;
 1153                 ib->sib_family = AF_IB;
 1154                 if (path) {
 1155                         ib->sib_pkey = path->pkey;
 1156                         ib->sib_flowinfo = path->flow_label;
 1157                         memcpy(&ib->sib_addr, &path->dgid, 16);
 1158                 }
 1159         }
 1160 }
 1161 
 1162 static void cma_save_ip4_info(struct sockaddr_in *src_addr,
 1163                               struct sockaddr_in *dst_addr,
 1164                               struct cma_hdr *hdr,
 1165                               __be16 local_port)
 1166 {
 1167         if (src_addr) {
 1168                 *src_addr = (struct sockaddr_in) {
 1169                         .sin_len = sizeof(struct sockaddr_in),
 1170                         .sin_family = AF_INET,
 1171                         .sin_addr.s_addr = hdr->dst_addr.ip4.addr,
 1172                         .sin_port = local_port,
 1173                 };
 1174         }
 1175 
 1176         if (dst_addr) {
 1177                 *dst_addr = (struct sockaddr_in) {
 1178                         .sin_len = sizeof(struct sockaddr_in),
 1179                         .sin_family = AF_INET,
 1180                         .sin_addr.s_addr = hdr->src_addr.ip4.addr,
 1181                         .sin_port = hdr->port,
 1182                 };
 1183         }
 1184 }
 1185 
 1186 static void cma_ip6_clear_scope_id(struct in6_addr *addr)
 1187 {
 1188         /* make sure link local scope ID gets zeroed */
 1189         if (IN6_IS_SCOPE_LINKLOCAL(addr) ||
 1190             IN6_IS_ADDR_MC_INTFACELOCAL(addr)) {
 1191                 /* use byte-access to be alignment safe */
 1192                 addr->s6_addr[2] = 0;
 1193                 addr->s6_addr[3] = 0;
 1194         }
 1195 }
 1196 
 1197 static void cma_save_ip6_info(struct sockaddr_in6 *src_addr,
 1198                               struct sockaddr_in6 *dst_addr,
 1199                               struct cma_hdr *hdr,
 1200                               __be16 local_port)
 1201 {
 1202         if (src_addr) {
 1203                 *src_addr = (struct sockaddr_in6) {
 1204                         .sin6_len = sizeof(struct sockaddr_in6),
 1205                         .sin6_family = AF_INET6,
 1206                         .sin6_addr = hdr->dst_addr.ip6,
 1207                         .sin6_port = local_port,
 1208                 };
 1209                 cma_ip6_clear_scope_id(&src_addr->sin6_addr);
 1210         }
 1211 
 1212         if (dst_addr) {
 1213                 *dst_addr = (struct sockaddr_in6) {
 1214                         .sin6_len = sizeof(struct sockaddr_in6),
 1215                         .sin6_family = AF_INET6,
 1216                         .sin6_addr = hdr->src_addr.ip6,
 1217                         .sin6_port = hdr->port,
 1218                 };
 1219                 cma_ip6_clear_scope_id(&dst_addr->sin6_addr);
 1220         }
 1221 }
 1222 
 1223 static u16 cma_port_from_service_id(__be64 service_id)
 1224 {
 1225         return (u16)be64_to_cpu(service_id);
 1226 }
 1227 
 1228 static int sdp_save_ip_info(struct sockaddr *src_addr,
 1229                             struct sockaddr *dst_addr,
 1230                             const struct sdp_hh *hdr,
 1231                             __be64 service_id)
 1232 {
 1233         __be16 local_port;
 1234 
 1235         BUG_ON(src_addr == NULL || dst_addr == NULL);
 1236 
 1237         if (sdp_get_majv(hdr->majv_minv) != SDP_MAJ_VERSION)
 1238                 return -EINVAL;
 1239 
 1240         local_port = htons(cma_port_from_service_id(service_id));
 1241 
 1242         switch (sdp_get_ip_ver(hdr)) {
 1243         case 4: {
 1244                 struct sockaddr_in *s4, *d4;
 1245 
 1246                 s4 = (void *)src_addr;
 1247                 d4 = (void *)dst_addr;
 1248 
 1249                 *s4 = (struct sockaddr_in) {
 1250                         .sin_len = sizeof(*s4),
 1251                         .sin_family = AF_INET,
 1252                         .sin_addr.s_addr = hdr->dst_addr.ip4.addr,
 1253                         .sin_port = local_port,
 1254                 };
 1255                 *d4 = (struct sockaddr_in) {
 1256                         .sin_len = sizeof(*d4),
 1257                         .sin_family = AF_INET,
 1258                         .sin_addr.s_addr = hdr->src_addr.ip4.addr,
 1259                         .sin_port = hdr->port,
 1260                 };
 1261                 break;
 1262         }
 1263         case 6: {
 1264                 struct sockaddr_in6 *s6, *d6;
 1265 
 1266                 s6 = (void *)src_addr;
 1267                 d6 = (void *)dst_addr;
 1268 
 1269                 *s6 = (struct sockaddr_in6) {
 1270                         .sin6_len = sizeof(*s6),
 1271                         .sin6_family = AF_INET6,
 1272                         .sin6_addr = hdr->dst_addr.ip6,
 1273                         .sin6_port = local_port,
 1274                 };
 1275                 *d6 = (struct sockaddr_in6) {
 1276                         .sin6_len = sizeof(*d6),
 1277                         .sin6_family = AF_INET6,
 1278                         .sin6_addr = hdr->src_addr.ip6,
 1279                         .sin6_port = hdr->port,
 1280                 };
 1281                 cma_ip6_clear_scope_id(&s6->sin6_addr);
 1282                 cma_ip6_clear_scope_id(&d6->sin6_addr);
 1283                 break;
 1284         }
 1285         default:
 1286                 return -EAFNOSUPPORT;
 1287         }
 1288 
 1289         return 0;
 1290 }
 1291 
 1292 static int cma_save_ip_info(struct sockaddr *src_addr,
 1293                             struct sockaddr *dst_addr,
 1294                             struct ib_cm_event *ib_event,
 1295                             __be64 service_id)
 1296 {
 1297         struct cma_hdr *hdr;
 1298         __be16 port;
 1299 
 1300         if (rdma_ps_from_service_id(service_id) == RDMA_PS_SDP)
 1301                 return sdp_save_ip_info(src_addr, dst_addr,
 1302                     ib_event->private_data, service_id);
 1303 
 1304         hdr = ib_event->private_data;
 1305         if (hdr->cma_version != CMA_VERSION)
 1306                 return -EINVAL;
 1307 
 1308         port = htons(cma_port_from_service_id(service_id));
 1309 
 1310         switch (cma_get_ip_ver(hdr)) {
 1311         case 4:
 1312                 cma_save_ip4_info((struct sockaddr_in *)src_addr,
 1313                                   (struct sockaddr_in *)dst_addr, hdr, port);
 1314                 break;
 1315         case 6:
 1316                 cma_save_ip6_info((struct sockaddr_in6 *)src_addr,
 1317                                   (struct sockaddr_in6 *)dst_addr, hdr, port);
 1318                 break;
 1319         default:
 1320                 return -EAFNOSUPPORT;
 1321         }
 1322 
 1323         return 0;
 1324 }
 1325 
 1326 static int cma_save_net_info(struct sockaddr *src_addr,
 1327                              struct sockaddr *dst_addr,
 1328                              struct rdma_cm_id *listen_id,
 1329                              struct ib_cm_event *ib_event,
 1330                              sa_family_t sa_family, __be64 service_id)
 1331 {
 1332         if (sa_family == AF_IB) {
 1333                 if (ib_event->event == IB_CM_REQ_RECEIVED)
 1334                         cma_save_ib_info(src_addr, dst_addr, listen_id,
 1335                                          ib_event->param.req_rcvd.primary_path);
 1336                 else if (ib_event->event == IB_CM_SIDR_REQ_RECEIVED)
 1337                         cma_save_ib_info(src_addr, dst_addr, listen_id, NULL);
 1338                 return 0;
 1339         }
 1340 
 1341         return cma_save_ip_info(src_addr, dst_addr, ib_event, service_id);
 1342 }
 1343 
 1344 static int cma_save_req_info(const struct ib_cm_event *ib_event,
 1345                              struct cma_req_info *req)
 1346 {
 1347         const struct ib_cm_req_event_param *req_param =
 1348                 &ib_event->param.req_rcvd;
 1349         const struct ib_cm_sidr_req_event_param *sidr_param =
 1350                 &ib_event->param.sidr_req_rcvd;
 1351 
 1352         switch (ib_event->event) {
 1353         case IB_CM_REQ_RECEIVED:
 1354                 req->device     = req_param->listen_id->device;
 1355                 req->port       = req_param->port;
 1356                 memcpy(&req->local_gid, &req_param->primary_path->sgid,
 1357                        sizeof(req->local_gid));
 1358                 req->has_gid    = true;
 1359                 req->service_id = req_param->primary_path->service_id;
 1360                 req->pkey       = be16_to_cpu(req_param->primary_path->pkey);
 1361                 if (req->pkey != req_param->bth_pkey)
 1362                         pr_warn_ratelimited("RDMA CMA: got different BTH P_Key (0x%x) and primary path P_Key (0x%x)\n"
 1363                                             "RDMA CMA: in the future this may cause the request to be dropped\n",
 1364                                             req_param->bth_pkey, req->pkey);
 1365                 break;
 1366         case IB_CM_SIDR_REQ_RECEIVED:
 1367                 req->device     = sidr_param->listen_id->device;
 1368                 req->port       = sidr_param->port;
 1369                 req->has_gid    = false;
 1370                 req->service_id = sidr_param->service_id;
 1371                 req->pkey       = sidr_param->pkey;
 1372                 if (req->pkey != sidr_param->bth_pkey)
 1373                         pr_warn_ratelimited("RDMA CMA: got different BTH P_Key (0x%x) and SIDR request payload P_Key (0x%x)\n"
 1374                                             "RDMA CMA: in the future this may cause the request to be dropped\n",
 1375                                             sidr_param->bth_pkey, req->pkey);
 1376                 break;
 1377         default:
 1378                 return -EINVAL;
 1379         }
 1380 
 1381         return 0;
 1382 }
 1383 
 1384 #ifdef INET
 1385 static bool validate_ipv4_net_dev_addr(struct vnet *vnet,
 1386     const __be32 saddr, const __be32 daddr)
 1387 {
 1388         bool ret;
 1389         CURVNET_SET(vnet);
 1390         ret = ipv4_is_multicast(saddr) || ipv4_is_lbcast(saddr) ||
 1391             ipv4_is_lbcast(daddr) || ipv4_is_zeronet(saddr) ||
 1392             ipv4_is_zeronet(daddr) || ipv4_is_loopback(daddr) ||
 1393             ipv4_is_loopback(saddr);
 1394         CURVNET_RESTORE();
 1395         return (ret);
 1396 }
 1397 #endif
 1398 
 1399 static bool validate_ipv4_net_dev(struct ifnet *net_dev,
 1400                                   const struct sockaddr_in *dst_addr,
 1401                                   const struct sockaddr_in *src_addr)
 1402 {
 1403 #ifdef INET
 1404         __be32 daddr = dst_addr->sin_addr.s_addr,
 1405                saddr = src_addr->sin_addr.s_addr;
 1406         struct ifnet *dst_dev;
 1407         struct nhop_object *nh;
 1408         bool ret;
 1409 
 1410         if (validate_ipv4_net_dev_addr(net_dev->if_vnet, saddr, daddr))
 1411                 return false;
 1412 
 1413         dst_dev = ip_ifp_find(net_dev->if_vnet, daddr);
 1414         if (dst_dev != net_dev) {
 1415                 if (dst_dev != NULL)
 1416                         dev_put(dst_dev);
 1417                 return false;
 1418         }
 1419         dev_put(dst_dev);
 1420 
 1421         /*
 1422          * Check for loopback.
 1423          */
 1424         if (saddr == daddr)
 1425                 return true;
 1426 
 1427         CURVNET_SET(net_dev->if_vnet);
 1428         nh = fib4_lookup(RT_DEFAULT_FIB, src_addr->sin_addr, 0, NHR_NONE, 0);
 1429         if (nh != NULL)
 1430                 ret = (nh->nh_ifp == net_dev);
 1431         else
 1432                 ret = false;
 1433         CURVNET_RESTORE();
 1434         return ret;
 1435 #else
 1436         return false;
 1437 #endif
 1438 }
 1439 
 1440 static bool validate_ipv6_net_dev(struct ifnet *net_dev,
 1441                                   const struct sockaddr_in6 *dst_addr,
 1442                                   const struct sockaddr_in6 *src_addr)
 1443 {
 1444 #ifdef INET6
 1445         struct sockaddr_in6 src_tmp = *src_addr;
 1446         struct sockaddr_in6 dst_tmp = *dst_addr;
 1447         struct ifnet *dst_dev;
 1448         struct nhop_object *nh;
 1449         bool ret;
 1450 
 1451         dst_dev = ip6_ifp_find(net_dev->if_vnet, dst_tmp.sin6_addr,
 1452             net_dev->if_index);
 1453         if (dst_dev != net_dev) {
 1454                 if (dst_dev != NULL)
 1455                         dev_put(dst_dev);
 1456                 return false;
 1457         }
 1458         dev_put(dst_dev);
 1459 
 1460         CURVNET_SET(net_dev->if_vnet);
 1461 
 1462         /*
 1463          * Make sure the scope ID gets embedded.
 1464          */
 1465         src_tmp.sin6_scope_id = net_dev->if_index;
 1466         sa6_embedscope(&src_tmp, 0);
 1467 
 1468         dst_tmp.sin6_scope_id = net_dev->if_index;
 1469         sa6_embedscope(&dst_tmp, 0);
 1470 
 1471         /*
 1472          * Check for loopback after scope ID
 1473          * has been embedded:
 1474          */
 1475         if (memcmp(&src_tmp.sin6_addr, &dst_tmp.sin6_addr,
 1476             sizeof(dst_tmp.sin6_addr)) == 0) {
 1477                 ret = true;
 1478         } else {
 1479                 /* non-loopback case */
 1480                 nh = fib6_lookup(RT_DEFAULT_FIB, &src_addr->sin6_addr,
 1481                     net_dev->if_index, NHR_NONE, 0);
 1482                 if (nh != NULL)
 1483                         ret = (nh->nh_ifp == net_dev);
 1484                 else
 1485                         ret = false;
 1486         }
 1487         CURVNET_RESTORE();
 1488         return ret;
 1489 #else
 1490         return false;
 1491 #endif
 1492 }
 1493 
 1494 static bool validate_net_dev(struct ifnet *net_dev,
 1495                              const struct sockaddr *daddr,
 1496                              const struct sockaddr *saddr)
 1497 {
 1498         const struct sockaddr_in *daddr4 = (const struct sockaddr_in *)daddr;
 1499         const struct sockaddr_in *saddr4 = (const struct sockaddr_in *)saddr;
 1500         const struct sockaddr_in6 *daddr6 = (const struct sockaddr_in6 *)daddr;
 1501         const struct sockaddr_in6 *saddr6 = (const struct sockaddr_in6 *)saddr;
 1502 
 1503         switch (daddr->sa_family) {
 1504         case AF_INET:
 1505                 return saddr->sa_family == AF_INET &&
 1506                        validate_ipv4_net_dev(net_dev, daddr4, saddr4);
 1507 
 1508         case AF_INET6:
 1509                 return saddr->sa_family == AF_INET6 &&
 1510                        validate_ipv6_net_dev(net_dev, daddr6, saddr6);
 1511 
 1512         default:
 1513                 return false;
 1514         }
 1515 }
 1516 
 1517 static struct ifnet *
 1518 roce_get_net_dev_by_cm_event(struct ib_device *device, u8 port_num,
 1519     const struct ib_cm_event *ib_event)
 1520 {
 1521         struct ib_gid_attr sgid_attr;
 1522         union ib_gid sgid;
 1523         int err = -EINVAL;
 1524 
 1525         if (ib_event->event == IB_CM_REQ_RECEIVED) {
 1526                 err = ib_get_cached_gid(device, port_num,
 1527                     ib_event->param.req_rcvd.ppath_sgid_index, &sgid, &sgid_attr);
 1528         } else if (ib_event->event == IB_CM_SIDR_REQ_RECEIVED) {
 1529                 err = ib_get_cached_gid(device, port_num,
 1530                     ib_event->param.sidr_req_rcvd.sgid_index, &sgid, &sgid_attr);
 1531         }
 1532         if (err)
 1533                 return (NULL);
 1534         return (sgid_attr.ndev);
 1535 }
 1536 
 1537 static struct ifnet *cma_get_net_dev(struct ib_cm_event *ib_event,
 1538                                           const struct cma_req_info *req)
 1539 {
 1540         struct sockaddr_storage listen_addr_storage, src_addr_storage;
 1541         struct sockaddr *listen_addr = (struct sockaddr *)&listen_addr_storage,
 1542                         *src_addr = (struct sockaddr *)&src_addr_storage;
 1543         struct ifnet *net_dev;
 1544         const union ib_gid *gid = req->has_gid ? &req->local_gid : NULL;
 1545         struct epoch_tracker et;
 1546         int err;
 1547 
 1548         err = cma_save_ip_info(listen_addr, src_addr, ib_event,
 1549                                req->service_id);
 1550         if (err)
 1551                 return ERR_PTR(err);
 1552 
 1553         if (rdma_protocol_roce(req->device, req->port)) {
 1554                 net_dev = roce_get_net_dev_by_cm_event(req->device, req->port,
 1555                                                        ib_event);
 1556         } else {
 1557                 net_dev = ib_get_net_dev_by_params(req->device, req->port,
 1558                                                    req->pkey,
 1559                                                    gid, listen_addr);
 1560         }
 1561         if (!net_dev)
 1562                 return ERR_PTR(-ENODEV);
 1563 
 1564         NET_EPOCH_ENTER(et);
 1565         if (!validate_net_dev(net_dev, listen_addr, src_addr)) {
 1566                 NET_EPOCH_EXIT(et);
 1567                 dev_put(net_dev);
 1568                 return ERR_PTR(-EHOSTUNREACH);
 1569         }
 1570         NET_EPOCH_EXIT(et);
 1571 
 1572         return net_dev;
 1573 }
 1574 
 1575 static enum rdma_port_space rdma_ps_from_service_id(__be64 service_id)
 1576 {
 1577         return (be64_to_cpu(service_id) >> 16) & 0xffff;
 1578 }
 1579 
 1580 static bool sdp_match_private_data(struct rdma_id_private *id_priv,
 1581                                    const struct sdp_hh *hdr,
 1582                                    struct sockaddr *addr)
 1583 {
 1584         __be32 ip4_addr;
 1585         struct in6_addr ip6_addr;
 1586         struct vnet *vnet = id_priv->id.route.addr.dev_addr.net;
 1587 
 1588         switch (addr->sa_family) {
 1589         case AF_INET:
 1590                 ip4_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
 1591                 if (sdp_get_ip_ver(hdr) != 4)
 1592                         return false;
 1593                 if (!cma_any_addr(vnet, addr) &&
 1594                     hdr->dst_addr.ip4.addr != ip4_addr)
 1595                         return false;
 1596                 break;
 1597         case AF_INET6:
 1598                 ip6_addr = ((struct sockaddr_in6 *)addr)->sin6_addr;
 1599                 if (sdp_get_ip_ver(hdr) != 6)
 1600                         return false;
 1601                 cma_ip6_clear_scope_id(&ip6_addr);
 1602                 if (!cma_any_addr(vnet, addr) &&
 1603                     memcmp(&hdr->dst_addr.ip6, &ip6_addr, sizeof(ip6_addr)))
 1604                         return false;
 1605                 break;
 1606         case AF_IB:
 1607                 return true;
 1608         default:
 1609                 return false;
 1610         }
 1611 
 1612         return true;
 1613 }
 1614 
 1615 static bool cma_match_private_data(struct rdma_id_private *id_priv,
 1616                                    const void *vhdr)
 1617 {
 1618         const struct cma_hdr *hdr = vhdr;
 1619         struct sockaddr *addr = cma_src_addr(id_priv);
 1620         struct vnet *vnet = id_priv->id.route.addr.dev_addr.net;
 1621         __be32 ip4_addr;
 1622         struct in6_addr ip6_addr;
 1623 
 1624         if (cma_any_addr(vnet, addr) && !id_priv->afonly)
 1625                 return true;
 1626 
 1627         if (id_priv->id.ps == RDMA_PS_SDP)
 1628                 return sdp_match_private_data(id_priv, vhdr, addr);
 1629 
 1630         switch (addr->sa_family) {
 1631         case AF_INET:
 1632                 ip4_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
 1633                 if (cma_get_ip_ver(hdr) != 4)
 1634                         return false;
 1635                 if (!cma_any_addr(vnet, addr) &&
 1636                     hdr->dst_addr.ip4.addr != ip4_addr)
 1637                         return false;
 1638                 break;
 1639         case AF_INET6:
 1640                 ip6_addr = ((struct sockaddr_in6 *)addr)->sin6_addr;
 1641                 if (cma_get_ip_ver(hdr) != 6)
 1642                         return false;
 1643                 cma_ip6_clear_scope_id(&ip6_addr);
 1644                 if (!cma_any_addr(vnet, addr) &&
 1645                     memcmp(&hdr->dst_addr.ip6, &ip6_addr, sizeof(ip6_addr)))
 1646                         return false;
 1647                 break;
 1648         case AF_IB:
 1649                 return true;
 1650         default:
 1651                 return false;
 1652         }
 1653 
 1654         return true;
 1655 }
 1656 
 1657 static bool cma_protocol_roce_dev_port(struct ib_device *device, int port_num)
 1658 {
 1659         enum rdma_link_layer ll = rdma_port_get_link_layer(device, port_num);
 1660         enum rdma_transport_type transport =
 1661                 rdma_node_get_transport(device->node_type);
 1662 
 1663         return ll == IB_LINK_LAYER_ETHERNET && transport == RDMA_TRANSPORT_IB;
 1664 }
 1665 
 1666 static bool cma_protocol_roce(const struct rdma_cm_id *id)
 1667 {
 1668         struct ib_device *device = id->device;
 1669         const int port_num = id->port_num ?: rdma_start_port(device);
 1670 
 1671         return cma_protocol_roce_dev_port(device, port_num);
 1672 }
 1673 
 1674 static bool cma_match_net_dev(const struct rdma_cm_id *id,
 1675                               const struct ifnet *net_dev,
 1676                               u8 port_num)
 1677 {
 1678         const struct rdma_addr *addr = &id->route.addr;
 1679 
 1680         if (!net_dev) {
 1681                 if (id->port_num && id->port_num != port_num)
 1682                         return false;
 1683 
 1684                 if (id->ps == RDMA_PS_SDP) {
 1685                         if (addr->src_addr.ss_family == AF_INET ||
 1686                             addr->src_addr.ss_family == AF_INET6)
 1687                                 return true;
 1688                         return false;
 1689                 }
 1690                 /* This request is an AF_IB request or a RoCE request */
 1691                 return addr->src_addr.ss_family == AF_IB ||
 1692                     cma_protocol_roce_dev_port(id->device, port_num);
 1693         }
 1694 
 1695         return !addr->dev_addr.bound_dev_if ||
 1696                (net_eq(dev_net(net_dev), addr->dev_addr.net) &&
 1697                 addr->dev_addr.bound_dev_if == net_dev->if_index);
 1698 }
 1699 
 1700 static struct rdma_id_private *cma_find_listener(
 1701                 const struct rdma_bind_list *bind_list,
 1702                 const struct ib_cm_id *cm_id,
 1703                 const struct ib_cm_event *ib_event,
 1704                 const struct cma_req_info *req,
 1705                 const struct ifnet *net_dev)
 1706 {
 1707         struct rdma_id_private *id_priv, *id_priv_dev;
 1708 
 1709         if (!bind_list)
 1710                 return ERR_PTR(-EINVAL);
 1711 
 1712         hlist_for_each_entry(id_priv, &bind_list->owners, node) {
 1713                 if (cma_match_private_data(id_priv, ib_event->private_data)) {
 1714                         if (id_priv->id.device == cm_id->device &&
 1715                             cma_match_net_dev(&id_priv->id, net_dev, req->port))
 1716                                 return id_priv;
 1717                         list_for_each_entry(id_priv_dev,
 1718                                             &id_priv->listen_list,
 1719                                             listen_list) {
 1720                                 if (id_priv_dev->id.device == cm_id->device &&
 1721                                     cma_match_net_dev(&id_priv_dev->id, net_dev, req->port))
 1722                                         return id_priv_dev;
 1723                         }
 1724                 }
 1725         }
 1726 
 1727         return ERR_PTR(-EINVAL);
 1728 }
 1729 
 1730 static struct rdma_id_private *cma_id_from_event(struct ib_cm_id *cm_id,
 1731                                                  struct ib_cm_event *ib_event,
 1732                                                  struct ifnet **net_dev)
 1733 {
 1734         struct cma_req_info req;
 1735         struct rdma_bind_list *bind_list;
 1736         struct rdma_id_private *id_priv;
 1737         int err;
 1738 
 1739         err = cma_save_req_info(ib_event, &req);
 1740         if (err)
 1741                 return ERR_PTR(err);
 1742 
 1743         if (rdma_ps_from_service_id(cm_id->service_id) == RDMA_PS_SDP) {
 1744                 *net_dev = NULL;
 1745                 goto there_is_no_net_dev;
 1746         }
 1747 
 1748         *net_dev = cma_get_net_dev(ib_event, &req);
 1749         if (IS_ERR(*net_dev)) {
 1750                 if (PTR_ERR(*net_dev) == -EAFNOSUPPORT) {
 1751                         /* Assuming the protocol is AF_IB */
 1752                         *net_dev = NULL;
 1753                 } else {
 1754                         return ERR_CAST(*net_dev);
 1755                 }
 1756         }
 1757 
 1758 there_is_no_net_dev:
 1759         bind_list = cma_ps_find(*net_dev ? dev_net(*net_dev) : &init_net,
 1760                                 rdma_ps_from_service_id(req.service_id),
 1761                                 cma_port_from_service_id(req.service_id));
 1762         id_priv = cma_find_listener(bind_list, cm_id, ib_event, &req, *net_dev);
 1763         if (IS_ERR(id_priv) && *net_dev) {
 1764                 dev_put(*net_dev);
 1765                 *net_dev = NULL;
 1766         }
 1767 
 1768         return id_priv;
 1769 }
 1770 
 1771 static inline int cma_user_data_offset(struct rdma_id_private *id_priv)
 1772 {
 1773         if (cma_family(id_priv) == AF_IB)
 1774                 return 0;
 1775         if (id_priv->id.ps == RDMA_PS_SDP)
 1776                 return 0;
 1777         return sizeof(struct cma_hdr);
 1778 }
 1779 
 1780 static void cma_cancel_route(struct rdma_id_private *id_priv)
 1781 {
 1782         if (rdma_cap_ib_sa(id_priv->id.device, id_priv->id.port_num)) {
 1783                 if (id_priv->query)
 1784                         ib_sa_cancel_query(id_priv->query_id, id_priv->query);
 1785         }
 1786 }
 1787 
 1788 static void cma_cancel_listens(struct rdma_id_private *id_priv)
 1789 {
 1790         struct rdma_id_private *dev_id_priv;
 1791 
 1792         /*
 1793          * Remove from listen_any_list to prevent added devices from spawning
 1794          * additional listen requests.
 1795          */
 1796         mutex_lock(&lock);
 1797         list_del(&id_priv->list);
 1798 
 1799         while (!list_empty(&id_priv->listen_list)) {
 1800                 dev_id_priv = list_entry(id_priv->listen_list.next,
 1801                                          struct rdma_id_private, listen_list);
 1802                 /* sync with device removal to avoid duplicate destruction */
 1803                 list_del_init(&dev_id_priv->list);
 1804                 list_del(&dev_id_priv->listen_list);
 1805                 mutex_unlock(&lock);
 1806 
 1807                 rdma_destroy_id(&dev_id_priv->id);
 1808                 mutex_lock(&lock);
 1809         }
 1810         mutex_unlock(&lock);
 1811 }
 1812 
 1813 static void cma_cancel_operation(struct rdma_id_private *id_priv,
 1814                                  enum rdma_cm_state state)
 1815 {
 1816         struct vnet *vnet = id_priv->id.route.addr.dev_addr.net;
 1817 
 1818         switch (state) {
 1819         case RDMA_CM_ADDR_QUERY:
 1820                 rdma_addr_cancel(&id_priv->id.route.addr.dev_addr);
 1821                 break;
 1822         case RDMA_CM_ROUTE_QUERY:
 1823                 cma_cancel_route(id_priv);
 1824                 break;
 1825         case RDMA_CM_LISTEN:
 1826                 if (cma_any_addr(vnet, cma_src_addr(id_priv)) && !id_priv->cma_dev)
 1827                         cma_cancel_listens(id_priv);
 1828                 break;
 1829         default:
 1830                 break;
 1831         }
 1832 }
 1833 
 1834 static void cma_release_port(struct rdma_id_private *id_priv)
 1835 {
 1836         struct rdma_bind_list *bind_list = id_priv->bind_list;
 1837         struct vnet *net = id_priv->id.route.addr.dev_addr.net;
 1838 
 1839         if (!bind_list)
 1840                 return;
 1841 
 1842         mutex_lock(&lock);
 1843         hlist_del(&id_priv->node);
 1844         if (hlist_empty(&bind_list->owners)) {
 1845                 cma_ps_remove(net, bind_list->ps, bind_list->port);
 1846                 kfree(bind_list);
 1847         }
 1848         mutex_unlock(&lock);
 1849 }
 1850 
 1851 static void cma_leave_mc_groups(struct rdma_id_private *id_priv)
 1852 {
 1853         struct cma_multicast *mc;
 1854 
 1855         while (!list_empty(&id_priv->mc_list)) {
 1856                 mc = container_of(id_priv->mc_list.next,
 1857                                   struct cma_multicast, list);
 1858                 list_del(&mc->list);
 1859                 if (rdma_cap_ib_mcast(id_priv->cma_dev->device,
 1860                                       id_priv->id.port_num)) {
 1861                         ib_sa_free_multicast(mc->multicast.ib);
 1862                         kfree(mc);
 1863                 } else {
 1864                         if (mc->igmp_joined) {
 1865                                 struct rdma_dev_addr *dev_addr =
 1866                                         &id_priv->id.route.addr.dev_addr;
 1867                                 struct ifnet *ndev = NULL;
 1868 
 1869                                 if (dev_addr->bound_dev_if)
 1870                                         ndev = dev_get_by_index(dev_addr->net,
 1871                                                                 dev_addr->bound_dev_if);
 1872                                 if (ndev) {
 1873                                         cma_igmp_send(ndev,
 1874                                                       &mc->multicast.ib->rec.mgid,
 1875                                                       false);
 1876                                         dev_put(ndev);
 1877                                 }
 1878                         }
 1879                         kref_put(&mc->mcref, release_mc);
 1880                 }
 1881         }
 1882 }
 1883 
 1884 void rdma_destroy_id(struct rdma_cm_id *id)
 1885 {
 1886         struct rdma_id_private *id_priv;
 1887         enum rdma_cm_state state;
 1888 
 1889         id_priv = container_of(id, struct rdma_id_private, id);
 1890         state = cma_exch(id_priv, RDMA_CM_DESTROYING);
 1891         cma_cancel_operation(id_priv, state);
 1892 
 1893         /*
 1894          * Wait for any active callback to finish.  New callbacks will find
 1895          * the id_priv state set to destroying and abort.
 1896          */
 1897         mutex_lock(&id_priv->handler_mutex);
 1898         mutex_unlock(&id_priv->handler_mutex);
 1899 
 1900         if (id_priv->cma_dev) {
 1901                 if (rdma_cap_ib_cm(id_priv->id.device, 1)) {
 1902                         if (id_priv->cm_id.ib)
 1903                                 ib_destroy_cm_id(id_priv->cm_id.ib);
 1904                 } else if (rdma_cap_iw_cm(id_priv->id.device, 1)) {
 1905                         if (id_priv->cm_id.iw)
 1906                                 iw_destroy_cm_id(id_priv->cm_id.iw);
 1907                 }
 1908                 cma_leave_mc_groups(id_priv);
 1909                 cma_release_dev(id_priv);
 1910         }
 1911 
 1912         cma_release_port(id_priv);
 1913         cma_deref_id(id_priv);
 1914         wait_for_completion(&id_priv->comp);
 1915 
 1916         if (id_priv->internal_id)
 1917                 cma_deref_id(id_priv->id.context);
 1918 
 1919         kfree(id_priv->id.route.path_rec);
 1920         kfree(id_priv);
 1921 }
 1922 EXPORT_SYMBOL(rdma_destroy_id);
 1923 
 1924 static int cma_rep_recv(struct rdma_id_private *id_priv)
 1925 {
 1926         int ret;
 1927 
 1928         ret = cma_modify_qp_rtr(id_priv, NULL);
 1929         if (ret)
 1930                 goto reject;
 1931 
 1932         ret = cma_modify_qp_rts(id_priv, NULL);
 1933         if (ret)
 1934                 goto reject;
 1935 
 1936         ret = ib_send_cm_rtu(id_priv->cm_id.ib, NULL, 0);
 1937         if (ret)
 1938                 goto reject;
 1939 
 1940         return 0;
 1941 reject:
 1942         cma_modify_qp_err(id_priv);
 1943         ib_send_cm_rej(id_priv->cm_id.ib, IB_CM_REJ_CONSUMER_DEFINED,
 1944                        NULL, 0, NULL, 0);
 1945         return ret;
 1946 }
 1947 
 1948 static int sdp_verify_rep(const struct sdp_hah *data)
 1949 {
 1950         if (sdp_get_majv(data->majv_minv) != SDP_MAJ_VERSION)
 1951                 return -EINVAL;
 1952         return 0;
 1953 }
 1954 
 1955 static void cma_set_rep_event_data(struct rdma_cm_event *event,
 1956                                    struct ib_cm_rep_event_param *rep_data,
 1957                                    void *private_data)
 1958 {
 1959         event->param.conn.private_data = private_data;
 1960         event->param.conn.private_data_len = IB_CM_REP_PRIVATE_DATA_SIZE;
 1961         event->param.conn.responder_resources = rep_data->responder_resources;
 1962         event->param.conn.initiator_depth = rep_data->initiator_depth;
 1963         event->param.conn.flow_control = rep_data->flow_control;
 1964         event->param.conn.rnr_retry_count = rep_data->rnr_retry_count;
 1965         event->param.conn.srq = rep_data->srq;
 1966         event->param.conn.qp_num = rep_data->remote_qpn;
 1967 }
 1968 
 1969 static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
 1970 {
 1971         struct rdma_id_private *id_priv = cm_id->context;
 1972         struct rdma_cm_event event;
 1973         int ret = 0;
 1974 
 1975         mutex_lock(&id_priv->handler_mutex);
 1976         if ((ib_event->event != IB_CM_TIMEWAIT_EXIT &&
 1977              id_priv->state != RDMA_CM_CONNECT) ||
 1978             (ib_event->event == IB_CM_TIMEWAIT_EXIT &&
 1979              id_priv->state != RDMA_CM_DISCONNECT))
 1980                 goto out;
 1981 
 1982         memset(&event, 0, sizeof event);
 1983         switch (ib_event->event) {
 1984         case IB_CM_REQ_ERROR:
 1985         case IB_CM_REP_ERROR:
 1986                 event.event = RDMA_CM_EVENT_UNREACHABLE;
 1987                 event.status = -ETIMEDOUT;
 1988                 break;
 1989         case IB_CM_REP_RECEIVED:
 1990                 if (id_priv->id.ps == RDMA_PS_SDP) {
 1991                         event.status = sdp_verify_rep(ib_event->private_data);
 1992                         if (event.status)
 1993                                 event.event = RDMA_CM_EVENT_CONNECT_ERROR;
 1994                         else
 1995                                 event.event = RDMA_CM_EVENT_CONNECT_RESPONSE;
 1996                 } else {
 1997                         if (id_priv->id.qp) {
 1998                                 event.status = cma_rep_recv(id_priv);
 1999                                 event.event = event.status ? RDMA_CM_EVENT_CONNECT_ERROR :
 2000                                                             RDMA_CM_EVENT_ESTABLISHED;
 2001                         } else {
 2002                                 event.event = RDMA_CM_EVENT_CONNECT_RESPONSE;
 2003                         }
 2004                 }
 2005                 cma_set_rep_event_data(&event, &ib_event->param.rep_rcvd,
 2006                                        ib_event->private_data);
 2007                 break;
 2008         case IB_CM_RTU_RECEIVED:
 2009         case IB_CM_USER_ESTABLISHED:
 2010                 event.event = RDMA_CM_EVENT_ESTABLISHED;
 2011                 break;
 2012         case IB_CM_DREQ_ERROR:
 2013                 event.status = -ETIMEDOUT; /* fall through */
 2014         case IB_CM_DREQ_RECEIVED:
 2015         case IB_CM_DREP_RECEIVED:
 2016                 if (!cma_comp_exch(id_priv, RDMA_CM_CONNECT,
 2017                                    RDMA_CM_DISCONNECT))
 2018                         goto out;
 2019                 event.event = RDMA_CM_EVENT_DISCONNECTED;
 2020                 break;
 2021         case IB_CM_TIMEWAIT_EXIT:
 2022                 event.event = RDMA_CM_EVENT_TIMEWAIT_EXIT;
 2023                 break;
 2024         case IB_CM_MRA_RECEIVED:
 2025                 /* ignore event */
 2026                 goto out;
 2027         case IB_CM_REJ_RECEIVED:
 2028                 cma_modify_qp_err(id_priv);
 2029                 event.status = ib_event->param.rej_rcvd.reason;
 2030                 event.event = RDMA_CM_EVENT_REJECTED;
 2031                 event.param.conn.private_data = ib_event->private_data;
 2032                 event.param.conn.private_data_len = IB_CM_REJ_PRIVATE_DATA_SIZE;
 2033                 break;
 2034         default:
 2035                 pr_err("RDMA CMA: unexpected IB CM event: %d\n",
 2036                        ib_event->event);
 2037                 goto out;
 2038         }
 2039 
 2040         ret = id_priv->id.event_handler(&id_priv->id, &event);
 2041         if (ret) {
 2042                 /* Destroy the CM ID by returning a non-zero value. */
 2043                 id_priv->cm_id.ib = NULL;
 2044                 cma_exch(id_priv, RDMA_CM_DESTROYING);
 2045                 mutex_unlock(&id_priv->handler_mutex);
 2046                 rdma_destroy_id(&id_priv->id);
 2047                 return ret;
 2048         }
 2049 out:
 2050         mutex_unlock(&id_priv->handler_mutex);
 2051         return ret;
 2052 }
 2053 
 2054 static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
 2055                                                struct ib_cm_event *ib_event,
 2056                                                struct ifnet *net_dev)
 2057 {
 2058         struct rdma_id_private *id_priv;
 2059         struct rdma_cm_id *id;
 2060         struct rdma_route *rt;
 2061         const sa_family_t ss_family = listen_id->route.addr.src_addr.ss_family;
 2062         const __be64 service_id =
 2063                       ib_event->param.req_rcvd.primary_path->service_id;
 2064         struct vnet *vnet = listen_id->route.addr.dev_addr.net;
 2065         int ret;
 2066 
 2067         id = rdma_create_id(vnet,
 2068                             listen_id->event_handler, listen_id->context,
 2069                             listen_id->ps, ib_event->param.req_rcvd.qp_type);
 2070         if (IS_ERR(id))
 2071                 return NULL;
 2072 
 2073         id_priv = container_of(id, struct rdma_id_private, id);
 2074         if (cma_save_net_info((struct sockaddr *)&id->route.addr.src_addr,
 2075                               (struct sockaddr *)&id->route.addr.dst_addr,
 2076                               listen_id, ib_event, ss_family, service_id))
 2077                 goto err;
 2078 
 2079         rt = &id->route;
 2080         rt->num_paths = ib_event->param.req_rcvd.alternate_path ? 2 : 1;
 2081         rt->path_rec = kmalloc(sizeof *rt->path_rec * rt->num_paths,
 2082                                GFP_KERNEL);
 2083         if (!rt->path_rec)
 2084                 goto err;
 2085 
 2086         rt->path_rec[0] = *ib_event->param.req_rcvd.primary_path;
 2087         if (rt->num_paths == 2)
 2088                 rt->path_rec[1] = *ib_event->param.req_rcvd.alternate_path;
 2089 
 2090         if (net_dev) {
 2091                 ret = rdma_copy_addr(&rt->addr.dev_addr, net_dev, NULL);
 2092                 if (ret)
 2093                         goto err;
 2094         } else {
 2095                 if (!cma_protocol_roce(listen_id) &&
 2096                     cma_any_addr(vnet, cma_src_addr(id_priv))) {
 2097                         rt->addr.dev_addr.dev_type = ARPHRD_INFINIBAND;
 2098                         rdma_addr_set_sgid(&rt->addr.dev_addr, &rt->path_rec[0].sgid);
 2099                         ib_addr_set_pkey(&rt->addr.dev_addr, be16_to_cpu(rt->path_rec[0].pkey));
 2100                 } else if (!cma_any_addr(vnet, cma_src_addr(id_priv))) {
 2101                         ret = cma_translate_addr(cma_src_addr(id_priv), &rt->addr.dev_addr);
 2102                         if (ret)
 2103                                 goto err;
 2104                 }
 2105         }
 2106         rdma_addr_set_dgid(&rt->addr.dev_addr, &rt->path_rec[0].dgid);
 2107 
 2108         id_priv->state = RDMA_CM_CONNECT;
 2109         return id_priv;
 2110 
 2111 err:
 2112         rdma_destroy_id(id);
 2113         return NULL;
 2114 }
 2115 
 2116 static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
 2117                                               struct ib_cm_event *ib_event,
 2118                                               struct ifnet *net_dev)
 2119 {
 2120         struct rdma_id_private *id_priv;
 2121         struct rdma_cm_id *id;
 2122         const sa_family_t ss_family = listen_id->route.addr.src_addr.ss_family;
 2123         struct vnet *vnet = listen_id->route.addr.dev_addr.net;
 2124         int ret;
 2125 
 2126         id = rdma_create_id(vnet, listen_id->event_handler, listen_id->context,
 2127                             listen_id->ps, IB_QPT_UD);
 2128         if (IS_ERR(id))
 2129                 return NULL;
 2130 
 2131         id_priv = container_of(id, struct rdma_id_private, id);
 2132         if (cma_save_net_info((struct sockaddr *)&id->route.addr.src_addr,
 2133                               (struct sockaddr *)&id->route.addr.dst_addr,
 2134                               listen_id, ib_event, ss_family,
 2135                               ib_event->param.sidr_req_rcvd.service_id))
 2136                 goto err;
 2137 
 2138         if (net_dev) {
 2139                 ret = rdma_copy_addr(&id->route.addr.dev_addr, net_dev, NULL);
 2140                 if (ret)
 2141                         goto err;
 2142         } else {
 2143                 if (!cma_any_addr(vnet, cma_src_addr(id_priv))) {
 2144                         ret = cma_translate_addr(cma_src_addr(id_priv),
 2145                                                  &id->route.addr.dev_addr);
 2146                         if (ret)
 2147                                 goto err;
 2148                 }
 2149         }
 2150 
 2151         id_priv->state = RDMA_CM_CONNECT;
 2152         return id_priv;
 2153 err:
 2154         rdma_destroy_id(id);
 2155         return NULL;
 2156 }
 2157 
 2158 static void cma_set_req_event_data(struct rdma_cm_event *event,
 2159                                    struct ib_cm_req_event_param *req_data,
 2160                                    void *private_data, int offset)
 2161 {
 2162         event->param.conn.private_data = (char *)private_data + offset;
 2163         event->param.conn.private_data_len = IB_CM_REQ_PRIVATE_DATA_SIZE - offset;
 2164         event->param.conn.responder_resources = req_data->responder_resources;
 2165         event->param.conn.initiator_depth = req_data->initiator_depth;
 2166         event->param.conn.flow_control = req_data->flow_control;
 2167         event->param.conn.retry_count = req_data->retry_count;
 2168         event->param.conn.rnr_retry_count = req_data->rnr_retry_count;
 2169         event->param.conn.srq = req_data->srq;
 2170         event->param.conn.qp_num = req_data->remote_qpn;
 2171 }
 2172 
 2173 static int cma_check_req_qp_type(struct rdma_cm_id *id, struct ib_cm_event *ib_event)
 2174 {
 2175         return (((ib_event->event == IB_CM_REQ_RECEIVED) &&
 2176                  (ib_event->param.req_rcvd.qp_type == id->qp_type)) ||
 2177                 ((ib_event->event == IB_CM_SIDR_REQ_RECEIVED) &&
 2178                  (id->qp_type == IB_QPT_UD)) ||
 2179                 (!id->qp_type));
 2180 }
 2181 
 2182 static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
 2183 {
 2184         struct rdma_id_private *listen_id, *conn_id = NULL;
 2185         struct rdma_cm_event event;
 2186         struct ifnet *net_dev;
 2187         int offset, ret;
 2188 
 2189         listen_id = cma_id_from_event(cm_id, ib_event, &net_dev);
 2190         if (IS_ERR(listen_id))
 2191                 return PTR_ERR(listen_id);
 2192 
 2193         if (!cma_check_req_qp_type(&listen_id->id, ib_event)) {
 2194                 ret = -EINVAL;
 2195                 goto net_dev_put;
 2196         }
 2197 
 2198         mutex_lock(&listen_id->handler_mutex);
 2199         if (listen_id->state != RDMA_CM_LISTEN) {
 2200                 ret = -ECONNABORTED;
 2201                 goto err1;
 2202         }
 2203 
 2204         memset(&event, 0, sizeof event);
 2205         offset = cma_user_data_offset(listen_id);
 2206         event.event = RDMA_CM_EVENT_CONNECT_REQUEST;
 2207         if (ib_event->event == IB_CM_SIDR_REQ_RECEIVED) {
 2208                 conn_id = cma_new_udp_id(&listen_id->id, ib_event, net_dev);
 2209                 event.param.ud.private_data = (char *)ib_event->private_data + offset;
 2210                 event.param.ud.private_data_len =
 2211                                 IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE - offset;
 2212         } else {
 2213                 conn_id = cma_new_conn_id(&listen_id->id, ib_event, net_dev);
 2214                 cma_set_req_event_data(&event, &ib_event->param.req_rcvd,
 2215                                        ib_event->private_data, offset);
 2216         }
 2217         if (!conn_id) {
 2218                 ret = -ENOMEM;
 2219                 goto err1;
 2220         }
 2221 
 2222         mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING);
 2223         ret = cma_acquire_dev(conn_id, listen_id);
 2224         if (ret)
 2225                 goto err2;
 2226 
 2227         conn_id->cm_id.ib = cm_id;
 2228         cm_id->context = conn_id;
 2229         cm_id->cm_handler = cma_ib_handler;
 2230 
 2231         /*
 2232          * Protect against the user destroying conn_id from another thread
 2233          * until we're done accessing it.
 2234          */
 2235         atomic_inc(&conn_id->refcount);
 2236         ret = conn_id->id.event_handler(&conn_id->id, &event);
 2237         if (ret)
 2238                 goto err3;
 2239         /*
 2240          * Acquire mutex to prevent user executing rdma_destroy_id()
 2241          * while we're accessing the cm_id.
 2242          */
 2243         mutex_lock(&lock);
 2244         if (cma_comp(conn_id, RDMA_CM_CONNECT) &&
 2245             (conn_id->id.qp_type != IB_QPT_UD))
 2246                 ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
 2247         mutex_unlock(&lock);
 2248         mutex_unlock(&conn_id->handler_mutex);
 2249         mutex_unlock(&listen_id->handler_mutex);
 2250         cma_deref_id(conn_id);
 2251         if (net_dev)
 2252                 dev_put(net_dev);
 2253         return 0;
 2254 
 2255 err3:
 2256         cma_deref_id(conn_id);
 2257         /* Destroy the CM ID by returning a non-zero value. */
 2258         conn_id->cm_id.ib = NULL;
 2259 err2:
 2260         cma_exch(conn_id, RDMA_CM_DESTROYING);
 2261         mutex_unlock(&conn_id->handler_mutex);
 2262 err1:
 2263         mutex_unlock(&listen_id->handler_mutex);
 2264         if (conn_id)
 2265                 rdma_destroy_id(&conn_id->id);
 2266 
 2267 net_dev_put:
 2268         if (net_dev)
 2269                 dev_put(net_dev);
 2270 
 2271         return ret;
 2272 }
 2273 
 2274 __be64 rdma_get_service_id(struct rdma_cm_id *id, struct sockaddr *addr)
 2275 {
 2276         if (addr->sa_family == AF_IB)
 2277                 return ((struct sockaddr_ib *) addr)->sib_sid;
 2278 
 2279         return cpu_to_be64(((u64)id->ps << 16) + be16_to_cpu(cma_port(addr)));
 2280 }
 2281 EXPORT_SYMBOL(rdma_get_service_id);
 2282 
 2283 static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event)
 2284 {
 2285         struct rdma_id_private *id_priv = iw_id->context;
 2286         struct rdma_cm_event event;
 2287         int ret = 0;
 2288         struct sockaddr *laddr = (struct sockaddr *)&iw_event->local_addr;
 2289         struct sockaddr *raddr = (struct sockaddr *)&iw_event->remote_addr;
 2290 
 2291         mutex_lock(&id_priv->handler_mutex);
 2292         if (id_priv->state != RDMA_CM_CONNECT)
 2293                 goto out;
 2294 
 2295         memset(&event, 0, sizeof event);
 2296         switch (iw_event->event) {
 2297         case IW_CM_EVENT_CLOSE:
 2298                 event.event = RDMA_CM_EVENT_DISCONNECTED;
 2299                 break;
 2300         case IW_CM_EVENT_CONNECT_REPLY:
 2301                 memcpy(cma_src_addr(id_priv), laddr,
 2302                        rdma_addr_size(laddr));
 2303                 memcpy(cma_dst_addr(id_priv), raddr,
 2304                        rdma_addr_size(raddr));
 2305                 switch (iw_event->status) {
 2306                 case 0:
 2307                         event.event = RDMA_CM_EVENT_ESTABLISHED;
 2308                         event.param.conn.initiator_depth = iw_event->ird;
 2309                         event.param.conn.responder_resources = iw_event->ord;
 2310                         break;
 2311                 case -ECONNRESET:
 2312                 case -ECONNREFUSED:
 2313                         event.event = RDMA_CM_EVENT_REJECTED;
 2314                         break;
 2315                 case -ETIMEDOUT:
 2316                         event.event = RDMA_CM_EVENT_UNREACHABLE;
 2317                         break;
 2318                 default:
 2319                         event.event = RDMA_CM_EVENT_CONNECT_ERROR;
 2320                         break;
 2321                 }
 2322                 break;
 2323         case IW_CM_EVENT_ESTABLISHED:
 2324                 event.event = RDMA_CM_EVENT_ESTABLISHED;
 2325                 event.param.conn.initiator_depth = iw_event->ird;
 2326                 event.param.conn.responder_resources = iw_event->ord;
 2327                 break;
 2328         default:
 2329                 BUG_ON(1);
 2330         }
 2331 
 2332         event.status = iw_event->status;
 2333         event.param.conn.private_data = iw_event->private_data;
 2334         event.param.conn.private_data_len = iw_event->private_data_len;
 2335         ret = id_priv->id.event_handler(&id_priv->id, &event);
 2336         if (ret) {
 2337                 /* Destroy the CM ID by returning a non-zero value. */
 2338                 id_priv->cm_id.iw = NULL;
 2339                 cma_exch(id_priv, RDMA_CM_DESTROYING);
 2340                 mutex_unlock(&id_priv->handler_mutex);
 2341                 rdma_destroy_id(&id_priv->id);
 2342                 return ret;
 2343         }
 2344 
 2345 out:
 2346         mutex_unlock(&id_priv->handler_mutex);
 2347         return ret;
 2348 }
 2349 
 2350 static int iw_conn_req_handler(struct iw_cm_id *cm_id,
 2351                                struct iw_cm_event *iw_event)
 2352 {
 2353         struct rdma_cm_id *new_cm_id;
 2354         struct rdma_id_private *listen_id, *conn_id;
 2355         struct rdma_cm_event event;
 2356         int ret = -ECONNABORTED;
 2357         struct sockaddr *laddr = (struct sockaddr *)&iw_event->local_addr;
 2358         struct sockaddr *raddr = (struct sockaddr *)&iw_event->remote_addr;
 2359 
 2360         listen_id = cm_id->context;
 2361 
 2362         mutex_lock(&listen_id->handler_mutex);
 2363         if (listen_id->state != RDMA_CM_LISTEN)
 2364                 goto out;
 2365 
 2366         /* Create a new RDMA id for the new IW CM ID */
 2367         new_cm_id = rdma_create_id(listen_id->id.route.addr.dev_addr.net,
 2368                                    listen_id->id.event_handler,
 2369                                    listen_id->id.context,
 2370                                    RDMA_PS_TCP, IB_QPT_RC);
 2371         if (IS_ERR(new_cm_id)) {
 2372                 ret = -ENOMEM;
 2373                 goto out;
 2374         }
 2375         conn_id = container_of(new_cm_id, struct rdma_id_private, id);
 2376         mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING);
 2377         conn_id->state = RDMA_CM_CONNECT;
 2378 
 2379         ret = rdma_translate_ip(laddr, &conn_id->id.route.addr.dev_addr);
 2380         if (ret) {
 2381                 mutex_unlock(&conn_id->handler_mutex);
 2382                 rdma_destroy_id(new_cm_id);
 2383                 goto out;
 2384         }
 2385 
 2386         ret = cma_acquire_dev(conn_id, listen_id);
 2387         if (ret) {
 2388                 mutex_unlock(&conn_id->handler_mutex);
 2389                 rdma_destroy_id(new_cm_id);
 2390                 goto out;
 2391         }
 2392 
 2393         conn_id->cm_id.iw = cm_id;
 2394         cm_id->context = conn_id;
 2395         cm_id->cm_handler = cma_iw_handler;
 2396 
 2397         memcpy(cma_src_addr(conn_id), laddr, rdma_addr_size(laddr));
 2398         memcpy(cma_dst_addr(conn_id), raddr, rdma_addr_size(raddr));
 2399 
 2400         memset(&event, 0, sizeof event);
 2401         event.event = RDMA_CM_EVENT_CONNECT_REQUEST;
 2402         event.param.conn.private_data = iw_event->private_data;
 2403         event.param.conn.private_data_len = iw_event->private_data_len;
 2404         event.param.conn.initiator_depth = iw_event->ird;
 2405         event.param.conn.responder_resources = iw_event->ord;
 2406 
 2407         /*
 2408          * Protect against the user destroying conn_id from another thread
 2409          * until we're done accessing it.
 2410          */
 2411         atomic_inc(&conn_id->refcount);
 2412         ret = conn_id->id.event_handler(&conn_id->id, &event);
 2413         if (ret) {
 2414                 /* User wants to destroy the CM ID */
 2415                 conn_id->cm_id.iw = NULL;
 2416                 cma_exch(conn_id, RDMA_CM_DESTROYING);
 2417                 mutex_unlock(&conn_id->handler_mutex);
 2418                 cma_deref_id(conn_id);
 2419                 rdma_destroy_id(&conn_id->id);
 2420                 goto out;
 2421         }
 2422 
 2423         mutex_unlock(&conn_id->handler_mutex);
 2424         cma_deref_id(conn_id);
 2425 
 2426 out:
 2427         mutex_unlock(&listen_id->handler_mutex);
 2428         return ret;
 2429 }
 2430 
 2431 static int cma_ib_listen(struct rdma_id_private *id_priv)
 2432 {
 2433         struct sockaddr *addr;
 2434         struct ib_cm_id *id;
 2435         __be64 svc_id;
 2436 
 2437         addr = cma_src_addr(id_priv);
 2438         svc_id = rdma_get_service_id(&id_priv->id, addr);
 2439         id = ib_cm_insert_listen(id_priv->id.device, cma_req_handler, svc_id);
 2440         if (IS_ERR(id))
 2441                 return PTR_ERR(id);
 2442         id_priv->cm_id.ib = id;
 2443 
 2444         return 0;
 2445 }
 2446 
 2447 static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog)
 2448 {
 2449         int ret;
 2450         struct iw_cm_id *id;
 2451 
 2452         id = iw_create_cm_id(id_priv->id.device,
 2453                              iw_conn_req_handler,
 2454                              id_priv);
 2455         if (IS_ERR(id))
 2456                 return PTR_ERR(id);
 2457 
 2458         id->tos = id_priv->tos;
 2459         id_priv->cm_id.iw = id;
 2460 
 2461         memcpy(&id_priv->cm_id.iw->local_addr, cma_src_addr(id_priv),
 2462                rdma_addr_size(cma_src_addr(id_priv)));
 2463 
 2464         ret = iw_cm_listen(id_priv->cm_id.iw, backlog);
 2465 
 2466         if (ret) {
 2467                 iw_destroy_cm_id(id_priv->cm_id.iw);
 2468                 id_priv->cm_id.iw = NULL;
 2469         }
 2470 
 2471         return ret;
 2472 }
 2473 
 2474 static int cma_listen_handler(struct rdma_cm_id *id,
 2475                               struct rdma_cm_event *event)
 2476 {
 2477         struct rdma_id_private *id_priv = id->context;
 2478 
 2479         id->context = id_priv->id.context;
 2480         id->event_handler = id_priv->id.event_handler;
 2481         return id_priv->id.event_handler(id, event);
 2482 }
 2483 
 2484 static void cma_listen_on_dev(struct rdma_id_private *id_priv,
 2485                               struct cma_device *cma_dev)
 2486 {
 2487         struct rdma_id_private *dev_id_priv;
 2488         struct rdma_cm_id *id;
 2489         struct vnet *net = id_priv->id.route.addr.dev_addr.net;
 2490         int ret;
 2491 
 2492         if (cma_family(id_priv) == AF_IB && !rdma_cap_ib_cm(cma_dev->device, 1))
 2493                 return;
 2494 
 2495         id = rdma_create_id(net, cma_listen_handler, id_priv, id_priv->id.ps,
 2496                             id_priv->id.qp_type);
 2497         if (IS_ERR(id))
 2498                 return;
 2499 
 2500         dev_id_priv = container_of(id, struct rdma_id_private, id);
 2501 
 2502         dev_id_priv->state = RDMA_CM_ADDR_BOUND;
 2503         memcpy(cma_src_addr(dev_id_priv), cma_src_addr(id_priv),
 2504                rdma_addr_size(cma_src_addr(id_priv)));
 2505 
 2506         _cma_attach_to_dev(dev_id_priv, cma_dev);
 2507         list_add_tail(&dev_id_priv->listen_list, &id_priv->listen_list);
 2508         atomic_inc(&id_priv->refcount);
 2509         dev_id_priv->internal_id = 1;
 2510         dev_id_priv->afonly = id_priv->afonly;
 2511 
 2512         ret = rdma_listen(id, id_priv->backlog);
 2513         if (ret)
 2514                 pr_warn("RDMA CMA: cma_listen_on_dev, error %d, listening on device %s\n",
 2515                         ret, cma_dev->device->name);
 2516 }
 2517 
 2518 static void cma_listen_on_all(struct rdma_id_private *id_priv)
 2519 {
 2520         struct cma_device *cma_dev;
 2521 
 2522         mutex_lock(&lock);
 2523         list_add_tail(&id_priv->list, &listen_any_list);
 2524         list_for_each_entry(cma_dev, &dev_list, list)
 2525                 cma_listen_on_dev(id_priv, cma_dev);
 2526         mutex_unlock(&lock);
 2527 }
 2528 
 2529 void rdma_set_service_type(struct rdma_cm_id *id, int tos)
 2530 {
 2531         struct rdma_id_private *id_priv;
 2532 
 2533         id_priv = container_of(id, struct rdma_id_private, id);
 2534         id_priv->tos = (u8) tos;
 2535 }
 2536 EXPORT_SYMBOL(rdma_set_service_type);
 2537 
 2538 /**
 2539  * rdma_set_ack_timeout() - Set the ack timeout of QP associated
 2540  *                          with a connection identifier.
 2541  * @id: Communication identifier to associated with service type.
 2542  * @timeout: Ack timeout to set a QP, expressed as 4.096 * 2^(timeout) usec.
 2543  *
 2544  * This function should be called before rdma_connect() on active side,
 2545  * and on passive side before rdma_accept(). It is applicable to primary
 2546  * path only. The timeout will affect the local side of the QP, it is not
 2547  * negotiated with remote side and zero disables the timer.
 2548  *
 2549  * Return: 0 for success
 2550  */
 2551 int rdma_set_ack_timeout(struct rdma_cm_id *id, u8 timeout)
 2552 {
 2553         struct rdma_id_private *id_priv;
 2554 
 2555         if (id->qp_type != IB_QPT_RC)
 2556                 return -EINVAL;
 2557 
 2558         id_priv = container_of(id, struct rdma_id_private, id);
 2559         id_priv->timeout = timeout;
 2560         id_priv->timeout_set = true;
 2561 
 2562         return 0;
 2563 }
 2564 EXPORT_SYMBOL(rdma_set_ack_timeout);
 2565 
 2566 static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec,
 2567                               void *context)
 2568 {
 2569         struct cma_work *work = context;
 2570         struct rdma_route *route;
 2571 
 2572         route = &work->id->id.route;
 2573 
 2574         if (!status) {
 2575                 route->num_paths = 1;
 2576                 *route->path_rec = *path_rec;
 2577         } else {
 2578                 work->old_state = RDMA_CM_ROUTE_QUERY;
 2579                 work->new_state = RDMA_CM_ADDR_RESOLVED;
 2580                 work->event.event = RDMA_CM_EVENT_ROUTE_ERROR;
 2581                 work->event.status = status;
 2582         }
 2583 
 2584         queue_work(cma_wq, &work->work);
 2585 }
 2586 
 2587 static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms,
 2588                               struct cma_work *work)
 2589 {
 2590         struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
 2591         struct ib_sa_path_rec path_rec;
 2592         ib_sa_comp_mask comp_mask;
 2593         struct sockaddr_in6 *sin6;
 2594         struct sockaddr_ib *sib;
 2595 
 2596         memset(&path_rec, 0, sizeof path_rec);
 2597         rdma_addr_get_sgid(dev_addr, &path_rec.sgid);
 2598         rdma_addr_get_dgid(dev_addr, &path_rec.dgid);
 2599         path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(dev_addr));
 2600         path_rec.numb_path = 1;
 2601         path_rec.reversible = 1;
 2602         path_rec.service_id = rdma_get_service_id(&id_priv->id, cma_dst_addr(id_priv));
 2603 
 2604         comp_mask = IB_SA_PATH_REC_DGID | IB_SA_PATH_REC_SGID |
 2605                     IB_SA_PATH_REC_PKEY | IB_SA_PATH_REC_NUMB_PATH |
 2606                     IB_SA_PATH_REC_REVERSIBLE | IB_SA_PATH_REC_SERVICE_ID;
 2607 
 2608         switch (cma_family(id_priv)) {
 2609         case AF_INET:
 2610                 path_rec.qos_class = cpu_to_be16((u16) id_priv->tos);
 2611                 comp_mask |= IB_SA_PATH_REC_QOS_CLASS;
 2612                 break;
 2613         case AF_INET6:
 2614                 sin6 = (struct sockaddr_in6 *) cma_src_addr(id_priv);
 2615                 path_rec.traffic_class = (u8) (be32_to_cpu(sin6->sin6_flowinfo) >> 20);
 2616                 comp_mask |= IB_SA_PATH_REC_TRAFFIC_CLASS;
 2617                 break;
 2618         case AF_IB:
 2619                 sib = (struct sockaddr_ib *) cma_src_addr(id_priv);
 2620                 path_rec.traffic_class = (u8) (be32_to_cpu(sib->sib_flowinfo) >> 20);
 2621                 comp_mask |= IB_SA_PATH_REC_TRAFFIC_CLASS;
 2622                 break;
 2623         }
 2624 
 2625         id_priv->query_id = ib_sa_path_rec_get(&sa_client, id_priv->id.device,
 2626                                                id_priv->id.port_num, &path_rec,
 2627                                                comp_mask, timeout_ms,
 2628                                                GFP_KERNEL, cma_query_handler,
 2629                                                work, &id_priv->query);
 2630 
 2631         return (id_priv->query_id < 0) ? id_priv->query_id : 0;
 2632 }
 2633 
 2634 static void cma_work_handler(struct work_struct *_work)
 2635 {
 2636         struct cma_work *work = container_of(_work, struct cma_work, work);
 2637         struct rdma_id_private *id_priv = work->id;
 2638         int destroy = 0;
 2639 
 2640         mutex_lock(&id_priv->handler_mutex);
 2641         if (!cma_comp_exch(id_priv, work->old_state, work->new_state))
 2642                 goto out;
 2643 
 2644         if (id_priv->id.event_handler(&id_priv->id, &work->event)) {
 2645                 cma_exch(id_priv, RDMA_CM_DESTROYING);
 2646                 destroy = 1;
 2647         }
 2648 out:
 2649         mutex_unlock(&id_priv->handler_mutex);
 2650         cma_deref_id(id_priv);
 2651         if (destroy)
 2652                 rdma_destroy_id(&id_priv->id);
 2653         kfree(work);
 2654 }
 2655 
 2656 static int cma_resolve_ib_route(struct rdma_id_private *id_priv, int timeout_ms)
 2657 {
 2658         struct rdma_route *route = &id_priv->id.route;
 2659         struct cma_work *work;
 2660         int ret;
 2661 
 2662         work = kzalloc(sizeof *work, GFP_KERNEL);
 2663         if (!work)
 2664                 return -ENOMEM;
 2665 
 2666         work->id = id_priv;
 2667         INIT_WORK(&work->work, cma_work_handler);
 2668         work->old_state = RDMA_CM_ROUTE_QUERY;
 2669         work->new_state = RDMA_CM_ROUTE_RESOLVED;
 2670         work->event.event = RDMA_CM_EVENT_ROUTE_RESOLVED;
 2671 
 2672         route->path_rec = kmalloc(sizeof *route->path_rec, GFP_KERNEL);
 2673         if (!route->path_rec) {
 2674                 ret = -ENOMEM;
 2675                 goto err1;
 2676         }
 2677 
 2678         ret = cma_query_ib_route(id_priv, timeout_ms, work);
 2679         if (ret)
 2680                 goto err2;
 2681 
 2682         return 0;
 2683 err2:
 2684         kfree(route->path_rec);
 2685         route->path_rec = NULL;
 2686 err1:
 2687         kfree(work);
 2688         return ret;
 2689 }
 2690 
 2691 int rdma_set_ib_paths(struct rdma_cm_id *id,
 2692                       struct ib_sa_path_rec *path_rec, int num_paths)
 2693 {
 2694         struct rdma_id_private *id_priv;
 2695         int ret;
 2696 
 2697         id_priv = container_of(id, struct rdma_id_private, id);
 2698         if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_RESOLVED,
 2699                            RDMA_CM_ROUTE_RESOLVED))
 2700                 return -EINVAL;
 2701 
 2702         id->route.path_rec = kmemdup(path_rec, sizeof *path_rec * num_paths,
 2703                                      GFP_KERNEL);
 2704         if (!id->route.path_rec) {
 2705                 ret = -ENOMEM;
 2706                 goto err;
 2707         }
 2708 
 2709         id->route.num_paths = num_paths;
 2710         return 0;
 2711 err:
 2712         cma_comp_exch(id_priv, RDMA_CM_ROUTE_RESOLVED, RDMA_CM_ADDR_RESOLVED);
 2713         return ret;
 2714 }
 2715 EXPORT_SYMBOL(rdma_set_ib_paths);
 2716 
 2717 static int cma_resolve_iw_route(struct rdma_id_private *id_priv, int timeout_ms)
 2718 {
 2719         struct cma_work *work;
 2720 
 2721         work = kzalloc(sizeof *work, GFP_KERNEL);
 2722         if (!work)
 2723                 return -ENOMEM;
 2724 
 2725         work->id = id_priv;
 2726         INIT_WORK(&work->work, cma_work_handler);
 2727         work->old_state = RDMA_CM_ROUTE_QUERY;
 2728         work->new_state = RDMA_CM_ROUTE_RESOLVED;
 2729         work->event.event = RDMA_CM_EVENT_ROUTE_RESOLVED;
 2730         queue_work(cma_wq, &work->work);
 2731         return 0;
 2732 }
 2733 
 2734 static int iboe_tos_to_sl(struct ifnet *ndev, int tos)
 2735 {
 2736         /* get service level, SL, from IPv4 type of service, TOS */
 2737         int sl = (tos >> 5) & 0x7;
 2738 
 2739         /* final mappings are done by the vendor specific drivers */
 2740         return sl;
 2741 }
 2742 
 2743 static enum ib_gid_type cma_route_gid_type(enum rdma_network_type network_type,
 2744                                            unsigned long supported_gids,
 2745                                            enum ib_gid_type default_gid)
 2746 {
 2747         if ((network_type == RDMA_NETWORK_IPV4 ||
 2748              network_type == RDMA_NETWORK_IPV6) &&
 2749             test_bit(IB_GID_TYPE_ROCE_UDP_ENCAP, &supported_gids))
 2750                 return IB_GID_TYPE_ROCE_UDP_ENCAP;
 2751 
 2752         return default_gid;
 2753 }
 2754 
 2755 static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
 2756 {
 2757         struct rdma_route *route = &id_priv->id.route;
 2758         struct rdma_addr *addr = &route->addr;
 2759         struct cma_work *work;
 2760         int ret;
 2761         struct ifnet *ndev = NULL;
 2762 
 2763 
 2764         work = kzalloc(sizeof *work, GFP_KERNEL);
 2765         if (!work)
 2766                 return -ENOMEM;
 2767 
 2768         work->id = id_priv;
 2769         INIT_WORK(&work->work, cma_work_handler);
 2770 
 2771         route->path_rec = kzalloc(sizeof *route->path_rec, GFP_KERNEL);
 2772         if (!route->path_rec) {
 2773                 ret = -ENOMEM;
 2774                 goto err1;
 2775         }
 2776 
 2777         route->num_paths = 1;
 2778 
 2779         if (addr->dev_addr.bound_dev_if) {
 2780                 unsigned long supported_gids;
 2781 
 2782                 ndev = dev_get_by_index(addr->dev_addr.net,
 2783                                         addr->dev_addr.bound_dev_if);
 2784                 if (!ndev) {
 2785                         ret = -ENODEV;
 2786                         goto err2;
 2787                 }
 2788 
 2789                 route->path_rec->net = ndev->if_vnet;
 2790                 route->path_rec->ifindex = ndev->if_index;
 2791                 supported_gids = roce_gid_type_mask_support(id_priv->id.device,
 2792                                                             id_priv->id.port_num);
 2793                 route->path_rec->gid_type =
 2794                         cma_route_gid_type(addr->dev_addr.network,
 2795                                            supported_gids,
 2796                                            id_priv->gid_type);
 2797         }
 2798         if (!ndev) {
 2799                 ret = -ENODEV;
 2800                 goto err2;
 2801         }
 2802 
 2803         memcpy(route->path_rec->dmac, addr->dev_addr.dst_dev_addr, ETH_ALEN);
 2804 
 2805         rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr,
 2806                     &route->path_rec->sgid);
 2807         rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.dst_addr,
 2808                     &route->path_rec->dgid);
 2809 
 2810         /* Use the hint from IP Stack to select GID Type */
 2811         if (route->path_rec->gid_type < ib_network_to_gid_type(addr->dev_addr.network))
 2812                 route->path_rec->gid_type = ib_network_to_gid_type(addr->dev_addr.network);
 2813         if (((struct sockaddr *)&id_priv->id.route.addr.dst_addr)->sa_family != AF_IB)
 2814                 /* TODO: get the hoplimit from the inet/inet6 device */
 2815                 route->path_rec->hop_limit = addr->dev_addr.hoplimit;
 2816         else
 2817                 route->path_rec->hop_limit = 1;
 2818         route->path_rec->reversible = 1;
 2819         route->path_rec->pkey = cpu_to_be16(0xffff);
 2820         route->path_rec->mtu_selector = IB_SA_EQ;
 2821         route->path_rec->sl = iboe_tos_to_sl(ndev, id_priv->tos);
 2822         route->path_rec->traffic_class = id_priv->tos;
 2823         route->path_rec->mtu = iboe_get_mtu(ndev->if_mtu);
 2824         route->path_rec->rate_selector = IB_SA_EQ;
 2825         route->path_rec->rate = iboe_get_rate(ndev);
 2826         dev_put(ndev);
 2827         route->path_rec->packet_life_time_selector = IB_SA_EQ;
 2828         route->path_rec->packet_life_time = CMA_IBOE_PACKET_LIFETIME;
 2829         if (!route->path_rec->mtu) {
 2830                 ret = -EINVAL;
 2831                 goto err2;
 2832         }
 2833 
 2834         work->old_state = RDMA_CM_ROUTE_QUERY;
 2835         work->new_state = RDMA_CM_ROUTE_RESOLVED;
 2836         work->event.event = RDMA_CM_EVENT_ROUTE_RESOLVED;
 2837         work->event.status = 0;
 2838 
 2839         queue_work(cma_wq, &work->work);
 2840 
 2841         return 0;
 2842 
 2843 err2:
 2844         kfree(route->path_rec);
 2845         route->path_rec = NULL;
 2846 err1:
 2847         kfree(work);
 2848         return ret;
 2849 }
 2850 
 2851 int rdma_resolve_route(struct rdma_cm_id *id, int timeout_ms)
 2852 {
 2853         struct rdma_id_private *id_priv;
 2854         int ret;
 2855 
 2856         id_priv = container_of(id, struct rdma_id_private, id);
 2857         if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_RESOLVED, RDMA_CM_ROUTE_QUERY))
 2858                 return -EINVAL;
 2859 
 2860         atomic_inc(&id_priv->refcount);
 2861         if (rdma_cap_ib_sa(id->device, id->port_num))
 2862                 ret = cma_resolve_ib_route(id_priv, timeout_ms);
 2863         else if (rdma_protocol_roce(id->device, id->port_num))
 2864                 ret = cma_resolve_iboe_route(id_priv);
 2865         else if (rdma_protocol_iwarp(id->device, id->port_num))
 2866                 ret = cma_resolve_iw_route(id_priv, timeout_ms);
 2867         else
 2868                 ret = -ENOSYS;
 2869 
 2870         if (ret)
 2871                 goto err;
 2872 
 2873         return 0;
 2874 err:
 2875         cma_comp_exch(id_priv, RDMA_CM_ROUTE_QUERY, RDMA_CM_ADDR_RESOLVED);
 2876         cma_deref_id(id_priv);
 2877         return ret;
 2878 }
 2879 EXPORT_SYMBOL(rdma_resolve_route);
 2880 
 2881 static void cma_set_loopback(struct sockaddr *addr)
 2882 {
 2883         switch (addr->sa_family) {
 2884         case AF_INET:
 2885                 ((struct sockaddr_in *) addr)->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
 2886                 break;
 2887         case AF_INET6:
 2888                 ipv6_addr_set(&((struct sockaddr_in6 *) addr)->sin6_addr,
 2889                               0, 0, 0, htonl(1));
 2890                 break;
 2891         default:
 2892                 ib_addr_set(&((struct sockaddr_ib *) addr)->sib_addr,
 2893                             0, 0, 0, htonl(1));
 2894                 break;
 2895         }
 2896 }
 2897 
 2898 static int cma_bind_loopback(struct rdma_id_private *id_priv)
 2899 {
 2900         struct cma_device *cma_dev, *cur_dev;
 2901         struct ib_port_attr port_attr;
 2902         union ib_gid gid;
 2903         u16 pkey;
 2904         int ret;
 2905         u8 p;
 2906 
 2907         cma_dev = NULL;
 2908         mutex_lock(&lock);
 2909         list_for_each_entry(cur_dev, &dev_list, list) {
 2910                 if (cma_family(id_priv) == AF_IB &&
 2911                     !rdma_cap_ib_cm(cur_dev->device, 1))
 2912                         continue;
 2913 
 2914                 if (!cma_dev)
 2915                         cma_dev = cur_dev;
 2916 
 2917                 for (p = 1; p <= cur_dev->device->phys_port_cnt; ++p) {
 2918                         if (!ib_query_port(cur_dev->device, p, &port_attr) &&
 2919                             port_attr.state == IB_PORT_ACTIVE) {
 2920                                 cma_dev = cur_dev;
 2921                                 goto port_found;
 2922                         }
 2923                 }
 2924         }
 2925 
 2926         if (!cma_dev) {
 2927                 ret = -ENODEV;
 2928                 goto out;
 2929         }
 2930 
 2931         p = 1;
 2932 
 2933 port_found:
 2934         ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid, NULL);
 2935         if (ret)
 2936                 goto out;
 2937 
 2938         ret = ib_get_cached_pkey(cma_dev->device, p, 0, &pkey);
 2939         if (ret)
 2940                 goto out;
 2941 
 2942         id_priv->id.route.addr.dev_addr.dev_type =
 2943                 (rdma_protocol_ib(cma_dev->device, p)) ?
 2944                 ARPHRD_INFINIBAND : ARPHRD_ETHER;
 2945 
 2946         rdma_addr_set_sgid(&id_priv->id.route.addr.dev_addr, &gid);
 2947         ib_addr_set_pkey(&id_priv->id.route.addr.dev_addr, pkey);
 2948         id_priv->id.port_num = p;
 2949         cma_attach_to_dev(id_priv, cma_dev);
 2950         cma_set_loopback(cma_src_addr(id_priv));
 2951 out:
 2952         mutex_unlock(&lock);
 2953         return ret;
 2954 }
 2955 
 2956 static void addr_handler(int status, struct sockaddr *src_addr,
 2957                          struct rdma_dev_addr *dev_addr, void *context)
 2958 {
 2959         struct rdma_id_private *id_priv = context;
 2960         struct rdma_cm_event event;
 2961 
 2962         memset(&event, 0, sizeof event);
 2963         mutex_lock(&id_priv->handler_mutex);
 2964         if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_QUERY,
 2965                            RDMA_CM_ADDR_RESOLVED))
 2966                 goto out;
 2967 
 2968         memcpy(cma_src_addr(id_priv), src_addr, rdma_addr_size(src_addr));
 2969         if (!status && !id_priv->cma_dev)
 2970                 status = cma_acquire_dev(id_priv, NULL);
 2971 
 2972         if (status) {
 2973                 if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_RESOLVED,
 2974                                    RDMA_CM_ADDR_BOUND))
 2975                         goto out;
 2976                 event.event = RDMA_CM_EVENT_ADDR_ERROR;
 2977                 event.status = status;
 2978         } else
 2979                 event.event = RDMA_CM_EVENT_ADDR_RESOLVED;
 2980 
 2981         if (id_priv->id.event_handler(&id_priv->id, &event)) {
 2982                 cma_exch(id_priv, RDMA_CM_DESTROYING);
 2983                 mutex_unlock(&id_priv->handler_mutex);
 2984                 cma_deref_id(id_priv);
 2985                 rdma_destroy_id(&id_priv->id);
 2986                 return;
 2987         }
 2988 out:
 2989         mutex_unlock(&id_priv->handler_mutex);
 2990         cma_deref_id(id_priv);
 2991 }
 2992 
 2993 static int cma_resolve_loopback(struct rdma_id_private *id_priv)
 2994 {
 2995         struct cma_work *work;
 2996         union ib_gid gid;
 2997         int ret;
 2998 
 2999         work = kzalloc(sizeof *work, GFP_KERNEL);
 3000         if (!work)
 3001                 return -ENOMEM;
 3002 
 3003         if (!id_priv->cma_dev) {
 3004                 ret = cma_bind_loopback(id_priv);
 3005                 if (ret)
 3006                         goto err;
 3007         }
 3008 
 3009         rdma_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid);
 3010         rdma_addr_set_dgid(&id_priv->id.route.addr.dev_addr, &gid);
 3011 
 3012         work->id = id_priv;
 3013         INIT_WORK(&work->work, cma_work_handler);
 3014         work->old_state = RDMA_CM_ADDR_QUERY;
 3015         work->new_state = RDMA_CM_ADDR_RESOLVED;
 3016         work->event.event = RDMA_CM_EVENT_ADDR_RESOLVED;
 3017         queue_work(cma_wq, &work->work);
 3018         return 0;
 3019 err:
 3020         kfree(work);
 3021         return ret;
 3022 }
 3023 
 3024 static int cma_resolve_ib_addr(struct rdma_id_private *id_priv)
 3025 {
 3026         struct cma_work *work;
 3027         int ret;
 3028 
 3029         work = kzalloc(sizeof *work, GFP_KERNEL);
 3030         if (!work)
 3031                 return -ENOMEM;
 3032 
 3033         if (!id_priv->cma_dev) {
 3034                 ret = cma_resolve_ib_dev(id_priv);
 3035                 if (ret)
 3036                         goto err;
 3037         }
 3038 
 3039         rdma_addr_set_dgid(&id_priv->id.route.addr.dev_addr, (union ib_gid *)
 3040                 &(((struct sockaddr_ib *) &id_priv->id.route.addr.dst_addr)->sib_addr));
 3041 
 3042         work->id = id_priv;
 3043         INIT_WORK(&work->work, cma_work_handler);
 3044         work->old_state = RDMA_CM_ADDR_QUERY;
 3045         work->new_state = RDMA_CM_ADDR_RESOLVED;
 3046         work->event.event = RDMA_CM_EVENT_ADDR_RESOLVED;
 3047         queue_work(cma_wq, &work->work);
 3048         return 0;
 3049 err:
 3050         kfree(work);
 3051         return ret;
 3052 }
 3053 
 3054 static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
 3055                          struct sockaddr *dst_addr)
 3056 {
 3057         if (!src_addr || !src_addr->sa_family) {
 3058                 src_addr = (struct sockaddr *) &id->route.addr.src_addr;
 3059                 src_addr->sa_family = dst_addr->sa_family;
 3060                 if (dst_addr->sa_family == AF_INET6) {
 3061                         struct sockaddr_in6 *src_addr6 = (struct sockaddr_in6 *) src_addr;
 3062                         struct sockaddr_in6 *dst_addr6 = (struct sockaddr_in6 *) dst_addr;
 3063                         src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id;
 3064                         if (IN6_IS_SCOPE_LINKLOCAL(&dst_addr6->sin6_addr) ||
 3065                             IN6_IS_ADDR_MC_INTFACELOCAL(&dst_addr6->sin6_addr))
 3066                                 id->route.addr.dev_addr.bound_dev_if = dst_addr6->sin6_scope_id;
 3067                 } else if (dst_addr->sa_family == AF_IB) {
 3068                         ((struct sockaddr_ib *) src_addr)->sib_pkey =
 3069                                 ((struct sockaddr_ib *) dst_addr)->sib_pkey;
 3070                 }
 3071         }
 3072         return rdma_bind_addr(id, src_addr);
 3073 }
 3074 
 3075 int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
 3076                       struct sockaddr *dst_addr, int timeout_ms)
 3077 {
 3078         struct rdma_id_private *id_priv;
 3079         struct vnet *vnet = id->route.addr.dev_addr.net;
 3080         int ret;
 3081 
 3082         id_priv = container_of(id, struct rdma_id_private, id);
 3083         if (id_priv->state == RDMA_CM_IDLE) {
 3084                 ret = cma_bind_addr(id, src_addr, dst_addr);
 3085                 if (ret)
 3086                         return ret;
 3087         }
 3088 
 3089         if (cma_family(id_priv) != dst_addr->sa_family)
 3090                 return -EINVAL;
 3091 
 3092         if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_ADDR_QUERY))
 3093                 return -EINVAL;
 3094 
 3095         atomic_inc(&id_priv->refcount);
 3096         memcpy(cma_dst_addr(id_priv), dst_addr, rdma_addr_size(dst_addr));
 3097         if (cma_any_addr(vnet, dst_addr)) {
 3098                 ret = cma_resolve_loopback(id_priv);
 3099         } else {
 3100                 if (dst_addr->sa_family == AF_IB) {
 3101                         ret = cma_resolve_ib_addr(id_priv);
 3102                 } else {
 3103                         ret = cma_check_linklocal(&id->route.addr.dev_addr, dst_addr);
 3104                         if (ret)
 3105                                 goto err;
 3106 
 3107                         ret = rdma_resolve_ip(&addr_client, cma_src_addr(id_priv),
 3108                                               dst_addr, &id->route.addr.dev_addr,
 3109                                               timeout_ms, addr_handler, id_priv);
 3110                 }
 3111         }
 3112         if (ret)
 3113                 goto err;
 3114 
 3115         return 0;
 3116 err:
 3117         cma_comp_exch(id_priv, RDMA_CM_ADDR_QUERY, RDMA_CM_ADDR_BOUND);
 3118         cma_deref_id(id_priv);
 3119         return ret;
 3120 }
 3121 EXPORT_SYMBOL(rdma_resolve_addr);
 3122 
 3123 int rdma_set_reuseaddr(struct rdma_cm_id *id, int reuse)
 3124 {
 3125         struct rdma_id_private *id_priv;
 3126         unsigned long flags;
 3127         int ret;
 3128 
 3129         id_priv = container_of(id, struct rdma_id_private, id);
 3130         spin_lock_irqsave(&id_priv->lock, flags);
 3131         if (reuse || id_priv->state == RDMA_CM_IDLE) {
 3132                 id_priv->reuseaddr = reuse;
 3133                 ret = 0;
 3134         } else {
 3135                 ret = -EINVAL;
 3136         }
 3137         spin_unlock_irqrestore(&id_priv->lock, flags);
 3138         return ret;
 3139 }
 3140 EXPORT_SYMBOL(rdma_set_reuseaddr);
 3141 
 3142 int rdma_set_afonly(struct rdma_cm_id *id, int afonly)
 3143 {
 3144         struct rdma_id_private *id_priv;
 3145         unsigned long flags;
 3146         int ret;
 3147 
 3148         id_priv = container_of(id, struct rdma_id_private, id);
 3149         spin_lock_irqsave(&id_priv->lock, flags);
 3150         if (id_priv->state == RDMA_CM_IDLE || id_priv->state == RDMA_CM_ADDR_BOUND) {
 3151                 id_priv->options |= (1 << CMA_OPTION_AFONLY);
 3152                 id_priv->afonly = afonly;
 3153                 ret = 0;
 3154         } else {
 3155                 ret = -EINVAL;
 3156         }
 3157         spin_unlock_irqrestore(&id_priv->lock, flags);
 3158         return ret;
 3159 }
 3160 EXPORT_SYMBOL(rdma_set_afonly);
 3161 
 3162 static void cma_bind_port(struct rdma_bind_list *bind_list,
 3163                           struct rdma_id_private *id_priv)
 3164 {
 3165         struct sockaddr *addr;
 3166         struct sockaddr_ib *sib;
 3167         u64 sid, mask;
 3168         __be16 port;
 3169 
 3170         addr = cma_src_addr(id_priv);
 3171         port = htons(bind_list->port);
 3172 
 3173         switch (addr->sa_family) {
 3174         case AF_INET:
 3175                 ((struct sockaddr_in *) addr)->sin_port = port;
 3176                 break;
 3177         case AF_INET6:
 3178                 ((struct sockaddr_in6 *) addr)->sin6_port = port;
 3179                 break;
 3180         case AF_IB:
 3181                 sib = (struct sockaddr_ib *) addr;
 3182                 sid = be64_to_cpu(sib->sib_sid);
 3183                 mask = be64_to_cpu(sib->sib_sid_mask);
 3184                 sib->sib_sid = cpu_to_be64((sid & mask) | (u64) ntohs(port));
 3185                 sib->sib_sid_mask = cpu_to_be64(~0ULL);
 3186                 break;
 3187         }
 3188         id_priv->bind_list = bind_list;
 3189         hlist_add_head(&id_priv->node, &bind_list->owners);
 3190 }
 3191 
 3192 static int cma_alloc_port(enum rdma_port_space ps,
 3193                           struct rdma_id_private *id_priv, unsigned short snum)
 3194 {
 3195         struct rdma_bind_list *bind_list;
 3196         int ret;
 3197 
 3198         bind_list = kzalloc(sizeof *bind_list, GFP_KERNEL);
 3199         if (!bind_list)
 3200                 return -ENOMEM;
 3201 
 3202         ret = cma_ps_alloc(id_priv->id.route.addr.dev_addr.net, ps, bind_list,
 3203                            snum);
 3204         if (ret < 0)
 3205                 goto err;
 3206 
 3207         bind_list->ps = ps;
 3208         bind_list->port = (unsigned short)ret;
 3209         cma_bind_port(bind_list, id_priv);
 3210         return 0;
 3211 err:
 3212         kfree(bind_list);
 3213         return ret == -ENOSPC ? -EADDRNOTAVAIL : ret;
 3214 }
 3215 
 3216 static int cma_alloc_any_port(enum rdma_port_space ps,
 3217                               struct rdma_id_private *id_priv)
 3218 {
 3219         static unsigned int last_used_port;
 3220         int low, high, remaining;
 3221         unsigned int rover;
 3222         struct vnet *net = id_priv->id.route.addr.dev_addr.net;
 3223         u32 rand;
 3224 
 3225         inet_get_local_port_range(net, &low, &high);
 3226         remaining = (high - low) + 1;
 3227         get_random_bytes(&rand, sizeof(rand));
 3228         rover = rand % remaining + low;
 3229 retry:
 3230         if (last_used_port != rover &&
 3231             !cma_ps_find(net, ps, (unsigned short)rover)) {
 3232                 int ret = cma_alloc_port(ps, id_priv, rover);
 3233                 /*
 3234                  * Remember previously used port number in order to avoid
 3235                  * re-using same port immediately after it is closed.
 3236                  */
 3237                 if (!ret)
 3238                         last_used_port = rover;
 3239                 if (ret != -EADDRNOTAVAIL)
 3240                         return ret;
 3241         }
 3242         if (--remaining) {
 3243                 rover++;
 3244                 if ((rover < low) || (rover > high))
 3245                         rover = low;
 3246                 goto retry;
 3247         }
 3248         return -EADDRNOTAVAIL;
 3249 }
 3250 
 3251 /*
 3252  * Check that the requested port is available.  This is called when trying to
 3253  * bind to a specific port, or when trying to listen on a bound port.  In
 3254  * the latter case, the provided id_priv may already be on the bind_list, but
 3255  * we still need to check that it's okay to start listening.
 3256  */
 3257 static int cma_check_port(struct rdma_bind_list *bind_list,
 3258                           struct rdma_id_private *id_priv, uint8_t reuseaddr)
 3259 {
 3260         struct rdma_id_private *cur_id;
 3261         struct sockaddr *addr, *cur_addr;
 3262         struct vnet *vnet;
 3263 
 3264         addr = cma_src_addr(id_priv);
 3265         hlist_for_each_entry(cur_id, &bind_list->owners, node) {
 3266                 if (id_priv == cur_id)
 3267                         continue;
 3268 
 3269                 if ((cur_id->state != RDMA_CM_LISTEN) && reuseaddr &&
 3270                     cur_id->reuseaddr)
 3271                         continue;
 3272 
 3273                 cur_addr = cma_src_addr(cur_id);
 3274                 if (id_priv->afonly && cur_id->afonly &&
 3275                     (addr->sa_family != cur_addr->sa_family))
 3276                         continue;
 3277 
 3278                 vnet = cur_id->id.route.addr.dev_addr.net;
 3279                 if (cma_any_addr(vnet, addr) || cma_any_addr(vnet, cur_addr))
 3280                         return -EADDRNOTAVAIL;
 3281 
 3282                 if (!cma_addr_cmp(addr, cur_addr))
 3283                         return -EADDRINUSE;
 3284         }
 3285         return 0;
 3286 }
 3287 
 3288 static int cma_use_port(enum rdma_port_space ps,
 3289                         struct rdma_id_private *id_priv)
 3290 {
 3291         struct rdma_bind_list *bind_list;
 3292         unsigned short snum;
 3293         int ret;
 3294 
 3295         snum = ntohs(cma_port(cma_src_addr(id_priv)));
 3296         if (snum < IPPORT_RESERVED &&
 3297             priv_check(curthread, PRIV_NETINET_BINDANY) != 0)
 3298                 return -EACCES;
 3299 
 3300         bind_list = cma_ps_find(id_priv->id.route.addr.dev_addr.net, ps, snum);
 3301         if (!bind_list) {
 3302                 ret = cma_alloc_port(ps, id_priv, snum);
 3303         } else {
 3304                 ret = cma_check_port(bind_list, id_priv, id_priv->reuseaddr);
 3305                 if (!ret)
 3306                         cma_bind_port(bind_list, id_priv);
 3307         }
 3308         return ret;
 3309 }
 3310 
 3311 static int cma_bind_listen(struct rdma_id_private *id_priv)
 3312 {
 3313         struct rdma_bind_list *bind_list = id_priv->bind_list;
 3314         int ret = 0;
 3315 
 3316         mutex_lock(&lock);
 3317         if (bind_list->owners.first->next)
 3318                 ret = cma_check_port(bind_list, id_priv, 0);
 3319         mutex_unlock(&lock);
 3320         return ret;
 3321 }
 3322 
 3323 static enum rdma_port_space cma_select_inet_ps(
 3324                 struct rdma_id_private *id_priv)
 3325 {
 3326         switch (id_priv->id.ps) {
 3327         case RDMA_PS_TCP:
 3328         case RDMA_PS_UDP:
 3329         case RDMA_PS_IPOIB:
 3330         case RDMA_PS_IB:
 3331         case RDMA_PS_SDP:
 3332                 return id_priv->id.ps;
 3333         default:
 3334 
 3335                 return 0;
 3336         }
 3337 }
 3338 
 3339 static enum rdma_port_space cma_select_ib_ps(struct rdma_id_private *id_priv)
 3340 {
 3341         enum rdma_port_space ps = 0;
 3342         struct sockaddr_ib *sib;
 3343         u64 sid_ps, mask, sid;
 3344 
 3345         sib = (struct sockaddr_ib *) cma_src_addr(id_priv);
 3346         mask = be64_to_cpu(sib->sib_sid_mask) & RDMA_IB_IP_PS_MASK;
 3347         sid = be64_to_cpu(sib->sib_sid) & mask;
 3348 
 3349         if ((id_priv->id.ps == RDMA_PS_IB) && (sid == (RDMA_IB_IP_PS_IB & mask))) {
 3350                 sid_ps = RDMA_IB_IP_PS_IB;
 3351                 ps = RDMA_PS_IB;
 3352         } else if (((id_priv->id.ps == RDMA_PS_IB) || (id_priv->id.ps == RDMA_PS_TCP)) &&
 3353                    (sid == (RDMA_IB_IP_PS_TCP & mask))) {
 3354                 sid_ps = RDMA_IB_IP_PS_TCP;
 3355                 ps = RDMA_PS_TCP;
 3356         } else if (((id_priv->id.ps == RDMA_PS_IB) || (id_priv->id.ps == RDMA_PS_UDP)) &&
 3357                    (sid == (RDMA_IB_IP_PS_UDP & mask))) {
 3358                 sid_ps = RDMA_IB_IP_PS_UDP;
 3359                 ps = RDMA_PS_UDP;
 3360         }
 3361 
 3362         if (ps) {
 3363                 sib->sib_sid = cpu_to_be64(sid_ps | ntohs(cma_port((struct sockaddr *) sib)));
 3364                 sib->sib_sid_mask = cpu_to_be64(RDMA_IB_IP_PS_MASK |
 3365                                                 be64_to_cpu(sib->sib_sid_mask));
 3366         }
 3367         return ps;
 3368 }
 3369 
 3370 static int cma_get_port(struct rdma_id_private *id_priv)
 3371 {
 3372         enum rdma_port_space ps;
 3373         int ret;
 3374 
 3375         if (cma_family(id_priv) != AF_IB)
 3376                 ps = cma_select_inet_ps(id_priv);
 3377         else
 3378                 ps = cma_select_ib_ps(id_priv);
 3379         if (!ps)
 3380                 return -EPROTONOSUPPORT;
 3381 
 3382         mutex_lock(&lock);
 3383         if (cma_any_port(cma_src_addr(id_priv)))
 3384                 ret = cma_alloc_any_port(ps, id_priv);
 3385         else
 3386                 ret = cma_use_port(ps, id_priv);
 3387         mutex_unlock(&lock);
 3388 
 3389         return ret;
 3390 }
 3391 
 3392 static int cma_check_linklocal(struct rdma_dev_addr *dev_addr,
 3393                                struct sockaddr *addr)
 3394 {
 3395 #ifdef INET6
 3396         struct sockaddr_in6 sin6;
 3397 
 3398         if (addr->sa_family != AF_INET6)
 3399                 return 0;
 3400 
 3401         sin6 = *(struct sockaddr_in6 *)addr;
 3402 
 3403         if (IN6_IS_SCOPE_LINKLOCAL(&sin6.sin6_addr) ||
 3404             IN6_IS_ADDR_MC_INTFACELOCAL(&sin6.sin6_addr)) {
 3405                 bool failure;
 3406 
 3407                 CURVNET_SET_QUIET(dev_addr->net);
 3408                 failure = sa6_recoverscope(&sin6) || sin6.sin6_scope_id == 0;
 3409                 CURVNET_RESTORE();
 3410 
 3411                 /* check if IPv6 scope ID is not set */
 3412                 if (failure)
 3413                         return -EINVAL;
 3414                 dev_addr->bound_dev_if = sin6.sin6_scope_id;
 3415         }
 3416 #endif
 3417         return 0;
 3418 }
 3419 
 3420 int rdma_listen(struct rdma_cm_id *id, int backlog)
 3421 {
 3422         struct rdma_id_private *id_priv;
 3423         int ret;
 3424 
 3425         id_priv = container_of(id, struct rdma_id_private, id);
 3426         if (id_priv->state == RDMA_CM_IDLE) {
 3427                 id->route.addr.src_addr.ss_family = AF_INET;
 3428                 ret = rdma_bind_addr(id, cma_src_addr(id_priv));
 3429                 if (ret)
 3430                         return ret;
 3431         }
 3432 
 3433         if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_LISTEN))
 3434                 return -EINVAL;
 3435 
 3436         if (id_priv->reuseaddr) {
 3437                 ret = cma_bind_listen(id_priv);
 3438                 if (ret)
 3439                         goto err;
 3440         }
 3441 
 3442         id_priv->backlog = backlog;
 3443         if (id->device) {
 3444                 if (rdma_cap_ib_cm(id->device, 1)) {
 3445                         ret = cma_ib_listen(id_priv);
 3446                         if (ret)
 3447                                 goto err;
 3448                 } else if (rdma_cap_iw_cm(id->device, 1)) {
 3449                         ret = cma_iw_listen(id_priv, backlog);
 3450                         if (ret)
 3451                                 goto err;
 3452                 } else {
 3453                         ret = -ENOSYS;
 3454                         goto err;
 3455                 }
 3456         } else
 3457                 cma_listen_on_all(id_priv);
 3458 
 3459         return 0;
 3460 err:
 3461         id_priv->backlog = 0;
 3462         cma_comp_exch(id_priv, RDMA_CM_LISTEN, RDMA_CM_ADDR_BOUND);
 3463         return ret;
 3464 }
 3465 EXPORT_SYMBOL(rdma_listen);
 3466 
 3467 int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
 3468 {
 3469         struct rdma_id_private *id_priv;
 3470         struct vnet *vnet = id->route.addr.dev_addr.net;
 3471         int ret;
 3472 
 3473         if (addr->sa_family != AF_INET && addr->sa_family != AF_INET6 &&
 3474             addr->sa_family != AF_IB)
 3475                 return -EAFNOSUPPORT;
 3476 
 3477         id_priv = container_of(id, struct rdma_id_private, id);
 3478         if (!cma_comp_exch(id_priv, RDMA_CM_IDLE, RDMA_CM_ADDR_BOUND))
 3479                 return -EINVAL;
 3480 
 3481         ret = cma_check_linklocal(&id->route.addr.dev_addr, addr);
 3482         if (ret)
 3483                 goto err1;
 3484 
 3485         memcpy(cma_src_addr(id_priv), addr, rdma_addr_size(addr));
 3486         if (!cma_any_addr(vnet, addr)) {
 3487                 ret = cma_translate_addr(addr, &id->route.addr.dev_addr);
 3488                 if (ret)
 3489                         goto err1;
 3490 
 3491                 ret = cma_acquire_dev(id_priv, NULL);
 3492                 if (ret)
 3493                         goto err1;
 3494         }
 3495 
 3496         if (!(id_priv->options & (1 << CMA_OPTION_AFONLY))) {
 3497                 if (addr->sa_family == AF_INET)
 3498                         id_priv->afonly = 1;
 3499 #ifdef INET6
 3500                 else if (addr->sa_family == AF_INET6) {
 3501                         CURVNET_SET_QUIET(vnet);
 3502                         id_priv->afonly = V_ip6_v6only;
 3503                         CURVNET_RESTORE();
 3504                 }
 3505 #endif
 3506         }
 3507         ret = cma_get_port(id_priv);
 3508         if (ret)
 3509                 goto err2;
 3510 
 3511         return 0;
 3512 err2:
 3513         if (id_priv->cma_dev)
 3514                 cma_release_dev(id_priv);
 3515 err1:
 3516         cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_IDLE);
 3517         return ret;
 3518 }
 3519 EXPORT_SYMBOL(rdma_bind_addr);
 3520 
 3521 static int sdp_format_hdr(struct sdp_hh *sdp_hdr, struct rdma_id_private *id_priv)
 3522 {
 3523         /*
 3524          * XXXCEM: CMA just sets the version itself rather than relying on
 3525          * passed in packet to have the major version set.  Should we?
 3526          */
 3527         if (sdp_get_majv(sdp_hdr->majv_minv) != SDP_MAJ_VERSION)
 3528                 return -EINVAL;
 3529 
 3530         if (cma_family(id_priv) == AF_INET) {
 3531                 struct sockaddr_in *src4, *dst4;
 3532 
 3533                 src4 = (struct sockaddr_in *) cma_src_addr(id_priv);
 3534                 dst4 = (struct sockaddr_in *) cma_dst_addr(id_priv);
 3535 
 3536                 sdp_set_ip_ver(sdp_hdr, 4);
 3537                 sdp_hdr->src_addr.ip4.addr = src4->sin_addr.s_addr;
 3538                 sdp_hdr->dst_addr.ip4.addr = dst4->sin_addr.s_addr;
 3539                 sdp_hdr->port = src4->sin_port;
 3540         } else if (cma_family(id_priv) == AF_INET6) {
 3541                 struct sockaddr_in6 *src6, *dst6;
 3542 
 3543                 src6 = (struct sockaddr_in6 *) cma_src_addr(id_priv);
 3544                 dst6 = (struct sockaddr_in6 *) cma_dst_addr(id_priv);
 3545 
 3546                 sdp_set_ip_ver(sdp_hdr, 6);
 3547                 sdp_hdr->src_addr.ip6 = src6->sin6_addr;
 3548                 sdp_hdr->dst_addr.ip6 = dst6->sin6_addr;
 3549                 sdp_hdr->port = src6->sin6_port;
 3550                 cma_ip6_clear_scope_id(&sdp_hdr->src_addr.ip6);
 3551                 cma_ip6_clear_scope_id(&sdp_hdr->dst_addr.ip6);
 3552         } else
 3553                 return -EAFNOSUPPORT;
 3554         return 0;
 3555 }
 3556 
 3557 static int cma_format_hdr(void *hdr, struct rdma_id_private *id_priv)
 3558 {
 3559         struct cma_hdr *cma_hdr;
 3560 
 3561         if (id_priv->id.ps == RDMA_PS_SDP)
 3562                 return sdp_format_hdr(hdr, id_priv);
 3563 
 3564         cma_hdr = hdr;
 3565         cma_hdr->cma_version = CMA_VERSION;
 3566         if (cma_family(id_priv) == AF_INET) {
 3567                 struct sockaddr_in *src4, *dst4;
 3568 
 3569                 src4 = (struct sockaddr_in *) cma_src_addr(id_priv);
 3570                 dst4 = (struct sockaddr_in *) cma_dst_addr(id_priv);
 3571 
 3572                 cma_set_ip_ver(cma_hdr, 4);
 3573                 cma_hdr->src_addr.ip4.addr = src4->sin_addr.s_addr;
 3574                 cma_hdr->dst_addr.ip4.addr = dst4->sin_addr.s_addr;
 3575                 cma_hdr->port = src4->sin_port;
 3576         } else if (cma_family(id_priv) == AF_INET6) {
 3577                 struct sockaddr_in6 *src6, *dst6;
 3578 
 3579                 src6 = (struct sockaddr_in6 *) cma_src_addr(id_priv);
 3580                 dst6 = (struct sockaddr_in6 *) cma_dst_addr(id_priv);
 3581 
 3582                 cma_set_ip_ver(cma_hdr, 6);
 3583                 cma_hdr->src_addr.ip6 = src6->sin6_addr;
 3584                 cma_hdr->dst_addr.ip6 = dst6->sin6_addr;
 3585                 cma_hdr->port = src6->sin6_port;
 3586                 cma_ip6_clear_scope_id(&cma_hdr->src_addr.ip6);
 3587                 cma_ip6_clear_scope_id(&cma_hdr->dst_addr.ip6);
 3588         }
 3589         return 0;
 3590 }
 3591 
 3592 static int cma_sidr_rep_handler(struct ib_cm_id *cm_id,
 3593                                 struct ib_cm_event *ib_event)
 3594 {
 3595         struct rdma_id_private *id_priv = cm_id->context;
 3596         struct rdma_cm_event event;
 3597         struct ib_cm_sidr_rep_event_param *rep = &ib_event->param.sidr_rep_rcvd;
 3598         int ret = 0;
 3599 
 3600         mutex_lock(&id_priv->handler_mutex);
 3601         if (id_priv->state != RDMA_CM_CONNECT)
 3602                 goto out;
 3603 
 3604         memset(&event, 0, sizeof event);
 3605         switch (ib_event->event) {
 3606         case IB_CM_SIDR_REQ_ERROR:
 3607                 event.event = RDMA_CM_EVENT_UNREACHABLE;
 3608                 event.status = -ETIMEDOUT;
 3609                 break;
 3610         case IB_CM_SIDR_REP_RECEIVED:
 3611                 event.param.ud.private_data = ib_event->private_data;
 3612                 event.param.ud.private_data_len = IB_CM_SIDR_REP_PRIVATE_DATA_SIZE;
 3613                 if (rep->status != IB_SIDR_SUCCESS) {
 3614                         event.event = RDMA_CM_EVENT_UNREACHABLE;
 3615                         event.status = ib_event->param.sidr_rep_rcvd.status;
 3616                         break;
 3617                 }
 3618                 ret = cma_set_qkey(id_priv, rep->qkey);
 3619                 if (ret) {
 3620                         event.event = RDMA_CM_EVENT_ADDR_ERROR;
 3621                         event.status = ret;
 3622                         break;
 3623                 }
 3624                 ret = ib_init_ah_from_path(id_priv->id.device,
 3625                                            id_priv->id.port_num,
 3626                                            id_priv->id.route.path_rec,
 3627                                            &event.param.ud.ah_attr);
 3628                 if (ret) {
 3629                         event.event = RDMA_CM_EVENT_ADDR_ERROR;
 3630                         event.status = ret;
 3631                         break;
 3632                 }
 3633                 event.param.ud.qp_num = rep->qpn;
 3634                 event.param.ud.qkey = rep->qkey;
 3635                 event.event = RDMA_CM_EVENT_ESTABLISHED;
 3636                 event.status = 0;
 3637                 break;
 3638         default:
 3639                 pr_err("RDMA CMA: unexpected IB CM event: %d\n",
 3640                        ib_event->event);
 3641                 goto out;
 3642         }
 3643 
 3644         ret = id_priv->id.event_handler(&id_priv->id, &event);
 3645         if (ret) {
 3646                 /* Destroy the CM ID by returning a non-zero value. */
 3647                 id_priv->cm_id.ib = NULL;
 3648                 cma_exch(id_priv, RDMA_CM_DESTROYING);
 3649                 mutex_unlock(&id_priv->handler_mutex);
 3650                 rdma_destroy_id(&id_priv->id);
 3651                 return ret;
 3652         }
 3653 out:
 3654         mutex_unlock(&id_priv->handler_mutex);
 3655         return ret;
 3656 }
 3657 
 3658 static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
 3659                               struct rdma_conn_param *conn_param)
 3660 {
 3661         struct ib_cm_sidr_req_param req;
 3662         struct ib_cm_id *id;
 3663         void *private_data;
 3664         int offset, ret;
 3665 
 3666         memset(&req, 0, sizeof req);
 3667         offset = cma_user_data_offset(id_priv);
 3668         req.private_data_len = offset + conn_param->private_data_len;
 3669         if (req.private_data_len < conn_param->private_data_len)
 3670                 return -EINVAL;
 3671 
 3672         if (req.private_data_len) {
 3673                 private_data = kzalloc(req.private_data_len, GFP_ATOMIC);
 3674                 if (!private_data)
 3675                         return -ENOMEM;
 3676         } else {
 3677                 private_data = NULL;
 3678         }
 3679 
 3680         if (conn_param->private_data && conn_param->private_data_len)
 3681                 memcpy((char *)private_data + offset, conn_param->private_data,
 3682                        conn_param->private_data_len);
 3683 
 3684         if (private_data) {
 3685                 ret = cma_format_hdr(private_data, id_priv);
 3686                 if (ret)
 3687                         goto out;
 3688                 req.private_data = private_data;
 3689         }
 3690 
 3691         id = ib_create_cm_id(id_priv->id.device, cma_sidr_rep_handler,
 3692                              id_priv);
 3693         if (IS_ERR(id)) {
 3694                 ret = PTR_ERR(id);
 3695                 goto out;
 3696         }
 3697         id_priv->cm_id.ib = id;
 3698 
 3699         req.path = id_priv->id.route.path_rec;
 3700         req.service_id = rdma_get_service_id(&id_priv->id, cma_dst_addr(id_priv));
 3701         req.timeout_ms = 1 << (CMA_CM_RESPONSE_TIMEOUT - 8);
 3702         req.max_cm_retries = CMA_MAX_CM_RETRIES;
 3703 
 3704         ret = ib_send_cm_sidr_req(id_priv->cm_id.ib, &req);
 3705         if (ret) {
 3706                 ib_destroy_cm_id(id_priv->cm_id.ib);
 3707                 id_priv->cm_id.ib = NULL;
 3708         }
 3709 out:
 3710         kfree(private_data);
 3711         return ret;
 3712 }
 3713 
 3714 static int cma_connect_ib(struct rdma_id_private *id_priv,
 3715                           struct rdma_conn_param *conn_param)
 3716 {
 3717         struct ib_cm_req_param req;
 3718         struct rdma_route *route;
 3719         void *private_data;
 3720         struct ib_cm_id *id;
 3721         int offset, ret;
 3722 
 3723         memset(&req, 0, sizeof req);
 3724         offset = cma_user_data_offset(id_priv);
 3725         req.private_data_len = offset + conn_param->private_data_len;
 3726         if (req.private_data_len < conn_param->private_data_len)
 3727                 return -EINVAL;
 3728 
 3729         if (req.private_data_len) {
 3730                 private_data = kzalloc(req.private_data_len, GFP_ATOMIC);
 3731                 if (!private_data)
 3732                         return -ENOMEM;
 3733         } else {
 3734                 private_data = NULL;
 3735         }
 3736 
 3737         if (conn_param->private_data && conn_param->private_data_len)
 3738                 memcpy((char *)private_data + offset, conn_param->private_data,
 3739                        conn_param->private_data_len);
 3740 
 3741         id = ib_create_cm_id(id_priv->id.device, cma_ib_handler, id_priv);
 3742         if (IS_ERR(id)) {
 3743                 ret = PTR_ERR(id);
 3744                 goto out;
 3745         }
 3746         id_priv->cm_id.ib = id;
 3747 
 3748         route = &id_priv->id.route;
 3749         if (private_data) {
 3750                 ret = cma_format_hdr(private_data, id_priv);
 3751                 if (ret)
 3752                         goto out;
 3753                 req.private_data = private_data;
 3754         }
 3755 
 3756         req.primary_path = &route->path_rec[0];
 3757         if (route->num_paths == 2)
 3758                 req.alternate_path = &route->path_rec[1];
 3759 
 3760         req.service_id = rdma_get_service_id(&id_priv->id, cma_dst_addr(id_priv));
 3761         req.qp_num = id_priv->qp_num;
 3762         req.qp_type = id_priv->id.qp_type;
 3763         req.starting_psn = id_priv->seq_num;
 3764         req.responder_resources = conn_param->responder_resources;
 3765         req.initiator_depth = conn_param->initiator_depth;
 3766         req.flow_control = conn_param->flow_control;
 3767         req.retry_count = min_t(u8, 7, conn_param->retry_count);
 3768         req.rnr_retry_count = min_t(u8, 7, conn_param->rnr_retry_count);
 3769         req.remote_cm_response_timeout = CMA_CM_RESPONSE_TIMEOUT;
 3770         req.local_cm_response_timeout = CMA_CM_RESPONSE_TIMEOUT;
 3771         req.max_cm_retries = CMA_MAX_CM_RETRIES;
 3772         req.srq = id_priv->srq ? 1 : 0;
 3773 
 3774         ret = ib_send_cm_req(id_priv->cm_id.ib, &req);
 3775 out:
 3776         if (ret && !IS_ERR(id)) {
 3777                 ib_destroy_cm_id(id);
 3778                 id_priv->cm_id.ib = NULL;
 3779         }
 3780 
 3781         kfree(private_data);
 3782         return ret;
 3783 }
 3784 
 3785 static int cma_connect_iw(struct rdma_id_private *id_priv,
 3786                           struct rdma_conn_param *conn_param)
 3787 {
 3788         struct iw_cm_id *cm_id;
 3789         int ret;
 3790         struct iw_cm_conn_param iw_param;
 3791 
 3792         cm_id = iw_create_cm_id(id_priv->id.device, cma_iw_handler, id_priv);
 3793         if (IS_ERR(cm_id))
 3794                 return PTR_ERR(cm_id);
 3795 
 3796         cm_id->tos = id_priv->tos;
 3797         id_priv->cm_id.iw = cm_id;
 3798 
 3799         memcpy(&cm_id->local_addr, cma_src_addr(id_priv),
 3800                rdma_addr_size(cma_src_addr(id_priv)));
 3801         memcpy(&cm_id->remote_addr, cma_dst_addr(id_priv),
 3802                rdma_addr_size(cma_dst_addr(id_priv)));
 3803 
 3804         ret = cma_modify_qp_rtr(id_priv, conn_param);
 3805         if (ret)
 3806                 goto out;
 3807 
 3808         if (conn_param) {
 3809                 iw_param.ord = conn_param->initiator_depth;
 3810                 iw_param.ird = conn_param->responder_resources;
 3811                 iw_param.private_data = conn_param->private_data;
 3812                 iw_param.private_data_len = conn_param->private_data_len;
 3813                 iw_param.qpn = id_priv->id.qp ? id_priv->qp_num : conn_param->qp_num;
 3814         } else {
 3815                 memset(&iw_param, 0, sizeof iw_param);
 3816                 iw_param.qpn = id_priv->qp_num;
 3817         }
 3818         ret = iw_cm_connect(cm_id, &iw_param);
 3819 out:
 3820         if (ret) {
 3821                 iw_destroy_cm_id(cm_id);
 3822                 id_priv->cm_id.iw = NULL;
 3823         }
 3824         return ret;
 3825 }
 3826 
 3827 int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
 3828 {
 3829         struct rdma_id_private *id_priv;
 3830         int ret;
 3831 
 3832         id_priv = container_of(id, struct rdma_id_private, id);
 3833         if (!cma_comp_exch(id_priv, RDMA_CM_ROUTE_RESOLVED, RDMA_CM_CONNECT))
 3834                 return -EINVAL;
 3835 
 3836         if (!id->qp) {
 3837                 id_priv->qp_num = conn_param->qp_num;
 3838                 id_priv->srq = conn_param->srq;
 3839         }
 3840 
 3841         if (rdma_cap_ib_cm(id->device, id->port_num)) {
 3842                 if (id->qp_type == IB_QPT_UD)
 3843                         ret = cma_resolve_ib_udp(id_priv, conn_param);
 3844                 else
 3845                         ret = cma_connect_ib(id_priv, conn_param);
 3846         } else if (rdma_cap_iw_cm(id->device, id->port_num))
 3847                 ret = cma_connect_iw(id_priv, conn_param);
 3848         else
 3849                 ret = -ENOSYS;
 3850         if (ret)
 3851                 goto err;
 3852 
 3853         return 0;
 3854 err:
 3855         cma_comp_exch(id_priv, RDMA_CM_CONNECT, RDMA_CM_ROUTE_RESOLVED);
 3856         return ret;
 3857 }
 3858 EXPORT_SYMBOL(rdma_connect);
 3859 
 3860 static int cma_accept_ib(struct rdma_id_private *id_priv,
 3861                          struct rdma_conn_param *conn_param)
 3862 {
 3863         struct ib_cm_rep_param rep;
 3864         int ret;
 3865 
 3866         ret = cma_modify_qp_rtr(id_priv, conn_param);
 3867         if (ret)
 3868                 goto out;
 3869 
 3870         ret = cma_modify_qp_rts(id_priv, conn_param);
 3871         if (ret)
 3872                 goto out;
 3873 
 3874         memset(&rep, 0, sizeof rep);
 3875         rep.qp_num = id_priv->qp_num;
 3876         rep.starting_psn = id_priv->seq_num;
 3877         rep.private_data = conn_param->private_data;
 3878         rep.private_data_len = conn_param->private_data_len;
 3879         rep.responder_resources = conn_param->responder_resources;
 3880         rep.initiator_depth = conn_param->initiator_depth;
 3881         rep.failover_accepted = 0;
 3882         rep.flow_control = conn_param->flow_control;
 3883         rep.rnr_retry_count = min_t(u8, 7, conn_param->rnr_retry_count);
 3884         rep.srq = id_priv->srq ? 1 : 0;
 3885 
 3886         ret = ib_send_cm_rep(id_priv->cm_id.ib, &rep);
 3887 out:
 3888         return ret;
 3889 }
 3890 
 3891 static int cma_accept_iw(struct rdma_id_private *id_priv,
 3892                   struct rdma_conn_param *conn_param)
 3893 {
 3894         struct iw_cm_conn_param iw_param;
 3895         int ret;
 3896 
 3897         ret = cma_modify_qp_rtr(id_priv, conn_param);
 3898         if (ret)
 3899                 return ret;
 3900 
 3901         iw_param.ord = conn_param->initiator_depth;
 3902         iw_param.ird = conn_param->responder_resources;
 3903         iw_param.private_data = conn_param->private_data;
 3904         iw_param.private_data_len = conn_param->private_data_len;
 3905         if (id_priv->id.qp) {
 3906                 iw_param.qpn = id_priv->qp_num;
 3907         } else
 3908                 iw_param.qpn = conn_param->qp_num;
 3909 
 3910         return iw_cm_accept(id_priv->cm_id.iw, &iw_param);
 3911 }
 3912 
 3913 static int cma_send_sidr_rep(struct rdma_id_private *id_priv,
 3914                              enum ib_cm_sidr_status status, u32 qkey,
 3915                              const void *private_data, int private_data_len)
 3916 {
 3917         struct ib_cm_sidr_rep_param rep;
 3918         int ret;
 3919 
 3920         memset(&rep, 0, sizeof rep);
 3921         rep.status = status;
 3922         if (status == IB_SIDR_SUCCESS) {
 3923                 ret = cma_set_qkey(id_priv, qkey);
 3924                 if (ret)
 3925                         return ret;
 3926                 rep.qp_num = id_priv->qp_num;
 3927                 rep.qkey = id_priv->qkey;
 3928         }
 3929         rep.private_data = private_data;
 3930         rep.private_data_len = private_data_len;
 3931 
 3932         return ib_send_cm_sidr_rep(id_priv->cm_id.ib, &rep);
 3933 }
 3934 
 3935 int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
 3936 {
 3937         struct rdma_id_private *id_priv;
 3938         int ret;
 3939 
 3940         id_priv = container_of(id, struct rdma_id_private, id);
 3941 
 3942         id_priv->owner = task_pid_nr(current);
 3943 
 3944         if (!cma_comp(id_priv, RDMA_CM_CONNECT))
 3945                 return -EINVAL;
 3946 
 3947         if (!id->qp && conn_param) {
 3948                 id_priv->qp_num = conn_param->qp_num;
 3949                 id_priv->srq = conn_param->srq;
 3950         }
 3951 
 3952         if (rdma_cap_ib_cm(id->device, id->port_num)) {
 3953                 if (id->qp_type == IB_QPT_UD) {
 3954                         if (conn_param)
 3955                                 ret = cma_send_sidr_rep(id_priv, IB_SIDR_SUCCESS,
 3956                                                         conn_param->qkey,
 3957                                                         conn_param->private_data,
 3958                                                         conn_param->private_data_len);
 3959                         else
 3960                                 ret = cma_send_sidr_rep(id_priv, IB_SIDR_SUCCESS,
 3961                                                         0, NULL, 0);
 3962                 } else {
 3963                         if (conn_param)
 3964                                 ret = cma_accept_ib(id_priv, conn_param);
 3965                         else
 3966                                 ret = cma_rep_recv(id_priv);
 3967                 }
 3968         } else if (rdma_cap_iw_cm(id->device, id->port_num))
 3969                 ret = cma_accept_iw(id_priv, conn_param);
 3970         else
 3971                 ret = -ENOSYS;
 3972 
 3973         if (ret)
 3974                 goto reject;
 3975 
 3976         return 0;
 3977 reject:
 3978         cma_modify_qp_err(id_priv);
 3979         rdma_reject(id, NULL, 0);
 3980         return ret;
 3981 }
 3982 EXPORT_SYMBOL(rdma_accept);
 3983 
 3984 int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event)
 3985 {
 3986         struct rdma_id_private *id_priv;
 3987         int ret;
 3988 
 3989         id_priv = container_of(id, struct rdma_id_private, id);
 3990         if (!id_priv->cm_id.ib)
 3991                 return -EINVAL;
 3992 
 3993         switch (id->device->node_type) {
 3994         case RDMA_NODE_IB_CA:
 3995                 ret = ib_cm_notify(id_priv->cm_id.ib, event);
 3996                 break;
 3997         default:
 3998                 ret = 0;
 3999                 break;
 4000         }
 4001         return ret;
 4002 }
 4003 EXPORT_SYMBOL(rdma_notify);
 4004 
 4005 int rdma_reject(struct rdma_cm_id *id, const void *private_data,
 4006                 u8 private_data_len)
 4007 {
 4008         struct rdma_id_private *id_priv;
 4009         int ret;
 4010 
 4011         id_priv = container_of(id, struct rdma_id_private, id);
 4012         if (!id_priv->cm_id.ib)
 4013                 return -EINVAL;
 4014 
 4015         if (rdma_cap_ib_cm(id->device, id->port_num)) {
 4016                 if (id->qp_type == IB_QPT_UD)
 4017                         ret = cma_send_sidr_rep(id_priv, IB_SIDR_REJECT, 0,
 4018                                                 private_data, private_data_len);
 4019                 else
 4020                         ret = ib_send_cm_rej(id_priv->cm_id.ib,
 4021                                              IB_CM_REJ_CONSUMER_DEFINED, NULL,
 4022                                              0, private_data, private_data_len);
 4023         } else if (rdma_cap_iw_cm(id->device, id->port_num)) {
 4024                 ret = iw_cm_reject(id_priv->cm_id.iw,
 4025                                    private_data, private_data_len);
 4026         } else
 4027                 ret = -ENOSYS;
 4028 
 4029         return ret;
 4030 }
 4031 EXPORT_SYMBOL(rdma_reject);
 4032 
 4033 int rdma_disconnect(struct rdma_cm_id *id)
 4034 {
 4035         struct rdma_id_private *id_priv;
 4036         int ret;
 4037 
 4038         id_priv = container_of(id, struct rdma_id_private, id);
 4039         if (!id_priv->cm_id.ib)
 4040                 return -EINVAL;
 4041 
 4042         if (rdma_cap_ib_cm(id->device, id->port_num)) {
 4043                 ret = cma_modify_qp_err(id_priv);
 4044                 if (ret)
 4045                         goto out;
 4046                 /* Initiate or respond to a disconnect. */
 4047                 if (ib_send_cm_dreq(id_priv->cm_id.ib, NULL, 0))
 4048                         ib_send_cm_drep(id_priv->cm_id.ib, NULL, 0);
 4049         } else if (rdma_cap_iw_cm(id->device, id->port_num)) {
 4050                 ret = iw_cm_disconnect(id_priv->cm_id.iw, 0);
 4051         } else
 4052                 ret = -EINVAL;
 4053 
 4054 out:
 4055         return ret;
 4056 }
 4057 EXPORT_SYMBOL(rdma_disconnect);
 4058 
 4059 static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast)
 4060 {
 4061         struct rdma_id_private *id_priv;
 4062         struct cma_multicast *mc = multicast->context;
 4063         struct rdma_cm_event event;
 4064         int ret = 0;
 4065 
 4066         id_priv = mc->id_priv;
 4067         mutex_lock(&id_priv->handler_mutex);
 4068         if (id_priv->state != RDMA_CM_ADDR_BOUND &&
 4069             id_priv->state != RDMA_CM_ADDR_RESOLVED)
 4070                 goto out;
 4071 
 4072         if (!status)
 4073                 status = cma_set_qkey(id_priv, be32_to_cpu(multicast->rec.qkey));
 4074         mutex_lock(&id_priv->qp_mutex);
 4075         if (!status && id_priv->id.qp)
 4076                 status = ib_attach_mcast(id_priv->id.qp, &multicast->rec.mgid,
 4077                                          be16_to_cpu(multicast->rec.mlid));
 4078         mutex_unlock(&id_priv->qp_mutex);
 4079 
 4080         memset(&event, 0, sizeof event);
 4081         event.status = status;
 4082         event.param.ud.private_data = mc->context;
 4083         if (!status) {
 4084                 struct rdma_dev_addr *dev_addr =
 4085                         &id_priv->id.route.addr.dev_addr;
 4086                 struct ifnet *ndev =
 4087                         dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if);
 4088                 enum ib_gid_type gid_type =
 4089                         id_priv->cma_dev->default_gid_type[id_priv->id.port_num -
 4090                         rdma_start_port(id_priv->cma_dev->device)];
 4091 
 4092                 event.event = RDMA_CM_EVENT_MULTICAST_JOIN;
 4093                 ret = ib_init_ah_from_mcmember(id_priv->id.device,
 4094                                                id_priv->id.port_num,
 4095                                                &multicast->rec,
 4096                                                ndev, gid_type,
 4097                                                &event.param.ud.ah_attr);
 4098                 if (ret)
 4099                         event.event = RDMA_CM_EVENT_MULTICAST_ERROR;
 4100 
 4101                 event.param.ud.qp_num = 0xFFFFFF;
 4102                 event.param.ud.qkey = be32_to_cpu(multicast->rec.qkey);
 4103                 if (ndev)
 4104                         dev_put(ndev);
 4105         } else
 4106                 event.event = RDMA_CM_EVENT_MULTICAST_ERROR;
 4107 
 4108         ret = id_priv->id.event_handler(&id_priv->id, &event);
 4109         if (ret) {
 4110                 cma_exch(id_priv, RDMA_CM_DESTROYING);
 4111                 mutex_unlock(&id_priv->handler_mutex);
 4112                 rdma_destroy_id(&id_priv->id);
 4113                 return 0;
 4114         }
 4115 
 4116 out:
 4117         mutex_unlock(&id_priv->handler_mutex);
 4118         return 0;
 4119 }
 4120 
 4121 static void cma_set_mgid(struct rdma_id_private *id_priv,
 4122                          struct sockaddr *addr, union ib_gid *mgid)
 4123 {
 4124         unsigned char mc_map[MAX_ADDR_LEN];
 4125         struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
 4126         struct sockaddr_in *sin = (struct sockaddr_in *) addr;
 4127         struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) addr;
 4128 
 4129         if (cma_any_addr(dev_addr->net, addr)) {
 4130                 memset(mgid, 0, sizeof *mgid);
 4131         } else if ((addr->sa_family == AF_INET6) &&
 4132                    ((be32_to_cpu(sin6->sin6_addr.s6_addr32[0]) & 0xFFF0FFFF) ==
 4133                                                                  0xFF10A01B)) {
 4134                 /* IPv6 address is an SA assigned MGID. */
 4135                 memcpy(mgid, &sin6->sin6_addr, sizeof *mgid);
 4136         } else if (addr->sa_family == AF_IB) {
 4137                 memcpy(mgid, &((struct sockaddr_ib *) addr)->sib_addr, sizeof *mgid);
 4138         } else if (addr->sa_family == AF_INET6) {
 4139                 ipv6_ib_mc_map(&sin6->sin6_addr, dev_addr->broadcast, mc_map);
 4140                 if (id_priv->id.ps == RDMA_PS_UDP)
 4141                         mc_map[7] = 0x01;       /* Use RDMA CM signature */
 4142                 *mgid = *(union ib_gid *) (mc_map + 4);
 4143         } else {
 4144                 ip_ib_mc_map(sin->sin_addr.s_addr, dev_addr->broadcast, mc_map);
 4145                 if (id_priv->id.ps == RDMA_PS_UDP)
 4146                         mc_map[7] = 0x01;       /* Use RDMA CM signature */
 4147                 *mgid = *(union ib_gid *) (mc_map + 4);
 4148         }
 4149 }
 4150 
 4151 static void cma_query_sa_classport_info_cb(int status,
 4152                                            struct ib_class_port_info *rec,
 4153                                            void *context)
 4154 {
 4155         struct class_port_info_context *cb_ctx = context;
 4156 
 4157         WARN_ON(!context);
 4158 
 4159         if (status || !rec) {
 4160                 pr_debug("RDMA CM: %s port %u failed query ClassPortInfo status: %d\n",
 4161                          cb_ctx->device->name, cb_ctx->port_num, status);
 4162                 goto out;
 4163         }
 4164 
 4165         memcpy(cb_ctx->class_port_info, rec, sizeof(struct ib_class_port_info));
 4166 
 4167 out:
 4168         complete(&cb_ctx->done);
 4169 }
 4170 
 4171 static int cma_query_sa_classport_info(struct ib_device *device, u8 port_num,
 4172                                        struct ib_class_port_info *class_port_info)
 4173 {
 4174         struct class_port_info_context *cb_ctx;
 4175         int ret;
 4176 
 4177         cb_ctx = kmalloc(sizeof(*cb_ctx), GFP_KERNEL);
 4178         if (!cb_ctx)
 4179                 return -ENOMEM;
 4180 
 4181         cb_ctx->device = device;
 4182         cb_ctx->class_port_info = class_port_info;
 4183         cb_ctx->port_num = port_num;
 4184         init_completion(&cb_ctx->done);
 4185 
 4186         ret = ib_sa_classport_info_rec_query(&sa_client, device, port_num,
 4187                                              CMA_QUERY_CLASSPORT_INFO_TIMEOUT,
 4188                                              GFP_KERNEL, cma_query_sa_classport_info_cb,
 4189                                              cb_ctx, &cb_ctx->sa_query);
 4190         if (ret < 0) {
 4191                 pr_err("RDMA CM: %s port %u failed to send ClassPortInfo query, ret: %d\n",
 4192                        device->name, port_num, ret);
 4193                 goto out;
 4194         }
 4195 
 4196         wait_for_completion(&cb_ctx->done);
 4197 
 4198 out:
 4199         kfree(cb_ctx);
 4200         return ret;
 4201 }
 4202 
 4203 static int cma_join_ib_multicast(struct rdma_id_private *id_priv,
 4204                                  struct cma_multicast *mc)
 4205 {
 4206         struct ib_sa_mcmember_rec rec;
 4207         struct ib_class_port_info class_port_info;
 4208         struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
 4209         ib_sa_comp_mask comp_mask;
 4210         int ret;
 4211 
 4212         ib_addr_get_mgid(dev_addr, &rec.mgid);
 4213         ret = ib_sa_get_mcmember_rec(id_priv->id.device, id_priv->id.port_num,
 4214                                      &rec.mgid, &rec);
 4215         if (ret)
 4216                 return ret;
 4217 
 4218         ret = cma_set_qkey(id_priv, 0);
 4219         if (ret)
 4220                 return ret;
 4221 
 4222         cma_set_mgid(id_priv, (struct sockaddr *) &mc->addr, &rec.mgid);
 4223         rec.qkey = cpu_to_be32(id_priv->qkey);
 4224         rdma_addr_get_sgid(dev_addr, &rec.port_gid);
 4225         rec.pkey = cpu_to_be16(ib_addr_get_pkey(dev_addr));
 4226         rec.join_state = mc->join_state;
 4227 
 4228         if (rec.join_state == BIT(SENDONLY_FULLMEMBER_JOIN)) {
 4229                 ret = cma_query_sa_classport_info(id_priv->id.device,
 4230                                                   id_priv->id.port_num,
 4231                                                   &class_port_info);
 4232 
 4233                 if (ret)
 4234                         return ret;
 4235 
 4236                 if (!(ib_get_cpi_capmask2(&class_port_info) &
 4237                       IB_SA_CAP_MASK2_SENDONLY_FULL_MEM_SUPPORT)) {
 4238                         pr_warn("RDMA CM: %s port %u Unable to multicast join\n"
 4239                                 "RDMA CM: SM doesn't support Send Only Full Member option\n",
 4240                                 id_priv->id.device->name, id_priv->id.port_num);
 4241                         return -EOPNOTSUPP;
 4242                 }
 4243         }
 4244 
 4245         comp_mask = IB_SA_MCMEMBER_REC_MGID | IB_SA_MCMEMBER_REC_PORT_GID |
 4246                     IB_SA_MCMEMBER_REC_PKEY | IB_SA_MCMEMBER_REC_JOIN_STATE |
 4247                     IB_SA_MCMEMBER_REC_QKEY | IB_SA_MCMEMBER_REC_SL |
 4248                     IB_SA_MCMEMBER_REC_FLOW_LABEL |
 4249                     IB_SA_MCMEMBER_REC_TRAFFIC_CLASS;
 4250 
 4251         if (id_priv->id.ps == RDMA_PS_IPOIB)
 4252                 comp_mask |= IB_SA_MCMEMBER_REC_RATE |
 4253                              IB_SA_MCMEMBER_REC_RATE_SELECTOR |
 4254                              IB_SA_MCMEMBER_REC_MTU_SELECTOR |
 4255                              IB_SA_MCMEMBER_REC_MTU |
 4256                              IB_SA_MCMEMBER_REC_HOP_LIMIT;
 4257 
 4258         mc->multicast.ib = ib_sa_join_multicast(&sa_client, id_priv->id.device,
 4259                                                 id_priv->id.port_num, &rec,
 4260                                                 comp_mask, GFP_KERNEL,
 4261                                                 cma_ib_mc_handler, mc);
 4262         return PTR_ERR_OR_ZERO(mc->multicast.ib);
 4263 }
 4264 
 4265 static void iboe_mcast_work_handler(struct work_struct *work)
 4266 {
 4267         struct iboe_mcast_work *mw = container_of(work, struct iboe_mcast_work, work);
 4268         struct cma_multicast *mc = mw->mc;
 4269         struct ib_sa_multicast *m = mc->multicast.ib;
 4270 
 4271         mc->multicast.ib->context = mc;
 4272         cma_ib_mc_handler(0, m);
 4273         kref_put(&mc->mcref, release_mc);
 4274         kfree(mw);
 4275 }
 4276 
 4277 static void cma_iboe_set_mgid(struct vnet *vnet, struct sockaddr *addr,
 4278                               union ib_gid *mgid, enum ib_gid_type gid_type)
 4279 {
 4280         struct sockaddr_in *sin = (struct sockaddr_in *)addr;
 4281         struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
 4282 
 4283         if (cma_any_addr(vnet, addr)) {
 4284                 memset(mgid, 0, sizeof *mgid);
 4285         } else if (addr->sa_family == AF_INET6) {
 4286                 memcpy(mgid, &sin6->sin6_addr, sizeof *mgid);
 4287         } else {
 4288                 mgid->raw[0] =
 4289                         (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) ? 0 : 0xff;
 4290                 mgid->raw[1] =
 4291                         (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) ? 0 : 0x0e;
 4292                 mgid->raw[2] = 0;
 4293                 mgid->raw[3] = 0;
 4294                 mgid->raw[4] = 0;
 4295                 mgid->raw[5] = 0;
 4296                 mgid->raw[6] = 0;
 4297                 mgid->raw[7] = 0;
 4298                 mgid->raw[8] = 0;
 4299                 mgid->raw[9] = 0;
 4300                 mgid->raw[10] = 0xff;
 4301                 mgid->raw[11] = 0xff;
 4302                 *(__be32 *)(&mgid->raw[12]) = sin->sin_addr.s_addr;
 4303         }
 4304 }
 4305 
 4306 static int cma_iboe_join_multicast(struct rdma_id_private *id_priv,
 4307                                    struct cma_multicast *mc)
 4308 {
 4309         struct iboe_mcast_work *work;
 4310         struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
 4311         int err = 0;
 4312         struct sockaddr *addr = (struct sockaddr *)&mc->addr;
 4313         struct ifnet *ndev = NULL;
 4314         enum ib_gid_type gid_type;
 4315         bool send_only;
 4316 
 4317         send_only = mc->join_state == BIT(SENDONLY_FULLMEMBER_JOIN);
 4318 
 4319         if (cma_zero_addr((struct sockaddr *)&mc->addr))
 4320                 return -EINVAL;
 4321 
 4322         work = kzalloc(sizeof *work, GFP_KERNEL);
 4323         if (!work)
 4324                 return -ENOMEM;
 4325 
 4326         mc->multicast.ib = kzalloc(sizeof(struct ib_sa_multicast), GFP_KERNEL);
 4327         if (!mc->multicast.ib) {
 4328                 err = -ENOMEM;
 4329                 goto out1;
 4330         }
 4331 
 4332         gid_type = id_priv->cma_dev->default_gid_type[id_priv->id.port_num -
 4333                    rdma_start_port(id_priv->cma_dev->device)];
 4334         cma_iboe_set_mgid(dev_addr->net, addr, &mc->multicast.ib->rec.mgid, gid_type);
 4335 
 4336         mc->multicast.ib->rec.pkey = cpu_to_be16(0xffff);
 4337         if (id_priv->id.ps == RDMA_PS_UDP)
 4338                 mc->multicast.ib->rec.qkey = cpu_to_be32(RDMA_UDP_QKEY);
 4339 
 4340         if (dev_addr->bound_dev_if)
 4341                 ndev = dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if);
 4342         if (!ndev) {
 4343                 err = -ENODEV;
 4344                 goto out2;
 4345         }
 4346         mc->multicast.ib->rec.rate = iboe_get_rate(ndev);
 4347         mc->multicast.ib->rec.hop_limit = 1;
 4348         mc->multicast.ib->rec.mtu = iboe_get_mtu(ndev->if_mtu);
 4349 
 4350         if (addr->sa_family == AF_INET || addr->sa_family == AF_INET6) {
 4351                 if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) {
 4352                         mc->multicast.ib->rec.hop_limit = IPV6_DEFAULT_HOPLIMIT;
 4353                         if (!send_only) {
 4354                                 err = cma_igmp_send(ndev, &mc->multicast.ib->rec.mgid,
 4355                                                     true);
 4356                                 if (!err)
 4357                                         mc->igmp_joined = true;
 4358                         }
 4359                 }
 4360         } else {
 4361                 if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
 4362                         err = -ENOTSUPP;
 4363         }
 4364         dev_put(ndev);
 4365         if (err || !mc->multicast.ib->rec.mtu) {
 4366                 if (!err)
 4367                         err = -EINVAL;
 4368                 goto out2;
 4369         }
 4370         rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr,
 4371                     &mc->multicast.ib->rec.port_gid);
 4372         work->id = id_priv;
 4373         work->mc = mc;
 4374         INIT_WORK(&work->work, iboe_mcast_work_handler);
 4375         kref_get(&mc->mcref);
 4376         queue_work(cma_wq, &work->work);
 4377 
 4378         return 0;
 4379 
 4380 out2:
 4381         kfree(mc->multicast.ib);
 4382 out1:
 4383         kfree(work);
 4384         return err;
 4385 }
 4386 
 4387 int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr,
 4388                         u8 join_state, void *context)
 4389 {
 4390         struct rdma_id_private *id_priv;
 4391         struct cma_multicast *mc;
 4392         int ret;
 4393 
 4394         if (!id->device)
 4395                 return -EINVAL;
 4396 
 4397         id_priv = container_of(id, struct rdma_id_private, id);
 4398         if (!cma_comp(id_priv, RDMA_CM_ADDR_BOUND) &&
 4399             !cma_comp(id_priv, RDMA_CM_ADDR_RESOLVED))
 4400                 return -EINVAL;
 4401 
 4402         mc = kmalloc(sizeof *mc, GFP_KERNEL);
 4403         if (!mc)
 4404                 return -ENOMEM;
 4405 
 4406         memcpy(&mc->addr, addr, rdma_addr_size(addr));
 4407         mc->context = context;
 4408         mc->id_priv = id_priv;
 4409         mc->igmp_joined = false;
 4410         mc->join_state = join_state;
 4411         spin_lock(&id_priv->lock);
 4412         list_add(&mc->list, &id_priv->mc_list);
 4413         spin_unlock(&id_priv->lock);
 4414 
 4415         if (rdma_protocol_roce(id->device, id->port_num)) {
 4416                 kref_init(&mc->mcref);
 4417                 ret = cma_iboe_join_multicast(id_priv, mc);
 4418         } else if (rdma_cap_ib_mcast(id->device, id->port_num))
 4419                 ret = cma_join_ib_multicast(id_priv, mc);
 4420         else
 4421                 ret = -ENOSYS;
 4422 
 4423         if (ret) {
 4424                 spin_lock_irq(&id_priv->lock);
 4425                 list_del(&mc->list);
 4426                 spin_unlock_irq(&id_priv->lock);
 4427                 kfree(mc);
 4428         }
 4429         return ret;
 4430 }
 4431 EXPORT_SYMBOL(rdma_join_multicast);
 4432 
 4433 void rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr)
 4434 {
 4435         struct rdma_id_private *id_priv;
 4436         struct cma_multicast *mc;
 4437 
 4438         id_priv = container_of(id, struct rdma_id_private, id);
 4439         spin_lock_irq(&id_priv->lock);
 4440         list_for_each_entry(mc, &id_priv->mc_list, list) {
 4441                 if (!memcmp(&mc->addr, addr, rdma_addr_size(addr))) {
 4442                         list_del(&mc->list);
 4443                         spin_unlock_irq(&id_priv->lock);
 4444 
 4445                         if (id->qp)
 4446                                 ib_detach_mcast(id->qp,
 4447                                                 &mc->multicast.ib->rec.mgid,
 4448                                                 be16_to_cpu(mc->multicast.ib->rec.mlid));
 4449 
 4450                         BUG_ON(id_priv->cma_dev->device != id->device);
 4451 
 4452                         if (rdma_cap_ib_mcast(id->device, id->port_num)) {
 4453                                 ib_sa_free_multicast(mc->multicast.ib);
 4454                                 kfree(mc);
 4455                         } else if (rdma_protocol_roce(id->device, id->port_num)) {
 4456                                 if (mc->igmp_joined) {
 4457                                         struct rdma_dev_addr *dev_addr =
 4458                                                 &id->route.addr.dev_addr;
 4459                                         struct ifnet *ndev = NULL;
 4460 
 4461                                         if (dev_addr->bound_dev_if)
 4462                                                 ndev = dev_get_by_index(dev_addr->net,
 4463                                                                         dev_addr->bound_dev_if);
 4464                                         if (ndev) {
 4465                                                 cma_igmp_send(ndev,
 4466                                                               &mc->multicast.ib->rec.mgid,
 4467                                                               false);
 4468                                                 dev_put(ndev);
 4469                                         }
 4470                                         mc->igmp_joined = false;
 4471                                 }
 4472                                 kref_put(&mc->mcref, release_mc);
 4473                         }
 4474                         return;
 4475                 }
 4476         }
 4477         spin_unlock_irq(&id_priv->lock);
 4478 }
 4479 EXPORT_SYMBOL(rdma_leave_multicast);
 4480 
 4481 static int
 4482 sysctl_cma_default_roce_mode(SYSCTL_HANDLER_ARGS)
 4483 {
 4484         struct cma_device *cma_dev = arg1;
 4485         const int port = arg2;
 4486         char buf[64];
 4487         int error;
 4488 
 4489         strlcpy(buf, ib_cache_gid_type_str(
 4490             cma_get_default_gid_type(cma_dev, port)), sizeof(buf));
 4491 
 4492         error = sysctl_handle_string(oidp, buf, sizeof(buf), req);
 4493         if (error != 0 || req->newptr == NULL)
 4494                 goto done;
 4495 
 4496         error = ib_cache_gid_parse_type_str(buf);
 4497         if (error < 0) {
 4498                 error = EINVAL;
 4499                 goto done;
 4500         }
 4501 
 4502         cma_set_default_gid_type(cma_dev, port, error);
 4503         error = 0;
 4504 done:
 4505         return (error);
 4506 }
 4507 
 4508 static void cma_add_one(struct ib_device *device)
 4509 {
 4510         struct cma_device *cma_dev;
 4511         struct rdma_id_private *id_priv;
 4512         unsigned int i;
 4513 
 4514         cma_dev = kmalloc(sizeof *cma_dev, GFP_KERNEL);
 4515         if (!cma_dev)
 4516                 return;
 4517 
 4518         sysctl_ctx_init(&cma_dev->sysctl_ctx);
 4519 
 4520         cma_dev->device = device;
 4521         cma_dev->default_gid_type = kcalloc(device->phys_port_cnt,
 4522                                             sizeof(*cma_dev->default_gid_type),
 4523                                             GFP_KERNEL);
 4524         if (!cma_dev->default_gid_type) {
 4525                 kfree(cma_dev);
 4526                 return;
 4527         }
 4528         for (i = rdma_start_port(device); i <= rdma_end_port(device); i++) {
 4529                 unsigned long supported_gids;
 4530                 unsigned int default_gid_type;
 4531 
 4532                 supported_gids = roce_gid_type_mask_support(device, i);
 4533 
 4534                 if (WARN_ON(!supported_gids)) {
 4535                         /* set something valid */
 4536                         default_gid_type = 0;
 4537                 } else if (test_bit(IB_GID_TYPE_ROCE_UDP_ENCAP, &supported_gids)) {
 4538                         /* prefer RoCEv2, if supported */
 4539                         default_gid_type = IB_GID_TYPE_ROCE_UDP_ENCAP;
 4540                 } else {
 4541                         default_gid_type = find_first_bit(&supported_gids,
 4542                             BITS_PER_LONG);
 4543                 }
 4544                 cma_dev->default_gid_type[i - rdma_start_port(device)] =
 4545                     default_gid_type;
 4546         }
 4547 
 4548         init_completion(&cma_dev->comp);
 4549         atomic_set(&cma_dev->refcount, 1);
 4550         INIT_LIST_HEAD(&cma_dev->id_list);
 4551         ib_set_client_data(device, &cma_client, cma_dev);
 4552 
 4553         mutex_lock(&lock);
 4554         list_add_tail(&cma_dev->list, &dev_list);
 4555         list_for_each_entry(id_priv, &listen_any_list, list)
 4556                 cma_listen_on_dev(id_priv, cma_dev);
 4557         mutex_unlock(&lock);
 4558 
 4559         for (i = rdma_start_port(device); i <= rdma_end_port(device); i++) {
 4560                 char buf[64];
 4561 
 4562                 snprintf(buf, sizeof(buf), "default_roce_mode_port%d", i);
 4563 
 4564                 (void) SYSCTL_ADD_PROC(&cma_dev->sysctl_ctx,
 4565                     SYSCTL_CHILDREN(device->ports_parent->parent->oidp),
 4566                     OID_AUTO, buf, CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
 4567                     cma_dev, i, &sysctl_cma_default_roce_mode, "A",
 4568                     "Default RoCE mode. Valid values: IB/RoCE v1 and RoCE v2");
 4569         }
 4570 }
 4571 
 4572 static int cma_remove_id_dev(struct rdma_id_private *id_priv)
 4573 {
 4574         struct rdma_cm_event event;
 4575         enum rdma_cm_state state;
 4576         int ret = 0;
 4577 
 4578         /* Record that we want to remove the device */
 4579         state = cma_exch(id_priv, RDMA_CM_DEVICE_REMOVAL);
 4580         if (state == RDMA_CM_DESTROYING)
 4581                 return 0;
 4582 
 4583         cma_cancel_operation(id_priv, state);
 4584         mutex_lock(&id_priv->handler_mutex);
 4585 
 4586         /* Check for destruction from another callback. */
 4587         if (!cma_comp(id_priv, RDMA_CM_DEVICE_REMOVAL))
 4588                 goto out;
 4589 
 4590         memset(&event, 0, sizeof event);
 4591         event.event = RDMA_CM_EVENT_DEVICE_REMOVAL;
 4592         ret = id_priv->id.event_handler(&id_priv->id, &event);
 4593 out:
 4594         mutex_unlock(&id_priv->handler_mutex);
 4595         return ret;
 4596 }
 4597 
 4598 static void cma_process_remove(struct cma_device *cma_dev)
 4599 {
 4600         struct rdma_id_private *id_priv;
 4601         int ret;
 4602 
 4603         mutex_lock(&lock);
 4604         while (!list_empty(&cma_dev->id_list)) {
 4605                 id_priv = list_entry(cma_dev->id_list.next,
 4606                                      struct rdma_id_private, list);
 4607 
 4608                 list_del(&id_priv->listen_list);
 4609                 list_del_init(&id_priv->list);
 4610                 atomic_inc(&id_priv->refcount);
 4611                 mutex_unlock(&lock);
 4612 
 4613                 ret = id_priv->internal_id ? 1 : cma_remove_id_dev(id_priv);
 4614                 cma_deref_id(id_priv);
 4615                 if (ret)
 4616                         rdma_destroy_id(&id_priv->id);
 4617 
 4618                 mutex_lock(&lock);
 4619         }
 4620         mutex_unlock(&lock);
 4621 
 4622         cma_deref_dev(cma_dev);
 4623         wait_for_completion(&cma_dev->comp);
 4624 }
 4625 
 4626 static void cma_remove_one(struct ib_device *device, void *client_data)
 4627 {
 4628         struct cma_device *cma_dev = client_data;
 4629 
 4630         if (!cma_dev)
 4631                 return;
 4632 
 4633         mutex_lock(&lock);
 4634         list_del(&cma_dev->list);
 4635         mutex_unlock(&lock);
 4636 
 4637         cma_process_remove(cma_dev);
 4638         sysctl_ctx_free(&cma_dev->sysctl_ctx);
 4639         kfree(cma_dev->default_gid_type);
 4640         kfree(cma_dev);
 4641 }
 4642 
 4643 static void cma_init_vnet(void *arg)
 4644 {
 4645         struct cma_pernet *pernet = &VNET(cma_pernet);
 4646 
 4647         idr_init(&pernet->tcp_ps);
 4648         idr_init(&pernet->udp_ps);
 4649         idr_init(&pernet->ipoib_ps);
 4650         idr_init(&pernet->ib_ps);
 4651         idr_init(&pernet->sdp_ps);
 4652 }
 4653 VNET_SYSINIT(cma_init_vnet, SI_SUB_OFED_MODINIT - 1, SI_ORDER_FIRST, cma_init_vnet, NULL);
 4654 
 4655 static void cma_destroy_vnet(void *arg)
 4656 {
 4657         struct cma_pernet *pernet = &VNET(cma_pernet);
 4658 
 4659         idr_destroy(&pernet->tcp_ps);
 4660         idr_destroy(&pernet->udp_ps);
 4661         idr_destroy(&pernet->ipoib_ps);
 4662         idr_destroy(&pernet->ib_ps);
 4663         idr_destroy(&pernet->sdp_ps);
 4664 }
 4665 VNET_SYSUNINIT(cma_destroy_vnet, SI_SUB_OFED_MODINIT - 1, SI_ORDER_SECOND, cma_destroy_vnet, NULL);
 4666 
 4667 static int __init cma_init(void)
 4668 {
 4669         int ret;
 4670 
 4671         cma_wq = alloc_ordered_workqueue("rdma_cm", WQ_MEM_RECLAIM);
 4672         if (!cma_wq)
 4673                 return -ENOMEM;
 4674 
 4675         ib_sa_register_client(&sa_client);
 4676         rdma_addr_register_client(&addr_client);
 4677 
 4678         ret = ib_register_client(&cma_client);
 4679         if (ret)
 4680                 goto err;
 4681 
 4682         cma_configfs_init();
 4683 
 4684         return 0;
 4685 
 4686 err:
 4687         rdma_addr_unregister_client(&addr_client);
 4688         ib_sa_unregister_client(&sa_client);
 4689         destroy_workqueue(cma_wq);
 4690         return ret;
 4691 }
 4692 
 4693 static void __exit cma_cleanup(void)
 4694 {
 4695         cma_configfs_exit();
 4696         ib_unregister_client(&cma_client);
 4697         rdma_addr_unregister_client(&addr_client);
 4698         ib_sa_unregister_client(&sa_client);
 4699         destroy_workqueue(cma_wq);
 4700 }
 4701 
 4702 module_init_order(cma_init, SI_ORDER_FOURTH);
 4703 module_exit_order(cma_cleanup, SI_ORDER_FOURTH);

Cache object: 516b2703f75c9c1a3d739a5e043d008b


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.