linux/drivers/infiniband/core/cma.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2005 Voltaire Inc.  All rights reserved.
   3 * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
   4 * Copyright (c) 1999-2005, Mellanox Technologies, Inc. All rights reserved.
   5 * Copyright (c) 2005-2006 Intel Corporation.  All rights reserved.
   6 *
   7 * This software is available to you under a choice of one of two
   8 * licenses.  You may choose to be licensed under the terms of the GNU
   9 * General Public License (GPL) Version 2, available from the file
  10 * COPYING in the main directory of this source tree, or the
  11 * OpenIB.org BSD license below:
  12 *
  13 *     Redistribution and use in source and binary forms, with or
  14 *     without modification, are permitted provided that the following
  15 *     conditions are met:
  16 *
  17 *      - Redistributions of source code must retain the above
  18 *        copyright notice, this list of conditions and the following
  19 *        disclaimer.
  20 *
  21 *      - Redistributions in binary form must reproduce the above
  22 *        copyright notice, this list of conditions and the following
  23 *        disclaimer in the documentation and/or other materials
  24 *        provided with the distribution.
  25 *
  26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  30 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  31 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  32 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  33 * SOFTWARE.
  34 */
  35
  36#include <linux/completion.h>
  37#include <linux/in.h>
  38#include <linux/in6.h>
  39#include <linux/mutex.h>
  40#include <linux/random.h>
  41#include <linux/idr.h>
  42#include <linux/inetdevice.h>
  43
  44#include <net/tcp.h>
  45#include <net/ipv6.h>
  46
  47#include <rdma/rdma_cm.h>
  48#include <rdma/rdma_cm_ib.h>
  49#include <rdma/ib_cache.h>
  50#include <rdma/ib_cm.h>
  51#include <rdma/ib_sa.h>
  52#include <rdma/iw_cm.h>
  53
  54MODULE_AUTHOR("Sean Hefty");
  55MODULE_DESCRIPTION("Generic RDMA CM Agent");
  56MODULE_LICENSE("Dual BSD/GPL");
  57
  58#define CMA_CM_RESPONSE_TIMEOUT 20
  59#define CMA_MAX_CM_RETRIES 15
  60#define CMA_CM_MRA_SETTING (IB_CM_MRA_FLAG_DELAY | 24)
  61
  62static void cma_add_one(struct ib_device *device);
  63static void cma_remove_one(struct ib_device *device);
  64
  65static struct ib_client cma_client = {
  66        .name   = "cma",
  67        .add    = cma_add_one,
  68        .remove = cma_remove_one
  69};
  70
  71static struct ib_sa_client sa_client;
  72static struct rdma_addr_client addr_client;
  73static LIST_HEAD(dev_list);
  74static LIST_HEAD(listen_any_list);
  75static DEFINE_MUTEX(lock);
  76static struct workqueue_struct *cma_wq;
  77static DEFINE_IDR(sdp_ps);
  78static DEFINE_IDR(tcp_ps);
  79static DEFINE_IDR(udp_ps);
  80static DEFINE_IDR(ipoib_ps);
  81static int next_port;
  82
  83struct cma_device {
  84        struct list_head        list;
  85        struct ib_device        *device;
  86        struct completion       comp;
  87        atomic_t                refcount;
  88        struct list_head        id_list;
  89};
  90
  91enum cma_state {
  92        CMA_IDLE,
  93        CMA_ADDR_QUERY,
  94        CMA_ADDR_RESOLVED,
  95        CMA_ROUTE_QUERY,
  96        CMA_ROUTE_RESOLVED,
  97        CMA_CONNECT,
  98        CMA_DISCONNECT,
  99        CMA_ADDR_BOUND,
 100        CMA_LISTEN,
 101        CMA_DEVICE_REMOVAL,
 102        CMA_DESTROYING
 103};
 104
 105struct rdma_bind_list {
 106        struct idr              *ps;
 107        struct hlist_head       owners;
 108        unsigned short          port;
 109};
 110
 111/*
 112 * Device removal can occur at anytime, so we need extra handling to
 113 * serialize notifying the user of device removal with other callbacks.
 114 * We do this by disabling removal notification while a callback is in process,
 115 * and reporting it after the callback completes.
 116 */
 117struct rdma_id_private {
 118        struct rdma_cm_id       id;
 119
 120        struct rdma_bind_list   *bind_list;
 121        struct hlist_node       node;
 122        struct list_head        list; /* listen_any_list or cma_device.list */
 123        struct list_head        listen_list; /* per device listens */
 124        struct cma_device       *cma_dev;
 125        struct list_head        mc_list;
 126
 127        int                     internal_id;
 128        enum cma_state          state;
 129        spinlock_t              lock;
 130        struct mutex            qp_mutex;
 131
 132        struct completion       comp;
 133        atomic_t                refcount;
 134        struct mutex            handler_mutex;
 135
 136        int                     backlog;
 137        int                     timeout_ms;
 138        struct ib_sa_query      *query;
 139        int                     query_id;
 140        union {
 141                struct ib_cm_id *ib;
 142                struct iw_cm_id *iw;
 143        } cm_id;
 144
 145        u32                     seq_num;
 146        u32                     qkey;
 147        u32                     qp_num;
 148        u8                      srq;
 149        u8                      tos;
 150};
 151
 152struct cma_multicast {
 153        struct rdma_id_private *id_priv;
 154        union {
 155                struct ib_sa_multicast *ib;
 156        } multicast;
 157        struct list_head        list;
 158        void                    *context;
 159        struct sockaddr_storage addr;
 160};
 161
 162struct cma_work {
 163        struct work_struct      work;
 164        struct rdma_id_private  *id;
 165        enum cma_state          old_state;
 166        enum cma_state          new_state;
 167        struct rdma_cm_event    event;
 168};
 169
 170struct cma_ndev_work {
 171        struct work_struct      work;
 172        struct rdma_id_private  *id;
 173        struct rdma_cm_event    event;
 174};
 175
 176union cma_ip_addr {
 177        struct in6_addr ip6;
 178        struct {
 179                __be32 pad[3];
 180                __be32 addr;
 181        } ip4;
 182};
 183
 184struct cma_hdr {
 185        u8 cma_version;
 186        u8 ip_version;  /* IP version: 7:4 */
 187        __be16 port;
 188        union cma_ip_addr src_addr;
 189        union cma_ip_addr dst_addr;
 190};
 191
 192struct sdp_hh {
 193        u8 bsdh[16];
 194        u8 sdp_version; /* Major version: 7:4 */
 195        u8 ip_version;  /* IP version: 7:4 */
 196        u8 sdp_specific1[10];
 197        __be16 port;
 198        __be16 sdp_specific2;
 199        union cma_ip_addr src_addr;
 200        union cma_ip_addr dst_addr;
 201};
 202
 203struct sdp_hah {
 204        u8 bsdh[16];
 205        u8 sdp_version;
 206};
 207
 208#define CMA_VERSION 0x00
 209#define SDP_MAJ_VERSION 0x2
 210
 211static int cma_comp(struct rdma_id_private *id_priv, enum cma_state comp)
 212{
 213        unsigned long flags;
 214        int ret;
 215
 216        spin_lock_irqsave(&id_priv->lock, flags);
 217        ret = (id_priv->state == comp);
 218        spin_unlock_irqrestore(&id_priv->lock, flags);
 219        return ret;
 220}
 221
 222static int cma_comp_exch(struct rdma_id_private *id_priv,
 223                         enum cma_state comp, enum cma_state exch)
 224{
 225        unsigned long flags;
 226        int ret;
 227
 228        spin_lock_irqsave(&id_priv->lock, flags);
 229        if ((ret = (id_priv->state == comp)))
 230                id_priv->state = exch;
 231        spin_unlock_irqrestore(&id_priv->lock, flags);
 232        return ret;
 233}
 234
 235static enum cma_state cma_exch(struct rdma_id_private *id_priv,
 236                               enum cma_state exch)
 237{
 238        unsigned long flags;
 239        enum cma_state old;
 240
 241        spin_lock_irqsave(&id_priv->lock, flags);
 242        old = id_priv->state;
 243        id_priv->state = exch;
 244        spin_unlock_irqrestore(&id_priv->lock, flags);
 245        return old;
 246}
 247
 248static inline u8 cma_get_ip_ver(struct cma_hdr *hdr)
 249{
 250        return hdr->ip_version >> 4;
 251}
 252
 253static inline void cma_set_ip_ver(struct cma_hdr *hdr, u8 ip_ver)
 254{
 255        hdr->ip_version = (ip_ver << 4) | (hdr->ip_version & 0xF);
 256}
 257
 258static inline u8 sdp_get_majv(u8 sdp_version)
 259{
 260        return sdp_version >> 4;
 261}
 262
 263static inline u8 sdp_get_ip_ver(struct sdp_hh *hh)
 264{
 265        return hh->ip_version >> 4;
 266}
 267
 268static inline void sdp_set_ip_ver(struct sdp_hh *hh, u8 ip_ver)
 269{
 270        hh->ip_version = (ip_ver << 4) | (hh->ip_version & 0xF);
 271}
 272
 273static inline int cma_is_ud_ps(enum rdma_port_space ps)
 274{
 275        return (ps == RDMA_PS_UDP || ps == RDMA_PS_IPOIB);
 276}
 277
 278static void cma_attach_to_dev(struct rdma_id_private *id_priv,
 279                              struct cma_device *cma_dev)
 280{
 281        atomic_inc(&cma_dev->refcount);
 282        id_priv->cma_dev = cma_dev;
 283        id_priv->id.device = cma_dev->device;
 284        list_add_tail(&id_priv->list, &cma_dev->id_list);
 285}
 286
 287static inline void cma_deref_dev(struct cma_device *cma_dev)
 288{
 289        if (atomic_dec_and_test(&cma_dev->refcount))
 290                complete(&cma_dev->comp);
 291}
 292
 293static void cma_detach_from_dev(struct rdma_id_private *id_priv)
 294{
 295        list_del(&id_priv->list);
 296        cma_deref_dev(id_priv->cma_dev);
 297        id_priv->cma_dev = NULL;
 298}
 299
 300static int cma_set_qkey(struct rdma_id_private *id_priv)
 301{
 302        struct ib_sa_mcmember_rec rec;
 303        int ret = 0;
 304
 305        if (id_priv->qkey)
 306                return 0;
 307
 308        switch (id_priv->id.ps) {
 309        case RDMA_PS_UDP:
 310                id_priv->qkey = RDMA_UDP_QKEY;
 311                break;
 312        case RDMA_PS_IPOIB:
 313                ib_addr_get_mgid(&id_priv->id.route.addr.dev_addr, &rec.mgid);
 314                ret = ib_sa_get_mcmember_rec(id_priv->id.device,
 315                                             id_priv->id.port_num, &rec.mgid,
 316                                             &rec);
 317                if (!ret)
 318                        id_priv->qkey = be32_to_cpu(rec.qkey);
 319                break;
 320        default:
 321                break;
 322        }
 323        return ret;
 324}
 325
 326static int cma_acquire_dev(struct rdma_id_private *id_priv)
 327{
 328        struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
 329        struct cma_device *cma_dev;
 330        union ib_gid gid;
 331        int ret = -ENODEV;
 332
 333        switch (rdma_node_get_transport(dev_addr->dev_type)) {
 334        case RDMA_TRANSPORT_IB:
 335                ib_addr_get_sgid(dev_addr, &gid);
 336                break;
 337        case RDMA_TRANSPORT_IWARP:
 338                iw_addr_get_sgid(dev_addr, &gid);
 339                break;
 340        default:
 341                return -ENODEV;
 342        }
 343
 344        list_for_each_entry(cma_dev, &dev_list, list) {
 345                ret = ib_find_cached_gid(cma_dev->device, &gid,
 346                                         &id_priv->id.port_num, NULL);
 347                if (!ret) {
 348                        cma_attach_to_dev(id_priv, cma_dev);
 349                        break;
 350                }
 351        }
 352        return ret;
 353}
 354
 355static void cma_deref_id(struct rdma_id_private *id_priv)
 356{
 357        if (atomic_dec_and_test(&id_priv->refcount))
 358                complete(&id_priv->comp);
 359}
 360
 361static int cma_disable_callback(struct rdma_id_private *id_priv,
 362                              enum cma_state state)
 363{
 364        mutex_lock(&id_priv->handler_mutex);
 365        if (id_priv->state != state) {
 366                mutex_unlock(&id_priv->handler_mutex);
 367                return -EINVAL;
 368        }
 369        return 0;
 370}
 371
 372static int cma_has_cm_dev(struct rdma_id_private *id_priv)
 373{
 374        return (id_priv->id.device && id_priv->cm_id.ib);
 375}
 376
 377struct rdma_cm_id *rdma_create_id(rdma_cm_event_handler event_handler,
 378                                  void *context, enum rdma_port_space ps)
 379{
 380        struct rdma_id_private *id_priv;
 381
 382        id_priv = kzalloc(sizeof *id_priv, GFP_KERNEL);
 383        if (!id_priv)
 384                return ERR_PTR(-ENOMEM);
 385
 386        id_priv->state = CMA_IDLE;
 387        id_priv->id.context = context;
 388        id_priv->id.event_handler = event_handler;
 389        id_priv->id.ps = ps;
 390        spin_lock_init(&id_priv->lock);
 391        mutex_init(&id_priv->qp_mutex);
 392        init_completion(&id_priv->comp);
 393        atomic_set(&id_priv->refcount, 1);
 394        mutex_init(&id_priv->handler_mutex);
 395        INIT_LIST_HEAD(&id_priv->listen_list);
 396        INIT_LIST_HEAD(&id_priv->mc_list);
 397        get_random_bytes(&id_priv->seq_num, sizeof id_priv->seq_num);
 398
 399        return &id_priv->id;
 400}
 401EXPORT_SYMBOL(rdma_create_id);
 402
 403static int cma_init_ud_qp(struct rdma_id_private *id_priv, struct ib_qp *qp)
 404{
 405        struct ib_qp_attr qp_attr;
 406        int qp_attr_mask, ret;
 407
 408        qp_attr.qp_state = IB_QPS_INIT;
 409        ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
 410        if (ret)
 411                return ret;
 412
 413        ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask);
 414        if (ret)
 415                return ret;
 416
 417        qp_attr.qp_state = IB_QPS_RTR;
 418        ret = ib_modify_qp(qp, &qp_attr, IB_QP_STATE);
 419        if (ret)
 420                return ret;
 421
 422        qp_attr.qp_state = IB_QPS_RTS;
 423        qp_attr.sq_psn = 0;
 424        ret = ib_modify_qp(qp, &qp_attr, IB_QP_STATE | IB_QP_SQ_PSN);
 425
 426        return ret;
 427}
 428
 429static int cma_init_conn_qp(struct rdma_id_private *id_priv, struct ib_qp *qp)
 430{
 431        struct ib_qp_attr qp_attr;
 432        int qp_attr_mask, ret;
 433
 434        qp_attr.qp_state = IB_QPS_INIT;
 435        ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
 436        if (ret)
 437                return ret;
 438
 439        return ib_modify_qp(qp, &qp_attr, qp_attr_mask);
 440}
 441
 442int rdma_create_qp(struct rdma_cm_id *id, struct ib_pd *pd,
 443                   struct ib_qp_init_attr *qp_init_attr)
 444{
 445        struct rdma_id_private *id_priv;
 446        struct ib_qp *qp;
 447        int ret;
 448
 449        id_priv = container_of(id, struct rdma_id_private, id);
 450        if (id->device != pd->device)
 451                return -EINVAL;
 452
 453        qp = ib_create_qp(pd, qp_init_attr);
 454        if (IS_ERR(qp))
 455                return PTR_ERR(qp);
 456
 457        if (cma_is_ud_ps(id_priv->id.ps))
 458                ret = cma_init_ud_qp(id_priv, qp);
 459        else
 460                ret = cma_init_conn_qp(id_priv, qp);
 461        if (ret)
 462                goto err;
 463
 464        id->qp = qp;
 465        id_priv->qp_num = qp->qp_num;
 466        id_priv->srq = (qp->srq != NULL);
 467        return 0;
 468err:
 469        ib_destroy_qp(qp);
 470        return ret;
 471}
 472EXPORT_SYMBOL(rdma_create_qp);
 473
 474void rdma_destroy_qp(struct rdma_cm_id *id)
 475{
 476        struct rdma_id_private *id_priv;
 477
 478        id_priv = container_of(id, struct rdma_id_private, id);
 479        mutex_lock(&id_priv->qp_mutex);
 480        ib_destroy_qp(id_priv->id.qp);
 481        id_priv->id.qp = NULL;
 482        mutex_unlock(&id_priv->qp_mutex);
 483}
 484EXPORT_SYMBOL(rdma_destroy_qp);
 485
 486static int cma_modify_qp_rtr(struct rdma_id_private *id_priv,
 487                             struct rdma_conn_param *conn_param)
 488{
 489        struct ib_qp_attr qp_attr;
 490        int qp_attr_mask, ret;
 491
 492        mutex_lock(&id_priv->qp_mutex);
 493        if (!id_priv->id.qp) {
 494                ret = 0;
 495                goto out;
 496        }
 497
 498        /* Need to update QP attributes from default values. */
 499        qp_attr.qp_state = IB_QPS_INIT;
 500        ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
 501        if (ret)
 502                goto out;
 503
 504        ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
 505        if (ret)
 506                goto out;
 507
 508        qp_attr.qp_state = IB_QPS_RTR;
 509        ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
 510        if (ret)
 511                goto out;
 512
 513        if (conn_param)
 514                qp_attr.max_dest_rd_atomic = conn_param->responder_resources;
 515        ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
 516out:
 517        mutex_unlock(&id_priv->qp_mutex);
 518        return ret;
 519}
 520
 521static int cma_modify_qp_rts(struct rdma_id_private *id_priv,
 522                             struct rdma_conn_param *conn_param)
 523{
 524        struct ib_qp_attr qp_attr;
 525        int qp_attr_mask, ret;
 526
 527        mutex_lock(&id_priv->qp_mutex);
 528        if (!id_priv->id.qp) {
 529                ret = 0;
 530                goto out;
 531        }
 532
 533        qp_attr.qp_state = IB_QPS_RTS;
 534        ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask);
 535        if (ret)
 536                goto out;
 537
 538        if (conn_param)
 539                qp_attr.max_rd_atomic = conn_param->initiator_depth;
 540        ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
 541out:
 542        mutex_unlock(&id_priv->qp_mutex);
 543        return ret;
 544}
 545
 546static int cma_modify_qp_err(struct rdma_id_private *id_priv)
 547{
 548        struct ib_qp_attr qp_attr;
 549        int ret;
 550
 551        mutex_lock(&id_priv->qp_mutex);
 552        if (!id_priv->id.qp) {
 553                ret = 0;
 554                goto out;
 555        }
 556
 557        qp_attr.qp_state = IB_QPS_ERR;
 558        ret = ib_modify_qp(id_priv->id.qp, &qp_attr, IB_QP_STATE);
 559out:
 560        mutex_unlock(&id_priv->qp_mutex);
 561        return ret;
 562}
 563
 564static int cma_ib_init_qp_attr(struct rdma_id_private *id_priv,
 565                               struct ib_qp_attr *qp_attr, int *qp_attr_mask)
 566{
 567        struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
 568        int ret;
 569
 570        ret = ib_find_cached_pkey(id_priv->id.device, id_priv->id.port_num,
 571                                  ib_addr_get_pkey(dev_addr),
 572                                  &qp_attr->pkey_index);
 573        if (ret)
 574                return ret;
 575
 576        qp_attr->port_num = id_priv->id.port_num;
 577        *qp_attr_mask = IB_QP_STATE | IB_QP_PKEY_INDEX | IB_QP_PORT;
 578
 579        if (cma_is_ud_ps(id_priv->id.ps)) {
 580                ret = cma_set_qkey(id_priv);
 581                if (ret)
 582                        return ret;
 583
 584                qp_attr->qkey = id_priv->qkey;
 585                *qp_attr_mask |= IB_QP_QKEY;
 586        } else {
 587                qp_attr->qp_access_flags = 0;
 588                *qp_attr_mask |= IB_QP_ACCESS_FLAGS;
 589        }
 590        return 0;
 591}
 592
 593int rdma_init_qp_attr(struct rdma_cm_id *id, struct ib_qp_attr *qp_attr,
 594                       int *qp_attr_mask)
 595{
 596        struct rdma_id_private *id_priv;
 597        int ret = 0;
 598
 599        id_priv = container_of(id, struct rdma_id_private, id);
 600        switch (rdma_node_get_transport(id_priv->id.device->node_type)) {
 601        case RDMA_TRANSPORT_IB:
 602                if (!id_priv->cm_id.ib || cma_is_ud_ps(id_priv->id.ps))
 603                        ret = cma_ib_init_qp_attr(id_priv, qp_attr, qp_attr_mask);
 604                else
 605                        ret = ib_cm_init_qp_attr(id_priv->cm_id.ib, qp_attr,
 606                                                 qp_attr_mask);
 607                if (qp_attr->qp_state == IB_QPS_RTR)
 608                        qp_attr->rq_psn = id_priv->seq_num;
 609                break;
 610        case RDMA_TRANSPORT_IWARP:
 611                if (!id_priv->cm_id.iw) {
 612                        qp_attr->qp_access_flags = 0;
 613                        *qp_attr_mask = IB_QP_STATE | IB_QP_ACCESS_FLAGS;
 614                } else
 615                        ret = iw_cm_init_qp_attr(id_priv->cm_id.iw, qp_attr,
 616                                                 qp_attr_mask);
 617                break;
 618        default:
 619                ret = -ENOSYS;
 620                break;
 621        }
 622
 623        return ret;
 624}
 625EXPORT_SYMBOL(rdma_init_qp_attr);
 626
 627static inline int cma_zero_addr(struct sockaddr *addr)
 628{
 629        struct in6_addr *ip6;
 630
 631        if (addr->sa_family == AF_INET)
 632                return ipv4_is_zeronet(
 633                        ((struct sockaddr_in *)addr)->sin_addr.s_addr);
 634        else {
 635                ip6 = &((struct sockaddr_in6 *) addr)->sin6_addr;
 636                return (ip6->s6_addr32[0] | ip6->s6_addr32[1] |
 637                        ip6->s6_addr32[2] | ip6->s6_addr32[3]) == 0;
 638        }
 639}
 640
 641static inline int cma_loopback_addr(struct sockaddr *addr)
 642{
 643        if (addr->sa_family == AF_INET)
 644                return ipv4_is_loopback(
 645                        ((struct sockaddr_in *) addr)->sin_addr.s_addr);
 646        else
 647                return ipv6_addr_loopback(
 648                        &((struct sockaddr_in6 *) addr)->sin6_addr);
 649}
 650
 651static inline int cma_any_addr(struct sockaddr *addr)
 652{
 653        return cma_zero_addr(addr) || cma_loopback_addr(addr);
 654}
 655
 656static inline __be16 cma_port(struct sockaddr *addr)
 657{
 658        if (addr->sa_family == AF_INET)
 659                return ((struct sockaddr_in *) addr)->sin_port;
 660        else
 661                return ((struct sockaddr_in6 *) addr)->sin6_port;
 662}
 663
 664static inline int cma_any_port(struct sockaddr *addr)
 665{
 666        return !cma_port(addr);
 667}
 668
 669static int cma_get_net_info(void *hdr, enum rdma_port_space ps,
 670                            u8 *ip_ver, __be16 *port,
 671                            union cma_ip_addr **src, union cma_ip_addr **dst)
 672{
 673        switch (ps) {
 674        case RDMA_PS_SDP:
 675                if (sdp_get_majv(((struct sdp_hh *) hdr)->sdp_version) !=
 676                    SDP_MAJ_VERSION)
 677                        return -EINVAL;
 678
 679                *ip_ver = sdp_get_ip_ver(hdr);
 680                *port   = ((struct sdp_hh *) hdr)->port;
 681                *src    = &((struct sdp_hh *) hdr)->src_addr;
 682                *dst    = &((struct sdp_hh *) hdr)->dst_addr;
 683                break;
 684        default:
 685                if (((struct cma_hdr *) hdr)->cma_version != CMA_VERSION)
 686                        return -EINVAL;
 687
 688                *ip_ver = cma_get_ip_ver(hdr);
 689                *port   = ((struct cma_hdr *) hdr)->port;
 690                *src    = &((struct cma_hdr *) hdr)->src_addr;
 691                *dst    = &((struct cma_hdr *) hdr)->dst_addr;
 692                break;
 693        }
 694
 695        if (*ip_ver != 4 && *ip_ver != 6)
 696                return -EINVAL;
 697        return 0;
 698}
 699
 700static void cma_save_net_info(struct rdma_addr *addr,
 701                              struct rdma_addr *listen_addr,
 702                              u8 ip_ver, __be16 port,
 703                              union cma_ip_addr *src, union cma_ip_addr *dst)
 704{
 705        struct sockaddr_in *listen4, *ip4;
 706        struct sockaddr_in6 *listen6, *ip6;
 707
 708        switch (ip_ver) {
 709        case 4:
 710                listen4 = (struct sockaddr_in *) &listen_addr->src_addr;
 711                ip4 = (struct sockaddr_in *) &addr->src_addr;
 712                ip4->sin_family = listen4->sin_family;
 713                ip4->sin_addr.s_addr = dst->ip4.addr;
 714                ip4->sin_port = listen4->sin_port;
 715
 716                ip4 = (struct sockaddr_in *) &addr->dst_addr;
 717                ip4->sin_family = listen4->sin_family;
 718                ip4->sin_addr.s_addr = src->ip4.addr;
 719                ip4->sin_port = port;
 720                break;
 721        case 6:
 722                listen6 = (struct sockaddr_in6 *) &listen_addr->src_addr;
 723                ip6 = (struct sockaddr_in6 *) &addr->src_addr;
 724                ip6->sin6_family = listen6->sin6_family;
 725                ip6->sin6_addr = dst->ip6;
 726                ip6->sin6_port = listen6->sin6_port;
 727
 728                ip6 = (struct sockaddr_in6 *) &addr->dst_addr;
 729                ip6->sin6_family = listen6->sin6_family;
 730                ip6->sin6_addr = src->ip6;
 731                ip6->sin6_port = port;
 732                break;
 733        default:
 734                break;
 735        }
 736}
 737
 738static inline int cma_user_data_offset(enum rdma_port_space ps)
 739{
 740        switch (ps) {
 741        case RDMA_PS_SDP:
 742                return 0;
 743        default:
 744                return sizeof(struct cma_hdr);
 745        }
 746}
 747
 748static void cma_cancel_route(struct rdma_id_private *id_priv)
 749{
 750        switch (rdma_node_get_transport(id_priv->id.device->node_type)) {
 751        case RDMA_TRANSPORT_IB:
 752                if (id_priv->query)
 753                        ib_sa_cancel_query(id_priv->query_id, id_priv->query);
 754                break;
 755        default:
 756                break;
 757        }
 758}
 759
 760static void cma_cancel_listens(struct rdma_id_private *id_priv)
 761{
 762        struct rdma_id_private *dev_id_priv;
 763
 764        /*
 765         * Remove from listen_any_list to prevent added devices from spawning
 766         * additional listen requests.
 767         */
 768        mutex_lock(&lock);
 769        list_del(&id_priv->list);
 770
 771        while (!list_empty(&id_priv->listen_list)) {
 772                dev_id_priv = list_entry(id_priv->listen_list.next,
 773                                         struct rdma_id_private, listen_list);
 774                /* sync with device removal to avoid duplicate destruction */
 775                list_del_init(&dev_id_priv->list);
 776                list_del(&dev_id_priv->listen_list);
 777                mutex_unlock(&lock);
 778
 779                rdma_destroy_id(&dev_id_priv->id);
 780                mutex_lock(&lock);
 781        }
 782        mutex_unlock(&lock);
 783}
 784
 785static void cma_cancel_operation(struct rdma_id_private *id_priv,
 786                                 enum cma_state state)
 787{
 788        switch (state) {
 789        case CMA_ADDR_QUERY:
 790                rdma_addr_cancel(&id_priv->id.route.addr.dev_addr);
 791                break;
 792        case CMA_ROUTE_QUERY:
 793                cma_cancel_route(id_priv);
 794                break;
 795        case CMA_LISTEN:
 796                if (cma_any_addr((struct sockaddr *) &id_priv->id.route.addr.src_addr)
 797                                && !id_priv->cma_dev)
 798                        cma_cancel_listens(id_priv);
 799                break;
 800        default:
 801                break;
 802        }
 803}
 804
 805static void cma_release_port(struct rdma_id_private *id_priv)
 806{
 807        struct rdma_bind_list *bind_list = id_priv->bind_list;
 808
 809        if (!bind_list)
 810                return;
 811
 812        mutex_lock(&lock);
 813        hlist_del(&id_priv->node);
 814        if (hlist_empty(&bind_list->owners)) {
 815                idr_remove(bind_list->ps, bind_list->port);
 816                kfree(bind_list);
 817        }
 818        mutex_unlock(&lock);
 819}
 820
 821static void cma_leave_mc_groups(struct rdma_id_private *id_priv)
 822{
 823        struct cma_multicast *mc;
 824
 825        while (!list_empty(&id_priv->mc_list)) {
 826                mc = container_of(id_priv->mc_list.next,
 827                                  struct cma_multicast, list);
 828                list_del(&mc->list);
 829                ib_sa_free_multicast(mc->multicast.ib);
 830                kfree(mc);
 831        }
 832}
 833
 834void rdma_destroy_id(struct rdma_cm_id *id)
 835{
 836        struct rdma_id_private *id_priv;
 837        enum cma_state state;
 838
 839        id_priv = container_of(id, struct rdma_id_private, id);
 840        state = cma_exch(id_priv, CMA_DESTROYING);
 841        cma_cancel_operation(id_priv, state);
 842
 843        mutex_lock(&lock);
 844        if (id_priv->cma_dev) {
 845                mutex_unlock(&lock);
 846                switch (rdma_node_get_transport(id->device->node_type)) {
 847                case RDMA_TRANSPORT_IB:
 848                        if (id_priv->cm_id.ib && !IS_ERR(id_priv->cm_id.ib))
 849                                ib_destroy_cm_id(id_priv->cm_id.ib);
 850                        break;
 851                case RDMA_TRANSPORT_IWARP:
 852                        if (id_priv->cm_id.iw && !IS_ERR(id_priv->cm_id.iw))
 853                                iw_destroy_cm_id(id_priv->cm_id.iw);
 854                        break;
 855                default:
 856                        break;
 857                }
 858                cma_leave_mc_groups(id_priv);
 859                mutex_lock(&lock);
 860                cma_detach_from_dev(id_priv);
 861        }
 862        mutex_unlock(&lock);
 863
 864        cma_release_port(id_priv);
 865        cma_deref_id(id_priv);
 866        wait_for_completion(&id_priv->comp);
 867
 868        if (id_priv->internal_id)
 869                cma_deref_id(id_priv->id.context);
 870
 871        kfree(id_priv->id.route.path_rec);
 872        kfree(id_priv);
 873}
 874EXPORT_SYMBOL(rdma_destroy_id);
 875
 876static int cma_rep_recv(struct rdma_id_private *id_priv)
 877{
 878        int ret;
 879
 880        ret = cma_modify_qp_rtr(id_priv, NULL);
 881        if (ret)
 882                goto reject;
 883
 884        ret = cma_modify_qp_rts(id_priv, NULL);
 885        if (ret)
 886                goto reject;
 887
 888        ret = ib_send_cm_rtu(id_priv->cm_id.ib, NULL, 0);
 889        if (ret)
 890                goto reject;
 891
 892        return 0;
 893reject:
 894        cma_modify_qp_err(id_priv);
 895        ib_send_cm_rej(id_priv->cm_id.ib, IB_CM_REJ_CONSUMER_DEFINED,
 896                       NULL, 0, NULL, 0);
 897        return ret;
 898}
 899
 900static int cma_verify_rep(struct rdma_id_private *id_priv, void *data)
 901{
 902        if (id_priv->id.ps == RDMA_PS_SDP &&
 903            sdp_get_majv(((struct sdp_hah *) data)->sdp_version) !=
 904            SDP_MAJ_VERSION)
 905                return -EINVAL;
 906
 907        return 0;
 908}
 909
 910static void cma_set_rep_event_data(struct rdma_cm_event *event,
 911                                   struct ib_cm_rep_event_param *rep_data,
 912                                   void *private_data)
 913{
 914        event->param.conn.private_data = private_data;
 915        event->param.conn.private_data_len = IB_CM_REP_PRIVATE_DATA_SIZE;
 916        event->param.conn.responder_resources = rep_data->responder_resources;
 917        event->param.conn.initiator_depth = rep_data->initiator_depth;
 918        event->param.conn.flow_control = rep_data->flow_control;
 919        event->param.conn.rnr_retry_count = rep_data->rnr_retry_count;
 920        event->param.conn.srq = rep_data->srq;
 921        event->param.conn.qp_num = rep_data->remote_qpn;
 922}
 923
 924static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
 925{
 926        struct rdma_id_private *id_priv = cm_id->context;
 927        struct rdma_cm_event event;
 928        int ret = 0;
 929
 930        if ((ib_event->event != IB_CM_TIMEWAIT_EXIT &&
 931                cma_disable_callback(id_priv, CMA_CONNECT)) ||
 932            (ib_event->event == IB_CM_TIMEWAIT_EXIT &&
 933                cma_disable_callback(id_priv, CMA_DISCONNECT)))
 934                return 0;
 935
 936        memset(&event, 0, sizeof event);
 937        switch (ib_event->event) {
 938        case IB_CM_REQ_ERROR:
 939        case IB_CM_REP_ERROR:
 940                event.event = RDMA_CM_EVENT_UNREACHABLE;
 941                event.status = -ETIMEDOUT;
 942                break;
 943        case IB_CM_REP_RECEIVED:
 944                event.status = cma_verify_rep(id_priv, ib_event->private_data);
 945                if (event.status)
 946                        event.event = RDMA_CM_EVENT_CONNECT_ERROR;
 947                else if (id_priv->id.qp && id_priv->id.ps != RDMA_PS_SDP) {
 948                        event.status = cma_rep_recv(id_priv);
 949                        event.event = event.status ? RDMA_CM_EVENT_CONNECT_ERROR :
 950                                                     RDMA_CM_EVENT_ESTABLISHED;
 951                } else
 952                        event.event = RDMA_CM_EVENT_CONNECT_RESPONSE;
 953                cma_set_rep_event_data(&event, &ib_event->param.rep_rcvd,
 954                                       ib_event->private_data);
 955                break;
 956        case IB_CM_RTU_RECEIVED:
 957        case IB_CM_USER_ESTABLISHED:
 958                event.event = RDMA_CM_EVENT_ESTABLISHED;
 959                break;
 960        case IB_CM_DREQ_ERROR:
 961                event.status = -ETIMEDOUT; /* fall through */
 962        case IB_CM_DREQ_RECEIVED:
 963        case IB_CM_DREP_RECEIVED:
 964                if (!cma_comp_exch(id_priv, CMA_CONNECT, CMA_DISCONNECT))
 965                        goto out;
 966                event.event = RDMA_CM_EVENT_DISCONNECTED;
 967                break;
 968        case IB_CM_TIMEWAIT_EXIT:
 969                event.event = RDMA_CM_EVENT_TIMEWAIT_EXIT;
 970                break;
 971        case IB_CM_MRA_RECEIVED:
 972                /* ignore event */
 973                goto out;
 974        case IB_CM_REJ_RECEIVED:
 975                cma_modify_qp_err(id_priv);
 976                event.status = ib_event->param.rej_rcvd.reason;
 977                event.event = RDMA_CM_EVENT_REJECTED;
 978                event.param.conn.private_data = ib_event->private_data;
 979                event.param.conn.private_data_len = IB_CM_REJ_PRIVATE_DATA_SIZE;
 980                break;
 981        default:
 982                printk(KERN_ERR "RDMA CMA: unexpected IB CM event: %d\n",
 983                       ib_event->event);
 984                goto out;
 985        }
 986
 987        ret = id_priv->id.event_handler(&id_priv->id, &event);
 988        if (ret) {
 989                /* Destroy the CM ID by returning a non-zero value. */
 990                id_priv->cm_id.ib = NULL;
 991                cma_exch(id_priv, CMA_DESTROYING);
 992                mutex_unlock(&id_priv->handler_mutex);
 993                rdma_destroy_id(&id_priv->id);
 994                return ret;
 995        }
 996out:
 997        mutex_unlock(&id_priv->handler_mutex);
 998        return ret;
 999}
1000
1001static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
1002                                               struct ib_cm_event *ib_event)
1003{
1004        struct rdma_id_private *id_priv;
1005        struct rdma_cm_id *id;
1006        struct rdma_route *rt;
1007        union cma_ip_addr *src, *dst;
1008        __be16 port;
1009        u8 ip_ver;
1010        int ret;
1011
1012        if (cma_get_net_info(ib_event->private_data, listen_id->ps,
1013                             &ip_ver, &port, &src, &dst))
1014                goto err;
1015
1016        id = rdma_create_id(listen_id->event_handler, listen_id->context,
1017                            listen_id->ps);
1018        if (IS_ERR(id))
1019                goto err;
1020
1021        cma_save_net_info(&id->route.addr, &listen_id->route.addr,
1022                          ip_ver, port, src, dst);
1023
1024        rt = &id->route;
1025        rt->num_paths = ib_event->param.req_rcvd.alternate_path ? 2 : 1;
1026        rt->path_rec = kmalloc(sizeof *rt->path_rec * rt->num_paths,
1027                               GFP_KERNEL);
1028        if (!rt->path_rec)
1029                goto destroy_id;
1030
1031        rt->path_rec[0] = *ib_event->param.req_rcvd.primary_path;
1032        if (rt->num_paths == 2)
1033                rt->path_rec[1] = *ib_event->param.req_rcvd.alternate_path;
1034
1035        ib_addr_set_dgid(&rt->addr.dev_addr, &rt->path_rec[0].dgid);
1036        ret = rdma_translate_ip((struct sockaddr *) &id->route.addr.src_addr,
1037                                &id->route.addr.dev_addr);
1038        if (ret)
1039                goto destroy_id;
1040
1041        id_priv = container_of(id, struct rdma_id_private, id);
1042        id_priv->state = CMA_CONNECT;
1043        return id_priv;
1044
1045destroy_id:
1046        rdma_destroy_id(id);
1047err:
1048        return NULL;
1049}
1050
1051static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
1052                                              struct ib_cm_event *ib_event)
1053{
1054        struct rdma_id_private *id_priv;
1055        struct rdma_cm_id *id;
1056        union cma_ip_addr *src, *dst;
1057        __be16 port;
1058        u8 ip_ver;
1059        int ret;
1060
1061        id = rdma_create_id(listen_id->event_handler, listen_id->context,
1062                            listen_id->ps);
1063        if (IS_ERR(id))
1064                return NULL;
1065
1066
1067        if (cma_get_net_info(ib_event->private_data, listen_id->ps,
1068                             &ip_ver, &port, &src, &dst))
1069                goto err;
1070
1071        cma_save_net_info(&id->route.addr, &listen_id->route.addr,
1072                          ip_ver, port, src, dst);
1073
1074        ret = rdma_translate_ip((struct sockaddr *) &id->route.addr.src_addr,
1075                                &id->route.addr.dev_addr);
1076        if (ret)
1077                goto err;
1078
1079        id_priv = container_of(id, struct rdma_id_private, id);
1080        id_priv->state = CMA_CONNECT;
1081        return id_priv;
1082err:
1083        rdma_destroy_id(id);
1084        return NULL;
1085}
1086
1087static void cma_set_req_event_data(struct rdma_cm_event *event,
1088                                   struct ib_cm_req_event_param *req_data,
1089                                   void *private_data, int offset)
1090{
1091        event->param.conn.private_data = private_data + offset;
1092        event->param.conn.private_data_len = IB_CM_REQ_PRIVATE_DATA_SIZE - offset;
1093        event->param.conn.responder_resources = req_data->responder_resources;
1094        event->param.conn.initiator_depth = req_data->initiator_depth;
1095        event->param.conn.flow_control = req_data->flow_control;
1096        event->param.conn.retry_count = req_data->retry_count;
1097        event->param.conn.rnr_retry_count = req_data->rnr_retry_count;
1098        event->param.conn.srq = req_data->srq;
1099        event->param.conn.qp_num = req_data->remote_qpn;
1100}
1101
1102static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
1103{
1104        struct rdma_id_private *listen_id, *conn_id;
1105        struct rdma_cm_event event;
1106        int offset, ret;
1107
1108        listen_id = cm_id->context;
1109        if (cma_disable_callback(listen_id, CMA_LISTEN))
1110                return -ECONNABORTED;
1111
1112        memset(&event, 0, sizeof event);
1113        offset = cma_user_data_offset(listen_id->id.ps);
1114        event.event = RDMA_CM_EVENT_CONNECT_REQUEST;
1115        if (cma_is_ud_ps(listen_id->id.ps)) {
1116                conn_id = cma_new_udp_id(&listen_id->id, ib_event);
1117                event.param.ud.private_data = ib_event->private_data + offset;
1118                event.param.ud.private_data_len =
1119                                IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE - offset;
1120        } else {
1121                conn_id = cma_new_conn_id(&listen_id->id, ib_event);
1122                cma_set_req_event_data(&event, &ib_event->param.req_rcvd,
1123                                       ib_event->private_data, offset);
1124        }
1125        if (!conn_id) {
1126                ret = -ENOMEM;
1127                goto out;
1128        }
1129
1130        mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING);
1131        mutex_lock(&lock);
1132        ret = cma_acquire_dev(conn_id);
1133        mutex_unlock(&lock);
1134        if (ret)
1135                goto release_conn_id;
1136
1137        conn_id->cm_id.ib = cm_id;
1138        cm_id->context = conn_id;
1139        cm_id->cm_handler = cma_ib_handler;
1140
1141        ret = conn_id->id.event_handler(&conn_id->id, &event);
1142        if (!ret) {
1143                /*
1144                 * Acquire mutex to prevent user executing rdma_destroy_id()
1145                 * while we're accessing the cm_id.
1146                 */
1147                mutex_lock(&lock);
1148                if (cma_comp(conn_id, CMA_CONNECT) &&
1149                    !cma_is_ud_ps(conn_id->id.ps))
1150                        ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
1151                mutex_unlock(&lock);
1152                mutex_unlock(&conn_id->handler_mutex);
1153                goto out;
1154        }
1155
1156        /* Destroy the CM ID by returning a non-zero value. */
1157        conn_id->cm_id.ib = NULL;
1158
1159release_conn_id:
1160        cma_exch(conn_id, CMA_DESTROYING);
1161        mutex_unlock(&conn_id->handler_mutex);
1162        rdma_destroy_id(&conn_id->id);
1163
1164out:
1165        mutex_unlock(&listen_id->handler_mutex);
1166        return ret;
1167}
1168
1169static __be64 cma_get_service_id(enum rdma_port_space ps, struct sockaddr *addr)
1170{
1171        return cpu_to_be64(((u64)ps << 16) + be16_to_cpu(cma_port(addr)));
1172}
1173
1174static void cma_set_compare_data(enum rdma_port_space ps, struct sockaddr *addr,
1175                                 struct ib_cm_compare_data *compare)
1176{
1177        struct cma_hdr *cma_data, *cma_mask;
1178        struct sdp_hh *sdp_data, *sdp_mask;
1179        __be32 ip4_addr;
1180        struct in6_addr ip6_addr;
1181
1182        memset(compare, 0, sizeof *compare);
1183        cma_data = (void *) compare->data;
1184        cma_mask = (void *) compare->mask;
1185        sdp_data = (void *) compare->data;
1186        sdp_mask = (void *) compare->mask;
1187
1188        switch (addr->sa_family) {
1189        case AF_INET:
1190                ip4_addr = ((struct sockaddr_in *) addr)->sin_addr.s_addr;
1191                if (ps == RDMA_PS_SDP) {
1192                        sdp_set_ip_ver(sdp_data, 4);
1193                        sdp_set_ip_ver(sdp_mask, 0xF);
1194                        sdp_data->dst_addr.ip4.addr = ip4_addr;
1195                        sdp_mask->dst_addr.ip4.addr = htonl(~0);
1196                } else {
1197                        cma_set_ip_ver(cma_data, 4);
1198                        cma_set_ip_ver(cma_mask, 0xF);
1199                        cma_data->dst_addr.ip4.addr = ip4_addr;
1200                        cma_mask->dst_addr.ip4.addr = htonl(~0);
1201                }
1202                break;
1203        case AF_INET6:
1204                ip6_addr = ((struct sockaddr_in6 *) addr)->sin6_addr;
1205                if (ps == RDMA_PS_SDP) {
1206                        sdp_set_ip_ver(sdp_data, 6);
1207                        sdp_set_ip_ver(sdp_mask, 0xF);
1208                        sdp_data->dst_addr.ip6 = ip6_addr;
1209                        memset(&sdp_mask->dst_addr.ip6, 0xFF,
1210                               sizeof sdp_mask->dst_addr.ip6);
1211                } else {
1212                        cma_set_ip_ver(cma_data, 6);
1213                        cma_set_ip_ver(cma_mask, 0xF);
1214                        cma_data->dst_addr.ip6 = ip6_addr;
1215                        memset(&cma_mask->dst_addr.ip6, 0xFF,
1216                               sizeof cma_mask->dst_addr.ip6);
1217                }
1218                break;
1219        default:
1220                break;
1221        }
1222}
1223
1224static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event)
1225{
1226        struct rdma_id_private *id_priv = iw_id->context;
1227        struct rdma_cm_event event;
1228        struct sockaddr_in *sin;
1229        int ret = 0;
1230
1231        if (cma_disable_callback(id_priv, CMA_CONNECT))
1232                return 0;
1233
1234        memset(&event, 0, sizeof event);
1235        switch (iw_event->event) {
1236        case IW_CM_EVENT_CLOSE:
1237                event.event = RDMA_CM_EVENT_DISCONNECTED;
1238                break;
1239        case IW_CM_EVENT_CONNECT_REPLY:
1240                sin = (struct sockaddr_in *) &id_priv->id.route.addr.src_addr;
1241                *sin = iw_event->local_addr;
1242                sin = (struct sockaddr_in *) &id_priv->id.route.addr.dst_addr;
1243                *sin = iw_event->remote_addr;
1244                switch (iw_event->status) {
1245                case 0:
1246                        event.event = RDMA_CM_EVENT_ESTABLISHED;
1247                        break;
1248                case -ECONNRESET:
1249                case -ECONNREFUSED:
1250                        event.event = RDMA_CM_EVENT_REJECTED;
1251                        break;
1252                case -ETIMEDOUT:
1253                        event.event = RDMA_CM_EVENT_UNREACHABLE;
1254                        break;
1255                default:
1256                        event.event = RDMA_CM_EVENT_CONNECT_ERROR;
1257                        break;
1258                }
1259                break;
1260        case IW_CM_EVENT_ESTABLISHED:
1261                event.event = RDMA_CM_EVENT_ESTABLISHED;
1262                break;
1263        default:
1264                BUG_ON(1);
1265        }
1266
1267        event.status = iw_event->status;
1268        event.param.conn.private_data = iw_event->private_data;
1269        event.param.conn.private_data_len = iw_event->private_data_len;
1270        ret = id_priv->id.event_handler(&id_priv->id, &event);
1271        if (ret) {
1272                /* Destroy the CM ID by returning a non-zero value. */
1273                id_priv->cm_id.iw = NULL;
1274                cma_exch(id_priv, CMA_DESTROYING);
1275                mutex_unlock(&id_priv->handler_mutex);
1276                rdma_destroy_id(&id_priv->id);
1277                return ret;
1278        }
1279
1280        mutex_unlock(&id_priv->handler_mutex);
1281        return ret;
1282}
1283
1284static int iw_conn_req_handler(struct iw_cm_id *cm_id,
1285                               struct iw_cm_event *iw_event)
1286{
1287        struct rdma_cm_id *new_cm_id;
1288        struct rdma_id_private *listen_id, *conn_id;
1289        struct sockaddr_in *sin;
1290        struct net_device *dev = NULL;
1291        struct rdma_cm_event event;
1292        int ret;
1293        struct ib_device_attr attr;
1294
1295        listen_id = cm_id->context;
1296        if (cma_disable_callback(listen_id, CMA_LISTEN))
1297                return -ECONNABORTED;
1298
1299        /* Create a new RDMA id for the new IW CM ID */
1300        new_cm_id = rdma_create_id(listen_id->id.event_handler,
1301                                   listen_id->id.context,
1302                                   RDMA_PS_TCP);
1303        if (IS_ERR(new_cm_id)) {
1304                ret = -ENOMEM;
1305                goto out;
1306        }
1307        conn_id = container_of(new_cm_id, struct rdma_id_private, id);
1308        mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING);
1309        conn_id->state = CMA_CONNECT;
1310
1311        dev = ip_dev_find(&init_net, iw_event->local_addr.sin_addr.s_addr);
1312        if (!dev) {
1313                ret = -EADDRNOTAVAIL;
1314                mutex_unlock(&conn_id->handler_mutex);
1315                rdma_destroy_id(new_cm_id);
1316                goto out;
1317        }
1318        ret = rdma_copy_addr(&conn_id->id.route.addr.dev_addr, dev, NULL);
1319        if (ret) {
1320                mutex_unlock(&conn_id->handler_mutex);
1321                rdma_destroy_id(new_cm_id);
1322                goto out;
1323        }
1324
1325        mutex_lock(&lock);
1326        ret = cma_acquire_dev(conn_id);
1327        mutex_unlock(&lock);
1328        if (ret) {
1329                mutex_unlock(&conn_id->handler_mutex);
1330                rdma_destroy_id(new_cm_id);
1331                goto out;
1332        }
1333
1334        conn_id->cm_id.iw = cm_id;
1335        cm_id->context = conn_id;
1336        cm_id->cm_handler = cma_iw_handler;
1337
1338        sin = (struct sockaddr_in *) &new_cm_id->route.addr.src_addr;
1339        *sin = iw_event->local_addr;
1340        sin = (struct sockaddr_in *) &new_cm_id->route.addr.dst_addr;
1341        *sin = iw_event->remote_addr;
1342
1343        ret = ib_query_device(conn_id->id.device, &attr);
1344        if (ret) {
1345                mutex_unlock(&conn_id->handler_mutex);
1346                rdma_destroy_id(new_cm_id);
1347                goto out;
1348        }
1349
1350        memset(&event, 0, sizeof event);
1351        event.event = RDMA_CM_EVENT_CONNECT_REQUEST;
1352        event.param.conn.private_data = iw_event->private_data;
1353        event.param.conn.private_data_len = iw_event->private_data_len;
1354        event.param.conn.initiator_depth = attr.max_qp_init_rd_atom;
1355        event.param.conn.responder_resources = attr.max_qp_rd_atom;
1356        ret = conn_id->id.event_handler(&conn_id->id, &event);
1357        if (ret) {
1358                /* User wants to destroy the CM ID */
1359                conn_id->cm_id.iw = NULL;
1360                cma_exch(conn_id, CMA_DESTROYING);
1361                mutex_unlock(&conn_id->handler_mutex);
1362                rdma_destroy_id(&conn_id->id);
1363                goto out;
1364        }
1365
1366        mutex_unlock(&conn_id->handler_mutex);
1367
1368out:
1369        if (dev)
1370                dev_put(dev);
1371        mutex_unlock(&listen_id->handler_mutex);
1372        return ret;
1373}
1374
1375static int cma_ib_listen(struct rdma_id_private *id_priv)
1376{
1377        struct ib_cm_compare_data compare_data;
1378        struct sockaddr *addr;
1379        __be64 svc_id;
1380        int ret;
1381
1382        id_priv->cm_id.ib = ib_create_cm_id(id_priv->id.device, cma_req_handler,
1383                                            id_priv);
1384        if (IS_ERR(id_priv->cm_id.ib))
1385                return PTR_ERR(id_priv->cm_id.ib);
1386
1387        addr = (struct sockaddr *) &id_priv->id.route.addr.src_addr;
1388        svc_id = cma_get_service_id(id_priv->id.ps, addr);
1389        if (cma_any_addr(addr))
1390                ret = ib_cm_listen(id_priv->cm_id.ib, svc_id, 0, NULL);
1391        else {
1392                cma_set_compare_data(id_priv->id.ps, addr, &compare_data);
1393                ret = ib_cm_listen(id_priv->cm_id.ib, svc_id, 0, &compare_data);
1394        }
1395
1396        if (ret) {
1397                ib_destroy_cm_id(id_priv->cm_id.ib);
1398                id_priv->cm_id.ib = NULL;
1399        }
1400
1401        return ret;
1402}
1403
1404static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog)
1405{
1406        int ret;
1407        struct sockaddr_in *sin;
1408
1409        id_priv->cm_id.iw = iw_create_cm_id(id_priv->id.device,
1410                                            iw_conn_req_handler,
1411                                            id_priv);
1412        if (IS_ERR(id_priv->cm_id.iw))
1413                return PTR_ERR(id_priv->cm_id.iw);
1414
1415        sin = (struct sockaddr_in *) &id_priv->id.route.addr.src_addr;
1416        id_priv->cm_id.iw->local_addr = *sin;
1417
1418        ret = iw_cm_listen(id_priv->cm_id.iw, backlog);
1419
1420        if (ret) {
1421                iw_destroy_cm_id(id_priv->cm_id.iw);
1422                id_priv->cm_id.iw = NULL;
1423        }
1424
1425        return ret;
1426}
1427
1428static int cma_listen_handler(struct rdma_cm_id *id,
1429                              struct rdma_cm_event *event)
1430{
1431        struct rdma_id_private *id_priv = id->context;
1432
1433        id->context = id_priv->id.context;
1434        id->event_handler = id_priv->id.event_handler;
1435        return id_priv->id.event_handler(id, event);
1436}
1437
1438static void cma_listen_on_dev(struct rdma_id_private *id_priv,
1439                              struct cma_device *cma_dev)
1440{
1441        struct rdma_id_private *dev_id_priv;
1442        struct rdma_cm_id *id;
1443        int ret;
1444
1445        id = rdma_create_id(cma_listen_handler, id_priv, id_priv->id.ps);
1446        if (IS_ERR(id))
1447                return;
1448
1449        dev_id_priv = container_of(id, struct rdma_id_private, id);
1450
1451        dev_id_priv->state = CMA_ADDR_BOUND;
1452        memcpy(&id->route.addr.src_addr, &id_priv->id.route.addr.src_addr,
1453               ip_addr_size((struct sockaddr *) &id_priv->id.route.addr.src_addr));
1454
1455        cma_attach_to_dev(dev_id_priv, cma_dev);
1456        list_add_tail(&dev_id_priv->listen_list, &id_priv->listen_list);
1457        atomic_inc(&id_priv->refcount);
1458        dev_id_priv->internal_id = 1;
1459
1460        ret = rdma_listen(id, id_priv->backlog);
1461        if (ret)
1462                printk(KERN_WARNING "RDMA CMA: cma_listen_on_dev, error %d, "
1463                       "listening on device %s\n", ret, cma_dev->device->name);
1464}
1465
1466static void cma_listen_on_all(struct rdma_id_private *id_priv)
1467{
1468        struct cma_device *cma_dev;
1469
1470        mutex_lock(&lock);
1471        list_add_tail(&id_priv->list, &listen_any_list);
1472        list_for_each_entry(cma_dev, &dev_list, list)
1473                cma_listen_on_dev(id_priv, cma_dev);
1474        mutex_unlock(&lock);
1475}
1476
1477static int cma_bind_any(struct rdma_cm_id *id, sa_family_t af)
1478{
1479        struct sockaddr_storage addr_in;
1480
1481        memset(&addr_in, 0, sizeof addr_in);
1482        addr_in.ss_family = af;
1483        return rdma_bind_addr(id, (struct sockaddr *) &addr_in);
1484}
1485
1486int rdma_listen(struct rdma_cm_id *id, int backlog)
1487{
1488        struct rdma_id_private *id_priv;
1489        int ret;
1490
1491        id_priv = container_of(id, struct rdma_id_private, id);
1492        if (id_priv->state == CMA_IDLE) {
1493                ret = cma_bind_any(id, AF_INET);
1494                if (ret)
1495                        return ret;
1496        }
1497
1498        if (!cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_LISTEN))
1499                return -EINVAL;
1500
1501        id_priv->backlog = backlog;
1502        if (id->device) {
1503                switch (rdma_node_get_transport(id->device->node_type)) {
1504                case RDMA_TRANSPORT_IB:
1505                        ret = cma_ib_listen(id_priv);
1506                        if (ret)
1507                                goto err;
1508                        break;
1509                case RDMA_TRANSPORT_IWARP:
1510                        ret = cma_iw_listen(id_priv, backlog);
1511                        if (ret)
1512                                goto err;
1513                        break;
1514                default:
1515                        ret = -ENOSYS;
1516                        goto err;
1517                }
1518        } else
1519                cma_listen_on_all(id_priv);
1520
1521        return 0;
1522err:
1523        id_priv->backlog = 0;
1524        cma_comp_exch(id_priv, CMA_LISTEN, CMA_ADDR_BOUND);
1525        return ret;
1526}
1527EXPORT_SYMBOL(rdma_listen);
1528
1529void rdma_set_service_type(struct rdma_cm_id *id, int tos)
1530{
1531        struct rdma_id_private *id_priv;
1532
1533        id_priv = container_of(id, struct rdma_id_private, id);
1534        id_priv->tos = (u8) tos;
1535}
1536EXPORT_SYMBOL(rdma_set_service_type);
1537
1538static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec,
1539                              void *context)
1540{
1541        struct cma_work *work = context;
1542        struct rdma_route *route;
1543
1544        route = &work->id->id.route;
1545
1546        if (!status) {
1547                route->num_paths = 1;
1548                *route->path_rec = *path_rec;
1549        } else {
1550                work->old_state = CMA_ROUTE_QUERY;
1551                work->new_state = CMA_ADDR_RESOLVED;
1552                work->event.event = RDMA_CM_EVENT_ROUTE_ERROR;
1553                work->event.status = status;
1554        }
1555
1556        queue_work(cma_wq, &work->work);
1557}
1558
1559static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms,
1560                              struct cma_work *work)
1561{
1562        struct rdma_addr *addr = &id_priv->id.route.addr;
1563        struct ib_sa_path_rec path_rec;
1564        ib_sa_comp_mask comp_mask;
1565        struct sockaddr_in6 *sin6;
1566
1567        memset(&path_rec, 0, sizeof path_rec);
1568        ib_addr_get_sgid(&addr->dev_addr, &path_rec.sgid);
1569        ib_addr_get_dgid(&addr->dev_addr, &path_rec.dgid);
1570        path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(&addr->dev_addr));
1571        path_rec.numb_path = 1;
1572        path_rec.reversible = 1;
1573        path_rec.service_id = cma_get_service_id(id_priv->id.ps,
1574                                                        (struct sockaddr *) &addr->dst_addr);
1575
1576        comp_mask = IB_SA_PATH_REC_DGID | IB_SA_PATH_REC_SGID |
1577                    IB_SA_PATH_REC_PKEY | IB_SA_PATH_REC_NUMB_PATH |
1578                    IB_SA_PATH_REC_REVERSIBLE | IB_SA_PATH_REC_SERVICE_ID;
1579
1580        if (addr->src_addr.ss_family == AF_INET) {
1581                path_rec.qos_class = cpu_to_be16((u16) id_priv->tos);
1582                comp_mask |= IB_SA_PATH_REC_QOS_CLASS;
1583        } else {
1584                sin6 = (struct sockaddr_in6 *) &addr->src_addr;
1585                path_rec.traffic_class = (u8) (be32_to_cpu(sin6->sin6_flowinfo) >> 20);
1586                comp_mask |= IB_SA_PATH_REC_TRAFFIC_CLASS;
1587        }
1588
1589        id_priv->query_id = ib_sa_path_rec_get(&sa_client, id_priv->id.device,
1590                                               id_priv->id.port_num, &path_rec,
1591                                               comp_mask, timeout_ms,
1592                                               GFP_KERNEL, cma_query_handler,
1593                                               work, &id_priv->query);
1594
1595        return (id_priv->query_id < 0) ? id_priv->query_id : 0;
1596}
1597
1598static void cma_work_handler(struct work_struct *_work)
1599{
1600        struct cma_work *work = container_of(_work, struct cma_work, work);
1601        struct rdma_id_private *id_priv = work->id;
1602        int destroy = 0;
1603
1604        mutex_lock(&id_priv->handler_mutex);
1605        if (!cma_comp_exch(id_priv, work->old_state, work->new_state))
1606                goto out;
1607
1608        if (id_priv->id.event_handler(&id_priv->id, &work->event)) {
1609                cma_exch(id_priv, CMA_DESTROYING);
1610                destroy = 1;
1611        }
1612out:
1613        mutex_unlock(&id_priv->handler_mutex);
1614        cma_deref_id(id_priv);
1615        if (destroy)
1616                rdma_destroy_id(&id_priv->id);
1617        kfree(work);
1618}
1619
1620static void cma_ndev_work_handler(struct work_struct *_work)
1621{
1622        struct cma_ndev_work *work = container_of(_work, struct cma_ndev_work, work);
1623        struct rdma_id_private *id_priv = work->id;
1624        int destroy = 0;
1625
1626        mutex_lock(&id_priv->handler_mutex);
1627        if (id_priv->state == CMA_DESTROYING ||
1628            id_priv->state == CMA_DEVICE_REMOVAL)
1629                goto out;
1630
1631        if (id_priv->id.event_handler(&id_priv->id, &work->event)) {
1632                cma_exch(id_priv, CMA_DESTROYING);
1633                destroy = 1;
1634        }
1635
1636out:
1637        mutex_unlock(&id_priv->handler_mutex);
1638        cma_deref_id(id_priv);
1639        if (destroy)
1640                rdma_destroy_id(&id_priv->id);
1641        kfree(work);
1642}
1643
1644static int cma_resolve_ib_route(struct rdma_id_private *id_priv, int timeout_ms)
1645{
1646        struct rdma_route *route = &id_priv->id.route;
1647        struct cma_work *work;
1648        int ret;
1649
1650        work = kzalloc(sizeof *work, GFP_KERNEL);
1651        if (!work)
1652                return -ENOMEM;
1653
1654        work->id = id_priv;
1655        INIT_WORK(&work->work, cma_work_handler);
1656        work->old_state = CMA_ROUTE_QUERY;
1657        work->new_state = CMA_ROUTE_RESOLVED;
1658        work->event.event = RDMA_CM_EVENT_ROUTE_RESOLVED;
1659
1660        route->path_rec = kmalloc(sizeof *route->path_rec, GFP_KERNEL);
1661        if (!route->path_rec) {
1662                ret = -ENOMEM;
1663                goto err1;
1664        }
1665
1666        ret = cma_query_ib_route(id_priv, timeout_ms, work);
1667        if (ret)
1668                goto err2;
1669
1670        return 0;
1671err2:
1672        kfree(route->path_rec);
1673        route->path_rec = NULL;
1674err1:
1675        kfree(work);
1676        return ret;
1677}
1678
1679int rdma_set_ib_paths(struct rdma_cm_id *id,
1680                      struct ib_sa_path_rec *path_rec, int num_paths)
1681{
1682        struct rdma_id_private *id_priv;
1683        int ret;
1684
1685        id_priv = container_of(id, struct rdma_id_private, id);
1686        if (!cma_comp_exch(id_priv, CMA_ADDR_RESOLVED, CMA_ROUTE_RESOLVED))
1687                return -EINVAL;
1688
1689        id->route.path_rec = kmalloc(sizeof *path_rec * num_paths, GFP_KERNEL);
1690        if (!id->route.path_rec) {
1691                ret = -ENOMEM;
1692                goto err;
1693        }
1694
1695        memcpy(id->route.path_rec, path_rec, sizeof *path_rec * num_paths);
1696        return 0;
1697err:
1698        cma_comp_exch(id_priv, CMA_ROUTE_RESOLVED, CMA_ADDR_RESOLVED);
1699        return ret;
1700}
1701EXPORT_SYMBOL(rdma_set_ib_paths);
1702
1703static int cma_resolve_iw_route(struct rdma_id_private *id_priv, int timeout_ms)
1704{
1705        struct cma_work *work;
1706
1707        work = kzalloc(sizeof *work, GFP_KERNEL);
1708        if (!work)
1709                return -ENOMEM;
1710
1711        work->id = id_priv;
1712        INIT_WORK(&work->work, cma_work_handler);
1713        work->old_state = CMA_ROUTE_QUERY;
1714        work->new_state = CMA_ROUTE_RESOLVED;
1715        work->event.event = RDMA_CM_EVENT_ROUTE_RESOLVED;
1716        queue_work(cma_wq, &work->work);
1717        return 0;
1718}
1719
1720int rdma_resolve_route(struct rdma_cm_id *id, int timeout_ms)
1721{
1722        struct rdma_id_private *id_priv;
1723        int ret;
1724
1725        id_priv = container_of(id, struct rdma_id_private, id);
1726        if (!cma_comp_exch(id_priv, CMA_ADDR_RESOLVED, CMA_ROUTE_QUERY))
1727                return -EINVAL;
1728
1729        atomic_inc(&id_priv->refcount);
1730        switch (rdma_node_get_transport(id->device->node_type)) {
1731        case RDMA_TRANSPORT_IB:
1732                ret = cma_resolve_ib_route(id_priv, timeout_ms);
1733                break;
1734        case RDMA_TRANSPORT_IWARP:
1735                ret = cma_resolve_iw_route(id_priv, timeout_ms);
1736                break;
1737        default:
1738                ret = -ENOSYS;
1739                break;
1740        }
1741        if (ret)
1742                goto err;
1743
1744        return 0;
1745err:
1746        cma_comp_exch(id_priv, CMA_ROUTE_QUERY, CMA_ADDR_RESOLVED);
1747        cma_deref_id(id_priv);
1748        return ret;
1749}
1750EXPORT_SYMBOL(rdma_resolve_route);
1751
1752static int cma_bind_loopback(struct rdma_id_private *id_priv)
1753{
1754        struct cma_device *cma_dev;
1755        struct ib_port_attr port_attr;
1756        union ib_gid gid;
1757        u16 pkey;
1758        int ret;
1759        u8 p;
1760
1761        mutex_lock(&lock);
1762        if (list_empty(&dev_list)) {
1763                ret = -ENODEV;
1764                goto out;
1765        }
1766        list_for_each_entry(cma_dev, &dev_list, list)
1767                for (p = 1; p <= cma_dev->device->phys_port_cnt; ++p)
1768                        if (!ib_query_port(cma_dev->device, p, &port_attr) &&
1769                            port_attr.state == IB_PORT_ACTIVE)
1770                                goto port_found;
1771
1772        p = 1;
1773        cma_dev = list_entry(dev_list.next, struct cma_device, list);
1774
1775port_found:
1776        ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid);
1777        if (ret)
1778                goto out;
1779
1780        ret = ib_get_cached_pkey(cma_dev->device, p, 0, &pkey);
1781        if (ret)
1782                goto out;
1783
1784        ib_addr_set_sgid(&id_priv->id.route.addr.dev_addr, &gid);
1785        ib_addr_set_pkey(&id_priv->id.route.addr.dev_addr, pkey);
1786        id_priv->id.port_num = p;
1787        cma_attach_to_dev(id_priv, cma_dev);
1788out:
1789        mutex_unlock(&lock);
1790        return ret;
1791}
1792
1793static void addr_handler(int status, struct sockaddr *src_addr,
1794                         struct rdma_dev_addr *dev_addr, void *context)
1795{
1796        struct rdma_id_private *id_priv = context;
1797        struct rdma_cm_event event;
1798
1799        memset(&event, 0, sizeof event);
1800        mutex_lock(&id_priv->handler_mutex);
1801
1802        /*
1803         * Grab mutex to block rdma_destroy_id() from removing the device while
1804         * we're trying to acquire it.
1805         */
1806        mutex_lock(&lock);
1807        if (!cma_comp_exch(id_priv, CMA_ADDR_QUERY, CMA_ADDR_RESOLVED)) {
1808                mutex_unlock(&lock);
1809                goto out;
1810        }
1811
1812        if (!status && !id_priv->cma_dev)
1813                status = cma_acquire_dev(id_priv);
1814        mutex_unlock(&lock);
1815
1816        if (status) {
1817                if (!cma_comp_exch(id_priv, CMA_ADDR_RESOLVED, CMA_ADDR_BOUND))
1818                        goto out;
1819                event.event = RDMA_CM_EVENT_ADDR_ERROR;
1820                event.status = status;
1821        } else {
1822                memcpy(&id_priv->id.route.addr.src_addr, src_addr,
1823                       ip_addr_size(src_addr));
1824                event.event = RDMA_CM_EVENT_ADDR_RESOLVED;
1825        }
1826
1827        if (id_priv->id.event_handler(&id_priv->id, &event)) {
1828                cma_exch(id_priv, CMA_DESTROYING);
1829                mutex_unlock(&id_priv->handler_mutex);
1830                cma_deref_id(id_priv);
1831                rdma_destroy_id(&id_priv->id);
1832                return;
1833        }
1834out:
1835        mutex_unlock(&id_priv->handler_mutex);
1836        cma_deref_id(id_priv);
1837}
1838
1839static int cma_resolve_loopback(struct rdma_id_private *id_priv)
1840{
1841        struct cma_work *work;
1842        struct sockaddr_in *src_in, *dst_in;
1843        union ib_gid gid;
1844        int ret;
1845
1846        work = kzalloc(sizeof *work, GFP_KERNEL);
1847        if (!work)
1848                return -ENOMEM;
1849
1850        if (!id_priv->cma_dev) {
1851                ret = cma_bind_loopback(id_priv);
1852                if (ret)
1853                        goto err;
1854        }
1855
1856        ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid);
1857        ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr, &gid);
1858
1859        if (cma_zero_addr((struct sockaddr *) &id_priv->id.route.addr.src_addr)) {
1860                src_in = (struct sockaddr_in *)&id_priv->id.route.addr.src_addr;
1861                dst_in = (struct sockaddr_in *)&id_priv->id.route.addr.dst_addr;
1862                src_in->sin_family = dst_in->sin_family;
1863                src_in->sin_addr.s_addr = dst_in->sin_addr.s_addr;
1864        }
1865
1866        work->id = id_priv;
1867        INIT_WORK(&work->work, cma_work_handler);
1868        work->old_state = CMA_ADDR_QUERY;
1869        work->new_state = CMA_ADDR_RESOLVED;
1870        work->event.event = RDMA_CM_EVENT_ADDR_RESOLVED;
1871        queue_work(cma_wq, &work->work);
1872        return 0;
1873err:
1874        kfree(work);
1875        return ret;
1876}
1877
1878static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
1879                         struct sockaddr *dst_addr)
1880{
1881        if (src_addr && src_addr->sa_family)
1882                return rdma_bind_addr(id, src_addr);
1883        else
1884                return cma_bind_any(id, dst_addr->sa_family);
1885}
1886
1887int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
1888                      struct sockaddr *dst_addr, int timeout_ms)
1889{
1890        struct rdma_id_private *id_priv;
1891        int ret;
1892
1893        id_priv = container_of(id, struct rdma_id_private, id);
1894        if (id_priv->state == CMA_IDLE) {
1895                ret = cma_bind_addr(id, src_addr, dst_addr);
1896                if (ret)
1897                        return ret;
1898        }
1899
1900        if (!cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_ADDR_QUERY))
1901                return -EINVAL;
1902
1903        atomic_inc(&id_priv->refcount);
1904        memcpy(&id->route.addr.dst_addr, dst_addr, ip_addr_size(dst_addr));
1905        if (cma_any_addr(dst_addr))
1906                ret = cma_resolve_loopback(id_priv);
1907        else
1908                ret = rdma_resolve_ip(&addr_client, (struct sockaddr *) &id->route.addr.src_addr,
1909                                      dst_addr, &id->route.addr.dev_addr,
1910                                      timeout_ms, addr_handler, id_priv);
1911        if (ret)
1912                goto err;
1913
1914        return 0;
1915err:
1916        cma_comp_exch(id_priv, CMA_ADDR_QUERY, CMA_ADDR_BOUND);
1917        cma_deref_id(id_priv);
1918        return ret;
1919}
1920EXPORT_SYMBOL(rdma_resolve_addr);
1921
1922static void cma_bind_port(struct rdma_bind_list *bind_list,
1923                          struct rdma_id_private *id_priv)
1924{
1925        struct sockaddr_in *sin;
1926
1927        sin = (struct sockaddr_in *) &id_priv->id.route.addr.src_addr;
1928        sin->sin_port = htons(bind_list->port);
1929        id_priv->bind_list = bind_list;
1930        hlist_add_head(&id_priv->node, &bind_list->owners);
1931}
1932
1933static int cma_alloc_port(struct idr *ps, struct rdma_id_private *id_priv,
1934                          unsigned short snum)
1935{
1936        struct rdma_bind_list *bind_list;
1937        int port, ret;
1938
1939        bind_list = kzalloc(sizeof *bind_list, GFP_KERNEL);
1940        if (!bind_list)
1941                return -ENOMEM;
1942
1943        do {
1944                ret = idr_get_new_above(ps, bind_list, snum, &port);
1945        } while ((ret == -EAGAIN) && idr_pre_get(ps, GFP_KERNEL));
1946
1947        if (ret)
1948                goto err1;
1949
1950        if (port != snum) {
1951                ret = -EADDRNOTAVAIL;
1952                goto err2;
1953        }
1954
1955        bind_list->ps = ps;
1956        bind_list->port = (unsigned short) port;
1957        cma_bind_port(bind_list, id_priv);
1958        return 0;
1959err2:
1960        idr_remove(ps, port);
1961err1:
1962        kfree(bind_list);
1963        return ret;
1964}
1965
1966static int cma_alloc_any_port(struct idr *ps, struct rdma_id_private *id_priv)
1967{
1968        struct rdma_bind_list *bind_list;
1969        int port, ret, low, high;
1970
1971        bind_list = kzalloc(sizeof *bind_list, GFP_KERNEL);
1972        if (!bind_list)
1973                return -ENOMEM;
1974
1975retry:
1976        /* FIXME: add proper port randomization per like inet_csk_get_port */
1977        do {
1978                ret = idr_get_new_above(ps, bind_list, next_port, &port);
1979        } while ((ret == -EAGAIN) && idr_pre_get(ps, GFP_KERNEL));
1980
1981        if (ret)
1982                goto err1;
1983
1984        inet_get_local_port_range(&low, &high);
1985        if (port > high) {
1986                if (next_port != low) {
1987                        idr_remove(ps, port);
1988                        next_port = low;
1989                        goto retry;
1990                }
1991                ret = -EADDRNOTAVAIL;
1992                goto err2;
1993        }
1994
1995        if (port == high)
1996                next_port = low;
1997        else
1998                next_port = port + 1;
1999
2000        bind_list->ps = ps;
2001        bind_list->port = (unsigned short) port;
2002        cma_bind_port(bind_list, id_priv);
2003        return 0;
2004err2:
2005        idr_remove(ps, port);
2006err1:
2007        kfree(bind_list);
2008        return ret;
2009}
2010
2011static int cma_use_port(struct idr *ps, struct rdma_id_private *id_priv)
2012{
2013        struct rdma_id_private *cur_id;
2014        struct sockaddr_in *sin, *cur_sin;
2015        struct rdma_bind_list *bind_list;
2016        struct hlist_node *node;
2017        unsigned short snum;
2018
2019        sin = (struct sockaddr_in *) &id_priv->id.route.addr.src_addr;
2020        snum = ntohs(sin->sin_port);
2021        if (snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
2022                return -EACCES;
2023
2024        bind_list = idr_find(ps, snum);
2025        if (!bind_list)
2026                return cma_alloc_port(ps, id_priv, snum);
2027
2028        /*
2029         * We don't support binding to any address if anyone is bound to
2030         * a specific address on the same port.
2031         */
2032        if (cma_any_addr((struct sockaddr *) &id_priv->id.route.addr.src_addr))
2033                return -EADDRNOTAVAIL;
2034
2035        hlist_for_each_entry(cur_id, node, &bind_list->owners, node) {
2036                if (cma_any_addr((struct sockaddr *) &cur_id->id.route.addr.src_addr))
2037                        return -EADDRNOTAVAIL;
2038
2039                cur_sin = (struct sockaddr_in *) &cur_id->id.route.addr.src_addr;
2040                if (sin->sin_addr.s_addr == cur_sin->sin_addr.s_addr)
2041                        return -EADDRINUSE;
2042        }
2043
2044        cma_bind_port(bind_list, id_priv);
2045        return 0;
2046}
2047
2048static int cma_get_port(struct rdma_id_private *id_priv)
2049{
2050        struct idr *ps;
2051        int ret;
2052
2053        switch (id_priv->id.ps) {
2054        case RDMA_PS_SDP:
2055                ps = &sdp_ps;
2056                break;
2057        case RDMA_PS_TCP:
2058                ps = &tcp_ps;
2059                break;
2060        case RDMA_PS_UDP:
2061                ps = &udp_ps;
2062                break;
2063        case RDMA_PS_IPOIB:
2064                ps = &ipoib_ps;
2065                break;
2066        default:
2067                return -EPROTONOSUPPORT;
2068        }
2069
2070        mutex_lock(&lock);
2071        if (cma_any_port((struct sockaddr *) &id_priv->id.route.addr.src_addr))
2072                ret = cma_alloc_any_port(ps, id_priv);
2073        else
2074                ret = cma_use_port(ps, id_priv);
2075        mutex_unlock(&lock);
2076
2077        return ret;
2078}
2079
2080int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
2081{
2082        struct rdma_id_private *id_priv;
2083        int ret;
2084
2085        if (addr->sa_family != AF_INET && addr->sa_family != AF_INET6)
2086                return -EAFNOSUPPORT;
2087
2088        id_priv = container_of(id, struct rdma_id_private, id);
2089        if (!cma_comp_exch(id_priv, CMA_IDLE, CMA_ADDR_BOUND))
2090                return -EINVAL;
2091
2092        if (!cma_any_addr(addr)) {
2093                ret = rdma_translate_ip(addr, &id->route.addr.dev_addr);
2094                if (ret)
2095                        goto err1;
2096
2097                mutex_lock(&lock);
2098                ret = cma_acquire_dev(id_priv);
2099                mutex_unlock(&lock);
2100                if (ret)
2101                        goto err1;
2102        }
2103
2104        memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr));
2105        ret = cma_get_port(id_priv);
2106        if (ret)
2107                goto err2;
2108
2109        return 0;
2110err2:
2111        if (!cma_any_addr(addr)) {
2112                mutex_lock(&lock);
2113                cma_detach_from_dev(id_priv);
2114                mutex_unlock(&lock);
2115        }
2116err1:
2117        cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE);
2118        return ret;
2119}
2120EXPORT_SYMBOL(rdma_bind_addr);
2121
2122static int cma_format_hdr(void *hdr, enum rdma_port_space ps,
2123                          struct rdma_route *route)
2124{
2125        struct cma_hdr *cma_hdr;
2126        struct sdp_hh *sdp_hdr;
2127
2128        if (route->addr.src_addr.ss_family == AF_INET) {
2129                struct sockaddr_in *src4, *dst4;
2130
2131                src4 = (struct sockaddr_in *) &route->addr.src_addr;
2132                dst4 = (struct sockaddr_in *) &route->addr.dst_addr;
2133
2134                switch (ps) {
2135                case RDMA_PS_SDP:
2136                        sdp_hdr = hdr;
2137                        if (sdp_get_majv(sdp_hdr->sdp_version) != SDP_MAJ_VERSION)
2138                                return -EINVAL;
2139                        sdp_set_ip_ver(sdp_hdr, 4);
2140                        sdp_hdr->src_addr.ip4.addr = src4->sin_addr.s_addr;
2141                        sdp_hdr->dst_addr.ip4.addr = dst4->sin_addr.s_addr;
2142                        sdp_hdr->port = src4->sin_port;
2143                        break;
2144                default:
2145                        cma_hdr = hdr;
2146                        cma_hdr->cma_version = CMA_VERSION;
2147                        cma_set_ip_ver(cma_hdr, 4);
2148                        cma_hdr->src_addr.ip4.addr = src4->sin_addr.s_addr;
2149                        cma_hdr->dst_addr.ip4.addr = dst4->sin_addr.s_addr;
2150                        cma_hdr->port = src4->sin_port;
2151                        break;
2152                }
2153        } else {
2154                struct sockaddr_in6 *src6, *dst6;
2155
2156                src6 = (struct sockaddr_in6 *) &route->addr.src_addr;
2157                dst6 = (struct sockaddr_in6 *) &route->addr.dst_addr;
2158
2159                switch (ps) {
2160                case RDMA_PS_SDP:
2161                        sdp_hdr = hdr;
2162                        if (sdp_get_majv(sdp_hdr->sdp_version) != SDP_MAJ_VERSION)
2163                                return -EINVAL;
2164                        sdp_set_ip_ver(sdp_hdr, 6);
2165                        sdp_hdr->src_addr.ip6 = src6->sin6_addr;
2166                        sdp_hdr->dst_addr.ip6 = dst6->sin6_addr;
2167                        sdp_hdr->port = src6->sin6_port;
2168                        break;
2169                default:
2170                        cma_hdr = hdr;
2171                        cma_hdr->cma_version = CMA_VERSION;
2172                        cma_set_ip_ver(cma_hdr, 6);
2173                        cma_hdr->src_addr.ip6 = src6->sin6_addr;
2174                        cma_hdr->dst_addr.ip6 = dst6->sin6_addr;
2175                        cma_hdr->port = src6->sin6_port;
2176                        break;
2177                }
2178        }
2179        return 0;
2180}
2181
2182static int cma_sidr_rep_handler(struct ib_cm_id *cm_id,
2183                                struct ib_cm_event *ib_event)
2184{
2185        struct rdma_id_private *id_priv = cm_id->context;
2186        struct rdma_cm_event event;
2187        struct ib_cm_sidr_rep_event_param *rep = &ib_event->param.sidr_rep_rcvd;
2188        int ret = 0;
2189
2190        if (cma_disable_callback(id_priv, CMA_CONNECT))
2191                return 0;
2192
2193        memset(&event, 0, sizeof event);
2194        switch (ib_event->event) {
2195        case IB_CM_SIDR_REQ_ERROR:
2196                event.event = RDMA_CM_EVENT_UNREACHABLE;
2197                event.status = -ETIMEDOUT;
2198                break;
2199        case IB_CM_SIDR_REP_RECEIVED:
2200                event.param.ud.private_data = ib_event->private_data;
2201                event.param.ud.private_data_len = IB_CM_SIDR_REP_PRIVATE_DATA_SIZE;
2202                if (rep->status != IB_SIDR_SUCCESS) {
2203                        event.event = RDMA_CM_EVENT_UNREACHABLE;
2204                        event.status = ib_event->param.sidr_rep_rcvd.status;
2205                        break;
2206                }
2207                ret = cma_set_qkey(id_priv);
2208                if (ret) {
2209                        event.event = RDMA_CM_EVENT_ADDR_ERROR;
2210                        event.status = -EINVAL;
2211                        break;
2212                }
2213                if (id_priv->qkey != rep->qkey) {
2214                        event.event = RDMA_CM_EVENT_UNREACHABLE;
2215                        event.status = -EINVAL;
2216                        break;
2217                }
2218                ib_init_ah_from_path(id_priv->id.device, id_priv->id.port_num,
2219                                     id_priv->id.route.path_rec,
2220                                     &event.param.ud.ah_attr);
2221                event.param.ud.qp_num = rep->qpn;
2222                event.param.ud.qkey = rep->qkey;
2223                event.event = RDMA_CM_EVENT_ESTABLISHED;
2224                event.status = 0;
2225                break;
2226        default:
2227                printk(KERN_ERR "RDMA CMA: unexpected IB CM event: %d\n",
2228                       ib_event->event);
2229                goto out;
2230        }
2231
2232        ret = id_priv->id.event_handler(&id_priv->id, &event);
2233        if (ret) {
2234                /* Destroy the CM ID by returning a non-zero value. */
2235                id_priv->cm_id.ib = NULL;
2236                cma_exch(id_priv, CMA_DESTROYING);
2237                mutex_unlock(&id_priv->handler_mutex);
2238                rdma_destroy_id(&id_priv->id);
2239                return ret;
2240        }
2241out:
2242        mutex_unlock(&id_priv->handler_mutex);
2243        return ret;
2244}
2245
2246static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
2247                              struct rdma_conn_param *conn_param)
2248{
2249        struct ib_cm_sidr_req_param req;
2250        struct rdma_route *route;
2251        int ret;
2252
2253        req.private_data_len = sizeof(struct cma_hdr) +
2254                               conn_param->private_data_len;
2255        req.private_data = kzalloc(req.private_data_len, GFP_ATOMIC);
2256        if (!req.private_data)
2257                return -ENOMEM;
2258
2259        if (conn_param->private_data && conn_param->private_data_len)
2260                memcpy((void *) req.private_data + sizeof(struct cma_hdr),
2261                       conn_param->private_data, conn_param->private_data_len);
2262
2263        route = &id_priv->id.route;
2264        ret = cma_format_hdr((void *) req.private_data, id_priv->id.ps, route);
2265        if (ret)
2266                goto out;
2267
2268        id_priv->cm_id.ib = ib_create_cm_id(id_priv->id.device,
2269                                            cma_sidr_rep_handler, id_priv);
2270        if (IS_ERR(id_priv->cm_id.ib)) {
2271                ret = PTR_ERR(id_priv->cm_id.ib);
2272                goto out;
2273        }
2274
2275        req.path = route->path_rec;
2276        req.service_id = cma_get_service_id(id_priv->id.ps,
2277                                            (struct sockaddr *) &route->addr.dst_addr);
2278        req.timeout_ms = 1 << (CMA_CM_RESPONSE_TIMEOUT - 8);
2279        req.max_cm_retries = CMA_MAX_CM_RETRIES;
2280
2281        ret = ib_send_cm_sidr_req(id_priv->cm_id.ib, &req);
2282        if (ret) {
2283                ib_destroy_cm_id(id_priv->cm_id.ib);
2284                id_priv->cm_id.ib = NULL;
2285        }
2286out:
2287        kfree(req.private_data);
2288        return ret;
2289}
2290
2291static int cma_connect_ib(struct rdma_id_private *id_priv,
2292                          struct rdma_conn_param *conn_param)
2293{
2294        struct ib_cm_req_param req;
2295        struct rdma_route *route;
2296        void *private_data;
2297        int offset, ret;
2298
2299        memset(&req, 0, sizeof req);
2300        offset = cma_user_data_offset(id_priv->id.ps);
2301        req.private_data_len = offset + conn_param->private_data_len;
2302        private_data = kzalloc(req.private_data_len, GFP_ATOMIC);
2303        if (!private_data)
2304                return -ENOMEM;
2305
2306        if (conn_param->private_data && conn_param->private_data_len)
2307                memcpy(private_data + offset, conn_param->private_data,
2308                       conn_param->private_data_len);
2309
2310        id_priv->cm_id.ib = ib_create_cm_id(id_priv->id.device, cma_ib_handler,
2311                                            id_priv);
2312        if (IS_ERR(id_priv->cm_id.ib)) {
2313                ret = PTR_ERR(id_priv->cm_id.ib);
2314                goto out;
2315        }
2316
2317        route = &id_priv->id.route;
2318        ret = cma_format_hdr(private_data, id_priv->id.ps, route);
2319        if (ret)
2320                goto out;
2321        req.private_data = private_data;
2322
2323        req.primary_path = &route->path_rec[0];
2324        if (route->num_paths == 2)
2325                req.alternate_path = &route->path_rec[1];
2326
2327        req.service_id = cma_get_service_id(id_priv->id.ps,
2328                                            (struct sockaddr *) &route->addr.dst_addr);
2329        req.qp_num = id_priv->qp_num;
2330        req.qp_type = IB_QPT_RC;
2331        req.starting_psn = id_priv->seq_num;
2332        req.responder_resources = conn_param->responder_resources;
2333        req.initiator_depth = conn_param->initiator_depth;
2334        req.flow_control = conn_param->flow_control;
2335        req.retry_count = conn_param->retry_count;
2336        req.rnr_retry_count = conn_param->rnr_retry_count;
2337        req.remote_cm_response_timeout = CMA_CM_RESPONSE_TIMEOUT;
2338        req.local_cm_response_timeout = CMA_CM_RESPONSE_TIMEOUT;
2339        req.max_cm_retries = CMA_MAX_CM_RETRIES;
2340        req.srq = id_priv->srq ? 1 : 0;
2341
2342        ret = ib_send_cm_req(id_priv->cm_id.ib, &req);
2343out:
2344        if (ret && !IS_ERR(id_priv->cm_id.ib)) {
2345                ib_destroy_cm_id(id_priv->cm_id.ib);
2346                id_priv->cm_id.ib = NULL;
2347        }
2348
2349        kfree(private_data);
2350        return ret;
2351}
2352
2353static int cma_connect_iw(struct rdma_id_private *id_priv,
2354                          struct rdma_conn_param *conn_param)
2355{
2356        struct iw_cm_id *cm_id;
2357        struct sockaddr_in* sin;
2358        int ret;
2359        struct iw_cm_conn_param iw_param;
2360
2361        cm_id = iw_create_cm_id(id_priv->id.device, cma_iw_handler, id_priv);
2362        if (IS_ERR(cm_id)) {
2363                ret = PTR_ERR(cm_id);
2364                goto out;
2365        }
2366
2367        id_priv->cm_id.iw = cm_id;
2368
2369        sin = (struct sockaddr_in*) &id_priv->id.route.addr.src_addr;
2370        cm_id->local_addr = *sin;
2371
2372        sin = (struct sockaddr_in*) &id_priv->id.route.addr.dst_addr;
2373        cm_id->remote_addr = *sin;
2374
2375        ret = cma_modify_qp_rtr(id_priv, conn_param);
2376        if (ret)
2377                goto out;
2378
2379        iw_param.ord = conn_param->initiator_depth;
2380        iw_param.ird = conn_param->responder_resources;
2381        iw_param.private_data = conn_param->private_data;
2382        iw_param.private_data_len = conn_param->private_data_len;
2383        if (id_priv->id.qp)
2384                iw_param.qpn = id_priv->qp_num;
2385        else
2386                iw_param.qpn = conn_param->qp_num;
2387        ret = iw_cm_connect(cm_id, &iw_param);
2388out:
2389        if (ret && !IS_ERR(cm_id)) {
2390                iw_destroy_cm_id(cm_id);
2391                id_priv->cm_id.iw = NULL;
2392        }
2393        return ret;
2394}
2395
2396int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
2397{
2398        struct rdma_id_private *id_priv;
2399        int ret;
2400
2401        id_priv = container_of(id, struct rdma_id_private, id);
2402        if (!cma_comp_exch(id_priv, CMA_ROUTE_RESOLVED, CMA_CONNECT))
2403                return -EINVAL;
2404
2405        if (!id->qp) {
2406                id_priv->qp_num = conn_param->qp_num;
2407                id_priv->srq = conn_param->srq;
2408        }
2409
2410        switch (rdma_node_get_transport(id->device->node_type)) {
2411        case RDMA_TRANSPORT_IB:
2412                if (cma_is_ud_ps(id->ps))
2413                        ret = cma_resolve_ib_udp(id_priv, conn_param);
2414                else
2415                        ret = cma_connect_ib(id_priv, conn_param);
2416                break;
2417        case RDMA_TRANSPORT_IWARP:
2418                ret = cma_connect_iw(id_priv, conn_param);
2419                break;
2420        default:
2421                ret = -ENOSYS;
2422                break;
2423        }
2424        if (ret)
2425                goto err;
2426
2427        return 0;
2428err:
2429        cma_comp_exch(id_priv, CMA_CONNECT, CMA_ROUTE_RESOLVED);
2430        return ret;
2431}
2432EXPORT_SYMBOL(rdma_connect);
2433
2434static int cma_accept_ib(struct rdma_id_private *id_priv,
2435                         struct rdma_conn_param *conn_param)
2436{
2437        struct ib_cm_rep_param rep;
2438        int ret;
2439
2440        ret = cma_modify_qp_rtr(id_priv, conn_param);
2441        if (ret)
2442                goto out;
2443
2444        ret = cma_modify_qp_rts(id_priv, conn_param);
2445        if (ret)
2446                goto out;
2447
2448        memset(&rep, 0, sizeof rep);
2449        rep.qp_num = id_priv->qp_num;
2450        rep.starting_psn = id_priv->seq_num;
2451        rep.private_data = conn_param->private_data;
2452        rep.private_data_len = conn_param->private_data_len;
2453        rep.responder_resources = conn_param->responder_resources;
2454        rep.initiator_depth = conn_param->initiator_depth;
2455        rep.failover_accepted = 0;
2456        rep.flow_control = conn_param->flow_control;
2457        rep.rnr_retry_count = conn_param->rnr_retry_count;
2458        rep.srq = id_priv->srq ? 1 : 0;
2459
2460        ret = ib_send_cm_rep(id_priv->cm_id.ib, &rep);
2461out:
2462        return ret;
2463}
2464
2465static int cma_accept_iw(struct rdma_id_private *id_priv,
2466                  struct rdma_conn_param *conn_param)
2467{
2468        struct iw_cm_conn_param iw_param;
2469        int ret;
2470
2471        ret = cma_modify_qp_rtr(id_priv, conn_param);
2472        if (ret)
2473                return ret;
2474
2475        iw_param.ord = conn_param->initiator_depth;
2476        iw_param.ird = conn_param->responder_resources;
2477        iw_param.private_data = conn_param->private_data;
2478        iw_param.private_data_len = conn_param->private_data_len;
2479        if (id_priv->id.qp) {
2480                iw_param.qpn = id_priv->qp_num;
2481        } else
2482                iw_param.qpn = conn_param->qp_num;
2483
2484        return iw_cm_accept(id_priv->cm_id.iw, &iw_param);
2485}
2486
2487static int cma_send_sidr_rep(struct rdma_id_private *id_priv,
2488                             enum ib_cm_sidr_status status,
2489                             const void *private_data, int private_data_len)
2490{
2491        struct ib_cm_sidr_rep_param rep;
2492        int ret;
2493
2494        memset(&rep, 0, sizeof rep);
2495        rep.status = status;
2496        if (status == IB_SIDR_SUCCESS) {
2497                ret = cma_set_qkey(id_priv);
2498                if (ret)
2499                        return ret;
2500                rep.qp_num = id_priv->qp_num;
2501                rep.qkey = id_priv->qkey;
2502        }
2503        rep.private_data = private_data;
2504        rep.private_data_len = private_data_len;
2505
2506        return ib_send_cm_sidr_rep(id_priv->cm_id.ib, &rep);
2507}
2508
2509int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
2510{
2511        struct rdma_id_private *id_priv;
2512        int ret;
2513
2514        id_priv = container_of(id, struct rdma_id_private, id);
2515        if (!cma_comp(id_priv, CMA_CONNECT))
2516                return -EINVAL;
2517
2518        if (!id->qp && conn_param) {
2519                id_priv->qp_num = conn_param->qp_num;
2520                id_priv->srq = conn_param->srq;
2521        }
2522
2523        switch (rdma_node_get_transport(id->device->node_type)) {
2524        case RDMA_TRANSPORT_IB:
2525                if (cma_is_ud_ps(id->ps))
2526                        ret = cma_send_sidr_rep(id_priv, IB_SIDR_SUCCESS,
2527                                                conn_param->private_data,
2528                                                conn_param->private_data_len);
2529                else if (conn_param)
2530                        ret = cma_accept_ib(id_priv, conn_param);
2531                else
2532                        ret = cma_rep_recv(id_priv);
2533                break;
2534        case RDMA_TRANSPORT_IWARP:
2535                ret = cma_accept_iw(id_priv, conn_param);
2536                break;
2537        default:
2538                ret = -ENOSYS;
2539                break;
2540        }
2541
2542        if (ret)
2543                goto reject;
2544
2545        return 0;
2546reject:
2547        cma_modify_qp_err(id_priv);
2548        rdma_reject(id, NULL, 0);
2549        return ret;
2550}
2551EXPORT_SYMBOL(rdma_accept);
2552
2553int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event)
2554{
2555        struct rdma_id_private *id_priv;
2556        int ret;
2557
2558        id_priv = container_of(id, struct rdma_id_private, id);
2559        if (!cma_has_cm_dev(id_priv))
2560                return -EINVAL;
2561
2562        switch (id->device->node_type) {
2563        case RDMA_NODE_IB_CA:
2564                ret = ib_cm_notify(id_priv->cm_id.ib, event);
2565                break;
2566        default:
2567                ret = 0;
2568                break;
2569        }
2570        return ret;
2571}
2572EXPORT_SYMBOL(rdma_notify);
2573
2574int rdma_reject(struct rdma_cm_id *id, const void *private_data,
2575                u8 private_data_len)
2576{
2577        struct rdma_id_private *id_priv;
2578        int ret;
2579
2580        id_priv = container_of(id, struct rdma_id_private, id);
2581        if (!cma_has_cm_dev(id_priv))
2582                return -EINVAL;
2583
2584        switch (rdma_node_get_transport(id->device->node_type)) {
2585        case RDMA_TRANSPORT_IB:
2586                if (cma_is_ud_ps(id->ps))
2587                        ret = cma_send_sidr_rep(id_priv, IB_SIDR_REJECT,
2588                                                private_data, private_data_len);
2589                else
2590                        ret = ib_send_cm_rej(id_priv->cm_id.ib,
2591                                             IB_CM_REJ_CONSUMER_DEFINED, NULL,
2592                                             0, private_data, private_data_len);
2593                break;
2594        case RDMA_TRANSPORT_IWARP:
2595                ret = iw_cm_reject(id_priv->cm_id.iw,
2596                                   private_data, private_data_len);
2597                break;
2598        default:
2599                ret = -ENOSYS;
2600                break;
2601        }
2602        return ret;
2603}
2604EXPORT_SYMBOL(rdma_reject);
2605
2606int rdma_disconnect(struct rdma_cm_id *id)
2607{
2608        struct rdma_id_private *id_priv;
2609        int ret;
2610
2611        id_priv = container_of(id, struct rdma_id_private, id);
2612        if (!cma_has_cm_dev(id_priv))
2613                return -EINVAL;
2614
2615        switch (rdma_node_get_transport(id->device->node_type)) {
2616        case RDMA_TRANSPORT_IB:
2617                ret = cma_modify_qp_err(id_priv);
2618                if (ret)
2619                        goto out;
2620                /* Initiate or respond to a disconnect. */
2621                if (ib_send_cm_dreq(id_priv->cm_id.ib, NULL, 0))
2622                        ib_send_cm_drep(id_priv->cm_id.ib, NULL, 0);
2623                break;
2624        case RDMA_TRANSPORT_IWARP:
2625                ret = iw_cm_disconnect(id_priv->cm_id.iw, 0);
2626                break;
2627        default:
2628                ret = -EINVAL;
2629                break;
2630        }
2631out:
2632        return ret;
2633}
2634EXPORT_SYMBOL(rdma_disconnect);
2635
2636static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast)
2637{
2638        struct rdma_id_private *id_priv;
2639        struct cma_multicast *mc = multicast->context;
2640        struct rdma_cm_event event;
2641        int ret;
2642
2643        id_priv = mc->id_priv;
2644        if (cma_disable_callback(id_priv, CMA_ADDR_BOUND) &&
2645            cma_disable_callback(id_priv, CMA_ADDR_RESOLVED))
2646                return 0;
2647
2648        mutex_lock(&id_priv->qp_mutex);
2649        if (!status && id_priv->id.qp)
2650                status = ib_attach_mcast(id_priv->id.qp, &multicast->rec.mgid,
2651                                         multicast->rec.mlid);
2652        mutex_unlock(&id_priv->qp_mutex);
2653
2654        memset(&event, 0, sizeof event);
2655        event.status = status;
2656        event.param.ud.private_data = mc->context;
2657        if (!status) {
2658                event.event = RDMA_CM_EVENT_MULTICAST_JOIN;
2659                ib_init_ah_from_mcmember(id_priv->id.device,
2660                                         id_priv->id.port_num, &multicast->rec,
2661                                         &event.param.ud.ah_attr);
2662                event.param.ud.qp_num = 0xFFFFFF;
2663                event.param.ud.qkey = be32_to_cpu(multicast->rec.qkey);
2664        } else
2665                event.event = RDMA_CM_EVENT_MULTICAST_ERROR;
2666
2667        ret = id_priv->id.event_handler(&id_priv->id, &event);
2668        if (ret) {
2669                cma_exch(id_priv, CMA_DESTROYING);
2670                mutex_unlock(&id_priv->handler_mutex);
2671                rdma_destroy_id(&id_priv->id);
2672                return 0;
2673        }
2674
2675        mutex_unlock(&id_priv->handler_mutex);
2676        return 0;
2677}
2678
2679static void cma_set_mgid(struct rdma_id_private *id_priv,
2680                         struct sockaddr *addr, union ib_gid *mgid)
2681{
2682        unsigned char mc_map[MAX_ADDR_LEN];
2683        struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
2684        struct sockaddr_in *sin = (struct sockaddr_in *) addr;
2685        struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) addr;
2686
2687        if (cma_any_addr(addr)) {
2688                memset(mgid, 0, sizeof *mgid);
2689        } else if ((addr->sa_family == AF_INET6) &&
2690                   ((be32_to_cpu(sin6->sin6_addr.s6_addr32[0]) & 0xFF10A01B) ==
2691                                                                 0xFF10A01B)) {
2692                /* IPv6 address is an SA assigned MGID. */
2693                memcpy(mgid, &sin6->sin6_addr, sizeof *mgid);
2694        } else {
2695                ip_ib_mc_map(sin->sin_addr.s_addr, dev_addr->broadcast, mc_map);
2696                if (id_priv->id.ps == RDMA_PS_UDP)
2697                        mc_map[7] = 0x01;       /* Use RDMA CM signature */
2698                *mgid = *(union ib_gid *) (mc_map + 4);
2699        }
2700}
2701
2702static int cma_join_ib_multicast(struct rdma_id_private *id_priv,
2703                                 struct cma_multicast *mc)
2704{
2705        struct ib_sa_mcmember_rec rec;
2706        struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
2707        ib_sa_comp_mask comp_mask;
2708        int ret;
2709
2710        ib_addr_get_mgid(dev_addr, &rec.mgid);
2711        ret = ib_sa_get_mcmember_rec(id_priv->id.device, id_priv->id.port_num,
2712                                     &rec.mgid, &rec);
2713        if (ret)
2714                return ret;
2715
2716        cma_set_mgid(id_priv, (struct sockaddr *) &mc->addr, &rec.mgid);
2717        if (id_priv->id.ps == RDMA_PS_UDP)
2718                rec.qkey = cpu_to_be32(RDMA_UDP_QKEY);
2719        ib_addr_get_sgid(dev_addr, &rec.port_gid);
2720        rec.pkey = cpu_to_be16(ib_addr_get_pkey(dev_addr));
2721        rec.join_state = 1;
2722
2723        comp_mask = IB_SA_MCMEMBER_REC_MGID | IB_SA_MCMEMBER_REC_PORT_GID |
2724                    IB_SA_MCMEMBER_REC_PKEY | IB_SA_MCMEMBER_REC_JOIN_STATE |
2725                    IB_SA_MCMEMBER_REC_QKEY | IB_SA_MCMEMBER_REC_SL |
2726                    IB_SA_MCMEMBER_REC_FLOW_LABEL |
2727                    IB_SA_MCMEMBER_REC_TRAFFIC_CLASS;
2728
2729        if (id_priv->id.ps == RDMA_PS_IPOIB)
2730                comp_mask |= IB_SA_MCMEMBER_REC_RATE |
2731                             IB_SA_MCMEMBER_REC_RATE_SELECTOR;
2732
2733        mc->multicast.ib = ib_sa_join_multicast(&sa_client, id_priv->id.device,
2734                                                id_priv->id.port_num, &rec,
2735                                                comp_mask, GFP_KERNEL,
2736                                                cma_ib_mc_handler, mc);
2737        if (IS_ERR(mc->multicast.ib))
2738                return PTR_ERR(mc->multicast.ib);
2739
2740        return 0;
2741}
2742
2743int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr,
2744                        void *context)
2745{
2746        struct rdma_id_private *id_priv;
2747        struct cma_multicast *mc;
2748        int ret;
2749
2750        id_priv = container_of(id, struct rdma_id_private, id);
2751        if (!cma_comp(id_priv, CMA_ADDR_BOUND) &&
2752            !cma_comp(id_priv, CMA_ADDR_RESOLVED))
2753                return -EINVAL;
2754
2755        mc = kmalloc(sizeof *mc, GFP_KERNEL);
2756        if (!mc)
2757                return -ENOMEM;
2758
2759        memcpy(&mc->addr, addr, ip_addr_size(addr));
2760        mc->context = context;
2761        mc->id_priv = id_priv;
2762
2763        spin_lock(&id_priv->lock);
2764        list_add(&mc->list, &id_priv->mc_list);
2765        spin_unlock(&id_priv->lock);
2766
2767        switch (rdma_node_get_transport(id->device->node_type)) {
2768        case RDMA_TRANSPORT_IB:
2769                ret = cma_join_ib_multicast(id_priv, mc);
2770                break;
2771        default:
2772                ret = -ENOSYS;
2773                break;
2774        }
2775
2776        if (ret) {
2777                spin_lock_irq(&id_priv->lock);
2778                list_del(&mc->list);
2779                spin_unlock_irq(&id_priv->lock);
2780                kfree(mc);
2781        }
2782        return ret;
2783}
2784EXPORT_SYMBOL(rdma_join_multicast);
2785
2786void rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr)
2787{
2788        struct rdma_id_private *id_priv;
2789        struct cma_multicast *mc;
2790
2791        id_priv = container_of(id, struct rdma_id_private, id);
2792        spin_lock_irq(&id_priv->lock);
2793        list_for_each_entry(mc, &id_priv->mc_list, list) {
2794                if (!memcmp(&mc->addr, addr, ip_addr_size(addr))) {
2795                        list_del(&mc->list);
2796                        spin_unlock_irq(&id_priv->lock);
2797
2798                        if (id->qp)
2799                                ib_detach_mcast(id->qp,
2800                                                &mc->multicast.ib->rec.mgid,
2801                                                mc->multicast.ib->rec.mlid);
2802                        ib_sa_free_multicast(mc->multicast.ib);
2803                        kfree(mc);
2804                        return;
2805                }
2806        }
2807        spin_unlock_irq(&id_priv->lock);
2808}
2809EXPORT_SYMBOL(rdma_leave_multicast);
2810
2811static int cma_netdev_change(struct net_device *ndev, struct rdma_id_private *id_priv)
2812{
2813        struct rdma_dev_addr *dev_addr;
2814        struct cma_ndev_work *work;
2815
2816        dev_addr = &id_priv->id.route.addr.dev_addr;
2817
2818        if ((dev_addr->src_dev == ndev) &&
2819            memcmp(dev_addr->src_dev_addr, ndev->dev_addr, ndev->addr_len)) {
2820                printk(KERN_INFO "RDMA CM addr change for ndev %s used by id %p\n",
2821                       ndev->name, &id_priv->id);
2822                work = kzalloc(sizeof *work, GFP_KERNEL);
2823                if (!work)
2824                        return -ENOMEM;
2825
2826                INIT_WORK(&work->work, cma_ndev_work_handler);
2827                work->id = id_priv;
2828                work->event.event = RDMA_CM_EVENT_ADDR_CHANGE;
2829                atomic_inc(&id_priv->refcount);
2830                queue_work(cma_wq, &work->work);
2831        }
2832
2833        return 0;
2834}
2835
2836static int cma_netdev_callback(struct notifier_block *self, unsigned long event,
2837                               void *ctx)
2838{
2839        struct net_device *ndev = (struct net_device *)ctx;
2840        struct cma_device *cma_dev;
2841        struct rdma_id_private *id_priv;
2842        int ret = NOTIFY_DONE;
2843
2844        if (dev_net(ndev) != &init_net)
2845                return NOTIFY_DONE;
2846
2847        if (event != NETDEV_BONDING_FAILOVER)
2848                return NOTIFY_DONE;
2849
2850        if (!(ndev->flags & IFF_MASTER) || !(ndev->priv_flags & IFF_BONDING))
2851                return NOTIFY_DONE;
2852
2853        mutex_lock(&lock);
2854        list_for_each_entry(cma_dev, &dev_list, list)
2855                list_for_each_entry(id_priv, &cma_dev->id_list, list) {
2856                        ret = cma_netdev_change(ndev, id_priv);
2857                        if (ret)
2858                                goto out;
2859                }
2860
2861out:
2862        mutex_unlock(&lock);
2863        return ret;
2864}
2865
2866static struct notifier_block cma_nb = {
2867        .notifier_call = cma_netdev_callback
2868};
2869
2870static void cma_add_one(struct ib_device *device)
2871{
2872        struct cma_device *cma_dev;
2873        struct rdma_id_private *id_priv;
2874
2875        cma_dev = kmalloc(sizeof *cma_dev, GFP_KERNEL);
2876        if (!cma_dev)
2877                return;
2878
2879        cma_dev->device = device;
2880
2881        init_completion(&cma_dev->comp);
2882        atomic_set(&cma_dev->refcount, 1);
2883        INIT_LIST_HEAD(&cma_dev->id_list);
2884        ib_set_client_data(device, &cma_client, cma_dev);
2885
2886        mutex_lock(&lock);
2887        list_add_tail(&cma_dev->list, &dev_list);
2888        list_for_each_entry(id_priv, &listen_any_list, list)
2889                cma_listen_on_dev(id_priv, cma_dev);
2890        mutex_unlock(&lock);
2891}
2892
2893static int cma_remove_id_dev(struct rdma_id_private *id_priv)
2894{
2895        struct rdma_cm_event event;
2896        enum cma_state state;
2897        int ret = 0;
2898
2899        /* Record that we want to remove the device */
2900        state = cma_exch(id_priv, CMA_DEVICE_REMOVAL);
2901        if (state == CMA_DESTROYING)
2902                return 0;
2903
2904        cma_cancel_operation(id_priv, state);
2905        mutex_lock(&id_priv->handler_mutex);
2906
2907        /* Check for destruction from another callback. */
2908        if (!cma_comp(id_priv, CMA_DEVICE_REMOVAL))
2909                goto out;
2910
2911        memset(&event, 0, sizeof event);
2912        event.event = RDMA_CM_EVENT_DEVICE_REMOVAL;
2913        ret = id_priv->id.event_handler(&id_priv->id, &event);
2914out:
2915        mutex_unlock(&id_priv->handler_mutex);
2916        return ret;
2917}
2918
2919static void cma_process_remove(struct cma_device *cma_dev)
2920{
2921        struct rdma_id_private *id_priv;
2922        int ret;
2923
2924        mutex_lock(&lock);
2925        while (!list_empty(&cma_dev->id_list)) {
2926                id_priv = list_entry(cma_dev->id_list.next,
2927                                     struct rdma_id_private, list);
2928
2929                list_del(&id_priv->listen_list);
2930                list_del_init(&id_priv->list);
2931                atomic_inc(&id_priv->refcount);
2932                mutex_unlock(&lock);
2933
2934                ret = id_priv->internal_id ? 1 : cma_remove_id_dev(id_priv);
2935                cma_deref_id(id_priv);
2936                if (ret)
2937                        rdma_destroy_id(&id_priv->id);
2938
2939                mutex_lock(&lock);
2940        }
2941        mutex_unlock(&lock);
2942
2943        cma_deref_dev(cma_dev);
2944        wait_for_completion(&cma_dev->comp);
2945}
2946
2947static void cma_remove_one(struct ib_device *device)
2948{
2949        struct cma_device *cma_dev;
2950
2951        cma_dev = ib_get_client_data(device, &cma_client);
2952        if (!cma_dev)
2953                return;
2954
2955        mutex_lock(&lock);
2956        list_del(&cma_dev->list);
2957        mutex_unlock(&lock);
2958
2959        cma_process_remove(cma_dev);
2960        kfree(cma_dev);
2961}
2962
2963static int __init cma_init(void)
2964{
2965        int ret, low, high, remaining;
2966
2967        get_random_bytes(&next_port, sizeof next_port);
2968        inet_get_local_port_range(&low, &high);
2969        remaining = (high - low) + 1;
2970        next_port = ((unsigned int) next_port % remaining) + low;
2971
2972        cma_wq = create_singlethread_workqueue("rdma_cm");
2973        if (!cma_wq)
2974                return -ENOMEM;
2975
2976        ib_sa_register_client(&sa_client);
2977        rdma_addr_register_client(&addr_client);
2978        register_netdevice_notifier(&cma_nb);
2979
2980        ret = ib_register_client(&cma_client);
2981        if (ret)
2982                goto err;
2983        return 0;
2984
2985err:
2986        unregister_netdevice_notifier(&cma_nb);
2987        rdma_addr_unregister_client(&addr_client);
2988        ib_sa_unregister_client(&sa_client);
2989        destroy_workqueue(cma_wq);
2990        return ret;
2991}
2992
2993static void __exit cma_cleanup(void)
2994{
2995        ib_unregister_client(&cma_client);
2996        unregister_netdevice_notifier(&cma_nb);
2997        rdma_addr_unregister_client(&addr_client);
2998        ib_sa_unregister_client(&sa_client);
2999        destroy_workqueue(cma_wq);
3000        idr_destroy(&sdp_ps);
3001        idr_destroy(&tcp_ps);
3002        idr_destroy(&udp_ps);
3003        idr_destroy(&ipoib_ps);
3004}
3005
3006module_init(cma_init);
3007module_exit(cma_cleanup);
3008