Lines Matching refs:cep

39 static int siw_cm_upcall(struct siw_cep *cep, enum iw_cm_event_type reason,
54 struct siw_cep *cep = sk_to_cep(sk);
57 cep->sk_state_change = sk->sk_state_change;
58 cep->sk_data_ready = sk->sk_data_ready;
59 cep->sk_write_space = sk->sk_write_space;
60 cep->sk_error_report = sk->sk_error_report;
64 static void siw_sk_restore_upcalls(struct sock *sk, struct siw_cep *cep)
66 sk->sk_state_change = cep->sk_state_change;
67 sk->sk_data_ready = cep->sk_data_ready;
68 sk->sk_write_space = cep->sk_write_space;
69 sk->sk_error_report = cep->sk_error_report;
73 static void siw_qp_socket_assoc(struct siw_cep *cep, struct siw_qp *qp)
75 struct socket *s = cep->sock;
90 struct siw_cep *cep;
94 cep = sk_to_cep(sk);
95 if (cep) {
96 siw_sk_restore_upcalls(sk, cep);
97 siw_cep_put(cep);
109 struct siw_cep *cep;
117 cep = sk_to_cep(sk);
118 if (!cep) {
136 siw_cm_upcall(cep, IW_CM_EVENT_ESTABLISHED, 0);
140 siw_qp_socket_assoc(cep, qp);
143 static void siw_sk_assign_rtr_upcalls(struct siw_cep *cep)
145 struct sock *sk = cep->sock->sk;
153 static void siw_cep_socket_assoc(struct siw_cep *cep, struct socket *s)
155 cep->sock = s;
156 siw_cep_get(cep);
157 s->sk->sk_user_data = cep;
165 struct siw_cep *cep = kzalloc(sizeof(*cep), GFP_KERNEL);
168 if (!cep)
171 INIT_LIST_HEAD(&cep->listenq);
172 INIT_LIST_HEAD(&cep->devq);
173 INIT_LIST_HEAD(&cep->work_freelist);
175 kref_init(&cep->ref);
176 cep->state = SIW_EPSTATE_IDLE;
177 init_waitqueue_head(&cep->waitq);
178 spin_lock_init(&cep->lock);
179 cep->sdev = sdev;
180 cep->enhanced_rdma_conn_est = false;
183 list_add_tail(&cep->devq, &sdev->cep_list);
186 siw_dbg_cep(cep, "new endpoint\n");
187 return cep;
190 static void siw_cm_free_work(struct siw_cep *cep)
195 list_for_each_safe(w, tmp, &cep->work_freelist) {
202 static void siw_cancel_mpatimer(struct siw_cep *cep)
204 spin_lock_bh(&cep->lock);
205 if (cep->mpa_timer) {
206 if (cancel_delayed_work(&cep->mpa_timer->work)) {
207 siw_cep_put(cep);
208 kfree(cep->mpa_timer); /* not needed again */
210 cep->mpa_timer = NULL;
212 spin_unlock_bh(&cep->lock);
218 spin_lock_bh(&work->cep->lock);
219 list_add(&work->list, &work->cep->work_freelist);
220 spin_unlock_bh(&work->cep->lock);
223 static void siw_cep_set_inuse(struct siw_cep *cep)
227 spin_lock_irqsave(&cep->lock, flags);
229 if (cep->in_use) {
230 spin_unlock_irqrestore(&cep->lock, flags);
231 wait_event_interruptible(cep->waitq, !cep->in_use);
236 cep->in_use = 1;
237 spin_unlock_irqrestore(&cep->lock, flags);
241 static void siw_cep_set_free(struct siw_cep *cep)
245 spin_lock_irqsave(&cep->lock, flags);
246 cep->in_use = 0;
247 spin_unlock_irqrestore(&cep->lock, flags);
249 wake_up(&cep->waitq);
254 struct siw_cep *cep = container_of(ref, struct siw_cep, ref);
255 struct siw_device *sdev = cep->sdev;
258 WARN_ON(cep->listen_cep);
261 kfree(cep->mpa.pdata);
262 spin_lock_bh(&cep->lock);
263 if (!list_empty(&cep->work_freelist))
264 siw_cm_free_work(cep);
265 spin_unlock_bh(&cep->lock);
268 list_del(&cep->devq);
271 siw_dbg_cep(cep, "free endpoint\n");
272 kfree(cep);
275 static struct siw_cm_work *siw_get_work(struct siw_cep *cep)
279 spin_lock_bh(&cep->lock);
280 if (!list_empty(&cep->work_freelist)) {
281 work = list_entry(cep->work_freelist.next, struct siw_cm_work,
285 spin_unlock_bh(&cep->lock);
289 static int siw_cm_alloc_work(struct siw_cep *cep, int num)
296 if (!(list_empty(&cep->work_freelist)))
297 siw_cm_free_work(cep);
300 work->cep = cep;
302 list_add(&work->list, &cep->work_freelist);
312 static int siw_cm_upcall(struct siw_cep *cep, enum iw_cm_event_type reason,
323 event.provider_data = cep;
324 id = cep->listen_cep->cm_id;
326 id = cep->cm_id;
332 event.ird = cep->ird;
333 event.ord = cep->ord;
335 event.ird = cep->ord;
336 event.ord = cep->ird;
341 u16 pd_len = be16_to_cpu(cep->mpa.hdr.params.pd_len);
348 event.private_data = cep->mpa.pdata;
351 if (cep->enhanced_rdma_conn_est) {
358 getname_local(cep->sock, &event.local_addr);
359 getname_peer(cep->sock, &event.remote_addr);
361 siw_dbg_cep(cep, "[QP %u]: reason=%d, status=%d\n",
362 cep->qp ? qp_id(cep->qp) : UINT_MAX, reason, status);
377 struct siw_cep *cep = qp->cep;
382 if (!qp->cep)
386 siw_cm_queue_work(cep, SIW_CM_WORK_CLOSE_LLP);
388 siw_cep_set_inuse(cep);
390 if (cep->state == SIW_EPSTATE_CLOSED) {
391 siw_dbg_cep(cep, "already closed\n");
394 siw_dbg_cep(cep, "immediate close, state %d\n", cep->state);
399 if (cep->cm_id) {
400 switch (cep->state) {
402 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
407 siw_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
419 cep->cm_id->rem_ref(cep->cm_id);
420 cep->cm_id = NULL;
421 siw_cep_put(cep);
423 cep->state = SIW_EPSTATE_CLOSED;
425 if (cep->sock) {
426 siw_socket_disassoc(cep->sock);
430 sock_release(cep->sock);
431 cep->sock = NULL;
433 if (cep->qp) {
434 cep->qp = NULL;
438 siw_cep_set_free(cep);
442 void siw_cep_put(struct siw_cep *cep)
444 WARN_ON(kref_read(&cep->ref) < 1);
445 kref_put(&cep->ref, __siw_cep_dealloc);
448 void siw_cep_get(struct siw_cep *cep)
450 kref_get(&cep->ref);
456 static int siw_send_mpareqrep(struct siw_cep *cep, const void *pdata, u8 pd_len)
458 struct socket *s = cep->sock;
459 struct mpa_rr *rr = &cep->mpa.hdr;
472 if (cep->enhanced_rdma_conn_est) {
474 iov[iovec_num].iov_base = &cep->mpa.v2_ctrl;
475 iov[iovec_num].iov_len = sizeof(cep->mpa.v2_ctrl);
476 mpa_len += sizeof(cep->mpa.v2_ctrl);
484 if (cep->enhanced_rdma_conn_est)
485 pd_len += sizeof(cep->mpa.v2_ctrl);
503 static int siw_recv_mpa_rr(struct siw_cep *cep)
505 struct mpa_rr *hdr = &cep->mpa.hdr;
506 struct socket *s = cep->sock;
510 if (cep->mpa.bytes_rcvd < sizeof(struct mpa_rr)) {
511 rcvd = ksock_recv(s, (char *)hdr + cep->mpa.bytes_rcvd,
512 sizeof(struct mpa_rr) - cep->mpa.bytes_rcvd,
517 cep->mpa.bytes_rcvd += rcvd;
519 if (cep->mpa.bytes_rcvd < sizeof(struct mpa_rr))
532 to_rcv = pd_len - (cep->mpa.bytes_rcvd - sizeof(struct mpa_rr));
547 siw_dbg_cep(cep, "peer EOF\n");
551 siw_dbg_cep(cep, "error: %d\n", rcvd);
554 siw_dbg_cep(cep, "peer sent extra data: %d\n", rcvd);
563 if (!cep->mpa.pdata) {
564 cep->mpa.pdata = kmalloc(pd_len + 4, GFP_KERNEL);
565 if (!cep->mpa.pdata)
569 s, cep->mpa.pdata + cep->mpa.bytes_rcvd - sizeof(struct mpa_rr),
578 cep->mpa.bytes_rcvd += rcvd;
581 siw_dbg_cep(cep, "%d bytes private data received\n", pd_len);
593 static int siw_proc_mpareq(struct siw_cep *cep)
599 rv = siw_recv_mpa_rr(cep);
603 req = &cep->mpa.hdr;
628 cep->enhanced_rdma_conn_est = true;
649 if (cep->enhanced_rdma_conn_est) {
650 struct mpa_v2_data *v2 = (struct mpa_v2_data *)cep->mpa.pdata;
657 cep->ord = ntohs(v2->ird) & MPA_IRD_ORD_MASK;
658 cep->ord = min(cep->ord, SIW_MAX_ORD_QP);
659 cep->ird = ntohs(v2->ord) & MPA_IRD_ORD_MASK;
660 cep->ird = min(cep->ird, SIW_MAX_IRD_QP);
663 cep->mpa.v2_ctrl.ird = htons(cep->ird);
664 cep->mpa.v2_ctrl.ord = htons(cep->ord);
675 cep->mpa.v2_ctrl.ird |= MPA_V2_PEER_TO_PEER;
678 cep->mpa.v2_ctrl.ord |= MPA_V2_RDMA_WRITE_RTR;
680 cep->mpa.v2_ctrl.ord |= MPA_V2_RDMA_READ_RTR;
682 cep->mpa.v2_ctrl.ord |= MPA_V2_RDMA_WRITE_RTR;
686 cep->state = SIW_EPSTATE_RECVD_MPAREQ;
689 siw_cep_get(cep);
690 rv = siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REQUEST, 0);
692 siw_cep_put(cep);
697 siw_dbg_cep(cep, "reject: crc %d:%d:%d, m %d:%d\n",
709 kfree(cep->mpa.pdata);
711 cep->mpa.pdata = NULL;
713 siw_send_mpareqrep(cep, NULL, 0);
718 static int siw_proc_mpareply(struct siw_cep *cep)
722 struct siw_qp *qp = cep->qp;
730 rv = siw_recv_mpa_rr(cep);
734 siw_cancel_mpatimer(cep);
736 rep = &cep->mpa.hdr;
751 siw_dbg_cep(cep, "got mpa reject\n");
752 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -ECONNRESET);
757 siw_dbg_cep(cep, "peer allows GSO on TX\n");
764 siw_dbg_cep(cep, "reply unsupp: crc %d:%d:%d, m %d:%d\n",
769 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -ECONNREFUSED);
773 if (cep->enhanced_rdma_conn_est) {
782 siw_dbg_cep(cep, "mpa reply error: vers %d, enhcd %d\n",
788 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
792 v2 = (struct mpa_v2_data *)cep->mpa.pdata;
796 if (cep->ird < rep_ord &&
798 rep_ord > cep->sdev->attrs.max_ird)) {
799 siw_dbg_cep(cep, "ird %d, rep_ord %d, max_ord %d\n",
800 cep->ird, rep_ord,
801 cep->sdev->attrs.max_ord);
804 if (cep->ord > rep_ird && relaxed_ird_negotiation == false) {
805 siw_dbg_cep(cep, "ord %d, rep_ird %d\n", cep->ord,
813 cep->ird = rep_ord;
814 cep->ord = rep_ird;
828 if (cep->mpa.v2_ctrl_req.ird & MPA_V2_PEER_TO_PEER)
830 cep->mpa.v2_ctrl_req.ord &
842 siw_dbg_cep(cep,
865 qp_attrs.irq_size = cep->ird;
866 qp_attrs.orq_size = cep->ord;
867 qp_attrs.sk = cep->sock;
882 siw_qp_socket_assoc(cep, qp);
893 rv = siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, 0);
895 cep->state = SIW_EPSTATE_RDMA_MODE;
902 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -EINVAL);
911 static void siw_accept_newconn(struct siw_cep *cep)
913 struct socket *s = cep->sock;
918 if (cep->state != SIW_EPSTATE_LISTENING)
921 new_cep = siw_cep_alloc(cep->sdev);
937 new_cep->sk_state_change = cep->sk_state_change;
938 new_cep->sk_data_ready = cep->sk_data_ready;
939 new_cep->sk_write_space = cep->sk_write_space;
940 new_cep->sk_error_report = cep->sk_error_report;
947 siw_dbg_cep(cep, "kernel_accept() error: %d\n", rv);
964 new_cep->listen_cep = cep;
965 siw_cep_get(cep);
971 siw_dbg_cep(cep, "immediate mpa request\n");
976 siw_cep_put(cep);
997 siw_dbg_cep(cep, "error %d\n", rv);
1003 struct siw_cep *cep;
1007 cep = work->cep;
1009 siw_dbg_cep(cep, "[QP %u]: work type: %d, state %d\n",
1010 cep->qp ? qp_id(cep->qp) : UINT_MAX,
1011 work->type, cep->state);
1013 siw_cep_set_inuse(cep);
1017 siw_accept_newconn(cep);
1021 if (cep->state == SIW_EPSTATE_AWAIT_MPAREQ) {
1022 if (cep->listen_cep) {
1023 siw_cep_set_inuse(cep->listen_cep);
1025 if (cep->listen_cep->state ==
1027 rv = siw_proc_mpareq(cep);
1031 siw_cep_set_free(cep->listen_cep);
1034 siw_cep_put(cep->listen_cep);
1035 cep->listen_cep = NULL;
1037 siw_cep_put(cep);
1040 } else if (cep->state == SIW_EPSTATE_AWAIT_MPAREP) {
1041 rv = siw_proc_mpareply(cep);
1048 if (cep->state == SIW_EPSTATE_RDMA_MODE) {
1049 cep->sock->sk->sk_data_ready(cep->sock->sk);
1050 siw_dbg_cep(cep, "already in RDMA mode");
1052 siw_dbg_cep(cep, "out of state: %d\n",
1053 cep->state);
1064 if (cep->qp && cep->qp->term_info.valid)
1065 siw_send_terminate(cep->qp);
1067 if (cep->cm_id)
1068 siw_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
1074 if (cep->cm_id) {
1075 if (cep->state == SIW_EPSTATE_AWAIT_MPAREP) {
1079 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
1081 } else if (cep->state == SIW_EPSTATE_RDMA_MODE) {
1086 siw_cm_upcall(cep, IW_CM_EVENT_DISCONNECT, 0);
1087 siw_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
1094 if (cep->state == SIW_EPSTATE_RECVD_MPAREQ) {
1098 siw_dbg_cep(cep,
1100 } else if (cep->state == SIW_EPSTATE_AWAIT_MPAREQ) {
1104 if (cep->listen_cep) {
1105 siw_dbg_cep(cep,
1107 siw_cep_put(cep->listen_cep);
1108 cep->listen_cep = NULL;
1116 cep->mpa_timer = NULL;
1118 if (cep->state == SIW_EPSTATE_AWAIT_MPAREP) {
1124 cep->mpa.hdr.params.pd_len = 0;
1126 if (cep->cm_id)
1127 siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
1131 } else if (cep->state == SIW_EPSTATE_AWAIT_MPAREQ) {
1135 if (cep->listen_cep) {
1136 siw_cep_put(cep->listen_cep);
1137 cep->listen_cep = NULL;
1147 siw_dbg_cep(cep,
1149 cep->mpa_timer ? "y" : "n",
1150 cep->qp ? qp_id(cep->qp) : UINT_MAX);
1152 siw_cancel_mpatimer(cep);
1154 cep->state = SIW_EPSTATE_CLOSED;
1156 if (cep->qp) {
1157 struct siw_qp *qp = cep->qp;
1163 siw_cep_set_free(cep);
1168 siw_cep_set_inuse(cep);
1169 cep->qp = NULL;
1172 if (cep->sock) {
1173 siw_socket_disassoc(cep->sock);
1174 sock_release(cep->sock);
1175 cep->sock = NULL;
1177 if (cep->cm_id) {
1178 cep->cm_id->rem_ref(cep->cm_id);
1179 cep->cm_id = NULL;
1180 siw_cep_put(cep);
1183 siw_cep_set_free(cep);
1185 siw_cep_put(cep);
1190 int siw_cm_queue_work(struct siw_cep *cep, enum siw_work_type type)
1192 struct siw_cm_work *work = siw_get_work(cep);
1196 siw_dbg_cep(cep, "failed with no work available\n");
1200 work->cep = cep;
1202 siw_cep_get(cep);
1207 cep->mpa_timer = work;
1209 if (cep->state == SIW_EPSTATE_AWAIT_MPAREP)
1214 siw_dbg_cep(cep, "[QP %u]: work type: %d, timeout %lu\n",
1215 cep->qp ? qp_id(cep->qp) : -1, type, delay);
1224 struct siw_cep *cep;
1230 cep = sk_to_cep(sk);
1231 if (!cep)
1234 siw_dbg_cep(cep, "cep state: %d, socket state %d\n",
1235 cep->state, sk->sk_state);
1240 switch (cep->state) {
1247 siw_cm_queue_work(cep, SIW_CM_WORK_READ_MPAHDR);
1251 siw_dbg_cep(cep, "unexpected data, state %d\n", cep->state);
1260 struct siw_cep *cep = sk_to_cep(sk);
1262 if (cep)
1263 siw_dbg_cep(cep, "state: %d\n", cep->state);
1268 struct siw_cep *cep = sk_to_cep(sk);
1270 if (cep) {
1271 siw_dbg_cep(cep, "error %d, socket state: %d, cep state: %d\n",
1272 sk->sk_err, sk->sk_state, cep->state);
1273 cep->sk_error_report(sk);
1279 struct siw_cep *cep;
1284 cep = sk_to_cep(sk);
1285 if (!cep) {
1290 orig_state_change = cep->sk_state_change;
1292 siw_dbg_cep(cep, "state: %d\n", cep->state);
1300 siw_cm_queue_work(cep, SIW_CM_WORK_ACCEPT);
1305 if (cep->qp)
1306 cep->qp->tx_ctx.tx_suspend = 1;
1307 siw_cm_queue_work(cep, SIW_CM_WORK_PEER_CLOSE);
1311 siw_dbg_cep(cep, "unexpected socket state %d\n", sk->sk_state);
1348 struct siw_cep *cep = NULL;
1402 cep = siw_cep_alloc(sdev);
1403 if (!cep) {
1407 siw_cep_set_inuse(cep);
1410 siw_cep_get(cep);
1411 qp->cep = cep;
1414 cep->qp = qp;
1417 cep->cm_id = id;
1424 rv = siw_cm_alloc_work(cep, 4);
1429 cep->ird = params->ird;
1430 cep->ord = params->ord;
1432 if (p2p_mode && cep->ord == 0)
1433 cep->ord = 1;
1435 cep->state = SIW_EPSTATE_CONNECTING;
1440 siw_cep_socket_assoc(cep, s);
1442 cep->state = SIW_EPSTATE_AWAIT_MPAREP;
1448 cep->mpa.hdr.params.bits = 0;
1455 __mpa_rr_set_revision(&cep->mpa.hdr.params.bits, version);
1458 cep->mpa.hdr.params.bits |= MPA_RR_FLAG_GSO_EXP;
1461 cep->mpa.hdr.params.bits |= MPA_RR_FLAG_CRC;
1470 cep->enhanced_rdma_conn_est = true;
1471 cep->mpa.hdr.params.bits |= MPA_RR_FLAG_ENHANCED;
1473 cep->mpa.v2_ctrl.ird = htons(cep->ird);
1474 cep->mpa.v2_ctrl.ord = htons(cep->ord);
1477 cep->mpa.v2_ctrl.ird |= MPA_V2_PEER_TO_PEER;
1478 cep->mpa.v2_ctrl.ord |= rtr_type;
1481 cep->mpa.v2_ctrl_req.ird = cep->mpa.v2_ctrl.ird;
1482 cep->mpa.v2_ctrl_req.ord = cep->mpa.v2_ctrl.ord;
1484 memcpy(cep->mpa.hdr.key, MPA_KEY_REQ, 16);
1486 rv = siw_send_mpareqrep(cep, params->private_data, pd_len);
1490 cep->mpa.hdr.params.pd_len = 0;
1493 rv = siw_cm_queue_work(cep, SIW_CM_WORK_MPATIMEOUT);
1495 siw_dbg_cep(cep, "[QP %u]: exit\n", qp_id(qp));
1496 siw_cep_set_free(cep);
1503 if (cep) {
1506 cep->sock = NULL;
1508 cep->qp = NULL;
1510 cep->cm_id = NULL;
1513 qp->cep = NULL;
1514 siw_cep_put(cep);
1516 cep->state = SIW_EPSTATE_CLOSED;
1518 siw_cep_set_free(cep);
1520 siw_cep_put(cep);
1548 struct siw_cep *cep = (struct siw_cep *)id->provider_data;
1554 siw_cep_set_inuse(cep);
1555 siw_cep_put(cep);
1558 if (cep->mpa.hdr.params.pd_len) {
1559 cep->mpa.hdr.params.pd_len = 0;
1560 kfree(cep->mpa.pdata);
1561 cep->mpa.pdata = NULL;
1563 siw_cancel_mpatimer(cep);
1565 if (cep->state != SIW_EPSTATE_RECVD_MPAREQ) {
1566 siw_dbg_cep(cep, "out of state\n");
1568 siw_cep_set_free(cep);
1569 siw_cep_put(cep);
1576 siw_cep_set_free(cep);
1577 siw_cep_put(cep);
1587 siw_dbg_cep(cep, "[QP %d]\n", params->qpn);
1589 if (try_gso && cep->mpa.hdr.params.bits & MPA_RR_FLAG_GSO_EXP) {
1590 siw_dbg_cep(cep, "peer allows GSO on TX\n");
1596 cep,
1604 if (cep->enhanced_rdma_conn_est)
1609 cep,
1616 if (cep->enhanced_rdma_conn_est) {
1617 if (params->ord > cep->ord) {
1619 params->ord = cep->ord;
1621 cep->ird = params->ird;
1622 cep->ord = params->ord;
1628 if (params->ird < cep->ird) {
1630 cep->ird <= sdev->attrs.max_ird)
1631 params->ird = cep->ird;
1638 if (cep->mpa.v2_ctrl.ord &
1644 cep->mpa.v2_ctrl.ord =
1646 (cep->mpa.v2_ctrl.ord & ~MPA_V2_MASK_IRD_ORD);
1647 cep->mpa.v2_ctrl.ird =
1649 (cep->mpa.v2_ctrl.ird & ~MPA_V2_MASK_IRD_ORD);
1651 cep->ird = params->ird;
1652 cep->ord = params->ord;
1654 cep->cm_id = id;
1658 qp_attrs.orq_size = cep->ord;
1659 qp_attrs.irq_size = cep->ird;
1660 qp_attrs.sk = cep->sock;
1661 if (cep->mpa.hdr.params.bits & MPA_RR_FLAG_CRC)
1665 siw_dbg_cep(cep, "[QP%u]: moving to rts\n", qp_id(qp));
1668 siw_cep_get(cep);
1669 qp->cep = cep;
1672 cep->qp = qp;
1674 cep->state = SIW_EPSTATE_RDMA_MODE;
1686 siw_dbg_cep(cep, "[QP %u]: send mpa reply, %d byte pdata\n",
1689 rv = siw_send_mpareqrep(cep, params->private_data,
1695 siw_sk_assign_rtr_upcalls(cep);
1697 siw_qp_socket_assoc(cep, qp);
1698 rv = siw_cm_upcall(cep, IW_CM_EVENT_ESTABLISHED, 0);
1702 siw_cep_set_free(cep);
1706 siw_socket_disassoc(cep->sock);
1707 sock_release(cep->sock);
1708 cep->sock = NULL;
1710 cep->state = SIW_EPSTATE_CLOSED;
1712 if (cep->cm_id) {
1713 cep->cm_id->rem_ref(id);
1714 cep->cm_id = NULL;
1716 if (qp->cep) {
1717 siw_cep_put(cep);
1718 qp->cep = NULL;
1720 cep->qp = NULL;
1723 siw_cep_set_free(cep);
1724 siw_cep_put(cep);
1737 struct siw_cep *cep = (struct siw_cep *)id->provider_data;
1739 siw_cep_set_inuse(cep);
1740 siw_cep_put(cep);
1742 siw_cancel_mpatimer(cep);
1744 if (cep->state != SIW_EPSTATE_RECVD_MPAREQ) {
1745 siw_dbg_cep(cep, "out of state\n");
1747 siw_cep_set_free(cep);
1748 siw_cep_put(cep); /* put last reference */
1752 siw_dbg_cep(cep, "cep->state %d, pd_len %d\n", cep->state,
1755 if (__mpa_rr_revision(cep->mpa.hdr.params.bits) >= MPA_REVISION_1) {
1756 cep->mpa.hdr.params.bits |= MPA_RR_FLAG_REJECT; /* reject */
1757 siw_send_mpareqrep(cep, pdata, pd_len);
1759 siw_socket_disassoc(cep->sock);
1760 sock_release(cep->sock);
1761 cep->sock = NULL;
1763 cep->state = SIW_EPSTATE_CLOSED;
1765 siw_cep_set_free(cep);
1766 siw_cep_put(cep);
1780 struct siw_cep *cep = NULL;
1829 cep = siw_cep_alloc(sdev);
1830 if (!cep) {
1834 siw_cep_socket_assoc(cep, s);
1836 rv = siw_cm_alloc_work(cep, backlog);
1848 cep->cm_id = id;
1863 * - siw_cm_upcall() setting event.provider_data = cep and
1880 list_add_tail(&cep->listenq, (struct list_head *)id->provider_data);
1881 cep->state = SIW_EPSTATE_LISTENING;
1890 if (cep) {
1891 siw_cep_set_inuse(cep);
1893 if (cep->cm_id) {
1894 cep->cm_id->rem_ref(cep->cm_id);
1895 cep->cm_id = NULL;
1897 cep->sock = NULL;
1899 cep->state = SIW_EPSTATE_CLOSED;
1901 siw_cep_set_free(cep);
1902 siw_cep_put(cep);
1918 struct siw_cep *cep = list_entry(p, struct siw_cep, listenq);
1922 siw_dbg_cep(cep, "drop cep, state %d\n", cep->state);
1924 siw_cep_set_inuse(cep);
1926 if (cep->cm_id) {
1927 cep->cm_id->rem_ref(cep->cm_id);
1928 cep->cm_id = NULL;
1930 if (cep->sock) {
1931 siw_socket_disassoc(cep->sock);
1932 sock_release(cep->sock);
1933 cep->sock = NULL;
1935 cep->state = SIW_EPSTATE_CLOSED;
1936 siw_cep_set_free(cep);
1937 siw_cep_put(cep);
1944 siw_dbg(id->device, "no cep(s)\n");