提交 da1cecdf 编写于 作者: H Hariprasad S 提交者: Doug Ledford

RDMA/iw_cxgb4: Do not stop timer in case of incomplete messages

In case of incomplete mpa messages we should not stop timer as it
results in return with timeout for the next mpa message
Signed-off-by: NSteve Wise <swise@opengridcomputing.com>
Signed-off-by: NHariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: NDoug Ledford <dledford@redhat.com>
上级 8d1f1a6b
...@@ -1395,21 +1395,13 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) ...@@ -1395,21 +1395,13 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb)
PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid);
/*
* Stop mpa timer. If it expired, then
* we ignore the MPA reply. process_timeout()
* will abort the connection.
*/
if (stop_ep_timer(ep))
return 0;
/* /*
* If we get more than the supported amount of private data * If we get more than the supported amount of private data
* then we must fail this connection. * then we must fail this connection.
*/ */
if (ep->mpa_pkt_len + skb->len > sizeof(ep->mpa_pkt)) { if (ep->mpa_pkt_len + skb->len > sizeof(ep->mpa_pkt)) {
err = -EINVAL; err = -EINVAL;
goto err; goto err_stop_timer;
} }
/* /*
...@@ -1431,11 +1423,11 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) ...@@ -1431,11 +1423,11 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb)
printk(KERN_ERR MOD "%s MPA version mismatch. Local = %d," printk(KERN_ERR MOD "%s MPA version mismatch. Local = %d,"
" Received = %d\n", __func__, mpa_rev, mpa->revision); " Received = %d\n", __func__, mpa_rev, mpa->revision);
err = -EPROTO; err = -EPROTO;
goto err; goto err_stop_timer;
} }
if (memcmp(mpa->key, MPA_KEY_REP, sizeof(mpa->key))) { if (memcmp(mpa->key, MPA_KEY_REP, sizeof(mpa->key))) {
err = -EPROTO; err = -EPROTO;
goto err; goto err_stop_timer;
} }
plen = ntohs(mpa->private_data_size); plen = ntohs(mpa->private_data_size);
...@@ -1445,7 +1437,7 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) ...@@ -1445,7 +1437,7 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb)
*/ */
if (plen > MPA_MAX_PRIVATE_DATA) { if (plen > MPA_MAX_PRIVATE_DATA) {
err = -EPROTO; err = -EPROTO;
goto err; goto err_stop_timer;
} }
/* /*
...@@ -1453,7 +1445,7 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) ...@@ -1453,7 +1445,7 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb)
*/ */
if (ep->mpa_pkt_len > (sizeof(*mpa) + plen)) { if (ep->mpa_pkt_len > (sizeof(*mpa) + plen)) {
err = -EPROTO; err = -EPROTO;
goto err; goto err_stop_timer;
} }
ep->plen = (u8) plen; ep->plen = (u8) plen;
...@@ -1467,9 +1459,17 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) ...@@ -1467,9 +1459,17 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb)
if (mpa->flags & MPA_REJECT) { if (mpa->flags & MPA_REJECT) {
err = -ECONNREFUSED; err = -ECONNREFUSED;
goto err; goto err_stop_timer;
} }
/*
* Stop mpa timer. If it expired, then
* we ignore the MPA reply. process_timeout()
* will abort the connection.
*/
if (stop_ep_timer(ep))
return 0;
/* /*
* If we get here we have accumulated the entire mpa * If we get here we have accumulated the entire mpa
* start reply message including private data. And * start reply message including private data. And
...@@ -1609,6 +1609,8 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) ...@@ -1609,6 +1609,8 @@ static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb)
goto out; goto out;
} }
goto out; goto out;
err_stop_timer:
stop_ep_timer(ep);
err: err:
disconnect = 2; disconnect = 2;
out: out:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册