Commit 1660a26a authored by Tatyana Nikolova's avatar Tatyana Nikolova Committed by Doug Ledford

i40iw: Do not retransmit MPA request after it is ACKed

The ACK packets for an MPA request are ignored and
the MPA request is retransmitted if the MPA reply
is late or missing. Fix this by checking ack_rcvd
variable before retransmitting a packet.

Fixes: f27b4746 ("i40iw: add connection management code")
Signed-off-by: default avatarTatyana Nikolova <tatyana.e.nikolova@intel.com>
Signed-off-by: default avatarFaisal Latif <faisal.latif@intel.com>
Signed-off-by: default avatarShiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 63ea641f
...@@ -1267,13 +1267,16 @@ static void i40iw_cm_timer_tick(unsigned long pass) ...@@ -1267,13 +1267,16 @@ static void i40iw_cm_timer_tick(unsigned long pass)
spin_lock_irqsave(&cm_node->retrans_list_lock, flags); spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
goto done; goto done;
} }
cm_node->cm_core->stats_pkt_retrans++;
spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
vsi = &cm_node->iwdev->vsi; vsi = &cm_node->iwdev->vsi;
dev = cm_node->dev; dev = cm_node->dev;
atomic_inc(&send_entry->sqbuf->refcount);
i40iw_puda_send_buf(vsi->ilq, send_entry->sqbuf); if (!cm_node->ack_rcvd) {
atomic_inc(&send_entry->sqbuf->refcount);
i40iw_puda_send_buf(vsi->ilq, send_entry->sqbuf);
cm_node->cm_core->stats_pkt_retrans++;
}
spin_lock_irqsave(&cm_node->retrans_list_lock, flags); spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
if (send_entry->send_retrans) { if (send_entry->send_retrans) {
send_entry->retranscount--; send_entry->retranscount--;
...@@ -2181,6 +2184,7 @@ static struct i40iw_cm_node *i40iw_make_cm_node( ...@@ -2181,6 +2184,7 @@ static struct i40iw_cm_node *i40iw_make_cm_node(
cm_node->cm_id = cm_info->cm_id; cm_node->cm_id = cm_info->cm_id;
ether_addr_copy(cm_node->loc_mac, netdev->dev_addr); ether_addr_copy(cm_node->loc_mac, netdev->dev_addr);
spin_lock_init(&cm_node->retrans_list_lock); spin_lock_init(&cm_node->retrans_list_lock);
cm_node->ack_rcvd = false;
atomic_set(&cm_node->ref_count, 1); atomic_set(&cm_node->ref_count, 1);
/* associate our parent CM core */ /* associate our parent CM core */
...@@ -2719,7 +2723,10 @@ static int i40iw_handle_ack_pkt(struct i40iw_cm_node *cm_node, ...@@ -2719,7 +2723,10 @@ static int i40iw_handle_ack_pkt(struct i40iw_cm_node *cm_node,
cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq); cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);
if (datasize) { if (datasize) {
cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
cm_node->ack_rcvd = false;
i40iw_handle_rcv_mpa(cm_node, rbuf); i40iw_handle_rcv_mpa(cm_node, rbuf);
} else {
cm_node->ack_rcvd = true;
} }
break; break;
case I40IW_CM_STATE_LISTENING: case I40IW_CM_STATE_LISTENING:
......
...@@ -360,6 +360,7 @@ struct i40iw_cm_node { ...@@ -360,6 +360,7 @@ struct i40iw_cm_node {
u8 pdata_buf[IETF_MAX_PRIV_DATA_LEN]; u8 pdata_buf[IETF_MAX_PRIV_DATA_LEN];
struct i40iw_kmem_info mpa_hdr; struct i40iw_kmem_info mpa_hdr;
bool ack_rcvd;
}; };
/* structure for client or CM to fill when making CM api calls. */ /* structure for client or CM to fill when making CM api calls. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment