Lines Matching refs:cep
38 static int siw_cm_upcall(struct siw_cep *cep, enum iw_cm_event_type reason,
53 struct siw_cep *cep = sk_to_cep(sk);
56 cep->sk_state_change = sk->sk_state_change;
57 cep->sk_data_ready = sk->sk_data_ready;
58 cep->sk_write_space = sk->sk_write_space;
59 cep->sk_error_report = sk->sk_error_report;
63 static void siw_sk_restore_upcalls(struct sock *sk, struct siw_cep *cep)
65 sk->sk_state_change = cep->sk_state_change;
66 sk->sk_data_ready = cep->sk_data_ready;
67 sk->sk_write_space = cep->sk_write_space;
68 sk->sk_error_report = cep->sk_error_report;
72 static void siw_qp_socket_assoc(struct siw_cep *cep, struct siw_qp *qp)
74 struct socket *s = cep->sock;
89 struct siw_cep *cep;
93 cep = sk_to_cep(sk);
94 if (cep) {
95 siw_sk_restore_upcalls(sk, cep);
96 siw_cep_put(cep);
108 struct siw_cep *cep;
114 cep = sk_to_cep(sk);
115 if (!cep) {
133 siw_cm_upcall(cep, IW_CM_EVENT_ESTABLISHED, 0);
137 siw_qp_socket_assoc(cep, qp);
140 static void siw_sk_assign_rtr_upcalls(struct siw_cep *cep)
142 struct sock *sk = cep->sock->sk;
150 static void siw_cep_socket_assoc(struct siw_cep *cep, struct socket *s)
152 cep->sock = s;
153 siw_cep_get(cep);
154 s->sk->sk_user_data = cep;
162 struct siw_cep *cep = kzalloc(sizeof(*cep), GFP_KERNEL);
165 if (!cep)
168 INIT_LIST_HEAD(&cep->listenq);
169 INIT_LIST_HEAD(&cep->devq);
170 INIT_LIST_HEAD(&cep->work_freelist);
172 kref_init(&cep->ref);
173 cep->state = SIW_EPSTATE_IDLE;
174 init_waitqueue_head(&cep->waitq);
175 spin_lock_init(&cep->lock);
176 cep->sdev = sdev;
177 cep->enhanced_rdma_conn_est = false;
180 list_add_tail(&cep->devq, &sdev->cep_list);
183 siw_dbg_cep(cep, "new endpoint\n");
184 return cep;
187 static void siw_cm_free_work(struct siw_cep *cep)
192 list_for_each_safe(w, tmp, &cep->work_freelist) {
199 static void siw_cancel_mpatimer(struct siw_cep *cep)
201 spin_lock_bh(&cep->lock);
202 if (cep->mpa_timer) {
203 if (cancel_delayed_work(&cep->mpa_timer->work)) {
204 siw_cep_put(cep);
205 kfree(cep->mpa_timer); /* not needed again */
207 cep->mpa_timer = NULL;
209 spin_unlock_bh(&cep->lock);
215 spin_lock_bh(&work->cep->lock);
216 list_add(&work->list, &work->cep->work_freelist);
217 spin_unlock_bh(&work->cep->lock);
220 static void siw_cep_set_inuse(struct siw_cep *cep)
224 spin_lock_irqsave(&cep->lock, flags);
226 if (cep->in_use) {
227 spin_unlock_irqrestore(&cep->lock, flags);
228 wait_event_interruptible(cep->waitq, !cep->in_use);
233 cep->in_use = 1;
234 spin_unlock_irqrestore(&cep->lock, flags);
238 static void siw_cep_set_free(struct siw_cep *cep)
242 spin_lock_irqsave(&cep->lock, flags);
243 cep->in_use = 0;
244 spin_unlock_irqrestore(&cep->lock, flags);
246 wake_up(&cep->waitq);
251 struct siw_cep *cep = container_of(ref, struct siw_cep, ref);
252 struct siw_device *sdev = cep->sdev;
255 WARN_ON(cep->listen_cep);
258 kfree(cep->mpa.pdata);
259 spin_lock_bh(&cep->lock);
260 if (!list_empty(&cep->work_freelist))
261 siw_cm_free_work(cep);
262 spin_unlock_bh(&cep->lock);
265 list_del(&cep->devq);
268 siw_dbg_cep(cep, "free endpoint\n");
269 kfree(cep);
272 static struct siw_cm_work *siw_get_work(struct siw_cep *cep)
276 spin_lock_bh(&cep->lock);
277 if (!list_empty(&cep->work_freelist)) {
278 work = list_entry(cep->work_freelist.next, struct siw_cm_work,
282 spin_unlock_bh(&cep->lock);
286 static int siw_cm_alloc_work(struct siw_cep *cep, int num)
293 if (!(list_empty(&cep->work_freelist)))
294 siw_cm_free_work(cep);
297 work->cep = cep;
299 list_add(&work->list, &cep->work_freelist);
309 static int siw_cm_upcall(struct siw_cep *cep, enum iw_cm_event_type reason,
320 event.provider_data = cep;
321 id = cep->listen_cep->cm_id;
323 id = cep->cm_id;
329 event.ird = cep->ird;
330 event.ord = cep->ord;
332 event.ird = cep->ord;
333 event.ord = cep->ird;
338 u16 pd_len = be16_to_cpu(cep->mpa.hdr.params.pd_len);
345 event.private_data = cep->mpa.pdata;
348 if (cep->enhanced_rdma_conn_est) {
355 getname_local(cep->sock, &event.local_addr);
356 getname_peer(cep->sock, &event.remote_addr);
358 siw_dbg_cep(cep, "[QP %u]: reason=%d, status=%d\n",
359 cep->qp ? qp_id(cep->qp) : UINT_MAX, reason, status);
374 struct siw_cep *cep = qp->cep;
379 if (!qp->cep)
383 siw_cm_queue_work(cep, SIW_CM_WORK_CLOSE_LLP);
385 siw_cep_set_inuse(cep);
387 if (cep->state == SIW_EPSTATE_CLOSED) {
388 siw_dbg_cep(cep, "already closed\n");
391 siw_dbg_cep(cep, "immediate close, state %d\n", cep->state);
396 if (cep->cm_id) {
397 switch (cep->state) {
399 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
404 siw_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
416 cep->cm_id->rem_ref(cep->cm_id);
417 cep->cm_id = NULL;
418 siw_cep_put(cep);
420 cep->state = SIW_EPSTATE_CLOSED;
422 if (cep->sock) {
423 siw_socket_disassoc(cep->sock);
427 sock_release(cep->sock);
428 cep->sock = NULL;
430 if (cep->qp) {
431 cep->qp = NULL;
435 siw_cep_set_free(cep);
439 void siw_cep_put(struct siw_cep *cep)
441 WARN_ON(kref_read(&cep->ref) < 1);
442 kref_put(&cep->ref, __siw_cep_dealloc);
445 void siw_cep_get(struct siw_cep *cep)
447 kref_get(&cep->ref);
453 static int siw_send_mpareqrep(struct siw_cep *cep, const void *pdata, u8 pd_len)
455 struct socket *s = cep->sock;
456 struct mpa_rr *rr = &cep->mpa.hdr;
469 if (cep->enhanced_rdma_conn_est) {
471 iov[iovec_num].iov_base = &cep->mpa.v2_ctrl;
472 iov[iovec_num].iov_len = sizeof(cep->mpa.v2_ctrl);
473 mpa_len += sizeof(cep->mpa.v2_ctrl);
481 if (cep->enhanced_rdma_conn_est)
482 pd_len += sizeof(cep->mpa.v2_ctrl);
500 static int siw_recv_mpa_rr(struct siw_cep *cep)
502 struct mpa_rr *hdr = &cep->mpa.hdr;
503 struct socket *s = cep->sock;
507 if (cep->mpa.bytes_rcvd < sizeof(struct mpa_rr)) {
508 rcvd = ksock_recv(s, (char *)hdr + cep->mpa.bytes_rcvd,
509 sizeof(struct mpa_rr) - cep->mpa.bytes_rcvd,
514 cep->mpa.bytes_rcvd += rcvd;
516 if (cep->mpa.bytes_rcvd < sizeof(struct mpa_rr))
529 to_rcv = pd_len - (cep->mpa.bytes_rcvd - sizeof(struct mpa_rr));
544 siw_dbg_cep(cep, "peer EOF\n");
548 siw_dbg_cep(cep, "error: %d\n", rcvd);
551 siw_dbg_cep(cep, "peer sent extra data: %d\n", rcvd);
560 if (!cep->mpa.pdata) {
561 cep->mpa.pdata = kmalloc(pd_len + 4, GFP_KERNEL);
562 if (!cep->mpa.pdata)
566 s, cep->mpa.pdata + cep->mpa.bytes_rcvd - sizeof(struct mpa_rr),
575 cep->mpa.bytes_rcvd += rcvd;
578 siw_dbg_cep(cep, "%d bytes private data received\n", pd_len);
590 static int siw_proc_mpareq(struct siw_cep *cep)
596 rv = siw_recv_mpa_rr(cep);
600 req = &cep->mpa.hdr;
625 cep->enhanced_rdma_conn_est = true;
646 if (cep->enhanced_rdma_conn_est) {
647 struct mpa_v2_data *v2 = (struct mpa_v2_data *)cep->mpa.pdata;
654 cep->ord = ntohs(v2->ird) & MPA_IRD_ORD_MASK;
655 cep->ord = min(cep->ord, SIW_MAX_ORD_QP);
656 cep->ird = ntohs(v2->ord) & MPA_IRD_ORD_MASK;
657 cep->ird = min(cep->ird, SIW_MAX_IRD_QP);
660 cep->mpa.v2_ctrl.ird = htons(cep->ird);
661 cep->mpa.v2_ctrl.ord = htons(cep->ord);
672 cep->mpa.v2_ctrl.ird |= MPA_V2_PEER_TO_PEER;
675 cep->mpa.v2_ctrl.ord |= MPA_V2_RDMA_WRITE_RTR;
677 cep->mpa.v2_ctrl.ord |= MPA_V2_RDMA_READ_RTR;
679 cep->mpa.v2_ctrl.ord |= MPA_V2_RDMA_WRITE_RTR;
683 cep->state = SIW_EPSTATE_RECVD_MPAREQ;
686 siw_cep_get(cep);
687 rv = siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REQUEST, 0);
689 siw_cep_put(cep);
694 siw_dbg_cep(cep, "reject: crc %d:%d:%d, m %d:%d\n",
706 kfree(cep->mpa.pdata);
708 cep->mpa.pdata = NULL;
710 siw_send_mpareqrep(cep, NULL, 0);
715 static int siw_proc_mpareply(struct siw_cep *cep)
719 struct siw_qp *qp = cep->qp;
727 rv = siw_recv_mpa_rr(cep);
731 siw_cancel_mpatimer(cep);
733 rep = &cep->mpa.hdr;
748 siw_dbg_cep(cep, "got mpa reject\n");
749 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -ECONNRESET);
754 siw_dbg_cep(cep, "peer allows GSO on TX\n");
761 siw_dbg_cep(cep, "reply unsupp: crc %d:%d:%d, m %d:%d\n",
766 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -ECONNREFUSED);
770 if (cep->enhanced_rdma_conn_est) {
779 siw_dbg_cep(cep, "mpa reply error: vers %d, enhcd %d\n",
785 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
789 v2 = (struct mpa_v2_data *)cep->mpa.pdata;
793 if (cep->ird < rep_ord &&
795 rep_ord > cep->sdev->attrs.max_ird)) {
796 siw_dbg_cep(cep, "ird %d, rep_ord %d, max_ord %d\n",
797 cep->ird, rep_ord,
798 cep->sdev->attrs.max_ord);
801 if (cep->ord > rep_ird && relaxed_ird_negotiation == false) {
802 siw_dbg_cep(cep, "ord %d, rep_ird %d\n", cep->ord,
810 cep->ird = rep_ord;
811 cep->ord = rep_ird;
825 if (cep->mpa.v2_ctrl_req.ird & MPA_V2_PEER_TO_PEER)
827 cep->mpa.v2_ctrl_req.ord &
839 siw_dbg_cep(cep,
862 qp_attrs.irq_size = cep->ird;
863 qp_attrs.orq_size = cep->ord;
864 qp_attrs.sk = cep->sock;
879 siw_qp_socket_assoc(cep, qp);
890 rv = siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, 0);
892 cep->state = SIW_EPSTATE_RDMA_MODE;
899 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -EINVAL);
908 static void siw_accept_newconn(struct siw_cep *cep)
910 struct socket *s = cep->sock;
915 if (cep->state != SIW_EPSTATE_LISTENING)
918 new_cep = siw_cep_alloc(cep->sdev);
934 new_cep->sk_state_change = cep->sk_state_change;
935 new_cep->sk_data_ready = cep->sk_data_ready;
936 new_cep->sk_write_space = cep->sk_write_space;
937 new_cep->sk_error_report = cep->sk_error_report;
944 siw_dbg_cep(cep, "kernel_accept() error: %d\n", rv);
961 new_cep->listen_cep = cep;
962 siw_cep_get(cep);
968 siw_dbg_cep(cep, "immediate mpa request\n");
973 siw_cep_put(cep);
994 siw_dbg_cep(cep, "error %d\n", rv);
1000 struct siw_cep *cep;
1004 cep = work->cep;
1006 siw_dbg_cep(cep, "[QP %u]: work type: %d, state %d\n",
1007 cep->qp ? qp_id(cep->qp) : UINT_MAX,
1008 work->type, cep->state);
1010 siw_cep_set_inuse(cep);
1014 siw_accept_newconn(cep);
1018 if (cep->state == SIW_EPSTATE_AWAIT_MPAREQ) {
1019 if (cep->listen_cep) {
1020 siw_cep_set_inuse(cep->listen_cep);
1022 if (cep->listen_cep->state ==
1024 rv = siw_proc_mpareq(cep);
1028 siw_cep_set_free(cep->listen_cep);
1031 siw_cep_put(cep->listen_cep);
1032 cep->listen_cep = NULL;
1034 siw_cep_put(cep);
1037 } else if (cep->state == SIW_EPSTATE_AWAIT_MPAREP) {
1038 rv = siw_proc_mpareply(cep);
1045 if (cep->state == SIW_EPSTATE_RDMA_MODE) {
1046 cep->sock->sk->sk_data_ready(cep->sock->sk);
1047 siw_dbg_cep(cep, "already in RDMA mode");
1049 siw_dbg_cep(cep, "out of state: %d\n",
1050 cep->state);
1061 if (cep->qp && cep->qp->term_info.valid)
1062 siw_send_terminate(cep->qp);
1064 if (cep->cm_id)
1065 siw_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
1071 if (cep->cm_id) {
1072 if (cep->state == SIW_EPSTATE_AWAIT_MPAREP) {
1076 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
1078 } else if (cep->state == SIW_EPSTATE_RDMA_MODE) {
1083 siw_cm_upcall(cep, IW_CM_EVENT_DISCONNECT, 0);
1084 siw_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
1091 if (cep->state == SIW_EPSTATE_RECVD_MPAREQ) {
1095 siw_dbg_cep(cep,
1097 } else if (cep->state == SIW_EPSTATE_AWAIT_MPAREQ) {
1101 if (cep->listen_cep) {
1102 siw_dbg_cep(cep,
1104 siw_cep_put(cep->listen_cep);
1105 cep->listen_cep = NULL;
1113 cep->mpa_timer = NULL;
1115 if (cep->state == SIW_EPSTATE_AWAIT_MPAREP) {
1121 cep->mpa.hdr.params.pd_len = 0;
1123 if (cep->cm_id)
1124 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
1128 } else if (cep->state == SIW_EPSTATE_AWAIT_MPAREQ) {
1132 if (cep->listen_cep) {
1133 siw_cep_put(cep->listen_cep);
1134 cep->listen_cep = NULL;
1144 siw_dbg_cep(cep,
1146 cep->mpa_timer ? "y" : "n",
1147 cep->qp ? qp_id(cep->qp) : UINT_MAX);
1149 siw_cancel_mpatimer(cep);
1151 cep->state = SIW_EPSTATE_CLOSED;
1153 if (cep->qp) {
1154 struct siw_qp *qp = cep->qp;
1160 siw_cep_set_free(cep);
1165 siw_cep_set_inuse(cep);
1166 cep->qp = NULL;
1169 if (cep->sock) {
1170 siw_socket_disassoc(cep->sock);
1171 sock_release(cep->sock);
1172 cep->sock = NULL;
1174 if (cep->cm_id) {
1175 cep->cm_id->rem_ref(cep->cm_id);
1176 cep->cm_id = NULL;
1177 siw_cep_put(cep);
1180 siw_cep_set_free(cep);
1182 siw_cep_put(cep);
1187 int siw_cm_queue_work(struct siw_cep *cep, enum siw_work_type type)
1189 struct siw_cm_work *work = siw_get_work(cep);
1193 siw_dbg_cep(cep, "failed with no work available\n");
1197 work->cep = cep;
1199 siw_cep_get(cep);
1204 cep->mpa_timer = work;
1206 if (cep->state == SIW_EPSTATE_AWAIT_MPAREP)
1211 siw_dbg_cep(cep, "[QP %u]: work type: %d, timeout %lu\n",
1212 cep->qp ? qp_id(cep->qp) : -1, type, delay);
1221 struct siw_cep *cep;
1225 cep = sk_to_cep(sk);
1226 if (!cep)
1229 siw_dbg_cep(cep, "cep state: %d, socket state %d\n",
1230 cep->state, sk->sk_state);
1235 switch (cep->state) {
1242 siw_cm_queue_work(cep, SIW_CM_WORK_READ_MPAHDR);
1246 siw_dbg_cep(cep, "unexpected data, state %d\n", cep->state);
1255 struct siw_cep *cep = sk_to_cep(sk);
1257 if (cep)
1258 siw_dbg_cep(cep, "state: %d\n", cep->state);
1263 struct siw_cep *cep = sk_to_cep(sk);
1265 if (cep) {
1266 siw_dbg_cep(cep, "error %d, socket state: %d, cep state: %d\n",
1267 sk->sk_err, sk->sk_state, cep->state);
1268 cep->sk_error_report(sk);
1274 struct siw_cep *cep;
1279 cep = sk_to_cep(sk);
1280 if (!cep) {
1285 orig_state_change = cep->sk_state_change;
1287 siw_dbg_cep(cep, "state: %d\n", cep->state);
1295 siw_cm_queue_work(cep, SIW_CM_WORK_ACCEPT);
1300 if (cep->qp)
1301 cep->qp->tx_ctx.tx_suspend = 1;
1302 siw_cm_queue_work(cep, SIW_CM_WORK_PEER_CLOSE);
1306 siw_dbg_cep(cep, "unexpected socket state %d\n", sk->sk_state);
1337 struct siw_cep *cep = NULL;
1391 cep = siw_cep_alloc(sdev);
1392 if (!cep) {
1396 siw_cep_set_inuse(cep);
1399 siw_cep_get(cep);
1400 qp->cep = cep;
1403 cep->qp = qp;
1406 cep->cm_id = id;
1413 rv = siw_cm_alloc_work(cep, 4);
1418 cep->ird = params->ird;
1419 cep->ord = params->ord;
1421 if (p2p_mode && cep->ord == 0)
1422 cep->ord = 1;
1424 cep->state = SIW_EPSTATE_CONNECTING;
1429 siw_cep_socket_assoc(cep, s);
1431 cep->state = SIW_EPSTATE_AWAIT_MPAREP;
1437 cep->mpa.hdr.params.bits = 0;
1444 __mpa_rr_set_revision(&cep->mpa.hdr.params.bits, version);
1447 cep->mpa.hdr.params.bits |= MPA_RR_FLAG_GSO_EXP;
1450 cep->mpa.hdr.params.bits |= MPA_RR_FLAG_CRC;
1459 cep->enhanced_rdma_conn_est = true;
1460 cep->mpa.hdr.params.bits |= MPA_RR_FLAG_ENHANCED;
1462 cep->mpa.v2_ctrl.ird = htons(cep->ird);
1463 cep->mpa.v2_ctrl.ord = htons(cep->ord);
1466 cep->mpa.v2_ctrl.ird |= MPA_V2_PEER_TO_PEER;
1467 cep->mpa.v2_ctrl.ord |= rtr_type;
1470 cep->mpa.v2_ctrl_req.ird = cep->mpa.v2_ctrl.ird;
1471 cep->mpa.v2_ctrl_req.ord = cep->mpa.v2_ctrl.ord;
1473 memcpy(cep->mpa.hdr.key, MPA_KEY_REQ, 16);
1475 rv = siw_send_mpareqrep(cep, params->private_data, pd_len);
1479 cep->mpa.hdr.params.pd_len = 0;
1482 rv = siw_cm_queue_work(cep, SIW_CM_WORK_MPATIMEOUT);
1484 siw_dbg_cep(cep, "[QP %u]: exit\n", qp_id(qp));
1485 siw_cep_set_free(cep);
1492 if (cep) {
1495 cep->sock = NULL;
1497 cep->qp = NULL;
1499 cep->cm_id = NULL;
1502 qp->cep = NULL;
1503 siw_cep_put(cep);
1505 cep->state = SIW_EPSTATE_CLOSED;
1507 siw_cep_set_free(cep);
1509 siw_cep_put(cep);
1537 struct siw_cep *cep = (struct siw_cep *)id->provider_data;
1543 siw_cep_set_inuse(cep);
1544 siw_cep_put(cep);
1547 if (cep->mpa.hdr.params.pd_len) {
1548 cep->mpa.hdr.params.pd_len = 0;
1549 kfree(cep->mpa.pdata);
1550 cep->mpa.pdata = NULL;
1552 siw_cancel_mpatimer(cep);
1554 if (cep->state != SIW_EPSTATE_RECVD_MPAREQ) {
1555 siw_dbg_cep(cep, "out of state\n");
1557 siw_cep_set_free(cep);
1558 siw_cep_put(cep);
1565 siw_cep_set_free(cep);
1566 siw_cep_put(cep);
1576 siw_dbg_cep(cep, "[QP %d]\n", params->qpn);
1578 if (try_gso && cep->mpa.hdr.params.bits & MPA_RR_FLAG_GSO_EXP) {
1579 siw_dbg_cep(cep, "peer allows GSO on TX\n");
1585 cep,
1593 if (cep->enhanced_rdma_conn_est)
1598 cep,
1605 if (cep->enhanced_rdma_conn_est) {
1606 if (params->ord > cep->ord) {
1608 params->ord = cep->ord;
1610 cep->ird = params->ird;
1611 cep->ord = params->ord;
1617 if (params->ird < cep->ird) {
1619 cep->ird <= sdev->attrs.max_ird)
1620 params->ird = cep->ird;
1627 if (cep->mpa.v2_ctrl.ord &
1633 cep->mpa.v2_ctrl.ord =
1635 (cep->mpa.v2_ctrl.ord & ~MPA_V2_MASK_IRD_ORD);
1636 cep->mpa.v2_ctrl.ird =
1638 (cep->mpa.v2_ctrl.ird & ~MPA_V2_MASK_IRD_ORD);
1640 cep->ird = params->ird;
1641 cep->ord = params->ord;
1643 cep->cm_id = id;
1647 qp_attrs.orq_size = cep->ord;
1648 qp_attrs.irq_size = cep->ird;
1649 qp_attrs.sk = cep->sock;
1650 if (cep->mpa.hdr.params.bits & MPA_RR_FLAG_CRC)
1654 siw_dbg_cep(cep, "[QP%u]: moving to rts\n", qp_id(qp));
1657 siw_cep_get(cep);
1658 qp->cep = cep;
1661 cep->qp = qp;
1663 cep->state = SIW_EPSTATE_RDMA_MODE;
1675 siw_dbg_cep(cep, "[QP %u]: send mpa reply, %d byte pdata\n",
1678 rv = siw_send_mpareqrep(cep, params->private_data,
1684 siw_sk_assign_rtr_upcalls(cep);
1686 siw_qp_socket_assoc(cep, qp);
1687 rv = siw_cm_upcall(cep, IW_CM_EVENT_ESTABLISHED, 0);
1691 siw_cep_set_free(cep);
1695 siw_socket_disassoc(cep->sock);
1696 sock_release(cep->sock);
1697 cep->sock = NULL;
1699 cep->state = SIW_EPSTATE_CLOSED;
1701 if (cep->cm_id) {
1702 cep->cm_id->rem_ref(id);
1703 cep->cm_id = NULL;
1705 if (qp->cep) {
1706 siw_cep_put(cep);
1707 qp->cep = NULL;
1709 cep->qp = NULL;
1712 siw_cep_set_free(cep);
1713 siw_cep_put(cep);
1726 struct siw_cep *cep = (struct siw_cep *)id->provider_data;
1728 siw_cep_set_inuse(cep);
1729 siw_cep_put(cep);
1731 siw_cancel_mpatimer(cep);
1733 if (cep->state != SIW_EPSTATE_RECVD_MPAREQ) {
1734 siw_dbg_cep(cep, "out of state\n");
1736 siw_cep_set_free(cep);
1737 siw_cep_put(cep); /* put last reference */
1741 siw_dbg_cep(cep, "cep->state %d, pd_len %d\n", cep->state,
1744 if (__mpa_rr_revision(cep->mpa.hdr.params.bits) >= MPA_REVISION_1) {
1745 cep->mpa.hdr.params.bits |= MPA_RR_FLAG_REJECT; /* reject */
1746 siw_send_mpareqrep(cep, pdata, pd_len);
1748 siw_socket_disassoc(cep->sock);
1749 sock_release(cep->sock);
1750 cep->sock = NULL;
1752 cep->state = SIW_EPSTATE_CLOSED;
1754 siw_cep_set_free(cep);
1755 siw_cep_put(cep);
1769 struct siw_cep *cep = NULL;
1809 cep = siw_cep_alloc(sdev);
1810 if (!cep) {
1814 siw_cep_socket_assoc(cep, s);
1816 rv = siw_cm_alloc_work(cep, backlog);
1828 cep->cm_id = id;
1843 * - siw_cm_upcall() setting event.provider_data = cep and
1860 list_add_tail(&cep->listenq, (struct list_head *)id->provider_data);
1861 cep->state = SIW_EPSTATE_LISTENING;
1870 if (cep) {
1871 siw_cep_set_inuse(cep);
1873 if (cep->cm_id) {
1874 cep->cm_id->rem_ref(cep->cm_id);
1875 cep->cm_id = NULL;
1877 cep->sock = NULL;
1879 cep->state = SIW_EPSTATE_CLOSED;
1881 siw_cep_set_free(cep);
1882 siw_cep_put(cep);
1898 struct siw_cep *cep = list_entry(p, struct siw_cep, listenq);
1902 siw_dbg_cep(cep, "drop cep, state %d\n", cep->state);
1904 siw_cep_set_inuse(cep);
1906 if (cep->cm_id) {
1907 cep->cm_id->rem_ref(cep->cm_id);
1908 cep->cm_id = NULL;
1910 if (cep->sock) {
1911 siw_socket_disassoc(cep->sock);
1912 sock_release(cep->sock);
1913 cep->sock = NULL;
1915 cep->state = SIW_EPSTATE_CLOSED;
1916 siw_cep_set_free(cep);
1917 siw_cep_put(cep);
1924 siw_dbg(id->device, "no cep(s)\n");