Lines Matching refs:cm_node
106 static int send_ack(struct nes_cm_node *cm_node, struct sk_buff *skb);
107 static int send_fin(struct nes_cm_node *cm_node, struct sk_buff *skb);
114 static void free_retrans_entry(struct nes_cm_node *cm_node);
115 static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph, struct sk_buff *skb…
123 static void handle_recv_entry(struct nes_cm_node *cm_node, u32 rem_node);
161 int nes_add_ref_cm_node(struct nes_cm_node *cm_node) in nes_add_ref_cm_node() argument
163 return add_ref_cm_node(cm_node); in nes_add_ref_cm_node()
166 int nes_rem_ref_cm_node(struct nes_cm_node *cm_node) in nes_rem_ref_cm_node() argument
168 return rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_rem_ref_cm_node()
173 static struct nes_cm_event *create_event(struct nes_cm_node * cm_node, in create_event() argument
178 if (!cm_node->cm_id) in create_event()
188 event->cm_node = cm_node; in create_event()
189 event->cm_info.rem_addr = cm_node->rem_addr; in create_event()
190 event->cm_info.loc_addr = cm_node->loc_addr; in create_event()
191 event->cm_info.rem_port = cm_node->rem_port; in create_event()
192 event->cm_info.loc_port = cm_node->loc_port; in create_event()
193 event->cm_info.cm_id = cm_node->cm_id; in create_event()
197 cm_node, event, type, event->cm_info.loc_addr, in create_event()
209 static int send_mpa_request(struct nes_cm_node *cm_node, struct sk_buff *skb) in send_mpa_request() argument
222 cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REQUEST); in send_mpa_request()
223 form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK); in send_mpa_request()
225 return schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0); in send_mpa_request()
230 static int send_mpa_reject(struct nes_cm_node *cm_node) in send_mpa_reject() argument
246 cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REPLY); in send_mpa_reject()
249 form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK | SET_FIN); in send_mpa_reject()
251 cm_node->state = NES_CM_STATE_FIN_WAIT1; in send_mpa_reject()
252 return schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0); in send_mpa_reject()
260 static int parse_mpa(struct nes_cm_node *cm_node, u8 *buffer, u32 *type, in parse_mpa() argument
301 if (mpa_frame->rev > cm_node->mpa_frame_rev) { in parse_mpa()
306 cm_node->mpa_frame_rev = mpa_frame->rev; in parse_mpa()
309 if (cm_node->state != NES_CM_STATE_MPAREQ_SENT) { in parse_mpa()
335 cm_node->mpa_frame_size = priv_data_len; in parse_mpa()
346 cm_node->mpa_frame_size -= IETF_RTR_MSG_SIZE; in parse_mpa()
360 cm_node->mpav2_ird_ord = IETF_NO_IRD_ORD; in parse_mpa()
362 if (cm_node->mpav2_ird_ord != IETF_NO_IRD_ORD) { in parse_mpa()
364 if (cm_node->state != NES_CM_STATE_MPAREQ_SENT) { in parse_mpa()
367 cm_node->ird_size = NES_MAX_IRD; in parse_mpa()
369 cm_node->ird_size = ord_size; in parse_mpa()
372 cm_node->ird_size = 1; in parse_mpa()
379 cm_node->ord_size = NES_MAX_ORD; in parse_mpa()
381 cm_node->ord_size = ird_size; in parse_mpa()
389 cm_node->ird_size = ord_size; in parse_mpa()
392 cm_node->ord_size = NES_MAX_ORD; in parse_mpa()
401 cm_node->ord_size = ird_size; in parse_mpa()
408 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in parse_mpa()
411 cm_node->send_rdma0_op = SEND_RDMA_WRITE_ZERO; in parse_mpa()
423 memcpy(cm_node->mpa_frame_buf, buffer + mpa_hdr_len, cm_node->mpa_frame_size); in parse_mpa()
436 struct nes_cm_node *cm_node, void *options, u32 optionsize, in form_cm_frame() argument
465 if (!(cm_node->netdev->features & NETIF_F_IP_CSUM)) in form_cm_frame()
471 memcpy(ethh->h_dest, cm_node->rem_mac, ETH_ALEN); in form_cm_frame()
472 memcpy(ethh->h_source, cm_node->loc_mac, ETH_ALEN); in form_cm_frame()
479 iph->id = htons(++cm_node->tcp_cntxt.loc_id); in form_cm_frame()
485 iph->saddr = htonl(cm_node->mapped_loc_addr); in form_cm_frame()
486 iph->daddr = htonl(cm_node->mapped_rem_addr); in form_cm_frame()
488 tcph->source = htons(cm_node->mapped_loc_port); in form_cm_frame()
489 tcph->dest = htons(cm_node->mapped_rem_port); in form_cm_frame()
490 tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num); in form_cm_frame()
493 cm_node->tcp_cntxt.loc_ack_num = cm_node->tcp_cntxt.rcv_nxt; in form_cm_frame()
494 tcph->ack_seq = htonl(cm_node->tcp_cntxt.loc_ack_num); in form_cm_frame()
501 cm_node->tcp_cntxt.loc_seq_num++; in form_cm_frame()
504 cm_node->tcp_cntxt.loc_seq_num += datasize; in form_cm_frame()
508 cm_node->tcp_cntxt.loc_seq_num++; in form_cm_frame()
516 tcph->window = htons(cm_node->tcp_cntxt.rcv_wnd); in form_cm_frame()
626 static int nes_get_remote_addr(struct nes_cm_node *cm_node) in nes_get_remote_addr() argument
632 nes_create_sockaddr(htonl(cm_node->mapped_loc_addr), in nes_get_remote_addr()
633 htons(cm_node->mapped_loc_port), &mapped_loc_addr); in nes_get_remote_addr()
634 nes_create_sockaddr(htonl(cm_node->mapped_rem_addr), in nes_get_remote_addr()
635 htons(cm_node->mapped_rem_port), &mapped_rem_addr); in nes_get_remote_addr()
642 record_sockaddr_info(&remote_addr, &cm_node->rem_addr, in nes_get_remote_addr()
643 &cm_node->rem_port); in nes_get_remote_addr()
668 static void record_ird_ord(struct nes_cm_node *cm_node, in record_ird_ord() argument
677 cm_node->ird_size = conn_ird; in record_ird_ord()
678 cm_node->ord_size = conn_ord; in record_ird_ord()
684 static int cm_build_mpa_frame(struct nes_cm_node *cm_node, u8 **start_buff, in cm_build_mpa_frame() argument
689 *start_buff = (pci_mem) ? pci_mem : &cm_node->mpa_frame_buf[0]; in cm_build_mpa_frame()
691 switch (cm_node->mpa_frame_rev) { in cm_build_mpa_frame()
694 *buff_len = sizeof(struct ietf_mpa_v1) + cm_node->mpa_frame_size; in cm_build_mpa_frame()
695 build_mpa_v1(cm_node, *start_buff, mpa_key); in cm_build_mpa_frame()
698 *buff_len = sizeof(struct ietf_mpa_v2) + cm_node->mpa_frame_size; in cm_build_mpa_frame()
699 build_mpa_v2(cm_node, *start_buff, mpa_key); in cm_build_mpa_frame()
710 static void build_mpa_v2(struct nes_cm_node *cm_node, in build_mpa_v2() argument
719 build_mpa_v1(cm_node, start_addr, mpa_key); in build_mpa_v2()
724 if (cm_node->mpav2_ird_ord == IETF_NO_IRD_ORD) { in build_mpa_v2()
728 ctrl_ird = cm_node->ird_size & IETF_NO_IRD_ORD; in build_mpa_v2()
729 ctrl_ord = cm_node->ord_size & IETF_NO_IRD_ORD; in build_mpa_v2()
740 switch (cm_node->send_rdma0_op) { in build_mpa_v2()
756 static void build_mpa_v1(struct nes_cm_node *cm_node, void *start_addr, u8 mpa_key) in build_mpa_v1() argument
769 mpa_frame->rev = cm_node->mpa_frame_rev; in build_mpa_v1()
770 mpa_frame->priv_data_len = htons(cm_node->mpa_frame_size); in build_mpa_v1()
773 static void build_rdma0_msg(struct nes_cm_node *cm_node, struct nes_qp **nesqp_addr) in build_rdma0_msg() argument
786 switch (cm_node->send_rdma0_op) { in build_rdma0_msg()
798 if (cm_node->send_rdma0_op != SEND_RDMA_READ_ZERO) in build_rdma0_msg()
800 cm_node->send_rdma0_op); in build_rdma0_msg()
830 int schedule_nes_timer(struct nes_cm_node *cm_node, struct sk_buff *skb, in schedule_nes_timer() argument
835 struct nes_cm_core *cm_core = cm_node->cm_core; in schedule_nes_timer()
849 new_send->netdev = cm_node->netdev; in schedule_nes_timer()
855 if (cm_node->recv_entry) { in schedule_nes_timer()
860 cm_node->recv_entry = new_send; in schedule_nes_timer()
866 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in schedule_nes_timer()
867 cm_node->send_entry = new_send; in schedule_nes_timer()
868 add_ref_cm_node(cm_node); in schedule_nes_timer()
869 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in schedule_nes_timer()
872 ret = nes_nic_cm_xmit(new_send->skb, cm_node->netdev); in schedule_nes_timer()
881 cleanup_retrans_entry(cm_node); in schedule_nes_timer()
883 rem_ref_cm_node(cm_core, cm_node); in schedule_nes_timer()
895 static void nes_retrans_expired(struct nes_cm_node *cm_node) in nes_retrans_expired() argument
897 struct iw_cm_id *cm_id = cm_node->cm_id; in nes_retrans_expired()
898 enum nes_cm_node_state state = cm_node->state; in nes_retrans_expired()
899 cm_node->state = NES_CM_STATE_CLOSED; in nes_retrans_expired()
904 rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_retrans_expired()
908 if (cm_node->cm_id) in nes_retrans_expired()
910 send_reset(cm_node, NULL); in nes_retrans_expired()
913 add_ref_cm_node(cm_node); in nes_retrans_expired()
914 send_reset(cm_node, NULL); in nes_retrans_expired()
915 create_event(cm_node, NES_CM_EVENT_ABORTED); in nes_retrans_expired()
919 static void handle_recv_entry(struct nes_cm_node *cm_node, u32 rem_node) in handle_recv_entry() argument
921 struct nes_timer_entry *recv_entry = cm_node->recv_entry; in handle_recv_entry()
922 struct iw_cm_id *cm_id = cm_node->cm_id; in handle_recv_entry()
952 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_recv_entry()
954 if (cm_node->cm_id) in handle_recv_entry()
957 cm_node->recv_entry = NULL; in handle_recv_entry()
967 struct nes_cm_node *cm_node; in nes_cm_timer_tick() local
983 cm_node = container_of(list_node, struct nes_cm_node, list); in nes_cm_timer_tick()
984 if ((cm_node->recv_entry) || (cm_node->send_entry)) { in nes_cm_timer_tick()
985 add_ref_cm_node(cm_node); in nes_cm_timer_tick()
986 list_add(&cm_node->timer_entry, &timer_list); in nes_cm_timer_tick()
992 cm_node = container_of(list_node, struct nes_cm_node, in nes_cm_timer_tick()
994 recv_entry = cm_node->recv_entry; in nes_cm_timer_tick()
1004 handle_recv_entry(cm_node, 1); in nes_cm_timer_tick()
1008 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in nes_cm_timer_tick()
1010 send_entry = cm_node->send_entry; in nes_cm_timer_tick()
1014 if (cm_node->state != NES_CM_STATE_TSA) { in nes_cm_timer_tick()
1023 free_retrans_entry(cm_node); in nes_cm_timer_tick()
1028 if ((cm_node->state == NES_CM_STATE_TSA) || in nes_cm_timer_tick()
1029 (cm_node->state == NES_CM_STATE_CLOSED)) { in nes_cm_timer_tick()
1030 free_retrans_entry(cm_node); in nes_cm_timer_tick()
1037 free_retrans_entry(cm_node); in nes_cm_timer_tick()
1040 &cm_node->retrans_list_lock, flags); in nes_cm_timer_tick()
1041 nes_retrans_expired(cm_node); in nes_cm_timer_tick()
1042 cm_node->state = NES_CM_STATE_CLOSED; in nes_cm_timer_tick()
1043 spin_lock_irqsave(&cm_node->retrans_list_lock, in nes_cm_timer_tick()
1053 "0x%08X\n", send_entry, cm_node, jiffies, in nes_cm_timer_tick()
1057 cm_node->tcp_cntxt.rem_ack_num); in nes_cm_timer_tick()
1059 spin_unlock_irqrestore(&cm_node->retrans_list_lock, in nes_cm_timer_tick()
1061 ret = nes_nic_cm_xmit(send_entry->skb, cm_node->netdev); in nes_cm_timer_tick()
1062 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in nes_cm_timer_tick()
1065 "node=%p\n", cm_node); in nes_cm_timer_tick()
1095 cm_node, cm_node->state); in nes_cm_timer_tick()
1096 free_retrans_entry(cm_node); in nes_cm_timer_tick()
1098 rem_ref_cm_node(cm_node->cm_core, in nes_cm_timer_tick()
1099 cm_node); in nes_cm_timer_tick()
1103 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in nes_cm_timer_tick()
1104 rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_cm_timer_tick()
1117 static int send_syn(struct nes_cm_node *cm_node, u32 sendack, in send_syn() argument
1130 if (!cm_node) in send_syn()
1136 options->as_mss.mss = htons(cm_node->tcp_cntxt.mss); in send_syn()
1142 options->as_windowscale.shiftcount = cm_node->tcp_cntxt.rcv_wscale; in send_syn()
1173 form_cm_frame(skb, cm_node, optionsbuffer, optionssize, NULL, 0, flags); in send_syn()
1174 ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0); in send_syn()
1183 static int send_reset(struct nes_cm_node *cm_node, struct sk_buff *skb) in send_reset() argument
1195 form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, flags); in send_reset()
1196 ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 0, 1); in send_reset()
1205 static int send_ack(struct nes_cm_node *cm_node, struct sk_buff *skb) in send_ack() argument
1217 form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, SET_ACK); in send_ack()
1218 ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 0, 0); in send_ack()
1227 static int send_fin(struct nes_cm_node *cm_node, struct sk_buff *skb) in send_fin() argument
1240 form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, SET_ACK | SET_FIN); in send_fin()
1241 ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0); in send_fin()
1255 struct nes_cm_node *cm_node; in find_node() local
1262 list_for_each_entry(cm_node, hte, list) { in find_node()
1265 cm_node->loc_addr, cm_node->loc_port, in find_node()
1267 cm_node->rem_addr, cm_node->rem_port, in find_node()
1269 if ((cm_node->mapped_loc_addr == loc_addr) && in find_node()
1270 (cm_node->mapped_loc_port == loc_port) && in find_node()
1271 (cm_node->mapped_rem_addr == rem_addr) && in find_node()
1272 (cm_node->mapped_rem_port == rem_port)) { in find_node()
1274 add_ref_cm_node(cm_node); in find_node()
1276 return cm_node; in find_node()
1327 static int add_hte_node(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in add_hte_node() argument
1332 if (!cm_node || !cm_core) in add_hte_node()
1336 cm_node); in add_hte_node()
1342 list_add_tail(&cm_node->list, hte); in add_hte_node()
1362 struct nes_cm_node *cm_node = NULL; in mini_cm_dec_refcnt_listen() local
1374 cm_node = container_of(list_pos, struct nes_cm_node, in mini_cm_dec_refcnt_listen()
1376 if ((cm_node->listener == listener) && in mini_cm_dec_refcnt_listen()
1377 (!cm_node->accelerated)) { in mini_cm_dec_refcnt_listen()
1378 add_ref_cm_node(cm_node); in mini_cm_dec_refcnt_listen()
1379 list_add(&cm_node->reset_entry, &reset_list); in mini_cm_dec_refcnt_listen()
1386 cm_node = container_of(list_pos, struct nes_cm_node, in mini_cm_dec_refcnt_listen()
1389 struct nes_cm_node *loopback = cm_node->loopbackpartner; in mini_cm_dec_refcnt_listen()
1391 if (NES_CM_STATE_FIN_WAIT1 <= cm_node->state) { in mini_cm_dec_refcnt_listen()
1392 rem_ref_cm_node(cm_node->cm_core, cm_node); in mini_cm_dec_refcnt_listen()
1395 cleanup_retrans_entry(cm_node); in mini_cm_dec_refcnt_listen()
1396 err = send_reset(cm_node, NULL); in mini_cm_dec_refcnt_listen()
1398 cm_node->state = in mini_cm_dec_refcnt_listen()
1402 old_state = cm_node->state; in mini_cm_dec_refcnt_listen()
1403 cm_node->state = NES_CM_STATE_LISTENER_DESTROYED; in mini_cm_dec_refcnt_listen()
1406 cm_node->cm_core, in mini_cm_dec_refcnt_listen()
1407 cm_node); in mini_cm_dec_refcnt_listen()
1412 event.cm_node = loopback; in mini_cm_dec_refcnt_listen()
1425 cm_node->state = NES_CM_STATE_LISTENER_DESTROYED; in mini_cm_dec_refcnt_listen()
1427 rem_ref_cm_node(cm_node->cm_core, in mini_cm_dec_refcnt_listen()
1428 cm_node); in mini_cm_dec_refcnt_listen()
1495 struct nes_cm_node *cm_node) in mini_cm_accelerated() argument
1497 cm_node->accelerated = 1; in mini_cm_accelerated()
1499 if (cm_node->accept_pend) { in mini_cm_accelerated()
1500 BUG_ON(!cm_node->listener); in mini_cm_accelerated()
1501 atomic_dec(&cm_node->listener->pend_accepts_cnt); in mini_cm_accelerated()
1502 cm_node->accept_pend = 0; in mini_cm_accelerated()
1503 BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0); in mini_cm_accelerated()
1581 struct nes_cm_node *cm_node; in make_cm_node() local
1589 cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC); in make_cm_node()
1590 if (!cm_node) in make_cm_node()
1595 cm_node->loc_addr = listener->loc_addr; in make_cm_node()
1596 cm_node->loc_port = listener->loc_port; in make_cm_node()
1598 cm_node->loc_addr = cm_info->loc_addr; in make_cm_node()
1599 cm_node->loc_port = cm_info->loc_port; in make_cm_node()
1601 cm_node->rem_addr = cm_info->rem_addr; in make_cm_node()
1602 cm_node->rem_port = cm_info->rem_port; in make_cm_node()
1604 cm_node->mapped_loc_addr = cm_info->mapped_loc_addr; in make_cm_node()
1605 cm_node->mapped_rem_addr = cm_info->mapped_rem_addr; in make_cm_node()
1606 cm_node->mapped_loc_port = cm_info->mapped_loc_port; in make_cm_node()
1607 cm_node->mapped_rem_port = cm_info->mapped_rem_port; in make_cm_node()
1609 cm_node->mpa_frame_rev = mpa_version; in make_cm_node()
1610 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in make_cm_node()
1611 cm_node->mpav2_ird_ord = 0; in make_cm_node()
1612 cm_node->ird_size = 0; in make_cm_node()
1613 cm_node->ord_size = 0; in make_cm_node()
1616 &cm_node->loc_addr, cm_node->loc_port, in make_cm_node()
1617 &cm_node->rem_addr, cm_node->rem_port); in make_cm_node()
1618 cm_node->listener = listener; in make_cm_node()
1619 cm_node->netdev = nesvnic->netdev; in make_cm_node()
1620 cm_node->cm_id = cm_info->cm_id; in make_cm_node()
1621 memcpy(cm_node->loc_mac, nesvnic->netdev->dev_addr, ETH_ALEN); in make_cm_node()
1623 nes_debug(NES_DBG_CM, "listener=%p, cm_id=%p\n", cm_node->listener, in make_cm_node()
1624 cm_node->cm_id); in make_cm_node()
1626 spin_lock_init(&cm_node->retrans_list_lock); in make_cm_node()
1628 cm_node->loopbackpartner = NULL; in make_cm_node()
1629 atomic_set(&cm_node->ref_count, 1); in make_cm_node()
1631 cm_node->cm_core = cm_core; in make_cm_node()
1632 cm_node->tcp_cntxt.loc_id = NES_CM_DEF_LOCAL_ID; in make_cm_node()
1633 cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE; in make_cm_node()
1634 cm_node->tcp_cntxt.rcv_wnd = NES_CM_DEFAULT_RCV_WND_SCALED >> in make_cm_node()
1637 cm_node->tcp_cntxt.loc_seq_num = htonl(ts.tv_nsec); in make_cm_node()
1638 cm_node->tcp_cntxt.mss = nesvnic->max_frame_size - sizeof(struct iphdr) - in make_cm_node()
1640 cm_node->tcp_cntxt.rcv_nxt = 0; in make_cm_node()
1643 cm_node->conn_type = cm_info->conn_type; in make_cm_node()
1644 cm_node->apbvt_set = 0; in make_cm_node()
1645 cm_node->accept_pend = 0; in make_cm_node()
1647 cm_node->nesvnic = nesvnic; in make_cm_node()
1652 cm_node->loopbackpartner = NULL; in make_cm_node()
1655 oldarpindex = nes_arp_table(nesdev, cm_node->mapped_rem_addr, in make_cm_node()
1658 cm_node->mapped_rem_addr, oldarpindex); in make_cm_node()
1660 kfree(cm_node); in make_cm_node()
1665 memcpy(cm_node->rem_mac, nesadapter->arp_table[arpindex].mac_addr, ETH_ALEN); in make_cm_node()
1667 cm_node->rem_mac); in make_cm_node()
1669 add_hte_node(cm_core, cm_node); in make_cm_node()
1672 return cm_node; in make_cm_node()
1679 static int add_ref_cm_node(struct nes_cm_node *cm_node) in add_ref_cm_node() argument
1681 atomic_inc(&cm_node->ref_count); in add_ref_cm_node()
1690 struct nes_cm_node *cm_node) in rem_ref_cm_node() argument
1695 if (!cm_node) in rem_ref_cm_node()
1698 spin_lock_irqsave(&cm_node->cm_core->ht_lock, flags); in rem_ref_cm_node()
1699 if (atomic_dec_return(&cm_node->ref_count)) { in rem_ref_cm_node()
1700 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in rem_ref_cm_node()
1703 list_del(&cm_node->list); in rem_ref_cm_node()
1705 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in rem_ref_cm_node()
1708 if (!cm_node->accelerated && cm_node->accept_pend) { in rem_ref_cm_node()
1709 BUG_ON(!cm_node->listener); in rem_ref_cm_node()
1710 atomic_dec(&cm_node->listener->pend_accepts_cnt); in rem_ref_cm_node()
1711 BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0); in rem_ref_cm_node()
1713 WARN_ON(cm_node->send_entry); in rem_ref_cm_node()
1714 if (cm_node->recv_entry) in rem_ref_cm_node()
1715 handle_recv_entry(cm_node, 0); in rem_ref_cm_node()
1716 if (cm_node->listener) { in rem_ref_cm_node()
1717 mini_cm_dec_refcnt_listen(cm_core, cm_node->listener, 0); in rem_ref_cm_node()
1719 if (cm_node->apbvt_set && cm_node->nesvnic) { in rem_ref_cm_node()
1720 nes_manage_apbvt(cm_node->nesvnic, cm_node->mapped_loc_port, in rem_ref_cm_node()
1721 PCI_FUNC(cm_node->nesvnic->nesdev->pcidev->devfn), in rem_ref_cm_node()
1725 cm_node->mapped_loc_port); in rem_ref_cm_node()
1726 nes_remove_mapinfo(cm_node->loc_addr, cm_node->loc_port, in rem_ref_cm_node()
1727 cm_node->mapped_loc_addr, cm_node->mapped_loc_port); in rem_ref_cm_node()
1732 nesqp = cm_node->nesqp; in rem_ref_cm_node()
1734 nesqp->cm_node = NULL; in rem_ref_cm_node()
1736 cm_node->nesqp = NULL; in rem_ref_cm_node()
1739 kfree(cm_node); in rem_ref_cm_node()
1746 static int process_options(struct nes_cm_node *cm_node, u8 *optionsloc, in process_options() argument
1773 cm_node->tcp_cntxt.mss) in process_options()
1774 cm_node->tcp_cntxt.mss = tmp; in process_options()
1778 cm_node->tcp_cntxt.snd_wscale = in process_options()
1789 cm_node->tcp_cntxt.mss = NES_CM_DEFAULT_MSS; in process_options()
1799 static void handle_fin_pkt(struct nes_cm_node *cm_node) in handle_fin_pkt() argument
1802 "refcnt=%d\n", cm_node, cm_node->state, in handle_fin_pkt()
1803 atomic_read(&cm_node->ref_count)); in handle_fin_pkt()
1804 switch (cm_node->state) { in handle_fin_pkt()
1809 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1810 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1811 cm_node->state = NES_CM_STATE_LAST_ACK; in handle_fin_pkt()
1812 send_fin(cm_node, NULL); in handle_fin_pkt()
1815 create_event(cm_node, NES_CM_EVENT_ABORTED); in handle_fin_pkt()
1816 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1817 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1818 cm_node->state = NES_CM_STATE_CLOSED; in handle_fin_pkt()
1819 add_ref_cm_node(cm_node); in handle_fin_pkt()
1820 send_reset(cm_node, NULL); in handle_fin_pkt()
1823 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1824 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1825 cm_node->state = NES_CM_STATE_CLOSING; in handle_fin_pkt()
1826 send_ack(cm_node, NULL); in handle_fin_pkt()
1832 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1833 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1834 cm_node->state = NES_CM_STATE_TIME_WAIT; in handle_fin_pkt()
1835 send_ack(cm_node, NULL); in handle_fin_pkt()
1836 schedule_nes_timer(cm_node, NULL, NES_TIMER_TYPE_CLOSE, 1, 0); in handle_fin_pkt()
1839 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1840 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1841 cm_node->state = NES_CM_STATE_CLOSED; in handle_fin_pkt()
1842 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_fin_pkt()
1847 cm_node, cm_node->state); in handle_fin_pkt()
1853 static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_rst_pkt() argument
1860 " refcnt=%d\n", cm_node, cm_node->state, in handle_rst_pkt()
1861 atomic_read(&cm_node->ref_count)); in handle_rst_pkt()
1862 cleanup_retrans_entry(cm_node); in handle_rst_pkt()
1863 switch (cm_node->state) { in handle_rst_pkt()
1867 "listener=%p state=%d\n", __func__, __LINE__, cm_node, in handle_rst_pkt()
1868 cm_node->listener, cm_node->state); in handle_rst_pkt()
1869 switch (cm_node->mpa_frame_rev) { in handle_rst_pkt()
1871 cm_node->mpa_frame_rev = IETF_MPA_V1; in handle_rst_pkt()
1873 cm_node->state = NES_CM_STATE_SYN_SENT; in handle_rst_pkt()
1874 if (send_syn(cm_node, 0, NULL)) { in handle_rst_pkt()
1875 active_open_err(cm_node, skb, reset); in handle_rst_pkt()
1880 active_open_err(cm_node, skb, reset); in handle_rst_pkt()
1885 atomic_inc(&cm_node->passive_state); in handle_rst_pkt()
1892 passive_open_err(cm_node, skb, reset); in handle_rst_pkt()
1895 active_open_err(cm_node, skb, reset); in handle_rst_pkt()
1903 cm_node->cm_id->rem_ref(cm_node->cm_id); in handle_rst_pkt()
1905 cm_node->state = NES_CM_STATE_CLOSED; in handle_rst_pkt()
1906 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_rst_pkt()
1916 static void handle_rcv_mpa(struct nes_cm_node *cm_node, struct sk_buff *skb) in handle_rcv_mpa() argument
1925 ret = parse_mpa(cm_node, dataloc, &res_type, datasize); in handle_rcv_mpa()
1928 if (cm_node->state == NES_CM_STATE_MPAREQ_SENT) { in handle_rcv_mpa()
1931 __LINE__, cm_node, cm_node->listener, in handle_rcv_mpa()
1932 cm_node->state); in handle_rcv_mpa()
1933 active_open_err(cm_node, skb, 1); in handle_rcv_mpa()
1935 passive_open_err(cm_node, skb, 1); in handle_rcv_mpa()
1940 switch (cm_node->state) { in handle_rcv_mpa()
1947 cm_node->state = NES_CM_STATE_MPAREQ_RCVD; in handle_rcv_mpa()
1949 atomic_set(&cm_node->passive_state, in handle_rcv_mpa()
1953 cleanup_retrans_entry(cm_node); in handle_rcv_mpa()
1956 cm_node->state = NES_CM_STATE_MPAREJ_RCVD; in handle_rcv_mpa()
1959 cm_node->state = NES_CM_STATE_TSA; in handle_rcv_mpa()
1968 create_event(cm_node, type); in handle_rcv_mpa()
1971 static void indicate_pkt_err(struct nes_cm_node *cm_node, struct sk_buff *skb) in indicate_pkt_err() argument
1973 switch (cm_node->state) { in indicate_pkt_err()
1977 "listener=%p state=%d\n", __func__, __LINE__, cm_node, in indicate_pkt_err()
1978 cm_node->listener, cm_node->state); in indicate_pkt_err()
1979 active_open_err(cm_node, skb, 1); in indicate_pkt_err()
1983 passive_open_err(cm_node, skb, 1); in indicate_pkt_err()
1991 static int check_syn(struct nes_cm_node *cm_node, struct tcphdr *tcph, in check_syn() argument
1996 err = ((ntohl(tcph->ack_seq) == cm_node->tcp_cntxt.loc_seq_num)) ? 0 : 1; in check_syn()
1998 active_open_err(cm_node, skb, 1); in check_syn()
2003 static int check_seq(struct nes_cm_node *cm_node, struct tcphdr *tcph, in check_seq() argument
2009 u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num; in check_seq()
2010 u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt; in check_seq()
2015 rcv_wnd = cm_node->tcp_cntxt.rcv_wnd; in check_seq()
2022 "listener=%p state=%d\n", __func__, __LINE__, cm_node, in check_seq()
2023 cm_node->listener, cm_node->state); in check_seq()
2024 indicate_pkt_err(cm_node, skb); in check_seq()
2026 "rcv_nxt=0x%08X rcv_wnd=0x%x\n", cm_node, seq, rcv_nxt, in check_seq()
2037 static void handle_syn_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_syn_pkt() argument
2048 switch (cm_node->state) { in handle_syn_pkt()
2052 active_open_err(cm_node, skb, 1); in handle_syn_pkt()
2056 if (atomic_read(&cm_node->listener->pend_accepts_cnt) > in handle_syn_pkt()
2057 cm_node->listener->backlog) { in handle_syn_pkt()
2061 passive_open_err(cm_node, skb, 0); in handle_syn_pkt()
2064 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, in handle_syn_pkt()
2067 passive_open_err(cm_node, skb, 0); in handle_syn_pkt()
2071 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in handle_syn_pkt()
2072 BUG_ON(cm_node->send_entry); in handle_syn_pkt()
2073 cm_node->accept_pend = 1; in handle_syn_pkt()
2074 atomic_inc(&cm_node->listener->pend_accepts_cnt); in handle_syn_pkt()
2076 cm_node->state = NES_CM_STATE_SYN_RCVD; in handle_syn_pkt()
2077 send_syn(cm_node, 1, skb); in handle_syn_pkt()
2080 cleanup_retrans_entry(cm_node); in handle_syn_pkt()
2081 add_ref_cm_node(cm_node); in handle_syn_pkt()
2082 send_reset(cm_node, skb); in handle_syn_pkt()
2098 static void handle_synack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_synack_pkt() argument
2108 switch (cm_node->state) { in handle_synack_pkt()
2110 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
2112 if (check_syn(cm_node, tcph, skb)) in handle_synack_pkt()
2114 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in handle_synack_pkt()
2116 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 0); in handle_synack_pkt()
2119 cm_node); in handle_synack_pkt()
2122 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
2123 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in handle_synack_pkt()
2124 send_mpa_request(cm_node, skb); in handle_synack_pkt()
2125 cm_node->state = NES_CM_STATE_MPAREQ_SENT; in handle_synack_pkt()
2129 passive_open_err(cm_node, skb, 1); in handle_synack_pkt()
2132 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in handle_synack_pkt()
2133 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
2134 cm_node->state = NES_CM_STATE_CLOSED; in handle_synack_pkt()
2135 send_reset(cm_node, skb); in handle_synack_pkt()
2138 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in handle_synack_pkt()
2139 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
2140 add_ref_cm_node(cm_node); in handle_synack_pkt()
2141 send_reset(cm_node, skb); in handle_synack_pkt()
2157 static int handle_ack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_ack_pkt() argument
2167 if (check_seq(cm_node, tcph, skb)) in handle_ack_pkt()
2173 switch (cm_node->state) { in handle_ack_pkt()
2176 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2177 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 1); in handle_ack_pkt()
2180 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in handle_ack_pkt()
2181 cm_node->state = NES_CM_STATE_ESTABLISHED; in handle_ack_pkt()
2183 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in handle_ack_pkt()
2184 nes_get_remote_addr(cm_node); in handle_ack_pkt()
2185 handle_rcv_mpa(cm_node, skb); in handle_ack_pkt()
2192 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2194 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in handle_ack_pkt()
2195 handle_rcv_mpa(cm_node, skb); in handle_ack_pkt()
2201 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in handle_ack_pkt()
2203 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in handle_ack_pkt()
2204 handle_rcv_mpa(cm_node, skb); in handle_ack_pkt()
2210 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2211 cm_node->state = NES_CM_STATE_CLOSED; in handle_ack_pkt()
2212 send_reset(cm_node, skb); in handle_ack_pkt()
2215 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2216 add_ref_cm_node(cm_node); in handle_ack_pkt()
2217 send_reset(cm_node, skb); in handle_ack_pkt()
2221 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2222 cm_node->state = NES_CM_STATE_CLOSED; in handle_ack_pkt()
2223 cm_node->cm_id->rem_ref(cm_node->cm_id); in handle_ack_pkt()
2224 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_ack_pkt()
2228 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2230 cm_node->state = NES_CM_STATE_FIN_WAIT2; in handle_ack_pkt()
2238 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2247 static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph, in handle_tcp_options() argument
2253 if (process_options(cm_node, optionsloc, optionsize, in handle_tcp_options()
2256 __func__, cm_node); in handle_tcp_options()
2258 passive_open_err(cm_node, skb, 1); in handle_tcp_options()
2260 active_open_err(cm_node, skb, 1); in handle_tcp_options()
2265 cm_node->tcp_cntxt.snd_wnd = ntohs(tcph->window) << in handle_tcp_options()
2266 cm_node->tcp_cntxt.snd_wscale; in handle_tcp_options()
2268 if (cm_node->tcp_cntxt.snd_wnd > cm_node->tcp_cntxt.max_snd_wnd) in handle_tcp_options()
2269 cm_node->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.snd_wnd; in handle_tcp_options()
2277 static void active_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb, in active_open_err() argument
2280 cleanup_retrans_entry(cm_node); in active_open_err()
2283 "state=%d\n", cm_node, cm_node->state); in active_open_err()
2284 add_ref_cm_node(cm_node); in active_open_err()
2285 send_reset(cm_node, skb); in active_open_err()
2290 cm_node->state = NES_CM_STATE_CLOSED; in active_open_err()
2291 create_event(cm_node, NES_CM_EVENT_ABORTED); in active_open_err()
2298 static void passive_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb, in passive_open_err() argument
2301 cleanup_retrans_entry(cm_node); in passive_open_err()
2302 cm_node->state = NES_CM_STATE_CLOSED; in passive_open_err()
2305 "cm_node=%p state =%d\n", cm_node, cm_node->state); in passive_open_err()
2306 send_reset(cm_node, skb); in passive_open_err()
2309 rem_ref_cm_node(cm_node->cm_core, cm_node); in passive_open_err()
2317 static void free_retrans_entry(struct nes_cm_node *cm_node) in free_retrans_entry() argument
2321 send_entry = cm_node->send_entry; in free_retrans_entry()
2323 cm_node->send_entry = NULL; in free_retrans_entry()
2326 rem_ref_cm_node(cm_node->cm_core, cm_node); in free_retrans_entry()
2330 static void cleanup_retrans_entry(struct nes_cm_node *cm_node) in cleanup_retrans_entry() argument
2334 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in cleanup_retrans_entry()
2335 free_retrans_entry(cm_node); in cleanup_retrans_entry()
2336 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in cleanup_retrans_entry()
2343 static void process_packet(struct nes_cm_node *cm_node, struct sk_buff *skb, in process_packet() argument
2354 "ack=%d rst=%d fin=%d\n", cm_node, cm_node->state, tcph->syn, in process_packet()
2371 handle_syn_pkt(cm_node, skb, tcph); in process_packet()
2374 handle_synack_pkt(cm_node, skb, tcph); in process_packet()
2377 ret = handle_ack_pkt(cm_node, skb, tcph); in process_packet()
2379 handle_fin_pkt(cm_node); in process_packet()
2382 handle_rst_pkt(cm_node, skb, tcph); in process_packet()
2385 if ((fin_set) && (!check_seq(cm_node, tcph, skb))) in process_packet()
2386 handle_fin_pkt(cm_node); in process_packet()
2490 struct nes_cm_node *cm_node; in mini_cm_connect() local
2497 cm_node = make_cm_node(cm_core, nesvnic, cm_info, NULL); in mini_cm_connect()
2498 if (!cm_node) in mini_cm_connect()
2502 cm_node->tcp_cntxt.client = 1; in mini_cm_connect()
2503 cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE; in mini_cm_connect()
2507 cm_node->mapped_loc_addr, cm_node->mapped_rem_port, in mini_cm_connect()
2510 create_event(cm_node, NES_CM_EVENT_ABORTED); in mini_cm_connect()
2523 rem_ref_cm_node(cm_node->cm_core, cm_node); in mini_cm_connect()
2527 loopbackremotenode->loopbackpartner = cm_node; in mini_cm_connect()
2530 cm_node->loopbackpartner = loopbackremotenode; in mini_cm_connect()
2537 cm_node->state = NES_CM_STATE_TSA; in mini_cm_connect()
2538 cm_node->tcp_cntxt.rcv_nxt = in mini_cm_connect()
2541 cm_node->tcp_cntxt.loc_seq_num; in mini_cm_connect()
2542 cm_node->tcp_cntxt.max_snd_wnd = in mini_cm_connect()
2545 cm_node->tcp_cntxt.rcv_wnd; in mini_cm_connect()
2546 cm_node->tcp_cntxt.snd_wnd = in mini_cm_connect()
2549 cm_node->tcp_cntxt.rcv_wnd; in mini_cm_connect()
2550 cm_node->tcp_cntxt.snd_wscale = in mini_cm_connect()
2553 cm_node->tcp_cntxt.rcv_wscale; in mini_cm_connect()
2557 return cm_node; in mini_cm_connect()
2560 start_buff = &cm_node->mpa_frame_buf[0] + sizeof(struct ietf_mpa_v2); in mini_cm_connect()
2561 cm_node->mpa_frame_size = private_data_len; in mini_cm_connect()
2566 cm_node->state = NES_CM_STATE_SYN_SENT; in mini_cm_connect()
2567 ret = send_syn(cm_node, 0, NULL); in mini_cm_connect()
2573 cm_node->rem_addr, cm_node->rem_port, cm_node, in mini_cm_connect()
2574 cm_node->cm_id); in mini_cm_connect()
2575 rem_ref_cm_node(cm_node->cm_core, cm_node); in mini_cm_connect()
2576 cm_node = NULL; in mini_cm_connect()
2579 if (cm_node) { in mini_cm_connect()
2582 cm_node->rem_addr, cm_node->rem_port, cm_node, in mini_cm_connect()
2583 cm_node->cm_id); in mini_cm_connect()
2586 return cm_node; in mini_cm_connect()
2594 static int mini_cm_accept(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in mini_cm_accept() argument
2603 static int mini_cm_reject(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in mini_cm_reject() argument
2609 struct iw_cm_id *cm_id = cm_node->cm_id; in mini_cm_reject()
2610 struct nes_cm_node *loopback = cm_node->loopbackpartner; in mini_cm_reject()
2613 __func__, cm_node, cm_node->tcp_cntxt.client, cm_node->state); in mini_cm_reject()
2615 if (cm_node->tcp_cntxt.client) in mini_cm_reject()
2617 cleanup_retrans_entry(cm_node); in mini_cm_reject()
2620 passive_state = atomic_add_return(1, &cm_node->passive_state); in mini_cm_reject()
2622 cm_node->state = NES_CM_STATE_CLOSED; in mini_cm_reject()
2623 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2625 if (cm_node->state == NES_CM_STATE_LISTENER_DESTROYED) { in mini_cm_reject()
2626 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2628 ret = send_mpa_reject(cm_node); in mini_cm_reject()
2630 cm_node->state = NES_CM_STATE_CLOSED; in mini_cm_reject()
2631 err = send_reset(cm_node, NULL); in mini_cm_reject()
2640 cm_node->cm_id = NULL; in mini_cm_reject()
2641 if (cm_node->state == NES_CM_STATE_LISTENER_DESTROYED) { in mini_cm_reject()
2642 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2645 event.cm_node = loopback; in mini_cm_reject()
2652 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2668 static int mini_cm_close(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in mini_cm_close() argument
2672 if (!cm_core || !cm_node) in mini_cm_close()
2675 switch (cm_node->state) { in mini_cm_close()
2683 cleanup_retrans_entry(cm_node); in mini_cm_close()
2684 send_reset(cm_node, NULL); in mini_cm_close()
2687 cm_node->state = NES_CM_STATE_LAST_ACK; in mini_cm_close()
2688 send_fin(cm_node, NULL); in mini_cm_close()
2698 cleanup_retrans_entry(cm_node); in mini_cm_close()
2699 send_reset(cm_node, NULL); in mini_cm_close()
2706 ret = rem_ref_cm_node(cm_core, cm_node); in mini_cm_close()
2709 if (cm_node->send_entry) in mini_cm_close()
2711 "send_entry=%p\n", cm_node->send_entry); in mini_cm_close()
2712 ret = rem_ref_cm_node(cm_core, cm_node); in mini_cm_close()
2726 struct nes_cm_node *cm_node = NULL; in mini_cm_recv_pkt() local
2760 cm_node = find_node(cm_core, in mini_cm_recv_pkt()
2764 if (!cm_node) { in mini_cm_recv_pkt()
2783 cm_node = make_cm_node(cm_core, nesvnic, &nfo, in mini_cm_recv_pkt()
2785 if (!cm_node) { in mini_cm_recv_pkt()
2794 cm_node->state = NES_CM_STATE_LISTENING; in mini_cm_recv_pkt()
2797 rem_ref_cm_node(cm_core, cm_node); in mini_cm_recv_pkt()
2801 add_ref_cm_node(cm_node); in mini_cm_recv_pkt()
2802 } else if (cm_node->state == NES_CM_STATE_TSA) { in mini_cm_recv_pkt()
2803 if (cm_node->nesqp->pau_mode) in mini_cm_recv_pkt()
2804 nes_queue_mgt_skbs(skb, nesvnic, cm_node->nesqp); in mini_cm_recv_pkt()
2806 rem_ref_cm_node(cm_core, cm_node); in mini_cm_recv_pkt()
2815 process_packet(cm_node, skb, cm_core); in mini_cm_recv_pkt()
2816 rem_ref_cm_node(cm_core, cm_node); in mini_cm_recv_pkt()
2925 static int nes_cm_init_tsa_conn(struct nes_qp *nesqp, struct nes_cm_node *cm_node) in nes_cm_init_tsa_conn() argument
2936 if (cm_node->tcp_cntxt.snd_wscale || cm_node->tcp_cntxt.rcv_wscale) in nes_cm_init_tsa_conn()
2941 nesqp->nesqp_context->mss |= cpu_to_le32(((u32)cm_node->tcp_cntxt.mss) << 16); in nes_cm_init_tsa_conn()
2947 (cm_node->tcp_cntxt.snd_wscale << NES_QPCONTEXT_PDWSCALE_SND_WSCALE_SHIFT) & in nes_cm_init_tsa_conn()
2951 (cm_node->tcp_cntxt.rcv_wscale << NES_QPCONTEXT_PDWSCALE_RCV_WSCALE_SHIFT) & in nes_cm_init_tsa_conn()
2957 nesqp->nesqp_context->snd_nxt = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2958 nesqp->nesqp_context->snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.snd_wnd); in nes_cm_init_tsa_conn()
2959 nesqp->nesqp_context->rcv_nxt = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in nes_cm_init_tsa_conn()
2960 nesqp->nesqp_context->rcv_wnd = cpu_to_le32(cm_node->tcp_cntxt.rcv_wnd << in nes_cm_init_tsa_conn()
2961 cm_node->tcp_cntxt.rcv_wscale); in nes_cm_init_tsa_conn()
2962 nesqp->nesqp_context->snd_max = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2963 nesqp->nesqp_context->snd_una = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2967 nesqp->nesqp_context->cwnd = cpu_to_le32(2 * cm_node->tcp_cntxt.mss); in nes_cm_init_tsa_conn()
2968 nesqp->nesqp_context->snd_wl1 = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in nes_cm_init_tsa_conn()
2969 nesqp->nesqp_context->snd_wl2 = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2970 nesqp->nesqp_context->max_snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.max_snd_wnd); in nes_cm_init_tsa_conn()
2976 cm_node->tcp_cntxt.mss, le32_to_cpu(nesqp->nesqp_context->pd_index_wscale), in nes_cm_init_tsa_conn()
2984 cm_node->state = NES_CM_STATE_TSA; in nes_cm_init_tsa_conn()
3198 if (nesqp->cm_node) { in nes_disconnect()
3201 g_cm_core->api->close(g_cm_core, nesqp->cm_node); in nes_disconnect()
3218 struct nes_cm_node *cm_node; in nes_accept() local
3251 cm_node = (struct nes_cm_node *)cm_id->provider_data; in nes_accept()
3253 "%s\n", cm_node, nesvnic, nesvnic->netdev, in nes_accept()
3256 if (NES_CM_STATE_LISTENER_DESTROYED == cm_node->state) { in nes_accept()
3257 if (cm_node->loopbackpartner) in nes_accept()
3258 rem_ref_cm_node(cm_node->cm_core, cm_node->loopbackpartner); in nes_accept()
3259 rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_accept()
3263 passive_state = atomic_add_return(1, &cm_node->passive_state); in nes_accept()
3265 rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_accept()
3269 nesqp->cm_node = (void *)cm_node; in nes_accept()
3270 cm_node->nesqp = nesqp; in nes_accept()
3274 nesqp->hwqp.qp_id, cm_node, jiffies, cm_node->listener); in nes_accept()
3292 if (cm_node->mpa_frame_rev == IETF_MPA_V1) in nes_accept()
3295 if (cm_node->mpa_frame_rev == IETF_MPA_V1 || in nes_accept()
3296 cm_node->mpav2_ird_ord == IETF_NO_IRD_ORD) { in nes_accept()
3297 record_ird_ord(cm_node, (u16)conn_param->ird, (u16)conn_param->ord); in nes_accept()
3303 cm_build_mpa_frame(cm_node, start_buff, &buff_len, nesqp->ietf_frame, MPA_KEY_REPLY); in nes_accept()
3323 cm_node); in nes_accept()
3365 cm_node->cm_id = cm_id; in nes_accept()
3371 if (cm_node->state == NES_CM_STATE_TSA) in nes_accept()
3373 cm_node); in nes_accept()
3375 nes_cm_init_tsa_conn(nesqp, cm_node); in nes_accept()
3378 cpu_to_le16(cm_node->mapped_loc_port); in nes_accept()
3380 cpu_to_le16(cm_node->mapped_rem_port); in nes_accept()
3382 nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->mapped_rem_addr); in nes_accept()
3401 cpu_to_le32((u32)cm_node->ord_size); in nes_accept()
3406 nes_quad.SrcIpadr = htonl(cm_node->mapped_rem_addr); in nes_accept()
3407 nes_quad.TcpPorts[0] = htons(cm_node->mapped_rem_port); in nes_accept()
3408 nes_quad.TcpPorts[1] = htons(cm_node->mapped_loc_port); in nes_accept()
3419 cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node); in nes_accept()
3441 cm_event.ird = cm_node->ird_size; in nes_accept()
3442 cm_event.ord = cm_node->ord_size; in nes_accept()
3447 if (cm_node->loopbackpartner) { in nes_accept()
3448 cm_node->loopbackpartner->mpa_frame_size = in nes_accept()
3451 memcpy(cm_node->loopbackpartner->mpa_frame_buf, in nes_accept()
3453 create_event(cm_node->loopbackpartner, NES_CM_EVENT_CONNECTED); in nes_accept()
3468 struct nes_cm_node *cm_node; in nes_reject() local
3474 cm_node = (struct nes_cm_node *)cm_id->provider_data; in nes_reject()
3475 loopback = cm_node->loopbackpartner; in nes_reject()
3476 cm_core = cm_node->cm_core; in nes_reject()
3477 cm_node->cm_id = cm_id; in nes_reject()
3487 start_buff = &cm_node->mpa_frame_buf[0] + sizeof(struct ietf_mpa_v2); in nes_reject()
3488 cm_node->mpa_frame_size = pdata_len; in nes_reject()
3491 return cm_core->api->reject(cm_core, cm_node); in nes_reject()
3505 struct nes_cm_node *cm_node; in nes_connect() local
3592 cm_node = g_cm_core->api->connect(g_cm_core, nesvnic, in nes_connect()
3595 if (!cm_node) { in nes_connect()
3609 record_ird_ord(cm_node, (u16)conn_param->ird, (u16)conn_param->ord); in nes_connect()
3610 if (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO && in nes_connect()
3611 cm_node->ord_size == 0) in nes_connect()
3612 cm_node->ord_size = 1; in nes_connect()
3614 cm_node->apbvt_set = apbvt_set; in nes_connect()
3615 nesqp->cm_node = cm_node; in nes_connect()
3616 cm_node->nesqp = nesqp; in nes_connect()
3629 struct nes_cm_listener *cm_node; in nes_create_listen() local
3661 cm_node = g_cm_core->api->listen(g_cm_core, nesvnic, &cm_info); in nes_create_listen()
3662 if (!cm_node) { in nes_create_listen()
3668 cm_id->provider_data = cm_node; in nes_create_listen()
3670 if (!cm_node->reused_node) { in nes_create_listen()
3674 err = nes_manage_apbvt(nesvnic, cm_node->mapped_loc_port, in nes_create_listen()
3680 g_cm_core->api->stop_listener(g_cm_core, (void *)cm_node); in nes_create_listen()
3687 cm_id->provider_data = (void *)cm_node; in nes_create_listen()
3764 struct nes_cm_node *cm_node; in cm_event_connected() local
3777 cm_node = event->cm_node; in cm_event_connected()
3778 cm_id = cm_node->cm_id; in cm_event_connected()
3779 nes_debug(NES_DBG_CM, "cm_event_connected - %p - cm_id = %p\n", cm_node, cm_id); in cm_event_connected()
3796 nes_cm_init_tsa_conn(nesqp, cm_node); in cm_event_connected()
3800 cpu_to_le16(cm_node->mapped_loc_port); in cm_event_connected()
3802 cpu_to_le16(cm_node->mapped_rem_port); in cm_event_connected()
3803 nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->mapped_rem_addr); in cm_event_connected()
3819 cpu_to_le32((u32)cm_node->ord_size); in cm_event_connected()
3824 build_rdma0_msg(cm_node, &nesqp); in cm_event_connected()
3833 nes_quad.SrcIpadr = htonl(cm_node->mapped_rem_addr); in cm_event_connected()
3834 nes_quad.TcpPorts[0] = htons(cm_node->mapped_rem_port); in cm_event_connected()
3835 nes_quad.TcpPorts[1] = htons(cm_node->mapped_loc_port); in cm_event_connected()
3846 nesqp->ietf_frame = &cm_node->mpa_frame; in cm_event_connected()
3847 nesqp->private_data_len = (u8)cm_node->mpa_frame_size; in cm_event_connected()
3848 cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node); in cm_event_connected()
3858 cm_event.private_data = (void *)event->cm_node->mpa_frame_buf; in cm_event_connected()
3859 cm_event.private_data_len = (u8)event->cm_node->mpa_frame_size; in cm_event_connected()
3860 cm_event.ird = cm_node->ird_size; in cm_event_connected()
3861 cm_event.ord = cm_node->ord_size; in cm_event_connected()
3891 if (!event->cm_node) in cm_event_connect_error()
3894 cm_id = event->cm_node->cm_id; in cm_event_connect_error()
3898 nes_debug(NES_DBG_CM, "cm_node=%p, cm_id=%p\n", event->cm_node, cm_id); in cm_event_connect_error()
3934 rem_ref_cm_node(event->cm_node->cm_core, event->cm_node); in cm_event_connect_error()
3950 if (!event->cm_node) in cm_event_reset()
3953 if (!event->cm_node->cm_id) in cm_event_reset()
3956 cm_id = event->cm_node->cm_id; in cm_event_reset()
3958 nes_debug(NES_DBG_CM, "%p - cm_id = %p\n", event->cm_node, cm_id); in cm_event_reset()
3983 nes_debug(NES_DBG_CM, "NODE %p Generating CLOSE\n", event->cm_node); in cm_event_reset()
4004 struct nes_cm_node *cm_node; in cm_event_mpa_req() local
4010 cm_node = event->cm_node; in cm_event_mpa_req()
4011 if (!cm_node) in cm_event_mpa_req()
4013 cm_id = cm_node->cm_id; in cm_event_mpa_req()
4017 cm_node, cm_id, jiffies); in cm_event_mpa_req()
4021 cm_event.provider_data = (void *)cm_node; in cm_event_mpa_req()
4030 cm_event.private_data = cm_node->mpa_frame_buf; in cm_event_mpa_req()
4031 cm_event.private_data_len = (u8)cm_node->mpa_frame_size; in cm_event_mpa_req()
4032 if (cm_node->mpa_frame_rev == IETF_MPA_V1) { in cm_event_mpa_req()
4036 cm_event.ird = cm_node->ird_size; in cm_event_mpa_req()
4037 cm_event.ord = cm_node->ord_size; in cm_event_mpa_req()
4052 struct nes_cm_node *cm_node; in cm_event_mpa_reject() local
4059 cm_node = event->cm_node; in cm_event_mpa_reject()
4060 if (!cm_node) in cm_event_mpa_reject()
4062 cm_id = cm_node->cm_id; in cm_event_mpa_reject()
4066 cm_node, cm_id, jiffies); in cm_event_mpa_reject()
4080 cm_event.private_data = cm_node->mpa_frame_buf; in cm_event_mpa_reject()
4081 cm_event.private_data_len = (u8)cm_node->mpa_frame_size; in cm_event_mpa_reject()
4105 atomic_inc(&event->cm_node->cm_core->events_posted); in nes_cm_post_event()
4106 add_ref_cm_node(event->cm_node); in nes_cm_post_event()
4110 event->cm_node, event); in nes_cm_post_event()
4112 queue_work(event->cm_node->cm_core->event_wq, &event->event_work); in nes_cm_post_event()
4130 if ((!event) || (!event->cm_node) || (!event->cm_node->cm_core)) in nes_cm_event_handler()
4133 cm_core = event->cm_node->cm_core; in nes_cm_event_handler()
4141 event->cm_node); in nes_cm_event_handler()
4145 event->cm_node); in nes_cm_event_handler()
4149 if ((!event->cm_node->cm_id) || in nes_cm_event_handler()
4150 (event->cm_node->state != NES_CM_STATE_TSA)) in nes_cm_event_handler()
4156 if ((!event->cm_node->cm_id) || in nes_cm_event_handler()
4157 (event->cm_node->state == NES_CM_STATE_TSA)) in nes_cm_event_handler()
4164 if ((!event->cm_node->cm_id) || in nes_cm_event_handler()
4165 (event->cm_node->state == NES_CM_STATE_TSA)) in nes_cm_event_handler()
4180 rem_ref_cm_node(cm_core, event->cm_node); in nes_cm_event_handler()