cxgbe tom: Permit rcv_nxt mismatches on FIN for iSCSI connections on T6.
The remote peer might send a FIN in the middle of a burst of data PDUs. In the case of T6 with data PDU completion moderation, the driver would not have seen these PDUs since the final PDU in the burst was never received resulting in a stale rcv_nxt when the FIN is received. While here, invert the logic in the condition to be more readable and always set tp->rcv_nxt from the sequence number in the CPL. This sets the proper value of rcv_nxt for FINs on connections with data received but not reported via a CPL (e.g. a partial iSCSI PDU burst interrupted by a FIN). Reported by: Jithesh Arakkan @ Chelsio Reviewed by: np Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D30871
This commit is contained in:
parent
600745f1e2
commit
d59f1c49e2
@ -1288,7 +1288,21 @@ do_peer_close(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m)
|
||||
if (toep->flags & TPF_ABORT_SHUTDOWN)
|
||||
goto done;
|
||||
|
||||
tp->rcv_nxt++; /* FIN */
|
||||
if (ulp_mode(toep) == ULP_MODE_RDMA ||
|
||||
(ulp_mode(toep) == ULP_MODE_ISCSI && chip_id(sc) >= CHELSIO_T6)) {
|
||||
/*
|
||||
* There might be data received via DDP before the FIN
|
||||
* not reported to the driver. Just assume the
|
||||
* sequence number in the CPL is correct as the
|
||||
* sequence number of the FIN.
|
||||
*/
|
||||
} else {
|
||||
KASSERT(tp->rcv_nxt + 1 == be32toh(cpl->rcv_nxt),
|
||||
("%s: rcv_nxt mismatch: %u %u", __func__, tp->rcv_nxt,
|
||||
be32toh(cpl->rcv_nxt)));
|
||||
}
|
||||
|
||||
tp->rcv_nxt = be32toh(cpl->rcv_nxt);
|
||||
|
||||
so = inp->inp_socket;
|
||||
socantrcvmore(so);
|
||||
@ -1300,12 +1314,6 @@ do_peer_close(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m)
|
||||
DDP_UNLOCK(toep);
|
||||
}
|
||||
|
||||
if (ulp_mode(toep) != ULP_MODE_RDMA) {
|
||||
KASSERT(tp->rcv_nxt == be32toh(cpl->rcv_nxt),
|
||||
("%s: rcv_nxt mismatch: %u %u", __func__, tp->rcv_nxt,
|
||||
be32toh(cpl->rcv_nxt)));
|
||||
}
|
||||
|
||||
switch (tp->t_state) {
|
||||
case TCPS_SYN_RECEIVED:
|
||||
tp->t_starttime = ticks;
|
||||
|
Loading…
Reference in New Issue
Block a user