Lines Matching refs:cm_node
124 static void i40iw_record_ird_ord(struct i40iw_cm_node *cm_node, u32 conn_ird, in i40iw_record_ird_ord() argument
132 else if (!conn_ord && cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO) in i40iw_record_ird_ord()
135 cm_node->ird_size = conn_ird; in i40iw_record_ird_ord()
136 cm_node->ord_size = conn_ord; in i40iw_record_ird_ord()
170 static inline void i40iw_fill_sockaddr4(struct i40iw_cm_node *cm_node, in i40iw_fill_sockaddr4() argument
179 laddr->sin_port = htons(cm_node->loc_port); in i40iw_fill_sockaddr4()
180 raddr->sin_port = htons(cm_node->rem_port); in i40iw_fill_sockaddr4()
182 laddr->sin_addr.s_addr = htonl(cm_node->loc_addr[0]); in i40iw_fill_sockaddr4()
183 raddr->sin_addr.s_addr = htonl(cm_node->rem_addr[0]); in i40iw_fill_sockaddr4()
191 static inline void i40iw_fill_sockaddr6(struct i40iw_cm_node *cm_node, in i40iw_fill_sockaddr6() argument
200 laddr6->sin6_port = htons(cm_node->loc_port); in i40iw_fill_sockaddr6()
201 raddr6->sin6_port = htons(cm_node->rem_port); in i40iw_fill_sockaddr6()
204 cm_node->loc_addr); in i40iw_fill_sockaddr6()
206 cm_node->rem_addr); in i40iw_fill_sockaddr6()
214 static void i40iw_get_addr_info(struct i40iw_cm_node *cm_node, in i40iw_get_addr_info() argument
217 cm_info->ipv4 = cm_node->ipv4; in i40iw_get_addr_info()
218 cm_info->vlan_id = cm_node->vlan_id; in i40iw_get_addr_info()
219 memcpy(cm_info->loc_addr, cm_node->loc_addr, sizeof(cm_info->loc_addr)); in i40iw_get_addr_info()
220 memcpy(cm_info->rem_addr, cm_node->rem_addr, sizeof(cm_info->rem_addr)); in i40iw_get_addr_info()
221 cm_info->loc_port = cm_node->loc_port; in i40iw_get_addr_info()
222 cm_info->rem_port = cm_node->rem_port; in i40iw_get_addr_info()
223 cm_info->user_pri = cm_node->user_pri; in i40iw_get_addr_info()
232 static inline void i40iw_get_cmevent_info(struct i40iw_cm_node *cm_node, in i40iw_get_cmevent_info() argument
240 if (cm_node) { in i40iw_get_cmevent_info()
241 event->private_data = (void *)cm_node->pdata_buf; in i40iw_get_cmevent_info()
242 event->private_data_len = (u8)cm_node->pdata.size; in i40iw_get_cmevent_info()
243 event->ird = cm_node->ird_size; in i40iw_get_cmevent_info()
244 event->ord = cm_node->ord_size; in i40iw_get_cmevent_info()
255 static int i40iw_send_cm_event(struct i40iw_cm_node *cm_node, in i40iw_send_cm_event() argument
267 if (cm_node->ipv4) in i40iw_send_cm_event()
268 i40iw_fill_sockaddr4(cm_node, &event); in i40iw_send_cm_event()
270 i40iw_fill_sockaddr6(cm_node, &event); in i40iw_send_cm_event()
271 event.provider_data = (void *)cm_node; in i40iw_send_cm_event()
272 event.private_data = (void *)cm_node->pdata_buf; in i40iw_send_cm_event()
273 event.private_data_len = (u8)cm_node->pdata.size; in i40iw_send_cm_event()
274 event.ird = cm_node->ird_size; in i40iw_send_cm_event()
277 i40iw_get_cmevent_info(cm_node, cm_id, &event); in i40iw_send_cm_event()
280 event.ird = cm_node->ird_size; in i40iw_send_cm_event()
281 event.ord = cm_node->ord_size; in i40iw_send_cm_event()
299 static struct i40iw_cm_event *i40iw_create_event(struct i40iw_cm_node *cm_node, in i40iw_create_event() argument
304 if (!cm_node->cm_id) in i40iw_create_event()
313 event->cm_node = cm_node; in i40iw_create_event()
314 memcpy(event->cm_info.rem_addr, cm_node->rem_addr, sizeof(event->cm_info.rem_addr)); in i40iw_create_event()
315 memcpy(event->cm_info.loc_addr, cm_node->loc_addr, sizeof(event->cm_info.loc_addr)); in i40iw_create_event()
316 event->cm_info.rem_port = cm_node->rem_port; in i40iw_create_event()
317 event->cm_info.loc_port = cm_node->loc_port; in i40iw_create_event()
318 event->cm_info.cm_id = cm_node->cm_id; in i40iw_create_event()
320 i40iw_debug(cm_node->dev, in i40iw_create_event()
323 cm_node, in i40iw_create_event()
337 static void i40iw_free_retrans_entry(struct i40iw_cm_node *cm_node) in i40iw_free_retrans_entry() argument
339 struct i40iw_device *iwdev = cm_node->iwdev; in i40iw_free_retrans_entry()
342 send_entry = cm_node->send_entry; in i40iw_free_retrans_entry()
344 cm_node->send_entry = NULL; in i40iw_free_retrans_entry()
347 atomic_dec(&cm_node->ref_count); in i40iw_free_retrans_entry()
355 static void i40iw_cleanup_retrans_entry(struct i40iw_cm_node *cm_node) in i40iw_cleanup_retrans_entry() argument
359 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in i40iw_cleanup_retrans_entry()
360 i40iw_free_retrans_entry(cm_node); in i40iw_cleanup_retrans_entry()
361 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in i40iw_cleanup_retrans_entry()
372 static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node, in i40iw_form_cm_frame() argument
379 struct i40iw_sc_vsi *vsi = &cm_node->iwdev->vsi; in i40iw_form_cm_frame()
407 if (cm_node->vlan_id < VLAN_TAG_PRESENT) in i40iw_form_cm_frame()
410 if (cm_node->ipv4) in i40iw_form_cm_frame()
421 sqbuf->scratch = (void *)cm_node; in i40iw_form_cm_frame()
426 if (cm_node->ipv4) { in i40iw_form_cm_frame()
434 ether_addr_copy(ethh->h_dest, cm_node->rem_mac); in i40iw_form_cm_frame()
435 ether_addr_copy(ethh->h_source, cm_node->loc_mac); in i40iw_form_cm_frame()
436 if (cm_node->vlan_id < VLAN_TAG_PRESENT) { in i40iw_form_cm_frame()
438 vtag = (cm_node->user_pri << VLAN_PRIO_SHIFT) | cm_node->vlan_id; in i40iw_form_cm_frame()
448 iph->tos = cm_node->tos; in i40iw_form_cm_frame()
450 iph->id = htons(++cm_node->tcp_cntxt.loc_id); in i40iw_form_cm_frame()
455 iph->saddr = htonl(cm_node->loc_addr[0]); in i40iw_form_cm_frame()
456 iph->daddr = htonl(cm_node->rem_addr[0]); in i40iw_form_cm_frame()
464 ether_addr_copy(ethh->h_dest, cm_node->rem_mac); in i40iw_form_cm_frame()
465 ether_addr_copy(ethh->h_source, cm_node->loc_mac); in i40iw_form_cm_frame()
466 if (cm_node->vlan_id < VLAN_TAG_PRESENT) { in i40iw_form_cm_frame()
468 vtag = (cm_node->user_pri << VLAN_PRIO_SHIFT) | cm_node->vlan_id; in i40iw_form_cm_frame()
475 ip6h->priority = cm_node->tos >> 4; in i40iw_form_cm_frame()
476 ip6h->flow_lbl[0] = cm_node->tos << 4; in i40iw_form_cm_frame()
483 cm_node->loc_addr); in i40iw_form_cm_frame()
485 cm_node->rem_addr); in i40iw_form_cm_frame()
488 tcph->source = htons(cm_node->loc_port); in i40iw_form_cm_frame()
489 tcph->dest = htons(cm_node->rem_port); in i40iw_form_cm_frame()
491 tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num); in i40iw_form_cm_frame()
494 cm_node->tcp_cntxt.loc_ack_num = cm_node->tcp_cntxt.rcv_nxt; in i40iw_form_cm_frame()
495 tcph->ack_seq = htonl(cm_node->tcp_cntxt.loc_ack_num); in i40iw_form_cm_frame()
502 cm_node->tcp_cntxt.loc_seq_num++; in i40iw_form_cm_frame()
505 cm_node->tcp_cntxt.loc_seq_num += hdr_len + pd_len; in i40iw_form_cm_frame()
509 cm_node->tcp_cntxt.loc_seq_num++; in i40iw_form_cm_frame()
518 tcph->window = htons(cm_node->tcp_cntxt.rcv_wnd); in i40iw_form_cm_frame()
543 int i40iw_send_reset(struct i40iw_cm_node *cm_node) in i40iw_send_reset() argument
548 sqbuf = i40iw_form_cm_frame(cm_node, NULL, NULL, NULL, flags); in i40iw_send_reset()
554 return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 0, 1); in i40iw_send_reset()
562 static void i40iw_active_open_err(struct i40iw_cm_node *cm_node, bool reset) in i40iw_active_open_err() argument
564 i40iw_cleanup_retrans_entry(cm_node); in i40iw_active_open_err()
565 cm_node->cm_core->stats_connect_errs++; in i40iw_active_open_err()
567 i40iw_debug(cm_node->dev, in i40iw_active_open_err()
571 cm_node, in i40iw_active_open_err()
572 cm_node->state); in i40iw_active_open_err()
573 atomic_inc(&cm_node->ref_count); in i40iw_active_open_err()
574 i40iw_send_reset(cm_node); in i40iw_active_open_err()
577 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_active_open_err()
578 i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED); in i40iw_active_open_err()
586 static void i40iw_passive_open_err(struct i40iw_cm_node *cm_node, bool reset) in i40iw_passive_open_err() argument
588 i40iw_cleanup_retrans_entry(cm_node); in i40iw_passive_open_err()
589 cm_node->cm_core->stats_passive_errs++; in i40iw_passive_open_err()
590 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_passive_open_err()
591 i40iw_debug(cm_node->dev, in i40iw_passive_open_err()
595 cm_node, in i40iw_passive_open_err()
596 cm_node->state); in i40iw_passive_open_err()
598 i40iw_send_reset(cm_node); in i40iw_passive_open_err()
600 i40iw_rem_ref_cm_node(cm_node); in i40iw_passive_open_err()
612 cm_id = event->cm_node->cm_id; in i40iw_event_connect_error()
623 i40iw_send_cm_event(event->cm_node, cm_id, in i40iw_event_connect_error()
627 i40iw_rem_ref_cm_node(event->cm_node); in i40iw_event_connect_error()
637 static int i40iw_process_options(struct i40iw_cm_node *cm_node, in i40iw_process_options() argument
657 i40iw_debug(cm_node->dev, in i40iw_process_options()
668 if (tmp > 0 && tmp < cm_node->tcp_cntxt.mss) in i40iw_process_options()
669 cm_node->tcp_cntxt.mss = tmp; in i40iw_process_options()
672 cm_node->tcp_cntxt.snd_wscale = in i40iw_process_options()
676 i40iw_debug(cm_node->dev, in i40iw_process_options()
685 cm_node->tcp_cntxt.mss = I40IW_CM_DEFAULT_MSS; in i40iw_process_options()
696 static int i40iw_handle_tcp_options(struct i40iw_cm_node *cm_node, in i40iw_handle_tcp_options() argument
704 if (i40iw_process_options(cm_node, in i40iw_handle_tcp_options()
708 i40iw_debug(cm_node->dev, in i40iw_handle_tcp_options()
712 cm_node); in i40iw_handle_tcp_options()
714 i40iw_passive_open_err(cm_node, true); in i40iw_handle_tcp_options()
716 i40iw_active_open_err(cm_node, true); in i40iw_handle_tcp_options()
721 cm_node->tcp_cntxt.snd_wnd = ntohs(tcph->window) << in i40iw_handle_tcp_options()
722 cm_node->tcp_cntxt.snd_wscale; in i40iw_handle_tcp_options()
724 if (cm_node->tcp_cntxt.snd_wnd > cm_node->tcp_cntxt.max_snd_wnd) in i40iw_handle_tcp_options()
725 cm_node->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.snd_wnd; in i40iw_handle_tcp_options()
734 static void i40iw_build_mpa_v1(struct i40iw_cm_node *cm_node, in i40iw_build_mpa_v1() argument
751 mpa_frame->rev = cm_node->mpa_frame_rev; in i40iw_build_mpa_v1()
752 mpa_frame->priv_data_len = htons(cm_node->pdata.size); in i40iw_build_mpa_v1()
761 static void i40iw_build_mpa_v2(struct i40iw_cm_node *cm_node, in i40iw_build_mpa_v2() argument
770 i40iw_build_mpa_v1(cm_node, start_addr, mpa_key); in i40iw_build_mpa_v2()
775 if (cm_node->mpav2_ird_ord == IETF_NO_IRD_ORD) { in i40iw_build_mpa_v2()
779 ctrl_ird = (cm_node->ird_size > IETF_NO_IRD_ORD) ? in i40iw_build_mpa_v2()
780 IETF_NO_IRD_ORD : cm_node->ird_size; in i40iw_build_mpa_v2()
781 ctrl_ord = (cm_node->ord_size > IETF_NO_IRD_ORD) ? in i40iw_build_mpa_v2()
782 IETF_NO_IRD_ORD : cm_node->ord_size; in i40iw_build_mpa_v2()
793 switch (cm_node->send_rdma0_op) { in i40iw_build_mpa_v2()
815 static int i40iw_cm_build_mpa_frame(struct i40iw_cm_node *cm_node, in i40iw_cm_build_mpa_frame() argument
821 switch (cm_node->mpa_frame_rev) { in i40iw_cm_build_mpa_frame()
824 i40iw_build_mpa_v1(cm_node, mpa->addr, mpa_key); in i40iw_cm_build_mpa_frame()
828 i40iw_build_mpa_v2(cm_node, mpa->addr, mpa_key); in i40iw_cm_build_mpa_frame()
841 static int i40iw_send_mpa_request(struct i40iw_cm_node *cm_node) in i40iw_send_mpa_request() argument
845 if (!cm_node) { in i40iw_send_mpa_request()
850 cm_node->mpa_hdr.addr = &cm_node->mpa_frame; in i40iw_send_mpa_request()
851 cm_node->mpa_hdr.size = i40iw_cm_build_mpa_frame(cm_node, in i40iw_send_mpa_request()
852 &cm_node->mpa_hdr, in i40iw_send_mpa_request()
854 if (!cm_node->mpa_hdr.size) { in i40iw_send_mpa_request()
855 i40iw_pr_err("mpa size = %d\n", cm_node->mpa_hdr.size); in i40iw_send_mpa_request()
859 sqbuf = i40iw_form_cm_frame(cm_node, in i40iw_send_mpa_request()
861 &cm_node->mpa_hdr, in i40iw_send_mpa_request()
862 &cm_node->pdata, in i40iw_send_mpa_request()
868 return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 1, 0); in i40iw_send_mpa_request()
877 static int i40iw_send_mpa_reject(struct i40iw_cm_node *cm_node, in i40iw_send_mpa_reject() argument
884 cm_node->mpa_hdr.addr = &cm_node->mpa_frame; in i40iw_send_mpa_reject()
885 cm_node->mpa_hdr.size = i40iw_cm_build_mpa_frame(cm_node, in i40iw_send_mpa_reject()
886 &cm_node->mpa_hdr, in i40iw_send_mpa_reject()
889 cm_node->mpa_frame.flags |= IETF_MPA_FLAGS_REJECT; in i40iw_send_mpa_reject()
893 sqbuf = i40iw_form_cm_frame(cm_node, in i40iw_send_mpa_reject()
895 &cm_node->mpa_hdr, in i40iw_send_mpa_reject()
902 cm_node->state = I40IW_CM_STATE_FIN_WAIT1; in i40iw_send_mpa_reject()
903 return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 1, 0); in i40iw_send_mpa_reject()
913 static int i40iw_parse_mpa(struct i40iw_cm_node *cm_node, u8 *buffer, u32 *type, u32 len) in i40iw_parse_mpa() argument
940 if (mpa_frame->rev > cm_node->mpa_frame_rev) { in i40iw_parse_mpa()
944 cm_node->mpa_frame_rev = mpa_frame->rev; in i40iw_parse_mpa()
946 if (cm_node->state != I40IW_CM_STATE_MPAREQ_SENT) { in i40iw_parse_mpa()
989 cm_node->mpav2_ird_ord = IETF_NO_IRD_ORD; in i40iw_parse_mpa()
993 if (cm_node->state != I40IW_CM_STATE_MPAREQ_SENT) { in i40iw_parse_mpa()
996 cm_node->ird_size = 1; in i40iw_parse_mpa()
997 if (cm_node->ord_size > ird_size) in i40iw_parse_mpa()
998 cm_node->ord_size = ird_size; in i40iw_parse_mpa()
1003 if (cm_node->ord_size > ird_size) in i40iw_parse_mpa()
1004 cm_node->ord_size = ird_size; in i40iw_parse_mpa()
1006 if (cm_node->ird_size < ord_size) in i40iw_parse_mpa()
1013 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in i40iw_parse_mpa()
1015 cm_node->send_rdma0_op = SEND_RDMA_WRITE_ZERO; in i40iw_parse_mpa()
1018 i40iw_debug(cm_node->dev, I40IW_DEBUG_CM, in i40iw_parse_mpa()
1020 cm_node->ord_size, cm_node->ird_size); in i40iw_parse_mpa()
1029 memcpy(cm_node->pdata_buf, buffer + mpa_hdr_len, priv_data_len); in i40iw_parse_mpa()
1030 cm_node->pdata.size = priv_data_len; in i40iw_parse_mpa()
1036 cm_node->snd_mark_en = true; in i40iw_parse_mpa()
1054 int i40iw_schedule_cm_timer(struct i40iw_cm_node *cm_node, in i40iw_schedule_cm_timer() argument
1060 struct i40iw_sc_vsi *vsi = &cm_node->iwdev->vsi; in i40iw_schedule_cm_timer()
1061 struct i40iw_cm_core *cm_core = cm_node->cm_core; in i40iw_schedule_cm_timer()
1083 if (cm_node->close_entry) { in i40iw_schedule_cm_timer()
1088 cm_node->close_entry = new_send; in i40iw_schedule_cm_timer()
1092 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in i40iw_schedule_cm_timer()
1093 cm_node->send_entry = new_send; in i40iw_schedule_cm_timer()
1094 atomic_inc(&cm_node->ref_count); in i40iw_schedule_cm_timer()
1095 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in i40iw_schedule_cm_timer()
1101 i40iw_cleanup_retrans_entry(cm_node); in i40iw_schedule_cm_timer()
1103 i40iw_rem_ref_cm_node(cm_node); in i40iw_schedule_cm_timer()
1124 static void i40iw_retrans_expired(struct i40iw_cm_node *cm_node) in i40iw_retrans_expired() argument
1126 struct iw_cm_id *cm_id = cm_node->cm_id; in i40iw_retrans_expired()
1127 enum i40iw_cm_node_state state = cm_node->state; in i40iw_retrans_expired()
1129 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_retrans_expired()
1133 i40iw_rem_ref_cm_node(cm_node); in i40iw_retrans_expired()
1137 if (cm_node->cm_id) in i40iw_retrans_expired()
1139 i40iw_send_reset(cm_node); in i40iw_retrans_expired()
1142 atomic_inc(&cm_node->ref_count); in i40iw_retrans_expired()
1143 i40iw_send_reset(cm_node); in i40iw_retrans_expired()
1144 i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED); in i40iw_retrans_expired()
1154 static void i40iw_handle_close_entry(struct i40iw_cm_node *cm_node, u32 rem_node) in i40iw_handle_close_entry() argument
1156 struct i40iw_timer_entry *close_entry = cm_node->close_entry; in i40iw_handle_close_entry()
1157 struct iw_cm_id *cm_id = cm_node->cm_id; in i40iw_handle_close_entry()
1178 i40iw_rem_ref_cm_node(cm_node); in i40iw_handle_close_entry()
1183 cm_node->close_entry = NULL; in i40iw_handle_close_entry()
1194 struct i40iw_cm_node *cm_node; in i40iw_build_timer_list() local
1198 cm_node = container_of(list_node, struct i40iw_cm_node, list); in i40iw_build_timer_list()
1199 if (cm_node->close_entry || cm_node->send_entry) { in i40iw_build_timer_list()
1200 atomic_inc(&cm_node->ref_count); in i40iw_build_timer_list()
1201 list_add(&cm_node->timer_entry, timer_list); in i40iw_build_timer_list()
1213 struct i40iw_cm_node *cm_node; in i40iw_cm_timer_tick() local
1233 cm_node = container_of(list_node, in i40iw_cm_timer_tick()
1236 close_entry = cm_node->close_entry; in i40iw_cm_timer_tick()
1246 i40iw_handle_close_entry(cm_node, 1); in i40iw_cm_timer_tick()
1250 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in i40iw_cm_timer_tick()
1252 send_entry = cm_node->send_entry; in i40iw_cm_timer_tick()
1256 if (cm_node->state != I40IW_CM_STATE_OFFLOADED) { in i40iw_cm_timer_tick()
1263 i40iw_free_retrans_entry(cm_node); in i40iw_cm_timer_tick()
1268 if ((cm_node->state == I40IW_CM_STATE_OFFLOADED) || in i40iw_cm_timer_tick()
1269 (cm_node->state == I40IW_CM_STATE_CLOSED)) { in i40iw_cm_timer_tick()
1270 i40iw_free_retrans_entry(cm_node); in i40iw_cm_timer_tick()
1275 i40iw_free_retrans_entry(cm_node); in i40iw_cm_timer_tick()
1277 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in i40iw_cm_timer_tick()
1278 i40iw_retrans_expired(cm_node); in i40iw_cm_timer_tick()
1279 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_cm_timer_tick()
1280 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in i40iw_cm_timer_tick()
1283 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in i40iw_cm_timer_tick()
1285 vsi = &cm_node->iwdev->vsi; in i40iw_cm_timer_tick()
1287 if (!cm_node->ack_rcvd) { in i40iw_cm_timer_tick()
1290 cm_node->cm_core->stats_pkt_retrans++; in i40iw_cm_timer_tick()
1292 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in i40iw_cm_timer_tick()
1309 i40iw_debug(cm_node->dev, in i40iw_cm_timer_tick()
1312 cm_node, in i40iw_cm_timer_tick()
1313 cm_node->state); in i40iw_cm_timer_tick()
1314 i40iw_free_retrans_entry(cm_node); in i40iw_cm_timer_tick()
1316 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_timer_tick()
1319 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in i40iw_cm_timer_tick()
1320 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_timer_tick()
1338 int i40iw_send_syn(struct i40iw_cm_node *cm_node, u32 sendack) in i40iw_send_syn() argument
1352 if (!cm_node) { in i40iw_send_syn()
1360 options->as_mss.mss = htons(cm_node->tcp_cntxt.mss); in i40iw_send_syn()
1366 options->as_windowscale.shiftcount = cm_node->tcp_cntxt.rcv_wscale; in i40iw_send_syn()
1377 sqbuf = i40iw_form_cm_frame(cm_node, &opts, NULL, NULL, flags); in i40iw_send_syn()
1382 return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 1, 0); in i40iw_send_syn()
1389 static void i40iw_send_ack(struct i40iw_cm_node *cm_node) in i40iw_send_ack() argument
1392 struct i40iw_sc_vsi *vsi = &cm_node->iwdev->vsi; in i40iw_send_ack()
1394 sqbuf = i40iw_form_cm_frame(cm_node, NULL, NULL, NULL, SET_ACK); in i40iw_send_ack()
1405 static int i40iw_send_fin(struct i40iw_cm_node *cm_node) in i40iw_send_fin() argument
1409 sqbuf = i40iw_form_cm_frame(cm_node, NULL, NULL, NULL, SET_ACK | SET_FIN); in i40iw_send_fin()
1414 return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 1, 0); in i40iw_send_fin()
1436 struct i40iw_cm_node *cm_node; in i40iw_find_node() local
1444 list_for_each_entry(cm_node, hte, list) { in i40iw_find_node()
1445 if (!memcmp(cm_node->loc_addr, loc_addr, sizeof(cm_node->loc_addr)) && in i40iw_find_node()
1446 (cm_node->loc_port == loc_port) && in i40iw_find_node()
1447 !memcmp(cm_node->rem_addr, rem_addr, sizeof(cm_node->rem_addr)) && in i40iw_find_node()
1448 (cm_node->rem_port == rem_port)) { in i40iw_find_node()
1450 atomic_inc(&cm_node->ref_count); in i40iw_find_node()
1452 return cm_node; in i40iw_find_node()
1507 struct i40iw_cm_node *cm_node) in i40iw_add_hte_node() argument
1511 if (!cm_node || !cm_core) { in i40iw_add_hte_node()
1517 list_add_tail(&cm_node->list, &cm_core->non_accelerated_list); in i40iw_add_hte_node()
1528 struct i40iw_cm_node *cm_node; in i40iw_find_port() local
1530 list_for_each_entry(cm_node, hte, list) { in i40iw_find_port()
1531 if (cm_node->loc_port == port) in i40iw_find_port()
1845 struct i40iw_cm_node *cm_node; in i40iw_dec_refcnt_listen() local
1858 cm_node = container_of(list_pos, struct i40iw_cm_node, list); in i40iw_dec_refcnt_listen()
1859 if ((cm_node->listener == listener) && in i40iw_dec_refcnt_listen()
1860 !cm_node->accelerated) { in i40iw_dec_refcnt_listen()
1861 atomic_inc(&cm_node->ref_count); in i40iw_dec_refcnt_listen()
1862 list_add(&cm_node->reset_entry, &reset_list); in i40iw_dec_refcnt_listen()
1869 cm_node = container_of(list_pos, struct i40iw_cm_node, reset_entry); in i40iw_dec_refcnt_listen()
1870 loopback = cm_node->loopbackpartner; in i40iw_dec_refcnt_listen()
1871 if (cm_node->state >= I40IW_CM_STATE_FIN_WAIT1) { in i40iw_dec_refcnt_listen()
1872 i40iw_rem_ref_cm_node(cm_node); in i40iw_dec_refcnt_listen()
1875 i40iw_cleanup_retrans_entry(cm_node); in i40iw_dec_refcnt_listen()
1876 err = i40iw_send_reset(cm_node); in i40iw_dec_refcnt_listen()
1878 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_dec_refcnt_listen()
1881 old_state = cm_node->state; in i40iw_dec_refcnt_listen()
1882 cm_node->state = I40IW_CM_STATE_LISTENER_DESTROYED; in i40iw_dec_refcnt_listen()
1884 i40iw_rem_ref_cm_node(cm_node); in i40iw_dec_refcnt_listen()
1889 event.cm_node = loopback; in i40iw_dec_refcnt_listen()
1901 cm_node->state = I40IW_CM_STATE_LISTENER_DESTROYED; in i40iw_dec_refcnt_listen()
1902 i40iw_rem_ref_cm_node(cm_node); in i40iw_dec_refcnt_listen()
2167 struct i40iw_cm_node *cm_node; in i40iw_make_cm_node() local
2173 cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC); in i40iw_make_cm_node()
2174 if (!cm_node) in i40iw_make_cm_node()
2178 cm_node->ipv4 = cm_info->ipv4; in i40iw_make_cm_node()
2179 cm_node->vlan_id = cm_info->vlan_id; in i40iw_make_cm_node()
2180 if ((cm_node->vlan_id == I40IW_NO_VLAN) && iwdev->dcb) in i40iw_make_cm_node()
2181 cm_node->vlan_id = 0; in i40iw_make_cm_node()
2182 cm_node->tos = cm_info->tos; in i40iw_make_cm_node()
2183 cm_node->user_pri = cm_info->user_pri; in i40iw_make_cm_node()
2189 cm_node->tos = max(listener->tos, cm_info->tos); in i40iw_make_cm_node()
2190 cm_node->user_pri = rt_tos2priority(cm_node->tos); in i40iw_make_cm_node()
2192 cm_node->tos, cm_node->user_pri); in i40iw_make_cm_node()
2194 memcpy(cm_node->loc_addr, cm_info->loc_addr, sizeof(cm_node->loc_addr)); in i40iw_make_cm_node()
2195 memcpy(cm_node->rem_addr, cm_info->rem_addr, sizeof(cm_node->rem_addr)); in i40iw_make_cm_node()
2196 cm_node->loc_port = cm_info->loc_port; in i40iw_make_cm_node()
2197 cm_node->rem_port = cm_info->rem_port; in i40iw_make_cm_node()
2199 cm_node->mpa_frame_rev = iwdev->mpa_version; in i40iw_make_cm_node()
2200 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in i40iw_make_cm_node()
2201 cm_node->ird_size = I40IW_MAX_IRD_SIZE; in i40iw_make_cm_node()
2202 cm_node->ord_size = I40IW_MAX_ORD_SIZE; in i40iw_make_cm_node()
2204 cm_node->listener = listener; in i40iw_make_cm_node()
2205 cm_node->cm_id = cm_info->cm_id; in i40iw_make_cm_node()
2206 ether_addr_copy(cm_node->loc_mac, netdev->dev_addr); in i40iw_make_cm_node()
2207 spin_lock_init(&cm_node->retrans_list_lock); in i40iw_make_cm_node()
2208 cm_node->ack_rcvd = false; in i40iw_make_cm_node()
2210 atomic_set(&cm_node->ref_count, 1); in i40iw_make_cm_node()
2212 cm_node->cm_core = cm_core; in i40iw_make_cm_node()
2213 cm_node->tcp_cntxt.loc_id = I40IW_CM_DEF_LOCAL_ID; in i40iw_make_cm_node()
2214 cm_node->tcp_cntxt.rcv_wscale = I40IW_CM_DEFAULT_RCV_WND_SCALE; in i40iw_make_cm_node()
2215 cm_node->tcp_cntxt.rcv_wnd = in i40iw_make_cm_node()
2217 if (cm_node->ipv4) { in i40iw_make_cm_node()
2218 cm_node->tcp_cntxt.loc_seq_num = secure_tcp_seq(htonl(cm_node->loc_addr[0]), in i40iw_make_cm_node()
2219 htonl(cm_node->rem_addr[0]), in i40iw_make_cm_node()
2220 htons(cm_node->loc_port), in i40iw_make_cm_node()
2221 htons(cm_node->rem_port)); in i40iw_make_cm_node()
2222 cm_node->tcp_cntxt.mss = iwdev->vsi.mtu - I40IW_MTU_TO_MSS_IPV4; in i40iw_make_cm_node()
2225 htonl(cm_node->loc_addr[0]), htonl(cm_node->loc_addr[1]), in i40iw_make_cm_node()
2226 htonl(cm_node->loc_addr[2]), htonl(cm_node->loc_addr[3]) in i40iw_make_cm_node()
2229 htonl(cm_node->rem_addr[0]), htonl(cm_node->rem_addr[1]), in i40iw_make_cm_node()
2230 htonl(cm_node->rem_addr[2]), htonl(cm_node->rem_addr[3]) in i40iw_make_cm_node()
2232 cm_node->tcp_cntxt.loc_seq_num = secure_tcpv6_seq(loc, rem, in i40iw_make_cm_node()
2233 htons(cm_node->loc_port), in i40iw_make_cm_node()
2234 htons(cm_node->rem_port)); in i40iw_make_cm_node()
2235 cm_node->tcp_cntxt.mss = iwdev->vsi.mtu - I40IW_MTU_TO_MSS_IPV6; in i40iw_make_cm_node()
2238 cm_node->iwdev = iwdev; in i40iw_make_cm_node()
2239 cm_node->dev = &iwdev->sc_dev; in i40iw_make_cm_node()
2241 if ((cm_node->ipv4 && in i40iw_make_cm_node()
2242 i40iw_ipv4_is_loopback(cm_node->loc_addr[0], cm_node->rem_addr[0])) || in i40iw_make_cm_node()
2243 (!cm_node->ipv4 && i40iw_ipv6_is_loopback(cm_node->loc_addr, in i40iw_make_cm_node()
2244 cm_node->rem_addr))) { in i40iw_make_cm_node()
2246 cm_node->rem_addr, in i40iw_make_cm_node()
2252 cm_node->rem_addr, in i40iw_make_cm_node()
2256 if (cm_node->ipv4) in i40iw_make_cm_node()
2271 kfree(cm_node); in i40iw_make_cm_node()
2274 ether_addr_copy(cm_node->rem_mac, iwdev->arp_table[arpindex].mac_addr); in i40iw_make_cm_node()
2275 i40iw_add_hte_node(cm_core, cm_node); in i40iw_make_cm_node()
2277 return cm_node; in i40iw_make_cm_node()
2284 static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node) in i40iw_rem_ref_cm_node() argument
2286 struct i40iw_cm_core *cm_core = cm_node->cm_core; in i40iw_rem_ref_cm_node()
2291 spin_lock_irqsave(&cm_node->cm_core->ht_lock, flags); in i40iw_rem_ref_cm_node()
2292 if (atomic_dec_return(&cm_node->ref_count)) { in i40iw_rem_ref_cm_node()
2293 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in i40iw_rem_ref_cm_node()
2296 list_del(&cm_node->list); in i40iw_rem_ref_cm_node()
2297 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in i40iw_rem_ref_cm_node()
2300 if (!cm_node->accelerated && cm_node->accept_pend) { in i40iw_rem_ref_cm_node()
2302 atomic_dec(&cm_node->listener->pend_accepts_cnt); in i40iw_rem_ref_cm_node()
2304 if (cm_node->close_entry) in i40iw_rem_ref_cm_node()
2305 i40iw_handle_close_entry(cm_node, 0); in i40iw_rem_ref_cm_node()
2306 if (cm_node->listener) { in i40iw_rem_ref_cm_node()
2307 i40iw_dec_refcnt_listen(cm_core, cm_node->listener, 0, true); in i40iw_rem_ref_cm_node()
2309 if (cm_node->apbvt_set) { in i40iw_rem_ref_cm_node()
2310 i40iw_manage_apbvt(cm_node->iwdev, in i40iw_rem_ref_cm_node()
2311 cm_node->loc_port, in i40iw_rem_ref_cm_node()
2313 cm_node->apbvt_set = 0; in i40iw_rem_ref_cm_node()
2315 i40iw_get_addr_info(cm_node, &nfo); in i40iw_rem_ref_cm_node()
2316 if (cm_node->qhash_set) { in i40iw_rem_ref_cm_node()
2317 i40iw_manage_qhash(cm_node->iwdev, in i40iw_rem_ref_cm_node()
2323 cm_node->qhash_set = 0; in i40iw_rem_ref_cm_node()
2327 iwqp = cm_node->iwqp; in i40iw_rem_ref_cm_node()
2329 iwqp->cm_node = NULL; in i40iw_rem_ref_cm_node()
2331 cm_node->iwqp = NULL; in i40iw_rem_ref_cm_node()
2332 } else if (cm_node->qhash_set) { in i40iw_rem_ref_cm_node()
2333 i40iw_get_addr_info(cm_node, &nfo); in i40iw_rem_ref_cm_node()
2334 i40iw_manage_qhash(cm_node->iwdev, in i40iw_rem_ref_cm_node()
2340 cm_node->qhash_set = 0; in i40iw_rem_ref_cm_node()
2343 cm_node->cm_core->stats_nodes_destroyed++; in i40iw_rem_ref_cm_node()
2344 kfree(cm_node); in i40iw_rem_ref_cm_node()
2351 static void i40iw_handle_fin_pkt(struct i40iw_cm_node *cm_node) in i40iw_handle_fin_pkt() argument
2355 switch (cm_node->state) { in i40iw_handle_fin_pkt()
2360 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2361 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2362 cm_node->state = I40IW_CM_STATE_LAST_ACK; in i40iw_handle_fin_pkt()
2363 i40iw_send_fin(cm_node); in i40iw_handle_fin_pkt()
2366 i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED); in i40iw_handle_fin_pkt()
2367 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2368 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2369 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_fin_pkt()
2370 atomic_inc(&cm_node->ref_count); in i40iw_handle_fin_pkt()
2371 i40iw_send_reset(cm_node); in i40iw_handle_fin_pkt()
2374 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2375 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2376 cm_node->state = I40IW_CM_STATE_CLOSING; in i40iw_handle_fin_pkt()
2377 i40iw_send_ack(cm_node); in i40iw_handle_fin_pkt()
2385 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2386 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2387 cm_node->state = I40IW_CM_STATE_TIME_WAIT; in i40iw_handle_fin_pkt()
2388 i40iw_send_ack(cm_node); in i40iw_handle_fin_pkt()
2390 i40iw_schedule_cm_timer(cm_node, NULL, I40IW_TIMER_TYPE_CLOSE, 1, 0); in i40iw_handle_fin_pkt()
2392 i40iw_pr_err("node %p state = %d\n", cm_node, cm_node->state); in i40iw_handle_fin_pkt()
2395 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2396 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2397 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_fin_pkt()
2398 i40iw_rem_ref_cm_node(cm_node); in i40iw_handle_fin_pkt()
2402 i40iw_pr_err("bad state node %p state = %d\n", cm_node, cm_node->state); in i40iw_handle_fin_pkt()
2412 static void i40iw_handle_rst_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_rst_pkt() argument
2415 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_rst_pkt()
2416 switch (cm_node->state) { in i40iw_handle_rst_pkt()
2419 switch (cm_node->mpa_frame_rev) { in i40iw_handle_rst_pkt()
2421 cm_node->mpa_frame_rev = IETF_MPA_V1; in i40iw_handle_rst_pkt()
2423 cm_node->state = I40IW_CM_STATE_SYN_SENT; in i40iw_handle_rst_pkt()
2424 if (i40iw_send_syn(cm_node, 0)) in i40iw_handle_rst_pkt()
2425 i40iw_active_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2429 i40iw_active_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2434 atomic_add_return(1, &cm_node->passive_state); in i40iw_handle_rst_pkt()
2439 i40iw_pr_err("Bad state state = %d\n", cm_node->state); in i40iw_handle_rst_pkt()
2440 i40iw_passive_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2443 i40iw_active_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2450 cm_node->cm_id->rem_ref(cm_node->cm_id); in i40iw_handle_rst_pkt()
2453 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_rst_pkt()
2454 i40iw_rem_ref_cm_node(cm_node); in i40iw_handle_rst_pkt()
2466 static void i40iw_handle_rcv_mpa(struct i40iw_cm_node *cm_node, in i40iw_handle_rcv_mpa() argument
2476 ret = i40iw_parse_mpa(cm_node, dataloc, &res_type, datasize); in i40iw_handle_rcv_mpa()
2478 if (cm_node->state == I40IW_CM_STATE_MPAREQ_SENT) in i40iw_handle_rcv_mpa()
2479 i40iw_active_open_err(cm_node, true); in i40iw_handle_rcv_mpa()
2481 i40iw_passive_open_err(cm_node, true); in i40iw_handle_rcv_mpa()
2485 switch (cm_node->state) { in i40iw_handle_rcv_mpa()
2489 cm_node->state = I40IW_CM_STATE_MPAREQ_RCVD; in i40iw_handle_rcv_mpa()
2491 i40iw_send_ack(cm_node); /* ACK received MPA request */ in i40iw_handle_rcv_mpa()
2492 atomic_set(&cm_node->passive_state, in i40iw_handle_rcv_mpa()
2496 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_rcv_mpa()
2499 cm_node->state = I40IW_CM_STATE_MPAREJ_RCVD; in i40iw_handle_rcv_mpa()
2502 cm_node->state = I40IW_CM_STATE_OFFLOADED; in i40iw_handle_rcv_mpa()
2504 i40iw_send_ack(cm_node); in i40iw_handle_rcv_mpa()
2507 pr_err("%s wrong cm_node state =%d\n", __func__, cm_node->state); in i40iw_handle_rcv_mpa()
2510 i40iw_create_event(cm_node, type); in i40iw_handle_rcv_mpa()
2517 static void i40iw_indicate_pkt_err(struct i40iw_cm_node *cm_node) in i40iw_indicate_pkt_err() argument
2519 switch (cm_node->state) { in i40iw_indicate_pkt_err()
2522 i40iw_active_open_err(cm_node, true); in i40iw_indicate_pkt_err()
2526 i40iw_passive_open_err(cm_node, true); in i40iw_indicate_pkt_err()
2539 static int i40iw_check_syn(struct i40iw_cm_node *cm_node, struct tcphdr *tcph) in i40iw_check_syn() argument
2543 if (ntohl(tcph->ack_seq) != cm_node->tcp_cntxt.loc_seq_num) { in i40iw_check_syn()
2545 i40iw_active_open_err(cm_node, true); in i40iw_check_syn()
2555 static int i40iw_check_seq(struct i40iw_cm_node *cm_node, struct tcphdr *tcph) in i40iw_check_seq() argument
2560 u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num; in i40iw_check_seq()
2561 u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt; in i40iw_check_seq()
2566 rcv_wnd = cm_node->tcp_cntxt.rcv_wnd; in i40iw_check_seq()
2573 i40iw_indicate_pkt_err(cm_node); in i40iw_check_seq()
2583 static void i40iw_handle_syn_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_syn_pkt() argument
2595 switch (cm_node->state) { in i40iw_handle_syn_pkt()
2599 i40iw_active_open_err(cm_node, 1); in i40iw_handle_syn_pkt()
2603 if (atomic_read(&cm_node->listener->pend_accepts_cnt) > in i40iw_handle_syn_pkt()
2604 cm_node->listener->backlog) { in i40iw_handle_syn_pkt()
2605 cm_node->cm_core->stats_backlog_drops++; in i40iw_handle_syn_pkt()
2606 i40iw_passive_open_err(cm_node, false); in i40iw_handle_syn_pkt()
2609 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 1); in i40iw_handle_syn_pkt()
2611 i40iw_passive_open_err(cm_node, false); in i40iw_handle_syn_pkt()
2615 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in i40iw_handle_syn_pkt()
2616 cm_node->accept_pend = 1; in i40iw_handle_syn_pkt()
2617 atomic_inc(&cm_node->listener->pend_accepts_cnt); in i40iw_handle_syn_pkt()
2619 cm_node->state = I40IW_CM_STATE_SYN_RCVD; in i40iw_handle_syn_pkt()
2620 i40iw_get_addr_info(cm_node, &nfo); in i40iw_handle_syn_pkt()
2621 ret = i40iw_manage_qhash(cm_node->iwdev, in i40iw_handle_syn_pkt()
2625 (void *)cm_node, in i40iw_handle_syn_pkt()
2627 cm_node->qhash_set = true; in i40iw_handle_syn_pkt()
2630 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_syn_pkt()
2631 atomic_inc(&cm_node->ref_count); in i40iw_handle_syn_pkt()
2632 i40iw_send_reset(cm_node); in i40iw_handle_syn_pkt()
2652 static void i40iw_handle_synack_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_synack_pkt() argument
2662 switch (cm_node->state) { in i40iw_handle_synack_pkt()
2664 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2666 if (i40iw_check_syn(cm_node, tcph)) { in i40iw_handle_synack_pkt()
2670 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in i40iw_handle_synack_pkt()
2672 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 0); in i40iw_handle_synack_pkt()
2674 i40iw_debug(cm_node->dev, in i40iw_handle_synack_pkt()
2677 cm_node); in i40iw_handle_synack_pkt()
2680 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2681 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in i40iw_handle_synack_pkt()
2682 i40iw_send_ack(cm_node); /* ACK for the syn_ack */ in i40iw_handle_synack_pkt()
2683 ret = i40iw_send_mpa_request(cm_node); in i40iw_handle_synack_pkt()
2685 i40iw_debug(cm_node->dev, in i40iw_handle_synack_pkt()
2688 cm_node); in i40iw_handle_synack_pkt()
2691 cm_node->state = I40IW_CM_STATE_MPAREQ_SENT; in i40iw_handle_synack_pkt()
2694 i40iw_passive_open_err(cm_node, true); in i40iw_handle_synack_pkt()
2697 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in i40iw_handle_synack_pkt()
2698 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2699 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_synack_pkt()
2700 i40iw_send_reset(cm_node); in i40iw_handle_synack_pkt()
2703 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in i40iw_handle_synack_pkt()
2704 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2705 atomic_inc(&cm_node->ref_count); in i40iw_handle_synack_pkt()
2706 i40iw_send_reset(cm_node); in i40iw_handle_synack_pkt()
2726 static int i40iw_handle_ack_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_ack_pkt() argument
2737 if (i40iw_check_seq(cm_node, tcph)) in i40iw_handle_ack_pkt()
2741 switch (cm_node->state) { in i40iw_handle_ack_pkt()
2743 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2744 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 1); in i40iw_handle_ack_pkt()
2747 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in i40iw_handle_ack_pkt()
2748 cm_node->state = I40IW_CM_STATE_ESTABLISHED; in i40iw_handle_ack_pkt()
2750 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in i40iw_handle_ack_pkt()
2751 i40iw_handle_rcv_mpa(cm_node, rbuf); in i40iw_handle_ack_pkt()
2755 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2757 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in i40iw_handle_ack_pkt()
2758 i40iw_handle_rcv_mpa(cm_node, rbuf); in i40iw_handle_ack_pkt()
2762 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in i40iw_handle_ack_pkt()
2764 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in i40iw_handle_ack_pkt()
2765 cm_node->ack_rcvd = false; in i40iw_handle_ack_pkt()
2766 i40iw_handle_rcv_mpa(cm_node, rbuf); in i40iw_handle_ack_pkt()
2768 cm_node->ack_rcvd = true; in i40iw_handle_ack_pkt()
2772 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2773 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_ack_pkt()
2774 i40iw_send_reset(cm_node); in i40iw_handle_ack_pkt()
2777 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2778 atomic_inc(&cm_node->ref_count); in i40iw_handle_ack_pkt()
2779 i40iw_send_reset(cm_node); in i40iw_handle_ack_pkt()
2783 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2784 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_ack_pkt()
2785 if (!cm_node->accept_pend) in i40iw_handle_ack_pkt()
2786 cm_node->cm_id->rem_ref(cm_node->cm_id); in i40iw_handle_ack_pkt()
2787 i40iw_rem_ref_cm_node(cm_node); in i40iw_handle_ack_pkt()
2790 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2791 cm_node->state = I40IW_CM_STATE_FIN_WAIT2; in i40iw_handle_ack_pkt()
2799 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2810 static void i40iw_process_packet(struct i40iw_cm_node *cm_node, in i40iw_process_packet() argument
2832 i40iw_handle_syn_pkt(cm_node, rbuf); in i40iw_process_packet()
2835 i40iw_handle_synack_pkt(cm_node, rbuf); in i40iw_process_packet()
2838 ret = i40iw_handle_ack_pkt(cm_node, rbuf); in i40iw_process_packet()
2840 i40iw_handle_fin_pkt(cm_node); in i40iw_process_packet()
2843 i40iw_handle_rst_pkt(cm_node, rbuf); in i40iw_process_packet()
2847 (!i40iw_check_seq(cm_node, (struct tcphdr *)rbuf->tcph))) in i40iw_process_packet()
2848 i40iw_handle_fin_pkt(cm_node); in i40iw_process_packet()
2929 struct i40iw_cm_node *cm_node; in i40iw_create_cm_node() local
2938 cm_node = i40iw_make_cm_node(cm_core, iwdev, cm_info, NULL); in i40iw_create_cm_node()
2939 if (!cm_node) in i40iw_create_cm_node()
2942 cm_node->tcp_cntxt.client = 1; in i40iw_create_cm_node()
2943 cm_node->tcp_cntxt.rcv_wscale = I40IW_CM_DEFAULT_RCV_WND_SCALE; in i40iw_create_cm_node()
2945 i40iw_record_ird_ord(cm_node, conn_param->ird, conn_param->ord); in i40iw_create_cm_node()
2951 cm_node->rem_port, in i40iw_create_cm_node()
2952 cm_node->vlan_id, in i40iw_create_cm_node()
2955 i40iw_rem_ref_cm_node(cm_node); in i40iw_create_cm_node()
2968 i40iw_rem_ref_cm_node(cm_node); in i40iw_create_cm_node()
2972 loopback_remotenode->loopbackpartner = cm_node; in i40iw_create_cm_node()
2975 cm_node->loopbackpartner = loopback_remotenode; in i40iw_create_cm_node()
2980 if (loopback_remotenode->ord_size > cm_node->ird_size) in i40iw_create_cm_node()
2982 cm_node->ird_size; in i40iw_create_cm_node()
2984 cm_node->state = I40IW_CM_STATE_OFFLOADED; in i40iw_create_cm_node()
2985 cm_node->tcp_cntxt.rcv_nxt = in i40iw_create_cm_node()
2988 cm_node->tcp_cntxt.loc_seq_num; in i40iw_create_cm_node()
2989 cm_node->tcp_cntxt.max_snd_wnd = in i40iw_create_cm_node()
2991 loopback_remotenode->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.rcv_wnd; in i40iw_create_cm_node()
2992 cm_node->tcp_cntxt.snd_wnd = loopback_remotenode->tcp_cntxt.rcv_wnd; in i40iw_create_cm_node()
2993 loopback_remotenode->tcp_cntxt.snd_wnd = cm_node->tcp_cntxt.rcv_wnd; in i40iw_create_cm_node()
2994 cm_node->tcp_cntxt.snd_wscale = loopback_remotenode->tcp_cntxt.rcv_wscale; in i40iw_create_cm_node()
2995 loopback_remotenode->tcp_cntxt.snd_wscale = cm_node->tcp_cntxt.rcv_wscale; in i40iw_create_cm_node()
2997 return cm_node; in i40iw_create_cm_node()
3000 cm_node->pdata.size = private_data_len; in i40iw_create_cm_node()
3001 cm_node->pdata.addr = cm_node->pdata_buf; in i40iw_create_cm_node()
3003 memcpy(cm_node->pdata_buf, private_data, private_data_len); in i40iw_create_cm_node()
3005 cm_node->state = I40IW_CM_STATE_SYN_SENT; in i40iw_create_cm_node()
3006 return cm_node; in i40iw_create_cm_node()
3015 static int i40iw_cm_reject(struct i40iw_cm_node *cm_node, const void *pdata, u8 plen) in i40iw_cm_reject() argument
3020 struct iw_cm_id *cm_id = cm_node->cm_id; in i40iw_cm_reject()
3021 struct i40iw_cm_node *loopback = cm_node->loopbackpartner; in i40iw_cm_reject()
3023 if (cm_node->tcp_cntxt.client) in i40iw_cm_reject()
3025 i40iw_cleanup_retrans_entry(cm_node); in i40iw_cm_reject()
3028 passive_state = atomic_add_return(1, &cm_node->passive_state); in i40iw_cm_reject()
3030 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_cm_reject()
3031 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3033 if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) { in i40iw_cm_reject()
3034 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3036 ret = i40iw_send_mpa_reject(cm_node, pdata, plen); in i40iw_cm_reject()
3038 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_cm_reject()
3039 err = i40iw_send_reset(cm_node); in i40iw_cm_reject()
3048 cm_node->cm_id = NULL; in i40iw_cm_reject()
3049 if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) { in i40iw_cm_reject()
3050 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3057 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3073 static int i40iw_cm_close(struct i40iw_cm_node *cm_node) in i40iw_cm_close() argument
3077 if (!cm_node) in i40iw_cm_close()
3080 switch (cm_node->state) { in i40iw_cm_close()
3088 i40iw_cleanup_retrans_entry(cm_node); in i40iw_cm_close()
3089 i40iw_send_reset(cm_node); in i40iw_cm_close()
3092 cm_node->state = I40IW_CM_STATE_LAST_ACK; in i40iw_cm_close()
3093 i40iw_send_fin(cm_node); in i40iw_cm_close()
3103 i40iw_cleanup_retrans_entry(cm_node); in i40iw_cm_close()
3104 i40iw_send_reset(cm_node); in i40iw_cm_close()
3111 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_close()
3114 if (cm_node->send_entry) in i40iw_cm_close()
3116 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_close()
3130 struct i40iw_cm_node *cm_node; in i40iw_receive_ilq() local
3183 cm_node = i40iw_find_node(cm_core, in i40iw_receive_ilq()
3191 if (!cm_node) { in i40iw_receive_ilq()
3211 cm_node = i40iw_make_cm_node(cm_core, iwdev, &cm_info, listener); in i40iw_receive_ilq()
3212 if (!cm_node) { in i40iw_receive_ilq()
3221 cm_node->state = I40IW_CM_STATE_LISTENING; in i40iw_receive_ilq()
3223 i40iw_rem_ref_cm_node(cm_node); in i40iw_receive_ilq()
3226 atomic_inc(&cm_node->ref_count); in i40iw_receive_ilq()
3227 } else if (cm_node->state == I40IW_CM_STATE_OFFLOADED) { in i40iw_receive_ilq()
3228 i40iw_rem_ref_cm_node(cm_node); in i40iw_receive_ilq()
3231 i40iw_process_packet(cm_node, rbuf); in i40iw_receive_ilq()
3232 i40iw_rem_ref_cm_node(cm_node); in i40iw_receive_ilq()
3291 static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node, in i40iw_init_tcp_ctx() argument
3295 tcp_info->ipv4 = cm_node->ipv4; in i40iw_init_tcp_ctx()
3308 tcp_info->snd_wscale = cm_node->tcp_cntxt.snd_wscale; in i40iw_init_tcp_ctx()
3309 tcp_info->rcv_wscale = cm_node->tcp_cntxt.rcv_wscale; in i40iw_init_tcp_ctx()
3311 tcp_info->snd_nxt = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3312 tcp_info->snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.snd_wnd); in i40iw_init_tcp_ctx()
3313 tcp_info->rcv_nxt = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in i40iw_init_tcp_ctx()
3314 tcp_info->snd_max = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3316 tcp_info->snd_una = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3317 tcp_info->cwnd = cpu_to_le32(2 * cm_node->tcp_cntxt.mss); in i40iw_init_tcp_ctx()
3318 tcp_info->snd_wl1 = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in i40iw_init_tcp_ctx()
3319 tcp_info->snd_wl2 = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3320 tcp_info->max_snd_window = cpu_to_le32(cm_node->tcp_cntxt.max_snd_wnd); in i40iw_init_tcp_ctx()
3321 tcp_info->rcv_wnd = cpu_to_le32(cm_node->tcp_cntxt.rcv_wnd << in i40iw_init_tcp_ctx()
3322 cm_node->tcp_cntxt.rcv_wscale); in i40iw_init_tcp_ctx()
3325 tcp_info->snd_mss = cpu_to_le32(((u32)cm_node->tcp_cntxt.mss)); in i40iw_init_tcp_ctx()
3326 if (cm_node->vlan_id < VLAN_TAG_PRESENT) { in i40iw_init_tcp_ctx()
3328 tcp_info->vlan_tag = cpu_to_le16(((u16)cm_node->user_pri << I40IW_VLAN_PRIO_SHIFT) | in i40iw_init_tcp_ctx()
3329 cm_node->vlan_id); in i40iw_init_tcp_ctx()
3331 if (cm_node->ipv4) { in i40iw_init_tcp_ctx()
3332 tcp_info->src_port = cpu_to_le16(cm_node->loc_port); in i40iw_init_tcp_ctx()
3333 tcp_info->dst_port = cpu_to_le16(cm_node->rem_port); in i40iw_init_tcp_ctx()
3335 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[0]); in i40iw_init_tcp_ctx()
3336 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[0]); in i40iw_init_tcp_ctx()
3345 tcp_info->src_port = cpu_to_le16(cm_node->loc_port); in i40iw_init_tcp_ctx()
3346 tcp_info->dst_port = cpu_to_le16(cm_node->rem_port); in i40iw_init_tcp_ctx()
3347 tcp_info->dest_ip_addr0 = cpu_to_le32(cm_node->rem_addr[0]); in i40iw_init_tcp_ctx()
3348 tcp_info->dest_ip_addr1 = cpu_to_le32(cm_node->rem_addr[1]); in i40iw_init_tcp_ctx()
3349 tcp_info->dest_ip_addr2 = cpu_to_le32(cm_node->rem_addr[2]); in i40iw_init_tcp_ctx()
3350 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[3]); in i40iw_init_tcp_ctx()
3351 tcp_info->local_ipaddr0 = cpu_to_le32(cm_node->loc_addr[0]); in i40iw_init_tcp_ctx()
3352 tcp_info->local_ipaddr1 = cpu_to_le32(cm_node->loc_addr[1]); in i40iw_init_tcp_ctx()
3353 tcp_info->local_ipaddr2 = cpu_to_le32(cm_node->loc_addr[2]); in i40iw_init_tcp_ctx()
3354 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[3]); in i40iw_init_tcp_ctx()
3371 struct i40iw_cm_node *cm_node) in i40iw_cm_init_tsa_conn() argument
3387 iwarp_info->ord_size = cm_node->ord_size; in i40iw_cm_init_tsa_conn()
3388 iwarp_info->ird_size = i40iw_derive_hw_ird_setting(cm_node->ird_size); in i40iw_cm_init_tsa_conn()
3402 ctx_info->user_pri = cm_node->user_pri; in i40iw_cm_init_tsa_conn()
3404 i40iw_init_tcp_ctx(cm_node, &tcp_info, iwqp); in i40iw_cm_init_tsa_conn()
3405 if (cm_node->snd_mark_en) { in i40iw_cm_init_tsa_conn()
3408 SNDMARKER_SEQNMASK) + cm_node->lsmm_size; in i40iw_cm_init_tsa_conn()
3411 cm_node->state = I40IW_CM_STATE_OFFLOADED; in i40iw_cm_init_tsa_conn()
3414 tcp_info.tos = cm_node->tos; in i40iw_cm_init_tsa_conn()
3487 if (iwqp->cm_node) { in i40iw_qp_disconnect()
3489 i40iw_cm_close(iwqp->cm_node); in i40iw_qp_disconnect()
3633 struct i40iw_cm_node *cm_node; in i40iw_accept() local
3653 cm_node = (struct i40iw_cm_node *)cm_id->provider_data; in i40iw_accept()
3656 cm_node->ipv4 = true; in i40iw_accept()
3657 cm_node->vlan_id = i40iw_get_vlan_ipv4(cm_node->loc_addr); in i40iw_accept()
3659 cm_node->ipv4 = false; in i40iw_accept()
3660 i40iw_netdev_vlan_ipv6(cm_node->loc_addr, &cm_node->vlan_id); in i40iw_accept()
3662 i40iw_debug(cm_node->dev, in i40iw_accept()
3665 cm_node->vlan_id); in i40iw_accept()
3666 if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) { in i40iw_accept()
3667 if (cm_node->loopbackpartner) in i40iw_accept()
3668 i40iw_rem_ref_cm_node(cm_node->loopbackpartner); in i40iw_accept()
3669 i40iw_rem_ref_cm_node(cm_node); in i40iw_accept()
3673 passive_state = atomic_add_return(1, &cm_node->passive_state); in i40iw_accept()
3675 i40iw_rem_ref_cm_node(cm_node); in i40iw_accept()
3679 cm_node->cm_core->stats_accepts++; in i40iw_accept()
3680 iwqp->cm_node = (void *)cm_node; in i40iw_accept()
3681 cm_node->iwqp = iwqp; in i40iw_accept()
3689 cm_node->pdata.size = conn_param->private_data_len; in i40iw_accept()
3691 accept.size = i40iw_cm_build_mpa_frame(cm_node, &accept, MPA_KEY_REPLY); in i40iw_accept()
3696 if ((cm_node->ipv4 && in i40iw_accept()
3697 !i40iw_ipv4_is_loopback(cm_node->loc_addr[0], cm_node->rem_addr[0])) || in i40iw_accept()
3698 (!cm_node->ipv4 && in i40iw_accept()
3699 !i40iw_ipv6_is_loopback(cm_node->loc_addr, cm_node->rem_addr))) { in i40iw_accept()
3732 cm_node->cm_id = cm_id; in i40iw_accept()
3737 cm_node->lsmm_size = accept.size + conn_param->private_data_len; in i40iw_accept()
3738 i40iw_cm_init_tsa_conn(iwqp, cm_node); in i40iw_accept()
3743 cm_node->qhash_set = false; in i40iw_accept()
3746 cm_node->accelerated = true; in i40iw_accept()
3748 list_move_tail(&cm_node->list, &cm_core->accelerated_list); in i40iw_accept()
3752 i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_ESTABLISHED, 0); in i40iw_accept()
3756 if (cm_node->loopbackpartner) { in i40iw_accept()
3757 cm_node->loopbackpartner->pdata.size = conn_param->private_data_len; in i40iw_accept()
3760 memcpy(cm_node->loopbackpartner->pdata_buf, in i40iw_accept()
3763 i40iw_create_event(cm_node->loopbackpartner, I40IW_CM_EVENT_CONNECTED); in i40iw_accept()
3766 if (cm_node->accept_pend) { in i40iw_accept()
3767 atomic_dec(&cm_node->listener->pend_accepts_cnt); in i40iw_accept()
3768 cm_node->accept_pend = 0; in i40iw_accept()
3782 struct i40iw_cm_node *cm_node; in i40iw_reject() local
3785 cm_node = (struct i40iw_cm_node *)cm_id->provider_data; in i40iw_reject()
3786 loopback = cm_node->loopbackpartner; in i40iw_reject()
3787 cm_node->cm_id = cm_id; in i40iw_reject()
3788 cm_node->pdata.size = pdata_len; in i40iw_reject()
3793 cm_node->cm_core->stats_rejects++; in i40iw_reject()
3803 return i40iw_cm_reject(cm_node, pdata, pdata_len); in i40iw_reject()
3816 struct i40iw_cm_node *cm_node; in i40iw_connect() local
3872 cm_node = i40iw_create_cm_node(&iwdev->cm_core, iwdev, in i40iw_connect()
3875 if (IS_ERR(cm_node)) { in i40iw_connect()
3876 ret = PTR_ERR(cm_node); in i40iw_connect()
3890 cm_node->qhash_set = true; in i40iw_connect()
3899 cm_node->apbvt_set = true; in i40iw_connect()
3900 iwqp->cm_node = cm_node; in i40iw_connect()
3901 cm_node->iwqp = iwqp; in i40iw_connect()
3905 if (cm_node->state != I40IW_CM_STATE_OFFLOADED) { in i40iw_connect()
3906 cm_node->state = I40IW_CM_STATE_SYN_SENT; in i40iw_connect()
3907 ret = i40iw_send_syn(cm_node, 0); in i40iw_connect()
3912 if (cm_node->loopbackpartner) { in i40iw_connect()
3913 cm_node->loopbackpartner->state = I40IW_CM_STATE_MPAREQ_RCVD; in i40iw_connect()
3914 i40iw_create_event(cm_node->loopbackpartner, in i40iw_connect()
3918 i40iw_debug(cm_node->dev, in i40iw_connect()
3921 cm_node->rem_port, in i40iw_connect()
3922 cm_node, in i40iw_connect()
3923 cm_node->cm_id); in i40iw_connect()
3939 i40iw_rem_ref_cm_node(cm_node); in i40iw_connect()
4075 struct i40iw_cm_node *cm_node; in i40iw_cm_event_connected() local
4083 cm_node = event->cm_node; in i40iw_cm_event_connected()
4084 cm_id = cm_node->cm_id; in i40iw_cm_event_connected()
4094 i40iw_cm_init_tsa_conn(iwqp, cm_node); in i40iw_cm_event_connected()
4095 read0 = (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO); in i40iw_cm_event_connected()
4104 cm_node->qhash_set = false; in i40iw_cm_event_connected()
4107 cm_node->accelerated = true; in i40iw_cm_event_connected()
4109 list_move_tail(&cm_node->list, &cm_core->accelerated_list); in i40iw_cm_event_connected()
4111 status = i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY, in i40iw_cm_event_connected()
4121 i40iw_send_cm_event(event->cm_node, in i40iw_cm_event_connected()
4126 i40iw_rem_ref_cm_node(event->cm_node); in i40iw_cm_event_connected()
4135 struct i40iw_cm_node *cm_node = event->cm_node; in i40iw_cm_event_reset() local
4136 struct iw_cm_id *cm_id = cm_node->cm_id; in i40iw_cm_event_reset()
4146 i40iw_debug(cm_node->dev, in i40iw_cm_event_reset()
4149 event->cm_node, cm_id); in i40iw_cm_event_reset()
4152 i40iw_send_cm_event(cm_node, cm_node->cm_id, IW_CM_EVENT_DISCONNECT, -ECONNRESET); in i40iw_cm_event_reset()
4153 i40iw_send_cm_event(cm_node, cm_node->cm_id, IW_CM_EVENT_CLOSE, 0); in i40iw_cm_event_reset()
4165 struct i40iw_cm_node *cm_node; in i40iw_cm_event_handler() local
4167 if (!event || !event->cm_node || !event->cm_node->cm_core) in i40iw_cm_event_handler()
4170 cm_node = event->cm_node; in i40iw_cm_event_handler()
4174 i40iw_send_cm_event(cm_node, in i40iw_cm_event_handler()
4175 cm_node->cm_id, in i40iw_cm_event_handler()
4183 if (!event->cm_node->cm_id || in i40iw_cm_event_handler()
4184 (event->cm_node->state != I40IW_CM_STATE_OFFLOADED)) in i40iw_cm_event_handler()
4189 if (!event->cm_node->cm_id || in i40iw_cm_event_handler()
4190 (cm_node->state == I40IW_CM_STATE_OFFLOADED)) in i40iw_cm_event_handler()
4192 i40iw_send_cm_event(cm_node, in i40iw_cm_event_handler()
4193 cm_node->cm_id, in i40iw_cm_event_handler()
4198 if (!event->cm_node->cm_id || in i40iw_cm_event_handler()
4199 (event->cm_node->state == I40IW_CM_STATE_OFFLOADED)) in i40iw_cm_event_handler()
4209 i40iw_rem_ref_cm_node(event->cm_node); in i40iw_cm_event_handler()
4219 atomic_inc(&event->cm_node->ref_count); in i40iw_cm_post_event()
4223 queue_work(event->cm_node->cm_core->event_wq, &event->event_work); in i40iw_cm_post_event()
4308 struct i40iw_cm_node *cm_node; in i40iw_cm_teardown_connections() local
4317 cm_node = container_of(list_node, struct i40iw_cm_node, list); in i40iw_cm_teardown_connections()
4319 (nfo->vlan_id == cm_node->vlan_id && in i40iw_cm_teardown_connections()
4320 (!memcmp(cm_node->loc_addr, ipaddr, nfo->ipv4 ? 4 : 16) || in i40iw_cm_teardown_connections()
4321 !memcmp(cm_node->rem_addr, ipaddr, nfo->ipv4 ? 4 : 16)))) { in i40iw_cm_teardown_connections()
4322 atomic_inc(&cm_node->ref_count); in i40iw_cm_teardown_connections()
4323 list_add(&cm_node->teardown_entry, &teardown_list); in i40iw_cm_teardown_connections()
4328 cm_node = container_of(list_node, struct i40iw_cm_node, list); in i40iw_cm_teardown_connections()
4330 (nfo->vlan_id == cm_node->vlan_id && in i40iw_cm_teardown_connections()
4331 (!memcmp(cm_node->loc_addr, ipaddr, nfo->ipv4 ? 4 : 16) || in i40iw_cm_teardown_connections()
4332 !memcmp(cm_node->rem_addr, ipaddr, nfo->ipv4 ? 4 : 16)))) { in i40iw_cm_teardown_connections()
4333 atomic_inc(&cm_node->ref_count); in i40iw_cm_teardown_connections()
4334 list_add(&cm_node->teardown_entry, &teardown_list); in i40iw_cm_teardown_connections()
4340 cm_node = container_of(list_node, struct i40iw_cm_node, in i40iw_cm_teardown_connections()
4343 i40iw_modify_qp(&cm_node->iwqp->ibqp, &attr, IB_QP_STATE, NULL); in i40iw_cm_teardown_connections()
4345 i40iw_cm_disconn(cm_node->iwqp); in i40iw_cm_teardown_connections()
4346 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_teardown_connections()