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()
1582 struct nes_cm_node *cm_node; in make_cm_node() local
1590 cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC); in make_cm_node()
1591 if (!cm_node) in make_cm_node()
1596 cm_node->loc_addr = listener->loc_addr; in make_cm_node()
1597 cm_node->loc_port = listener->loc_port; in make_cm_node()
1599 cm_node->loc_addr = cm_info->loc_addr; in make_cm_node()
1600 cm_node->loc_port = cm_info->loc_port; in make_cm_node()
1602 cm_node->rem_addr = cm_info->rem_addr; in make_cm_node()
1603 cm_node->rem_port = cm_info->rem_port; in make_cm_node()
1605 cm_node->mapped_loc_addr = cm_info->mapped_loc_addr; in make_cm_node()
1606 cm_node->mapped_rem_addr = cm_info->mapped_rem_addr; in make_cm_node()
1607 cm_node->mapped_loc_port = cm_info->mapped_loc_port; in make_cm_node()
1608 cm_node->mapped_rem_port = cm_info->mapped_rem_port; in make_cm_node()
1610 cm_node->mpa_frame_rev = mpa_version; in make_cm_node()
1611 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in make_cm_node()
1612 cm_node->mpav2_ird_ord = 0; in make_cm_node()
1613 cm_node->ird_size = 0; in make_cm_node()
1614 cm_node->ord_size = 0; in make_cm_node()
1617 &cm_node->loc_addr, cm_node->loc_port, in make_cm_node()
1618 &cm_node->rem_addr, cm_node->rem_port); in make_cm_node()
1619 cm_node->listener = listener; in make_cm_node()
1621 cm_node->tos = listener->tos; in make_cm_node()
1622 cm_node->netdev = nesvnic->netdev; in make_cm_node()
1623 cm_node->cm_id = cm_info->cm_id; in make_cm_node()
1624 memcpy(cm_node->loc_mac, nesvnic->netdev->dev_addr, ETH_ALEN); in make_cm_node()
1626 nes_debug(NES_DBG_CM, "listener=%p, cm_id=%p\n", cm_node->listener, in make_cm_node()
1627 cm_node->cm_id); in make_cm_node()
1629 spin_lock_init(&cm_node->retrans_list_lock); in make_cm_node()
1631 cm_node->loopbackpartner = NULL; in make_cm_node()
1632 atomic_set(&cm_node->ref_count, 1); in make_cm_node()
1634 cm_node->cm_core = cm_core; in make_cm_node()
1635 cm_node->tcp_cntxt.loc_id = NES_CM_DEF_LOCAL_ID; in make_cm_node()
1636 cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE; in make_cm_node()
1637 cm_node->tcp_cntxt.rcv_wnd = NES_CM_DEFAULT_RCV_WND_SCALED >> in make_cm_node()
1640 cm_node->tcp_cntxt.loc_seq_num = htonl(ts.tv_nsec); in make_cm_node()
1641 cm_node->tcp_cntxt.mss = nesvnic->max_frame_size - sizeof(struct iphdr) - in make_cm_node()
1643 cm_node->tcp_cntxt.rcv_nxt = 0; in make_cm_node()
1646 cm_node->conn_type = cm_info->conn_type; in make_cm_node()
1647 cm_node->apbvt_set = 0; in make_cm_node()
1648 cm_node->accept_pend = 0; in make_cm_node()
1650 cm_node->nesvnic = nesvnic; in make_cm_node()
1655 cm_node->loopbackpartner = NULL; in make_cm_node()
1658 oldarpindex = nes_arp_table(nesdev, cm_node->mapped_rem_addr, in make_cm_node()
1661 cm_node->mapped_rem_addr, oldarpindex); in make_cm_node()
1663 kfree(cm_node); in make_cm_node()
1668 memcpy(cm_node->rem_mac, nesadapter->arp_table[arpindex].mac_addr, ETH_ALEN); in make_cm_node()
1670 cm_node->rem_mac); in make_cm_node()
1672 add_hte_node(cm_core, cm_node); in make_cm_node()
1675 return cm_node; in make_cm_node()
1682 static int add_ref_cm_node(struct nes_cm_node *cm_node) in add_ref_cm_node() argument
1684 atomic_inc(&cm_node->ref_count); in add_ref_cm_node()
1693 struct nes_cm_node *cm_node) in rem_ref_cm_node() argument
1698 if (!cm_node) in rem_ref_cm_node()
1701 spin_lock_irqsave(&cm_node->cm_core->ht_lock, flags); in rem_ref_cm_node()
1702 if (atomic_dec_return(&cm_node->ref_count)) { in rem_ref_cm_node()
1703 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in rem_ref_cm_node()
1706 list_del(&cm_node->list); in rem_ref_cm_node()
1708 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in rem_ref_cm_node()
1711 if (!cm_node->accelerated && cm_node->accept_pend) { in rem_ref_cm_node()
1712 BUG_ON(!cm_node->listener); in rem_ref_cm_node()
1713 atomic_dec(&cm_node->listener->pend_accepts_cnt); in rem_ref_cm_node()
1714 BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0); in rem_ref_cm_node()
1716 WARN_ON(cm_node->send_entry); in rem_ref_cm_node()
1717 if (cm_node->recv_entry) in rem_ref_cm_node()
1718 handle_recv_entry(cm_node, 0); in rem_ref_cm_node()
1719 if (cm_node->listener) { in rem_ref_cm_node()
1720 mini_cm_dec_refcnt_listen(cm_core, cm_node->listener, 0); in rem_ref_cm_node()
1722 if (cm_node->apbvt_set && cm_node->nesvnic) { in rem_ref_cm_node()
1723 nes_manage_apbvt(cm_node->nesvnic, cm_node->mapped_loc_port, in rem_ref_cm_node()
1724 PCI_FUNC(cm_node->nesvnic->nesdev->pcidev->devfn), in rem_ref_cm_node()
1728 cm_node->mapped_loc_port); in rem_ref_cm_node()
1729 nes_remove_mapinfo(cm_node->loc_addr, cm_node->loc_port, in rem_ref_cm_node()
1730 cm_node->mapped_loc_addr, cm_node->mapped_loc_port); in rem_ref_cm_node()
1735 nesqp = cm_node->nesqp; in rem_ref_cm_node()
1737 nesqp->cm_node = NULL; in rem_ref_cm_node()
1739 cm_node->nesqp = NULL; in rem_ref_cm_node()
1742 kfree(cm_node); in rem_ref_cm_node()
1749 static int process_options(struct nes_cm_node *cm_node, u8 *optionsloc, in process_options() argument
1776 cm_node->tcp_cntxt.mss) in process_options()
1777 cm_node->tcp_cntxt.mss = tmp; in process_options()
1781 cm_node->tcp_cntxt.snd_wscale = in process_options()
1792 cm_node->tcp_cntxt.mss = NES_CM_DEFAULT_MSS; in process_options()
1802 static void handle_fin_pkt(struct nes_cm_node *cm_node) in handle_fin_pkt() argument
1805 "refcnt=%d\n", cm_node, cm_node->state, in handle_fin_pkt()
1806 atomic_read(&cm_node->ref_count)); in handle_fin_pkt()
1807 switch (cm_node->state) { in handle_fin_pkt()
1812 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1813 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1814 cm_node->state = NES_CM_STATE_LAST_ACK; in handle_fin_pkt()
1815 send_fin(cm_node, NULL); in handle_fin_pkt()
1818 create_event(cm_node, NES_CM_EVENT_ABORTED); in handle_fin_pkt()
1819 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1820 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1821 cm_node->state = NES_CM_STATE_CLOSED; in handle_fin_pkt()
1822 add_ref_cm_node(cm_node); in handle_fin_pkt()
1823 send_reset(cm_node, NULL); in handle_fin_pkt()
1826 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1827 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1828 cm_node->state = NES_CM_STATE_CLOSING; in handle_fin_pkt()
1829 send_ack(cm_node, NULL); in handle_fin_pkt()
1835 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1836 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1837 cm_node->state = NES_CM_STATE_TIME_WAIT; in handle_fin_pkt()
1838 send_ack(cm_node, NULL); in handle_fin_pkt()
1839 schedule_nes_timer(cm_node, NULL, NES_TIMER_TYPE_CLOSE, 1, 0); in handle_fin_pkt()
1842 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1843 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1844 cm_node->state = NES_CM_STATE_CLOSED; in handle_fin_pkt()
1845 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_fin_pkt()
1850 cm_node, cm_node->state); in handle_fin_pkt()
1856 static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_rst_pkt() argument
1863 " refcnt=%d\n", cm_node, cm_node->state, in handle_rst_pkt()
1864 atomic_read(&cm_node->ref_count)); in handle_rst_pkt()
1865 cleanup_retrans_entry(cm_node); in handle_rst_pkt()
1866 switch (cm_node->state) { in handle_rst_pkt()
1870 "listener=%p state=%d\n", __func__, __LINE__, cm_node, in handle_rst_pkt()
1871 cm_node->listener, cm_node->state); in handle_rst_pkt()
1872 switch (cm_node->mpa_frame_rev) { in handle_rst_pkt()
1874 cm_node->mpa_frame_rev = IETF_MPA_V1; in handle_rst_pkt()
1876 cm_node->state = NES_CM_STATE_SYN_SENT; in handle_rst_pkt()
1877 if (send_syn(cm_node, 0, NULL)) { in handle_rst_pkt()
1878 active_open_err(cm_node, skb, reset); in handle_rst_pkt()
1883 active_open_err(cm_node, skb, reset); in handle_rst_pkt()
1888 atomic_inc(&cm_node->passive_state); in handle_rst_pkt()
1895 passive_open_err(cm_node, skb, reset); in handle_rst_pkt()
1898 active_open_err(cm_node, skb, reset); in handle_rst_pkt()
1906 cm_node->cm_id->rem_ref(cm_node->cm_id); in handle_rst_pkt()
1908 cm_node->state = NES_CM_STATE_CLOSED; in handle_rst_pkt()
1909 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_rst_pkt()
1919 static void handle_rcv_mpa(struct nes_cm_node *cm_node, struct sk_buff *skb) in handle_rcv_mpa() argument
1928 ret = parse_mpa(cm_node, dataloc, &res_type, datasize); in handle_rcv_mpa()
1931 if (cm_node->state == NES_CM_STATE_MPAREQ_SENT) { in handle_rcv_mpa()
1934 __LINE__, cm_node, cm_node->listener, in handle_rcv_mpa()
1935 cm_node->state); in handle_rcv_mpa()
1936 active_open_err(cm_node, skb, 1); in handle_rcv_mpa()
1938 passive_open_err(cm_node, skb, 1); in handle_rcv_mpa()
1943 switch (cm_node->state) { in handle_rcv_mpa()
1950 cm_node->state = NES_CM_STATE_MPAREQ_RCVD; in handle_rcv_mpa()
1952 atomic_set(&cm_node->passive_state, in handle_rcv_mpa()
1956 cleanup_retrans_entry(cm_node); in handle_rcv_mpa()
1959 cm_node->state = NES_CM_STATE_MPAREJ_RCVD; in handle_rcv_mpa()
1962 cm_node->state = NES_CM_STATE_TSA; in handle_rcv_mpa()
1971 create_event(cm_node, type); in handle_rcv_mpa()
1974 static void indicate_pkt_err(struct nes_cm_node *cm_node, struct sk_buff *skb) in indicate_pkt_err() argument
1976 switch (cm_node->state) { in indicate_pkt_err()
1980 "listener=%p state=%d\n", __func__, __LINE__, cm_node, in indicate_pkt_err()
1981 cm_node->listener, cm_node->state); in indicate_pkt_err()
1982 active_open_err(cm_node, skb, 1); in indicate_pkt_err()
1986 passive_open_err(cm_node, skb, 1); in indicate_pkt_err()
1994 static int check_syn(struct nes_cm_node *cm_node, struct tcphdr *tcph, in check_syn() argument
1999 err = ((ntohl(tcph->ack_seq) == cm_node->tcp_cntxt.loc_seq_num)) ? 0 : 1; in check_syn()
2001 active_open_err(cm_node, skb, 1); in check_syn()
2006 static int check_seq(struct nes_cm_node *cm_node, struct tcphdr *tcph, in check_seq() argument
2012 u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num; in check_seq()
2013 u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt; in check_seq()
2018 rcv_wnd = cm_node->tcp_cntxt.rcv_wnd; in check_seq()
2025 "listener=%p state=%d\n", __func__, __LINE__, cm_node, in check_seq()
2026 cm_node->listener, cm_node->state); in check_seq()
2027 indicate_pkt_err(cm_node, skb); in check_seq()
2029 "rcv_nxt=0x%08X rcv_wnd=0x%x\n", cm_node, seq, rcv_nxt, in check_seq()
2040 static void handle_syn_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_syn_pkt() argument
2051 switch (cm_node->state) { in handle_syn_pkt()
2055 active_open_err(cm_node, skb, 1); in handle_syn_pkt()
2059 if (atomic_read(&cm_node->listener->pend_accepts_cnt) > in handle_syn_pkt()
2060 cm_node->listener->backlog) { in handle_syn_pkt()
2064 passive_open_err(cm_node, skb, 0); in handle_syn_pkt()
2067 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, in handle_syn_pkt()
2070 passive_open_err(cm_node, skb, 0); in handle_syn_pkt()
2074 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in handle_syn_pkt()
2075 BUG_ON(cm_node->send_entry); in handle_syn_pkt()
2076 cm_node->accept_pend = 1; in handle_syn_pkt()
2077 atomic_inc(&cm_node->listener->pend_accepts_cnt); in handle_syn_pkt()
2079 cm_node->state = NES_CM_STATE_SYN_RCVD; in handle_syn_pkt()
2080 send_syn(cm_node, 1, skb); in handle_syn_pkt()
2083 cleanup_retrans_entry(cm_node); in handle_syn_pkt()
2084 add_ref_cm_node(cm_node); in handle_syn_pkt()
2085 send_reset(cm_node, skb); in handle_syn_pkt()
2101 static void handle_synack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_synack_pkt() argument
2111 switch (cm_node->state) { in handle_synack_pkt()
2113 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
2115 if (check_syn(cm_node, tcph, skb)) in handle_synack_pkt()
2117 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in handle_synack_pkt()
2119 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 0); in handle_synack_pkt()
2122 cm_node); in handle_synack_pkt()
2125 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
2126 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in handle_synack_pkt()
2127 send_mpa_request(cm_node, skb); in handle_synack_pkt()
2128 cm_node->state = NES_CM_STATE_MPAREQ_SENT; in handle_synack_pkt()
2132 passive_open_err(cm_node, skb, 1); in handle_synack_pkt()
2135 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in handle_synack_pkt()
2136 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
2137 cm_node->state = NES_CM_STATE_CLOSED; in handle_synack_pkt()
2138 send_reset(cm_node, skb); in handle_synack_pkt()
2141 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in handle_synack_pkt()
2142 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
2143 add_ref_cm_node(cm_node); in handle_synack_pkt()
2144 send_reset(cm_node, skb); in handle_synack_pkt()
2160 static int handle_ack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_ack_pkt() argument
2170 if (check_seq(cm_node, tcph, skb)) in handle_ack_pkt()
2176 switch (cm_node->state) { in handle_ack_pkt()
2179 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2180 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 1); in handle_ack_pkt()
2183 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in handle_ack_pkt()
2184 cm_node->state = NES_CM_STATE_ESTABLISHED; in handle_ack_pkt()
2186 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in handle_ack_pkt()
2187 nes_get_remote_addr(cm_node); in handle_ack_pkt()
2188 handle_rcv_mpa(cm_node, skb); in handle_ack_pkt()
2195 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2197 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in handle_ack_pkt()
2198 handle_rcv_mpa(cm_node, skb); in handle_ack_pkt()
2204 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in handle_ack_pkt()
2206 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in handle_ack_pkt()
2207 handle_rcv_mpa(cm_node, skb); in handle_ack_pkt()
2213 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2214 cm_node->state = NES_CM_STATE_CLOSED; in handle_ack_pkt()
2215 send_reset(cm_node, skb); in handle_ack_pkt()
2218 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2219 add_ref_cm_node(cm_node); in handle_ack_pkt()
2220 send_reset(cm_node, skb); in handle_ack_pkt()
2224 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2225 cm_node->state = NES_CM_STATE_CLOSED; in handle_ack_pkt()
2226 cm_node->cm_id->rem_ref(cm_node->cm_id); in handle_ack_pkt()
2227 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_ack_pkt()
2231 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2233 cm_node->state = NES_CM_STATE_FIN_WAIT2; in handle_ack_pkt()
2241 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2250 static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph, in handle_tcp_options() argument
2256 if (process_options(cm_node, optionsloc, optionsize, in handle_tcp_options()
2259 __func__, cm_node); in handle_tcp_options()
2261 passive_open_err(cm_node, skb, 1); in handle_tcp_options()
2263 active_open_err(cm_node, skb, 1); in handle_tcp_options()
2268 cm_node->tcp_cntxt.snd_wnd = ntohs(tcph->window) << in handle_tcp_options()
2269 cm_node->tcp_cntxt.snd_wscale; in handle_tcp_options()
2271 if (cm_node->tcp_cntxt.snd_wnd > cm_node->tcp_cntxt.max_snd_wnd) in handle_tcp_options()
2272 cm_node->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.snd_wnd; in handle_tcp_options()
2280 static void active_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb, in active_open_err() argument
2283 cleanup_retrans_entry(cm_node); in active_open_err()
2286 "state=%d\n", cm_node, cm_node->state); in active_open_err()
2287 add_ref_cm_node(cm_node); in active_open_err()
2288 send_reset(cm_node, skb); in active_open_err()
2293 cm_node->state = NES_CM_STATE_CLOSED; in active_open_err()
2294 create_event(cm_node, NES_CM_EVENT_ABORTED); in active_open_err()
2301 static void passive_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb, in passive_open_err() argument
2304 cleanup_retrans_entry(cm_node); in passive_open_err()
2305 cm_node->state = NES_CM_STATE_CLOSED; in passive_open_err()
2308 "cm_node=%p state =%d\n", cm_node, cm_node->state); in passive_open_err()
2309 send_reset(cm_node, skb); in passive_open_err()
2312 rem_ref_cm_node(cm_node->cm_core, cm_node); in passive_open_err()
2320 static void free_retrans_entry(struct nes_cm_node *cm_node) in free_retrans_entry() argument
2324 send_entry = cm_node->send_entry; in free_retrans_entry()
2326 cm_node->send_entry = NULL; in free_retrans_entry()
2329 rem_ref_cm_node(cm_node->cm_core, cm_node); in free_retrans_entry()
2333 static void cleanup_retrans_entry(struct nes_cm_node *cm_node) in cleanup_retrans_entry() argument
2337 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in cleanup_retrans_entry()
2338 free_retrans_entry(cm_node); in cleanup_retrans_entry()
2339 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in cleanup_retrans_entry()
2346 static void process_packet(struct nes_cm_node *cm_node, struct sk_buff *skb, in process_packet() argument
2357 "ack=%d rst=%d fin=%d\n", cm_node, cm_node->state, tcph->syn, in process_packet()
2374 handle_syn_pkt(cm_node, skb, tcph); in process_packet()
2377 handle_synack_pkt(cm_node, skb, tcph); in process_packet()
2380 ret = handle_ack_pkt(cm_node, skb, tcph); in process_packet()
2382 handle_fin_pkt(cm_node); in process_packet()
2385 handle_rst_pkt(cm_node, skb, tcph); in process_packet()
2388 if ((fin_set) && (!check_seq(cm_node, tcph, skb))) in process_packet()
2389 handle_fin_pkt(cm_node); in process_packet()
2493 struct nes_cm_node *cm_node; in mini_cm_connect() local
2500 cm_node = make_cm_node(cm_core, nesvnic, cm_info, NULL); in mini_cm_connect()
2501 if (!cm_node) in mini_cm_connect()
2505 cm_node->tcp_cntxt.client = 1; in mini_cm_connect()
2506 cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE; in mini_cm_connect()
2510 cm_node->mapped_loc_addr, cm_node->mapped_rem_port, in mini_cm_connect()
2513 create_event(cm_node, NES_CM_EVENT_ABORTED); in mini_cm_connect()
2526 rem_ref_cm_node(cm_node->cm_core, cm_node); in mini_cm_connect()
2530 loopbackremotenode->loopbackpartner = cm_node; in mini_cm_connect()
2533 cm_node->loopbackpartner = loopbackremotenode; in mini_cm_connect()
2540 cm_node->state = NES_CM_STATE_TSA; in mini_cm_connect()
2541 cm_node->tcp_cntxt.rcv_nxt = in mini_cm_connect()
2544 cm_node->tcp_cntxt.loc_seq_num; in mini_cm_connect()
2545 cm_node->tcp_cntxt.max_snd_wnd = in mini_cm_connect()
2548 cm_node->tcp_cntxt.rcv_wnd; in mini_cm_connect()
2549 cm_node->tcp_cntxt.snd_wnd = in mini_cm_connect()
2552 cm_node->tcp_cntxt.rcv_wnd; in mini_cm_connect()
2553 cm_node->tcp_cntxt.snd_wscale = in mini_cm_connect()
2556 cm_node->tcp_cntxt.rcv_wscale; in mini_cm_connect()
2560 return cm_node; in mini_cm_connect()
2563 start_buff = &cm_node->mpa_frame_buf[0] + sizeof(struct ietf_mpa_v2); in mini_cm_connect()
2564 cm_node->mpa_frame_size = private_data_len; in mini_cm_connect()
2569 cm_node->state = NES_CM_STATE_SYN_SENT; in mini_cm_connect()
2570 ret = send_syn(cm_node, 0, NULL); in mini_cm_connect()
2576 cm_node->rem_addr, cm_node->rem_port, cm_node, in mini_cm_connect()
2577 cm_node->cm_id); in mini_cm_connect()
2578 rem_ref_cm_node(cm_node->cm_core, cm_node); in mini_cm_connect()
2579 cm_node = NULL; in mini_cm_connect()
2582 if (cm_node) { in mini_cm_connect()
2585 cm_node->rem_addr, cm_node->rem_port, cm_node, in mini_cm_connect()
2586 cm_node->cm_id); in mini_cm_connect()
2589 return cm_node; in mini_cm_connect()
2597 static int mini_cm_accept(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in mini_cm_accept() argument
2606 static int mini_cm_reject(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in mini_cm_reject() argument
2612 struct iw_cm_id *cm_id = cm_node->cm_id; in mini_cm_reject()
2613 struct nes_cm_node *loopback = cm_node->loopbackpartner; in mini_cm_reject()
2616 __func__, cm_node, cm_node->tcp_cntxt.client, cm_node->state); in mini_cm_reject()
2618 if (cm_node->tcp_cntxt.client) in mini_cm_reject()
2620 cleanup_retrans_entry(cm_node); in mini_cm_reject()
2623 passive_state = atomic_add_return(1, &cm_node->passive_state); in mini_cm_reject()
2625 cm_node->state = NES_CM_STATE_CLOSED; in mini_cm_reject()
2626 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2628 if (cm_node->state == NES_CM_STATE_LISTENER_DESTROYED) { in mini_cm_reject()
2629 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2631 ret = send_mpa_reject(cm_node); in mini_cm_reject()
2633 cm_node->state = NES_CM_STATE_CLOSED; in mini_cm_reject()
2634 err = send_reset(cm_node, NULL); in mini_cm_reject()
2643 cm_node->cm_id = NULL; in mini_cm_reject()
2644 if (cm_node->state == NES_CM_STATE_LISTENER_DESTROYED) { in mini_cm_reject()
2645 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2648 event.cm_node = loopback; in mini_cm_reject()
2655 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2671 static int mini_cm_close(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in mini_cm_close() argument
2675 if (!cm_core || !cm_node) in mini_cm_close()
2678 switch (cm_node->state) { in mini_cm_close()
2686 cleanup_retrans_entry(cm_node); in mini_cm_close()
2687 send_reset(cm_node, NULL); in mini_cm_close()
2690 cm_node->state = NES_CM_STATE_LAST_ACK; in mini_cm_close()
2691 send_fin(cm_node, NULL); in mini_cm_close()
2701 cleanup_retrans_entry(cm_node); in mini_cm_close()
2702 send_reset(cm_node, NULL); in mini_cm_close()
2709 ret = rem_ref_cm_node(cm_core, cm_node); in mini_cm_close()
2712 if (cm_node->send_entry) in mini_cm_close()
2714 "send_entry=%p\n", cm_node->send_entry); in mini_cm_close()
2715 ret = rem_ref_cm_node(cm_core, cm_node); in mini_cm_close()
2729 struct nes_cm_node *cm_node = NULL; in mini_cm_recv_pkt() local
2763 cm_node = find_node(cm_core, in mini_cm_recv_pkt()
2767 if (!cm_node) { in mini_cm_recv_pkt()
2786 cm_node = make_cm_node(cm_core, nesvnic, &nfo, in mini_cm_recv_pkt()
2788 if (!cm_node) { in mini_cm_recv_pkt()
2797 cm_node->state = NES_CM_STATE_LISTENING; in mini_cm_recv_pkt()
2800 rem_ref_cm_node(cm_core, cm_node); in mini_cm_recv_pkt()
2804 add_ref_cm_node(cm_node); in mini_cm_recv_pkt()
2805 } else if (cm_node->state == NES_CM_STATE_TSA) { in mini_cm_recv_pkt()
2806 if (cm_node->nesqp->pau_mode) in mini_cm_recv_pkt()
2807 nes_queue_mgt_skbs(skb, nesvnic, cm_node->nesqp); in mini_cm_recv_pkt()
2809 rem_ref_cm_node(cm_core, cm_node); in mini_cm_recv_pkt()
2818 process_packet(cm_node, skb, cm_core); in mini_cm_recv_pkt()
2819 rem_ref_cm_node(cm_core, cm_node); in mini_cm_recv_pkt()
2928 static int nes_cm_init_tsa_conn(struct nes_qp *nesqp, struct nes_cm_node *cm_node) in nes_cm_init_tsa_conn() argument
2939 if (cm_node->tcp_cntxt.snd_wscale || cm_node->tcp_cntxt.rcv_wscale) in nes_cm_init_tsa_conn()
2945 cm_node->tos << NES_QPCONTEXT_MISC2_TOS_SHIFT); in nes_cm_init_tsa_conn()
2947 nesqp->nesqp_context->mss |= cpu_to_le32(((u32)cm_node->tcp_cntxt.mss) << 16); in nes_cm_init_tsa_conn()
2953 (cm_node->tcp_cntxt.snd_wscale << NES_QPCONTEXT_PDWSCALE_SND_WSCALE_SHIFT) & in nes_cm_init_tsa_conn()
2957 (cm_node->tcp_cntxt.rcv_wscale << NES_QPCONTEXT_PDWSCALE_RCV_WSCALE_SHIFT) & in nes_cm_init_tsa_conn()
2963 nesqp->nesqp_context->snd_nxt = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2964 nesqp->nesqp_context->snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.snd_wnd); in nes_cm_init_tsa_conn()
2965 nesqp->nesqp_context->rcv_nxt = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in nes_cm_init_tsa_conn()
2966 nesqp->nesqp_context->rcv_wnd = cpu_to_le32(cm_node->tcp_cntxt.rcv_wnd << in nes_cm_init_tsa_conn()
2967 cm_node->tcp_cntxt.rcv_wscale); in nes_cm_init_tsa_conn()
2968 nesqp->nesqp_context->snd_max = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2969 nesqp->nesqp_context->snd_una = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2973 nesqp->nesqp_context->cwnd = cpu_to_le32(2 * cm_node->tcp_cntxt.mss); in nes_cm_init_tsa_conn()
2974 nesqp->nesqp_context->snd_wl1 = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in nes_cm_init_tsa_conn()
2975 nesqp->nesqp_context->snd_wl2 = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2976 nesqp->nesqp_context->max_snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.max_snd_wnd); in nes_cm_init_tsa_conn()
2982 cm_node->tcp_cntxt.mss, le32_to_cpu(nesqp->nesqp_context->pd_index_wscale), in nes_cm_init_tsa_conn()
2990 cm_node->state = NES_CM_STATE_TSA; in nes_cm_init_tsa_conn()
3204 if (nesqp->cm_node) { in nes_disconnect()
3207 g_cm_core->api->close(g_cm_core, nesqp->cm_node); in nes_disconnect()
3224 struct nes_cm_node *cm_node; in nes_accept() local
3257 cm_node = (struct nes_cm_node *)cm_id->provider_data; in nes_accept()
3259 "%s\n", cm_node, nesvnic, nesvnic->netdev, in nes_accept()
3262 if (NES_CM_STATE_LISTENER_DESTROYED == cm_node->state) { in nes_accept()
3263 if (cm_node->loopbackpartner) in nes_accept()
3264 rem_ref_cm_node(cm_node->cm_core, cm_node->loopbackpartner); in nes_accept()
3265 rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_accept()
3269 passive_state = atomic_add_return(1, &cm_node->passive_state); in nes_accept()
3271 rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_accept()
3275 nesqp->cm_node = (void *)cm_node; in nes_accept()
3276 cm_node->nesqp = nesqp; in nes_accept()
3280 nesqp->hwqp.qp_id, cm_node, jiffies, cm_node->listener); in nes_accept()
3298 if (cm_node->mpa_frame_rev == IETF_MPA_V1) in nes_accept()
3301 if (cm_node->mpa_frame_rev == IETF_MPA_V1 || in nes_accept()
3302 cm_node->mpav2_ird_ord == IETF_NO_IRD_ORD) { in nes_accept()
3303 record_ird_ord(cm_node, (u16)conn_param->ird, (u16)conn_param->ord); in nes_accept()
3309 cm_build_mpa_frame(cm_node, start_buff, &buff_len, nesqp->ietf_frame, MPA_KEY_REPLY); in nes_accept()
3329 cm_node); in nes_accept()
3371 cm_node->cm_id = cm_id; in nes_accept()
3377 if (cm_node->state == NES_CM_STATE_TSA) in nes_accept()
3379 cm_node); in nes_accept()
3381 nes_cm_init_tsa_conn(nesqp, cm_node); in nes_accept()
3384 cpu_to_le16(cm_node->mapped_loc_port); in nes_accept()
3386 cpu_to_le16(cm_node->mapped_rem_port); in nes_accept()
3388 nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->mapped_rem_addr); in nes_accept()
3407 cpu_to_le32((u32)cm_node->ord_size); in nes_accept()
3412 nes_quad.SrcIpadr = htonl(cm_node->mapped_rem_addr); in nes_accept()
3413 nes_quad.TcpPorts[0] = htons(cm_node->mapped_rem_port); in nes_accept()
3414 nes_quad.TcpPorts[1] = htons(cm_node->mapped_loc_port); in nes_accept()
3425 cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node); in nes_accept()
3447 cm_event.ird = cm_node->ird_size; in nes_accept()
3448 cm_event.ord = cm_node->ord_size; in nes_accept()
3453 if (cm_node->loopbackpartner) { in nes_accept()
3454 cm_node->loopbackpartner->mpa_frame_size = in nes_accept()
3457 memcpy(cm_node->loopbackpartner->mpa_frame_buf, in nes_accept()
3459 create_event(cm_node->loopbackpartner, NES_CM_EVENT_CONNECTED); in nes_accept()
3474 struct nes_cm_node *cm_node; in nes_reject() local
3480 cm_node = (struct nes_cm_node *)cm_id->provider_data; in nes_reject()
3481 loopback = cm_node->loopbackpartner; in nes_reject()
3482 cm_core = cm_node->cm_core; in nes_reject()
3483 cm_node->cm_id = cm_id; in nes_reject()
3493 start_buff = &cm_node->mpa_frame_buf[0] + sizeof(struct ietf_mpa_v2); in nes_reject()
3494 cm_node->mpa_frame_size = pdata_len; in nes_reject()
3497 return cm_core->api->reject(cm_core, cm_node); in nes_reject()
3511 struct nes_cm_node *cm_node; in nes_connect() local
3598 cm_node = g_cm_core->api->connect(g_cm_core, nesvnic, in nes_connect()
3601 if (!cm_node) { in nes_connect()
3615 record_ird_ord(cm_node, (u16)conn_param->ird, (u16)conn_param->ord); in nes_connect()
3616 if (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO && in nes_connect()
3617 cm_node->ord_size == 0) in nes_connect()
3618 cm_node->ord_size = 1; in nes_connect()
3620 cm_node->apbvt_set = apbvt_set; in nes_connect()
3621 cm_node->tos = cm_id->tos; in nes_connect()
3622 nesqp->cm_node = cm_node; in nes_connect()
3623 cm_node->nesqp = nesqp; in nes_connect()
3636 struct nes_cm_listener *cm_node; in nes_create_listen() local
3668 cm_node = g_cm_core->api->listen(g_cm_core, nesvnic, &cm_info); in nes_create_listen()
3669 if (!cm_node) { in nes_create_listen()
3675 cm_id->provider_data = cm_node; in nes_create_listen()
3676 cm_node->tos = cm_id->tos; in nes_create_listen()
3678 if (!cm_node->reused_node) { in nes_create_listen()
3682 err = nes_manage_apbvt(nesvnic, cm_node->mapped_loc_port, in nes_create_listen()
3688 g_cm_core->api->stop_listener(g_cm_core, (void *)cm_node); in nes_create_listen()
3695 cm_id->provider_data = (void *)cm_node; in nes_create_listen()
3772 struct nes_cm_node *cm_node; in cm_event_connected() local
3785 cm_node = event->cm_node; in cm_event_connected()
3786 cm_id = cm_node->cm_id; in cm_event_connected()
3787 nes_debug(NES_DBG_CM, "cm_event_connected - %p - cm_id = %p\n", cm_node, cm_id); in cm_event_connected()
3804 nes_cm_init_tsa_conn(nesqp, cm_node); in cm_event_connected()
3808 cpu_to_le16(cm_node->mapped_loc_port); in cm_event_connected()
3810 cpu_to_le16(cm_node->mapped_rem_port); in cm_event_connected()
3811 nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->mapped_rem_addr); in cm_event_connected()
3827 cpu_to_le32((u32)cm_node->ord_size); in cm_event_connected()
3832 build_rdma0_msg(cm_node, &nesqp); in cm_event_connected()
3841 nes_quad.SrcIpadr = htonl(cm_node->mapped_rem_addr); in cm_event_connected()
3842 nes_quad.TcpPorts[0] = htons(cm_node->mapped_rem_port); in cm_event_connected()
3843 nes_quad.TcpPorts[1] = htons(cm_node->mapped_loc_port); in cm_event_connected()
3854 nesqp->ietf_frame = &cm_node->mpa_frame; in cm_event_connected()
3855 nesqp->private_data_len = (u8)cm_node->mpa_frame_size; in cm_event_connected()
3856 cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node); in cm_event_connected()
3866 cm_event.private_data = (void *)event->cm_node->mpa_frame_buf; in cm_event_connected()
3867 cm_event.private_data_len = (u8)event->cm_node->mpa_frame_size; in cm_event_connected()
3868 cm_event.ird = cm_node->ird_size; in cm_event_connected()
3869 cm_event.ord = cm_node->ord_size; in cm_event_connected()
3899 if (!event->cm_node) in cm_event_connect_error()
3902 cm_id = event->cm_node->cm_id; in cm_event_connect_error()
3906 nes_debug(NES_DBG_CM, "cm_node=%p, cm_id=%p\n", event->cm_node, cm_id); in cm_event_connect_error()
3942 rem_ref_cm_node(event->cm_node->cm_core, event->cm_node); in cm_event_connect_error()
3958 if (!event->cm_node) in cm_event_reset()
3961 if (!event->cm_node->cm_id) in cm_event_reset()
3964 cm_id = event->cm_node->cm_id; in cm_event_reset()
3966 nes_debug(NES_DBG_CM, "%p - cm_id = %p\n", event->cm_node, cm_id); in cm_event_reset()
3991 nes_debug(NES_DBG_CM, "NODE %p Generating CLOSE\n", event->cm_node); in cm_event_reset()
4012 struct nes_cm_node *cm_node; in cm_event_mpa_req() local
4018 cm_node = event->cm_node; in cm_event_mpa_req()
4019 if (!cm_node) in cm_event_mpa_req()
4021 cm_id = cm_node->cm_id; in cm_event_mpa_req()
4025 cm_node, cm_id, jiffies); in cm_event_mpa_req()
4029 cm_event.provider_data = (void *)cm_node; in cm_event_mpa_req()
4038 cm_event.private_data = cm_node->mpa_frame_buf; in cm_event_mpa_req()
4039 cm_event.private_data_len = (u8)cm_node->mpa_frame_size; in cm_event_mpa_req()
4040 if (cm_node->mpa_frame_rev == IETF_MPA_V1) { in cm_event_mpa_req()
4044 cm_event.ird = cm_node->ird_size; in cm_event_mpa_req()
4045 cm_event.ord = cm_node->ord_size; in cm_event_mpa_req()
4060 struct nes_cm_node *cm_node; in cm_event_mpa_reject() local
4067 cm_node = event->cm_node; in cm_event_mpa_reject()
4068 if (!cm_node) in cm_event_mpa_reject()
4070 cm_id = cm_node->cm_id; in cm_event_mpa_reject()
4074 cm_node, cm_id, jiffies); in cm_event_mpa_reject()
4088 cm_event.private_data = cm_node->mpa_frame_buf; in cm_event_mpa_reject()
4089 cm_event.private_data_len = (u8)cm_node->mpa_frame_size; in cm_event_mpa_reject()
4113 atomic_inc(&event->cm_node->cm_core->events_posted); in nes_cm_post_event()
4114 add_ref_cm_node(event->cm_node); in nes_cm_post_event()
4118 event->cm_node, event); in nes_cm_post_event()
4120 queue_work(event->cm_node->cm_core->event_wq, &event->event_work); in nes_cm_post_event()
4138 if ((!event) || (!event->cm_node) || (!event->cm_node->cm_core)) in nes_cm_event_handler()
4141 cm_core = event->cm_node->cm_core; in nes_cm_event_handler()
4149 event->cm_node); in nes_cm_event_handler()
4153 event->cm_node); in nes_cm_event_handler()
4157 if ((!event->cm_node->cm_id) || in nes_cm_event_handler()
4158 (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()
4172 if ((!event->cm_node->cm_id) || in nes_cm_event_handler()
4173 (event->cm_node->state == NES_CM_STATE_TSA)) in nes_cm_event_handler()
4188 rem_ref_cm_node(cm_core, event->cm_node); in nes_cm_event_handler()