static inline void
free_una_data(struct tle_tcp_stream *s, uint32_t len)
{
- uint32_t i, n, num, plen;
+ uint32_t i, num, plen;
struct rte_mbuf **mi;
- n = 0;
plen = 0;
do {
break;
/* free acked data */
- for (i = 0; i != num && n != len; i++, n = plen) {
- plen += PKT_L4_PLEN(mi[i]);
- if (plen > len) {
+ for (i = 0; i != num && plen != len; i++) {
+ uint32_t next_pkt_len = PKT_L4_PLEN(mi[i]);
+ if (plen + next_pkt_len > len) {
/* keep SND.UNA at the start of the packet */
- len -= RTE_MIN(len, plen - len);
+ len = plen;
break;
+ } else {
+ plen += next_pkt_len;
}
rte_pktmbuf_free(mi[i]);
}
if (state != TCP_ST_SYN_SENT)
return -EINVAL;
- /* invalid SEG.SEQ */
+ /*
+ * RFC 793 3.9: in the SYN-SENT state
+ * If SEG.ACK =< ISS, or SEG.ACK > SND.NXT, send a reset
+ * <SEQ=SEG.ACK><CTL=RST>
+ * and discard the segment.
+ * The connection remains in the same state.
+ */
if (si->ack != (uint32_t)s->tcb.snd.nxt) {
- rsp->flags = TCP_FLAG_RST;
+ send_rst(s, si->ack);
return 0;
}
i = 0;
/* we have a response packet to send. */
- if (rsp.flags == TCP_FLAG_RST) {
- send_rst(s, si[i].ack);
- stream_term(s);
- } else if (rsp.flags != 0) {
+ if (rsp.flags != 0) {
send_ack(s, ts, rsp.flags);
/* start the timer for FIN packet */
timer_restart(s);
} else {
- send_rst(s, s->tcb.snd.una);
+ send_rst(s, s->tcb.snd.nxt);
stream_term(s);
}
}