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()
2162 struct i40iw_cm_node *cm_node; in i40iw_make_cm_node() local
2168 cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC); in i40iw_make_cm_node()
2169 if (!cm_node) in i40iw_make_cm_node()
2173 cm_node->ipv4 = cm_info->ipv4; in i40iw_make_cm_node()
2174 cm_node->vlan_id = cm_info->vlan_id; in i40iw_make_cm_node()
2175 if ((cm_node->vlan_id == I40IW_NO_VLAN) && iwdev->dcb) in i40iw_make_cm_node()
2176 cm_node->vlan_id = 0; in i40iw_make_cm_node()
2177 cm_node->tos = cm_info->tos; in i40iw_make_cm_node()
2178 cm_node->user_pri = cm_info->user_pri; in i40iw_make_cm_node()
2184 cm_node->tos = max(listener->tos, cm_info->tos); in i40iw_make_cm_node()
2185 cm_node->user_pri = rt_tos2priority(cm_node->tos); in i40iw_make_cm_node()
2187 cm_node->tos, cm_node->user_pri); in i40iw_make_cm_node()
2189 memcpy(cm_node->loc_addr, cm_info->loc_addr, sizeof(cm_node->loc_addr)); in i40iw_make_cm_node()
2190 memcpy(cm_node->rem_addr, cm_info->rem_addr, sizeof(cm_node->rem_addr)); in i40iw_make_cm_node()
2191 cm_node->loc_port = cm_info->loc_port; in i40iw_make_cm_node()
2192 cm_node->rem_port = cm_info->rem_port; in i40iw_make_cm_node()
2194 cm_node->mpa_frame_rev = iwdev->mpa_version; in i40iw_make_cm_node()
2195 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in i40iw_make_cm_node()
2196 cm_node->ird_size = I40IW_MAX_IRD_SIZE; in i40iw_make_cm_node()
2197 cm_node->ord_size = I40IW_MAX_ORD_SIZE; in i40iw_make_cm_node()
2199 cm_node->listener = listener; in i40iw_make_cm_node()
2200 cm_node->cm_id = cm_info->cm_id; in i40iw_make_cm_node()
2201 ether_addr_copy(cm_node->loc_mac, netdev->dev_addr); in i40iw_make_cm_node()
2202 spin_lock_init(&cm_node->retrans_list_lock); in i40iw_make_cm_node()
2203 cm_node->ack_rcvd = false; in i40iw_make_cm_node()
2205 atomic_set(&cm_node->ref_count, 1); in i40iw_make_cm_node()
2207 cm_node->cm_core = cm_core; in i40iw_make_cm_node()
2208 cm_node->tcp_cntxt.loc_id = I40IW_CM_DEF_LOCAL_ID; in i40iw_make_cm_node()
2209 cm_node->tcp_cntxt.rcv_wscale = I40IW_CM_DEFAULT_RCV_WND_SCALE; in i40iw_make_cm_node()
2210 cm_node->tcp_cntxt.rcv_wnd = in i40iw_make_cm_node()
2212 if (cm_node->ipv4) { in i40iw_make_cm_node()
2213 cm_node->tcp_cntxt.loc_seq_num = secure_tcp_seq(htonl(cm_node->loc_addr[0]), in i40iw_make_cm_node()
2214 htonl(cm_node->rem_addr[0]), in i40iw_make_cm_node()
2215 htons(cm_node->loc_port), in i40iw_make_cm_node()
2216 htons(cm_node->rem_port)); in i40iw_make_cm_node()
2217 cm_node->tcp_cntxt.mss = iwdev->vsi.mtu - I40IW_MTU_TO_MSS_IPV4; in i40iw_make_cm_node()
2220 htonl(cm_node->loc_addr[0]), htonl(cm_node->loc_addr[1]), in i40iw_make_cm_node()
2221 htonl(cm_node->loc_addr[2]), htonl(cm_node->loc_addr[3]) in i40iw_make_cm_node()
2224 htonl(cm_node->rem_addr[0]), htonl(cm_node->rem_addr[1]), in i40iw_make_cm_node()
2225 htonl(cm_node->rem_addr[2]), htonl(cm_node->rem_addr[3]) in i40iw_make_cm_node()
2227 cm_node->tcp_cntxt.loc_seq_num = secure_tcpv6_seq(loc, rem, in i40iw_make_cm_node()
2228 htons(cm_node->loc_port), in i40iw_make_cm_node()
2229 htons(cm_node->rem_port)); in i40iw_make_cm_node()
2230 cm_node->tcp_cntxt.mss = iwdev->vsi.mtu - I40IW_MTU_TO_MSS_IPV6; in i40iw_make_cm_node()
2233 cm_node->iwdev = iwdev; in i40iw_make_cm_node()
2234 cm_node->dev = &iwdev->sc_dev; in i40iw_make_cm_node()
2236 if ((cm_node->ipv4 && in i40iw_make_cm_node()
2237 i40iw_ipv4_is_loopback(cm_node->loc_addr[0], cm_node->rem_addr[0])) || in i40iw_make_cm_node()
2238 (!cm_node->ipv4 && i40iw_ipv6_is_loopback(cm_node->loc_addr, in i40iw_make_cm_node()
2239 cm_node->rem_addr))) { in i40iw_make_cm_node()
2241 cm_node->rem_addr, in i40iw_make_cm_node()
2247 cm_node->rem_addr, in i40iw_make_cm_node()
2251 if (cm_node->ipv4) in i40iw_make_cm_node()
2266 kfree(cm_node); in i40iw_make_cm_node()
2269 ether_addr_copy(cm_node->rem_mac, iwdev->arp_table[arpindex].mac_addr); in i40iw_make_cm_node()
2270 i40iw_add_hte_node(cm_core, cm_node); in i40iw_make_cm_node()
2272 return cm_node; in i40iw_make_cm_node()
2279 static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node) in i40iw_rem_ref_cm_node() argument
2281 struct i40iw_cm_core *cm_core = cm_node->cm_core; in i40iw_rem_ref_cm_node()
2286 spin_lock_irqsave(&cm_node->cm_core->ht_lock, flags); in i40iw_rem_ref_cm_node()
2287 if (atomic_dec_return(&cm_node->ref_count)) { in i40iw_rem_ref_cm_node()
2288 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in i40iw_rem_ref_cm_node()
2291 list_del(&cm_node->list); in i40iw_rem_ref_cm_node()
2292 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in i40iw_rem_ref_cm_node()
2295 if (!cm_node->accelerated && cm_node->accept_pend) { in i40iw_rem_ref_cm_node()
2297 atomic_dec(&cm_node->listener->pend_accepts_cnt); in i40iw_rem_ref_cm_node()
2299 if (cm_node->close_entry) in i40iw_rem_ref_cm_node()
2300 i40iw_handle_close_entry(cm_node, 0); in i40iw_rem_ref_cm_node()
2301 if (cm_node->listener) { in i40iw_rem_ref_cm_node()
2302 i40iw_dec_refcnt_listen(cm_core, cm_node->listener, 0, true); in i40iw_rem_ref_cm_node()
2304 if (cm_node->apbvt_set) { in i40iw_rem_ref_cm_node()
2305 i40iw_manage_apbvt(cm_node->iwdev, in i40iw_rem_ref_cm_node()
2306 cm_node->loc_port, in i40iw_rem_ref_cm_node()
2308 cm_node->apbvt_set = 0; in i40iw_rem_ref_cm_node()
2310 i40iw_get_addr_info(cm_node, &nfo); in i40iw_rem_ref_cm_node()
2311 if (cm_node->qhash_set) { in i40iw_rem_ref_cm_node()
2312 i40iw_manage_qhash(cm_node->iwdev, in i40iw_rem_ref_cm_node()
2318 cm_node->qhash_set = 0; in i40iw_rem_ref_cm_node()
2322 iwqp = cm_node->iwqp; in i40iw_rem_ref_cm_node()
2324 iwqp->cm_node = NULL; in i40iw_rem_ref_cm_node()
2326 cm_node->iwqp = NULL; in i40iw_rem_ref_cm_node()
2327 } else if (cm_node->qhash_set) { in i40iw_rem_ref_cm_node()
2328 i40iw_get_addr_info(cm_node, &nfo); in i40iw_rem_ref_cm_node()
2329 i40iw_manage_qhash(cm_node->iwdev, in i40iw_rem_ref_cm_node()
2335 cm_node->qhash_set = 0; in i40iw_rem_ref_cm_node()
2338 cm_node->cm_core->stats_nodes_destroyed++; in i40iw_rem_ref_cm_node()
2339 kfree(cm_node); in i40iw_rem_ref_cm_node()
2346 static void i40iw_handle_fin_pkt(struct i40iw_cm_node *cm_node) in i40iw_handle_fin_pkt() argument
2350 switch (cm_node->state) { in i40iw_handle_fin_pkt()
2355 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2356 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2357 cm_node->state = I40IW_CM_STATE_LAST_ACK; in i40iw_handle_fin_pkt()
2358 i40iw_send_fin(cm_node); in i40iw_handle_fin_pkt()
2361 i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED); in i40iw_handle_fin_pkt()
2362 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2363 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2364 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_fin_pkt()
2365 atomic_inc(&cm_node->ref_count); in i40iw_handle_fin_pkt()
2366 i40iw_send_reset(cm_node); in i40iw_handle_fin_pkt()
2369 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2370 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2371 cm_node->state = I40IW_CM_STATE_CLOSING; in i40iw_handle_fin_pkt()
2372 i40iw_send_ack(cm_node); in i40iw_handle_fin_pkt()
2380 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2381 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2382 cm_node->state = I40IW_CM_STATE_TIME_WAIT; in i40iw_handle_fin_pkt()
2383 i40iw_send_ack(cm_node); in i40iw_handle_fin_pkt()
2385 i40iw_schedule_cm_timer(cm_node, NULL, I40IW_TIMER_TYPE_CLOSE, 1, 0); in i40iw_handle_fin_pkt()
2387 i40iw_pr_err("node %p state = %d\n", cm_node, cm_node->state); in i40iw_handle_fin_pkt()
2390 cm_node->tcp_cntxt.rcv_nxt++; in i40iw_handle_fin_pkt()
2391 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_fin_pkt()
2392 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_fin_pkt()
2393 i40iw_rem_ref_cm_node(cm_node); in i40iw_handle_fin_pkt()
2397 i40iw_pr_err("bad state node %p state = %d\n", cm_node, cm_node->state); in i40iw_handle_fin_pkt()
2407 static void i40iw_handle_rst_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_rst_pkt() argument
2410 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_rst_pkt()
2411 switch (cm_node->state) { in i40iw_handle_rst_pkt()
2414 switch (cm_node->mpa_frame_rev) { in i40iw_handle_rst_pkt()
2416 cm_node->mpa_frame_rev = IETF_MPA_V1; in i40iw_handle_rst_pkt()
2418 cm_node->state = I40IW_CM_STATE_SYN_SENT; in i40iw_handle_rst_pkt()
2419 if (i40iw_send_syn(cm_node, 0)) in i40iw_handle_rst_pkt()
2420 i40iw_active_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2424 i40iw_active_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2429 atomic_add_return(1, &cm_node->passive_state); in i40iw_handle_rst_pkt()
2434 i40iw_pr_err("Bad state state = %d\n", cm_node->state); in i40iw_handle_rst_pkt()
2435 i40iw_passive_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2438 i40iw_active_open_err(cm_node, false); in i40iw_handle_rst_pkt()
2445 cm_node->cm_id->rem_ref(cm_node->cm_id); in i40iw_handle_rst_pkt()
2448 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_rst_pkt()
2449 i40iw_rem_ref_cm_node(cm_node); in i40iw_handle_rst_pkt()
2461 static void i40iw_handle_rcv_mpa(struct i40iw_cm_node *cm_node, in i40iw_handle_rcv_mpa() argument
2471 ret = i40iw_parse_mpa(cm_node, dataloc, &res_type, datasize); in i40iw_handle_rcv_mpa()
2473 if (cm_node->state == I40IW_CM_STATE_MPAREQ_SENT) in i40iw_handle_rcv_mpa()
2474 i40iw_active_open_err(cm_node, true); in i40iw_handle_rcv_mpa()
2476 i40iw_passive_open_err(cm_node, true); in i40iw_handle_rcv_mpa()
2480 switch (cm_node->state) { in i40iw_handle_rcv_mpa()
2484 cm_node->state = I40IW_CM_STATE_MPAREQ_RCVD; in i40iw_handle_rcv_mpa()
2486 i40iw_send_ack(cm_node); /* ACK received MPA request */ in i40iw_handle_rcv_mpa()
2487 atomic_set(&cm_node->passive_state, in i40iw_handle_rcv_mpa()
2491 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_rcv_mpa()
2494 cm_node->state = I40IW_CM_STATE_MPAREJ_RCVD; in i40iw_handle_rcv_mpa()
2497 cm_node->state = I40IW_CM_STATE_OFFLOADED; in i40iw_handle_rcv_mpa()
2499 i40iw_send_ack(cm_node); in i40iw_handle_rcv_mpa()
2502 pr_err("%s wrong cm_node state =%d\n", __func__, cm_node->state); in i40iw_handle_rcv_mpa()
2505 i40iw_create_event(cm_node, type); in i40iw_handle_rcv_mpa()
2512 static void i40iw_indicate_pkt_err(struct i40iw_cm_node *cm_node) in i40iw_indicate_pkt_err() argument
2514 switch (cm_node->state) { in i40iw_indicate_pkt_err()
2517 i40iw_active_open_err(cm_node, true); in i40iw_indicate_pkt_err()
2521 i40iw_passive_open_err(cm_node, true); in i40iw_indicate_pkt_err()
2534 static int i40iw_check_syn(struct i40iw_cm_node *cm_node, struct tcphdr *tcph) in i40iw_check_syn() argument
2538 if (ntohl(tcph->ack_seq) != cm_node->tcp_cntxt.loc_seq_num) { in i40iw_check_syn()
2540 i40iw_active_open_err(cm_node, true); in i40iw_check_syn()
2550 static int i40iw_check_seq(struct i40iw_cm_node *cm_node, struct tcphdr *tcph) in i40iw_check_seq() argument
2555 u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num; in i40iw_check_seq()
2556 u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt; in i40iw_check_seq()
2561 rcv_wnd = cm_node->tcp_cntxt.rcv_wnd; in i40iw_check_seq()
2568 i40iw_indicate_pkt_err(cm_node); in i40iw_check_seq()
2578 static void i40iw_handle_syn_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_syn_pkt() argument
2590 switch (cm_node->state) { in i40iw_handle_syn_pkt()
2594 i40iw_active_open_err(cm_node, 1); in i40iw_handle_syn_pkt()
2598 if (atomic_read(&cm_node->listener->pend_accepts_cnt) > in i40iw_handle_syn_pkt()
2599 cm_node->listener->backlog) { in i40iw_handle_syn_pkt()
2600 cm_node->cm_core->stats_backlog_drops++; in i40iw_handle_syn_pkt()
2601 i40iw_passive_open_err(cm_node, false); in i40iw_handle_syn_pkt()
2604 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 1); in i40iw_handle_syn_pkt()
2606 i40iw_passive_open_err(cm_node, false); in i40iw_handle_syn_pkt()
2610 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in i40iw_handle_syn_pkt()
2611 cm_node->accept_pend = 1; in i40iw_handle_syn_pkt()
2612 atomic_inc(&cm_node->listener->pend_accepts_cnt); in i40iw_handle_syn_pkt()
2614 cm_node->state = I40IW_CM_STATE_SYN_RCVD; in i40iw_handle_syn_pkt()
2615 i40iw_get_addr_info(cm_node, &nfo); in i40iw_handle_syn_pkt()
2616 ret = i40iw_manage_qhash(cm_node->iwdev, in i40iw_handle_syn_pkt()
2620 (void *)cm_node, in i40iw_handle_syn_pkt()
2622 cm_node->qhash_set = true; in i40iw_handle_syn_pkt()
2625 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_syn_pkt()
2626 atomic_inc(&cm_node->ref_count); in i40iw_handle_syn_pkt()
2627 i40iw_send_reset(cm_node); in i40iw_handle_syn_pkt()
2647 static void i40iw_handle_synack_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_synack_pkt() argument
2657 switch (cm_node->state) { in i40iw_handle_synack_pkt()
2659 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2661 if (i40iw_check_syn(cm_node, tcph)) { in i40iw_handle_synack_pkt()
2665 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in i40iw_handle_synack_pkt()
2667 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 0); in i40iw_handle_synack_pkt()
2669 i40iw_debug(cm_node->dev, in i40iw_handle_synack_pkt()
2672 cm_node); in i40iw_handle_synack_pkt()
2675 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2676 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in i40iw_handle_synack_pkt()
2677 i40iw_send_ack(cm_node); /* ACK for the syn_ack */ in i40iw_handle_synack_pkt()
2678 ret = i40iw_send_mpa_request(cm_node); in i40iw_handle_synack_pkt()
2680 i40iw_debug(cm_node->dev, in i40iw_handle_synack_pkt()
2683 cm_node); in i40iw_handle_synack_pkt()
2686 cm_node->state = I40IW_CM_STATE_MPAREQ_SENT; in i40iw_handle_synack_pkt()
2689 i40iw_passive_open_err(cm_node, true); in i40iw_handle_synack_pkt()
2692 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in i40iw_handle_synack_pkt()
2693 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2694 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_synack_pkt()
2695 i40iw_send_reset(cm_node); in i40iw_handle_synack_pkt()
2698 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in i40iw_handle_synack_pkt()
2699 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_synack_pkt()
2700 atomic_inc(&cm_node->ref_count); in i40iw_handle_synack_pkt()
2701 i40iw_send_reset(cm_node); in i40iw_handle_synack_pkt()
2721 static int i40iw_handle_ack_pkt(struct i40iw_cm_node *cm_node, in i40iw_handle_ack_pkt() argument
2732 if (i40iw_check_seq(cm_node, tcph)) in i40iw_handle_ack_pkt()
2736 switch (cm_node->state) { in i40iw_handle_ack_pkt()
2738 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2739 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 1); in i40iw_handle_ack_pkt()
2742 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in i40iw_handle_ack_pkt()
2743 cm_node->state = I40IW_CM_STATE_ESTABLISHED; in i40iw_handle_ack_pkt()
2745 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in i40iw_handle_ack_pkt()
2746 i40iw_handle_rcv_mpa(cm_node, rbuf); in i40iw_handle_ack_pkt()
2750 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2752 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in i40iw_handle_ack_pkt()
2753 i40iw_handle_rcv_mpa(cm_node, rbuf); in i40iw_handle_ack_pkt()
2757 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in i40iw_handle_ack_pkt()
2759 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in i40iw_handle_ack_pkt()
2760 cm_node->ack_rcvd = false; in i40iw_handle_ack_pkt()
2761 i40iw_handle_rcv_mpa(cm_node, rbuf); in i40iw_handle_ack_pkt()
2763 cm_node->ack_rcvd = true; in i40iw_handle_ack_pkt()
2767 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2768 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_ack_pkt()
2769 i40iw_send_reset(cm_node); in i40iw_handle_ack_pkt()
2772 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2773 atomic_inc(&cm_node->ref_count); in i40iw_handle_ack_pkt()
2774 i40iw_send_reset(cm_node); in i40iw_handle_ack_pkt()
2778 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2779 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_handle_ack_pkt()
2780 if (!cm_node->accept_pend) in i40iw_handle_ack_pkt()
2781 cm_node->cm_id->rem_ref(cm_node->cm_id); in i40iw_handle_ack_pkt()
2782 i40iw_rem_ref_cm_node(cm_node); in i40iw_handle_ack_pkt()
2785 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2786 cm_node->state = I40IW_CM_STATE_FIN_WAIT2; in i40iw_handle_ack_pkt()
2794 i40iw_cleanup_retrans_entry(cm_node); in i40iw_handle_ack_pkt()
2805 static void i40iw_process_packet(struct i40iw_cm_node *cm_node, in i40iw_process_packet() argument
2827 i40iw_handle_syn_pkt(cm_node, rbuf); in i40iw_process_packet()
2830 i40iw_handle_synack_pkt(cm_node, rbuf); in i40iw_process_packet()
2833 ret = i40iw_handle_ack_pkt(cm_node, rbuf); in i40iw_process_packet()
2835 i40iw_handle_fin_pkt(cm_node); in i40iw_process_packet()
2838 i40iw_handle_rst_pkt(cm_node, rbuf); in i40iw_process_packet()
2842 (!i40iw_check_seq(cm_node, (struct tcphdr *)rbuf->tcph))) in i40iw_process_packet()
2843 i40iw_handle_fin_pkt(cm_node); in i40iw_process_packet()
2924 struct i40iw_cm_node *cm_node; in i40iw_create_cm_node() local
2933 cm_node = i40iw_make_cm_node(cm_core, iwdev, cm_info, NULL); in i40iw_create_cm_node()
2934 if (!cm_node) in i40iw_create_cm_node()
2937 cm_node->tcp_cntxt.client = 1; in i40iw_create_cm_node()
2938 cm_node->tcp_cntxt.rcv_wscale = I40IW_CM_DEFAULT_RCV_WND_SCALE; in i40iw_create_cm_node()
2940 i40iw_record_ird_ord(cm_node, conn_param->ird, conn_param->ord); in i40iw_create_cm_node()
2946 cm_node->rem_port, in i40iw_create_cm_node()
2947 cm_node->vlan_id, in i40iw_create_cm_node()
2950 i40iw_rem_ref_cm_node(cm_node); in i40iw_create_cm_node()
2963 i40iw_rem_ref_cm_node(cm_node); in i40iw_create_cm_node()
2967 loopback_remotenode->loopbackpartner = cm_node; in i40iw_create_cm_node()
2970 cm_node->loopbackpartner = loopback_remotenode; in i40iw_create_cm_node()
2975 if (loopback_remotenode->ord_size > cm_node->ird_size) in i40iw_create_cm_node()
2977 cm_node->ird_size; in i40iw_create_cm_node()
2979 cm_node->state = I40IW_CM_STATE_OFFLOADED; in i40iw_create_cm_node()
2980 cm_node->tcp_cntxt.rcv_nxt = in i40iw_create_cm_node()
2983 cm_node->tcp_cntxt.loc_seq_num; in i40iw_create_cm_node()
2984 cm_node->tcp_cntxt.max_snd_wnd = in i40iw_create_cm_node()
2986 loopback_remotenode->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.rcv_wnd; in i40iw_create_cm_node()
2987 cm_node->tcp_cntxt.snd_wnd = loopback_remotenode->tcp_cntxt.rcv_wnd; in i40iw_create_cm_node()
2988 loopback_remotenode->tcp_cntxt.snd_wnd = cm_node->tcp_cntxt.rcv_wnd; in i40iw_create_cm_node()
2989 cm_node->tcp_cntxt.snd_wscale = loopback_remotenode->tcp_cntxt.rcv_wscale; in i40iw_create_cm_node()
2990 loopback_remotenode->tcp_cntxt.snd_wscale = cm_node->tcp_cntxt.rcv_wscale; in i40iw_create_cm_node()
2992 return cm_node; in i40iw_create_cm_node()
2995 cm_node->pdata.size = private_data_len; in i40iw_create_cm_node()
2996 cm_node->pdata.addr = cm_node->pdata_buf; in i40iw_create_cm_node()
2998 memcpy(cm_node->pdata_buf, private_data, private_data_len); in i40iw_create_cm_node()
3000 cm_node->state = I40IW_CM_STATE_SYN_SENT; in i40iw_create_cm_node()
3001 return cm_node; in i40iw_create_cm_node()
3010 static int i40iw_cm_reject(struct i40iw_cm_node *cm_node, const void *pdata, u8 plen) in i40iw_cm_reject() argument
3015 struct iw_cm_id *cm_id = cm_node->cm_id; in i40iw_cm_reject()
3016 struct i40iw_cm_node *loopback = cm_node->loopbackpartner; in i40iw_cm_reject()
3018 if (cm_node->tcp_cntxt.client) in i40iw_cm_reject()
3020 i40iw_cleanup_retrans_entry(cm_node); in i40iw_cm_reject()
3023 passive_state = atomic_add_return(1, &cm_node->passive_state); in i40iw_cm_reject()
3025 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_cm_reject()
3026 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3028 if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) { in i40iw_cm_reject()
3029 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3031 ret = i40iw_send_mpa_reject(cm_node, pdata, plen); in i40iw_cm_reject()
3033 cm_node->state = I40IW_CM_STATE_CLOSED; in i40iw_cm_reject()
3034 err = i40iw_send_reset(cm_node); in i40iw_cm_reject()
3043 cm_node->cm_id = NULL; in i40iw_cm_reject()
3044 if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) { in i40iw_cm_reject()
3045 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3052 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_reject()
3068 static int i40iw_cm_close(struct i40iw_cm_node *cm_node) in i40iw_cm_close() argument
3072 if (!cm_node) in i40iw_cm_close()
3075 switch (cm_node->state) { in i40iw_cm_close()
3083 i40iw_cleanup_retrans_entry(cm_node); in i40iw_cm_close()
3084 i40iw_send_reset(cm_node); in i40iw_cm_close()
3087 cm_node->state = I40IW_CM_STATE_LAST_ACK; in i40iw_cm_close()
3088 i40iw_send_fin(cm_node); in i40iw_cm_close()
3098 i40iw_cleanup_retrans_entry(cm_node); in i40iw_cm_close()
3099 i40iw_send_reset(cm_node); in i40iw_cm_close()
3106 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_close()
3109 if (cm_node->send_entry) in i40iw_cm_close()
3111 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_close()
3125 struct i40iw_cm_node *cm_node; in i40iw_receive_ilq() local
3178 cm_node = i40iw_find_node(cm_core, in i40iw_receive_ilq()
3186 if (!cm_node) { in i40iw_receive_ilq()
3206 cm_node = i40iw_make_cm_node(cm_core, iwdev, &cm_info, listener); in i40iw_receive_ilq()
3207 if (!cm_node) { in i40iw_receive_ilq()
3216 cm_node->state = I40IW_CM_STATE_LISTENING; in i40iw_receive_ilq()
3218 i40iw_rem_ref_cm_node(cm_node); in i40iw_receive_ilq()
3221 atomic_inc(&cm_node->ref_count); in i40iw_receive_ilq()
3222 } else if (cm_node->state == I40IW_CM_STATE_OFFLOADED) { in i40iw_receive_ilq()
3223 i40iw_rem_ref_cm_node(cm_node); in i40iw_receive_ilq()
3226 i40iw_process_packet(cm_node, rbuf); in i40iw_receive_ilq()
3227 i40iw_rem_ref_cm_node(cm_node); in i40iw_receive_ilq()
3298 static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node, in i40iw_init_tcp_ctx() argument
3302 tcp_info->ipv4 = cm_node->ipv4; in i40iw_init_tcp_ctx()
3315 tcp_info->snd_wscale = cm_node->tcp_cntxt.snd_wscale; in i40iw_init_tcp_ctx()
3316 tcp_info->rcv_wscale = cm_node->tcp_cntxt.rcv_wscale; in i40iw_init_tcp_ctx()
3318 tcp_info->snd_nxt = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3319 tcp_info->snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.snd_wnd); in i40iw_init_tcp_ctx()
3320 tcp_info->rcv_nxt = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in i40iw_init_tcp_ctx()
3321 tcp_info->snd_max = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3323 tcp_info->snd_una = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3324 tcp_info->cwnd = cpu_to_le32(2 * cm_node->tcp_cntxt.mss); in i40iw_init_tcp_ctx()
3325 tcp_info->snd_wl1 = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in i40iw_init_tcp_ctx()
3326 tcp_info->snd_wl2 = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in i40iw_init_tcp_ctx()
3327 tcp_info->max_snd_window = cpu_to_le32(cm_node->tcp_cntxt.max_snd_wnd); in i40iw_init_tcp_ctx()
3328 tcp_info->rcv_wnd = cpu_to_le32(cm_node->tcp_cntxt.rcv_wnd << in i40iw_init_tcp_ctx()
3329 cm_node->tcp_cntxt.rcv_wscale); in i40iw_init_tcp_ctx()
3332 tcp_info->snd_mss = cpu_to_le32(((u32)cm_node->tcp_cntxt.mss)); in i40iw_init_tcp_ctx()
3333 if (cm_node->vlan_id <= VLAN_VID_MASK) { in i40iw_init_tcp_ctx()
3335 tcp_info->vlan_tag = cpu_to_le16(((u16)cm_node->user_pri << I40IW_VLAN_PRIO_SHIFT) | in i40iw_init_tcp_ctx()
3336 cm_node->vlan_id); in i40iw_init_tcp_ctx()
3338 if (cm_node->ipv4) { in i40iw_init_tcp_ctx()
3339 tcp_info->src_port = cpu_to_le16(cm_node->loc_port); in i40iw_init_tcp_ctx()
3340 tcp_info->dst_port = cpu_to_le16(cm_node->rem_port); in i40iw_init_tcp_ctx()
3342 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[0]); in i40iw_init_tcp_ctx()
3343 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[0]); in i40iw_init_tcp_ctx()
3352 tcp_info->src_port = cpu_to_le16(cm_node->loc_port); in i40iw_init_tcp_ctx()
3353 tcp_info->dst_port = cpu_to_le16(cm_node->rem_port); in i40iw_init_tcp_ctx()
3354 tcp_info->dest_ip_addr0 = cpu_to_le32(cm_node->rem_addr[0]); in i40iw_init_tcp_ctx()
3355 tcp_info->dest_ip_addr1 = cpu_to_le32(cm_node->rem_addr[1]); in i40iw_init_tcp_ctx()
3356 tcp_info->dest_ip_addr2 = cpu_to_le32(cm_node->rem_addr[2]); in i40iw_init_tcp_ctx()
3357 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[3]); in i40iw_init_tcp_ctx()
3358 tcp_info->local_ipaddr0 = cpu_to_le32(cm_node->loc_addr[0]); in i40iw_init_tcp_ctx()
3359 tcp_info->local_ipaddr1 = cpu_to_le32(cm_node->loc_addr[1]); in i40iw_init_tcp_ctx()
3360 tcp_info->local_ipaddr2 = cpu_to_le32(cm_node->loc_addr[2]); in i40iw_init_tcp_ctx()
3361 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[3]); in i40iw_init_tcp_ctx()
3378 struct i40iw_cm_node *cm_node) in i40iw_cm_init_tsa_conn() argument
3394 iwarp_info->ord_size = cm_node->ord_size; in i40iw_cm_init_tsa_conn()
3395 iwarp_info->ird_size = i40iw_derive_hw_ird_setting(cm_node->ird_size); in i40iw_cm_init_tsa_conn()
3409 ctx_info->user_pri = cm_node->user_pri; in i40iw_cm_init_tsa_conn()
3411 i40iw_init_tcp_ctx(cm_node, &tcp_info, iwqp); in i40iw_cm_init_tsa_conn()
3412 if (cm_node->snd_mark_en) { in i40iw_cm_init_tsa_conn()
3415 SNDMARKER_SEQNMASK) + cm_node->lsmm_size; in i40iw_cm_init_tsa_conn()
3418 cm_node->state = I40IW_CM_STATE_OFFLOADED; in i40iw_cm_init_tsa_conn()
3421 tcp_info.tos = cm_node->tos; in i40iw_cm_init_tsa_conn()
3495 if (iwqp->cm_node) { in i40iw_qp_disconnect()
3497 i40iw_cm_close(iwqp->cm_node); in i40iw_qp_disconnect()
3641 struct i40iw_cm_node *cm_node; in i40iw_accept() local
3661 cm_node = (struct i40iw_cm_node *)cm_id->provider_data; in i40iw_accept()
3664 cm_node->ipv4 = true; in i40iw_accept()
3665 cm_node->vlan_id = i40iw_get_vlan_ipv4(cm_node->loc_addr); in i40iw_accept()
3667 cm_node->ipv4 = false; in i40iw_accept()
3668 i40iw_netdev_vlan_ipv6(cm_node->loc_addr, &cm_node->vlan_id); in i40iw_accept()
3670 i40iw_debug(cm_node->dev, in i40iw_accept()
3673 cm_node->vlan_id); in i40iw_accept()
3674 if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) { in i40iw_accept()
3675 if (cm_node->loopbackpartner) in i40iw_accept()
3676 i40iw_rem_ref_cm_node(cm_node->loopbackpartner); in i40iw_accept()
3677 i40iw_rem_ref_cm_node(cm_node); in i40iw_accept()
3681 passive_state = atomic_add_return(1, &cm_node->passive_state); in i40iw_accept()
3683 i40iw_rem_ref_cm_node(cm_node); in i40iw_accept()
3687 cm_node->cm_core->stats_accepts++; in i40iw_accept()
3688 iwqp->cm_node = (void *)cm_node; in i40iw_accept()
3689 cm_node->iwqp = iwqp; in i40iw_accept()
3697 cm_node->pdata.size = conn_param->private_data_len; in i40iw_accept()
3699 accept.size = i40iw_cm_build_mpa_frame(cm_node, &accept, MPA_KEY_REPLY); in i40iw_accept()
3704 if ((cm_node->ipv4 && in i40iw_accept()
3705 !i40iw_ipv4_is_loopback(cm_node->loc_addr[0], cm_node->rem_addr[0])) || in i40iw_accept()
3706 (!cm_node->ipv4 && in i40iw_accept()
3707 !i40iw_ipv6_is_loopback(cm_node->loc_addr, cm_node->rem_addr))) { in i40iw_accept()
3740 cm_node->cm_id = cm_id; in i40iw_accept()
3745 cm_node->lsmm_size = accept.size + conn_param->private_data_len; in i40iw_accept()
3746 i40iw_cm_init_tsa_conn(iwqp, cm_node); in i40iw_accept()
3751 cm_node->qhash_set = false; in i40iw_accept()
3754 cm_node->accelerated = true; in i40iw_accept()
3756 list_move_tail(&cm_node->list, &cm_core->accelerated_list); in i40iw_accept()
3760 i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_ESTABLISHED, 0); in i40iw_accept()
3764 if (cm_node->loopbackpartner) { in i40iw_accept()
3765 cm_node->loopbackpartner->pdata.size = conn_param->private_data_len; in i40iw_accept()
3768 memcpy(cm_node->loopbackpartner->pdata_buf, in i40iw_accept()
3771 i40iw_create_event(cm_node->loopbackpartner, I40IW_CM_EVENT_CONNECTED); in i40iw_accept()
3774 if (cm_node->accept_pend) { in i40iw_accept()
3775 atomic_dec(&cm_node->listener->pend_accepts_cnt); in i40iw_accept()
3776 cm_node->accept_pend = 0; in i40iw_accept()
3790 struct i40iw_cm_node *cm_node; in i40iw_reject() local
3793 cm_node = (struct i40iw_cm_node *)cm_id->provider_data; in i40iw_reject()
3794 loopback = cm_node->loopbackpartner; in i40iw_reject()
3795 cm_node->cm_id = cm_id; in i40iw_reject()
3796 cm_node->pdata.size = pdata_len; in i40iw_reject()
3801 cm_node->cm_core->stats_rejects++; in i40iw_reject()
3811 return i40iw_cm_reject(cm_node, pdata, pdata_len); in i40iw_reject()
3824 struct i40iw_cm_node *cm_node; in i40iw_connect() local
3880 cm_node = i40iw_create_cm_node(&iwdev->cm_core, iwdev, in i40iw_connect()
3883 if (IS_ERR(cm_node)) { in i40iw_connect()
3884 ret = PTR_ERR(cm_node); in i40iw_connect()
3898 cm_node->qhash_set = true; in i40iw_connect()
3907 cm_node->apbvt_set = true; in i40iw_connect()
3908 iwqp->cm_node = cm_node; in i40iw_connect()
3909 cm_node->iwqp = iwqp; in i40iw_connect()
3913 if (cm_node->state != I40IW_CM_STATE_OFFLOADED) { in i40iw_connect()
3914 cm_node->state = I40IW_CM_STATE_SYN_SENT; in i40iw_connect()
3915 ret = i40iw_send_syn(cm_node, 0); in i40iw_connect()
3920 if (cm_node->loopbackpartner) { in i40iw_connect()
3921 cm_node->loopbackpartner->state = I40IW_CM_STATE_MPAREQ_RCVD; in i40iw_connect()
3922 i40iw_create_event(cm_node->loopbackpartner, in i40iw_connect()
3926 i40iw_debug(cm_node->dev, in i40iw_connect()
3929 cm_node->rem_port, in i40iw_connect()
3930 cm_node, in i40iw_connect()
3931 cm_node->cm_id); in i40iw_connect()
3947 i40iw_rem_ref_cm_node(cm_node); in i40iw_connect()
4083 struct i40iw_cm_node *cm_node; in i40iw_cm_event_connected() local
4091 cm_node = event->cm_node; in i40iw_cm_event_connected()
4092 cm_id = cm_node->cm_id; in i40iw_cm_event_connected()
4102 i40iw_cm_init_tsa_conn(iwqp, cm_node); in i40iw_cm_event_connected()
4103 read0 = (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO); in i40iw_cm_event_connected()
4112 cm_node->qhash_set = false; in i40iw_cm_event_connected()
4115 cm_node->accelerated = true; in i40iw_cm_event_connected()
4117 list_move_tail(&cm_node->list, &cm_core->accelerated_list); in i40iw_cm_event_connected()
4119 status = i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY, in i40iw_cm_event_connected()
4129 i40iw_send_cm_event(event->cm_node, in i40iw_cm_event_connected()
4134 i40iw_rem_ref_cm_node(event->cm_node); in i40iw_cm_event_connected()
4143 struct i40iw_cm_node *cm_node = event->cm_node; in i40iw_cm_event_reset() local
4144 struct iw_cm_id *cm_id = cm_node->cm_id; in i40iw_cm_event_reset()
4154 i40iw_debug(cm_node->dev, in i40iw_cm_event_reset()
4157 event->cm_node, cm_id); in i40iw_cm_event_reset()
4160 i40iw_send_cm_event(cm_node, cm_node->cm_id, IW_CM_EVENT_DISCONNECT, -ECONNRESET); in i40iw_cm_event_reset()
4161 i40iw_send_cm_event(cm_node, cm_node->cm_id, IW_CM_EVENT_CLOSE, 0); in i40iw_cm_event_reset()
4173 struct i40iw_cm_node *cm_node; in i40iw_cm_event_handler() local
4175 if (!event || !event->cm_node || !event->cm_node->cm_core) in i40iw_cm_event_handler()
4178 cm_node = event->cm_node; in i40iw_cm_event_handler()
4182 i40iw_send_cm_event(cm_node, in i40iw_cm_event_handler()
4183 cm_node->cm_id, in i40iw_cm_event_handler()
4191 if (!event->cm_node->cm_id || in i40iw_cm_event_handler()
4192 (event->cm_node->state != I40IW_CM_STATE_OFFLOADED)) in i40iw_cm_event_handler()
4197 if (!event->cm_node->cm_id || in i40iw_cm_event_handler()
4198 (cm_node->state == I40IW_CM_STATE_OFFLOADED)) in i40iw_cm_event_handler()
4200 i40iw_send_cm_event(cm_node, in i40iw_cm_event_handler()
4201 cm_node->cm_id, in i40iw_cm_event_handler()
4206 if (!event->cm_node->cm_id || in i40iw_cm_event_handler()
4207 (event->cm_node->state == I40IW_CM_STATE_OFFLOADED)) in i40iw_cm_event_handler()
4217 i40iw_rem_ref_cm_node(event->cm_node); in i40iw_cm_event_handler()
4227 atomic_inc(&event->cm_node->ref_count); in i40iw_cm_post_event()
4231 queue_work(event->cm_node->cm_core->event_wq, &event->event_work); in i40iw_cm_post_event()
4316 struct i40iw_cm_node *cm_node; in i40iw_cm_teardown_connections() local
4325 cm_node = container_of(list_node, struct i40iw_cm_node, list); in i40iw_cm_teardown_connections()
4327 (nfo->vlan_id == cm_node->vlan_id && in i40iw_cm_teardown_connections()
4328 (!memcmp(cm_node->loc_addr, ipaddr, nfo->ipv4 ? 4 : 16) || in i40iw_cm_teardown_connections()
4329 !memcmp(cm_node->rem_addr, ipaddr, nfo->ipv4 ? 4 : 16)))) { in i40iw_cm_teardown_connections()
4330 atomic_inc(&cm_node->ref_count); in i40iw_cm_teardown_connections()
4331 list_add(&cm_node->teardown_entry, &teardown_list); in i40iw_cm_teardown_connections()
4336 cm_node = container_of(list_node, struct i40iw_cm_node, list); in i40iw_cm_teardown_connections()
4338 (nfo->vlan_id == cm_node->vlan_id && in i40iw_cm_teardown_connections()
4339 (!memcmp(cm_node->loc_addr, ipaddr, nfo->ipv4 ? 4 : 16) || in i40iw_cm_teardown_connections()
4340 !memcmp(cm_node->rem_addr, ipaddr, nfo->ipv4 ? 4 : 16)))) { in i40iw_cm_teardown_connections()
4341 atomic_inc(&cm_node->ref_count); in i40iw_cm_teardown_connections()
4342 list_add(&cm_node->teardown_entry, &teardown_list); in i40iw_cm_teardown_connections()
4348 cm_node = container_of(list_node, struct i40iw_cm_node, in i40iw_cm_teardown_connections()
4351 i40iw_modify_qp(&cm_node->iwqp->ibqp, &attr, IB_QP_STATE, NULL); in i40iw_cm_teardown_connections()
4353 i40iw_cm_disconn(cm_node->iwqp); in i40iw_cm_teardown_connections()
4354 i40iw_rem_ref_cm_node(cm_node); in i40iw_cm_teardown_connections()