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_VID_MASK) 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_VID_MASK) { 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_VID_MASK) { 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()
1848 struct i40iw_cm_node *cm_node; in i40iw_dec_refcnt_listen() local
1861 cm_node = container_of(list_pos, struct i40iw_cm_node, list); in i40iw_dec_refcnt_listen()
1862 if ((cm_node->listener == listener) && in i40iw_dec_refcnt_listen()
1863 !cm_node->accelerated) { in i40iw_dec_refcnt_listen()
1864 atomic_inc(&cm_node->ref_count); in i40iw_dec_refcnt_listen()
1865 list_add(&cm_node->reset_entry, &reset_list); in i40iw_dec_refcnt_listen()
1872 cm_node = container_of(list_pos, struct i40iw_cm_node, reset_entry); in i40iw_dec_refcnt_listen()
1873 loopback = cm_node->loopbackpartner; in i40iw_dec_refcnt_listen()
1874 if (cm_node->state >= I40IW_CM_STATE_FIN_WAIT1) { in i40iw_dec_refcnt_listen()
1875 i40iw_rem_ref_cm_node(cm_node); in i40iw_dec_refcnt_listen()
1878 i40iw_cleanup_retrans_entry(cm_node); in i40iw_dec_refcnt_listen()
1879 err = i40iw_send_reset(cm_node); in i40iw_dec_refcnt_listen()
1881 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_dec_refcnt_listen()
1884 old_state = cm_node->state; in i40iw_dec_refcnt_listen()
1885 cm_node->state = I40IW_CM_STATE_LISTENER_DESTROYED; in i40iw_dec_refcnt_listen()
1887 i40iw_rem_ref_cm_node(cm_node); in i40iw_dec_refcnt_listen()
1892 event.cm_node = loopback; in i40iw_dec_refcnt_listen()
1904 cm_node->state = I40IW_CM_STATE_LISTENER_DESTROYED; in i40iw_dec_refcnt_listen()
1905 i40iw_rem_ref_cm_node(cm_node); in i40iw_dec_refcnt_listen()
2170 struct i40iw_cm_node *cm_node; in i40iw_make_cm_node() local
2176 cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC); in i40iw_make_cm_node()
2177 if (!cm_node) in i40iw_make_cm_node()
2181 cm_node->ipv4 = cm_info->ipv4; in i40iw_make_cm_node()
2182 cm_node->vlan_id = cm_info->vlan_id; in i40iw_make_cm_node()
2183 if ((cm_node->vlan_id == I40IW_NO_VLAN) && iwdev->dcb) in i40iw_make_cm_node()
2184 cm_node->vlan_id = 0; in i40iw_make_cm_node()
2185 cm_node->tos = cm_info->tos; in i40iw_make_cm_node()
2186 cm_node->user_pri = cm_info->user_pri; in i40iw_make_cm_node()
2192 cm_node->tos = max(listener->tos, cm_info->tos); in i40iw_make_cm_node()
2193 cm_node->user_pri = rt_tos2priority(cm_node->tos); in i40iw_make_cm_node()
2195 cm_node->tos, cm_node->user_pri); in i40iw_make_cm_node()
2197 memcpy(cm_node->loc_addr, cm_info->loc_addr, sizeof(cm_node->loc_addr)); in i40iw_make_cm_node()
2198 memcpy(cm_node->rem_addr, cm_info->rem_addr, sizeof(cm_node->rem_addr)); in i40iw_make_cm_node()
2199 cm_node->loc_port = cm_info->loc_port; in i40iw_make_cm_node()
2200 cm_node->rem_port = cm_info->rem_port; in i40iw_make_cm_node()
2202 cm_node->mpa_frame_rev = iwdev->mpa_version; in i40iw_make_cm_node()
2203 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in i40iw_make_cm_node()
2204 cm_node->ird_size = I40IW_MAX_IRD_SIZE; in i40iw_make_cm_node()
2205 cm_node->ord_size = I40IW_MAX_ORD_SIZE; in i40iw_make_cm_node()
2207 cm_node->listener = listener; in i40iw_make_cm_node()
2208 cm_node->cm_id = cm_info->cm_id; in i40iw_make_cm_node()
2209 ether_addr_copy(cm_node->loc_mac, netdev->dev_addr); in i40iw_make_cm_node()
2210 spin_lock_init(&cm_node->retrans_list_lock); in i40iw_make_cm_node()
2211 cm_node->ack_rcvd = false; in i40iw_make_cm_node()
2213 atomic_set(&cm_node->ref_count, 1); in i40iw_make_cm_node()
2215 cm_node->cm_core = cm_core; in i40iw_make_cm_node()
2216 cm_node->tcp_cntxt.loc_id = I40IW_CM_DEF_LOCAL_ID; in i40iw_make_cm_node()
2217 cm_node->tcp_cntxt.rcv_wscale = I40IW_CM_DEFAULT_RCV_WND_SCALE; in i40iw_make_cm_node()
2218 cm_node->tcp_cntxt.rcv_wnd = in i40iw_make_cm_node()
2220 if (cm_node->ipv4) { in i40iw_make_cm_node()
2221 cm_node->tcp_cntxt.loc_seq_num = secure_tcp_seq(htonl(cm_node->loc_addr[0]), in i40iw_make_cm_node()
2222 htonl(cm_node->rem_addr[0]), in i40iw_make_cm_node()
2223 htons(cm_node->loc_port), in i40iw_make_cm_node()
2224 htons(cm_node->rem_port)); in i40iw_make_cm_node()
2225 cm_node->tcp_cntxt.mss = iwdev->vsi.mtu - I40IW_MTU_TO_MSS_IPV4; in i40iw_make_cm_node()
2228 htonl(cm_node->loc_addr[0]), htonl(cm_node->loc_addr[1]), in i40iw_make_cm_node()
2229 htonl(cm_node->loc_addr[2]), htonl(cm_node->loc_addr[3]) in i40iw_make_cm_node()
2232 htonl(cm_node->rem_addr[0]), htonl(cm_node->rem_addr[1]), in i40iw_make_cm_node()
2233 htonl(cm_node->rem_addr[2]), htonl(cm_node->rem_addr[3]) in i40iw_make_cm_node()
2235 cm_node->tcp_cntxt.loc_seq_num = secure_tcpv6_seq(loc, rem, in i40iw_make_cm_node()
2236 htons(cm_node->loc_port), in i40iw_make_cm_node()
2237 htons(cm_node->rem_port)); in i40iw_make_cm_node()
2238 cm_node->tcp_cntxt.mss = iwdev->vsi.mtu - I40IW_MTU_TO_MSS_IPV6; in i40iw_make_cm_node()
2241 cm_node->iwdev = iwdev; in i40iw_make_cm_node()
2242 cm_node->dev = &iwdev->sc_dev; in i40iw_make_cm_node()
2244 if ((cm_node->ipv4 && in i40iw_make_cm_node()
2245 i40iw_ipv4_is_loopback(cm_node->loc_addr[0], cm_node->rem_addr[0])) || in i40iw_make_cm_node()
2246 (!cm_node->ipv4 && i40iw_ipv6_is_loopback(cm_node->loc_addr, in i40iw_make_cm_node()
2247 cm_node->rem_addr))) { in i40iw_make_cm_node()
2249 cm_node->rem_addr, in i40iw_make_cm_node()
2255 cm_node->rem_addr, in i40iw_make_cm_node()
2259 if (cm_node->ipv4) in i40iw_make_cm_node()
2274 kfree(cm_node); in i40iw_make_cm_node()
2277 ether_addr_copy(cm_node->rem_mac, iwdev->arp_table[arpindex].mac_addr); in i40iw_make_cm_node()
2278 i40iw_add_hte_node(cm_core, cm_node); in i40iw_make_cm_node()
2280 return cm_node; in i40iw_make_cm_node()
2287 static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node) in i40iw_rem_ref_cm_node() argument
2289 struct i40iw_cm_core *cm_core = cm_node->cm_core; in i40iw_rem_ref_cm_node()
2294 spin_lock_irqsave(&cm_node->cm_core->ht_lock, flags); in i40iw_rem_ref_cm_node()
2295 if (atomic_dec_return(&cm_node->ref_count)) { in i40iw_rem_ref_cm_node()
2296 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in i40iw_rem_ref_cm_node()
2299 list_del(&cm_node->list); in i40iw_rem_ref_cm_node()
2300 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in i40iw_rem_ref_cm_node()
2303 if (!cm_node->accelerated && cm_node->accept_pend) { in i40iw_rem_ref_cm_node()
2305 atomic_dec(&cm_node->listener->pend_accepts_cnt); in i40iw_rem_ref_cm_node()
2307 if (cm_node->close_entry) in i40iw_rem_ref_cm_node()
2308 i40iw_handle_close_entry(cm_node, 0); in i40iw_rem_ref_cm_node()
2309 if (cm_node->listener) { in i40iw_rem_ref_cm_node()
2310 i40iw_dec_refcnt_listen(cm_core, cm_node->listener, 0, true); in i40iw_rem_ref_cm_node()
2312 if (cm_node->apbvt_set) { in i40iw_rem_ref_cm_node()
2313 i40iw_manage_apbvt(cm_node->iwdev, in i40iw_rem_ref_cm_node()
2314 cm_node->loc_port, in i40iw_rem_ref_cm_node()
2316 cm_node->apbvt_set = 0; in i40iw_rem_ref_cm_node()
2318 i40iw_get_addr_info(cm_node, &nfo); in i40iw_rem_ref_cm_node()
2319 if (cm_node->qhash_set) { in i40iw_rem_ref_cm_node()
2320 i40iw_manage_qhash(cm_node->iwdev, in i40iw_rem_ref_cm_node()
2326 cm_node->qhash_set = 0; in i40iw_rem_ref_cm_node()
2330 iwqp = cm_node->iwqp; in i40iw_rem_ref_cm_node()
2332 iwqp->cm_node = NULL; in i40iw_rem_ref_cm_node()
2334 cm_node->iwqp = NULL; in i40iw_rem_ref_cm_node()
2335 } else if (cm_node->qhash_set) { in i40iw_rem_ref_cm_node()
2336 i40iw_get_addr_info(cm_node, &nfo); in i40iw_rem_ref_cm_node()
2337 i40iw_manage_qhash(cm_node->iwdev, in i40iw_rem_ref_cm_node()
2343 cm_node->qhash_set = 0; in i40iw_rem_ref_cm_node()
2346 cm_node->cm_core->stats_nodes_destroyed++; in i40iw_rem_ref_cm_node()
2347 kfree(cm_node); in i40iw_rem_ref_cm_node()
2354 static void i40iw_handle_fin_pkt(struct i40iw_cm_node *cm_node) in i40iw_handle_fin_pkt() argument
2358 switch (cm_node->state) { in i40iw_handle_fin_pkt()
2363 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2364 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2365 cm_node->state = I40IW_CM_STATE_LAST_ACK; in i40iw_handle_fin_pkt()
2366 i40iw_send_fin(cm_node); in i40iw_handle_fin_pkt()
2369 i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED); in i40iw_handle_fin_pkt()
2370 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2371 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2372 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_fin_pkt()
2373 atomic_inc(&cm_node->ref_count); in i40iw_handle_fin_pkt()
2374 i40iw_send_reset(cm_node); in i40iw_handle_fin_pkt()
2377 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2378 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2379 cm_node->state = I40IW_CM_STATE_CLOSING; in i40iw_handle_fin_pkt()
2380 i40iw_send_ack(cm_node); in i40iw_handle_fin_pkt()
2388 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2389 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2390 cm_node->state = I40IW_CM_STATE_TIME_WAIT; in i40iw_handle_fin_pkt()
2391 i40iw_send_ack(cm_node); in i40iw_handle_fin_pkt()
2393 i40iw_schedule_cm_timer(cm_node, NULL, I40IW_TIMER_TYPE_CLOSE, 1, 0); in i40iw_handle_fin_pkt()
2395 i40iw_pr_err("node %p state = %d\n", cm_node, cm_node->state); in i40iw_handle_fin_pkt()
2398 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2399 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2400 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_fin_pkt()
2401 i40iw_rem_ref_cm_node(cm_node); in i40iw_handle_fin_pkt()
2405 i40iw_pr_err("bad state node %p state = %d\n", cm_node, cm_node->state); in i40iw_handle_fin_pkt()
2415 static void i40iw_handle_rst_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_rst_pkt() argument
2418 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_rst_pkt()
2419 switch (cm_node->state) { in i40iw_handle_rst_pkt()
2422 switch (cm_node->mpa_frame_rev) { in i40iw_handle_rst_pkt()
2424 cm_node->mpa_frame_rev = IETF_MPA_V1; in i40iw_handle_rst_pkt()
2426 cm_node->state = I40IW_CM_STATE_SYN_SENT; in i40iw_handle_rst_pkt()
2427 if (i40iw_send_syn(cm_node, 0)) in i40iw_handle_rst_pkt()
2428 i40iw_active_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2432 i40iw_active_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2437 atomic_add_return(1, &cm_node->passive_state); in i40iw_handle_rst_pkt()
2442 i40iw_pr_err("Bad state state = %d\n", cm_node->state); in i40iw_handle_rst_pkt()
2443 i40iw_passive_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2446 i40iw_active_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2453 cm_node->cm_id->rem_ref(cm_node->cm_id); in i40iw_handle_rst_pkt()
2456 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_rst_pkt()
2457 i40iw_rem_ref_cm_node(cm_node); in i40iw_handle_rst_pkt()
2469 static void i40iw_handle_rcv_mpa(struct i40iw_cm_node *cm_node, in i40iw_handle_rcv_mpa() argument
2479 ret = i40iw_parse_mpa(cm_node, dataloc, &res_type, datasize); in i40iw_handle_rcv_mpa()
2481 if (cm_node->state == I40IW_CM_STATE_MPAREQ_SENT) in i40iw_handle_rcv_mpa()
2482 i40iw_active_open_err(cm_node, true); in i40iw_handle_rcv_mpa()
2484 i40iw_passive_open_err(cm_node, true); in i40iw_handle_rcv_mpa()
2488 switch (cm_node->state) { in i40iw_handle_rcv_mpa()
2492 cm_node->state = I40IW_CM_STATE_MPAREQ_RCVD; in i40iw_handle_rcv_mpa()
2494 i40iw_send_ack(cm_node); /* ACK received MPA request */ in i40iw_handle_rcv_mpa()
2495 atomic_set(&cm_node->passive_state, in i40iw_handle_rcv_mpa()
2499 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_rcv_mpa()
2502 cm_node->state = I40IW_CM_STATE_MPAREJ_RCVD; in i40iw_handle_rcv_mpa()
2505 cm_node->state = I40IW_CM_STATE_OFFLOADED; in i40iw_handle_rcv_mpa()
2507 i40iw_send_ack(cm_node); in i40iw_handle_rcv_mpa()
2510 pr_err("%s wrong cm_node state =%d\n", __func__, cm_node->state); in i40iw_handle_rcv_mpa()
2513 i40iw_create_event(cm_node, type); in i40iw_handle_rcv_mpa()
2520 static void i40iw_indicate_pkt_err(struct i40iw_cm_node *cm_node) in i40iw_indicate_pkt_err() argument
2522 switch (cm_node->state) { in i40iw_indicate_pkt_err()
2525 i40iw_active_open_err(cm_node, true); in i40iw_indicate_pkt_err()
2529 i40iw_passive_open_err(cm_node, true); in i40iw_indicate_pkt_err()
2542 static int i40iw_check_syn(struct i40iw_cm_node *cm_node, struct tcphdr *tcph) in i40iw_check_syn() argument
2546 if (ntohl(tcph->ack_seq) != cm_node->tcp_cntxt.loc_seq_num) { in i40iw_check_syn()
2548 i40iw_active_open_err(cm_node, true); in i40iw_check_syn()
2558 static int i40iw_check_seq(struct i40iw_cm_node *cm_node, struct tcphdr *tcph) in i40iw_check_seq() argument
2563 u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num; in i40iw_check_seq()
2564 u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt; in i40iw_check_seq()
2569 rcv_wnd = cm_node->tcp_cntxt.rcv_wnd; in i40iw_check_seq()
2576 i40iw_indicate_pkt_err(cm_node); in i40iw_check_seq()
2586 static void i40iw_handle_syn_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_syn_pkt() argument
2598 switch (cm_node->state) { in i40iw_handle_syn_pkt()
2602 i40iw_active_open_err(cm_node, 1); in i40iw_handle_syn_pkt()
2606 if (atomic_read(&cm_node->listener->pend_accepts_cnt) > in i40iw_handle_syn_pkt()
2607 cm_node->listener->backlog) { in i40iw_handle_syn_pkt()
2608 cm_node->cm_core->stats_backlog_drops++; in i40iw_handle_syn_pkt()
2609 i40iw_passive_open_err(cm_node, false); in i40iw_handle_syn_pkt()
2612 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 1); in i40iw_handle_syn_pkt()
2614 i40iw_passive_open_err(cm_node, false); in i40iw_handle_syn_pkt()
2618 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in i40iw_handle_syn_pkt()
2619 cm_node->accept_pend = 1; in i40iw_handle_syn_pkt()
2620 atomic_inc(&cm_node->listener->pend_accepts_cnt); in i40iw_handle_syn_pkt()
2622 cm_node->state = I40IW_CM_STATE_SYN_RCVD; in i40iw_handle_syn_pkt()
2623 i40iw_get_addr_info(cm_node, &nfo); in i40iw_handle_syn_pkt()
2624 ret = i40iw_manage_qhash(cm_node->iwdev, in i40iw_handle_syn_pkt()
2628 (void *)cm_node, in i40iw_handle_syn_pkt()
2630 cm_node->qhash_set = true; in i40iw_handle_syn_pkt()
2633 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_syn_pkt()
2634 atomic_inc(&cm_node->ref_count); in i40iw_handle_syn_pkt()
2635 i40iw_send_reset(cm_node); in i40iw_handle_syn_pkt()
2655 static void i40iw_handle_synack_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_synack_pkt() argument
2665 switch (cm_node->state) { in i40iw_handle_synack_pkt()
2667 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2669 if (i40iw_check_syn(cm_node, tcph)) { in i40iw_handle_synack_pkt()
2673 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in i40iw_handle_synack_pkt()
2675 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 0); in i40iw_handle_synack_pkt()
2677 i40iw_debug(cm_node->dev, in i40iw_handle_synack_pkt()
2680 cm_node); in i40iw_handle_synack_pkt()
2683 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2684 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in i40iw_handle_synack_pkt()
2685 i40iw_send_ack(cm_node); /* ACK for the syn_ack */ in i40iw_handle_synack_pkt()
2686 ret = i40iw_send_mpa_request(cm_node); in i40iw_handle_synack_pkt()
2688 i40iw_debug(cm_node->dev, in i40iw_handle_synack_pkt()
2691 cm_node); in i40iw_handle_synack_pkt()
2694 cm_node->state = I40IW_CM_STATE_MPAREQ_SENT; in i40iw_handle_synack_pkt()
2697 i40iw_passive_open_err(cm_node, true); in i40iw_handle_synack_pkt()
2700 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in i40iw_handle_synack_pkt()
2701 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2702 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_synack_pkt()
2703 i40iw_send_reset(cm_node); in i40iw_handle_synack_pkt()
2706 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in i40iw_handle_synack_pkt()
2707 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2708 atomic_inc(&cm_node->ref_count); in i40iw_handle_synack_pkt()
2709 i40iw_send_reset(cm_node); in i40iw_handle_synack_pkt()
2729 static int i40iw_handle_ack_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_ack_pkt() argument
2740 if (i40iw_check_seq(cm_node, tcph)) in i40iw_handle_ack_pkt()
2744 switch (cm_node->state) { in i40iw_handle_ack_pkt()
2746 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2747 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 1); in i40iw_handle_ack_pkt()
2750 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in i40iw_handle_ack_pkt()
2751 cm_node->state = I40IW_CM_STATE_ESTABLISHED; in i40iw_handle_ack_pkt()
2753 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in i40iw_handle_ack_pkt()
2754 i40iw_handle_rcv_mpa(cm_node, rbuf); in i40iw_handle_ack_pkt()
2758 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2760 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in i40iw_handle_ack_pkt()
2761 i40iw_handle_rcv_mpa(cm_node, rbuf); in i40iw_handle_ack_pkt()
2765 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in i40iw_handle_ack_pkt()
2767 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in i40iw_handle_ack_pkt()
2768 cm_node->ack_rcvd = false; in i40iw_handle_ack_pkt()
2769 i40iw_handle_rcv_mpa(cm_node, rbuf); in i40iw_handle_ack_pkt()
2771 cm_node->ack_rcvd = true; in i40iw_handle_ack_pkt()
2775 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2776 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_ack_pkt()
2777 i40iw_send_reset(cm_node); in i40iw_handle_ack_pkt()
2780 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2781 atomic_inc(&cm_node->ref_count); in i40iw_handle_ack_pkt()
2782 i40iw_send_reset(cm_node); in i40iw_handle_ack_pkt()
2786 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2787 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_ack_pkt()
2788 if (!cm_node->accept_pend) in i40iw_handle_ack_pkt()
2789 cm_node->cm_id->rem_ref(cm_node->cm_id); in i40iw_handle_ack_pkt()
2790 i40iw_rem_ref_cm_node(cm_node); in i40iw_handle_ack_pkt()
2793 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2794 cm_node->state = I40IW_CM_STATE_FIN_WAIT2; in i40iw_handle_ack_pkt()
2802 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2813 static void i40iw_process_packet(struct i40iw_cm_node *cm_node, in i40iw_process_packet() argument
2835 i40iw_handle_syn_pkt(cm_node, rbuf); in i40iw_process_packet()
2838 i40iw_handle_synack_pkt(cm_node, rbuf); in i40iw_process_packet()
2841 ret = i40iw_handle_ack_pkt(cm_node, rbuf); in i40iw_process_packet()
2843 i40iw_handle_fin_pkt(cm_node); in i40iw_process_packet()
2846 i40iw_handle_rst_pkt(cm_node, rbuf); in i40iw_process_packet()
2850 (!i40iw_check_seq(cm_node, (struct tcphdr *)rbuf->tcph))) in i40iw_process_packet()
2851 i40iw_handle_fin_pkt(cm_node); in i40iw_process_packet()
2932 struct i40iw_cm_node *cm_node; in i40iw_create_cm_node() local
2941 cm_node = i40iw_make_cm_node(cm_core, iwdev, cm_info, NULL); in i40iw_create_cm_node()
2942 if (!cm_node) in i40iw_create_cm_node()
2945 cm_node->tcp_cntxt.client = 1; in i40iw_create_cm_node()
2946 cm_node->tcp_cntxt.rcv_wscale = I40IW_CM_DEFAULT_RCV_WND_SCALE; in i40iw_create_cm_node()
2948 i40iw_record_ird_ord(cm_node, conn_param->ird, conn_param->ord); in i40iw_create_cm_node()
2954 cm_node->rem_port, in i40iw_create_cm_node()
2955 cm_node->vlan_id, in i40iw_create_cm_node()
2958 i40iw_rem_ref_cm_node(cm_node); in i40iw_create_cm_node()
2971 i40iw_rem_ref_cm_node(cm_node); in i40iw_create_cm_node()
2975 loopback_remotenode->loopbackpartner = cm_node; in i40iw_create_cm_node()
2978 cm_node->loopbackpartner = loopback_remotenode; in i40iw_create_cm_node()
2983 if (loopback_remotenode->ord_size > cm_node->ird_size) in i40iw_create_cm_node()
2985 cm_node->ird_size; in i40iw_create_cm_node()
2987 cm_node->state = I40IW_CM_STATE_OFFLOADED; in i40iw_create_cm_node()
2988 cm_node->tcp_cntxt.rcv_nxt = in i40iw_create_cm_node()
2991 cm_node->tcp_cntxt.loc_seq_num; in i40iw_create_cm_node()
2992 cm_node->tcp_cntxt.max_snd_wnd = in i40iw_create_cm_node()
2994 loopback_remotenode->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.rcv_wnd; in i40iw_create_cm_node()
2995 cm_node->tcp_cntxt.snd_wnd = loopback_remotenode->tcp_cntxt.rcv_wnd; in i40iw_create_cm_node()
2996 loopback_remotenode->tcp_cntxt.snd_wnd = cm_node->tcp_cntxt.rcv_wnd; in i40iw_create_cm_node()
2997 cm_node->tcp_cntxt.snd_wscale = loopback_remotenode->tcp_cntxt.rcv_wscale; in i40iw_create_cm_node()
2998 loopback_remotenode->tcp_cntxt.snd_wscale = cm_node->tcp_cntxt.rcv_wscale; in i40iw_create_cm_node()
3000 return cm_node; in i40iw_create_cm_node()
3003 cm_node->pdata.size = private_data_len; in i40iw_create_cm_node()
3004 cm_node->pdata.addr = cm_node->pdata_buf; in i40iw_create_cm_node()
3006 memcpy(cm_node->pdata_buf, private_data, private_data_len); in i40iw_create_cm_node()
3008 cm_node->state = I40IW_CM_STATE_SYN_SENT; in i40iw_create_cm_node()
3009 return cm_node; in i40iw_create_cm_node()
3018 static int i40iw_cm_reject(struct i40iw_cm_node *cm_node, const void *pdata, u8 plen) in i40iw_cm_reject() argument
3023 struct iw_cm_id *cm_id = cm_node->cm_id; in i40iw_cm_reject()
3024 struct i40iw_cm_node *loopback = cm_node->loopbackpartner; in i40iw_cm_reject()
3026 if (cm_node->tcp_cntxt.client) in i40iw_cm_reject()
3028 i40iw_cleanup_retrans_entry(cm_node); in i40iw_cm_reject()
3031 passive_state = atomic_add_return(1, &cm_node->passive_state); in i40iw_cm_reject()
3033 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_cm_reject()
3034 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3036 if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) { in i40iw_cm_reject()
3037 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3039 ret = i40iw_send_mpa_reject(cm_node, pdata, plen); in i40iw_cm_reject()
3041 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_cm_reject()
3042 err = i40iw_send_reset(cm_node); in i40iw_cm_reject()
3051 cm_node->cm_id = NULL; in i40iw_cm_reject()
3052 if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) { in i40iw_cm_reject()
3053 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3060 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3076 static int i40iw_cm_close(struct i40iw_cm_node *cm_node) in i40iw_cm_close() argument
3080 if (!cm_node) in i40iw_cm_close()
3083 switch (cm_node->state) { in i40iw_cm_close()
3091 i40iw_cleanup_retrans_entry(cm_node); in i40iw_cm_close()
3092 i40iw_send_reset(cm_node); in i40iw_cm_close()
3095 cm_node->state = I40IW_CM_STATE_LAST_ACK; in i40iw_cm_close()
3096 i40iw_send_fin(cm_node); in i40iw_cm_close()
3106 i40iw_cleanup_retrans_entry(cm_node); in i40iw_cm_close()
3107 i40iw_send_reset(cm_node); in i40iw_cm_close()
3114 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_close()
3117 if (cm_node->send_entry) in i40iw_cm_close()
3119 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_close()
3133 struct i40iw_cm_node *cm_node; in i40iw_receive_ilq() local
3186 cm_node = i40iw_find_node(cm_core, in i40iw_receive_ilq()
3194 if (!cm_node) { in i40iw_receive_ilq()
3214 cm_node = i40iw_make_cm_node(cm_core, iwdev, &cm_info, listener); in i40iw_receive_ilq()
3215 if (!cm_node) { in i40iw_receive_ilq()
3224 cm_node->state = I40IW_CM_STATE_LISTENING; in i40iw_receive_ilq()
3226 i40iw_rem_ref_cm_node(cm_node); in i40iw_receive_ilq()
3229 atomic_inc(&cm_node->ref_count); in i40iw_receive_ilq()
3230 } else if (cm_node->state == I40IW_CM_STATE_OFFLOADED) { in i40iw_receive_ilq()
3231 i40iw_rem_ref_cm_node(cm_node); in i40iw_receive_ilq()
3234 i40iw_process_packet(cm_node, rbuf); in i40iw_receive_ilq()
3235 i40iw_rem_ref_cm_node(cm_node); in i40iw_receive_ilq()
3306 static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node, in i40iw_init_tcp_ctx() argument
3310 tcp_info->ipv4 = cm_node->ipv4; in i40iw_init_tcp_ctx()
3323 tcp_info->snd_wscale = cm_node->tcp_cntxt.snd_wscale; in i40iw_init_tcp_ctx()
3324 tcp_info->rcv_wscale = cm_node->tcp_cntxt.rcv_wscale; in i40iw_init_tcp_ctx()
3326 tcp_info->snd_nxt = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3327 tcp_info->snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.snd_wnd); in i40iw_init_tcp_ctx()
3328 tcp_info->rcv_nxt = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in i40iw_init_tcp_ctx()
3329 tcp_info->snd_max = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3331 tcp_info->snd_una = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3332 tcp_info->cwnd = cpu_to_le32(2 * cm_node->tcp_cntxt.mss); in i40iw_init_tcp_ctx()
3333 tcp_info->snd_wl1 = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in i40iw_init_tcp_ctx()
3334 tcp_info->snd_wl2 = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3335 tcp_info->max_snd_window = cpu_to_le32(cm_node->tcp_cntxt.max_snd_wnd); in i40iw_init_tcp_ctx()
3336 tcp_info->rcv_wnd = cpu_to_le32(cm_node->tcp_cntxt.rcv_wnd << in i40iw_init_tcp_ctx()
3337 cm_node->tcp_cntxt.rcv_wscale); in i40iw_init_tcp_ctx()
3340 tcp_info->snd_mss = cpu_to_le32(((u32)cm_node->tcp_cntxt.mss)); in i40iw_init_tcp_ctx()
3341 if (cm_node->vlan_id <= VLAN_VID_MASK) { in i40iw_init_tcp_ctx()
3343 tcp_info->vlan_tag = cpu_to_le16(((u16)cm_node->user_pri << I40IW_VLAN_PRIO_SHIFT) | in i40iw_init_tcp_ctx()
3344 cm_node->vlan_id); in i40iw_init_tcp_ctx()
3346 if (cm_node->ipv4) { in i40iw_init_tcp_ctx()
3347 tcp_info->src_port = cpu_to_le16(cm_node->loc_port); in i40iw_init_tcp_ctx()
3348 tcp_info->dst_port = cpu_to_le16(cm_node->rem_port); in i40iw_init_tcp_ctx()
3350 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[0]); in i40iw_init_tcp_ctx()
3351 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[0]); in i40iw_init_tcp_ctx()
3360 tcp_info->src_port = cpu_to_le16(cm_node->loc_port); in i40iw_init_tcp_ctx()
3361 tcp_info->dst_port = cpu_to_le16(cm_node->rem_port); in i40iw_init_tcp_ctx()
3362 tcp_info->dest_ip_addr0 = cpu_to_le32(cm_node->rem_addr[0]); in i40iw_init_tcp_ctx()
3363 tcp_info->dest_ip_addr1 = cpu_to_le32(cm_node->rem_addr[1]); in i40iw_init_tcp_ctx()
3364 tcp_info->dest_ip_addr2 = cpu_to_le32(cm_node->rem_addr[2]); in i40iw_init_tcp_ctx()
3365 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[3]); in i40iw_init_tcp_ctx()
3366 tcp_info->local_ipaddr0 = cpu_to_le32(cm_node->loc_addr[0]); in i40iw_init_tcp_ctx()
3367 tcp_info->local_ipaddr1 = cpu_to_le32(cm_node->loc_addr[1]); in i40iw_init_tcp_ctx()
3368 tcp_info->local_ipaddr2 = cpu_to_le32(cm_node->loc_addr[2]); in i40iw_init_tcp_ctx()
3369 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[3]); in i40iw_init_tcp_ctx()
3386 struct i40iw_cm_node *cm_node) in i40iw_cm_init_tsa_conn() argument
3402 iwarp_info->ord_size = cm_node->ord_size; in i40iw_cm_init_tsa_conn()
3403 iwarp_info->ird_size = i40iw_derive_hw_ird_setting(cm_node->ird_size); in i40iw_cm_init_tsa_conn()
3417 ctx_info->user_pri = cm_node->user_pri; in i40iw_cm_init_tsa_conn()
3419 i40iw_init_tcp_ctx(cm_node, &tcp_info, iwqp); in i40iw_cm_init_tsa_conn()
3420 if (cm_node->snd_mark_en) { in i40iw_cm_init_tsa_conn()
3423 SNDMARKER_SEQNMASK) + cm_node->lsmm_size; in i40iw_cm_init_tsa_conn()
3426 cm_node->state = I40IW_CM_STATE_OFFLOADED; in i40iw_cm_init_tsa_conn()
3429 tcp_info.tos = cm_node->tos; in i40iw_cm_init_tsa_conn()
3503 if (iwqp->cm_node) { in i40iw_qp_disconnect()
3505 i40iw_cm_close(iwqp->cm_node); in i40iw_qp_disconnect()
3649 struct i40iw_cm_node *cm_node; in i40iw_accept() local
3669 cm_node = (struct i40iw_cm_node *)cm_id->provider_data; in i40iw_accept()
3672 cm_node->ipv4 = true; in i40iw_accept()
3673 cm_node->vlan_id = i40iw_get_vlan_ipv4(cm_node->loc_addr); in i40iw_accept()
3675 cm_node->ipv4 = false; in i40iw_accept()
3676 i40iw_netdev_vlan_ipv6(cm_node->loc_addr, &cm_node->vlan_id); in i40iw_accept()
3678 i40iw_debug(cm_node->dev, in i40iw_accept()
3681 cm_node->vlan_id); in i40iw_accept()
3682 if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) { in i40iw_accept()
3683 if (cm_node->loopbackpartner) in i40iw_accept()
3684 i40iw_rem_ref_cm_node(cm_node->loopbackpartner); in i40iw_accept()
3685 i40iw_rem_ref_cm_node(cm_node); in i40iw_accept()
3689 passive_state = atomic_add_return(1, &cm_node->passive_state); in i40iw_accept()
3691 i40iw_rem_ref_cm_node(cm_node); in i40iw_accept()
3695 cm_node->cm_core->stats_accepts++; in i40iw_accept()
3696 iwqp->cm_node = (void *)cm_node; in i40iw_accept()
3697 cm_node->iwqp = iwqp; in i40iw_accept()
3705 cm_node->pdata.size = conn_param->private_data_len; in i40iw_accept()
3707 accept.size = i40iw_cm_build_mpa_frame(cm_node, &accept, MPA_KEY_REPLY); in i40iw_accept()
3712 if ((cm_node->ipv4 && in i40iw_accept()
3713 !i40iw_ipv4_is_loopback(cm_node->loc_addr[0], cm_node->rem_addr[0])) || in i40iw_accept()
3714 (!cm_node->ipv4 && in i40iw_accept()
3715 !i40iw_ipv6_is_loopback(cm_node->loc_addr, cm_node->rem_addr))) { in i40iw_accept()
3748 cm_node->cm_id = cm_id; in i40iw_accept()
3753 cm_node->lsmm_size = accept.size + conn_param->private_data_len; in i40iw_accept()
3754 i40iw_cm_init_tsa_conn(iwqp, cm_node); in i40iw_accept()
3759 cm_node->qhash_set = false; in i40iw_accept()
3762 cm_node->accelerated = true; in i40iw_accept()
3764 list_move_tail(&cm_node->list, &cm_core->accelerated_list); in i40iw_accept()
3768 i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_ESTABLISHED, 0); in i40iw_accept()
3772 if (cm_node->loopbackpartner) { in i40iw_accept()
3773 cm_node->loopbackpartner->pdata.size = conn_param->private_data_len; in i40iw_accept()
3776 memcpy(cm_node->loopbackpartner->pdata_buf, in i40iw_accept()
3779 i40iw_create_event(cm_node->loopbackpartner, I40IW_CM_EVENT_CONNECTED); in i40iw_accept()
3782 if (cm_node->accept_pend) { in i40iw_accept()
3783 atomic_dec(&cm_node->listener->pend_accepts_cnt); in i40iw_accept()
3784 cm_node->accept_pend = 0; in i40iw_accept()
3798 struct i40iw_cm_node *cm_node; in i40iw_reject() local
3801 cm_node = (struct i40iw_cm_node *)cm_id->provider_data; in i40iw_reject()
3802 loopback = cm_node->loopbackpartner; in i40iw_reject()
3803 cm_node->cm_id = cm_id; in i40iw_reject()
3804 cm_node->pdata.size = pdata_len; in i40iw_reject()
3809 cm_node->cm_core->stats_rejects++; in i40iw_reject()
3819 return i40iw_cm_reject(cm_node, pdata, pdata_len); in i40iw_reject()
3832 struct i40iw_cm_node *cm_node; in i40iw_connect() local
3888 cm_node = i40iw_create_cm_node(&iwdev->cm_core, iwdev, in i40iw_connect()
3891 if (IS_ERR(cm_node)) { in i40iw_connect()
3892 ret = PTR_ERR(cm_node); in i40iw_connect()
3906 cm_node->qhash_set = true; in i40iw_connect()
3915 cm_node->apbvt_set = true; in i40iw_connect()
3916 iwqp->cm_node = cm_node; in i40iw_connect()
3917 cm_node->iwqp = iwqp; in i40iw_connect()
3921 if (cm_node->state != I40IW_CM_STATE_OFFLOADED) { in i40iw_connect()
3922 cm_node->state = I40IW_CM_STATE_SYN_SENT; in i40iw_connect()
3923 ret = i40iw_send_syn(cm_node, 0); in i40iw_connect()
3928 if (cm_node->loopbackpartner) { in i40iw_connect()
3929 cm_node->loopbackpartner->state = I40IW_CM_STATE_MPAREQ_RCVD; in i40iw_connect()
3930 i40iw_create_event(cm_node->loopbackpartner, in i40iw_connect()
3934 i40iw_debug(cm_node->dev, in i40iw_connect()
3937 cm_node->rem_port, in i40iw_connect()
3938 cm_node, in i40iw_connect()
3939 cm_node->cm_id); in i40iw_connect()
3955 i40iw_rem_ref_cm_node(cm_node); in i40iw_connect()
4091 struct i40iw_cm_node *cm_node; in i40iw_cm_event_connected() local
4099 cm_node = event->cm_node; in i40iw_cm_event_connected()
4100 cm_id = cm_node->cm_id; in i40iw_cm_event_connected()
4110 i40iw_cm_init_tsa_conn(iwqp, cm_node); in i40iw_cm_event_connected()
4111 read0 = (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO); in i40iw_cm_event_connected()
4120 cm_node->qhash_set = false; in i40iw_cm_event_connected()
4123 cm_node->accelerated = true; in i40iw_cm_event_connected()
4125 list_move_tail(&cm_node->list, &cm_core->accelerated_list); in i40iw_cm_event_connected()
4127 status = i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY, in i40iw_cm_event_connected()
4137 i40iw_send_cm_event(event->cm_node, in i40iw_cm_event_connected()
4142 i40iw_rem_ref_cm_node(event->cm_node); in i40iw_cm_event_connected()
4151 struct i40iw_cm_node *cm_node = event->cm_node; in i40iw_cm_event_reset() local
4152 struct iw_cm_id *cm_id = cm_node->cm_id; in i40iw_cm_event_reset()
4162 i40iw_debug(cm_node->dev, in i40iw_cm_event_reset()
4165 event->cm_node, cm_id); in i40iw_cm_event_reset()
4168 i40iw_send_cm_event(cm_node, cm_node->cm_id, IW_CM_EVENT_DISCONNECT, -ECONNRESET); in i40iw_cm_event_reset()
4169 i40iw_send_cm_event(cm_node, cm_node->cm_id, IW_CM_EVENT_CLOSE, 0); in i40iw_cm_event_reset()
4181 struct i40iw_cm_node *cm_node; in i40iw_cm_event_handler() local
4183 if (!event || !event->cm_node || !event->cm_node->cm_core) in i40iw_cm_event_handler()
4186 cm_node = event->cm_node; in i40iw_cm_event_handler()
4190 i40iw_send_cm_event(cm_node, in i40iw_cm_event_handler()
4191 cm_node->cm_id, in i40iw_cm_event_handler()
4199 if (!event->cm_node->cm_id || in i40iw_cm_event_handler()
4200 (event->cm_node->state != I40IW_CM_STATE_OFFLOADED)) in i40iw_cm_event_handler()
4205 if (!event->cm_node->cm_id || in i40iw_cm_event_handler()
4206 (cm_node->state == I40IW_CM_STATE_OFFLOADED)) in i40iw_cm_event_handler()
4208 i40iw_send_cm_event(cm_node, in i40iw_cm_event_handler()
4209 cm_node->cm_id, in i40iw_cm_event_handler()
4214 if (!event->cm_node->cm_id || in i40iw_cm_event_handler()
4215 (event->cm_node->state == I40IW_CM_STATE_OFFLOADED)) in i40iw_cm_event_handler()
4225 i40iw_rem_ref_cm_node(event->cm_node); in i40iw_cm_event_handler()
4235 atomic_inc(&event->cm_node->ref_count); in i40iw_cm_post_event()
4239 queue_work(event->cm_node->cm_core->event_wq, &event->event_work); in i40iw_cm_post_event()
4324 struct i40iw_cm_node *cm_node; in i40iw_cm_teardown_connections() local
4333 cm_node = container_of(list_node, struct i40iw_cm_node, list); in i40iw_cm_teardown_connections()
4335 (nfo->vlan_id == cm_node->vlan_id && in i40iw_cm_teardown_connections()
4336 (!memcmp(cm_node->loc_addr, ipaddr, nfo->ipv4 ? 4 : 16) || in i40iw_cm_teardown_connections()
4337 !memcmp(cm_node->rem_addr, ipaddr, nfo->ipv4 ? 4 : 16)))) { in i40iw_cm_teardown_connections()
4338 atomic_inc(&cm_node->ref_count); in i40iw_cm_teardown_connections()
4339 list_add(&cm_node->teardown_entry, &teardown_list); in i40iw_cm_teardown_connections()
4344 cm_node = container_of(list_node, struct i40iw_cm_node, list); in i40iw_cm_teardown_connections()
4346 (nfo->vlan_id == cm_node->vlan_id && in i40iw_cm_teardown_connections()
4347 (!memcmp(cm_node->loc_addr, ipaddr, nfo->ipv4 ? 4 : 16) || in i40iw_cm_teardown_connections()
4348 !memcmp(cm_node->rem_addr, ipaddr, nfo->ipv4 ? 4 : 16)))) { in i40iw_cm_teardown_connections()
4349 atomic_inc(&cm_node->ref_count); in i40iw_cm_teardown_connections()
4350 list_add(&cm_node->teardown_entry, &teardown_list); in i40iw_cm_teardown_connections()
4356 cm_node = container_of(list_node, struct i40iw_cm_node, in i40iw_cm_teardown_connections()
4359 i40iw_modify_qp(&cm_node->iwqp->ibqp, &attr, IB_QP_STATE, NULL); in i40iw_cm_teardown_connections()
4361 i40iw_cm_disconn(cm_node->iwqp); in i40iw_cm_teardown_connections()
4362 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_teardown_connections()