l4p/tcp: few fixes for sending RST packet logic
[tldk.git] / lib / libtle_l4p / tcp_rxtx.c
index 3f4f324..e785b9a 100644 (file)
@@ -473,10 +473,9 @@ tx_nxt_data(struct tle_tcp_stream *s, uint32_t tms)
 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 {
@@ -487,12 +486,14 @@ free_una_data(struct tle_tcp_stream *s, uint32_t len)
                        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]);
                }
@@ -1553,9 +1554,15 @@ rx_synack(struct tle_tcp_stream *s, uint32_t ts, uint32_t state,
        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;
        }
 
@@ -1710,10 +1717,7 @@ rx_stream(struct tle_tcp_stream *s, uint32_t ts,
                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 */
@@ -2589,7 +2593,7 @@ rto_stream(struct tle_tcp_stream *s, uint32_t tms)
                timer_restart(s);
 
        } else {
-               send_rst(s, s->tcb.snd.una);
+               send_rst(s, s->tcb.snd.nxt);
                stream_term(s);
        }
 }