Lines Matching refs:cm_node
107 static int send_ack(struct nes_cm_node *cm_node, struct sk_buff *skb);
108 static int send_fin(struct nes_cm_node *cm_node, struct sk_buff *skb);
115 static void free_retrans_entry(struct nes_cm_node *cm_node);
116 static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph, struct sk_buff *skb…
124 static void handle_recv_entry(struct nes_cm_node *cm_node, u32 rem_node);
162 int nes_add_ref_cm_node(struct nes_cm_node *cm_node) in nes_add_ref_cm_node() argument
164 return add_ref_cm_node(cm_node); in nes_add_ref_cm_node()
167 int nes_rem_ref_cm_node(struct nes_cm_node *cm_node) in nes_rem_ref_cm_node() argument
169 return rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_rem_ref_cm_node()
174 static struct nes_cm_event *create_event(struct nes_cm_node * cm_node, in create_event() argument
179 if (!cm_node->cm_id) in create_event()
189 event->cm_node = cm_node; in create_event()
190 event->cm_info.rem_addr = cm_node->rem_addr; in create_event()
191 event->cm_info.loc_addr = cm_node->loc_addr; in create_event()
192 event->cm_info.rem_port = cm_node->rem_port; in create_event()
193 event->cm_info.loc_port = cm_node->loc_port; in create_event()
194 event->cm_info.cm_id = cm_node->cm_id; in create_event()
198 cm_node, event, type, event->cm_info.loc_addr, in create_event()
210 static int send_mpa_request(struct nes_cm_node *cm_node, struct sk_buff *skb) in send_mpa_request() argument
223 cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REQUEST); in send_mpa_request()
224 form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK); in send_mpa_request()
226 return schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0); in send_mpa_request()
231 static int send_mpa_reject(struct nes_cm_node *cm_node) in send_mpa_reject() argument
247 cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REPLY); in send_mpa_reject()
250 form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK | SET_FIN); in send_mpa_reject()
252 cm_node->state = NES_CM_STATE_FIN_WAIT1; in send_mpa_reject()
253 return schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0); in send_mpa_reject()
261 static int parse_mpa(struct nes_cm_node *cm_node, u8 *buffer, u32 *type, in parse_mpa() argument
302 if (mpa_frame->rev > cm_node->mpa_frame_rev) { in parse_mpa()
307 cm_node->mpa_frame_rev = mpa_frame->rev; in parse_mpa()
310 if (cm_node->state != NES_CM_STATE_MPAREQ_SENT) { in parse_mpa()
336 cm_node->mpa_frame_size = priv_data_len; in parse_mpa()
347 cm_node->mpa_frame_size -= IETF_RTR_MSG_SIZE; in parse_mpa()
361 cm_node->mpav2_ird_ord = IETF_NO_IRD_ORD; in parse_mpa()
363 if (cm_node->mpav2_ird_ord != IETF_NO_IRD_ORD) { in parse_mpa()
365 if (cm_node->state != NES_CM_STATE_MPAREQ_SENT) { in parse_mpa()
368 cm_node->ird_size = NES_MAX_IRD; in parse_mpa()
370 cm_node->ird_size = ord_size; in parse_mpa()
373 cm_node->ird_size = 1; in parse_mpa()
380 cm_node->ord_size = NES_MAX_ORD; in parse_mpa()
382 cm_node->ord_size = ird_size; in parse_mpa()
390 cm_node->ird_size = ord_size; in parse_mpa()
393 cm_node->ord_size = NES_MAX_ORD; in parse_mpa()
402 cm_node->ord_size = ird_size; in parse_mpa()
409 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in parse_mpa()
412 cm_node->send_rdma0_op = SEND_RDMA_WRITE_ZERO; in parse_mpa()
424 memcpy(cm_node->mpa_frame_buf, buffer + mpa_hdr_len, cm_node->mpa_frame_size); in parse_mpa()
437 struct nes_cm_node *cm_node, void *options, u32 optionsize, in form_cm_frame() argument
466 if (!(cm_node->netdev->features & NETIF_F_IP_CSUM)) in form_cm_frame()
472 memcpy(ethh->h_dest, cm_node->rem_mac, ETH_ALEN); in form_cm_frame()
473 memcpy(ethh->h_source, cm_node->loc_mac, ETH_ALEN); in form_cm_frame()
480 iph->id = htons(++cm_node->tcp_cntxt.loc_id); in form_cm_frame()
486 iph->saddr = htonl(cm_node->loc_addr); in form_cm_frame()
487 iph->daddr = htonl(cm_node->rem_addr); in form_cm_frame()
489 tcph->source = htons(cm_node->loc_port); in form_cm_frame()
490 tcph->dest = htons(cm_node->rem_port); in form_cm_frame()
491 tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num); in form_cm_frame()
494 cm_node->tcp_cntxt.loc_ack_num = cm_node->tcp_cntxt.rcv_nxt; in form_cm_frame()
495 tcph->ack_seq = htonl(cm_node->tcp_cntxt.loc_ack_num); in form_cm_frame()
502 cm_node->tcp_cntxt.loc_seq_num++; in form_cm_frame()
505 cm_node->tcp_cntxt.loc_seq_num += datasize; in form_cm_frame()
509 cm_node->tcp_cntxt.loc_seq_num++; in form_cm_frame()
517 tcph->window = htons(cm_node->tcp_cntxt.rcv_wnd); in form_cm_frame()
550 static void record_ird_ord(struct nes_cm_node *cm_node, in record_ird_ord() argument
559 cm_node->ird_size = conn_ird; in record_ird_ord()
560 cm_node->ord_size = conn_ord; in record_ird_ord()
566 static int cm_build_mpa_frame(struct nes_cm_node *cm_node, u8 **start_buff, in cm_build_mpa_frame() argument
571 *start_buff = (pci_mem) ? pci_mem : &cm_node->mpa_frame_buf[0]; in cm_build_mpa_frame()
573 switch (cm_node->mpa_frame_rev) { in cm_build_mpa_frame()
576 *buff_len = sizeof(struct ietf_mpa_v1) + cm_node->mpa_frame_size; in cm_build_mpa_frame()
577 build_mpa_v1(cm_node, *start_buff, mpa_key); in cm_build_mpa_frame()
580 *buff_len = sizeof(struct ietf_mpa_v2) + cm_node->mpa_frame_size; in cm_build_mpa_frame()
581 build_mpa_v2(cm_node, *start_buff, mpa_key); in cm_build_mpa_frame()
592 static void build_mpa_v2(struct nes_cm_node *cm_node, in build_mpa_v2() argument
601 build_mpa_v1(cm_node, start_addr, mpa_key); in build_mpa_v2()
606 if (cm_node->mpav2_ird_ord == IETF_NO_IRD_ORD) { in build_mpa_v2()
610 ctrl_ird = cm_node->ird_size & IETF_NO_IRD_ORD; in build_mpa_v2()
611 ctrl_ord = cm_node->ord_size & IETF_NO_IRD_ORD; in build_mpa_v2()
621 switch (cm_node->send_rdma0_op) { in build_mpa_v2()
637 static void build_mpa_v1(struct nes_cm_node *cm_node, void *start_addr, u8 mpa_key) in build_mpa_v1() argument
650 mpa_frame->rev = cm_node->mpa_frame_rev; in build_mpa_v1()
651 mpa_frame->priv_data_len = htons(cm_node->mpa_frame_size); in build_mpa_v1()
654 static void build_rdma0_msg(struct nes_cm_node *cm_node, struct nes_qp **nesqp_addr) in build_rdma0_msg() argument
667 switch (cm_node->send_rdma0_op) { in build_rdma0_msg()
679 if (cm_node->send_rdma0_op != SEND_RDMA_READ_ZERO) in build_rdma0_msg()
681 cm_node->send_rdma0_op); in build_rdma0_msg()
711 int schedule_nes_timer(struct nes_cm_node *cm_node, struct sk_buff *skb, in schedule_nes_timer() argument
716 struct nes_cm_core *cm_core = cm_node->cm_core; in schedule_nes_timer()
730 new_send->netdev = cm_node->netdev; in schedule_nes_timer()
736 if (cm_node->recv_entry) { in schedule_nes_timer()
741 cm_node->recv_entry = new_send; in schedule_nes_timer()
747 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in schedule_nes_timer()
748 cm_node->send_entry = new_send; in schedule_nes_timer()
749 add_ref_cm_node(cm_node); in schedule_nes_timer()
750 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in schedule_nes_timer()
753 ret = nes_nic_cm_xmit(new_send->skb, cm_node->netdev); in schedule_nes_timer()
762 cleanup_retrans_entry(cm_node); in schedule_nes_timer()
764 rem_ref_cm_node(cm_core, cm_node); in schedule_nes_timer()
776 static void nes_retrans_expired(struct nes_cm_node *cm_node) in nes_retrans_expired() argument
778 struct iw_cm_id *cm_id = cm_node->cm_id; in nes_retrans_expired()
779 enum nes_cm_node_state state = cm_node->state; in nes_retrans_expired()
780 cm_node->state = NES_CM_STATE_CLOSED; in nes_retrans_expired()
785 rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_retrans_expired()
789 if (cm_node->cm_id) in nes_retrans_expired()
791 send_reset(cm_node, NULL); in nes_retrans_expired()
794 add_ref_cm_node(cm_node); in nes_retrans_expired()
795 send_reset(cm_node, NULL); in nes_retrans_expired()
796 create_event(cm_node, NES_CM_EVENT_ABORTED); in nes_retrans_expired()
800 static void handle_recv_entry(struct nes_cm_node *cm_node, u32 rem_node) in handle_recv_entry() argument
802 struct nes_timer_entry *recv_entry = cm_node->recv_entry; in handle_recv_entry()
803 struct iw_cm_id *cm_id = cm_node->cm_id; in handle_recv_entry()
833 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_recv_entry()
835 if (cm_node->cm_id) in handle_recv_entry()
838 cm_node->recv_entry = NULL; in handle_recv_entry()
848 struct nes_cm_node *cm_node; in nes_cm_timer_tick() local
864 cm_node = container_of(list_node, struct nes_cm_node, list); in nes_cm_timer_tick()
865 if ((cm_node->recv_entry) || (cm_node->send_entry)) { in nes_cm_timer_tick()
866 add_ref_cm_node(cm_node); in nes_cm_timer_tick()
867 list_add(&cm_node->timer_entry, &timer_list); in nes_cm_timer_tick()
873 cm_node = container_of(list_node, struct nes_cm_node, in nes_cm_timer_tick()
875 recv_entry = cm_node->recv_entry; in nes_cm_timer_tick()
885 handle_recv_entry(cm_node, 1); in nes_cm_timer_tick()
889 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in nes_cm_timer_tick()
891 send_entry = cm_node->send_entry; in nes_cm_timer_tick()
895 if (cm_node->state != NES_CM_STATE_TSA) { in nes_cm_timer_tick()
904 free_retrans_entry(cm_node); in nes_cm_timer_tick()
909 if ((cm_node->state == NES_CM_STATE_TSA) || in nes_cm_timer_tick()
910 (cm_node->state == NES_CM_STATE_CLOSED)) { in nes_cm_timer_tick()
911 free_retrans_entry(cm_node); in nes_cm_timer_tick()
918 free_retrans_entry(cm_node); in nes_cm_timer_tick()
921 &cm_node->retrans_list_lock, flags); in nes_cm_timer_tick()
922 nes_retrans_expired(cm_node); in nes_cm_timer_tick()
923 cm_node->state = NES_CM_STATE_CLOSED; in nes_cm_timer_tick()
924 spin_lock_irqsave(&cm_node->retrans_list_lock, in nes_cm_timer_tick()
934 "0x%08X\n", send_entry, cm_node, jiffies, in nes_cm_timer_tick()
938 cm_node->tcp_cntxt.rem_ack_num); in nes_cm_timer_tick()
940 spin_unlock_irqrestore(&cm_node->retrans_list_lock, in nes_cm_timer_tick()
942 ret = nes_nic_cm_xmit(send_entry->skb, cm_node->netdev); in nes_cm_timer_tick()
943 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in nes_cm_timer_tick()
946 "node=%p\n", cm_node); in nes_cm_timer_tick()
976 cm_node, cm_node->state); in nes_cm_timer_tick()
977 free_retrans_entry(cm_node); in nes_cm_timer_tick()
979 rem_ref_cm_node(cm_node->cm_core, in nes_cm_timer_tick()
980 cm_node); in nes_cm_timer_tick()
984 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in nes_cm_timer_tick()
985 rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_cm_timer_tick()
998 static int send_syn(struct nes_cm_node *cm_node, u32 sendack, in send_syn() argument
1011 if (!cm_node) in send_syn()
1017 options->as_mss.mss = htons(cm_node->tcp_cntxt.mss); in send_syn()
1023 options->as_windowscale.shiftcount = cm_node->tcp_cntxt.rcv_wscale; in send_syn()
1054 form_cm_frame(skb, cm_node, optionsbuffer, optionssize, NULL, 0, flags); in send_syn()
1055 ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0); in send_syn()
1064 static int send_reset(struct nes_cm_node *cm_node, struct sk_buff *skb) in send_reset() argument
1076 form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, flags); in send_reset()
1077 ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 0, 1); in send_reset()
1086 static int send_ack(struct nes_cm_node *cm_node, struct sk_buff *skb) in send_ack() argument
1098 form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, SET_ACK); in send_ack()
1099 ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 0, 0); in send_ack()
1108 static int send_fin(struct nes_cm_node *cm_node, struct sk_buff *skb) in send_fin() argument
1121 form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, SET_ACK | SET_FIN); in send_fin()
1122 ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0); in send_fin()
1136 struct nes_cm_node *cm_node; in find_node() local
1143 list_for_each_entry(cm_node, hte, list) { in find_node()
1146 cm_node->loc_addr, cm_node->loc_port, in find_node()
1148 cm_node->rem_addr, cm_node->rem_port, in find_node()
1150 if ((cm_node->loc_addr == loc_addr) && in find_node()
1151 (cm_node->loc_port == loc_port) && in find_node()
1152 (cm_node->rem_addr == rem_addr) && in find_node()
1153 (cm_node->rem_port == rem_port)) { in find_node()
1154 add_ref_cm_node(cm_node); in find_node()
1156 return cm_node; in find_node()
1203 static int add_hte_node(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in add_hte_node() argument
1208 if (!cm_node || !cm_core) in add_hte_node()
1212 cm_node); in add_hte_node()
1218 list_add_tail(&cm_node->list, hte); in add_hte_node()
1238 struct nes_cm_node *cm_node = NULL; in mini_cm_dec_refcnt_listen() local
1250 cm_node = container_of(list_pos, struct nes_cm_node, in mini_cm_dec_refcnt_listen()
1252 if ((cm_node->listener == listener) && in mini_cm_dec_refcnt_listen()
1253 (!cm_node->accelerated)) { in mini_cm_dec_refcnt_listen()
1254 add_ref_cm_node(cm_node); in mini_cm_dec_refcnt_listen()
1255 list_add(&cm_node->reset_entry, &reset_list); in mini_cm_dec_refcnt_listen()
1262 cm_node = container_of(list_pos, struct nes_cm_node, in mini_cm_dec_refcnt_listen()
1265 struct nes_cm_node *loopback = cm_node->loopbackpartner; in mini_cm_dec_refcnt_listen()
1267 if (NES_CM_STATE_FIN_WAIT1 <= cm_node->state) { in mini_cm_dec_refcnt_listen()
1268 rem_ref_cm_node(cm_node->cm_core, cm_node); in mini_cm_dec_refcnt_listen()
1271 cleanup_retrans_entry(cm_node); in mini_cm_dec_refcnt_listen()
1272 err = send_reset(cm_node, NULL); in mini_cm_dec_refcnt_listen()
1274 cm_node->state = in mini_cm_dec_refcnt_listen()
1278 old_state = cm_node->state; in mini_cm_dec_refcnt_listen()
1279 cm_node->state = NES_CM_STATE_LISTENER_DESTROYED; in mini_cm_dec_refcnt_listen()
1282 cm_node->cm_core, in mini_cm_dec_refcnt_listen()
1283 cm_node); in mini_cm_dec_refcnt_listen()
1288 event.cm_node = loopback; in mini_cm_dec_refcnt_listen()
1301 cm_node->state = NES_CM_STATE_LISTENER_DESTROYED; in mini_cm_dec_refcnt_listen()
1303 rem_ref_cm_node(cm_node->cm_core, in mini_cm_dec_refcnt_listen()
1304 cm_node); in mini_cm_dec_refcnt_listen()
1367 struct nes_cm_node *cm_node) in mini_cm_accelerated() argument
1369 cm_node->accelerated = true; in mini_cm_accelerated()
1371 if (cm_node->accept_pend) { in mini_cm_accelerated()
1372 BUG_ON(!cm_node->listener); in mini_cm_accelerated()
1373 atomic_dec(&cm_node->listener->pend_accepts_cnt); in mini_cm_accelerated()
1374 cm_node->accept_pend = 0; in mini_cm_accelerated()
1375 BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0); in mini_cm_accelerated()
1448 struct nes_cm_node *cm_node; in make_cm_node() local
1455 cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC); in make_cm_node()
1456 if (!cm_node) in make_cm_node()
1461 cm_node->loc_addr = listener->loc_addr; in make_cm_node()
1462 cm_node->loc_port = listener->loc_port; in make_cm_node()
1464 cm_node->loc_addr = cm_info->loc_addr; in make_cm_node()
1465 cm_node->loc_port = cm_info->loc_port; in make_cm_node()
1467 cm_node->rem_addr = cm_info->rem_addr; in make_cm_node()
1468 cm_node->rem_port = cm_info->rem_port; in make_cm_node()
1470 cm_node->mpa_frame_rev = mpa_version; in make_cm_node()
1471 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; in make_cm_node()
1472 cm_node->mpav2_ird_ord = 0; in make_cm_node()
1473 cm_node->ird_size = 0; in make_cm_node()
1474 cm_node->ord_size = 0; in make_cm_node()
1477 &cm_node->loc_addr, cm_node->loc_port, in make_cm_node()
1478 &cm_node->rem_addr, cm_node->rem_port); in make_cm_node()
1479 cm_node->listener = listener; in make_cm_node()
1481 cm_node->tos = listener->tos; in make_cm_node()
1482 cm_node->netdev = nesvnic->netdev; in make_cm_node()
1483 cm_node->cm_id = cm_info->cm_id; in make_cm_node()
1484 memcpy(cm_node->loc_mac, nesvnic->netdev->dev_addr, ETH_ALEN); in make_cm_node()
1486 nes_debug(NES_DBG_CM, "listener=%p, cm_id=%p\n", cm_node->listener, in make_cm_node()
1487 cm_node->cm_id); in make_cm_node()
1489 spin_lock_init(&cm_node->retrans_list_lock); in make_cm_node()
1491 cm_node->loopbackpartner = NULL; in make_cm_node()
1492 atomic_set(&cm_node->ref_count, 1); in make_cm_node()
1494 cm_node->cm_core = cm_core; in make_cm_node()
1495 cm_node->tcp_cntxt.loc_id = NES_CM_DEF_LOCAL_ID; in make_cm_node()
1496 cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE; in make_cm_node()
1497 cm_node->tcp_cntxt.rcv_wnd = NES_CM_DEFAULT_RCV_WND_SCALED >> in make_cm_node()
1499 cm_node->tcp_cntxt.loc_seq_num = secure_tcp_seq(htonl(cm_node->loc_addr), in make_cm_node()
1500 htonl(cm_node->rem_addr), in make_cm_node()
1501 htons(cm_node->loc_port), in make_cm_node()
1502 htons(cm_node->rem_port)); in make_cm_node()
1503 cm_node->tcp_cntxt.mss = nesvnic->max_frame_size - sizeof(struct iphdr) - in make_cm_node()
1505 cm_node->tcp_cntxt.rcv_nxt = 0; in make_cm_node()
1508 cm_node->conn_type = cm_info->conn_type; in make_cm_node()
1509 cm_node->apbvt_set = 0; in make_cm_node()
1510 cm_node->accept_pend = 0; in make_cm_node()
1512 cm_node->nesvnic = nesvnic; in make_cm_node()
1517 cm_node->loopbackpartner = NULL; in make_cm_node()
1520 oldarpindex = nes_arp_table(nesdev, cm_node->rem_addr, in make_cm_node()
1522 arpindex = nes_addr_resolve_neigh(nesvnic, cm_node->rem_addr, in make_cm_node()
1525 kfree(cm_node); in make_cm_node()
1530 memcpy(cm_node->rem_mac, nesadapter->arp_table[arpindex].mac_addr, ETH_ALEN); in make_cm_node()
1532 cm_node->rem_mac); in make_cm_node()
1534 add_hte_node(cm_core, cm_node); in make_cm_node()
1537 return cm_node; in make_cm_node()
1544 static int add_ref_cm_node(struct nes_cm_node *cm_node) in add_ref_cm_node() argument
1546 atomic_inc(&cm_node->ref_count); in add_ref_cm_node()
1555 struct nes_cm_node *cm_node) in rem_ref_cm_node() argument
1560 if (!cm_node) in rem_ref_cm_node()
1563 spin_lock_irqsave(&cm_node->cm_core->ht_lock, flags); in rem_ref_cm_node()
1564 if (atomic_dec_return(&cm_node->ref_count)) { in rem_ref_cm_node()
1565 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in rem_ref_cm_node()
1568 list_del(&cm_node->list); in rem_ref_cm_node()
1570 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags); in rem_ref_cm_node()
1573 if (!cm_node->accelerated && cm_node->accept_pend) { in rem_ref_cm_node()
1574 BUG_ON(!cm_node->listener); in rem_ref_cm_node()
1575 atomic_dec(&cm_node->listener->pend_accepts_cnt); in rem_ref_cm_node()
1576 BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0); in rem_ref_cm_node()
1578 WARN_ON(cm_node->send_entry); in rem_ref_cm_node()
1579 if (cm_node->recv_entry) in rem_ref_cm_node()
1580 handle_recv_entry(cm_node, 0); in rem_ref_cm_node()
1581 if (cm_node->listener) { in rem_ref_cm_node()
1582 mini_cm_dec_refcnt_listen(cm_core, cm_node->listener, 0); in rem_ref_cm_node()
1584 if (cm_node->apbvt_set && cm_node->nesvnic) { in rem_ref_cm_node()
1585 nes_manage_apbvt(cm_node->nesvnic, cm_node->loc_port, in rem_ref_cm_node()
1586 PCI_FUNC(cm_node->nesvnic->nesdev->pcidev->devfn), in rem_ref_cm_node()
1590 cm_node->loc_port); in rem_ref_cm_node()
1595 nesqp = cm_node->nesqp; in rem_ref_cm_node()
1597 nesqp->cm_node = NULL; in rem_ref_cm_node()
1599 cm_node->nesqp = NULL; in rem_ref_cm_node()
1602 kfree(cm_node); in rem_ref_cm_node()
1609 static int process_options(struct nes_cm_node *cm_node, u8 *optionsloc, in process_options() argument
1636 cm_node->tcp_cntxt.mss) in process_options()
1637 cm_node->tcp_cntxt.mss = tmp; in process_options()
1641 cm_node->tcp_cntxt.snd_wscale = in process_options()
1652 cm_node->tcp_cntxt.mss = NES_CM_DEFAULT_MSS; in process_options()
1662 static void handle_fin_pkt(struct nes_cm_node *cm_node) in handle_fin_pkt() argument
1665 "refcnt=%d\n", cm_node, cm_node->state, in handle_fin_pkt()
1666 atomic_read(&cm_node->ref_count)); in handle_fin_pkt()
1667 switch (cm_node->state) { in handle_fin_pkt()
1672 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1673 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1674 cm_node->state = NES_CM_STATE_LAST_ACK; in handle_fin_pkt()
1675 send_fin(cm_node, NULL); in handle_fin_pkt()
1678 create_event(cm_node, NES_CM_EVENT_ABORTED); in handle_fin_pkt()
1679 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1680 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1681 cm_node->state = NES_CM_STATE_CLOSED; in handle_fin_pkt()
1682 add_ref_cm_node(cm_node); in handle_fin_pkt()
1683 send_reset(cm_node, NULL); in handle_fin_pkt()
1686 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1687 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1688 cm_node->state = NES_CM_STATE_CLOSING; in handle_fin_pkt()
1689 send_ack(cm_node, NULL); in handle_fin_pkt()
1695 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1696 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1697 cm_node->state = NES_CM_STATE_TIME_WAIT; in handle_fin_pkt()
1698 send_ack(cm_node, NULL); in handle_fin_pkt()
1699 schedule_nes_timer(cm_node, NULL, NES_TIMER_TYPE_CLOSE, 1, 0); in handle_fin_pkt()
1702 cm_node->tcp_cntxt.rcv_nxt++; in handle_fin_pkt()
1703 cleanup_retrans_entry(cm_node); in handle_fin_pkt()
1704 cm_node->state = NES_CM_STATE_CLOSED; in handle_fin_pkt()
1705 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_fin_pkt()
1710 cm_node, cm_node->state); in handle_fin_pkt()
1716 static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_rst_pkt() argument
1723 " refcnt=%d\n", cm_node, cm_node->state, in handle_rst_pkt()
1724 atomic_read(&cm_node->ref_count)); in handle_rst_pkt()
1725 cleanup_retrans_entry(cm_node); in handle_rst_pkt()
1726 switch (cm_node->state) { in handle_rst_pkt()
1730 "listener=%p state=%d\n", __func__, __LINE__, cm_node, in handle_rst_pkt()
1731 cm_node->listener, cm_node->state); in handle_rst_pkt()
1732 switch (cm_node->mpa_frame_rev) { in handle_rst_pkt()
1734 cm_node->mpa_frame_rev = IETF_MPA_V1; in handle_rst_pkt()
1736 cm_node->state = NES_CM_STATE_SYN_SENT; in handle_rst_pkt()
1737 if (send_syn(cm_node, 0, NULL)) { in handle_rst_pkt()
1738 active_open_err(cm_node, skb, reset); in handle_rst_pkt()
1743 active_open_err(cm_node, skb, reset); in handle_rst_pkt()
1748 atomic_inc(&cm_node->passive_state); in handle_rst_pkt()
1755 passive_open_err(cm_node, skb, reset); in handle_rst_pkt()
1758 active_open_err(cm_node, skb, reset); in handle_rst_pkt()
1766 cm_node->cm_id->rem_ref(cm_node->cm_id); in handle_rst_pkt()
1769 cm_node->state = NES_CM_STATE_CLOSED; in handle_rst_pkt()
1770 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_rst_pkt()
1780 static void handle_rcv_mpa(struct nes_cm_node *cm_node, struct sk_buff *skb) in handle_rcv_mpa() argument
1789 ret = parse_mpa(cm_node, dataloc, &res_type, datasize); in handle_rcv_mpa()
1792 if (cm_node->state == NES_CM_STATE_MPAREQ_SENT) { in handle_rcv_mpa()
1795 __LINE__, cm_node, cm_node->listener, in handle_rcv_mpa()
1796 cm_node->state); in handle_rcv_mpa()
1797 active_open_err(cm_node, skb, 1); in handle_rcv_mpa()
1799 passive_open_err(cm_node, skb, 1); in handle_rcv_mpa()
1804 switch (cm_node->state) { in handle_rcv_mpa()
1811 cm_node->state = NES_CM_STATE_MPAREQ_RCVD; in handle_rcv_mpa()
1813 atomic_set(&cm_node->passive_state, in handle_rcv_mpa()
1817 cleanup_retrans_entry(cm_node); in handle_rcv_mpa()
1820 cm_node->state = NES_CM_STATE_MPAREJ_RCVD; in handle_rcv_mpa()
1823 cm_node->state = NES_CM_STATE_TSA; in handle_rcv_mpa()
1825 send_ack(cm_node, NULL); in handle_rcv_mpa()
1832 create_event(cm_node, type); in handle_rcv_mpa()
1835 static void indicate_pkt_err(struct nes_cm_node *cm_node, struct sk_buff *skb) in indicate_pkt_err() argument
1837 switch (cm_node->state) { in indicate_pkt_err()
1841 "listener=%p state=%d\n", __func__, __LINE__, cm_node, in indicate_pkt_err()
1842 cm_node->listener, cm_node->state); in indicate_pkt_err()
1843 active_open_err(cm_node, skb, 1); in indicate_pkt_err()
1847 passive_open_err(cm_node, skb, 1); in indicate_pkt_err()
1855 static int check_syn(struct nes_cm_node *cm_node, struct tcphdr *tcph, in check_syn() argument
1860 err = ((ntohl(tcph->ack_seq) == cm_node->tcp_cntxt.loc_seq_num)) ? 0 : 1; in check_syn()
1862 active_open_err(cm_node, skb, 1); in check_syn()
1867 static int check_seq(struct nes_cm_node *cm_node, struct tcphdr *tcph, in check_seq() argument
1873 u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num; in check_seq()
1874 u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt; in check_seq()
1879 rcv_wnd = cm_node->tcp_cntxt.rcv_wnd; in check_seq()
1886 "listener=%p state=%d\n", __func__, __LINE__, cm_node, in check_seq()
1887 cm_node->listener, cm_node->state); in check_seq()
1888 indicate_pkt_err(cm_node, skb); in check_seq()
1890 "rcv_nxt=0x%08X rcv_wnd=0x%x\n", cm_node, seq, rcv_nxt, in check_seq()
1901 static void handle_syn_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_syn_pkt() argument
1912 switch (cm_node->state) { in handle_syn_pkt()
1916 active_open_err(cm_node, skb, 1); in handle_syn_pkt()
1920 if (atomic_read(&cm_node->listener->pend_accepts_cnt) > in handle_syn_pkt()
1921 cm_node->listener->backlog) { in handle_syn_pkt()
1925 passive_open_err(cm_node, skb, 0); in handle_syn_pkt()
1928 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, in handle_syn_pkt()
1931 passive_open_err(cm_node, skb, 0); in handle_syn_pkt()
1935 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in handle_syn_pkt()
1936 BUG_ON(cm_node->send_entry); in handle_syn_pkt()
1937 cm_node->accept_pend = 1; in handle_syn_pkt()
1938 atomic_inc(&cm_node->listener->pend_accepts_cnt); in handle_syn_pkt()
1940 cm_node->state = NES_CM_STATE_SYN_RCVD; in handle_syn_pkt()
1941 send_syn(cm_node, 1, skb); in handle_syn_pkt()
1944 cleanup_retrans_entry(cm_node); in handle_syn_pkt()
1945 add_ref_cm_node(cm_node); in handle_syn_pkt()
1946 send_reset(cm_node, skb); in handle_syn_pkt()
1962 static void handle_synack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_synack_pkt() argument
1972 switch (cm_node->state) { in handle_synack_pkt()
1974 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
1976 if (check_syn(cm_node, tcph, skb)) in handle_synack_pkt()
1978 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in handle_synack_pkt()
1980 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 0); in handle_synack_pkt()
1983 cm_node); in handle_synack_pkt()
1986 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
1987 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1; in handle_synack_pkt()
1988 send_mpa_request(cm_node, skb); in handle_synack_pkt()
1989 cm_node->state = NES_CM_STATE_MPAREQ_SENT; in handle_synack_pkt()
1993 passive_open_err(cm_node, skb, 1); in handle_synack_pkt()
1996 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in handle_synack_pkt()
1997 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
1998 cm_node->state = NES_CM_STATE_CLOSED; in handle_synack_pkt()
1999 send_reset(cm_node, skb); in handle_synack_pkt()
2002 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq); in handle_synack_pkt()
2003 cleanup_retrans_entry(cm_node); in handle_synack_pkt()
2004 add_ref_cm_node(cm_node); in handle_synack_pkt()
2005 send_reset(cm_node, skb); in handle_synack_pkt()
2021 static int handle_ack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, in handle_ack_pkt() argument
2031 if (check_seq(cm_node, tcph, skb)) in handle_ack_pkt()
2037 switch (cm_node->state) { in handle_ack_pkt()
2040 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2041 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 1); in handle_ack_pkt()
2044 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in handle_ack_pkt()
2045 cm_node->state = NES_CM_STATE_ESTABLISHED; in handle_ack_pkt()
2047 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in handle_ack_pkt()
2048 handle_rcv_mpa(cm_node, skb); in handle_ack_pkt()
2055 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2057 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in handle_ack_pkt()
2058 handle_rcv_mpa(cm_node, skb); in handle_ack_pkt()
2064 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); in handle_ack_pkt()
2066 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; in handle_ack_pkt()
2067 handle_rcv_mpa(cm_node, skb); in handle_ack_pkt()
2073 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2074 cm_node->state = NES_CM_STATE_CLOSED; in handle_ack_pkt()
2075 send_reset(cm_node, skb); in handle_ack_pkt()
2078 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2079 add_ref_cm_node(cm_node); in handle_ack_pkt()
2080 send_reset(cm_node, skb); in handle_ack_pkt()
2084 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2085 cm_node->state = NES_CM_STATE_CLOSED; in handle_ack_pkt()
2086 cm_node->cm_id->rem_ref(cm_node->cm_id); in handle_ack_pkt()
2087 rem_ref_cm_node(cm_node->cm_core, cm_node); in handle_ack_pkt()
2091 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2093 cm_node->state = NES_CM_STATE_FIN_WAIT2; in handle_ack_pkt()
2101 cleanup_retrans_entry(cm_node); in handle_ack_pkt()
2110 static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph, in handle_tcp_options() argument
2116 if (process_options(cm_node, optionsloc, optionsize, in handle_tcp_options()
2119 __func__, cm_node); in handle_tcp_options()
2121 passive_open_err(cm_node, skb, 1); in handle_tcp_options()
2123 active_open_err(cm_node, skb, 1); in handle_tcp_options()
2128 cm_node->tcp_cntxt.snd_wnd = ntohs(tcph->window) << in handle_tcp_options()
2129 cm_node->tcp_cntxt.snd_wscale; in handle_tcp_options()
2131 if (cm_node->tcp_cntxt.snd_wnd > cm_node->tcp_cntxt.max_snd_wnd) in handle_tcp_options()
2132 cm_node->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.snd_wnd; in handle_tcp_options()
2140 static void active_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb, in active_open_err() argument
2143 cleanup_retrans_entry(cm_node); in active_open_err()
2146 "state=%d\n", cm_node, cm_node->state); in active_open_err()
2147 add_ref_cm_node(cm_node); in active_open_err()
2148 send_reset(cm_node, skb); in active_open_err()
2153 cm_node->state = NES_CM_STATE_CLOSED; in active_open_err()
2154 create_event(cm_node, NES_CM_EVENT_ABORTED); in active_open_err()
2161 static void passive_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb, in passive_open_err() argument
2164 cleanup_retrans_entry(cm_node); in passive_open_err()
2165 cm_node->state = NES_CM_STATE_CLOSED; in passive_open_err()
2168 "cm_node=%p state =%d\n", cm_node, cm_node->state); in passive_open_err()
2169 send_reset(cm_node, skb); in passive_open_err()
2172 rem_ref_cm_node(cm_node->cm_core, cm_node); in passive_open_err()
2180 static void free_retrans_entry(struct nes_cm_node *cm_node) in free_retrans_entry() argument
2184 send_entry = cm_node->send_entry; in free_retrans_entry()
2186 cm_node->send_entry = NULL; in free_retrans_entry()
2189 rem_ref_cm_node(cm_node->cm_core, cm_node); in free_retrans_entry()
2193 static void cleanup_retrans_entry(struct nes_cm_node *cm_node) in cleanup_retrans_entry() argument
2197 spin_lock_irqsave(&cm_node->retrans_list_lock, flags); in cleanup_retrans_entry()
2198 free_retrans_entry(cm_node); in cleanup_retrans_entry()
2199 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); in cleanup_retrans_entry()
2206 static void process_packet(struct nes_cm_node *cm_node, struct sk_buff *skb, in process_packet() argument
2217 "ack=%d rst=%d fin=%d\n", cm_node, cm_node->state, tcph->syn, in process_packet()
2234 handle_syn_pkt(cm_node, skb, tcph); in process_packet()
2237 handle_synack_pkt(cm_node, skb, tcph); in process_packet()
2240 ret = handle_ack_pkt(cm_node, skb, tcph); in process_packet()
2242 handle_fin_pkt(cm_node); in process_packet()
2245 handle_rst_pkt(cm_node, skb, tcph); in process_packet()
2248 if ((fin_set) && (!check_seq(cm_node, tcph, skb))) in process_packet()
2249 handle_fin_pkt(cm_node); in process_packet()
2330 struct nes_cm_node *cm_node; in mini_cm_connect() local
2337 cm_node = make_cm_node(cm_core, nesvnic, cm_info, NULL); in mini_cm_connect()
2338 if (!cm_node) in mini_cm_connect()
2342 cm_node->tcp_cntxt.client = 1; in mini_cm_connect()
2343 cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE; in mini_cm_connect()
2347 cm_node->loc_addr, cm_node->rem_port, in mini_cm_connect()
2350 create_event(cm_node, NES_CM_EVENT_ABORTED); in mini_cm_connect()
2363 rem_ref_cm_node(cm_node->cm_core, cm_node); in mini_cm_connect()
2367 loopbackremotenode->loopbackpartner = cm_node; in mini_cm_connect()
2370 cm_node->loopbackpartner = loopbackremotenode; in mini_cm_connect()
2377 cm_node->state = NES_CM_STATE_TSA; in mini_cm_connect()
2378 cm_node->tcp_cntxt.rcv_nxt = in mini_cm_connect()
2381 cm_node->tcp_cntxt.loc_seq_num; in mini_cm_connect()
2382 cm_node->tcp_cntxt.max_snd_wnd = in mini_cm_connect()
2385 cm_node->tcp_cntxt.rcv_wnd; in mini_cm_connect()
2386 cm_node->tcp_cntxt.snd_wnd = in mini_cm_connect()
2389 cm_node->tcp_cntxt.rcv_wnd; in mini_cm_connect()
2390 cm_node->tcp_cntxt.snd_wscale = in mini_cm_connect()
2393 cm_node->tcp_cntxt.rcv_wscale; in mini_cm_connect()
2397 return cm_node; in mini_cm_connect()
2400 start_buff = &cm_node->mpa_frame_buf[0] + sizeof(struct ietf_mpa_v2); in mini_cm_connect()
2401 cm_node->mpa_frame_size = private_data_len; in mini_cm_connect()
2406 cm_node->state = NES_CM_STATE_SYN_SENT; in mini_cm_connect()
2407 ret = send_syn(cm_node, 0, NULL); in mini_cm_connect()
2413 cm_node->rem_addr, cm_node->rem_port, cm_node, in mini_cm_connect()
2414 cm_node->cm_id); in mini_cm_connect()
2415 rem_ref_cm_node(cm_node->cm_core, cm_node); in mini_cm_connect()
2416 cm_node = NULL; in mini_cm_connect()
2419 if (cm_node) { in mini_cm_connect()
2422 cm_node->rem_addr, cm_node->rem_port, cm_node, in mini_cm_connect()
2423 cm_node->cm_id); in mini_cm_connect()
2426 return cm_node; in mini_cm_connect()
2434 static int mini_cm_accept(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in mini_cm_accept() argument
2443 static int mini_cm_reject(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in mini_cm_reject() argument
2449 struct iw_cm_id *cm_id = cm_node->cm_id; in mini_cm_reject()
2450 struct nes_cm_node *loopback = cm_node->loopbackpartner; in mini_cm_reject()
2453 __func__, cm_node, cm_node->tcp_cntxt.client, cm_node->state); in mini_cm_reject()
2455 if (cm_node->tcp_cntxt.client) in mini_cm_reject()
2457 cleanup_retrans_entry(cm_node); in mini_cm_reject()
2460 passive_state = atomic_add_return(1, &cm_node->passive_state); in mini_cm_reject()
2462 cm_node->state = NES_CM_STATE_CLOSED; in mini_cm_reject()
2463 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2465 if (cm_node->state == NES_CM_STATE_LISTENER_DESTROYED) { in mini_cm_reject()
2466 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2468 ret = send_mpa_reject(cm_node); in mini_cm_reject()
2470 cm_node->state = NES_CM_STATE_CLOSED; in mini_cm_reject()
2471 err = send_reset(cm_node, NULL); in mini_cm_reject()
2480 cm_node->cm_id = NULL; in mini_cm_reject()
2481 if (cm_node->state == NES_CM_STATE_LISTENER_DESTROYED) { in mini_cm_reject()
2482 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2485 event.cm_node = loopback; in mini_cm_reject()
2492 rem_ref_cm_node(cm_core, cm_node); in mini_cm_reject()
2508 static int mini_cm_close(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) in mini_cm_close() argument
2512 if (!cm_core || !cm_node) in mini_cm_close()
2515 switch (cm_node->state) { in mini_cm_close()
2523 cleanup_retrans_entry(cm_node); in mini_cm_close()
2524 send_reset(cm_node, NULL); in mini_cm_close()
2527 cm_node->state = NES_CM_STATE_LAST_ACK; in mini_cm_close()
2528 send_fin(cm_node, NULL); in mini_cm_close()
2538 cleanup_retrans_entry(cm_node); in mini_cm_close()
2539 send_reset(cm_node, NULL); in mini_cm_close()
2546 ret = rem_ref_cm_node(cm_core, cm_node); in mini_cm_close()
2549 if (cm_node->send_entry) in mini_cm_close()
2551 "send_entry=%p\n", cm_node->send_entry); in mini_cm_close()
2552 ret = rem_ref_cm_node(cm_core, cm_node); in mini_cm_close()
2566 struct nes_cm_node *cm_node = NULL; in mini_cm_recv_pkt() local
2594 cm_node = find_node(cm_core, in mini_cm_recv_pkt()
2598 if (!cm_node) { in mini_cm_recv_pkt()
2617 cm_node = make_cm_node(cm_core, nesvnic, &nfo, in mini_cm_recv_pkt()
2619 if (!cm_node) { in mini_cm_recv_pkt()
2628 cm_node->state = NES_CM_STATE_LISTENING; in mini_cm_recv_pkt()
2631 rem_ref_cm_node(cm_core, cm_node); in mini_cm_recv_pkt()
2635 add_ref_cm_node(cm_node); in mini_cm_recv_pkt()
2636 } else if (cm_node->state == NES_CM_STATE_TSA) { in mini_cm_recv_pkt()
2637 if (cm_node->nesqp->pau_mode) in mini_cm_recv_pkt()
2638 nes_queue_mgt_skbs(skb, nesvnic, cm_node->nesqp); in mini_cm_recv_pkt()
2640 rem_ref_cm_node(cm_core, cm_node); in mini_cm_recv_pkt()
2649 process_packet(cm_node, skb, cm_core); in mini_cm_recv_pkt()
2650 rem_ref_cm_node(cm_core, cm_node); in mini_cm_recv_pkt()
2768 static int nes_cm_init_tsa_conn(struct nes_qp *nesqp, struct nes_cm_node *cm_node) in nes_cm_init_tsa_conn() argument
2779 if (cm_node->tcp_cntxt.snd_wscale || cm_node->tcp_cntxt.rcv_wscale) in nes_cm_init_tsa_conn()
2785 cm_node->tos << NES_QPCONTEXT_MISC2_TOS_SHIFT); in nes_cm_init_tsa_conn()
2787 nesqp->nesqp_context->mss |= cpu_to_le32(((u32)cm_node->tcp_cntxt.mss) << 16); in nes_cm_init_tsa_conn()
2793 (cm_node->tcp_cntxt.snd_wscale << NES_QPCONTEXT_PDWSCALE_SND_WSCALE_SHIFT) & in nes_cm_init_tsa_conn()
2797 (cm_node->tcp_cntxt.rcv_wscale << NES_QPCONTEXT_PDWSCALE_RCV_WSCALE_SHIFT) & in nes_cm_init_tsa_conn()
2803 nesqp->nesqp_context->snd_nxt = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2804 nesqp->nesqp_context->snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.snd_wnd); in nes_cm_init_tsa_conn()
2805 nesqp->nesqp_context->rcv_nxt = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in nes_cm_init_tsa_conn()
2806 nesqp->nesqp_context->rcv_wnd = cpu_to_le32(cm_node->tcp_cntxt.rcv_wnd << in nes_cm_init_tsa_conn()
2807 cm_node->tcp_cntxt.rcv_wscale); in nes_cm_init_tsa_conn()
2808 nesqp->nesqp_context->snd_max = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2809 nesqp->nesqp_context->snd_una = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2813 nesqp->nesqp_context->cwnd = cpu_to_le32(2 * cm_node->tcp_cntxt.mss); in nes_cm_init_tsa_conn()
2814 nesqp->nesqp_context->snd_wl1 = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt); in nes_cm_init_tsa_conn()
2815 nesqp->nesqp_context->snd_wl2 = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num); in nes_cm_init_tsa_conn()
2816 nesqp->nesqp_context->max_snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.max_snd_wnd); in nes_cm_init_tsa_conn()
2822 cm_node->tcp_cntxt.mss, le32_to_cpu(nesqp->nesqp_context->pd_index_wscale), in nes_cm_init_tsa_conn()
2830 cm_node->state = NES_CM_STATE_TSA; in nes_cm_init_tsa_conn()
3044 if (nesqp->cm_node) { in nes_disconnect()
3047 g_cm_core->api->close(g_cm_core, nesqp->cm_node); in nes_disconnect()
3064 struct nes_cm_node *cm_node; in nes_accept() local
3095 cm_node = (struct nes_cm_node *)cm_id->provider_data; in nes_accept()
3097 "%s\n", cm_node, nesvnic, nesvnic->netdev, in nes_accept()
3100 if (NES_CM_STATE_LISTENER_DESTROYED == cm_node->state) { in nes_accept()
3101 if (cm_node->loopbackpartner) in nes_accept()
3102 rem_ref_cm_node(cm_node->cm_core, cm_node->loopbackpartner); in nes_accept()
3103 rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_accept()
3107 passive_state = atomic_add_return(1, &cm_node->passive_state); in nes_accept()
3109 rem_ref_cm_node(cm_node->cm_core, cm_node); in nes_accept()
3113 nesqp->cm_node = (void *)cm_node; in nes_accept()
3114 cm_node->nesqp = nesqp; in nes_accept()
3118 nesqp->hwqp.qp_id, cm_node, jiffies, cm_node->listener); in nes_accept()
3136 if (cm_node->mpa_frame_rev == IETF_MPA_V1) in nes_accept()
3139 if (cm_node->mpa_frame_rev == IETF_MPA_V1 || in nes_accept()
3140 cm_node->mpav2_ird_ord == IETF_NO_IRD_ORD) { in nes_accept()
3141 record_ird_ord(cm_node, (u16)conn_param->ird, (u16)conn_param->ord); in nes_accept()
3147 cm_build_mpa_frame(cm_node, start_buff, &buff_len, nesqp->ietf_frame, MPA_KEY_REPLY); in nes_accept()
3164 cm_node); in nes_accept()
3206 cm_node->cm_id = cm_id; in nes_accept()
3212 if (cm_node->state == NES_CM_STATE_TSA) in nes_accept()
3214 cm_node); in nes_accept()
3216 nes_cm_init_tsa_conn(nesqp, cm_node); in nes_accept()
3219 cpu_to_le16(cm_node->loc_port); in nes_accept()
3221 cpu_to_le16(cm_node->rem_port); in nes_accept()
3223 nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->rem_addr); in nes_accept()
3242 cpu_to_le32((u32)cm_node->ord_size); in nes_accept()
3247 nes_quad.SrcIpadr = htonl(cm_node->rem_addr); in nes_accept()
3248 nes_quad.TcpPorts[0] = htons(cm_node->rem_port); in nes_accept()
3249 nes_quad.TcpPorts[1] = htons(cm_node->loc_port); in nes_accept()
3260 cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node); in nes_accept()
3282 cm_event.ird = cm_node->ird_size; in nes_accept()
3283 cm_event.ord = cm_node->ord_size; in nes_accept()
3288 if (cm_node->loopbackpartner) { in nes_accept()
3289 cm_node->loopbackpartner->mpa_frame_size = in nes_accept()
3292 memcpy(cm_node->loopbackpartner->mpa_frame_buf, in nes_accept()
3294 create_event(cm_node->loopbackpartner, NES_CM_EVENT_CONNECTED); in nes_accept()
3309 struct nes_cm_node *cm_node; in nes_reject() local
3315 cm_node = (struct nes_cm_node *)cm_id->provider_data; in nes_reject()
3316 loopback = cm_node->loopbackpartner; in nes_reject()
3317 cm_core = cm_node->cm_core; in nes_reject()
3318 cm_node->cm_id = cm_id; in nes_reject()
3328 start_buff = &cm_node->mpa_frame_buf[0] + sizeof(struct ietf_mpa_v2); in nes_reject()
3329 cm_node->mpa_frame_size = pdata_len; in nes_reject()
3332 return cm_core->api->reject(cm_core, cm_node); in nes_reject()
3346 struct nes_cm_node *cm_node; in nes_connect() local
3406 cm_node = g_cm_core->api->connect(g_cm_core, nesvnic, in nes_connect()
3409 if (!cm_node) { in nes_connect()
3421 record_ird_ord(cm_node, (u16)conn_param->ird, (u16)conn_param->ord); in nes_connect()
3422 if (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO && in nes_connect()
3423 cm_node->ord_size == 0) in nes_connect()
3424 cm_node->ord_size = 1; in nes_connect()
3426 cm_node->apbvt_set = apbvt_set; in nes_connect()
3427 cm_node->tos = cm_id->tos; in nes_connect()
3428 nesqp->cm_node = cm_node; in nes_connect()
3429 cm_node->nesqp = nesqp; in nes_connect()
3442 struct nes_cm_listener *cm_node; in nes_create_listen() local
3470 cm_node = g_cm_core->api->listen(g_cm_core, nesvnic, &cm_info); in nes_create_listen()
3471 if (!cm_node) { in nes_create_listen()
3477 cm_id->provider_data = cm_node; in nes_create_listen()
3478 cm_node->tos = cm_id->tos; in nes_create_listen()
3480 if (!cm_node->reused_node) { in nes_create_listen()
3481 err = nes_manage_apbvt(nesvnic, cm_node->loc_port, in nes_create_listen()
3487 g_cm_core->api->stop_listener(g_cm_core, (void *)cm_node); in nes_create_listen()
3494 cm_id->provider_data = (void *)cm_node; in nes_create_listen()
3571 struct nes_cm_node *cm_node; in cm_event_connected() local
3584 cm_node = event->cm_node; in cm_event_connected()
3585 cm_id = cm_node->cm_id; in cm_event_connected()
3586 nes_debug(NES_DBG_CM, "cm_event_connected - %p - cm_id = %p\n", cm_node, cm_id); in cm_event_connected()
3603 nes_cm_init_tsa_conn(nesqp, cm_node); in cm_event_connected()
3607 cpu_to_le16(cm_node->loc_port); in cm_event_connected()
3609 cpu_to_le16(cm_node->rem_port); in cm_event_connected()
3610 nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->rem_addr); in cm_event_connected()
3626 cpu_to_le32((u32)cm_node->ord_size); in cm_event_connected()
3631 build_rdma0_msg(cm_node, &nesqp); in cm_event_connected()
3640 nes_quad.SrcIpadr = htonl(cm_node->rem_addr); in cm_event_connected()
3641 nes_quad.TcpPorts[0] = htons(cm_node->rem_port); in cm_event_connected()
3642 nes_quad.TcpPorts[1] = htons(cm_node->loc_port); in cm_event_connected()
3653 nesqp->ietf_frame = &cm_node->mpa_frame; in cm_event_connected()
3654 nesqp->private_data_len = (u8)cm_node->mpa_frame_size; in cm_event_connected()
3655 cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node); in cm_event_connected()
3665 cm_event.private_data = (void *)event->cm_node->mpa_frame_buf; in cm_event_connected()
3666 cm_event.private_data_len = (u8)event->cm_node->mpa_frame_size; in cm_event_connected()
3667 cm_event.ird = cm_node->ird_size; in cm_event_connected()
3668 cm_event.ord = cm_node->ord_size; in cm_event_connected()
3698 if (!event->cm_node) in cm_event_connect_error()
3701 cm_id = event->cm_node->cm_id; in cm_event_connect_error()
3705 nes_debug(NES_DBG_CM, "cm_node=%p, cm_id=%p\n", event->cm_node, cm_id); in cm_event_connect_error()
3741 rem_ref_cm_node(event->cm_node->cm_core, event->cm_node); in cm_event_connect_error()
3757 if (!event->cm_node) in cm_event_reset()
3760 if (!event->cm_node->cm_id) in cm_event_reset()
3763 cm_id = event->cm_node->cm_id; in cm_event_reset()
3765 nes_debug(NES_DBG_CM, "%p - cm_id = %p\n", event->cm_node, cm_id); in cm_event_reset()
3790 nes_debug(NES_DBG_CM, "NODE %p Generating CLOSE\n", event->cm_node); in cm_event_reset()
3811 struct nes_cm_node *cm_node; in cm_event_mpa_req() local
3817 cm_node = event->cm_node; in cm_event_mpa_req()
3818 if (!cm_node) in cm_event_mpa_req()
3820 cm_id = cm_node->cm_id; in cm_event_mpa_req()
3824 cm_node, cm_id, jiffies); in cm_event_mpa_req()
3828 cm_event.provider_data = (void *)cm_node; in cm_event_mpa_req()
3837 cm_event.private_data = cm_node->mpa_frame_buf; in cm_event_mpa_req()
3838 cm_event.private_data_len = (u8)cm_node->mpa_frame_size; in cm_event_mpa_req()
3839 if (cm_node->mpa_frame_rev == IETF_MPA_V1) { in cm_event_mpa_req()
3843 cm_event.ird = cm_node->ird_size; in cm_event_mpa_req()
3844 cm_event.ord = cm_node->ord_size; in cm_event_mpa_req()
3859 struct nes_cm_node *cm_node; in cm_event_mpa_reject() local
3866 cm_node = event->cm_node; in cm_event_mpa_reject()
3867 if (!cm_node) in cm_event_mpa_reject()
3869 cm_id = cm_node->cm_id; in cm_event_mpa_reject()
3873 cm_node, cm_id, jiffies); in cm_event_mpa_reject()
3887 cm_event.private_data = cm_node->mpa_frame_buf; in cm_event_mpa_reject()
3888 cm_event.private_data_len = (u8)cm_node->mpa_frame_size; in cm_event_mpa_reject()
3912 atomic_inc(&event->cm_node->cm_core->events_posted); in nes_cm_post_event()
3913 add_ref_cm_node(event->cm_node); in nes_cm_post_event()
3917 event->cm_node, event); in nes_cm_post_event()
3919 queue_work(event->cm_node->cm_core->event_wq, &event->event_work); in nes_cm_post_event()
3937 if ((!event) || (!event->cm_node) || (!event->cm_node->cm_core)) in nes_cm_event_handler()
3940 cm_core = event->cm_node->cm_core; in nes_cm_event_handler()
3948 event->cm_node); in nes_cm_event_handler()
3952 event->cm_node); in nes_cm_event_handler()
3956 if ((!event->cm_node->cm_id) || in nes_cm_event_handler()
3957 (event->cm_node->state != NES_CM_STATE_TSA)) in nes_cm_event_handler()
3963 if ((!event->cm_node->cm_id) || in nes_cm_event_handler()
3964 (event->cm_node->state == NES_CM_STATE_TSA)) in nes_cm_event_handler()
3971 if ((!event->cm_node->cm_id) || in nes_cm_event_handler()
3972 (event->cm_node->state == NES_CM_STATE_TSA)) in nes_cm_event_handler()
3987 rem_ref_cm_node(cm_core, event->cm_node); in nes_cm_event_handler()