Lines Matching refs:cm_node
29 static void irdma_record_ird_ord(struct irdma_cm_node *cm_node, u32 conn_ird, in irdma_record_ird_ord() argument
32 if (conn_ird > cm_node->dev->hw_attrs.max_hw_ird) in irdma_record_ird_ord()
33 conn_ird = cm_node->dev->hw_attrs.max_hw_ird; in irdma_record_ird_ord()
35 if (conn_ord > cm_node->dev->hw_attrs.max_hw_ord) in irdma_record_ird_ord()
36 conn_ord = cm_node->dev->hw_attrs.max_hw_ord; in irdma_record_ird_ord()
37 else if (!conn_ord && cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO) in irdma_record_ird_ord()
39 cm_node->ird_size = conn_ird; in irdma_record_ird_ord()
40 cm_node->ord_size = conn_ord; in irdma_record_ird_ord()
74 static void irdma_get_addr_info(struct irdma_cm_node *cm_node, in irdma_get_addr_info() argument
78 cm_info->ipv4 = cm_node->ipv4; in irdma_get_addr_info()
79 cm_info->vlan_id = cm_node->vlan_id; in irdma_get_addr_info()
80 memcpy(cm_info->loc_addr, cm_node->loc_addr, sizeof(cm_info->loc_addr)); in irdma_get_addr_info()
81 memcpy(cm_info->rem_addr, cm_node->rem_addr, sizeof(cm_info->rem_addr)); in irdma_get_addr_info()
82 cm_info->loc_port = cm_node->loc_port; in irdma_get_addr_info()
83 cm_info->rem_port = cm_node->rem_port; in irdma_get_addr_info()
91 static inline void irdma_fill_sockaddr4(struct irdma_cm_node *cm_node, in irdma_fill_sockaddr4() argument
100 laddr->sin_port = htons(cm_node->loc_port); in irdma_fill_sockaddr4()
101 raddr->sin_port = htons(cm_node->rem_port); in irdma_fill_sockaddr4()
103 laddr->sin_addr.s_addr = htonl(cm_node->loc_addr[0]); in irdma_fill_sockaddr4()
104 raddr->sin_addr.s_addr = htonl(cm_node->rem_addr[0]); in irdma_fill_sockaddr4()
112 static inline void irdma_fill_sockaddr6(struct irdma_cm_node *cm_node, in irdma_fill_sockaddr6() argument
121 laddr6->sin6_port = htons(cm_node->loc_port); in irdma_fill_sockaddr6()
122 raddr6->sin6_port = htons(cm_node->rem_port); in irdma_fill_sockaddr6()
125 cm_node->loc_addr); in irdma_fill_sockaddr6()
127 cm_node->rem_addr); in irdma_fill_sockaddr6()
136 static inline void irdma_get_cmevent_info(struct irdma_cm_node *cm_node, in irdma_get_cmevent_info() argument
144 if (cm_node) { in irdma_get_cmevent_info()
145 event->private_data = cm_node->pdata_buf; in irdma_get_cmevent_info()
146 event->private_data_len = (u8)cm_node->pdata.size; in irdma_get_cmevent_info()
147 event->ird = cm_node->ird_size; in irdma_get_cmevent_info()
148 event->ord = cm_node->ord_size; in irdma_get_cmevent_info()
159 static int irdma_send_cm_event(struct irdma_cm_node *cm_node, in irdma_send_cm_event() argument
167 trace_irdma_send_cm_event(cm_node, cm_id, type, status, in irdma_send_cm_event()
170 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_send_cm_event()
172 cm_node, cm_id, cm_node->accelerated, cm_node->state, type, in irdma_send_cm_event()
177 if (cm_node->ipv4) in irdma_send_cm_event()
178 irdma_fill_sockaddr4(cm_node, &event); in irdma_send_cm_event()
180 irdma_fill_sockaddr6(cm_node, &event); in irdma_send_cm_event()
181 event.provider_data = cm_node; in irdma_send_cm_event()
182 event.private_data = cm_node->pdata_buf; in irdma_send_cm_event()
183 event.private_data_len = (u8)cm_node->pdata.size; in irdma_send_cm_event()
184 event.ird = cm_node->ird_size; in irdma_send_cm_event()
187 irdma_get_cmevent_info(cm_node, cm_id, &event); in irdma_send_cm_event()
190 event.ird = cm_node->ird_size; in irdma_send_cm_event()
191 event.ord = cm_node->ord_size; in irdma_send_cm_event()
196 if (!cm_node->accelerated) in irdma_send_cm_event()
197 wait_for_completion(&cm_node->establish_comp); in irdma_send_cm_event()
214 struct irdma_cm_node *cm_node; in irdma_timer_list_prep() local
217 hash_for_each_rcu(cm_core->cm_hash_tbl, bkt, cm_node, list) { in irdma_timer_list_prep()
218 if ((cm_node->close_entry || cm_node->send_entry) && in irdma_timer_list_prep()
219 refcount_inc_not_zero(&cm_node->refcnt)) in irdma_timer_list_prep()
220 list_add(&cm_node->timer_entry, timer_list); in irdma_timer_list_prep()
229 static struct irdma_cm_event *irdma_create_event(struct irdma_cm_node *cm_node, in irdma_create_event() argument
234 if (!cm_node->cm_id) in irdma_create_event()
243 event->cm_node = cm_node; in irdma_create_event()
244 memcpy(event->cm_info.rem_addr, cm_node->rem_addr, in irdma_create_event()
246 memcpy(event->cm_info.loc_addr, cm_node->loc_addr, in irdma_create_event()
248 event->cm_info.rem_port = cm_node->rem_port; in irdma_create_event()
249 event->cm_info.loc_port = cm_node->loc_port; in irdma_create_event()
250 event->cm_info.cm_id = cm_node->cm_id; in irdma_create_event()
251 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_create_event()
252 "CM: node=%p event=%p type=%u dst=%pI4 src=%pI4\n", cm_node, in irdma_create_event()
255 trace_irdma_create_event(cm_node, type, __builtin_return_address(0)); in irdma_create_event()
265 static void irdma_free_retrans_entry(struct irdma_cm_node *cm_node) in irdma_free_retrans_entry() argument
267 struct irdma_device *iwdev = cm_node->iwdev; in irdma_free_retrans_entry()
270 send_entry = cm_node->send_entry; in irdma_free_retrans_entry()
274 cm_node->send_entry = NULL; in irdma_free_retrans_entry()
277 refcount_dec(&cm_node->refcnt); in irdma_free_retrans_entry()
284 static void irdma_cleanup_retrans_entry(struct irdma_cm_node *cm_node) in irdma_cleanup_retrans_entry() argument
288 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in irdma_cleanup_retrans_entry()
289 irdma_free_retrans_entry(cm_node); in irdma_cleanup_retrans_entry()
290 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in irdma_cleanup_retrans_entry()
301 static struct irdma_puda_buf *irdma_form_ah_cm_frame(struct irdma_cm_node *cm_node, in irdma_form_ah_cm_frame() argument
308 struct irdma_sc_vsi *vsi = &cm_node->iwdev->vsi; in irdma_form_ah_cm_frame()
316 if (!cm_node->ah || !cm_node->ah->ah_info.ah_valid) { in irdma_form_ah_cm_frame()
317 ibdev_dbg(&cm_node->iwdev->ibdev, "CM: AH invalid\n"); in irdma_form_ah_cm_frame()
323 ibdev_dbg(&cm_node->iwdev->ibdev, "CM: SQ buf NULL\n"); in irdma_form_ah_cm_frame()
327 sqbuf->ah_id = cm_node->ah->ah_info.ah_idx; in irdma_form_ah_cm_frame()
344 sqbuf->scratch = cm_node; in irdma_form_ah_cm_frame()
349 tcph->source = htons(cm_node->loc_port); in irdma_form_ah_cm_frame()
350 tcph->dest = htons(cm_node->rem_port); in irdma_form_ah_cm_frame()
351 tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num); in irdma_form_ah_cm_frame()
354 cm_node->tcp_cntxt.loc_ack_num = cm_node->tcp_cntxt.rcv_nxt; in irdma_form_ah_cm_frame()
355 tcph->ack_seq = htonl(cm_node->tcp_cntxt.loc_ack_num); in irdma_form_ah_cm_frame()
362 cm_node->tcp_cntxt.loc_seq_num++; in irdma_form_ah_cm_frame()
365 cm_node->tcp_cntxt.loc_seq_num += hdr_len + pd_len; in irdma_form_ah_cm_frame()
369 cm_node->tcp_cntxt.loc_seq_num++; in irdma_form_ah_cm_frame()
378 tcph->window = htons(cm_node->tcp_cntxt.rcv_wnd); in irdma_form_ah_cm_frame()
410 static struct irdma_puda_buf *irdma_form_uda_cm_frame(struct irdma_cm_node *cm_node, in irdma_form_uda_cm_frame() argument
417 struct irdma_sc_vsi *vsi = &cm_node->iwdev->vsi; in irdma_form_uda_cm_frame()
447 if (cm_node->vlan_id < VLAN_N_VID) in irdma_form_uda_cm_frame()
450 if (cm_node->ipv4) in irdma_form_uda_cm_frame()
461 sqbuf->scratch = cm_node; in irdma_form_uda_cm_frame()
466 if (cm_node->do_lpb) in irdma_form_uda_cm_frame()
469 if (cm_node->ipv4) { in irdma_form_uda_cm_frame()
477 ether_addr_copy(ethh->h_dest, cm_node->rem_mac); in irdma_form_uda_cm_frame()
478 ether_addr_copy(ethh->h_source, cm_node->loc_mac); in irdma_form_uda_cm_frame()
479 if (cm_node->vlan_id < VLAN_N_VID) { in irdma_form_uda_cm_frame()
482 vtag = (cm_node->user_pri << VLAN_PRIO_SHIFT) | in irdma_form_uda_cm_frame()
483 cm_node->vlan_id; in irdma_form_uda_cm_frame()
494 iph->tos = cm_node->tos; in irdma_form_uda_cm_frame()
496 iph->id = htons(++cm_node->tcp_cntxt.loc_id); in irdma_form_uda_cm_frame()
501 iph->saddr = htonl(cm_node->loc_addr[0]); in irdma_form_uda_cm_frame()
502 iph->daddr = htonl(cm_node->rem_addr[0]); in irdma_form_uda_cm_frame()
510 ether_addr_copy(ethh->h_dest, cm_node->rem_mac); in irdma_form_uda_cm_frame()
511 ether_addr_copy(ethh->h_source, cm_node->loc_mac); in irdma_form_uda_cm_frame()
512 if (cm_node->vlan_id < VLAN_N_VID) { in irdma_form_uda_cm_frame()
515 vtag = (cm_node->user_pri << VLAN_PRIO_SHIFT) | in irdma_form_uda_cm_frame()
516 cm_node->vlan_id; in irdma_form_uda_cm_frame()
524 ip6h->priority = cm_node->tos >> 4; in irdma_form_uda_cm_frame()
525 ip6h->flow_lbl[0] = cm_node->tos << 4; in irdma_form_uda_cm_frame()
532 cm_node->loc_addr); in irdma_form_uda_cm_frame()
534 cm_node->rem_addr); in irdma_form_uda_cm_frame()
537 tcph->source = htons(cm_node->loc_port); in irdma_form_uda_cm_frame()
538 tcph->dest = htons(cm_node->rem_port); in irdma_form_uda_cm_frame()
539 tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num); in irdma_form_uda_cm_frame()
542 cm_node->tcp_cntxt.loc_ack_num = cm_node->tcp_cntxt.rcv_nxt; in irdma_form_uda_cm_frame()
543 tcph->ack_seq = htonl(cm_node->tcp_cntxt.loc_ack_num); in irdma_form_uda_cm_frame()
550 cm_node->tcp_cntxt.loc_seq_num++; in irdma_form_uda_cm_frame()
553 cm_node->tcp_cntxt.loc_seq_num += hdr_len + pd_len; in irdma_form_uda_cm_frame()
557 cm_node->tcp_cntxt.loc_seq_num++; in irdma_form_uda_cm_frame()
566 tcph->window = htons(cm_node->tcp_cntxt.rcv_wnd); in irdma_form_uda_cm_frame()
593 int irdma_send_reset(struct irdma_cm_node *cm_node) in irdma_send_reset() argument
598 trace_irdma_send_reset(cm_node, 0, __builtin_return_address(0)); in irdma_send_reset()
599 sqbuf = cm_node->cm_core->form_cm_frame(cm_node, NULL, NULL, NULL, in irdma_send_reset()
604 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_send_reset()
606 __builtin_return_address(0), cm_node, cm_node->cm_id, in irdma_send_reset()
607 cm_node->accelerated, cm_node->state, cm_node->rem_port, in irdma_send_reset()
608 cm_node->loc_port, cm_node->rem_addr, cm_node->loc_addr); in irdma_send_reset()
610 return irdma_schedule_cm_timer(cm_node, sqbuf, IRDMA_TIMER_TYPE_SEND, 0, in irdma_send_reset()
619 static void irdma_active_open_err(struct irdma_cm_node *cm_node, bool reset) in irdma_active_open_err() argument
621 trace_irdma_active_open_err(cm_node, reset, in irdma_active_open_err()
623 irdma_cleanup_retrans_entry(cm_node); in irdma_active_open_err()
624 cm_node->cm_core->stats_connect_errs++; in irdma_active_open_err()
626 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_active_open_err()
627 "CM: cm_node=%p state=%d\n", cm_node, in irdma_active_open_err()
628 cm_node->state); in irdma_active_open_err()
629 refcount_inc(&cm_node->refcnt); in irdma_active_open_err()
630 irdma_send_reset(cm_node); in irdma_active_open_err()
633 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_active_open_err()
634 irdma_create_event(cm_node, IRDMA_CM_EVENT_ABORTED); in irdma_active_open_err()
642 static void irdma_passive_open_err(struct irdma_cm_node *cm_node, bool reset) in irdma_passive_open_err() argument
644 irdma_cleanup_retrans_entry(cm_node); in irdma_passive_open_err()
645 cm_node->cm_core->stats_passive_errs++; in irdma_passive_open_err()
646 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_passive_open_err()
647 ibdev_dbg(&cm_node->iwdev->ibdev, "CM: cm_node=%p state =%d\n", in irdma_passive_open_err()
648 cm_node, cm_node->state); in irdma_passive_open_err()
649 trace_irdma_passive_open_err(cm_node, reset, in irdma_passive_open_err()
652 irdma_send_reset(cm_node); in irdma_passive_open_err()
654 irdma_rem_ref_cm_node(cm_node); in irdma_passive_open_err()
666 cm_id = event->cm_node->cm_id; in irdma_event_connect_error()
677 irdma_send_cm_event(event->cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY, in irdma_event_connect_error()
679 irdma_rem_ref_cm_node(event->cm_node); in irdma_event_connect_error()
689 static int irdma_process_options(struct irdma_cm_node *cm_node, u8 *optionsloc, in irdma_process_options() argument
707 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_process_options()
714 if ((cm_node->ipv4 && in irdma_process_options()
716 (!cm_node->ipv4 && in irdma_process_options()
719 if (tmp < cm_node->tcp_cntxt.mss) in irdma_process_options()
720 cm_node->tcp_cntxt.mss = tmp; in irdma_process_options()
723 cm_node->tcp_cntxt.snd_wscale = in irdma_process_options()
727 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_process_options()
735 cm_node->tcp_cntxt.mss = IRDMA_CM_DEFAULT_MSS; in irdma_process_options()
747 static int irdma_handle_tcp_options(struct irdma_cm_node *cm_node, in irdma_handle_tcp_options() argument
755 ret = irdma_process_options(cm_node, optionsloc, optionsize, in irdma_handle_tcp_options()
758 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_handle_tcp_options()
759 "CM: Node %p, Sending Reset\n", cm_node); in irdma_handle_tcp_options()
761 irdma_passive_open_err(cm_node, true); in irdma_handle_tcp_options()
763 irdma_active_open_err(cm_node, true); in irdma_handle_tcp_options()
768 cm_node->tcp_cntxt.snd_wnd = ntohs(tcph->window) in irdma_handle_tcp_options()
769 << cm_node->tcp_cntxt.snd_wscale; in irdma_handle_tcp_options()
771 if (cm_node->tcp_cntxt.snd_wnd > cm_node->tcp_cntxt.max_snd_wnd) in irdma_handle_tcp_options()
772 cm_node->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.snd_wnd; in irdma_handle_tcp_options()
783 static void irdma_build_mpa_v1(struct irdma_cm_node *cm_node, void *start_addr, in irdma_build_mpa_v1() argument
799 mpa_frame->rev = cm_node->mpa_frame_rev; in irdma_build_mpa_v1()
800 mpa_frame->priv_data_len = htons(cm_node->pdata.size); in irdma_build_mpa_v1()
809 static void irdma_build_mpa_v2(struct irdma_cm_node *cm_node, void *start_addr, in irdma_build_mpa_v2() argument
817 irdma_build_mpa_v1(cm_node, start_addr, mpa_key); in irdma_build_mpa_v2()
819 if (cm_node->iwdev->iw_ooo) { in irdma_build_mpa_v2()
821 cm_node->rcv_mark_en = true; in irdma_build_mpa_v2()
827 if (cm_node->mpav2_ird_ord == IETF_NO_IRD_ORD) { in irdma_build_mpa_v2()
831 ctrl_ird = (cm_node->ird_size > IETF_NO_IRD_ORD) ? in irdma_build_mpa_v2()
833 cm_node->ird_size; in irdma_build_mpa_v2()
834 ctrl_ord = (cm_node->ord_size > IETF_NO_IRD_ORD) ? in irdma_build_mpa_v2()
836 cm_node->ord_size; in irdma_build_mpa_v2()
846 switch (cm_node->send_rdma0_op) { in irdma_build_mpa_v2()
868 static int irdma_cm_build_mpa_frame(struct irdma_cm_node *cm_node, in irdma_cm_build_mpa_frame() argument
873 switch (cm_node->mpa_frame_rev) { in irdma_cm_build_mpa_frame()
876 irdma_build_mpa_v1(cm_node, mpa->addr, mpa_key); in irdma_cm_build_mpa_frame()
880 irdma_build_mpa_v2(cm_node, mpa->addr, mpa_key); in irdma_cm_build_mpa_frame()
893 static int irdma_send_mpa_request(struct irdma_cm_node *cm_node) in irdma_send_mpa_request() argument
897 cm_node->mpa_hdr.addr = &cm_node->mpa_v2_frame; in irdma_send_mpa_request()
898 cm_node->mpa_hdr.size = irdma_cm_build_mpa_frame(cm_node, in irdma_send_mpa_request()
899 &cm_node->mpa_hdr, in irdma_send_mpa_request()
901 if (!cm_node->mpa_hdr.size) { in irdma_send_mpa_request()
902 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_send_mpa_request()
903 "CM: mpa size = %d\n", cm_node->mpa_hdr.size); in irdma_send_mpa_request()
907 sqbuf = cm_node->cm_core->form_cm_frame(cm_node, NULL, in irdma_send_mpa_request()
908 &cm_node->mpa_hdr, in irdma_send_mpa_request()
909 &cm_node->pdata, SET_ACK); in irdma_send_mpa_request()
913 return irdma_schedule_cm_timer(cm_node, sqbuf, IRDMA_TIMER_TYPE_SEND, 1, in irdma_send_mpa_request()
923 static int irdma_send_mpa_reject(struct irdma_cm_node *cm_node, in irdma_send_mpa_reject() argument
929 cm_node->mpa_hdr.addr = &cm_node->mpa_v2_frame; in irdma_send_mpa_reject()
930 cm_node->mpa_hdr.size = irdma_cm_build_mpa_frame(cm_node, in irdma_send_mpa_reject()
931 &cm_node->mpa_hdr, in irdma_send_mpa_reject()
934 cm_node->mpa_frame.flags |= IETF_MPA_FLAGS_REJECT; in irdma_send_mpa_reject()
938 sqbuf = cm_node->cm_core->form_cm_frame(cm_node, NULL, in irdma_send_mpa_reject()
939 &cm_node->mpa_hdr, &priv_info, in irdma_send_mpa_reject()
944 cm_node->state = IRDMA_CM_STATE_FIN_WAIT1; in irdma_send_mpa_reject()
946 return irdma_schedule_cm_timer(cm_node, sqbuf, IRDMA_TIMER_TYPE_SEND, 1, in irdma_send_mpa_reject()
955 static int irdma_negotiate_mpa_v2_ird_ord(struct irdma_cm_node *cm_node, in irdma_negotiate_mpa_v2_ird_ord() argument
978 cm_node->mpav2_ird_ord = IETF_NO_IRD_ORD; in irdma_negotiate_mpa_v2_ird_ord()
982 if (cm_node->state != IRDMA_CM_STATE_MPAREQ_SENT) { in irdma_negotiate_mpa_v2_ird_ord()
985 cm_node->ird_size = 1; in irdma_negotiate_mpa_v2_ird_ord()
986 if (cm_node->ord_size > ird_size) in irdma_negotiate_mpa_v2_ird_ord()
987 cm_node->ord_size = ird_size; in irdma_negotiate_mpa_v2_ird_ord()
994 if (cm_node->ord_size > ird_size) in irdma_negotiate_mpa_v2_ird_ord()
995 cm_node->ord_size = ird_size; in irdma_negotiate_mpa_v2_ird_ord()
997 if (cm_node->ird_size < ord_size) in irdma_negotiate_mpa_v2_ird_ord()
1004 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in irdma_negotiate_mpa_v2_ird_ord()
1006 cm_node->send_rdma0_op = SEND_RDMA_WRITE_ZERO; in irdma_negotiate_mpa_v2_ird_ord()
1011 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_negotiate_mpa_v2_ird_ord()
1013 cm_node->ord_size, cm_node->ird_size); in irdma_negotiate_mpa_v2_ird_ord()
1014 trace_irdma_negotiate_mpa_v2(cm_node); in irdma_negotiate_mpa_v2_ird_ord()
1025 static int irdma_parse_mpa(struct irdma_cm_node *cm_node, u8 *buf, u32 *type, in irdma_parse_mpa() argument
1034 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_parse_mpa()
1044 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_parse_mpa()
1050 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_parse_mpa()
1055 if (mpa_frame->rev > cm_node->mpa_frame_rev) { in irdma_parse_mpa()
1056 ibdev_dbg(&cm_node->iwdev->ibdev, "CM: rev %d\n", in irdma_parse_mpa()
1061 cm_node->mpa_frame_rev = mpa_frame->rev; in irdma_parse_mpa()
1062 if (cm_node->state != IRDMA_CM_STATE_MPAREQ_SENT) { in irdma_parse_mpa()
1065 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_parse_mpa()
1072 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_parse_mpa()
1079 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_parse_mpa()
1086 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_parse_mpa()
1094 ret = irdma_negotiate_mpa_v2_ird_ord(cm_node, buf); in irdma_parse_mpa()
1103 memcpy(cm_node->pdata_buf, buf + mpa_hdr_len, priv_data_len); in irdma_parse_mpa()
1104 cm_node->pdata.size = priv_data_len; in irdma_parse_mpa()
1110 cm_node->snd_mark_en = true; in irdma_parse_mpa()
1128 int irdma_schedule_cm_timer(struct irdma_cm_node *cm_node, in irdma_schedule_cm_timer() argument
1133 struct irdma_sc_vsi *vsi = &cm_node->iwdev->vsi; in irdma_schedule_cm_timer()
1134 struct irdma_cm_core *cm_core = cm_node->cm_core; in irdma_schedule_cm_timer()
1156 if (cm_node->close_entry) { in irdma_schedule_cm_timer()
1158 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_schedule_cm_timer()
1163 cm_node->close_entry = new_send; in irdma_schedule_cm_timer()
1165 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in irdma_schedule_cm_timer()
1166 cm_node->send_entry = new_send; in irdma_schedule_cm_timer()
1167 refcount_inc(&cm_node->refcnt); in irdma_schedule_cm_timer()
1168 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in irdma_schedule_cm_timer()
1174 irdma_cleanup_retrans_entry(cm_node); in irdma_schedule_cm_timer()
1176 irdma_rem_ref_cm_node(cm_node); in irdma_schedule_cm_timer()
1197 static void irdma_retrans_expired(struct irdma_cm_node *cm_node) in irdma_retrans_expired() argument
1199 enum irdma_cm_node_state state = cm_node->state; in irdma_retrans_expired()
1201 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_retrans_expired()
1205 irdma_rem_ref_cm_node(cm_node); in irdma_retrans_expired()
1209 irdma_send_reset(cm_node); in irdma_retrans_expired()
1212 refcount_inc(&cm_node->refcnt); in irdma_retrans_expired()
1213 irdma_send_reset(cm_node); in irdma_retrans_expired()
1214 irdma_create_event(cm_node, IRDMA_CM_EVENT_ABORTED); in irdma_retrans_expired()
1224 static void irdma_handle_close_entry(struct irdma_cm_node *cm_node, in irdma_handle_close_entry() argument
1227 struct irdma_timer_entry *close_entry = cm_node->close_entry; in irdma_handle_close_entry()
1248 irdma_rem_ref_cm_node(cm_node); in irdma_handle_close_entry()
1252 cm_node->close_entry = NULL; in irdma_handle_close_entry()
1262 struct irdma_cm_node *cm_node; in irdma_cm_timer_tick() local
1280 cm_node = container_of(list_node, struct irdma_cm_node, in irdma_cm_timer_tick()
1282 close_entry = cm_node->close_entry; in irdma_cm_timer_tick()
1292 irdma_handle_close_entry(cm_node, 1); in irdma_cm_timer_tick()
1296 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in irdma_cm_timer_tick()
1298 send_entry = cm_node->send_entry; in irdma_cm_timer_tick()
1302 if (cm_node->state != IRDMA_CM_STATE_OFFLOADED) { in irdma_cm_timer_tick()
1309 irdma_free_retrans_entry(cm_node); in irdma_cm_timer_tick()
1314 if (cm_node->state == IRDMA_CM_STATE_OFFLOADED || in irdma_cm_timer_tick()
1315 cm_node->state == IRDMA_CM_STATE_CLOSED) { in irdma_cm_timer_tick()
1316 irdma_free_retrans_entry(cm_node); in irdma_cm_timer_tick()
1321 irdma_free_retrans_entry(cm_node); in irdma_cm_timer_tick()
1323 spin_unlock_irqrestore(&cm_node->retrans_list_lock, in irdma_cm_timer_tick()
1325 irdma_retrans_expired(cm_node); in irdma_cm_timer_tick()
1326 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_cm_timer_tick()
1327 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in irdma_cm_timer_tick()
1330 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in irdma_cm_timer_tick()
1332 vsi = &cm_node->iwdev->vsi; in irdma_cm_timer_tick()
1333 if (!cm_node->ack_rcvd) { in irdma_cm_timer_tick()
1336 cm_node->cm_core->stats_pkt_retrans++; in irdma_cm_timer_tick()
1339 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in irdma_cm_timer_tick()
1356 irdma_free_retrans_entry(cm_node); in irdma_cm_timer_tick()
1358 irdma_rem_ref_cm_node(cm_node); in irdma_cm_timer_tick()
1361 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in irdma_cm_timer_tick()
1362 irdma_rem_ref_cm_node(cm_node); in irdma_cm_timer_tick()
1380 int irdma_send_syn(struct irdma_cm_node *cm_node, u32 sendack) in irdma_send_syn() argument
1393 if (!cm_node) in irdma_send_syn()
1399 options->mss.mss = htons(cm_node->tcp_cntxt.mss); in irdma_send_syn()
1405 options->windowscale.shiftcount = cm_node->tcp_cntxt.rcv_wscale; in irdma_send_syn()
1416 sqbuf = cm_node->cm_core->form_cm_frame(cm_node, &opts, NULL, NULL, in irdma_send_syn()
1421 return irdma_schedule_cm_timer(cm_node, sqbuf, IRDMA_TIMER_TYPE_SEND, 1, in irdma_send_syn()
1429 void irdma_send_ack(struct irdma_cm_node *cm_node) in irdma_send_ack() argument
1432 struct irdma_sc_vsi *vsi = &cm_node->iwdev->vsi; in irdma_send_ack()
1434 sqbuf = cm_node->cm_core->form_cm_frame(cm_node, NULL, NULL, NULL, in irdma_send_ack()
1444 static int irdma_send_fin(struct irdma_cm_node *cm_node) in irdma_send_fin() argument
1448 sqbuf = cm_node->cm_core->form_cm_frame(cm_node, NULL, NULL, NULL, in irdma_send_fin()
1453 return irdma_schedule_cm_timer(cm_node, sqbuf, IRDMA_TIMER_TYPE_SEND, 1, in irdma_send_fin()
1804 struct irdma_cm_node *cm_node; in irdma_reset_list_prep() local
1807 hash_for_each_rcu(cm_core->cm_hash_tbl, bkt, cm_node, list) { in irdma_reset_list_prep()
1808 if (cm_node->listener == listener && in irdma_reset_list_prep()
1809 !cm_node->accelerated && in irdma_reset_list_prep()
1810 refcount_inc_not_zero(&cm_node->refcnt)) in irdma_reset_list_prep()
1811 list_add(&cm_node->reset_entry, reset_list); in irdma_reset_list_prep()
1829 struct irdma_cm_node *cm_node; in irdma_dec_refcnt_listen() local
1845 cm_node = container_of(list_pos, struct irdma_cm_node, in irdma_dec_refcnt_listen()
1847 if (cm_node->state >= IRDMA_CM_STATE_FIN_WAIT1) { in irdma_dec_refcnt_listen()
1848 irdma_rem_ref_cm_node(cm_node); in irdma_dec_refcnt_listen()
1852 irdma_cleanup_retrans_entry(cm_node); in irdma_dec_refcnt_listen()
1853 err = irdma_send_reset(cm_node); in irdma_dec_refcnt_listen()
1855 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_dec_refcnt_listen()
1856 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_dec_refcnt_listen()
1859 old_state = cm_node->state; in irdma_dec_refcnt_listen()
1860 cm_node->state = IRDMA_CM_STATE_LISTENER_DESTROYED; in irdma_dec_refcnt_listen()
1862 irdma_rem_ref_cm_node(cm_node); in irdma_dec_refcnt_listen()
2051 struct irdma_cm_node *cm_node; in irdma_find_node() local
2055 hash_for_each_possible_rcu(cm_core->cm_hash_tbl, cm_node, list, key) { in irdma_find_node()
2056 if (cm_node->vlan_id == vlan_id && in irdma_find_node()
2057 cm_node->loc_port == loc_port && cm_node->rem_port == rem_port && in irdma_find_node()
2058 !memcmp(cm_node->loc_addr, loc_addr, sizeof(cm_node->loc_addr)) && in irdma_find_node()
2059 !memcmp(cm_node->rem_addr, rem_addr, sizeof(cm_node->rem_addr))) { in irdma_find_node()
2060 if (!refcount_inc_not_zero(&cm_node->refcnt)) in irdma_find_node()
2063 trace_irdma_find_node(cm_node, 0, NULL); in irdma_find_node()
2064 return cm_node; in irdma_find_node()
2081 struct irdma_cm_node *cm_node) in irdma_add_hte_node() argument
2084 u32 key = (cm_node->rem_port << 16) | cm_node->loc_port; in irdma_add_hte_node()
2087 hash_add_rcu(cm_core->cm_hash_tbl, &cm_node->list, key); in irdma_add_hte_node()
2120 static int irdma_cm_create_ah(struct irdma_cm_node *cm_node, bool wait) in irdma_cm_create_ah() argument
2123 struct irdma_device *iwdev = cm_node->iwdev; in irdma_cm_create_ah()
2128 ah_info.tc_tos = cm_node->tos; in irdma_cm_create_ah()
2131 if (cm_node->ipv4) { in irdma_cm_create_ah()
2133 ah_info.dest_ip_addr[0] = cm_node->rem_addr[0]; in irdma_cm_create_ah()
2134 ah_info.src_ip_addr[0] = cm_node->loc_addr[0]; in irdma_cm_create_ah()
2138 memcpy(ah_info.dest_ip_addr, cm_node->rem_addr, in irdma_cm_create_ah()
2140 memcpy(ah_info.src_ip_addr, cm_node->loc_addr, in irdma_cm_create_ah()
2146 ah_info.vlan_tag = cm_node->vlan_id; in irdma_cm_create_ah()
2147 if (cm_node->vlan_id < VLAN_N_VID) { in irdma_cm_create_ah()
2149 ah_info.vlan_tag |= cm_node->user_pri << VLAN_PRIO_SHIFT; in irdma_cm_create_ah()
2157 IRDMA_PUDA_RSRC_TYPE_ILQ, cm_node, in irdma_cm_create_ah()
2158 &cm_node->ah)) in irdma_cm_create_ah()
2161 trace_irdma_create_ah(cm_node); in irdma_cm_create_ah()
2169 static void irdma_cm_free_ah(struct irdma_cm_node *cm_node) in irdma_cm_free_ah() argument
2171 struct irdma_device *iwdev = cm_node->iwdev; in irdma_cm_free_ah()
2173 trace_irdma_cm_free_ah(cm_node); in irdma_cm_free_ah()
2174 irdma_puda_free_ah(&iwdev->rf->sc_dev, cm_node->ah); in irdma_cm_free_ah()
2175 cm_node->ah = NULL; in irdma_cm_free_ah()
2190 struct irdma_cm_node *cm_node; in irdma_make_cm_node() local
2196 cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC); in irdma_make_cm_node()
2197 if (!cm_node) in irdma_make_cm_node()
2201 cm_node->ipv4 = cm_info->ipv4; in irdma_make_cm_node()
2202 cm_node->vlan_id = cm_info->vlan_id; in irdma_make_cm_node()
2203 if (cm_node->vlan_id >= VLAN_N_VID && iwdev->dcb) in irdma_make_cm_node()
2204 cm_node->vlan_id = 0; in irdma_make_cm_node()
2205 cm_node->tos = cm_info->tos; in irdma_make_cm_node()
2206 cm_node->user_pri = cm_info->user_pri; in irdma_make_cm_node()
2212 cm_node->tos = max(listener->tos, cm_info->tos); in irdma_make_cm_node()
2213 cm_node->user_pri = rt_tos2priority(cm_node->tos); in irdma_make_cm_node()
2215 "DCB: listener: TOS:[%d] UP:[%d]\n", cm_node->tos, in irdma_make_cm_node()
2216 cm_node->user_pri); in irdma_make_cm_node()
2217 trace_irdma_listener_tos(iwdev, cm_node->tos, in irdma_make_cm_node()
2218 cm_node->user_pri); in irdma_make_cm_node()
2220 memcpy(cm_node->loc_addr, cm_info->loc_addr, sizeof(cm_node->loc_addr)); in irdma_make_cm_node()
2221 memcpy(cm_node->rem_addr, cm_info->rem_addr, sizeof(cm_node->rem_addr)); in irdma_make_cm_node()
2222 cm_node->loc_port = cm_info->loc_port; in irdma_make_cm_node()
2223 cm_node->rem_port = cm_info->rem_port; in irdma_make_cm_node()
2225 cm_node->mpa_frame_rev = IRDMA_CM_DEFAULT_MPA_VER; in irdma_make_cm_node()
2226 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in irdma_make_cm_node()
2227 cm_node->iwdev = iwdev; in irdma_make_cm_node()
2228 cm_node->dev = &iwdev->rf->sc_dev; in irdma_make_cm_node()
2230 cm_node->ird_size = cm_node->dev->hw_attrs.max_hw_ird; in irdma_make_cm_node()
2231 cm_node->ord_size = cm_node->dev->hw_attrs.max_hw_ord; in irdma_make_cm_node()
2233 cm_node->listener = listener; in irdma_make_cm_node()
2234 cm_node->cm_id = cm_info->cm_id; in irdma_make_cm_node()
2235 ether_addr_copy(cm_node->loc_mac, netdev->dev_addr); in irdma_make_cm_node()
2236 spin_lock_init(&cm_node->retrans_list_lock); in irdma_make_cm_node()
2237 cm_node->ack_rcvd = false; in irdma_make_cm_node()
2239 init_completion(&cm_node->establish_comp); in irdma_make_cm_node()
2240 refcount_set(&cm_node->refcnt, 1); in irdma_make_cm_node()
2242 cm_node->cm_core = cm_core; in irdma_make_cm_node()
2243 cm_node->tcp_cntxt.loc_id = IRDMA_CM_DEFAULT_LOCAL_ID; in irdma_make_cm_node()
2244 cm_node->tcp_cntxt.rcv_wscale = iwdev->rcv_wscale; in irdma_make_cm_node()
2245 cm_node->tcp_cntxt.rcv_wnd = iwdev->rcv_wnd >> cm_node->tcp_cntxt.rcv_wscale; in irdma_make_cm_node()
2246 if (cm_node->ipv4) { in irdma_make_cm_node()
2247 cm_node->tcp_cntxt.loc_seq_num = secure_tcp_seq(htonl(cm_node->loc_addr[0]), in irdma_make_cm_node()
2248 htonl(cm_node->rem_addr[0]), in irdma_make_cm_node()
2249 htons(cm_node->loc_port), in irdma_make_cm_node()
2250 htons(cm_node->rem_port)); in irdma_make_cm_node()
2251 cm_node->tcp_cntxt.mss = iwdev->vsi.mtu - IRDMA_MTU_TO_MSS_IPV4; in irdma_make_cm_node()
2254 htonl(cm_node->loc_addr[0]), htonl(cm_node->loc_addr[1]), in irdma_make_cm_node()
2255 htonl(cm_node->loc_addr[2]), htonl(cm_node->loc_addr[3]) in irdma_make_cm_node()
2258 htonl(cm_node->rem_addr[0]), htonl(cm_node->rem_addr[1]), in irdma_make_cm_node()
2259 htonl(cm_node->rem_addr[2]), htonl(cm_node->rem_addr[3]) in irdma_make_cm_node()
2261 cm_node->tcp_cntxt.loc_seq_num = secure_tcpv6_seq(loc, rem, in irdma_make_cm_node()
2262 htons(cm_node->loc_port), in irdma_make_cm_node()
2263 htons(cm_node->rem_port)); in irdma_make_cm_node()
2264 cm_node->tcp_cntxt.mss = iwdev->vsi.mtu - IRDMA_MTU_TO_MSS_IPV6; in irdma_make_cm_node()
2267 if ((cm_node->ipv4 && in irdma_make_cm_node()
2268 irdma_ipv4_is_lpb(cm_node->loc_addr[0], cm_node->rem_addr[0])) || in irdma_make_cm_node()
2269 (!cm_node->ipv4 && in irdma_make_cm_node()
2270 irdma_ipv6_is_lpb(cm_node->loc_addr, cm_node->rem_addr))) { in irdma_make_cm_node()
2271 cm_node->do_lpb = true; in irdma_make_cm_node()
2272 arpindex = irdma_arp_table(iwdev->rf, cm_node->rem_addr, in irdma_make_cm_node()
2273 cm_node->ipv4, NULL, in irdma_make_cm_node()
2276 oldarpindex = irdma_arp_table(iwdev->rf, cm_node->rem_addr, in irdma_make_cm_node()
2277 cm_node->ipv4, NULL, in irdma_make_cm_node()
2279 if (cm_node->ipv4) in irdma_make_cm_node()
2296 ether_addr_copy(cm_node->rem_mac, in irdma_make_cm_node()
2298 irdma_add_hte_node(cm_core, cm_node); in irdma_make_cm_node()
2300 return cm_node; in irdma_make_cm_node()
2303 kfree(cm_node); in irdma_make_cm_node()
2310 struct irdma_cm_node *cm_node = in irdma_cm_node_free_cb() local
2312 struct irdma_cm_core *cm_core = cm_node->cm_core; in irdma_cm_node_free_cb()
2317 if (!cm_node->accelerated && cm_node->accept_pend) { in irdma_cm_node_free_cb()
2318 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_cm_node_free_cb()
2320 atomic_dec(&cm_node->listener->pend_accepts_cnt); in irdma_cm_node_free_cb()
2322 if (cm_node->close_entry) in irdma_cm_node_free_cb()
2323 irdma_handle_close_entry(cm_node, 0); in irdma_cm_node_free_cb()
2324 if (cm_node->listener) { in irdma_cm_node_free_cb()
2325 irdma_dec_refcnt_listen(cm_core, cm_node->listener, 0, true); in irdma_cm_node_free_cb()
2327 if (cm_node->apbvt_set) { in irdma_cm_node_free_cb()
2328 irdma_del_apbvt(cm_node->iwdev, cm_node->apbvt_entry); in irdma_cm_node_free_cb()
2329 cm_node->apbvt_set = 0; in irdma_cm_node_free_cb()
2331 irdma_get_addr_info(cm_node, &nfo); in irdma_cm_node_free_cb()
2332 if (cm_node->qhash_set) { in irdma_cm_node_free_cb()
2333 nfo.qh_qpid = cm_node->iwdev->vsi.ilq->qp_id; in irdma_cm_node_free_cb()
2334 irdma_manage_qhash(cm_node->iwdev, &nfo, in irdma_cm_node_free_cb()
2338 cm_node->qhash_set = 0; in irdma_cm_node_free_cb()
2342 iwqp = cm_node->iwqp; in irdma_cm_node_free_cb()
2344 cm_node->cm_id->rem_ref(cm_node->cm_id); in irdma_cm_node_free_cb()
2345 cm_node->cm_id = NULL; in irdma_cm_node_free_cb()
2348 cm_node->iwqp = NULL; in irdma_cm_node_free_cb()
2349 } else if (cm_node->qhash_set) { in irdma_cm_node_free_cb()
2350 irdma_get_addr_info(cm_node, &nfo); in irdma_cm_node_free_cb()
2351 nfo.qh_qpid = cm_node->iwdev->vsi.ilq->qp_id; in irdma_cm_node_free_cb()
2352 irdma_manage_qhash(cm_node->iwdev, &nfo, in irdma_cm_node_free_cb()
2355 cm_node->qhash_set = 0; in irdma_cm_node_free_cb()
2358 cm_core->cm_free_ah(cm_node); in irdma_cm_node_free_cb()
2359 kfree(cm_node); in irdma_cm_node_free_cb()
2366 void irdma_rem_ref_cm_node(struct irdma_cm_node *cm_node) in irdma_rem_ref_cm_node() argument
2368 struct irdma_cm_core *cm_core = cm_node->cm_core; in irdma_rem_ref_cm_node()
2371 trace_irdma_rem_ref_cm_node(cm_node, 0, __builtin_return_address(0)); in irdma_rem_ref_cm_node()
2374 if (!refcount_dec_and_test(&cm_node->refcnt)) { in irdma_rem_ref_cm_node()
2378 if (cm_node->iwqp) { in irdma_rem_ref_cm_node()
2379 cm_node->iwqp->cm_node = NULL; in irdma_rem_ref_cm_node()
2380 cm_node->iwqp->cm_id = NULL; in irdma_rem_ref_cm_node()
2382 hash_del_rcu(&cm_node->list); in irdma_rem_ref_cm_node()
2383 cm_node->cm_core->stats_nodes_destroyed++; in irdma_rem_ref_cm_node()
2388 call_rcu(&cm_node->rcu_head, irdma_cm_node_free_cb); in irdma_rem_ref_cm_node()
2395 static void irdma_handle_fin_pkt(struct irdma_cm_node *cm_node) in irdma_handle_fin_pkt() argument
2397 switch (cm_node->state) { in irdma_handle_fin_pkt()
2402 cm_node->tcp_cntxt.rcv_nxt++; in irdma_handle_fin_pkt()
2403 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_fin_pkt()
2404 cm_node->state = IRDMA_CM_STATE_LAST_ACK; in irdma_handle_fin_pkt()
2405 irdma_send_fin(cm_node); in irdma_handle_fin_pkt()
2408 irdma_create_event(cm_node, IRDMA_CM_EVENT_ABORTED); in irdma_handle_fin_pkt()
2409 cm_node->tcp_cntxt.rcv_nxt++; in irdma_handle_fin_pkt()
2410 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_fin_pkt()
2411 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_handle_fin_pkt()
2412 refcount_inc(&cm_node->refcnt); in irdma_handle_fin_pkt()
2413 irdma_send_reset(cm_node); in irdma_handle_fin_pkt()
2416 cm_node->tcp_cntxt.rcv_nxt++; in irdma_handle_fin_pkt()
2417 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_fin_pkt()
2418 cm_node->state = IRDMA_CM_STATE_CLOSING; in irdma_handle_fin_pkt()
2419 irdma_send_ack(cm_node); in irdma_handle_fin_pkt()
2427 cm_node->tcp_cntxt.rcv_nxt++; in irdma_handle_fin_pkt()
2428 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_fin_pkt()
2429 cm_node->state = IRDMA_CM_STATE_TIME_WAIT; in irdma_handle_fin_pkt()
2430 irdma_send_ack(cm_node); in irdma_handle_fin_pkt()
2431 irdma_schedule_cm_timer(cm_node, NULL, IRDMA_TIMER_TYPE_CLOSE, in irdma_handle_fin_pkt()
2435 cm_node->tcp_cntxt.rcv_nxt++; in irdma_handle_fin_pkt()
2436 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_fin_pkt()
2437 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_handle_fin_pkt()
2438 irdma_rem_ref_cm_node(cm_node); in irdma_handle_fin_pkt()
2442 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_handle_fin_pkt()
2443 "CM: bad state node state = %d\n", cm_node->state); in irdma_handle_fin_pkt()
2453 static void irdma_handle_rst_pkt(struct irdma_cm_node *cm_node, in irdma_handle_rst_pkt() argument
2456 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_handle_rst_pkt()
2458 __builtin_return_address(0), cm_node, cm_node->state, in irdma_handle_rst_pkt()
2459 cm_node->rem_port, cm_node->loc_port, cm_node->rem_addr, in irdma_handle_rst_pkt()
2460 cm_node->loc_addr); in irdma_handle_rst_pkt()
2462 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_rst_pkt()
2463 switch (cm_node->state) { in irdma_handle_rst_pkt()
2466 switch (cm_node->mpa_frame_rev) { in irdma_handle_rst_pkt()
2469 cm_node->mpa_frame_rev = IETF_MPA_V1; in irdma_handle_rst_pkt()
2471 cm_node->state = IRDMA_CM_STATE_SYN_SENT; in irdma_handle_rst_pkt()
2472 if (irdma_send_syn(cm_node, 0)) in irdma_handle_rst_pkt()
2473 irdma_active_open_err(cm_node, false); in irdma_handle_rst_pkt()
2477 irdma_active_open_err(cm_node, false); in irdma_handle_rst_pkt()
2482 atomic_inc(&cm_node->passive_state); in irdma_handle_rst_pkt()
2487 irdma_passive_open_err(cm_node, false); in irdma_handle_rst_pkt()
2490 irdma_active_open_err(cm_node, false); in irdma_handle_rst_pkt()
2498 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_handle_rst_pkt()
2499 irdma_rem_ref_cm_node(cm_node); in irdma_handle_rst_pkt()
2511 static void irdma_handle_rcv_mpa(struct irdma_cm_node *cm_node, in irdma_handle_rcv_mpa() argument
2521 err = irdma_parse_mpa(cm_node, dataloc, &res_type, datasize); in irdma_handle_rcv_mpa()
2523 if (cm_node->state == IRDMA_CM_STATE_MPAREQ_SENT) in irdma_handle_rcv_mpa()
2524 irdma_active_open_err(cm_node, true); in irdma_handle_rcv_mpa()
2526 irdma_passive_open_err(cm_node, true); in irdma_handle_rcv_mpa()
2530 switch (cm_node->state) { in irdma_handle_rcv_mpa()
2533 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_handle_rcv_mpa()
2535 cm_node->state = IRDMA_CM_STATE_MPAREQ_RCVD; in irdma_handle_rcv_mpa()
2537 irdma_send_ack(cm_node); /* ACK received MPA request */ in irdma_handle_rcv_mpa()
2538 atomic_set(&cm_node->passive_state, in irdma_handle_rcv_mpa()
2542 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_rcv_mpa()
2545 cm_node->state = IRDMA_CM_STATE_MPAREJ_RCVD; in irdma_handle_rcv_mpa()
2548 cm_node->state = IRDMA_CM_STATE_OFFLOADED; in irdma_handle_rcv_mpa()
2550 irdma_send_ack(cm_node); in irdma_handle_rcv_mpa()
2553 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_handle_rcv_mpa()
2554 "CM: wrong cm_node state =%d\n", cm_node->state); in irdma_handle_rcv_mpa()
2557 irdma_create_event(cm_node, type); in irdma_handle_rcv_mpa()
2565 static int irdma_check_syn(struct irdma_cm_node *cm_node, struct tcphdr *tcph) in irdma_check_syn() argument
2567 if (ntohl(tcph->ack_seq) != cm_node->tcp_cntxt.loc_seq_num) { in irdma_check_syn()
2568 irdma_active_open_err(cm_node, true); in irdma_check_syn()
2580 static int irdma_check_seq(struct irdma_cm_node *cm_node, struct tcphdr *tcph) in irdma_check_seq() argument
2584 u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num; in irdma_check_seq()
2585 u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt; in irdma_check_seq()
2591 rcv_wnd = cm_node->tcp_cntxt.rcv_wnd; in irdma_check_seq()
2596 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_check_seq()
2602 void irdma_add_conn_est_qh(struct irdma_cm_node *cm_node) in irdma_add_conn_est_qh() argument
2606 irdma_get_addr_info(cm_node, &nfo); in irdma_add_conn_est_qh()
2607 nfo.qh_qpid = cm_node->iwdev->vsi.ilq->qp_id; in irdma_add_conn_est_qh()
2608 irdma_manage_qhash(cm_node->iwdev, &nfo, in irdma_add_conn_est_qh()
2611 cm_node, false); in irdma_add_conn_est_qh()
2612 cm_node->qhash_set = true; in irdma_add_conn_est_qh()
2620 static void irdma_handle_syn_pkt(struct irdma_cm_node *cm_node, in irdma_handle_syn_pkt() argument
2631 switch (cm_node->state) { in irdma_handle_syn_pkt()
2635 irdma_active_open_err(cm_node, 1); in irdma_handle_syn_pkt()
2639 if (atomic_read(&cm_node->listener->pend_accepts_cnt) > in irdma_handle_syn_pkt()
2640 cm_node->listener->backlog) { in irdma_handle_syn_pkt()
2641 cm_node->cm_core->stats_backlog_drops++; in irdma_handle_syn_pkt()
2642 irdma_passive_open_err(cm_node, false); in irdma_handle_syn_pkt()
2645 err = irdma_handle_tcp_options(cm_node, tcph, optionsize, 1); in irdma_handle_syn_pkt()
2647 irdma_passive_open_err(cm_node, false); in irdma_handle_syn_pkt()
2651 err = cm_node->cm_core->cm_create_ah(cm_node, false); in irdma_handle_syn_pkt()
2653 irdma_passive_open_err(cm_node, false); in irdma_handle_syn_pkt()
2657 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in irdma_handle_syn_pkt()
2658 cm_node->accept_pend = 1; in irdma_handle_syn_pkt()
2659 atomic_inc(&cm_node->listener->pend_accepts_cnt); in irdma_handle_syn_pkt()
2661 cm_node->state = IRDMA_CM_STATE_SYN_RCVD; in irdma_handle_syn_pkt()
2664 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_syn_pkt()
2665 refcount_inc(&cm_node->refcnt); in irdma_handle_syn_pkt()
2666 irdma_send_reset(cm_node); in irdma_handle_syn_pkt()
2686 static void irdma_handle_synack_pkt(struct irdma_cm_node *cm_node, in irdma_handle_synack_pkt() argument
2696 switch (cm_node->state) { in irdma_handle_synack_pkt()
2698 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_synack_pkt()
2700 if (irdma_check_syn(cm_node, tcph)) { in irdma_handle_synack_pkt()
2701 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_handle_synack_pkt()
2705 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in irdma_handle_synack_pkt()
2707 err = irdma_handle_tcp_options(cm_node, tcph, optionsize, 0); in irdma_handle_synack_pkt()
2709 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_handle_synack_pkt()
2711 cm_node); in irdma_handle_synack_pkt()
2714 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_synack_pkt()
2715 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in irdma_handle_synack_pkt()
2716 irdma_send_ack(cm_node); /* ACK for the syn_ack */ in irdma_handle_synack_pkt()
2717 err = irdma_send_mpa_request(cm_node); in irdma_handle_synack_pkt()
2719 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_handle_synack_pkt()
2721 cm_node); in irdma_handle_synack_pkt()
2724 cm_node->state = IRDMA_CM_STATE_MPAREQ_SENT; in irdma_handle_synack_pkt()
2727 irdma_passive_open_err(cm_node, true); in irdma_handle_synack_pkt()
2730 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in irdma_handle_synack_pkt()
2731 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_synack_pkt()
2732 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_handle_synack_pkt()
2733 irdma_send_reset(cm_node); in irdma_handle_synack_pkt()
2736 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in irdma_handle_synack_pkt()
2737 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_synack_pkt()
2738 refcount_inc(&cm_node->refcnt); in irdma_handle_synack_pkt()
2739 irdma_send_reset(cm_node); in irdma_handle_synack_pkt()
2759 static int irdma_handle_ack_pkt(struct irdma_cm_node *cm_node, in irdma_handle_ack_pkt() argument
2770 if (irdma_check_seq(cm_node, tcph)) in irdma_handle_ack_pkt()
2774 switch (cm_node->state) { in irdma_handle_ack_pkt()
2776 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_ack_pkt()
2777 ret = irdma_handle_tcp_options(cm_node, tcph, optionsize, 1); in irdma_handle_ack_pkt()
2780 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in irdma_handle_ack_pkt()
2781 cm_node->state = IRDMA_CM_STATE_ESTABLISHED; in irdma_handle_ack_pkt()
2783 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in irdma_handle_ack_pkt()
2784 irdma_handle_rcv_mpa(cm_node, rbuf); in irdma_handle_ack_pkt()
2788 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_ack_pkt()
2790 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in irdma_handle_ack_pkt()
2791 irdma_handle_rcv_mpa(cm_node, rbuf); in irdma_handle_ack_pkt()
2795 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in irdma_handle_ack_pkt()
2797 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in irdma_handle_ack_pkt()
2798 cm_node->ack_rcvd = false; in irdma_handle_ack_pkt()
2799 irdma_handle_rcv_mpa(cm_node, rbuf); in irdma_handle_ack_pkt()
2801 cm_node->ack_rcvd = true; in irdma_handle_ack_pkt()
2805 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_ack_pkt()
2806 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_handle_ack_pkt()
2807 irdma_send_reset(cm_node); in irdma_handle_ack_pkt()
2810 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_ack_pkt()
2811 refcount_inc(&cm_node->refcnt); in irdma_handle_ack_pkt()
2812 irdma_send_reset(cm_node); in irdma_handle_ack_pkt()
2816 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_ack_pkt()
2817 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_handle_ack_pkt()
2818 irdma_rem_ref_cm_node(cm_node); in irdma_handle_ack_pkt()
2821 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_ack_pkt()
2822 cm_node->state = IRDMA_CM_STATE_FIN_WAIT2; in irdma_handle_ack_pkt()
2830 irdma_cleanup_retrans_entry(cm_node); in irdma_handle_ack_pkt()
2842 static void irdma_process_pkt(struct irdma_cm_node *cm_node, in irdma_process_pkt() argument
2864 irdma_handle_syn_pkt(cm_node, rbuf); in irdma_process_pkt()
2867 irdma_handle_synack_pkt(cm_node, rbuf); in irdma_process_pkt()
2870 err = irdma_handle_ack_pkt(cm_node, rbuf); in irdma_process_pkt()
2872 irdma_handle_fin_pkt(cm_node); in irdma_process_pkt()
2875 irdma_handle_rst_pkt(cm_node, rbuf); in irdma_process_pkt()
2879 (!irdma_check_seq(cm_node, (struct tcphdr *)rbuf->tcph))) in irdma_process_pkt()
2880 irdma_handle_fin_pkt(cm_node); in irdma_process_pkt()
2961 struct irdma_cm_node *cm_node; in irdma_create_cm_node() local
2966 cm_node = irdma_make_cm_node(cm_core, iwdev, cm_info, NULL); in irdma_create_cm_node()
2967 if (!cm_node) in irdma_create_cm_node()
2971 cm_node->tcp_cntxt.client = 1; in irdma_create_cm_node()
2972 cm_node->tcp_cntxt.rcv_wscale = IRDMA_CM_DEFAULT_RCV_WND_SCALE; in irdma_create_cm_node()
2974 irdma_record_ird_ord(cm_node, conn_param->ird, conn_param->ord); in irdma_create_cm_node()
2976 cm_node->pdata.size = private_data_len; in irdma_create_cm_node()
2977 cm_node->pdata.addr = cm_node->pdata_buf; in irdma_create_cm_node()
2979 memcpy(cm_node->pdata_buf, private_data, private_data_len); in irdma_create_cm_node()
2980 *caller_cm_node = cm_node; in irdma_create_cm_node()
2991 static int irdma_cm_reject(struct irdma_cm_node *cm_node, const void *pdata, in irdma_cm_reject() argument
2997 if (cm_node->tcp_cntxt.client) in irdma_cm_reject()
3000 irdma_cleanup_retrans_entry(cm_node); in irdma_cm_reject()
3002 passive_state = atomic_add_return(1, &cm_node->passive_state); in irdma_cm_reject()
3004 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_cm_reject()
3005 irdma_rem_ref_cm_node(cm_node); in irdma_cm_reject()
3009 if (cm_node->state == IRDMA_CM_STATE_LISTENER_DESTROYED) { in irdma_cm_reject()
3010 irdma_rem_ref_cm_node(cm_node); in irdma_cm_reject()
3014 ret = irdma_send_mpa_reject(cm_node, pdata, plen); in irdma_cm_reject()
3018 cm_node->state = IRDMA_CM_STATE_CLOSED; in irdma_cm_reject()
3019 if (irdma_send_reset(cm_node)) in irdma_cm_reject()
3020 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_cm_reject()
3030 static int irdma_cm_close(struct irdma_cm_node *cm_node) in irdma_cm_close() argument
3032 switch (cm_node->state) { in irdma_cm_close()
3040 irdma_cleanup_retrans_entry(cm_node); in irdma_cm_close()
3041 irdma_send_reset(cm_node); in irdma_cm_close()
3044 cm_node->state = IRDMA_CM_STATE_LAST_ACK; in irdma_cm_close()
3045 irdma_send_fin(cm_node); in irdma_cm_close()
3054 irdma_cleanup_retrans_entry(cm_node); in irdma_cm_close()
3055 irdma_send_reset(cm_node); in irdma_cm_close()
3062 irdma_rem_ref_cm_node(cm_node); in irdma_cm_close()
3065 if (cm_node->send_entry) in irdma_cm_close()
3066 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_cm_close()
3068 irdma_rem_ref_cm_node(cm_node); in irdma_cm_close()
3083 struct irdma_cm_node *cm_node; in irdma_receive_ilq() local
3139 cm_node = irdma_find_node(cm_core, cm_info.rem_port, cm_info.rem_addr, in irdma_receive_ilq()
3142 if (!cm_node) { in irdma_receive_ilq()
3162 cm_node = irdma_make_cm_node(cm_core, iwdev, &cm_info, in irdma_receive_ilq()
3164 if (!cm_node) { in irdma_receive_ilq()
3172 cm_node->state = IRDMA_CM_STATE_LISTENING; in irdma_receive_ilq()
3174 irdma_rem_ref_cm_node(cm_node); in irdma_receive_ilq()
3178 refcount_inc(&cm_node->refcnt); in irdma_receive_ilq()
3179 } else if (cm_node->state == IRDMA_CM_STATE_OFFLOADED) { in irdma_receive_ilq()
3180 irdma_rem_ref_cm_node(cm_node); in irdma_receive_ilq()
3184 irdma_process_pkt(cm_node, rbuf); in irdma_receive_ilq()
3185 irdma_rem_ref_cm_node(cm_node); in irdma_receive_ilq()
3188 static int irdma_add_qh(struct irdma_cm_node *cm_node, bool active) in irdma_add_qh() argument
3191 irdma_add_conn_est_qh(cm_node); in irdma_add_qh()
3195 static void irdma_cm_free_ah_nop(struct irdma_cm_node *cm_node) in irdma_cm_free_ah_nop() argument
3267 static void irdma_init_tcp_ctx(struct irdma_cm_node *cm_node, in irdma_init_tcp_ctx() argument
3271 tcp_info->ipv4 = cm_node->ipv4; in irdma_init_tcp_ctx()
3284 tcp_info->snd_wscale = cm_node->tcp_cntxt.snd_wscale; in irdma_init_tcp_ctx()
3285 tcp_info->rcv_wscale = cm_node->tcp_cntxt.rcv_wscale; in irdma_init_tcp_ctx()
3287 tcp_info->snd_nxt = cm_node->tcp_cntxt.loc_seq_num; in irdma_init_tcp_ctx()
3288 tcp_info->snd_wnd = cm_node->tcp_cntxt.snd_wnd; in irdma_init_tcp_ctx()
3289 tcp_info->rcv_nxt = cm_node->tcp_cntxt.rcv_nxt; in irdma_init_tcp_ctx()
3290 tcp_info->snd_max = cm_node->tcp_cntxt.loc_seq_num; in irdma_init_tcp_ctx()
3292 tcp_info->snd_una = cm_node->tcp_cntxt.loc_seq_num; in irdma_init_tcp_ctx()
3293 tcp_info->cwnd = 2 * cm_node->tcp_cntxt.mss; in irdma_init_tcp_ctx()
3294 tcp_info->snd_wl1 = cm_node->tcp_cntxt.rcv_nxt; in irdma_init_tcp_ctx()
3295 tcp_info->snd_wl2 = cm_node->tcp_cntxt.loc_seq_num; in irdma_init_tcp_ctx()
3296 tcp_info->max_snd_window = cm_node->tcp_cntxt.max_snd_wnd; in irdma_init_tcp_ctx()
3297 tcp_info->rcv_wnd = cm_node->tcp_cntxt.rcv_wnd in irdma_init_tcp_ctx()
3298 << cm_node->tcp_cntxt.rcv_wscale; in irdma_init_tcp_ctx()
3301 tcp_info->snd_mss = (u32)cm_node->tcp_cntxt.mss; in irdma_init_tcp_ctx()
3302 tcp_info->tos = cm_node->tos; in irdma_init_tcp_ctx()
3303 if (cm_node->vlan_id < VLAN_N_VID) { in irdma_init_tcp_ctx()
3305 tcp_info->vlan_tag = cm_node->vlan_id; in irdma_init_tcp_ctx()
3306 tcp_info->vlan_tag |= cm_node->user_pri << VLAN_PRIO_SHIFT; in irdma_init_tcp_ctx()
3308 if (cm_node->ipv4) { in irdma_init_tcp_ctx()
3309 tcp_info->src_port = cm_node->loc_port; in irdma_init_tcp_ctx()
3310 tcp_info->dst_port = cm_node->rem_port; in irdma_init_tcp_ctx()
3312 tcp_info->dest_ip_addr[3] = cm_node->rem_addr[0]; in irdma_init_tcp_ctx()
3313 tcp_info->local_ipaddr[3] = cm_node->loc_addr[0]; in irdma_init_tcp_ctx()
3319 tcp_info->src_port = cm_node->loc_port; in irdma_init_tcp_ctx()
3320 tcp_info->dst_port = cm_node->rem_port; in irdma_init_tcp_ctx()
3321 memcpy(tcp_info->dest_ip_addr, cm_node->rem_addr, in irdma_init_tcp_ctx()
3323 memcpy(tcp_info->local_ipaddr, cm_node->loc_addr, in irdma_init_tcp_ctx()
3339 struct irdma_cm_node *cm_node) in irdma_cm_init_tsa_conn() argument
3351 iwarp_info->ord_size = cm_node->ord_size; in irdma_cm_init_tsa_conn()
3352 iwarp_info->ird_size = cm_node->ird_size; in irdma_cm_init_tsa_conn()
3360 ctx_info->user_pri = cm_node->user_pri; in irdma_cm_init_tsa_conn()
3362 irdma_init_tcp_ctx(cm_node, &iwqp->tcp_info, iwqp); in irdma_cm_init_tsa_conn()
3363 if (cm_node->snd_mark_en) { in irdma_cm_init_tsa_conn()
3366 cm_node->lsmm_size; in irdma_cm_init_tsa_conn()
3369 cm_node->state = IRDMA_CM_STATE_OFFLOADED; in irdma_cm_init_tsa_conn()
3373 if (cm_node->rcv_mark_en) { in irdma_cm_init_tsa_conn()
3427 irdma_cm_close(iwqp->cm_node); in irdma_qp_disconnect()
3522 if (!iwqp->cm_node) { in irdma_cm_disconn_true()
3526 refcount_inc(&iwqp->cm_node->refcnt); in irdma_cm_disconn_true()
3531 err = irdma_send_cm_event(iwqp->cm_node, cm_id, in irdma_cm_disconn_true()
3541 err = irdma_send_cm_event(iwqp->cm_node, cm_id, in irdma_cm_disconn_true()
3549 irdma_rem_ref_cm_node(iwqp->cm_node); in irdma_cm_disconn_true()
3598 struct irdma_cm_node *cm_node; in irdma_accept() local
3616 cm_node = cm_id->provider_data; in irdma_accept()
3619 cm_node->ipv4 = true; in irdma_accept()
3620 cm_node->vlan_id = irdma_get_vlan_ipv4(cm_node->loc_addr); in irdma_accept()
3622 cm_node->ipv4 = false; in irdma_accept()
3623 irdma_netdev_vlan_ipv6(cm_node->loc_addr, &cm_node->vlan_id, in irdma_accept()
3627 cm_node->vlan_id); in irdma_accept()
3629 trace_irdma_accept(cm_node, 0, NULL); in irdma_accept()
3631 if (cm_node->state == IRDMA_CM_STATE_LISTENER_DESTROYED) { in irdma_accept()
3636 passive_state = atomic_add_return(1, &cm_node->passive_state); in irdma_accept()
3652 cm_node->pdata.size = conn_param->private_data_len; in irdma_accept()
3654 accept.size = irdma_cm_build_mpa_frame(cm_node, &accept, MPA_KEY_REPLY); in irdma_accept()
3658 if (cm_node->dev->ws_add(iwqp->sc_qp.vsi, cm_node->user_pri)) { in irdma_accept()
3662 iwqp->sc_qp.user_pri = cm_node->user_pri; in irdma_accept()
3680 cm_node->lsmm_size = accept.size + conn_param->private_data_len; in irdma_accept()
3681 irdma_sc_send_lsmm(&iwqp->sc_qp, iwqp->ietf_mem.va, cm_node->lsmm_size, in irdma_accept()
3688 cm_node->cm_id = cm_id; in irdma_accept()
3692 iwqp->cm_node = cm_node; in irdma_accept()
3693 cm_node->iwqp = iwqp; in irdma_accept()
3694 irdma_cm_init_tsa_conn(iwqp, cm_node); in irdma_accept()
3699 cm_node->qhash_set = false; in irdma_accept()
3700 cm_node->cm_core->cm_free_ah(cm_node); in irdma_accept()
3710 cm_node, cm_node->loc_port, in irdma_accept()
3711 cm_node->rem_port, cm_node->cm_id); in irdma_accept()
3717 irdma_send_cm_event(cm_node, cm_id, IW_CM_EVENT_ESTABLISHED, 0); in irdma_accept()
3718 cm_node->accelerated = true; in irdma_accept()
3719 complete(&cm_node->establish_comp); in irdma_accept()
3721 if (cm_node->accept_pend) { in irdma_accept()
3722 atomic_dec(&cm_node->listener->pend_accepts_cnt); in irdma_accept()
3723 cm_node->accept_pend = 0; in irdma_accept()
3728 cm_node->rem_port, cm_node->loc_port, cm_node->rem_addr, in irdma_accept()
3729 cm_node->loc_addr, cm_node, cm_id, ibqp->qp_num); in irdma_accept()
3730 cm_node->cm_core->stats_accepts++; in irdma_accept()
3735 irdma_rem_ref_cm_node(cm_node); in irdma_accept()
3749 struct irdma_cm_node *cm_node; in irdma_reject() local
3751 cm_node = cm_id->provider_data; in irdma_reject()
3752 cm_node->pdata.size = pdata_len; in irdma_reject()
3754 trace_irdma_reject(cm_node, 0, NULL); in irdma_reject()
3760 cm_node->cm_core->stats_rejects++; in irdma_reject()
3765 return irdma_cm_reject(cm_node, pdata, pdata_len); in irdma_reject()
3778 struct irdma_cm_node *cm_node; in irdma_connect() local
3850 &cm_node); in irdma_connect()
3853 ret = cm_node->cm_core->cm_create_ah(cm_node, true); in irdma_connect()
3862 cm_node->qhash_set = true; in irdma_connect()
3864 cm_node->apbvt_entry = irdma_add_apbvt(iwdev, cm_info.loc_port); in irdma_connect()
3865 if (!cm_node->apbvt_entry) { in irdma_connect()
3870 cm_node->apbvt_set = true; in irdma_connect()
3871 iwqp->cm_node = cm_node; in irdma_connect()
3872 cm_node->iwqp = iwqp; in irdma_connect()
3877 if (cm_node->state != IRDMA_CM_STATE_OFFLOADED) { in irdma_connect()
3878 cm_node->state = IRDMA_CM_STATE_SYN_SENT; in irdma_connect()
3879 ret = irdma_send_syn(cm_node, 0); in irdma_connect()
3886 cm_node->rem_port, cm_node->loc_port, cm_node->rem_addr, in irdma_connect()
3887 cm_node->loc_addr, cm_node, cm_id, ibqp->qp_num); in irdma_connect()
3889 trace_irdma_connect(cm_node, 0, NULL); in irdma_connect()
3902 irdma_rem_ref_cm_node(cm_node); in irdma_connect()
4055 struct irdma_cm_node *cm_node; in irdma_teardown_list_prep() local
4058 hash_for_each_rcu(cm_core->cm_hash_tbl, bkt, cm_node, list) { in irdma_teardown_list_prep()
4060 (nfo->vlan_id == cm_node->vlan_id && in irdma_teardown_list_prep()
4061 !memcmp(cm_node->loc_addr, ipaddr, nfo->ipv4 ? 4 : 16))) && in irdma_teardown_list_prep()
4062 refcount_inc_not_zero(&cm_node->refcnt)) in irdma_teardown_list_prep()
4063 list_add(&cm_node->teardown_entry, teardown_list); in irdma_teardown_list_prep()
4075 struct irdma_cm_node *cm_node; in irdma_cm_event_connected() local
4083 cm_node = event->cm_node; in irdma_cm_event_connected()
4084 cm_id = cm_node->cm_id; in irdma_cm_event_connected()
4093 irdma_cm_init_tsa_conn(iwqp, cm_node); in irdma_cm_event_connected()
4094 read0 = (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO); in irdma_cm_event_connected()
4102 cm_node->qhash_set = false; in irdma_cm_event_connected()
4111 cm_node, cm_node->loc_port, in irdma_cm_event_connected()
4112 cm_node->rem_port, cm_node->cm_id); in irdma_cm_event_connected()
4115 irdma_send_cm_event(cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY, 0); in irdma_cm_event_connected()
4116 cm_node->accelerated = true; in irdma_cm_event_connected()
4117 complete(&cm_node->establish_comp); in irdma_cm_event_connected()
4118 cm_node->cm_core->cm_free_ah(cm_node); in irdma_cm_event_connected()
4124 irdma_send_cm_event(event->cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY, in irdma_cm_event_connected()
4126 irdma_rem_ref_cm_node(event->cm_node); in irdma_cm_event_connected()
4135 struct irdma_cm_node *cm_node = event->cm_node; in irdma_cm_event_reset() local
4136 struct iw_cm_id *cm_id = cm_node->cm_id; in irdma_cm_event_reset()
4146 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_cm_event_reset()
4147 "CM: reset event %p - cm_id = %p\n", event->cm_node, cm_id); in irdma_cm_event_reset()
4150 irdma_send_cm_event(cm_node, cm_node->cm_id, IW_CM_EVENT_DISCONNECT, in irdma_cm_event_reset()
4152 irdma_send_cm_event(cm_node, cm_node->cm_id, IW_CM_EVENT_CLOSE, 0); in irdma_cm_event_reset()
4162 struct irdma_cm_node *cm_node; in irdma_cm_event_handler() local
4164 if (!event || !event->cm_node || !event->cm_node->cm_core) in irdma_cm_event_handler()
4167 cm_node = event->cm_node; in irdma_cm_event_handler()
4168 trace_irdma_cm_event_handler(cm_node, event->type, NULL); in irdma_cm_event_handler()
4172 irdma_send_cm_event(cm_node, cm_node->cm_id, in irdma_cm_event_handler()
4179 if (!event->cm_node->cm_id || in irdma_cm_event_handler()
4180 event->cm_node->state != IRDMA_CM_STATE_OFFLOADED) in irdma_cm_event_handler()
4185 if (!event->cm_node->cm_id || in irdma_cm_event_handler()
4186 cm_node->state == IRDMA_CM_STATE_OFFLOADED) in irdma_cm_event_handler()
4188 irdma_send_cm_event(cm_node, cm_node->cm_id, in irdma_cm_event_handler()
4192 if (!event->cm_node->cm_id || in irdma_cm_event_handler()
4193 event->cm_node->state == IRDMA_CM_STATE_OFFLOADED) in irdma_cm_event_handler()
4198 ibdev_dbg(&cm_node->iwdev->ibdev, in irdma_cm_event_handler()
4203 irdma_rem_ref_cm_node(event->cm_node); in irdma_cm_event_handler()
4213 refcount_inc(&event->cm_node->refcnt); in irdma_cm_post_event()
4215 queue_work(event->cm_node->cm_core->event_wq, &event->event_work); in irdma_cm_post_event()
4234 struct irdma_cm_node *cm_node; in irdma_cm_teardown_connections() local
4249 cm_node = container_of(list_node, struct irdma_cm_node, in irdma_cm_teardown_connections()
4252 irdma_modify_qp(&cm_node->iwqp->ibqp, &attr, IB_QP_STATE, NULL); in irdma_cm_teardown_connections()
4254 irdma_cm_disconn(cm_node->iwqp); in irdma_cm_teardown_connections()
4255 irdma_rem_ref_cm_node(cm_node); in irdma_cm_teardown_connections()