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