tcp: fix RCV.WND set incorreclty when peer doesn't support WSCALE option 77/5877/1
authorKonstantin Ananyev <konstantin.ananyev@intel.com>
Mon, 27 Mar 2017 17:56:04 +0000 (18:56 +0100)
committerKonstantin Ananyev <konstantin.ananyev@intel.com>
Mon, 27 Mar 2017 17:57:26 +0000 (18:57 +0100)
Change-Id: I911fdeeb25bc1112cd38eaa96c34f47a7bf49060
Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
lib/libtle_l4p/tcp_ctl.h
lib/libtle_l4p/tcp_rxtx.c

index 95c2bbc..8e15b2b 100644 (file)
@@ -45,7 +45,14 @@ tcp_stream_up(struct tle_tcp_stream *s)
 static inline uint32_t
 calc_rx_wnd(const struct tle_tcp_stream *s, uint32_t scale)
 {
-       return  s->rx.q->prod.mask << scale;
+       uint32_t wnd;
+
+       /* peer doesn't support WSCALE option, wnd size is limited to 64K */
+       if (scale == TCP_WSCALE_NONE) {
+               wnd = s->rx.q->prod.mask << TCP_WSCALE_DEFAULT;
+               return RTE_MIN(wnd, (uint32_t)UINT16_MAX);
+       } else
+               return  s->rx.q->prod.mask << scale;
 }
 
 /* empty stream's receive queue */
index a6b3989..b525751 100644 (file)
@@ -1547,6 +1547,11 @@ rx_synack(struct tle_tcp_stream *s, uint32_t ts, uint32_t state,
        s->tcb.rcv.irs = si->seq;
        s->tcb.rcv.nxt = si->seq + 1;
 
+       /* if peer doesn't support WSCALE opt, recalculate RCV.WND */
+       s->tcb.rcv.wscale = (so.wscale == TCP_WSCALE_NONE) ?
+               TCP_WSCALE_NONE : TCP_WSCALE_DEFAULT;
+       s->tcb.rcv.wnd = calc_rx_wnd(s, s->tcb.rcv.wscale);
+
        /* calculate initial rto */
        rto_estimate(&s->tcb, ts - s->tcb.snd.ts);