···11/*22 * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1
drivers/infiniband/hw/mlx4/main.c
···11/*22 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1
drivers/infiniband/hw/mlx4/mlx4_ib.h
···11/*22 * Copyright (c) 2006, 2007 Cisco Systems. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1
drivers/infiniband/hw/mlx4/mr.c
···11/*22 * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1
drivers/infiniband/hw/mlx4/qp.c
···11/*22 * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1
drivers/infiniband/hw/mlx4/srq.c
···11/*22 * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1
drivers/infiniband/hw/mlx4/user.h
···11/*22 * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
···7474atomic_t cm_accel_dropped_pkts;7575atomic_t cm_resets_recvd;76767777-static inline int mini_cm_accelerated(struct nes_cm_core *, struct nes_cm_node *);7777+static inline int mini_cm_accelerated(struct nes_cm_core *,7878+ struct nes_cm_node *);7879static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *,7979- struct nes_vnic *, struct nes_cm_info *);8080-static int add_ref_cm_node(struct nes_cm_node *);8181-static int rem_ref_cm_node(struct nes_cm_core *, struct nes_cm_node *);8080+ struct nes_vnic *, struct nes_cm_info *);8281static int mini_cm_del_listen(struct nes_cm_core *, struct nes_cm_listener *);8383-static struct sk_buff *form_cm_frame(struct sk_buff *, struct nes_cm_node *,8484- void *, u32, void *, u32, u8);8585-static struct sk_buff *get_free_pkt(struct nes_cm_node *cm_node);8686-8782static struct nes_cm_node *mini_cm_connect(struct nes_cm_core *,8888- struct nes_vnic *,8989- struct ietf_mpa_frame *,9090- struct nes_cm_info *);9191-static int mini_cm_accept(struct nes_cm_core *, struct ietf_mpa_frame *,9292- struct nes_cm_node *);9393-static int mini_cm_reject(struct nes_cm_core *, struct ietf_mpa_frame *,9494- struct nes_cm_node *);8383+ struct nes_vnic *, u16, void *, struct nes_cm_info *);9584static int mini_cm_close(struct nes_cm_core *, struct nes_cm_node *);9696-static int mini_cm_recv_pkt(struct nes_cm_core *, struct nes_vnic *,9797- struct sk_buff *);8585+static int mini_cm_accept(struct nes_cm_core *, struct ietf_mpa_frame *,8686+ struct nes_cm_node *);8787+static int mini_cm_reject(struct nes_cm_core *, struct ietf_mpa_frame *,8888+ struct nes_cm_node *);8989+static void mini_cm_recv_pkt(struct nes_cm_core *, struct nes_vnic *,9090+ struct sk_buff *);9891static int mini_cm_dealloc_core(struct nes_cm_core *);9992static int mini_cm_get(struct nes_cm_core *);10093static int mini_cm_set(struct nes_cm_core *, u32, u32);9494+9595+static struct sk_buff *form_cm_frame(struct sk_buff *, struct nes_cm_node *,9696+ void *, u32, void *, u32, u8);9797+static struct sk_buff *get_free_pkt(struct nes_cm_node *cm_node);9898+static int add_ref_cm_node(struct nes_cm_node *);9999+static int rem_ref_cm_node(struct nes_cm_core *, struct nes_cm_node *);100100+101101static int nes_cm_disconn_true(struct nes_qp *);102102static int nes_cm_post_event(struct nes_cm_event *event);103103static int nes_disconnect(struct nes_qp *nesqp, int abrupt);104104static void nes_disconnect_worker(struct work_struct *work);105105-static int send_ack(struct nes_cm_node *cm_node);105105+106106+static int send_mpa_request(struct nes_cm_node *, struct sk_buff *);107107+static int send_syn(struct nes_cm_node *, u32, struct sk_buff *);108108+static int send_reset(struct nes_cm_node *, struct sk_buff *);109109+static int send_ack(struct nes_cm_node *cm_node, struct sk_buff *skb);106110static int send_fin(struct nes_cm_node *cm_node, struct sk_buff *skb);111111+static void process_packet(struct nes_cm_node *, struct sk_buff *,112112+ struct nes_cm_core *);113113+114114+static void active_open_err(struct nes_cm_node *, struct sk_buff *, int);115115+static void passive_open_err(struct nes_cm_node *, struct sk_buff *, int);116116+static void cleanup_retrans_entry(struct nes_cm_node *);117117+static void handle_rcv_mpa(struct nes_cm_node *, struct sk_buff *,118118+ enum nes_cm_event_type);119119+static void free_retrans_entry(struct nes_cm_node *cm_node);120120+static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph,121121+ struct sk_buff *skb, int optionsize, int passive);122122+123123+/* CM event handler functions */124124+static void cm_event_connected(struct nes_cm_event *);125125+static void cm_event_connect_error(struct nes_cm_event *);126126+static void cm_event_reset(struct nes_cm_event *);127127+static void cm_event_mpa_req(struct nes_cm_event *);128128+129129+static void print_core(struct nes_cm_core *core);107130108131/* External CM API Interface */109132/* instance of function pointers for client API */···181158 event->cm_info.loc_port = cm_node->loc_port;182159 event->cm_info.cm_id = cm_node->cm_id;183160184184- nes_debug(NES_DBG_CM, "Created event=%p, type=%u, dst_addr=%08x[%x],"185185- " src_addr=%08x[%x]\n",186186- event, type,187187- event->cm_info.loc_addr, event->cm_info.loc_port,188188- event->cm_info.rem_addr, event->cm_info.rem_port);161161+ nes_debug(NES_DBG_CM, "cm_node=%p Created event=%p, type=%u, "162162+ "dst_addr=%08x[%x], src_addr=%08x[%x]\n",163163+ cm_node, event, type, event->cm_info.loc_addr,164164+ event->cm_info.loc_port, event->cm_info.rem_addr,165165+ event->cm_info.rem_port);189166190167 nes_cm_post_event(event);191168 return event;···195172/**196173 * send_mpa_request197174 */198198-static int send_mpa_request(struct nes_cm_node *cm_node)175175+static int send_mpa_request(struct nes_cm_node *cm_node, struct sk_buff *skb)199176{200200- struct sk_buff *skb;201177 int ret;202202-203203- skb = get_free_pkt(cm_node);204178 if (!skb) {205205- nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");179179+ nes_debug(NES_DBG_CM, "skb set to NULL\n");206180 return -1;207181 }208182···208188 cm_node->mpa_frame_size, SET_ACK);209189210190 ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0);211211- if (ret < 0) {191191+ if (ret < 0)212192 return ret;213213- }214193215194 return 0;216195}···248229249230250231/**251251- * handle_exception_pkt - process an exception packet.252252- * We have been in a TSA state, and we have now received SW253253- * TCP/IP traffic should be a FIN request or IP pkt with options254254- */255255-static int handle_exception_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb)256256-{257257- int ret = 0;258258- struct tcphdr *tcph = tcp_hdr(skb);259259-260260- /* first check to see if this a FIN pkt */261261- if (tcph->fin) {262262- /* we need to ACK the FIN request */263263- send_ack(cm_node);264264-265265- /* check which side we are (client/server) and set next state accordingly */266266- if (cm_node->tcp_cntxt.client)267267- cm_node->state = NES_CM_STATE_CLOSING;268268- else {269269- /* we are the server side */270270- cm_node->state = NES_CM_STATE_CLOSE_WAIT;271271- /* since this is a self contained CM we don't wait for */272272- /* an APP to close us, just send final FIN immediately */273273- ret = send_fin(cm_node, NULL);274274- cm_node->state = NES_CM_STATE_LAST_ACK;275275- }276276- } else {277277- ret = -EINVAL;278278- }279279-280280- return ret;281281-}282282-283283-284284-/**285232 * form_cm_frame - get a free packet and build empty frame Use286233 * node info to build.287234 */288288-static struct sk_buff *form_cm_frame(struct sk_buff *skb, struct nes_cm_node *cm_node,289289- void *options, u32 optionsize, void *data,290290- u32 datasize, u8 flags)235235+static struct sk_buff *form_cm_frame(struct sk_buff *skb,236236+ struct nes_cm_node *cm_node, void *options, u32 optionsize,237237+ void *data, u32 datasize, u8 flags)291238{292239 struct tcphdr *tcph;293240 struct iphdr *iph;···317332 cm_node->tcp_cntxt.loc_seq_num++;318333 tcph->syn = 1;319334 } else320320- cm_node->tcp_cntxt.loc_seq_num += datasize; /* data (no headers) */335335+ cm_node->tcp_cntxt.loc_seq_num += datasize;321336322322- if (flags & SET_FIN)337337+ if (flags & SET_FIN) {338338+ cm_node->tcp_cntxt.loc_seq_num++;323339 tcph->fin = 1;340340+ }324341325342 if (flags & SET_RST)326343 tcph->rst = 1;···376389 int close_when_complete)377390{378391 unsigned long flags;379379- struct nes_cm_core *cm_core;392392+ struct nes_cm_core *cm_core = cm_node->cm_core;380393 struct nes_timer_entry *new_send;381394 int ret = 0;382395 u32 was_timer_set;···398411 new_send->close_when_complete = close_when_complete;399412400413 if (type == NES_TIMER_TYPE_CLOSE) {401401- new_send->timetosend += (HZ/2); /* TODO: decide on the correct value here */414414+ new_send->timetosend += (HZ/10);402415 spin_lock_irqsave(&cm_node->recv_list_lock, flags);403416 list_add_tail(&new_send->list, &cm_node->recv_list);404417 spin_unlock_irqrestore(&cm_node->recv_list_lock, flags);···407420 if (type == NES_TIMER_TYPE_SEND) {408421 new_send->seq_num = ntohl(tcp_hdr(skb)->seq);409422 atomic_inc(&new_send->skb->users);423423+ spin_lock_irqsave(&cm_node->retrans_list_lock, flags);424424+ cm_node->send_entry = new_send;425425+ add_ref_cm_node(cm_node);426426+ spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);427427+ new_send->timetosend = jiffies + NES_RETRY_TIMEOUT;410428411429 ret = nes_nic_cm_xmit(new_send->skb, cm_node->netdev);412430 if (ret != NETDEV_TX_OK) {413413- nes_debug(NES_DBG_CM, "Error sending packet %p (jiffies = %lu)\n",414414- new_send, jiffies);431431+ nes_debug(NES_DBG_CM, "Error sending packet %p "432432+ "(jiffies = %lu)\n", new_send, jiffies);415433 atomic_dec(&new_send->skb->users);416434 new_send->timetosend = jiffies;417435 } else {418436 cm_packets_sent++;419437 if (!send_retrans) {438438+ cleanup_retrans_entry(cm_node);420439 if (close_when_complete)421421- rem_ref_cm_node(cm_node->cm_core, cm_node);422422- dev_kfree_skb_any(new_send->skb);423423- kfree(new_send);440440+ rem_ref_cm_node(cm_core, cm_node);424441 return ret;425442 }426426- new_send->timetosend = jiffies + NES_RETRY_TIMEOUT;427443 }428428- spin_lock_irqsave(&cm_node->retrans_list_lock, flags);429429- list_add_tail(&new_send->list, &cm_node->retrans_list);430430- spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);431444 }432432- if (type == NES_TIMER_TYPE_RECV) {433433- new_send->seq_num = ntohl(tcp_hdr(skb)->seq);434434- new_send->timetosend = jiffies;435435- spin_lock_irqsave(&cm_node->recv_list_lock, flags);436436- list_add_tail(&new_send->list, &cm_node->recv_list);437437- spin_unlock_irqrestore(&cm_node->recv_list_lock, flags);438438- }439439- cm_core = cm_node->cm_core;440445441446 was_timer_set = timer_pending(&cm_core->tcp_timer);442447···455476 struct list_head *list_node, *list_node_temp;456477 struct nes_cm_core *cm_core = g_cm_core;457478 struct nes_qp *nesqp;458458- struct sk_buff *skb;459479 u32 settimer = 0;460480 int ret = NETDEV_TX_OK;461461- int node_done;481481+ enum nes_cm_node_state last_state;462482463483 spin_lock_irqsave(&cm_core->ht_lock, flags);464484465465- list_for_each_safe(list_node, list_core_temp, &cm_core->connected_nodes) {485485+ list_for_each_safe(list_node, list_core_temp,486486+ &cm_core->connected_nodes) {466487 cm_node = container_of(list_node, struct nes_cm_node, list);467488 add_ref_cm_node(cm_node);468489 spin_unlock_irqrestore(&cm_core->ht_lock, flags);469490 spin_lock_irqsave(&cm_node->recv_list_lock, flags);470470- list_for_each_safe(list_core, list_node_temp, &cm_node->recv_list) {471471- recv_entry = container_of(list_core, struct nes_timer_entry, list);472472- if ((time_after(recv_entry->timetosend, jiffies)) &&473473- (recv_entry->type == NES_TIMER_TYPE_CLOSE)) {474474- if (nexttimeout > recv_entry->timetosend || !settimer) {491491+ list_for_each_safe(list_core, list_node_temp,492492+ &cm_node->recv_list) {493493+ recv_entry = container_of(list_core,494494+ struct nes_timer_entry, list);495495+ if (!recv_entry)496496+ break;497497+ if (time_after(recv_entry->timetosend, jiffies)) {498498+ if (nexttimeout > recv_entry->timetosend ||499499+ !settimer) {475500 nexttimeout = recv_entry->timetosend;476501 settimer = 1;477502 }···484501 list_del(&recv_entry->list);485502 cm_id = cm_node->cm_id;486503 spin_unlock_irqrestore(&cm_node->recv_list_lock, flags);487487- if (recv_entry->type == NES_TIMER_TYPE_CLOSE) {488488- nesqp = (struct nes_qp *)recv_entry->skb;489489- spin_lock_irqsave(&nesqp->lock, qplockflags);490490- if (nesqp->cm_id) {491491- nes_debug(NES_DBG_CM, "QP%u: cm_id = %p, refcount = %d: "492492- "****** HIT A NES_TIMER_TYPE_CLOSE"493493- " with something to do!!! ******\n",494494- nesqp->hwqp.qp_id, cm_id,495495- atomic_read(&nesqp->refcount));496496- nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;497497- nesqp->last_aeq = NES_AEQE_AEID_RESET_SENT;498498- nesqp->ibqp_state = IB_QPS_ERR;499499- spin_unlock_irqrestore(&nesqp->lock, qplockflags);500500- nes_cm_disconn(nesqp);501501- } else {502502- spin_unlock_irqrestore(&nesqp->lock, qplockflags);503503- nes_debug(NES_DBG_CM, "QP%u: cm_id = %p, refcount = %d:"504504- " ****** HIT A NES_TIMER_TYPE_CLOSE"505505- " with nothing to do!!! ******\n",506506- nesqp->hwqp.qp_id, cm_id,507507- atomic_read(&nesqp->refcount));508508- nes_rem_ref(&nesqp->ibqp);509509- }510510- if (cm_id)511511- cm_id->rem_ref(cm_id);504504+ nesqp = (struct nes_qp *)recv_entry->skb;505505+ spin_lock_irqsave(&nesqp->lock, qplockflags);506506+ if (nesqp->cm_id) {507507+ nes_debug(NES_DBG_CM, "QP%u: cm_id = %p, "508508+ "refcount = %d: HIT A "509509+ "NES_TIMER_TYPE_CLOSE with something "510510+ "to do!!!\n", nesqp->hwqp.qp_id, cm_id,511511+ atomic_read(&nesqp->refcount));512512+ nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;513513+ nesqp->last_aeq = NES_AEQE_AEID_RESET_SENT;514514+ nesqp->ibqp_state = IB_QPS_ERR;515515+ spin_unlock_irqrestore(&nesqp->lock,516516+ qplockflags);517517+ nes_cm_disconn(nesqp);518518+ } else {519519+ spin_unlock_irqrestore(&nesqp->lock,520520+ qplockflags);521521+ nes_debug(NES_DBG_CM, "QP%u: cm_id = %p, "522522+ "refcount = %d: HIT A "523523+ "NES_TIMER_TYPE_CLOSE with nothing "524524+ "to do!!!\n", nesqp->hwqp.qp_id, cm_id,525525+ atomic_read(&nesqp->refcount));512526 }527527+ if (cm_id)528528+ cm_id->rem_ref(cm_id);529529+513530 kfree(recv_entry);514531 spin_lock_irqsave(&cm_node->recv_list_lock, flags);515532 }516533 spin_unlock_irqrestore(&cm_node->recv_list_lock, flags);517534518535 spin_lock_irqsave(&cm_node->retrans_list_lock, flags);519519- node_done = 0;520520- list_for_each_safe(list_core, list_node_temp, &cm_node->retrans_list) {521521- if (node_done) {522522- break;523523- }524524- send_entry = container_of(list_core, struct nes_timer_entry, list);536536+ do {537537+ send_entry = cm_node->send_entry;538538+ if (!send_entry)539539+ continue;525540 if (time_after(send_entry->timetosend, jiffies)) {526541 if (cm_node->state != NES_CM_STATE_TSA) {527527- if ((nexttimeout > send_entry->timetosend) || !settimer) {528528- nexttimeout = send_entry->timetosend;542542+ if ((nexttimeout >543543+ send_entry->timetosend) ||544544+ !settimer) {545545+ nexttimeout =546546+ send_entry->timetosend;529547 settimer = 1;548548+ continue;530549 }531531- node_done = 1;532532- continue;533550 } else {534534- list_del(&send_entry->list);535535- skb = send_entry->skb;536536- spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);537537- dev_kfree_skb_any(skb);538538- kfree(send_entry);539539- spin_lock_irqsave(&cm_node->retrans_list_lock, flags);551551+ free_retrans_entry(cm_node);540552 continue;541553 }542554 }543543- if (send_entry->type == NES_TIMER_NODE_CLEANUP) {544544- list_del(&send_entry->list);545545- spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);546546- kfree(send_entry);547547- spin_lock_irqsave(&cm_node->retrans_list_lock, flags);548548- continue;549549- }550550- if ((send_entry->seq_num < cm_node->tcp_cntxt.rem_ack_num) ||551551- (cm_node->state == NES_CM_STATE_TSA) ||552552- (cm_node->state == NES_CM_STATE_CLOSED)) {553553- skb = send_entry->skb;554554- list_del(&send_entry->list);555555- spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);556556- kfree(send_entry);557557- dev_kfree_skb_any(skb);558558- spin_lock_irqsave(&cm_node->retrans_list_lock, flags);555555+556556+ if ((cm_node->state == NES_CM_STATE_TSA) ||557557+ (cm_node->state == NES_CM_STATE_CLOSED)) {558558+ free_retrans_entry(cm_node);559559 continue;560560 }561561562562- if (!send_entry->retranscount || !send_entry->retrycount) {562562+ if (!send_entry->retranscount ||563563+ !send_entry->retrycount) {563564 cm_packets_dropped++;564564- skb = send_entry->skb;565565- list_del(&send_entry->list);566566- spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);567567- dev_kfree_skb_any(skb);568568- kfree(send_entry);569569- if (cm_node->state == NES_CM_STATE_SYN_RCVD) {570570- /* this node never even generated an indication up to the cm */565565+ last_state = cm_node->state;566566+ cm_node->state = NES_CM_STATE_CLOSED;567567+ free_retrans_entry(cm_node);568568+ spin_unlock_irqrestore(569569+ &cm_node->retrans_list_lock, flags);570570+ if (last_state == NES_CM_STATE_SYN_RCVD)571571 rem_ref_cm_node(cm_core, cm_node);572572- } else {573573- cm_node->state = NES_CM_STATE_CLOSED;574574- create_event(cm_node, NES_CM_EVENT_ABORTED);575575- }576576- spin_lock_irqsave(&cm_node->retrans_list_lock, flags);572572+ else573573+ create_event(cm_node,574574+ NES_CM_EVENT_ABORTED);575575+ spin_lock_irqsave(&cm_node->retrans_list_lock,576576+ flags);577577 continue;578578 }579579- /* this seems like the correct place, but leave send entry unprotected */580580- /* spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); */581579 atomic_inc(&send_entry->skb->users);582580 cm_packets_retrans++;583583- nes_debug(NES_DBG_CM, "Retransmitting send_entry %p for node %p,"584584- " jiffies = %lu, time to send = %lu, retranscount = %u, "585585- "send_entry->seq_num = 0x%08X, cm_node->tcp_cntxt.rem_ack_num = 0x%08X\n",586586- send_entry, cm_node, jiffies, send_entry->timetosend, send_entry->retranscount,587587- send_entry->seq_num, cm_node->tcp_cntxt.rem_ack_num);581581+ nes_debug(NES_DBG_CM, "Retransmitting send_entry %p "582582+ "for node %p, jiffies = %lu, time to send = "583583+ "%lu, retranscount = %u, send_entry->seq_num = "584584+ "0x%08X, cm_node->tcp_cntxt.rem_ack_num = "585585+ "0x%08X\n", send_entry, cm_node, jiffies,586586+ send_entry->timetosend,587587+ send_entry->retranscount,588588+ send_entry->seq_num,589589+ cm_node->tcp_cntxt.rem_ack_num);588590589589- spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);591591+ spin_unlock_irqrestore(&cm_node->retrans_list_lock,592592+ flags);590593 ret = nes_nic_cm_xmit(send_entry->skb, cm_node->netdev);594594+ spin_lock_irqsave(&cm_node->retrans_list_lock, flags);591595 if (ret != NETDEV_TX_OK) {596596+ nes_debug(NES_DBG_CM, "rexmit failed for "597597+ "node=%p\n", cm_node);592598 cm_packets_bounced++;593599 atomic_dec(&send_entry->skb->users);594600 send_entry->retrycount--;595601 nexttimeout = jiffies + NES_SHORT_TIME;596602 settimer = 1;597597- node_done = 1;598598- spin_lock_irqsave(&cm_node->retrans_list_lock, flags);599603 continue;600604 } else {601605 cm_packets_sent++;602606 }603603- spin_lock_irqsave(&cm_node->retrans_list_lock, flags);604604- list_del(&send_entry->list);605605- nes_debug(NES_DBG_CM, "Packet Sent: retrans count = %u, retry count = %u.\n",606606- send_entry->retranscount, send_entry->retrycount);607607+ nes_debug(NES_DBG_CM, "Packet Sent: retrans count = "608608+ "%u, retry count = %u.\n",609609+ send_entry->retranscount,610610+ send_entry->retrycount);607611 if (send_entry->send_retrans) {608612 send_entry->retranscount--;609609- send_entry->timetosend = jiffies + NES_RETRY_TIMEOUT;610610- if (nexttimeout > send_entry->timetosend || !settimer) {613613+ send_entry->timetosend = jiffies +614614+ NES_RETRY_TIMEOUT;615615+ if (nexttimeout > send_entry->timetosend ||616616+ !settimer) {611617 nexttimeout = send_entry->timetosend;612618 settimer = 1;613619 }614614- list_add(&send_entry->list, &cm_node->retrans_list);615615- continue;616620 } else {617621 int close_when_complete;618618- skb = send_entry->skb;619619- close_when_complete = send_entry->close_when_complete;620620- spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);621621- if (close_when_complete) {622622- BUG_ON(atomic_read(&cm_node->ref_count) == 1);623623- rem_ref_cm_node(cm_core, cm_node);624624- }625625- dev_kfree_skb_any(skb);626626- kfree(send_entry);627627- spin_lock_irqsave(&cm_node->retrans_list_lock, flags);628628- continue;622622+ close_when_complete =623623+ send_entry->close_when_complete;624624+ nes_debug(NES_DBG_CM, "cm_node=%p state=%d\n",625625+ cm_node, cm_node->state);626626+ free_retrans_entry(cm_node);627627+ if (close_when_complete)628628+ rem_ref_cm_node(cm_node->cm_core,629629+ cm_node);629630 }630630- }631631+ } while (0);632632+631633 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);632632-633633- rem_ref_cm_node(cm_core, cm_node);634634-634634+ rem_ref_cm_node(cm_node->cm_core, cm_node);635635 spin_lock_irqsave(&cm_core->ht_lock, flags);636636- if (ret != NETDEV_TX_OK)636636+ if (ret != NETDEV_TX_OK) {637637+ nes_debug(NES_DBG_CM, "rexmit failed for cm_node=%p\n",638638+ cm_node);637639 break;640640+ }638641 }639642 spin_unlock_irqrestore(&cm_core->ht_lock, flags);640643···636667/**637668 * send_syn638669 */639639-static int send_syn(struct nes_cm_node *cm_node, u32 sendack)670670+static int send_syn(struct nes_cm_node *cm_node, u32 sendack,671671+ struct sk_buff *skb)640672{641673 int ret;642674 int flags = SET_SYN;643643- struct sk_buff *skb;644675 char optionsbuffer[sizeof(struct option_mss) +645645- sizeof(struct option_windowscale) +646646- sizeof(struct option_base) + 1];676676+ sizeof(struct option_windowscale) + sizeof(struct option_base) +677677+ TCP_OPTIONS_PADDING];647678648679 int optionssize = 0;649680 /* Sending MSS option */···664695 options->as_windowscale.shiftcount = cm_node->tcp_cntxt.rcv_wscale;665696 optionssize += sizeof(struct option_windowscale);666697667667- if (sendack && !(NES_DRV_OPT_SUPRESS_OPTION_BC & nes_drv_opt)668668- ) {698698+ if (sendack && !(NES_DRV_OPT_SUPRESS_OPTION_BC & nes_drv_opt)) {669699 options = (union all_known_options *)&optionsbuffer[optionssize];670700 options->as_base.optionnum = OPTION_NUMBER_WRITE0;671701 options->as_base.length = sizeof(struct option_base);···682714 options->as_end = OPTION_NUMBER_END;683715 optionssize += 1;684716685685- skb = get_free_pkt(cm_node);717717+ if (!skb)718718+ skb = get_free_pkt(cm_node);686719 if (!skb) {687720 nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");688721 return -1;···702733/**703734 * send_reset704735 */705705-static int send_reset(struct nes_cm_node *cm_node)736736+static int send_reset(struct nes_cm_node *cm_node, struct sk_buff *skb)706737{707738 int ret;708708- struct sk_buff *skb = get_free_pkt(cm_node);709739 int flags = SET_RST | SET_ACK;710740741741+ if (!skb)742742+ skb = get_free_pkt(cm_node);711743 if (!skb) {712744 nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");713745 return -1;714746 }715747716716- add_ref_cm_node(cm_node);717748 form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, flags);718749 ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 0, 1);719750···724755/**725756 * send_ack726757 */727727-static int send_ack(struct nes_cm_node *cm_node)758758+static int send_ack(struct nes_cm_node *cm_node, struct sk_buff *skb)728759{729760 int ret;730730- struct sk_buff *skb = get_free_pkt(cm_node);761761+762762+ if (!skb)763763+ skb = get_free_pkt(cm_node);731764732765 if (!skb) {733766 nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");···893922 if (!cm_node || !cm_core)894923 return -EINVAL;895924896896- nes_debug(NES_DBG_CM, "Adding Node to Active Connection HT\n");925925+ nes_debug(NES_DBG_CM, "Adding Node %p to Active Connection HT\n",926926+ cm_node);897927898928 /* first, make an index into our hash table */899929 hashkey = make_hashkey(cm_node->loc_port, cm_node->loc_addr,···918946 * mini_cm_dec_refcnt_listen919947 */920948static int mini_cm_dec_refcnt_listen(struct nes_cm_core *cm_core,921921- struct nes_cm_listener *listener, int free_hanging_nodes)949949+ struct nes_cm_listener *listener, int free_hanging_nodes)922950{923951 int ret = 1;924952 unsigned long flags;953953+ struct list_head *list_pos = NULL;954954+ struct list_head *list_temp = NULL;955955+ struct nes_cm_node *cm_node = NULL;956956+957957+ nes_debug(NES_DBG_CM, "attempting listener= %p free_nodes= %d, "958958+ "refcnt=%d\n", listener, free_hanging_nodes,959959+ atomic_read(&listener->ref_count));960960+ /* free non-accelerated child nodes for this listener */961961+ if (free_hanging_nodes) {962962+ spin_lock_irqsave(&cm_core->ht_lock, flags);963963+ list_for_each_safe(list_pos, list_temp,964964+ &g_cm_core->connected_nodes) {965965+ cm_node = container_of(list_pos, struct nes_cm_node,966966+ list);967967+ if ((cm_node->listener == listener) &&968968+ (!cm_node->accelerated)) {969969+ cleanup_retrans_entry(cm_node);970970+ spin_unlock_irqrestore(&cm_core->ht_lock,971971+ flags);972972+ send_reset(cm_node, NULL);973973+ spin_lock_irqsave(&cm_core->ht_lock, flags);974974+ }975975+ }976976+ spin_unlock_irqrestore(&cm_core->ht_lock, flags);977977+ }925978 spin_lock_irqsave(&cm_core->listen_list_lock, flags);926979 if (!atomic_dec_return(&listener->ref_count)) {927980 list_del(&listener->list);···10641067 cm_node->loc_port = cm_info->loc_port;10651068 cm_node->rem_port = cm_info->rem_port;10661069 cm_node->send_write0 = send_first;10671067- nes_debug(NES_DBG_CM, "Make node addresses : loc = " NIPQUAD_FMT ":%x, rem = " NIPQUAD_FMT ":%x\n",10681068- HIPQUAD(cm_node->loc_addr), cm_node->loc_port,10691069- HIPQUAD(cm_node->rem_addr), cm_node->rem_port);10701070+ nes_debug(NES_DBG_CM, "Make node addresses : loc = " NIPQUAD_FMT10711071+ ":%x, rem = " NIPQUAD_FMT ":%x\n",10721072+ HIPQUAD(cm_node->loc_addr), cm_node->loc_port,10731073+ HIPQUAD(cm_node->rem_addr), cm_node->rem_port);10701074 cm_node->listener = listener;10711075 cm_node->netdev = nesvnic->netdev;10721076 cm_node->cm_id = cm_info->cm_id;10731077 memcpy(cm_node->loc_mac, nesvnic->netdev->dev_addr, ETH_ALEN);1074107810751075- nes_debug(NES_DBG_CM, "listener=%p, cm_id=%p\n",10761076- cm_node->listener, cm_node->cm_id);10791079+ nes_debug(NES_DBG_CM, "listener=%p, cm_id=%p\n", cm_node->listener,10801080+ cm_node->cm_id);1077108110781078- INIT_LIST_HEAD(&cm_node->retrans_list);10791082 spin_lock_init(&cm_node->retrans_list_lock);10801083 INIT_LIST_HEAD(&cm_node->recv_list);10811084 spin_lock_init(&cm_node->recv_list_lock);···11391142 * rem_ref_cm_node - destroy an instance of a cm node11401143 */11411144static int rem_ref_cm_node(struct nes_cm_core *cm_core,11421142- struct nes_cm_node *cm_node)11451145+ struct nes_cm_node *cm_node)11431146{11441147 unsigned long flags, qplockflags;11451145- struct nes_timer_entry *send_entry;11461148 struct nes_timer_entry *recv_entry;11471149 struct iw_cm_id *cm_id;11481150 struct list_head *list_core, *list_node_temp;···11651169 atomic_dec(&cm_node->listener->pend_accepts_cnt);11661170 BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0);11671171 }11681168-11691169- spin_lock_irqsave(&cm_node->retrans_list_lock, flags);11701170- list_for_each_safe(list_core, list_node_temp, &cm_node->retrans_list) {11711171- send_entry = container_of(list_core, struct nes_timer_entry, list);11721172- list_del(&send_entry->list);11731173- spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);11741174- dev_kfree_skb_any(send_entry->skb);11751175- kfree(send_entry);11761176- spin_lock_irqsave(&cm_node->retrans_list_lock, flags);11771177- continue;11781178- }11791179- spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);11801180-11721172+ BUG_ON(cm_node->send_entry);11811173 spin_lock_irqsave(&cm_node->recv_list_lock, flags);11821174 list_for_each_safe(list_core, list_node_temp, &cm_node->recv_list) {11831183- recv_entry = container_of(list_core, struct nes_timer_entry, list);11751175+ recv_entry = container_of(list_core, struct nes_timer_entry,11761176+ list);11841177 list_del(&recv_entry->list);11851178 cm_id = cm_node->cm_id;11861179 spin_unlock_irqrestore(&cm_node->recv_list_lock, flags);11871187- if (recv_entry->type == NES_TIMER_TYPE_CLOSE) {11881188- nesqp = (struct nes_qp *)recv_entry->skb;11891189- spin_lock_irqsave(&nesqp->lock, qplockflags);11901190- if (nesqp->cm_id) {11911191- nes_debug(NES_DBG_CM, "QP%u: cm_id = %p: ****** HIT A NES_TIMER_TYPE_CLOSE"11921192- " with something to do!!! ******\n",11931193- nesqp->hwqp.qp_id, cm_id);11941194- nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;11951195- nesqp->last_aeq = NES_AEQE_AEID_RESET_SENT;11961196- nesqp->ibqp_state = IB_QPS_ERR;11971197- spin_unlock_irqrestore(&nesqp->lock, qplockflags);11981198- nes_cm_disconn(nesqp);11991199- } else {12001200- spin_unlock_irqrestore(&nesqp->lock, qplockflags);12011201- nes_debug(NES_DBG_CM, "QP%u: cm_id = %p: ****** HIT A NES_TIMER_TYPE_CLOSE"12021202- " with nothing to do!!! ******\n",12031203- nesqp->hwqp.qp_id, cm_id);12041204- nes_rem_ref(&nesqp->ibqp);12051205- }12061206- cm_id->rem_ref(cm_id);12071207- } else if (recv_entry->type == NES_TIMER_TYPE_RECV) {12081208- dev_kfree_skb_any(recv_entry->skb);11801180+ nesqp = (struct nes_qp *)recv_entry->skb;11811181+ spin_lock_irqsave(&nesqp->lock, qplockflags);11821182+ if (nesqp->cm_id) {11831183+ nes_debug(NES_DBG_CM, "QP%u: cm_id = %p: HIT A "11841184+ "NES_TIMER_TYPE_CLOSE with something to do!\n",11851185+ nesqp->hwqp.qp_id, cm_id);11861186+ nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;11871187+ nesqp->last_aeq = NES_AEQE_AEID_RESET_SENT;11881188+ nesqp->ibqp_state = IB_QPS_ERR;11891189+ spin_unlock_irqrestore(&nesqp->lock, qplockflags);11901190+ nes_cm_disconn(nesqp);11911191+ } else {11921192+ spin_unlock_irqrestore(&nesqp->lock, qplockflags);11931193+ nes_debug(NES_DBG_CM, "QP%u: cm_id = %p: HIT A "11941194+ "NES_TIMER_TYPE_CLOSE with nothing to do!\n",11951195+ nesqp->hwqp.qp_id, cm_id);12091196 }11971197+ cm_id->rem_ref(cm_id);11981198+12101199 kfree(recv_entry);12111200 spin_lock_irqsave(&cm_node->recv_list_lock, flags);12121201 }···12021221 } else {12031222 if (cm_node->apbvt_set && cm_node->nesvnic) {12041223 nes_manage_apbvt(cm_node->nesvnic, cm_node->loc_port,12051205- PCI_FUNC(cm_node->nesvnic->nesdev->pcidev->devfn),12061206- NES_MANAGE_APBVT_DEL);12241224+ PCI_FUNC(12251225+ cm_node->nesvnic->nesdev->pcidev->devfn),12261226+ NES_MANAGE_APBVT_DEL);12071227 }12081228 }1209122912101210- kfree(cm_node);12111230 atomic_dec(&cm_core->node_cnt);12121231 atomic_inc(&cm_nodes_destroyed);12321232+ nesqp = cm_node->nesqp;12331233+ if (nesqp) {12341234+ nesqp->cm_node = NULL;12351235+ nes_rem_ref(&nesqp->ibqp);12361236+ cm_node->nesqp = NULL;12371237+ }1213123812391239+ cm_node->freed = 1;12401240+ kfree(cm_node);12141241 return 0;12151242}12161216-1217124312181244/**12191245 * process_options12201246 */12211221-static int process_options(struct nes_cm_node *cm_node, u8 *optionsloc, u32 optionsize, u32 syn_packet)12471247+static int process_options(struct nes_cm_node *cm_node, u8 *optionsloc,12481248+ u32 optionsize, u32 syn_packet)12221249{12231250 u32 tmp;12241251 u32 offset = 0;···12361247 while (offset < optionsize) {12371248 all_options = (union all_known_options *)(optionsloc + offset);12381249 switch (all_options->as_base.optionnum) {12391239- case OPTION_NUMBER_END:12401240- offset = optionsize;12411241- break;12421242- case OPTION_NUMBER_NONE:12431243- offset += 1;12441244- continue;12451245- case OPTION_NUMBER_MSS:12461246- nes_debug(NES_DBG_CM, "%s: MSS Length: %d Offset: %d Size: %d\n",12471247- __func__,12481248- all_options->as_mss.length, offset, optionsize);12491249- got_mss_option = 1;12501250- if (all_options->as_mss.length != 4) {12511251- return 1;12521252- } else {12531253- tmp = ntohs(all_options->as_mss.mss);12541254- if (tmp > 0 && tmp < cm_node->tcp_cntxt.mss)12551255- cm_node->tcp_cntxt.mss = tmp;12561256- }12571257- break;12581258- case OPTION_NUMBER_WINDOW_SCALE:12591259- cm_node->tcp_cntxt.snd_wscale = all_options->as_windowscale.shiftcount;12601260- break;12611261- case OPTION_NUMBER_WRITE0:12621262- cm_node->send_write0 = 1;12631263- break;12641264- default:12651265- nes_debug(NES_DBG_CM, "TCP Option not understood: %x\n",12661266- all_options->as_base.optionnum);12671267- break;12501250+ case OPTION_NUMBER_END:12511251+ offset = optionsize;12521252+ break;12531253+ case OPTION_NUMBER_NONE:12541254+ offset += 1;12551255+ continue;12561256+ case OPTION_NUMBER_MSS:12571257+ nes_debug(NES_DBG_CM, "%s: MSS Length: %d Offset: %d "12581258+ "Size: %d\n", __func__,12591259+ all_options->as_mss.length, offset, optionsize);12601260+ got_mss_option = 1;12611261+ if (all_options->as_mss.length != 4) {12621262+ return 1;12631263+ } else {12641264+ tmp = ntohs(all_options->as_mss.mss);12651265+ if (tmp > 0 && tmp <12661266+ cm_node->tcp_cntxt.mss)12671267+ cm_node->tcp_cntxt.mss = tmp;12681268+ }12691269+ break;12701270+ case OPTION_NUMBER_WINDOW_SCALE:12711271+ cm_node->tcp_cntxt.snd_wscale =12721272+ all_options->as_windowscale.shiftcount;12731273+ break;12741274+ case OPTION_NUMBER_WRITE0:12751275+ cm_node->send_write0 = 1;12761276+ break;12771277+ default:12781278+ nes_debug(NES_DBG_CM, "TCP Option not understood: %x\n",12791279+ all_options->as_base.optionnum);12801280+ break;12681281 }12691282 offset += all_options->as_base.length;12701283 }···12751284 return 0;12761285}1277128612781278-12791279-/**12801280- * process_packet12811281- */12821282-static int process_packet(struct nes_cm_node *cm_node, struct sk_buff *skb,12831283- struct nes_cm_core *cm_core)12871287+static void drop_packet(struct sk_buff *skb)12841288{12851285- int optionsize;12861286- int datasize;12871287- int ret = 0;12881288- struct tcphdr *tcph = tcp_hdr(skb);12891289- u32 inc_sequence;12901290- if (cm_node->state == NES_CM_STATE_SYN_SENT && tcph->syn) {12911291- inc_sequence = ntohl(tcph->seq);12921292- cm_node->tcp_cntxt.rcv_nxt = inc_sequence;12891289+ atomic_inc(&cm_accel_dropped_pkts);12901290+ dev_kfree_skb_any(skb);12911291+}12921292+12931293+static void handle_fin_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,12941294+ struct tcphdr *tcph)12951295+{12961296+ atomic_inc(&cm_resets_recvd);12971297+ nes_debug(NES_DBG_CM, "Received FIN, cm_node = %p, state = %u. "12981298+ "refcnt=%d\n", cm_node, cm_node->state,12991299+ atomic_read(&cm_node->ref_count));13001300+ cm_node->tcp_cntxt.rcv_nxt++;13011301+ cleanup_retrans_entry(cm_node);13021302+ switch (cm_node->state) {13031303+ case NES_CM_STATE_SYN_RCVD:13041304+ case NES_CM_STATE_SYN_SENT:13051305+ case NES_CM_STATE_ESTABLISHED:13061306+ case NES_CM_STATE_MPAREQ_SENT:13071307+ cm_node->state = NES_CM_STATE_LAST_ACK;13081308+ send_fin(cm_node, skb);13091309+ break;13101310+ case NES_CM_STATE_FIN_WAIT1:13111311+ cm_node->state = NES_CM_STATE_CLOSING;13121312+ send_ack(cm_node, skb);13131313+ break;13141314+ case NES_CM_STATE_FIN_WAIT2:13151315+ cm_node->state = NES_CM_STATE_TIME_WAIT;13161316+ send_ack(cm_node, skb);13171317+ cm_node->state = NES_CM_STATE_CLOSED;13181318+ break;13191319+ case NES_CM_STATE_TSA:13201320+ default:13211321+ nes_debug(NES_DBG_CM, "Error Rcvd FIN for node-%p state = %d\n",13221322+ cm_node, cm_node->state);13231323+ drop_packet(skb);13241324+ break;12931325 }13261326+}1294132712951295- if ((!tcph) || (cm_node->state == NES_CM_STATE_TSA)) {12961296- BUG_ON(!tcph);12971297- atomic_inc(&cm_accel_dropped_pkts);12981298- return -1;13281328+13291329+static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,13301330+ struct tcphdr *tcph)13311331+{13321332+13331333+ int reset = 0; /* whether to send reset in case of err.. */13341334+ atomic_inc(&cm_resets_recvd);13351335+ nes_debug(NES_DBG_CM, "Received Reset, cm_node = %p, state = %u."13361336+ " refcnt=%d\n", cm_node, cm_node->state,13371337+ atomic_read(&cm_node->ref_count));13381338+ cleanup_retrans_entry(cm_node);13391339+ switch (cm_node->state) {13401340+ case NES_CM_STATE_SYN_SENT:13411341+ case NES_CM_STATE_MPAREQ_SENT:13421342+ nes_debug(NES_DBG_CM, "%s[%u] create abort for cm_node=%p "13431343+ "listener=%p state=%d\n", __func__, __LINE__, cm_node,13441344+ cm_node->listener, cm_node->state);13451345+ active_open_err(cm_node, skb, reset);13461346+ break;13471347+ /* For PASSIVE open states, remove the cm_node event */13481348+ case NES_CM_STATE_ESTABLISHED:13491349+ case NES_CM_STATE_SYN_RCVD:13501350+ case NES_CM_STATE_LISTENING:13511351+ nes_debug(NES_DBG_CM, "Bad state %s[%u]\n", __func__, __LINE__);13521352+ passive_open_err(cm_node, skb, reset);13531353+ break;13541354+ case NES_CM_STATE_TSA:13551355+ default:13561356+ break;12991357 }13581358+}1300135913011301- if (tcph->rst) {13021302- atomic_inc(&cm_resets_recvd);13031303- nes_debug(NES_DBG_CM, "Received Reset, cm_node = %p, state = %u. refcnt=%d\n",13041304- cm_node, cm_node->state, atomic_read(&cm_node->ref_count));13051305- switch (cm_node->state) {13061306- case NES_CM_STATE_LISTENING:13071307- rem_ref_cm_node(cm_core, cm_node);13081308- break;13091309- case NES_CM_STATE_TSA:13101310- case NES_CM_STATE_CLOSED:13111311- break;13121312- case NES_CM_STATE_SYN_RCVD:13131313- nes_debug(NES_DBG_CM, "Received a reset for local 0x%08X:%04X,"13141314- " remote 0x%08X:%04X, node state = %u\n",13151315- cm_node->loc_addr, cm_node->loc_port,13161316- cm_node->rem_addr, cm_node->rem_port,13171317- cm_node->state);13181318- rem_ref_cm_node(cm_core, cm_node);13191319- break;13201320- case NES_CM_STATE_ONE_SIDE_ESTABLISHED:13211321- case NES_CM_STATE_ESTABLISHED:13221322- case NES_CM_STATE_MPAREQ_SENT:13231323- default:13241324- nes_debug(NES_DBG_CM, "Received a reset for local 0x%08X:%04X,"13251325- " remote 0x%08X:%04X, node state = %u refcnt=%d\n",13261326- cm_node->loc_addr, cm_node->loc_port,13271327- cm_node->rem_addr, cm_node->rem_port,13281328- cm_node->state, atomic_read(&cm_node->ref_count));13291329- /* create event */13301330- cm_node->state = NES_CM_STATE_CLOSED;13601360+static void handle_rcv_mpa(struct nes_cm_node *cm_node, struct sk_buff *skb,13611361+ enum nes_cm_event_type type)13621362+{1331136313321332- create_event(cm_node, NES_CM_EVENT_ABORTED);13331333- break;13341334-13641364+ int ret;13651365+ int datasize = skb->len;13661366+ u8 *dataloc = skb->data;13671367+ ret = parse_mpa(cm_node, dataloc, datasize);13681368+ if (ret < 0) {13691369+ nes_debug(NES_DBG_CM, "didn't like MPA Request\n");13701370+ if (type == NES_CM_EVENT_CONNECTED) {13711371+ nes_debug(NES_DBG_CM, "%s[%u] create abort for "13721372+ "cm_node=%p listener=%p state=%d\n", __func__,13731373+ __LINE__, cm_node, cm_node->listener,13741374+ cm_node->state);13751375+ active_open_err(cm_node, skb, 1);13761376+ } else {13771377+ passive_open_err(cm_node, skb, 1);13351378 }13361336- return -1;13791379+ } else {13801380+ cleanup_retrans_entry(cm_node);13811381+ dev_kfree_skb_any(skb);13821382+ if (type == NES_CM_EVENT_CONNECTED)13831383+ cm_node->state = NES_CM_STATE_TSA;13841384+ create_event(cm_node, type);13851385+13371386 }13871387+ return ;13881388+}13891389+13901390+static void indicate_pkt_err(struct nes_cm_node *cm_node, struct sk_buff *skb)13911391+{13921392+ switch (cm_node->state) {13931393+ case NES_CM_STATE_SYN_SENT:13941394+ case NES_CM_STATE_MPAREQ_SENT:13951395+ nes_debug(NES_DBG_CM, "%s[%u] create abort for cm_node=%p "13961396+ "listener=%p state=%d\n", __func__, __LINE__, cm_node,13971397+ cm_node->listener, cm_node->state);13981398+ active_open_err(cm_node, skb, 1);13991399+ break;14001400+ case NES_CM_STATE_ESTABLISHED:14011401+ case NES_CM_STATE_SYN_RCVD:14021402+ passive_open_err(cm_node, skb, 1);14031403+ break;14041404+ case NES_CM_STATE_TSA:14051405+ default:14061406+ drop_packet(skb);14071407+ }14081408+}14091409+14101410+static int check_syn(struct nes_cm_node *cm_node, struct tcphdr *tcph,14111411+ struct sk_buff *skb)14121412+{14131413+ int err;14141414+14151415+ err = ((ntohl(tcph->ack_seq) == cm_node->tcp_cntxt.loc_seq_num))? 0 : 1;14161416+ if (err)14171417+ active_open_err(cm_node, skb, 1);14181418+14191419+ return err;14201420+}14211421+14221422+static int check_seq(struct nes_cm_node *cm_node, struct tcphdr *tcph,14231423+ struct sk_buff *skb)14241424+{14251425+ int err = 0;14261426+ u32 seq;14271427+ u32 ack_seq;14281428+ u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num;14291429+ u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt;14301430+ u32 rcv_wnd;14311431+ seq = ntohl(tcph->seq);14321432+ ack_seq = ntohl(tcph->ack_seq);14331433+ rcv_wnd = cm_node->tcp_cntxt.rcv_wnd;14341434+ if (ack_seq != loc_seq_num)14351435+ err = 1;14361436+ else if ((seq + rcv_wnd) < rcv_nxt)14371437+ err = 1;14381438+ if (err) {14391439+ nes_debug(NES_DBG_CM, "%s[%u] create abort for cm_node=%p "14401440+ "listener=%p state=%d\n", __func__, __LINE__, cm_node,14411441+ cm_node->listener, cm_node->state);14421442+ indicate_pkt_err(cm_node, skb);14431443+ nes_debug(NES_DBG_CM, "seq ERROR cm_node =%p seq=0x%08X "14441444+ "rcv_nxt=0x%08X rcv_wnd=0x%x\n", cm_node, seq, rcv_nxt,14451445+ rcv_wnd);14461446+ }14471447+ return err;14481448+}14491449+14501450+/*14511451+ * handle_syn_pkt() is for Passive node. The syn packet is received when a node14521452+ * is created with a listener or it may comein as rexmitted packet which in14531453+ * that case will be just dropped.14541454+ */14551455+14561456+static void handle_syn_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,14571457+ struct tcphdr *tcph)14581458+{14591459+ int ret;14601460+ u32 inc_sequence;14611461+ int optionsize;1338146213391463 optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);13401340-13411341- skb_pull(skb, ip_hdr(skb)->ihl << 2);13421464 skb_pull(skb, tcph->doff << 2);13431343-13441344- datasize = skb->len;13451465 inc_sequence = ntohl(tcph->seq);13461346- nes_debug(NES_DBG_CM, "datasize = %u, sequence = 0x%08X, ack_seq = 0x%08X,"13471347- " rcv_nxt = 0x%08X Flags: %s %s.\n",13481348- datasize, inc_sequence, ntohl(tcph->ack_seq),13491349- cm_node->tcp_cntxt.rcv_nxt, (tcph->syn ? "SYN":""),13501350- (tcph->ack ? "ACK":""));1351146613521352- if (!tcph->syn && (inc_sequence != cm_node->tcp_cntxt.rcv_nxt)13531353- ) {13541354- nes_debug(NES_DBG_CM, "dropping packet, datasize = %u, sequence = 0x%08X,"13551355- " ack_seq = 0x%08X, rcv_nxt = 0x%08X Flags: %s.\n",13561356- datasize, inc_sequence, ntohl(tcph->ack_seq),13571357- cm_node->tcp_cntxt.rcv_nxt, (tcph->ack ? "ACK":""));13581358- if (cm_node->state == NES_CM_STATE_LISTENING) {13591359- rem_ref_cm_node(cm_core, cm_node);14671467+ switch (cm_node->state) {14681468+ case NES_CM_STATE_SYN_SENT:14691469+ case NES_CM_STATE_MPAREQ_SENT:14701470+ /* Rcvd syn on active open connection*/14711471+ active_open_err(cm_node, skb, 1);14721472+ break;14731473+ case NES_CM_STATE_LISTENING:14741474+ /* Passive OPEN */14751475+ cm_node->accept_pend = 1;14761476+ atomic_inc(&cm_node->listener->pend_accepts_cnt);14771477+ if (atomic_read(&cm_node->listener->pend_accepts_cnt) >14781478+ cm_node->listener->backlog) {14791479+ nes_debug(NES_DBG_CM, "drop syn due to backlog "14801480+ "pressure \n");14811481+ cm_backlog_drops++;14821482+ passive_open_err(cm_node, skb, 0);14831483+ break;13601484 }13611361- return -1;14851485+ ret = handle_tcp_options(cm_node, tcph, skb, optionsize,14861486+ 1);14871487+ if (ret) {14881488+ passive_open_err(cm_node, skb, 0);14891489+ /* drop pkt */14901490+ break;14911491+ }14921492+ cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1;14931493+ BUG_ON(cm_node->send_entry);14941494+ cm_node->state = NES_CM_STATE_SYN_RCVD;14951495+ send_syn(cm_node, 1, skb);14961496+ break;14971497+ case NES_CM_STATE_TSA:14981498+ case NES_CM_STATE_ESTABLISHED:14991499+ case NES_CM_STATE_FIN_WAIT1:15001500+ case NES_CM_STATE_FIN_WAIT2:15011501+ case NES_CM_STATE_MPAREQ_RCVD:15021502+ case NES_CM_STATE_LAST_ACK:15031503+ case NES_CM_STATE_CLOSING:15041504+ case NES_CM_STATE_UNKNOWN:15051505+ case NES_CM_STATE_CLOSED:15061506+ default:15071507+ drop_packet(skb);15081508+ break;13621509 }15101510+}1363151113641364- cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;15121512+static void handle_synack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,15131513+ struct tcphdr *tcph)15141514+{1365151515161516+ int ret;15171517+ u32 inc_sequence;15181518+ int optionsize;1366151913671367- if (optionsize) {13681368- u8 *optionsloc = (u8 *)&tcph[1];13691369- if (process_options(cm_node, optionsloc, optionsize, (u32)tcph->syn)) {13701370- nes_debug(NES_DBG_CM, "%s: Node %p, Sending RESET\n", __func__, cm_node);13711371- send_reset(cm_node);13721372- if (cm_node->state != NES_CM_STATE_SYN_SENT)13731373- rem_ref_cm_node(cm_core, cm_node);13741374- return 0;15201520+ optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);15211521+ skb_pull(skb, tcph->doff << 2);15221522+ inc_sequence = ntohl(tcph->seq);15231523+ switch (cm_node->state) {15241524+ case NES_CM_STATE_SYN_SENT:15251525+ /* active open */15261526+ if (check_syn(cm_node, tcph, skb))15271527+ return;15281528+ cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);15291529+ /* setup options */15301530+ ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 0);15311531+ if (ret) {15321532+ nes_debug(NES_DBG_CM, "cm_node=%p tcp_options failed\n",15331533+ cm_node);15341534+ break;13751535 }13761376- } else if (tcph->syn)13771377- cm_node->tcp_cntxt.mss = NES_CM_DEFAULT_MSS;15361536+ cleanup_retrans_entry(cm_node);15371537+ cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1;15381538+ send_mpa_request(cm_node, skb);15391539+ cm_node->state = NES_CM_STATE_MPAREQ_SENT;15401540+ break;15411541+ case NES_CM_STATE_MPAREQ_RCVD:15421542+ /* passive open, so should not be here */15431543+ passive_open_err(cm_node, skb, 1);15441544+ break;15451545+ case NES_CM_STATE_ESTABLISHED:15461546+ case NES_CM_STATE_FIN_WAIT1:15471547+ case NES_CM_STATE_FIN_WAIT2:15481548+ case NES_CM_STATE_LAST_ACK:15491549+ case NES_CM_STATE_TSA:15501550+ case NES_CM_STATE_CLOSING:15511551+ case NES_CM_STATE_UNKNOWN:15521552+ case NES_CM_STATE_CLOSED:15531553+ case NES_CM_STATE_MPAREQ_SENT:15541554+ default:15551555+ drop_packet(skb);15561556+ break;15571557+ }15581558+}15591559+15601560+static void handle_ack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,15611561+ struct tcphdr *tcph)15621562+{15631563+ int datasize = 0;15641564+ u32 inc_sequence;15651565+ u32 rem_seq_ack;15661566+ u32 rem_seq;15671567+ if (check_seq(cm_node, tcph, skb))15681568+ return;15691569+15701570+ skb_pull(skb, tcph->doff << 2);15711571+ inc_sequence = ntohl(tcph->seq);15721572+ rem_seq = ntohl(tcph->seq);15731573+ rem_seq_ack = ntohl(tcph->ack_seq);15741574+ datasize = skb->len;15751575+15761576+ switch (cm_node->state) {15771577+ case NES_CM_STATE_SYN_RCVD:15781578+ /* Passive OPEN */15791579+ cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);15801580+ cm_node->state = NES_CM_STATE_ESTABLISHED;15811581+ if (datasize) {15821582+ cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;15831583+ cm_node->state = NES_CM_STATE_MPAREQ_RCVD;15841584+ handle_rcv_mpa(cm_node, skb, NES_CM_EVENT_MPA_REQ);15851585+ } else { /* rcvd ACK only */15861586+ dev_kfree_skb_any(skb);15871587+ cleanup_retrans_entry(cm_node);15881588+ }15891589+ break;15901590+ case NES_CM_STATE_ESTABLISHED:15911591+ /* Passive OPEN */15921592+ /* We expect mpa frame to be received only */15931593+ if (datasize) {15941594+ cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;15951595+ cm_node->state = NES_CM_STATE_MPAREQ_RCVD;15961596+ handle_rcv_mpa(cm_node, skb,15971597+ NES_CM_EVENT_MPA_REQ);15981598+ } else15991599+ drop_packet(skb);16001600+ break;16011601+ case NES_CM_STATE_MPAREQ_SENT:16021602+ cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);16031603+ if (datasize) {16041604+ cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;16051605+ handle_rcv_mpa(cm_node, skb, NES_CM_EVENT_CONNECTED);16061606+ } else { /* Could be just an ack pkt.. */16071607+ cleanup_retrans_entry(cm_node);16081608+ dev_kfree_skb_any(skb);16091609+ }16101610+ break;16111611+ case NES_CM_STATE_FIN_WAIT1:16121612+ case NES_CM_STATE_SYN_SENT:16131613+ case NES_CM_STATE_FIN_WAIT2:16141614+ case NES_CM_STATE_TSA:16151615+ case NES_CM_STATE_CLOSED:16161616+ case NES_CM_STATE_MPAREQ_RCVD:16171617+ case NES_CM_STATE_LAST_ACK:16181618+ case NES_CM_STATE_CLOSING:16191619+ case NES_CM_STATE_UNKNOWN:16201620+ default:16211621+ drop_packet(skb);16221622+ break;16231623+ }16241624+}16251625+16261626+16271627+16281628+static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph,16291629+ struct sk_buff *skb, int optionsize, int passive)16301630+{16311631+ u8 *optionsloc = (u8 *)&tcph[1];16321632+ if (optionsize) {16331633+ if (process_options(cm_node, optionsloc, optionsize,16341634+ (u32)tcph->syn)) {16351635+ nes_debug(NES_DBG_CM, "%s: Node %p, Sending RESET\n",16361636+ __func__, cm_node);16371637+ if (passive)16381638+ passive_open_err(cm_node, skb, 0);16391639+ else16401640+ active_open_err(cm_node, skb, 0);16411641+ return 1;16421642+ }16431643+ }1378164413791645 cm_node->tcp_cntxt.snd_wnd = ntohs(tcph->window) <<13801646 cm_node->tcp_cntxt.snd_wscale;1381164713821382- if (cm_node->tcp_cntxt.snd_wnd > cm_node->tcp_cntxt.max_snd_wnd) {16481648+ if (cm_node->tcp_cntxt.snd_wnd > cm_node->tcp_cntxt.max_snd_wnd)13831649 cm_node->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.snd_wnd;13841384- }13851385-13861386- if (tcph->ack) {13871387- cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);13881388- switch (cm_node->state) {13891389- case NES_CM_STATE_SYN_RCVD:13901390- case NES_CM_STATE_SYN_SENT:13911391- /* read and stash current sequence number */13921392- if (cm_node->tcp_cntxt.rem_ack_num != cm_node->tcp_cntxt.loc_seq_num) {13931393- nes_debug(NES_DBG_CM, "ERROR - cm_node->tcp_cntxt.rem_ack_num !="13941394- " cm_node->tcp_cntxt.loc_seq_num\n");13951395- send_reset(cm_node);13961396- return 0;13971397- }13981398- if (cm_node->state == NES_CM_STATE_SYN_SENT)13991399- cm_node->state = NES_CM_STATE_ONE_SIDE_ESTABLISHED;14001400- else {14011401- cm_node->state = NES_CM_STATE_ESTABLISHED;14021402- }14031403- break;14041404- case NES_CM_STATE_LAST_ACK:14051405- cm_node->state = NES_CM_STATE_CLOSED;14061406- break;14071407- case NES_CM_STATE_FIN_WAIT1:14081408- cm_node->state = NES_CM_STATE_FIN_WAIT2;14091409- break;14101410- case NES_CM_STATE_CLOSING:14111411- cm_node->state = NES_CM_STATE_TIME_WAIT;14121412- /* need to schedule this to happen in 2MSL timeouts */14131413- cm_node->state = NES_CM_STATE_CLOSED;14141414- break;14151415- case NES_CM_STATE_ONE_SIDE_ESTABLISHED:14161416- case NES_CM_STATE_ESTABLISHED:14171417- case NES_CM_STATE_MPAREQ_SENT:14181418- case NES_CM_STATE_CLOSE_WAIT:14191419- case NES_CM_STATE_TIME_WAIT:14201420- case NES_CM_STATE_CLOSED:14211421- break;14221422- case NES_CM_STATE_LISTENING:14231423- nes_debug(NES_DBG_CM, "Received an ACK on a listening port (SYN %d)\n", tcph->syn);14241424- cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq);14251425- send_reset(cm_node);14261426- /* send_reset bumps refcount, this should have been a new node */14271427- rem_ref_cm_node(cm_core, cm_node);14281428- return -1;14291429- break;14301430- case NES_CM_STATE_TSA:14311431- nes_debug(NES_DBG_CM, "Received a packet with the ack bit set while in TSA state\n");14321432- break;14331433- case NES_CM_STATE_UNKNOWN:14341434- case NES_CM_STATE_INITED:14351435- case NES_CM_STATE_ACCEPTING:14361436- case NES_CM_STATE_FIN_WAIT2:14371437- default:14381438- nes_debug(NES_DBG_CM, "Received ack from unknown state: %x\n",14391439- cm_node->state);14401440- send_reset(cm_node);14411441- break;14421442- }14431443- }14441444-14451445- if (tcph->syn) {14461446- if (cm_node->state == NES_CM_STATE_LISTENING) {14471447- /* do not exceed backlog */14481448- atomic_inc(&cm_node->listener->pend_accepts_cnt);14491449- if (atomic_read(&cm_node->listener->pend_accepts_cnt) >14501450- cm_node->listener->backlog) {14511451- nes_debug(NES_DBG_CM, "drop syn due to backlog pressure \n");14521452- cm_backlog_drops++;14531453- atomic_dec(&cm_node->listener->pend_accepts_cnt);14541454- rem_ref_cm_node(cm_core, cm_node);14551455- return 0;14561456- }14571457- cm_node->accept_pend = 1;14581458-14591459- }14601460- if (datasize == 0)14611461- cm_node->tcp_cntxt.rcv_nxt ++;14621462-14631463- if (cm_node->state == NES_CM_STATE_LISTENING) {14641464- cm_node->state = NES_CM_STATE_SYN_RCVD;14651465- send_syn(cm_node, 1);14661466- }14671467- if (cm_node->state == NES_CM_STATE_ONE_SIDE_ESTABLISHED) {14681468- cm_node->state = NES_CM_STATE_ESTABLISHED;14691469- /* send final handshake ACK */14701470- ret = send_ack(cm_node);14711471- if (ret < 0)14721472- return ret;14731473-14741474- cm_node->state = NES_CM_STATE_MPAREQ_SENT;14751475- ret = send_mpa_request(cm_node);14761476- if (ret < 0)14771477- return ret;14781478- }14791479- }14801480-14811481- if (tcph->fin) {14821482- cm_node->tcp_cntxt.rcv_nxt++;14831483- switch (cm_node->state) {14841484- case NES_CM_STATE_SYN_RCVD:14851485- case NES_CM_STATE_SYN_SENT:14861486- case NES_CM_STATE_ONE_SIDE_ESTABLISHED:14871487- case NES_CM_STATE_ESTABLISHED:14881488- case NES_CM_STATE_ACCEPTING:14891489- case NES_CM_STATE_MPAREQ_SENT:14901490- cm_node->state = NES_CM_STATE_CLOSE_WAIT;14911491- cm_node->state = NES_CM_STATE_LAST_ACK;14921492- ret = send_fin(cm_node, NULL);14931493- break;14941494- case NES_CM_STATE_FIN_WAIT1:14951495- cm_node->state = NES_CM_STATE_CLOSING;14961496- ret = send_ack(cm_node);14971497- break;14981498- case NES_CM_STATE_FIN_WAIT2:14991499- cm_node->state = NES_CM_STATE_TIME_WAIT;15001500- cm_node->tcp_cntxt.loc_seq_num ++;15011501- ret = send_ack(cm_node);15021502- /* need to schedule this to happen in 2MSL timeouts */15031503- cm_node->state = NES_CM_STATE_CLOSED;15041504- break;15051505- case NES_CM_STATE_CLOSE_WAIT:15061506- case NES_CM_STATE_LAST_ACK:15071507- case NES_CM_STATE_CLOSING:15081508- case NES_CM_STATE_TSA:15091509- default:15101510- nes_debug(NES_DBG_CM, "Received a fin while in %x state\n",15111511- cm_node->state);15121512- ret = -EINVAL;15131513- break;15141514- }15151515- }15161516-15171517- if (datasize) {15181518- u8 *dataloc = skb->data;15191519- /* figure out what state we are in and handle transition to next state */15201520- switch (cm_node->state) {15211521- case NES_CM_STATE_LISTENING:15221522- case NES_CM_STATE_SYN_RCVD:15231523- case NES_CM_STATE_SYN_SENT:15241524- case NES_CM_STATE_FIN_WAIT1:15251525- case NES_CM_STATE_FIN_WAIT2:15261526- case NES_CM_STATE_CLOSE_WAIT:15271527- case NES_CM_STATE_LAST_ACK:15281528- case NES_CM_STATE_CLOSING:15291529- break;15301530- case NES_CM_STATE_MPAREQ_SENT:15311531- /* recv the mpa res frame, ret=frame len (incl priv data) */15321532- ret = parse_mpa(cm_node, dataloc, datasize);15331533- if (ret < 0)15341534- break;15351535- /* set the req frame payload len in skb */15361536- /* we are done handling this state, set node to a TSA state */15371537- cm_node->state = NES_CM_STATE_TSA;15381538- send_ack(cm_node);15391539- create_event(cm_node, NES_CM_EVENT_CONNECTED);15401540- break;15411541-15421542- case NES_CM_STATE_ESTABLISHED:15431543- /* we are expecting an MPA req frame */15441544- ret = parse_mpa(cm_node, dataloc, datasize);15451545- if (ret < 0) {15461546- break;15471547- }15481548- cm_node->state = NES_CM_STATE_TSA;15491549- send_ack(cm_node);15501550- /* we got a valid MPA request, create an event */15511551- create_event(cm_node, NES_CM_EVENT_MPA_REQ);15521552- break;15531553- case NES_CM_STATE_TSA:15541554- handle_exception_pkt(cm_node, skb);15551555- break;15561556- case NES_CM_STATE_UNKNOWN:15571557- case NES_CM_STATE_INITED:15581558- default:15591559- ret = -1;15601560- }15611561- }15621562-15631563- return ret;16501650+ return 0;15641651}1565165216531653+/*16541654+ * active_open_err() will send reset() if flag set..16551655+ * It will also send ABORT event.16561656+ */16571657+16581658+static void active_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb,16591659+ int reset)16601660+{16611661+ cleanup_retrans_entry(cm_node);16621662+ if (reset) {16631663+ nes_debug(NES_DBG_CM, "ERROR active err called for cm_node=%p, "16641664+ "state=%d\n", cm_node, cm_node->state);16651665+ add_ref_cm_node(cm_node);16661666+ send_reset(cm_node, skb);16671667+ } else16681668+ dev_kfree_skb_any(skb);16691669+16701670+ cm_node->state = NES_CM_STATE_CLOSED;16711671+ create_event(cm_node, NES_CM_EVENT_ABORTED);16721672+}16731673+16741674+/*16751675+ * passive_open_err() will either do a reset() or will free up the skb and16761676+ * remove the cm_node.16771677+ */16781678+16791679+static void passive_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb,16801680+ int reset)16811681+{16821682+ cleanup_retrans_entry(cm_node);16831683+ cm_node->state = NES_CM_STATE_CLOSED;16841684+ if (reset) {16851685+ nes_debug(NES_DBG_CM, "passive_open_err sending RST for "16861686+ "cm_node=%p state =%d\n", cm_node, cm_node->state);16871687+ send_reset(cm_node, skb);16881688+ } else {16891689+ dev_kfree_skb_any(skb);16901690+ rem_ref_cm_node(cm_node->cm_core, cm_node);16911691+ }16921692+}16931693+16941694+/*16951695+ * free_retrans_entry() routines assumes that the retrans_list_lock has16961696+ * been acquired before calling.16971697+ */16981698+static void free_retrans_entry(struct nes_cm_node *cm_node)16991699+{17001700+ struct nes_timer_entry *send_entry;17011701+ send_entry = cm_node->send_entry;17021702+ if (send_entry) {17031703+ cm_node->send_entry = NULL;17041704+ dev_kfree_skb_any(send_entry->skb);17051705+ kfree(send_entry);17061706+ rem_ref_cm_node(cm_node->cm_core, cm_node);17071707+ }17081708+}17091709+17101710+static void cleanup_retrans_entry(struct nes_cm_node *cm_node)17111711+{17121712+ unsigned long flags;17131713+17141714+ spin_lock_irqsave(&cm_node->retrans_list_lock, flags);17151715+ free_retrans_entry(cm_node);17161716+ spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);17171717+}17181718+17191719+/**17201720+ * process_packet17211721+ * Returns skb if to be freed, else it will return NULL if already used..17221722+ */17231723+static void process_packet(struct nes_cm_node *cm_node, struct sk_buff *skb,17241724+ struct nes_cm_core *cm_core)17251725+{17261726+ enum nes_tcpip_pkt_type pkt_type = NES_PKT_TYPE_UNKNOWN;17271727+ struct tcphdr *tcph = tcp_hdr(skb);17281728+ skb_pull(skb, ip_hdr(skb)->ihl << 2);17291729+17301730+ nes_debug(NES_DBG_CM, "process_packet: cm_node=%p state =%d syn=%d "17311731+ "ack=%d rst=%d fin=%d\n", cm_node, cm_node->state, tcph->syn,17321732+ tcph->ack, tcph->rst, tcph->fin);17331733+17341734+ if (tcph->rst)17351735+ pkt_type = NES_PKT_TYPE_RST;17361736+ else if (tcph->syn) {17371737+ pkt_type = NES_PKT_TYPE_SYN;17381738+ if (tcph->ack)17391739+ pkt_type = NES_PKT_TYPE_SYNACK;17401740+ } else if (tcph->fin)17411741+ pkt_type = NES_PKT_TYPE_FIN;17421742+ else if (tcph->ack)17431743+ pkt_type = NES_PKT_TYPE_ACK;17441744+17451745+ switch (pkt_type) {17461746+ case NES_PKT_TYPE_SYN:17471747+ handle_syn_pkt(cm_node, skb, tcph);17481748+ break;17491749+ case NES_PKT_TYPE_SYNACK:17501750+ handle_synack_pkt(cm_node, skb, tcph);17511751+ break;17521752+ case NES_PKT_TYPE_ACK:17531753+ handle_ack_pkt(cm_node, skb, tcph);17541754+ break;17551755+ case NES_PKT_TYPE_RST:17561756+ handle_rst_pkt(cm_node, skb, tcph);17571757+ break;17581758+ case NES_PKT_TYPE_FIN:17591759+ handle_fin_pkt(cm_node, skb, tcph);17601760+ break;17611761+ default:17621762+ drop_packet(skb);17631763+ break;17641764+ }17651765+}1566176615671767/**15681768 * mini_cm_listen - create a listen node with params15691769 */15701770static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *cm_core,15711571- struct nes_vnic *nesvnic, struct nes_cm_info *cm_info)17711771+ struct nes_vnic *nesvnic, struct nes_cm_info *cm_info)15721772{15731773 struct nes_cm_listener *listener;15741774 unsigned long flags;···18261644/**18271645 * mini_cm_connect - make a connection node with params18281646 */18291829-static struct nes_cm_node *mini_cm_connect(struct nes_cm_core *cm_core,18301830- struct nes_vnic *nesvnic,18311831- struct ietf_mpa_frame *mpa_frame,18321832- struct nes_cm_info *cm_info)16471647+struct nes_cm_node *mini_cm_connect(struct nes_cm_core *cm_core,16481648+ struct nes_vnic *nesvnic, u16 private_data_len,16491649+ void *private_data, struct nes_cm_info *cm_info)18331650{18341651 int ret = 0;18351652 struct nes_cm_node *cm_node;18361653 struct nes_cm_listener *loopbackremotelistener;18371654 struct nes_cm_node *loopbackremotenode;18381655 struct nes_cm_info loopback_cm_info;18391839-18401840- u16 mpa_frame_size = sizeof(struct ietf_mpa_frame) +18411841- ntohs(mpa_frame->priv_data_len);18421842-18431843- cm_info->loc_addr = htonl(cm_info->loc_addr);18441844- cm_info->rem_addr = htonl(cm_info->rem_addr);18451845- cm_info->loc_port = htons(cm_info->loc_port);18461846- cm_info->rem_port = htons(cm_info->rem_port);16561656+ u16 mpa_frame_size = sizeof(struct ietf_mpa_frame) + private_data_len;16571657+ struct ietf_mpa_frame *mpa_frame = NULL;1847165818481659 /* create a CM connection node */18491660 cm_node = make_cm_node(cm_core, nesvnic, cm_info, NULL);18501661 if (!cm_node)18511662 return NULL;16631663+ mpa_frame = &cm_node->mpa_frame;16641664+ strcpy(mpa_frame->key, IEFT_MPA_KEY_REQ);16651665+ mpa_frame->flags = IETF_MPA_FLAGS_CRC;16661666+ mpa_frame->rev = IETF_MPA_VERSION;16671667+ mpa_frame->priv_data_len = htons(private_data_len);1852166818531669 /* set our node side to client (active) side */18541670 cm_node->tcp_cntxt.client = 1;18551671 cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE;1856167218571673 if (cm_info->loc_addr == cm_info->rem_addr) {18581858- loopbackremotelistener = find_listener(cm_core, cm_node->rem_addr,18591859- cm_node->rem_port, NES_CM_LISTENER_ACTIVE_STATE);16741674+ loopbackremotelistener = find_listener(cm_core,16751675+ ntohl(nesvnic->local_ipaddr), cm_node->rem_port,16761676+ NES_CM_LISTENER_ACTIVE_STATE);18601677 if (loopbackremotelistener == NULL) {18611678 create_event(cm_node, NES_CM_EVENT_ABORTED);18621679 } else {···18641683 loopback_cm_info.loc_port = cm_info->rem_port;18651684 loopback_cm_info.rem_port = cm_info->loc_port;18661685 loopback_cm_info.cm_id = loopbackremotelistener->cm_id;18671867- loopbackremotenode = make_cm_node(cm_core, nesvnic, &loopback_cm_info,18681868- loopbackremotelistener);16861686+ loopbackremotenode = make_cm_node(cm_core, nesvnic,16871687+ &loopback_cm_info, loopbackremotelistener);18691688 loopbackremotenode->loopbackpartner = cm_node;18701870- loopbackremotenode->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE;16891689+ loopbackremotenode->tcp_cntxt.rcv_wscale =16901690+ NES_CM_DEFAULT_RCV_WND_SCALE;18711691 cm_node->loopbackpartner = loopbackremotenode;18721872- memcpy(loopbackremotenode->mpa_frame_buf, &mpa_frame->priv_data,18731873- mpa_frame_size);18741874- loopbackremotenode->mpa_frame_size = mpa_frame_size -18751875- sizeof(struct ietf_mpa_frame);16921692+ memcpy(loopbackremotenode->mpa_frame_buf, private_data,16931693+ private_data_len);16941694+ loopbackremotenode->mpa_frame_size = private_data_len;1876169518771877- /* we are done handling this state, set node to a TSA state */16961696+ /* we are done handling this state. */16971697+ /* set node to a TSA state */18781698 cm_node->state = NES_CM_STATE_TSA;18791879- cm_node->tcp_cntxt.rcv_nxt = loopbackremotenode->tcp_cntxt.loc_seq_num;18801880- loopbackremotenode->tcp_cntxt.rcv_nxt = cm_node->tcp_cntxt.loc_seq_num;18811881- cm_node->tcp_cntxt.max_snd_wnd = loopbackremotenode->tcp_cntxt.rcv_wnd;18821882- loopbackremotenode->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.rcv_wnd;18831883- cm_node->tcp_cntxt.snd_wnd = loopbackremotenode->tcp_cntxt.rcv_wnd;18841884- loopbackremotenode->tcp_cntxt.snd_wnd = cm_node->tcp_cntxt.rcv_wnd;18851885- cm_node->tcp_cntxt.snd_wscale = loopbackremotenode->tcp_cntxt.rcv_wscale;18861886- loopbackremotenode->tcp_cntxt.snd_wscale = cm_node->tcp_cntxt.rcv_wscale;16991699+ cm_node->tcp_cntxt.rcv_nxt =17001700+ loopbackremotenode->tcp_cntxt.loc_seq_num;17011701+ loopbackremotenode->tcp_cntxt.rcv_nxt =17021702+ cm_node->tcp_cntxt.loc_seq_num;17031703+ cm_node->tcp_cntxt.max_snd_wnd =17041704+ loopbackremotenode->tcp_cntxt.rcv_wnd;17051705+ loopbackremotenode->tcp_cntxt.max_snd_wnd =17061706+ cm_node->tcp_cntxt.rcv_wnd;17071707+ cm_node->tcp_cntxt.snd_wnd =17081708+ loopbackremotenode->tcp_cntxt.rcv_wnd;17091709+ loopbackremotenode->tcp_cntxt.snd_wnd =17101710+ cm_node->tcp_cntxt.rcv_wnd;17111711+ cm_node->tcp_cntxt.snd_wscale =17121712+ loopbackremotenode->tcp_cntxt.rcv_wscale;17131713+ loopbackremotenode->tcp_cntxt.snd_wscale =17141714+ cm_node->tcp_cntxt.rcv_wscale;1887171518881716 create_event(loopbackremotenode, NES_CM_EVENT_MPA_REQ);18891717 }···19021712 /* set our node side to client (active) side */19031713 cm_node->tcp_cntxt.client = 1;19041714 /* init our MPA frame ptr */19051905- memcpy(&cm_node->mpa_frame, mpa_frame, mpa_frame_size);17151715+ memcpy(mpa_frame->priv_data, private_data, private_data_len);17161716+19061717 cm_node->mpa_frame_size = mpa_frame_size;1907171819081719 /* send a syn and goto syn sent state */19091720 cm_node->state = NES_CM_STATE_SYN_SENT;19101910- ret = send_syn(cm_node, 0);17211721+ ret = send_syn(cm_node, 0, NULL);1911172219121912- nes_debug(NES_DBG_CM, "Api - connect(): dest addr=0x%08X, port=0x%04x,"19131913- " cm_node=%p, cm_id = %p.\n",19141914- cm_node->rem_addr, cm_node->rem_port, cm_node, cm_node->cm_id);17231723+ if (ret) {17241724+ /* error in sending the syn free up the cm_node struct */17251725+ nes_debug(NES_DBG_CM, "Api - connect() FAILED: dest "17261726+ "addr=0x%08X, port=0x%04x, cm_node=%p, cm_id = %p.\n",17271727+ cm_node->rem_addr, cm_node->rem_port, cm_node,17281728+ cm_node->cm_id);17291729+ rem_ref_cm_node(cm_node->cm_core, cm_node);17301730+ cm_node = NULL;17311731+ }17321732+17331733+ if (cm_node)17341734+ nes_debug(NES_DBG_CM, "Api - connect(): dest addr=0x%08X,"17351735+ "port=0x%04x, cm_node=%p, cm_id = %p.\n",17361736+ cm_node->rem_addr, cm_node->rem_port, cm_node,17371737+ cm_node->cm_id);1915173819161739 return cm_node;19171740}···19341731 * mini_cm_accept - accept a connection19351732 * This function is never called19361733 */19371937-static int mini_cm_accept(struct nes_cm_core *cm_core, struct ietf_mpa_frame *mpa_frame,19381938- struct nes_cm_node *cm_node)17341734+static int mini_cm_accept(struct nes_cm_core *cm_core,17351735+ struct ietf_mpa_frame *mpa_frame, struct nes_cm_node *cm_node)19391736{19401737 return 0;19411738}···19451742 * mini_cm_reject - reject and teardown a connection19461743 */19471744static int mini_cm_reject(struct nes_cm_core *cm_core,19481948- struct ietf_mpa_frame *mpa_frame,19491949- struct nes_cm_node *cm_node)17451745+ struct ietf_mpa_frame *mpa_frame, struct nes_cm_node *cm_node)19501746{19511747 int ret = 0;19521952- struct sk_buff *skb;19531953- u16 mpa_frame_size = sizeof(struct ietf_mpa_frame) +19541954- ntohs(mpa_frame->priv_data_len);1955174819561956- skb = get_free_pkt(cm_node);19571957- if (!skb) {19581958- nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");19591959- return -1;19601960- }17491749+ nes_debug(NES_DBG_CM, "%s cm_node=%p type=%d state=%d\n",17501750+ __func__, cm_node, cm_node->tcp_cntxt.client, cm_node->state);1961175119621962- /* send an MPA Request frame */19631963- form_cm_frame(skb, cm_node, NULL, 0, mpa_frame, mpa_frame_size, SET_ACK | SET_FIN);19641964- ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0);19651965-17521752+ if (cm_node->tcp_cntxt.client)17531753+ return ret;17541754+ cleanup_retrans_entry(cm_node);19661755 cm_node->state = NES_CM_STATE_CLOSED;19671756 ret = send_fin(cm_node, NULL);1968175719691969- if (ret < 0) {19701970- printk(KERN_INFO PFX "failed to send MPA Reply (reject)\n");19711971- return ret;17581758+ if (cm_node->accept_pend) {17591759+ BUG_ON(!cm_node->listener);17601760+ atomic_dec(&cm_node->listener->pend_accepts_cnt);17611761+ BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0);19721762 }1973176317641764+ ret = send_reset(cm_node, NULL);19741765 return ret;19751766}19761767···19801783 return -EINVAL;1981178419821785 switch (cm_node->state) {19831983- /* if passed in node is null, create a reference key node for node search */19841984- /* check if we found an owner node for this pkt */19851985- case NES_CM_STATE_SYN_RCVD:19861986- case NES_CM_STATE_SYN_SENT:19871987- case NES_CM_STATE_ONE_SIDE_ESTABLISHED:19881988- case NES_CM_STATE_ESTABLISHED:19891989- case NES_CM_STATE_ACCEPTING:19901990- case NES_CM_STATE_MPAREQ_SENT:19911991- cm_node->state = NES_CM_STATE_FIN_WAIT1;19921992- send_fin(cm_node, NULL);19931993- break;19941994- case NES_CM_STATE_CLOSE_WAIT:19951995- cm_node->state = NES_CM_STATE_LAST_ACK;19961996- send_fin(cm_node, NULL);19971997- break;19981998- case NES_CM_STATE_FIN_WAIT1:19991999- case NES_CM_STATE_FIN_WAIT2:20002000- case NES_CM_STATE_LAST_ACK:20012001- case NES_CM_STATE_TIME_WAIT:20022002- case NES_CM_STATE_CLOSING:20032003- ret = -1;20042004- break;20052005- case NES_CM_STATE_LISTENING:20062006- case NES_CM_STATE_UNKNOWN:20072007- case NES_CM_STATE_INITED:20082008- case NES_CM_STATE_CLOSED:20092009- case NES_CM_STATE_TSA:20102010- ret = rem_ref_cm_node(cm_core, cm_node);20112011- break;17861786+ case NES_CM_STATE_SYN_RCVD:17871787+ case NES_CM_STATE_SYN_SENT:17881788+ case NES_CM_STATE_ONE_SIDE_ESTABLISHED:17891789+ case NES_CM_STATE_ESTABLISHED:17901790+ case NES_CM_STATE_ACCEPTING:17911791+ case NES_CM_STATE_MPAREQ_SENT:17921792+ case NES_CM_STATE_MPAREQ_RCVD:17931793+ cleanup_retrans_entry(cm_node);17941794+ send_reset(cm_node, NULL);17951795+ break;17961796+ case NES_CM_STATE_CLOSE_WAIT:17971797+ cm_node->state = NES_CM_STATE_LAST_ACK;17981798+ send_fin(cm_node, NULL);17991799+ break;18001800+ case NES_CM_STATE_FIN_WAIT1:18011801+ case NES_CM_STATE_FIN_WAIT2:18021802+ case NES_CM_STATE_LAST_ACK:18031803+ case NES_CM_STATE_TIME_WAIT:18041804+ case NES_CM_STATE_CLOSING:18051805+ ret = -1;18061806+ break;18071807+ case NES_CM_STATE_LISTENING:18081808+ case NES_CM_STATE_UNKNOWN:18091809+ case NES_CM_STATE_INITED:18101810+ case NES_CM_STATE_CLOSED:18111811+ ret = rem_ref_cm_node(cm_core, cm_node);18121812+ break;18131813+ case NES_CM_STATE_TSA:18141814+ if (cm_node->send_entry)18151815+ printk(KERN_ERR "ERROR Close got called from STATE_TSA "18161816+ "send_entry=%p\n", cm_node->send_entry);18171817+ ret = rem_ref_cm_node(cm_core, cm_node);18181818+ break;20121819 }20131820 cm_node->cm_id = NULL;20141821 return ret;···20231822 * recv_pkt - recv an ETHERNET packet, and process it through CM20241823 * node state machine20251824 */20262026-static int mini_cm_recv_pkt(struct nes_cm_core *cm_core, struct nes_vnic *nesvnic,20272027- struct sk_buff *skb)18251825+static void mini_cm_recv_pkt(struct nes_cm_core *cm_core,18261826+ struct nes_vnic *nesvnic, struct sk_buff *skb)20281827{20291828 struct nes_cm_node *cm_node = NULL;20301829 struct nes_cm_listener *listener = NULL;20311830 struct iphdr *iph;20321831 struct tcphdr *tcph;20331832 struct nes_cm_info nfo;20342034- int ret = 0;2035183320362036- if (!skb || skb->len < sizeof(struct iphdr) + sizeof(struct tcphdr)) {20372037- ret = -EINVAL;20382038- goto out;18341834+ if (!skb)18351835+ return;18361836+ if (skb->len < sizeof(struct iphdr) + sizeof(struct tcphdr)) {18371837+ dev_kfree_skb_any(skb);18381838+ return;20391839 }2040184020411841 iph = (struct iphdr *)skb->data;20421842 tcph = (struct tcphdr *)(skb->data + sizeof(struct iphdr));20431843 skb_reset_network_header(skb);20441844 skb_set_transport_header(skb, sizeof(*tcph));18451845+ if (!tcph) {18461846+ dev_kfree_skb_any(skb);18471847+ return;18481848+ }20451849 skb->len = ntohs(iph->tot_len);2046185020471851 nfo.loc_addr = ntohl(iph->daddr);···20591853 NIPQUAD(iph->daddr), tcph->dest,20601854 NIPQUAD(iph->saddr), tcph->source);2061185520622062- /* note: this call is going to increment cm_node ref count */20632063- cm_node = find_node(cm_core,18561856+ do {18571857+ cm_node = find_node(cm_core,20641858 nfo.rem_port, nfo.rem_addr,20651859 nfo.loc_port, nfo.loc_addr);2066186020672067- if (!cm_node) {20682068- listener = find_listener(cm_core, nfo.loc_addr, nfo.loc_port,20692069- NES_CM_LISTENER_ACTIVE_STATE);20702070- if (listener) {20712071- nfo.cm_id = listener->cm_id;20722072- nfo.conn_type = listener->conn_type;20732073- } else {20742074- nfo.cm_id = NULL;20752075- nfo.conn_type = 0;20762076- }20772077-20782078- cm_node = make_cm_node(cm_core, nesvnic, &nfo, listener);20791861 if (!cm_node) {20802080- nes_debug(NES_DBG_CM, "Unable to allocate node\n");18621862+ /* Only type of packet accepted are for */18631863+ /* the PASSIVE open (syn only) */18641864+ if ((!tcph->syn) || (tcph->ack)) {18651865+ cm_packets_dropped++;18661866+ break;18671867+ }18681868+ listener = find_listener(cm_core, nfo.loc_addr,18691869+ nfo.loc_port,18701870+ NES_CM_LISTENER_ACTIVE_STATE);20811871 if (listener) {20822082- nes_debug(NES_DBG_CM, "unable to allocate node and decrementing listener refcount\n");18721872+ nfo.cm_id = listener->cm_id;18731873+ nfo.conn_type = listener->conn_type;18741874+ } else {18751875+ nes_debug(NES_DBG_CM, "Unable to find listener "18761876+ "for the pkt\n");18771877+ cm_packets_dropped++;18781878+ dev_kfree_skb_any(skb);18791879+ break;18801880+ }18811881+18821882+ cm_node = make_cm_node(cm_core, nesvnic, &nfo,18831883+ listener);18841884+ if (!cm_node) {18851885+ nes_debug(NES_DBG_CM, "Unable to allocate "18861886+ "node\n");18871887+ cm_packets_dropped++;20831888 atomic_dec(&listener->ref_count);18891889+ dev_kfree_skb_any(skb);18901890+ break;20841891 }20852085- ret = -1;20862086- goto out;20872087- }20882088- if (!listener) {20892089- nes_debug(NES_DBG_CM, "Packet found for unknown port %x refcnt=%d\n",20902090- nfo.loc_port, atomic_read(&cm_node->ref_count));20912091- if (!tcph->rst) {20922092- nes_debug(NES_DBG_CM, "Packet found for unknown port=%d"20932093- " rem_port=%d refcnt=%d\n",20942094- nfo.loc_port, nfo.rem_port, atomic_read(&cm_node->ref_count));20952095-20962096- cm_node->tcp_cntxt.rcv_nxt = ntohl(tcph->seq);20972097- cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq);20982098- send_reset(cm_node);18921892+ if (!tcph->rst && !tcph->fin) {18931893+ cm_node->state = NES_CM_STATE_LISTENING;18941894+ } else {18951895+ cm_packets_dropped++;18961896+ rem_ref_cm_node(cm_core, cm_node);18971897+ dev_kfree_skb_any(skb);18981898+ break;20991899 }19001900+ add_ref_cm_node(cm_node);19011901+ } else if (cm_node->state == NES_CM_STATE_TSA) {21001902 rem_ref_cm_node(cm_core, cm_node);21012101- ret = -1;21022102- goto out;19031903+ atomic_inc(&cm_accel_dropped_pkts);19041904+ dev_kfree_skb_any(skb);19051905+ break;21031906 }21042104- add_ref_cm_node(cm_node);21052105- cm_node->state = NES_CM_STATE_LISTENING;21062106- }21072107-21082108- nes_debug(NES_DBG_CM, "Processing Packet for node %p, data = (%p):\n",21092109- cm_node, skb->data);21102110- process_packet(cm_node, skb, cm_core);21112111-21122112- rem_ref_cm_node(cm_core, cm_node);21132113- out:21142114- if (skb)21152115- dev_kfree_skb_any(skb);21162116- return ret;19071907+ process_packet(cm_node, skb, cm_core);19081908+ rem_ref_cm_node(cm_core, cm_node);19091909+ } while (0);21171910}2118191121191912···23122107 if (nesqp->disconn_pending == 0) {23132108 nesqp->disconn_pending++;23142109 spin_unlock_irqrestore(&nesqp->lock, flags);23152315- /* nes_add_ref(&nesqp->ibqp); */23162110 /* init our disconnect work element, to */23172111 INIT_WORK(&nesqp->disconn_work, nes_disconnect_worker);2318211223192113 queue_work(g_cm_core->disconn_wq, &nesqp->disconn_work);23202320- } else {21142114+ } else23212115 spin_unlock_irqrestore(&nesqp->lock, flags);23222322- nes_rem_ref(&nesqp->ibqp);23232323- }2324211623252117 return 0;23262118}···23632161 nes_debug(NES_DBG_CM, "QP%u disconnect_worker cmid is NULL\n",23642162 nesqp->hwqp.qp_id);23652163 spin_unlock_irqrestore(&nesqp->lock, flags);23662366- nes_rem_ref(&nesqp->ibqp);23672164 return -1;23682165 }23692166···23832182 atomic_inc(&cm_disconnects);23842183 cm_event.event = IW_CM_EVENT_DISCONNECT;23852184 if (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET) {23862386- issued_disconnect_reset = 1;23872185 cm_event.status = IW_CM_EVENT_STATUS_RESET;23882388- nes_debug(NES_DBG_CM, "Generating a CM Disconnect Event (status reset) for "23892389- " QP%u, cm_id = %p. \n",23902390- nesqp->hwqp.qp_id, cm_id);23912391- } else {21862186+ nes_debug(NES_DBG_CM, "Generating a CM "21872187+ "Disconnect Event (status reset) for "21882188+ "QP%u, cm_id = %p. \n",21892189+ nesqp->hwqp.qp_id, cm_id);21902190+ } else23922191 cm_event.status = IW_CM_EVENT_STATUS_OK;23932393- }2394219223952193 cm_event.local_addr = cm_id->local_addr;23962194 cm_event.remote_addr = cm_id->remote_addr;23972195 cm_event.private_data = NULL;23982196 cm_event.private_data_len = 0;2399219724002400- nes_debug(NES_DBG_CM, "Generating a CM Disconnect Event for "24012401- " QP%u, SQ Head = %u, SQ Tail = %u. cm_id = %p, refcount = %u.\n",24022402- nesqp->hwqp.qp_id,24032403- nesqp->hwqp.sq_head, nesqp->hwqp.sq_tail, cm_id,24042404- atomic_read(&nesqp->refcount));21982198+ nes_debug(NES_DBG_CM, "Generating a CM Disconnect Event"21992199+ " for QP%u, SQ Head = %u, SQ Tail = %u. "22002200+ "cm_id = %p, refcount = %u.\n",22012201+ nesqp->hwqp.qp_id, nesqp->hwqp.sq_head,22022202+ nesqp->hwqp.sq_tail, cm_id,22032203+ atomic_read(&nesqp->refcount));2405220424062205 spin_unlock_irqrestore(&nesqp->lock, flags);24072206 ret = cm_id->event_handler(cm_id, &cm_event);24082207 if (ret)24092409- nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);22082208+ nes_debug(NES_DBG_CM, "OFA CM event_handler "22092209+ "returned, ret=%d\n", ret);24102210 spin_lock_irqsave(&nesqp->lock, flags);24112211 }24122212···24492247 if (nesqp->flush_issued == 0) {24502248 nesqp->flush_issued = 1;24512249 spin_unlock_irqrestore(&nesqp->lock, flags);24522452- flush_wqes(nesvnic->nesdev, nesqp, NES_CQP_FLUSH_RQ, 1);24532453- } else {22502250+ flush_wqes(nesvnic->nesdev, nesqp,22512251+ NES_CQP_FLUSH_RQ, 1);22522252+ } else24542253 spin_unlock_irqrestore(&nesqp->lock, flags);24552455- }24562456-24572457- /* This reference is from either ModifyQP or the AE processing,24582458- there is still a race here with modifyqp */24592459- nes_rem_ref(&nesqp->ibqp);24602460-24612254 } else {24622255 cm_id = nesqp->cm_id;24632256 spin_unlock_irqrestore(&nesqp->lock, flags);24642257 /* check to see if the inbound reset beat the outbound reset */24652258 if ((!cm_id) && (last_ae==NES_AEQE_AEID_RESET_SENT)) {24662466- nes_debug(NES_DBG_CM, "QP%u: Decing refcount due to inbound reset"24672467- " beating the outbound reset.\n",24682468- nesqp->hwqp.qp_id);24692469- nes_rem_ref(&nesqp->ibqp);22592259+ nes_debug(NES_DBG_CM, "QP%u: Decing refcount "22602260+ "due to inbound reset beating the "22612261+ "outbound reset.\n", nesqp->hwqp.qp_id);24702262 }24712263 }24722264 } else {24732265 nesqp->disconn_pending = 0;24742266 spin_unlock_irqrestore(&nesqp->lock, flags);24752267 }24762476- nes_rem_ref(&nesqp->ibqp);2477226824782269 return 0;24792270}···25442349 nesdev = nesvnic->nesdev;25452350 adapter = nesdev->nesadapter;2546235125472547- nes_debug(NES_DBG_CM, "nesvnic=%p, netdev=%p, %s\n",25482548- nesvnic, nesvnic->netdev, nesvnic->netdev->name);25492549-25502550- /* since this is from a listen, we were able to put node handle into cm_id */25512352 cm_node = (struct nes_cm_node *)cm_id->provider_data;23532353+ nes_debug(NES_DBG_CM, "nes_accept: cm_node= %p nesvnic=%p, netdev=%p,"23542354+ "%s\n", cm_node, nesvnic, nesvnic->netdev,23552355+ nesvnic->netdev->name);2552235625532357 /* associate the node with the QP */25542358 nesqp->cm_node = (void *)cm_node;23592359+ cm_node->nesqp = nesqp;23602360+ nes_add_ref(&nesqp->ibqp);2555236125562556- nes_debug(NES_DBG_CM, "QP%u, cm_node=%p, jiffies = %lu\n",25572557- nesqp->hwqp.qp_id, cm_node, jiffies);23622362+ nes_debug(NES_DBG_CM, "QP%u, cm_node=%p, jiffies = %lu listener = %p\n",23632363+ nesqp->hwqp.qp_id, cm_node, jiffies, cm_node->listener);25582364 atomic_inc(&cm_accepts);2559236525602366 nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",25612367 atomic_read(&nesvnic->netdev->refcnt));2562236825632563- /* allocate the ietf frame and space for private data */25642564- nesqp->ietf_frame = pci_alloc_consistent(nesdev->pcidev,25652565- sizeof(struct ietf_mpa_frame) + conn_param->private_data_len,25662566- &nesqp->ietf_frame_pbase);23692369+ /* allocate the ietf frame and space for private data */23702370+ nesqp->ietf_frame = pci_alloc_consistent(nesdev->pcidev,23712371+ sizeof(struct ietf_mpa_frame) + conn_param->private_data_len,23722372+ &nesqp->ietf_frame_pbase);2567237325682568- if (!nesqp->ietf_frame) {25692569- nes_debug(NES_DBG_CM, "Unable to allocate memory for private data\n");25702570- return -ENOMEM;25712571- }23742374+ if (!nesqp->ietf_frame) {23752375+ nes_debug(NES_DBG_CM, "Unable to allocate memory for private "23762376+ "data\n");23772377+ return -ENOMEM;23782378+ }257223792573238025742574- /* setup the MPA frame */25752575- nesqp->private_data_len = conn_param->private_data_len;25762576- memcpy(nesqp->ietf_frame->key, IEFT_MPA_KEY_REP, IETF_MPA_KEY_SIZE);23812381+ /* setup the MPA frame */23822382+ nesqp->private_data_len = conn_param->private_data_len;23832383+ memcpy(nesqp->ietf_frame->key, IEFT_MPA_KEY_REP, IETF_MPA_KEY_SIZE);2577238425782578- memcpy(nesqp->ietf_frame->priv_data, conn_param->private_data,25792579- conn_param->private_data_len);23852385+ memcpy(nesqp->ietf_frame->priv_data, conn_param->private_data,23862386+ conn_param->private_data_len);2580238725812581- nesqp->ietf_frame->priv_data_len = cpu_to_be16(conn_param->private_data_len);25822582- nesqp->ietf_frame->rev = mpa_version;25832583- nesqp->ietf_frame->flags = IETF_MPA_FLAGS_CRC;23882388+ nesqp->ietf_frame->priv_data_len =23892389+ cpu_to_be16(conn_param->private_data_len);23902390+ nesqp->ietf_frame->rev = mpa_version;23912391+ nesqp->ietf_frame->flags = IETF_MPA_FLAGS_CRC;2584239225852585- /* setup our first outgoing iWarp send WQE (the IETF frame response) */25862586- wqe = &nesqp->hwqp.sq_vbase[0];23932393+ /* setup our first outgoing iWarp send WQE (the IETF frame response) */23942394+ wqe = &nesqp->hwqp.sq_vbase[0];2587239525882588- if (cm_id->remote_addr.sin_addr.s_addr != cm_id->local_addr.sin_addr.s_addr) {25892589- u64temp = (unsigned long)nesqp;25902590- u64temp |= NES_SW_CONTEXT_ALIGN>>1;25912591- set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX,25922592- u64temp);25932593- wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] =25942594- cpu_to_le32(NES_IWARP_SQ_WQE_STREAMING | NES_IWARP_SQ_WQE_WRPDU);25952595- wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] =25962596- cpu_to_le32(conn_param->private_data_len + sizeof(struct ietf_mpa_frame));25972597- wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] =25982598- cpu_to_le32((u32)nesqp->ietf_frame_pbase);25992599- wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] =26002600- cpu_to_le32((u32)((u64)nesqp->ietf_frame_pbase >> 32));26012601- wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =26022602- cpu_to_le32(conn_param->private_data_len + sizeof(struct ietf_mpa_frame));26032603- wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;23962396+ if (cm_id->remote_addr.sin_addr.s_addr !=23972397+ cm_id->local_addr.sin_addr.s_addr) {23982398+ u64temp = (unsigned long)nesqp;23992399+ u64temp |= NES_SW_CONTEXT_ALIGN>>1;24002400+ set_wqe_64bit_value(wqe->wqe_words,24012401+ NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX,24022402+ u64temp);24032403+ wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] =24042404+ cpu_to_le32(NES_IWARP_SQ_WQE_STREAMING |24052405+ NES_IWARP_SQ_WQE_WRPDU);24062406+ wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] =24072407+ cpu_to_le32(conn_param->private_data_len +24082408+ sizeof(struct ietf_mpa_frame));24092409+ wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] =24102410+ cpu_to_le32((u32)nesqp->ietf_frame_pbase);24112411+ wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] =24122412+ cpu_to_le32((u32)((u64)nesqp->ietf_frame_pbase >> 32));24132413+ wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =24142414+ cpu_to_le32(conn_param->private_data_len +24152415+ sizeof(struct ietf_mpa_frame));24162416+ wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;2604241726052605- nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32(26062606- NES_QPCONTEXT_ORDIRD_LSMM_PRESENT | NES_QPCONTEXT_ORDIRD_WRPDU);26072607- } else {26082608- nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32((NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |26092609- NES_QPCONTEXT_ORDIRD_WRPDU | NES_QPCONTEXT_ORDIRD_ALSMM));26102610- }26112611- nesqp->skip_lsmm = 1;24182418+ nesqp->nesqp_context->ird_ord_sizes |=24192419+ cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |24202420+ NES_QPCONTEXT_ORDIRD_WRPDU);24212421+ } else {24222422+ nesqp->nesqp_context->ird_ord_sizes |=24232423+ cpu_to_le32((NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |24242424+ NES_QPCONTEXT_ORDIRD_WRPDU |24252425+ NES_QPCONTEXT_ORDIRD_ALSMM));24262426+ }24272427+ nesqp->skip_lsmm = 1;261224282613242926142430 /* Cache the cm_id in the qp */···26302424 cm_id->provider_data = nesqp;26312425 nesqp->active_conn = 0;2632242624272427+ if (cm_node->state == NES_CM_STATE_TSA)24282428+ nes_debug(NES_DBG_CM, "Already state = TSA for cm_node=%p\n",24292429+ cm_node);24302430+26332431 nes_cm_init_tsa_conn(nesqp, cm_node);2634243226352635- nesqp->nesqp_context->tcpPorts[0] = cpu_to_le16(ntohs(cm_id->local_addr.sin_port));26362636- nesqp->nesqp_context->tcpPorts[1] = cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));26372637- nesqp->nesqp_context->ip0 = cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));24332433+ nesqp->nesqp_context->tcpPorts[0] =24342434+ cpu_to_le16(ntohs(cm_id->local_addr.sin_port));24352435+ nesqp->nesqp_context->tcpPorts[1] =24362436+ cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));24372437+24382438+ if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))24392439+ nesqp->nesqp_context->ip0 =24402440+ cpu_to_le32(ntohl(nesvnic->local_ipaddr));24412441+ else24422442+ nesqp->nesqp_context->ip0 =24432443+ cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));2638244426392445 nesqp->nesqp_context->misc2 |= cpu_to_le32(26402640- (u32)PCI_FUNC(nesdev->pcidev->devfn) << NES_QPCONTEXT_MISC2_SRC_IP_SHIFT);24462446+ (u32)PCI_FUNC(nesdev->pcidev->devfn) <<24472447+ NES_QPCONTEXT_MISC2_SRC_IP_SHIFT);2641244826422642- nesqp->nesqp_context->arp_index_vlan |= cpu_to_le32(26432643- nes_arp_table(nesdev, le32_to_cpu(nesqp->nesqp_context->ip0), NULL,24492449+ nesqp->nesqp_context->arp_index_vlan |=24502450+ cpu_to_le32(nes_arp_table(nesdev,24512451+ le32_to_cpu(nesqp->nesqp_context->ip0), NULL,26442452 NES_ARP_RESOLVE) << 16);2645245326462454 nesqp->nesqp_context->ts_val_delta = cpu_to_le32(26472647- jiffies - nes_read_indexed(nesdev, NES_IDX_TCP_NOW));24552455+ jiffies - nes_read_indexed(nesdev, NES_IDX_TCP_NOW));2648245626492457 nesqp->nesqp_context->ird_index = cpu_to_le32(nesqp->hwqp.qp_id);2650245826512459 nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32(26522652- ((u32)1 << NES_QPCONTEXT_ORDIRD_IWARP_MODE_SHIFT));26532653- nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32((u32)conn_param->ord);24602460+ ((u32)1 << NES_QPCONTEXT_ORDIRD_IWARP_MODE_SHIFT));24612461+ nesqp->nesqp_context->ird_ord_sizes |=24622462+ cpu_to_le32((u32)conn_param->ord);2654246326552464 memset(&nes_quad, 0, sizeof(nes_quad));26562656- nes_quad.DstIpAdrIndex = cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);26572657- nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;26582658- nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port;26592659- nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port;24652465+ nes_quad.DstIpAdrIndex =24662466+ cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);24672467+ if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))24682468+ nes_quad.SrcIpadr = nesvnic->local_ipaddr;24692469+ else24702470+ nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;24712471+ nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port;24722472+ nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port;2660247326612474 /* Produce hash key */26622475 crc_value = get_crc_value(&nes_quad);26632476 nesqp->hte_index = cpu_to_be32(crc_value ^ 0xffffffff);26642477 nes_debug(NES_DBG_CM, "HTE Index = 0x%08X, CRC = 0x%08X\n",26652665- nesqp->hte_index, nesqp->hte_index & adapter->hte_index_mask);24782478+ nesqp->hte_index, nesqp->hte_index & adapter->hte_index_mask);2666247926672480 nesqp->hte_index &= adapter->hte_index_mask;26682481 nesqp->nesqp_context->hte_index = cpu_to_le32(nesqp->hte_index);2669248226702483 cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node);2671248426722672- nes_debug(NES_DBG_CM, "QP%u, Destination IP = 0x%08X:0x%04X, local = 0x%08X:0x%04X,"26732673- " rcv_nxt=0x%08X, snd_nxt=0x%08X, mpa + private data length=%zu.\n",26742674- nesqp->hwqp.qp_id,24852485+ nes_debug(NES_DBG_CM, "QP%u, Destination IP = 0x%08X:0x%04X, local = "24862486+ "0x%08X:0x%04X, rcv_nxt=0x%08X, snd_nxt=0x%08X, mpa + "24872487+ "private data length=%zu.\n", nesqp->hwqp.qp_id,26752488 ntohl(cm_id->remote_addr.sin_addr.s_addr),26762489 ntohs(cm_id->remote_addr.sin_port),26772490 ntohl(cm_id->local_addr.sin_addr.s_addr),26782491 ntohs(cm_id->local_addr.sin_port),26792492 le32_to_cpu(nesqp->nesqp_context->rcv_nxt),26802493 le32_to_cpu(nesqp->nesqp_context->snd_nxt),26812681- conn_param->private_data_len+sizeof(struct ietf_mpa_frame));24942494+ conn_param->private_data_len +24952495+ sizeof(struct ietf_mpa_frame));2682249626832497 attr.qp_state = IB_QPS_RTS;26842498 nes_modify_qp(&nesqp->ibqp, &attr, IB_QP_STATE, NULL);···27152489 cm_event.private_data_len = 0;27162490 ret = cm_id->event_handler(cm_id, &cm_event);27172491 if (cm_node->loopbackpartner) {27182718- cm_node->loopbackpartner->mpa_frame_size = nesqp->private_data_len;24922492+ cm_node->loopbackpartner->mpa_frame_size =24932493+ nesqp->private_data_len;27192494 /* copy entire MPA frame to our cm_node's frame */27202720- memcpy(cm_node->loopbackpartner->mpa_frame_buf, nesqp->ietf_frame->priv_data,27212721- nesqp->private_data_len);24952495+ memcpy(cm_node->loopbackpartner->mpa_frame_buf,24962496+ nesqp->ietf_frame->priv_data, nesqp->private_data_len);27222497 create_event(cm_node->loopbackpartner, NES_CM_EVENT_CONNECTED);27232498 }27242499 if (ret)27252725- printk("%s[%u] OFA CM event_handler returned, ret=%d\n",27262726- __func__, __LINE__, ret);25002500+ printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "25012501+ "ret=%d\n", __func__, __LINE__, ret);2727250227282503 return 0;27292504}···27822555 if (!nesdev)27832556 return -EINVAL;2784255725582558+ nes_debug(NES_DBG_CM, "QP%u, current IP = 0x%08X, Destination IP = "25592559+ "0x%08X:0x%04X, local = 0x%08X:0x%04X.\n", nesqp->hwqp.qp_id,25602560+ ntohl(nesvnic->local_ipaddr),25612561+ ntohl(cm_id->remote_addr.sin_addr.s_addr),25622562+ ntohs(cm_id->remote_addr.sin_port),25632563+ ntohl(cm_id->local_addr.sin_addr.s_addr),25642564+ ntohs(cm_id->local_addr.sin_port));25652565+27852566 atomic_inc(&cm_connects);27862786-27872787- nesqp->ietf_frame = kzalloc(sizeof(struct ietf_mpa_frame) +27882788- conn_param->private_data_len, GFP_KERNEL);27892789- if (!nesqp->ietf_frame)27902790- return -ENOMEM;27912791-27922792- /* set qp as having an active connection */27932567 nesqp->active_conn = 1;27942794-27952795- nes_debug(NES_DBG_CM, "QP%u, Destination IP = 0x%08X:0x%04X, local = 0x%08X:0x%04X.\n",27962796- nesqp->hwqp.qp_id,27972797- ntohl(cm_id->remote_addr.sin_addr.s_addr),27982798- ntohs(cm_id->remote_addr.sin_port),27992799- ntohl(cm_id->local_addr.sin_addr.s_addr),28002800- ntohs(cm_id->local_addr.sin_port));2801256828022569 /* cache the cm_id in the qp */28032570 nesqp->cm_id = cm_id;2804257128052572 cm_id->provider_data = nesqp;2806257328072807- /* copy the private data */28082808- if (conn_param->private_data_len) {28092809- memcpy(nesqp->ietf_frame->priv_data, conn_param->private_data,28102810- conn_param->private_data_len);28112811- }28122812-28132574 nesqp->private_data_len = conn_param->private_data_len;28142575 nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32((u32)conn_param->ord);28152576 nes_debug(NES_DBG_CM, "requested ord = 0x%08X.\n", (u32)conn_param->ord);28162816- nes_debug(NES_DBG_CM, "mpa private data len =%u\n", conn_param->private_data_len);25772577+ nes_debug(NES_DBG_CM, "mpa private data len =%u\n",25782578+ conn_param->private_data_len);2817257928182818- strcpy(&nesqp->ietf_frame->key[0], IEFT_MPA_KEY_REQ);28192819- nesqp->ietf_frame->flags = IETF_MPA_FLAGS_CRC;28202820- nesqp->ietf_frame->rev = IETF_MPA_VERSION;28212821- nesqp->ietf_frame->priv_data_len = htons(conn_param->private_data_len);28222822-28232823- if (cm_id->local_addr.sin_addr.s_addr != cm_id->remote_addr.sin_addr.s_addr)25802580+ if (cm_id->local_addr.sin_addr.s_addr !=25812581+ cm_id->remote_addr.sin_addr.s_addr)28242582 nes_manage_apbvt(nesvnic, ntohs(cm_id->local_addr.sin_port),28252825- PCI_FUNC(nesdev->pcidev->devfn), NES_MANAGE_APBVT_ADD);25832583+ PCI_FUNC(nesdev->pcidev->devfn), NES_MANAGE_APBVT_ADD);2826258428272585 /* set up the connection params for the node */28282828- cm_info.loc_addr = (cm_id->local_addr.sin_addr.s_addr);28292829- cm_info.loc_port = (cm_id->local_addr.sin_port);28302830- cm_info.rem_addr = (cm_id->remote_addr.sin_addr.s_addr);28312831- cm_info.rem_port = (cm_id->remote_addr.sin_port);25862586+ cm_info.loc_addr = htonl(cm_id->local_addr.sin_addr.s_addr);25872587+ cm_info.loc_port = htons(cm_id->local_addr.sin_port);25882588+ cm_info.rem_addr = htonl(cm_id->remote_addr.sin_addr.s_addr);25892589+ cm_info.rem_port = htons(cm_id->remote_addr.sin_port);28322590 cm_info.cm_id = cm_id;28332591 cm_info.conn_type = NES_CM_IWARP_CONN_TYPE;2834259228352593 cm_id->add_ref(cm_id);28362836- nes_add_ref(&nesqp->ibqp);2837259428382595 /* create a connect CM node connection */28392839- cm_node = g_cm_core->api->connect(g_cm_core, nesvnic, nesqp->ietf_frame, &cm_info);25962596+ cm_node = g_cm_core->api->connect(g_cm_core, nesvnic,25972597+ conn_param->private_data_len, (void *)conn_param->private_data,25982598+ &cm_info);28402599 if (!cm_node) {28412841- if (cm_id->local_addr.sin_addr.s_addr != cm_id->remote_addr.sin_addr.s_addr)26002600+ if (cm_id->local_addr.sin_addr.s_addr !=26012601+ cm_id->remote_addr.sin_addr.s_addr)28422602 nes_manage_apbvt(nesvnic, ntohs(cm_id->local_addr.sin_port),28432843- PCI_FUNC(nesdev->pcidev->devfn), NES_MANAGE_APBVT_DEL);28442844- nes_rem_ref(&nesqp->ibqp);28452845- kfree(nesqp->ietf_frame);28462846- nesqp->ietf_frame = NULL;26032603+ PCI_FUNC(nesdev->pcidev->devfn),26042604+ NES_MANAGE_APBVT_DEL);26052605+28472606 cm_id->rem_ref(cm_id);28482607 return -ENOMEM;28492608 }2850260928512610 cm_node->apbvt_set = 1;28522611 nesqp->cm_node = cm_node;26122612+ cm_node->nesqp = nesqp;2853261328542614 return 0;28552615}···2878266428792665 cm_node = g_cm_core->api->listen(g_cm_core, nesvnic, &cm_info);28802666 if (!cm_node) {28812881- printk("%s[%u] Error returned from listen API call\n",26672667+ printk(KERN_ERR "%s[%u] Error returned from listen API call\n",28822668 __func__, __LINE__);28832669 return -ENOMEM;28842670 }···28862672 cm_id->provider_data = cm_node;2887267328882674 if (!cm_node->reused_node) {28892889- err = nes_manage_apbvt(nesvnic, ntohs(cm_id->local_addr.sin_port),28902890- PCI_FUNC(nesvnic->nesdev->pcidev->devfn), NES_MANAGE_APBVT_ADD);26752675+ err = nes_manage_apbvt(nesvnic,26762676+ ntohs(cm_id->local_addr.sin_port),26772677+ PCI_FUNC(nesvnic->nesdev->pcidev->devfn),26782678+ NES_MANAGE_APBVT_ADD);28912679 if (err) {28922892- printk("nes_manage_apbvt call returned %d.\n", err);26802680+ printk(KERN_ERR "nes_manage_apbvt call returned %d.\n",26812681+ err);28932682 g_cm_core->api->stop_listener(g_cm_core, (void *)cm_node);28942683 return err;28952684 }···30122795 nes_cm_init_tsa_conn(nesqp, cm_node);3013279630142797 /* set the QP tsa context */30153015- nesqp->nesqp_context->tcpPorts[0] = cpu_to_le16(ntohs(cm_id->local_addr.sin_port));30163016- nesqp->nesqp_context->tcpPorts[1] = cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));30173017- nesqp->nesqp_context->ip0 = cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));27982798+ nesqp->nesqp_context->tcpPorts[0] =27992799+ cpu_to_le16(ntohs(cm_id->local_addr.sin_port));28002800+ nesqp->nesqp_context->tcpPorts[1] =28012801+ cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));28022802+ if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))28032803+ nesqp->nesqp_context->ip0 =28042804+ cpu_to_le32(ntohl(nesvnic->local_ipaddr));28052805+ else28062806+ nesqp->nesqp_context->ip0 =28072807+ cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));3018280830192809 nesqp->nesqp_context->misc2 |= cpu_to_le32(30203020- (u32)PCI_FUNC(nesdev->pcidev->devfn) << NES_QPCONTEXT_MISC2_SRC_IP_SHIFT);28102810+ (u32)PCI_FUNC(nesdev->pcidev->devfn) <<28112811+ NES_QPCONTEXT_MISC2_SRC_IP_SHIFT);30212812 nesqp->nesqp_context->arp_index_vlan |= cpu_to_le32(30223022- nes_arp_table(nesdev, le32_to_cpu(nesqp->nesqp_context->ip0),28132813+ nes_arp_table(nesdev,28142814+ le32_to_cpu(nesqp->nesqp_context->ip0),30232815 NULL, NES_ARP_RESOLVE) << 16);30242816 nesqp->nesqp_context->ts_val_delta = cpu_to_le32(30252817 jiffies - nes_read_indexed(nesdev, NES_IDX_TCP_NOW));30262818 nesqp->nesqp_context->ird_index = cpu_to_le32(nesqp->hwqp.qp_id);30272819 nesqp->nesqp_context->ird_ord_sizes |=30283028- cpu_to_le32((u32)1 << NES_QPCONTEXT_ORDIRD_IWARP_MODE_SHIFT);28202820+ cpu_to_le32((u32)1 <<28212821+ NES_QPCONTEXT_ORDIRD_IWARP_MODE_SHIFT);3029282230302823 /* Adjust tail for not having a LSMM */30312824 nesqp->hwqp.sq_tail = 1;3032282530332826#if defined(NES_SEND_FIRST_WRITE)30343034- if (cm_node->send_write0) {30353035- nes_debug(NES_DBG_CM, "Sending first write.\n");30363036- wqe = &nesqp->hwqp.sq_vbase[0];30373037- u64temp = (unsigned long)nesqp;30383038- u64temp |= NES_SW_CONTEXT_ALIGN>>1;30393039- set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX,30403040- u64temp);30413041- wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] = cpu_to_le32(NES_IWARP_SQ_OP_RDMAW);30423042- wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] = 0;30433043- wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] = 0;30443044- wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] = 0;30453045- wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] = 0;30463046- wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;28272827+ if (cm_node->send_write0) {28282828+ nes_debug(NES_DBG_CM, "Sending first write.\n");28292829+ wqe = &nesqp->hwqp.sq_vbase[0];28302830+ u64temp = (unsigned long)nesqp;28312831+ u64temp |= NES_SW_CONTEXT_ALIGN>>1;28322832+ set_wqe_64bit_value(wqe->wqe_words,28332833+ NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX, u64temp);28342834+ wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] =28352835+ cpu_to_le32(NES_IWARP_SQ_OP_RDMAW);28362836+ wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] = 0;28372837+ wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] = 0;28382838+ wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] = 0;28392839+ wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] = 0;28402840+ wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;3047284130483048- /* use the reserved spot on the WQ for the extra first WQE */30493049- nesqp->nesqp_context->ird_ord_sizes &= cpu_to_le32(~(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |30503050- NES_QPCONTEXT_ORDIRD_WRPDU | NES_QPCONTEXT_ORDIRD_ALSMM));30513051- nesqp->skip_lsmm = 1;30523052- nesqp->hwqp.sq_tail = 0;30533053- nes_write32(nesdev->regs + NES_WQE_ALLOC,30543054- (1 << 24) | 0x00800000 | nesqp->hwqp.qp_id);30553055- }28422842+ /* use the reserved spot on the WQ for the extra first WQE */28432843+ nesqp->nesqp_context->ird_ord_sizes &=28442844+ cpu_to_le32(~(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |28452845+ NES_QPCONTEXT_ORDIRD_WRPDU |28462846+ NES_QPCONTEXT_ORDIRD_ALSMM));28472847+ nesqp->skip_lsmm = 1;28482848+ nesqp->hwqp.sq_tail = 0;28492849+ nes_write32(nesdev->regs + NES_WQE_ALLOC,28502850+ (1 << 24) | 0x00800000 | nesqp->hwqp.qp_id);28512851+ }30562852#endif3057285330582854 memset(&nes_quad, 0, sizeof(nes_quad));3059285530603060- nes_quad.DstIpAdrIndex = cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);30613061- nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;28562856+ nes_quad.DstIpAdrIndex =28572857+ cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);28582858+ if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))28592859+ nes_quad.SrcIpadr = nesvnic->local_ipaddr;28602860+ else28612861+ nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;30622862 nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port;30632863 nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port;30642864···30922858 nesqp->private_data_len = (u8) cm_node->mpa_frame_size;30932859 cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node);3094286030953095- /* modify QP state to rts */30963096- attr.qp_state = IB_QPS_RTS;30973097- nes_modify_qp(&nesqp->ibqp, &attr, IB_QP_STATE, NULL);30983098-30992861 /* notify OF layer we successfully created the requested connection */31002862 cm_event.event = IW_CM_EVENT_CONNECT_REPLY;31012863 cm_event.status = IW_CM_EVENT_STATUS_ACCEPTED;···31002870 cm_event.local_addr.sin_port = cm_id->local_addr.sin_port;31012871 cm_event.remote_addr = cm_id->remote_addr;3102287231033103- cm_event.private_data = (void *)event->cm_node->mpa_frame_buf;31043104- cm_event.private_data_len = (u8) event->cm_node->mpa_frame_size;28732873+ cm_event.private_data = (void *)event->cm_node->mpa_frame_buf;28742874+ cm_event.private_data_len = (u8) event->cm_node->mpa_frame_size;3105287531062876 cm_event.local_addr.sin_addr.s_addr = event->cm_info.rem_addr;31072877 ret = cm_id->event_handler(cm_id, &cm_event);31082878 nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);3109287931102880 if (ret)31113111- printk("%s[%u] OFA CM event_handler returned, ret=%d\n",31123112- __func__, __LINE__, ret);31133113- nes_debug(NES_DBG_CM, "Exiting connect thread for QP%u. jiffies = %lu\n",31143114- nesqp->hwqp.qp_id, jiffies );28812881+ printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "28822882+ "ret=%d\n", __func__, __LINE__, ret);28832883+ attr.qp_state = IB_QPS_RTS;28842884+ nes_modify_qp(&nesqp->ibqp, &attr, IB_QP_STATE, NULL);3115288531163116- nes_rem_ref(&nesqp->ibqp);28862886+ nes_debug(NES_DBG_CM, "Exiting connect thread for QP%u. jiffies = "28872887+ "%lu\n", nesqp->hwqp.qp_id, jiffies);3117288831182889 return;31192890}···31582927 cm_event.private_data = NULL;31592928 cm_event.private_data_len = 0;3160292931613161- nes_debug(NES_DBG_CM, "call CM_EVENT REJECTED, local_addr=%08x, remove_addr=%08x\n",31623162- cm_event.local_addr.sin_addr.s_addr, cm_event.remote_addr.sin_addr.s_addr);29302930+ nes_debug(NES_DBG_CM, "call CM_EVENT REJECTED, local_addr=%08x, "29312931+ "remove_addr=%08x\n", cm_event.local_addr.sin_addr.s_addr,29322932+ cm_event.remote_addr.sin_addr.s_addr);3163293331642934 ret = cm_id->event_handler(cm_id, &cm_event);31652935 nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);31662936 if (ret)31673167- printk("%s[%u] OFA CM event_handler returned, ret=%d\n",31683168- __func__, __LINE__, ret);29372937+ printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "29382938+ "ret=%d\n", __func__, __LINE__, ret);31692939 nes_rem_ref(&nesqp->ibqp);31703170- cm_id->rem_ref(cm_id);29402940+ cm_id->rem_ref(cm_id);3171294129422942+ rem_ref_cm_node(event->cm_node->cm_core, event->cm_node);31722943 return;31732944}31742945···32733040 add_ref_cm_node(event->cm_node);32743041 event->cm_info.cm_id->add_ref(event->cm_info.cm_id);32753042 INIT_WORK(&event->event_work, nes_cm_event_handler);32763276- nes_debug(NES_DBG_CM, "queue_work, event=%p\n", event);30433043+ nes_debug(NES_DBG_CM, "cm_node=%p queue_work, event=%p\n",30443044+ event->cm_node, event);3277304532783046 queue_work(event->cm_node->cm_core->event_wq, &event->event_work);32793047···32903056 */32913057static void nes_cm_event_handler(struct work_struct *work)32923058{32933293- struct nes_cm_event *event = container_of(work, struct nes_cm_event, event_work);30593059+ struct nes_cm_event *event = container_of(work, struct nes_cm_event,30603060+ event_work);32943061 struct nes_cm_core *cm_core;3295306232963296- if ((!event) || (!event->cm_node) || (!event->cm_node->cm_core)) {30633063+ if ((!event) || (!event->cm_node) || (!event->cm_node->cm_core))32973064 return;32983298- }30653065+32993066 cm_core = event->cm_node->cm_core;33003067 nes_debug(NES_DBG_CM, "event=%p, event->type=%u, events posted=%u\n",33013301- event, event->type, atomic_read(&cm_core->events_posted));30683068+ event, event->type, atomic_read(&cm_core->events_posted));3302306933033070 switch (event->type) {33043304- case NES_CM_EVENT_MPA_REQ:33053305- cm_event_mpa_req(event);33063306- nes_debug(NES_DBG_CM, "CM Event: MPA REQUEST\n");30713071+ case NES_CM_EVENT_MPA_REQ:30723072+ cm_event_mpa_req(event);30733073+ nes_debug(NES_DBG_CM, "cm_node=%p CM Event: MPA REQUEST\n",30743074+ event->cm_node);30753075+ break;30763076+ case NES_CM_EVENT_RESET:30773077+ nes_debug(NES_DBG_CM, "cm_node = %p CM Event: RESET\n",30783078+ event->cm_node);30793079+ cm_event_reset(event);30803080+ break;30813081+ case NES_CM_EVENT_CONNECTED:30823082+ if ((!event->cm_node->cm_id) ||30833083+ (event->cm_node->state != NES_CM_STATE_TSA))33073084 break;33083308- case NES_CM_EVENT_RESET:33093309- nes_debug(NES_DBG_CM, "CM Event: RESET\n");33103310- cm_event_reset(event);30853085+ cm_event_connected(event);30863086+ nes_debug(NES_DBG_CM, "CM Event: CONNECTED\n");30873087+ break;30883088+ case NES_CM_EVENT_ABORTED:30893089+ if ((!event->cm_node->cm_id) ||30903090+ (event->cm_node->state == NES_CM_STATE_TSA))33113091 break;33123312- case NES_CM_EVENT_CONNECTED:33133313- if ((!event->cm_node->cm_id) ||33143314- (event->cm_node->state != NES_CM_STATE_TSA)) {33153315- break;33163316- }33173317- cm_event_connected(event);33183318- nes_debug(NES_DBG_CM, "CM Event: CONNECTED\n");33193319- break;33203320- case NES_CM_EVENT_ABORTED:33213321- if ((!event->cm_node->cm_id) || (event->cm_node->state == NES_CM_STATE_TSA)) {33223322- break;33233323- }33243324- cm_event_connect_error(event);33253325- nes_debug(NES_DBG_CM, "CM Event: ABORTED\n");33263326- break;33273327- case NES_CM_EVENT_DROPPED_PKT:33283328- nes_debug(NES_DBG_CM, "CM Event: DROPPED PKT\n");33293329- break;33303330- default:33313331- nes_debug(NES_DBG_CM, "CM Event: UNKNOWN EVENT TYPE\n");33323332- break;30923092+ cm_event_connect_error(event);30933093+ nes_debug(NES_DBG_CM, "CM Event: ABORTED\n");30943094+ break;30953095+ case NES_CM_EVENT_DROPPED_PKT:30963096+ nes_debug(NES_DBG_CM, "CM Event: DROPPED PKT\n");30973097+ break;30983098+ default:30993099+ nes_debug(NES_DBG_CM, "CM Event: UNKNOWN EVENT TYPE\n");31003100+ break;33333101 }3334310233353103 atomic_dec(&cm_core->events_posted);
+20-3
drivers/infiniband/hw/nes/nes_cm.h
···8383#define SET_FIN 48484#define SET_RST 885858686+#define TCP_OPTIONS_PADDING 38787+8688struct option_base {8789 u8 optionnum;8890 u8 length;···179177 NES_CM_STATE_ESTABLISHED,180178 NES_CM_STATE_ACCEPTING,181179 NES_CM_STATE_MPAREQ_SENT,180180+ NES_CM_STATE_MPAREQ_RCVD,182181 NES_CM_STATE_TSA,183182 NES_CM_STATE_FIN_WAIT1,184183 NES_CM_STATE_FIN_WAIT2,···189186 NES_CM_STATE_CLOSING,190187 NES_CM_STATE_CLOSED191188};189189+190190+enum nes_tcpip_pkt_type {191191+ NES_PKT_TYPE_UNKNOWN,192192+ NES_PKT_TYPE_SYN,193193+ NES_PKT_TYPE_SYNACK,194194+ NES_PKT_TYPE_ACK,195195+ NES_PKT_TYPE_FIN,196196+ NES_PKT_TYPE_RST197197+};198198+192199193200/* type of nes connection */194201enum nes_cm_conn_type {···270257 struct net_device *netdev;271258272259 struct nes_cm_node *loopbackpartner;273273- struct list_head retrans_list;260260+261261+ struct nes_timer_entry *send_entry;262262+274263 spinlock_t retrans_list_lock;275264 struct list_head recv_list;276265 spinlock_t recv_list_lock;···291276 struct nes_vnic *nesvnic;292277 int apbvt_set;293278 int accept_pend;279279+ int freed;280280+ struct nes_qp *nesqp;294281};295282296283/* structure for client or CM to fill when making CM api calls. */···383366 struct nes_cm_info *);384367 int (*stop_listener)(struct nes_cm_core *, struct nes_cm_listener *);385368 struct nes_cm_node * (*connect)(struct nes_cm_core *,386386- struct nes_vnic *, struct ietf_mpa_frame *,369369+ struct nes_vnic *, u16, void *,387370 struct nes_cm_info *);388371 int (*close)(struct nes_cm_core *, struct nes_cm_node *);389372 int (*accept)(struct nes_cm_core *, struct ietf_mpa_frame *,390373 struct nes_cm_node *);391374 int (*reject)(struct nes_cm_core *, struct ietf_mpa_frame *,392375 struct nes_cm_node *);393393- int (*recv_pkt)(struct nes_cm_core *, struct nes_vnic *,376376+ void (*recv_pkt)(struct nes_cm_core *, struct nes_vnic *,394377 struct sk_buff *);395378 int (*destroy_cm_core)(struct nes_cm_core *);396379 int (*get)(struct nes_cm_core *);
-9
drivers/infiniband/hw/nes/nes_hw.c
···28142814 nesqp = *((struct nes_qp **)&context);28152815 if (atomic_inc_return(&nesqp->close_timer_started) == 1) {28162816 nesqp->cm_id->add_ref(nesqp->cm_id);28172817- nes_add_ref(&nesqp->ibqp);28182817 schedule_nes_timer(nesqp->cm_node, (struct sk_buff *)nesqp,28192818 NES_TIMER_TYPE_CLOSE, 1, 0);28202819 nes_debug(NES_DBG_AEQ, "QP%u Not decrementing QP refcount (%d),"···28372838 if (async_event_id == NES_AEQE_AEID_RESET_SENT) {28382839 tcp_state = NES_AEQE_TCP_STATE_CLOSED;28392840 }28402840- nes_add_ref(&nesqp->ibqp);28412841 spin_lock_irqsave(&nesqp->lock, flags);28422842 nesqp->hw_iwarp_state = iwarp_state;28432843 nesqp->hw_tcp_state = tcp_state;···28742876 }28752877 spin_unlock_irqrestore(&nesqp->lock, flags);28762878 if (next_iwarp_state) {28772877- nes_add_ref(&nesqp->ibqp);28782879 nes_debug(NES_DBG_AEQ, "issuing hw modifyqp for QP%u. next state = 0x%08X,"28792880 " also added another reference\n",28802881 nesqp->hwqp.qp_id, next_iwarp_state);···28852888 /* FIN Received but ib state not RTS,28862889 close complete will be on its way */28872890 spin_unlock_irqrestore(&nesqp->lock, flags);28882888- nes_rem_ref(&nesqp->ibqp);28892891 return;28902892 }28912893 spin_unlock_irqrestore(&nesqp->lock, flags);···29182922 if ((tcp_state == NES_AEQE_TCP_STATE_CLOSE_WAIT) ||29192923 ((nesqp->ibqp_state == IB_QPS_RTS)&&29202924 (async_event_id == NES_AEQE_AEID_LLP_CONNECTION_RESET))) {29212921- nes_add_ref(&nesqp->ibqp);29222925 nes_cm_disconn(nesqp);29232926 } else {29242927 nesqp->in_disconnect = 0;···29262931 break;29272932 case NES_AEQE_AEID_LLP_TOO_MANY_RETRIES:29282933 nesqp = *((struct nes_qp **)&context);29292929- nes_add_ref(&nesqp->ibqp);29302934 spin_lock_irqsave(&nesqp->lock, flags);29312935 nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_ERROR;29322936 nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;···30363042 nesqp->ibqp.event_handler(&ibevent, nesqp->ibqp.qp_context);30373043 }30383044 /* tell cm to disconnect, cm will queue work to thread */30393039- nes_add_ref(&nesqp->ibqp);30403045 nes_cm_disconn(nesqp);30413046 break;30423047 case NES_AEQE_AEID_DDP_UBE_INVALID_MSN_NO_BUFFER_AVAILABLE:···30553062 nesqp->ibqp.event_handler(&ibevent, nesqp->ibqp.qp_context);30563063 }30573064 /* tell cm to disconnect, cm will queue work to thread */30583058- nes_add_ref(&nesqp->ibqp);30593065 nes_cm_disconn(nesqp);30603066 break;30613067 case NES_AEQE_AEID_LLP_RECEIVED_MPA_CRC_ERROR:···30743082 nesqp->ibqp.event_handler(&ibevent, nesqp->ibqp.qp_context);30753083 }30763084 /* tell cm to disconnect, cm will queue work to thread */30773077- nes_add_ref(&nesqp->ibqp);30783085 nes_cm_disconn(nesqp);30793086 break;30803087 /* TODO: additional AEs need to be here */
-15
drivers/infiniband/hw/nes/nes_verbs.c
···28672867 nesqp->hwqp.qp_id, attr->qp_state, nesqp->ibqp_state,28682868 nesqp->iwarp_state, atomic_read(&nesqp->refcount));2869286928702870- nes_add_ref(&nesqp->ibqp);28712870 spin_lock_irqsave(&nesqp->lock, qplockflags);2872287128732872 nes_debug(NES_DBG_MOD_QP, "QP%u: hw_iwarp_state=0x%X, hw_tcp_state=0x%X,"···28812882 nesqp->hwqp.qp_id);28822883 if (nesqp->iwarp_state > (u32)NES_CQP_QP_IWARP_STATE_IDLE) {28832884 spin_unlock_irqrestore(&nesqp->lock, qplockflags);28842884- nes_rem_ref(&nesqp->ibqp);28852885 return -EINVAL;28862886 }28872887 next_iwarp_state = NES_CQP_QP_IWARP_STATE_IDLE;···28912893 nesqp->hwqp.qp_id);28922894 if (nesqp->iwarp_state>(u32)NES_CQP_QP_IWARP_STATE_IDLE) {28932895 spin_unlock_irqrestore(&nesqp->lock, qplockflags);28942894- nes_rem_ref(&nesqp->ibqp);28952896 return -EINVAL;28962897 }28972898 next_iwarp_state = NES_CQP_QP_IWARP_STATE_IDLE;···29012904 nesqp->hwqp.qp_id);29022905 if (nesqp->iwarp_state>(u32)NES_CQP_QP_IWARP_STATE_RTS) {29032906 spin_unlock_irqrestore(&nesqp->lock, qplockflags);29042904- nes_rem_ref(&nesqp->ibqp);29052907 return -EINVAL;29062908 }29072909 if (nesqp->cm_id == NULL) {29082910 nes_debug(NES_DBG_MOD_QP, "QP%u: Failing attempt to move QP to RTS without a CM_ID. \n",29092911 nesqp->hwqp.qp_id );29102912 spin_unlock_irqrestore(&nesqp->lock, qplockflags);29112911- nes_rem_ref(&nesqp->ibqp);29122913 return -EINVAL;29132914 }29142915 next_iwarp_state = NES_CQP_QP_IWARP_STATE_RTS;···29242929 nesqp->hwqp.qp_id, nesqp->hwqp.sq_head, nesqp->hwqp.sq_tail);29252930 if (nesqp->iwarp_state == (u32)NES_CQP_QP_IWARP_STATE_CLOSING) {29262931 spin_unlock_irqrestore(&nesqp->lock, qplockflags);29272927- nes_rem_ref(&nesqp->ibqp);29282932 return 0;29292933 } else {29302934 if (nesqp->iwarp_state > (u32)NES_CQP_QP_IWARP_STATE_CLOSING) {···29312937 " ignored due to current iWARP state\n",29322938 nesqp->hwqp.qp_id);29332939 spin_unlock_irqrestore(&nesqp->lock, qplockflags);29342934- nes_rem_ref(&nesqp->ibqp);29352940 return -EINVAL;29362941 }29372942 if (nesqp->hw_iwarp_state != NES_AEQE_IWARP_STATE_RTS) {···29622969 nesqp->hwqp.qp_id);29632970 if (nesqp->iwarp_state>=(u32)NES_CQP_QP_IWARP_STATE_TERMINATE) {29642971 spin_unlock_irqrestore(&nesqp->lock, qplockflags);29652965- nes_rem_ref(&nesqp->ibqp);29662972 return -EINVAL;29672973 }29682974 /* next_iwarp_state = (NES_CQP_QP_IWARP_STATE_TERMINATE | 0x02000000); */···29742982 case IB_QPS_RESET:29752983 if (nesqp->iwarp_state == (u32)NES_CQP_QP_IWARP_STATE_ERROR) {29762984 spin_unlock_irqrestore(&nesqp->lock, qplockflags);29772977- nes_rem_ref(&nesqp->ibqp);29782985 return -EINVAL;29792986 }29802987 nes_debug(NES_DBG_MOD_QP, "QP%u: new state = error\n",···29993008 break;30003009 default:30013010 spin_unlock_irqrestore(&nesqp->lock, qplockflags);30023002- nes_rem_ref(&nesqp->ibqp);30033011 return -EINVAL;30043012 break;30053013 }···30783088 nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),30793089 original_last_aeq, nesqp->last_aeq);30803090 /* this one is for the cm_disconnect thread */30813081- nes_add_ref(&nesqp->ibqp);30823091 spin_lock_irqsave(&nesqp->lock, qplockflags);30833092 nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;30843093 nesqp->last_aeq = NES_AEQE_AEID_RESET_SENT;···30863097 } else {30873098 nes_debug(NES_DBG_MOD_QP, "QP%u No fake disconnect, QP refcount=%d\n",30883099 nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount));30893089- nes_rem_ref(&nesqp->ibqp);30903100 }30913101 } else {30923102 spin_lock_irqsave(&nesqp->lock, qplockflags);30933103 if (nesqp->cm_id) {30943104 /* These two are for the timer thread */30953105 if (atomic_inc_return(&nesqp->close_timer_started) == 1) {30963096- nes_add_ref(&nesqp->ibqp);30973106 nesqp->cm_id->add_ref(nesqp->cm_id);30983107 nes_debug(NES_DBG_MOD_QP, "QP%u Not decrementing QP refcount (%d),"30993108 " need ae to finish up, original_last_aeq = 0x%04X."···31153128 " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",31163129 nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),31173130 original_last_aeq, nesqp->last_aeq);31183118- nes_rem_ref(&nesqp->ibqp);31193131 }31203132 } else {31213133 nes_debug(NES_DBG_MOD_QP, "QP%u Decrementing QP refcount (%d), No ae to finish up,"31223134 " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",31233135 nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),31243136 original_last_aeq, nesqp->last_aeq);31253125- nes_rem_ref(&nesqp->ibqp);31263137 }3127313831283139 err = 0;
+12-10
drivers/infiniband/ulp/ipoib/Kconfig
···11111212config INFINIBAND_IPOIB_CM1313 bool "IP-over-InfiniBand Connected Mode support"1414- depends on INFINIBAND_IPOIB && EXPERIMENTAL1414+ depends on INFINIBAND_IPOIB1515 default n1616 ---help---1717- This option enables experimental support for IPoIB connected mode.1818- After enabling this option, you need to switch to connected mode through1919- /sys/class/net/ibXXX/mode to actually create connections, and then increase2020- the interface MTU with e.g. ifconfig ib0 mtu 65520.1717+ This option enables support for IPoIB connected mode. After1818+ enabling this option, you need to switch to connected mode1919+ through /sys/class/net/ibXXX/mode to actually create2020+ connections, and then increase the interface MTU with2121+ e.g. ifconfig ib0 mtu 65520.21222222- WARNING: Enabling connected mode will trigger some2323- packet drops for multicast and UD mode traffic from this interface,2323+ WARNING: Enabling connected mode will trigger some packet2424+ drops for multicast and UD mode traffic from this interface,2425 unless you limit mtu for these destinations to 2044.25262627config INFINIBAND_IPOIB_DEBUG···3433 debug_level and mcast_debug_level module parameters (which3534 can also be set after the driver is loaded through sysfs).36353737- This option also creates an "ipoib_debugfs," which can be3838- mounted to expose debugging information about IB multicast3939- groups used by the IPoIB driver.3636+ This option also creates a directory tree under ipoib/ in3737+ debugfs, which contains files that expose debugging3838+ information about IB multicast groups used by the IPoIB3939+ driver.40404141config INFINIBAND_IPOIB_DEBUG_DATA4242 bool "IP-over-InfiniBand data path debugging"
+1
drivers/net/mlx4/alloc.c
···11/*22 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1
drivers/net/mlx4/catas.c
···11/*22 * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1-1
drivers/net/mlx4/cmd.c
···11/*22 * Copyright (c) 2004, 2005 Topspin Communications. All rights reserved.33- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.33+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.44 * Copyright (c) 2005, 2006, 2007 Cisco Systems, Inc. All rights reserved.55 *66 * This software is available to you under a choice of one of two
+1-1
drivers/net/mlx4/cq.c
···22 * Copyright (c) 2004, 2005 Topspin Communications. All rights reserved.33 * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.44 * Copyright (c) 2005, 2006, 2007 Cisco Systems, Inc. All rights reserved.55- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.55+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.66 * Copyright (c) 2004 Voltaire, Inc. All rights reserved.77 *88 * This software is available to you under a choice of one of two
+1-1
drivers/net/mlx4/eq.c
···11/*22- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.22+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.33 * Copyright (c) 2005, 2006, 2007 Cisco Systems, Inc. All rights reserved.44 *55 * This software is available to you under a choice of one of two
+1-1
drivers/net/mlx4/fw.c
···11/*22 * Copyright (c) 2004, 2005 Topspin Communications. All rights reserved.33- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.33+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.44 * Copyright (c) 2005, 2006, 2007 Cisco Systems, Inc. All rights reserved.55 *66 * This software is available to you under a choice of one of two
+1-1
drivers/net/mlx4/fw.h
···11/*22 * Copyright (c) 2004, 2005 Topspin Communications. All rights reserved.33- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.33+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.44 * Copyright (c) 2006, 2007 Cisco Systems. All rights reserved.55 *66 * This software is available to you under a choice of one of two
+1-1
drivers/net/mlx4/icm.c
···11/*22- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.22+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.33 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.44 *55 * This software is available to you under a choice of one of two
+1-1
drivers/net/mlx4/icm.h
···11/*22- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.22+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.33 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.44 *55 * This software is available to you under a choice of one of two
+1
drivers/net/mlx4/intf.c
···11/*22 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1-1
drivers/net/mlx4/main.c
···11/*22 * Copyright (c) 2004, 2005 Topspin Communications. All rights reserved.33 * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.44- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.44+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.55 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.66 *77 * This software is available to you under a choice of one of two
+1
drivers/net/mlx4/mcg.c
···11/*22 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1-1
drivers/net/mlx4/mlx4.h
···22 * Copyright (c) 2004, 2005 Topspin Communications. All rights reserved.33 * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.44 * Copyright (c) 2005, 2006, 2007 Cisco Systems. All rights reserved.55- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.55+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.66 * Copyright (c) 2004 Voltaire, Inc. All rights reserved.77 *88 * This software is available to you under a choice of one of two
+1-1
drivers/net/mlx4/mr.c
···11/*22 * Copyright (c) 2004 Topspin Communications. All rights reserved.33- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.33+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.44 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.55 *66 * This software is available to you under a choice of one of two
+1-1
drivers/net/mlx4/qp.c
···11/*22 * Copyright (c) 2004 Topspin Communications. All rights reserved.33 * Copyright (c) 2005, 2006, 2007 Cisco Systems, Inc. All rights reserved.44- * Copyright (c) 2005 Mellanox Technologies. All rights reserved.44+ * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.55 * Copyright (c) 2004 Voltaire, Inc. All rights reserved.66 *77 * This software is available to you under a choice of one of two
+1
drivers/net/mlx4/reset.c
···11/*22 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU
+1
drivers/net/mlx4/srq.c
···11/*22 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.33+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.34 *45 * This software is available to you under a choice of one of two56 * licenses. You may choose to be licensed under the terms of the GNU