aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Magistro <koncept1@gmail.com>2022-01-20 15:59:23 +0000
committerBen Magistro <koncept1@gmail.com>2022-01-21 20:50:17 +0000
commit5d42e683caeff787a618e2b9180d41dcd1825286 (patch)
tree5c5b5acd755a62b3ba1ff667586bd2c058eab5ea
parent3b80f5d6fbc5ed41fa462acb8c2ccf87e31d9b61 (diff)
Allow all window scale values when proxying
When TLDK is used in to proxy connections, it previously limited the window scale values that could be used. This allows the full range to be used by proxy sessions (tcp_establish) and should preserves the existing behavior for endpoint sessions. Signed-off-by: Ben Magistro <koncept1@gmail.com> Change-Id: I064dffccef1cc8e97c910a23d82feb7bd35bc988
-rw-r--r--lib/libtle_l4p/syncookie.h7
-rw-r--r--lib/libtle_l4p/tcp_rxtx.c2
-rw-r--r--lib/libtle_l4p/tle_tcp.h4
3 files changed, 10 insertions, 3 deletions
diff --git a/lib/libtle_l4p/syncookie.h b/lib/libtle_l4p/syncookie.h
index d0434e9..2588171 100644
--- a/lib/libtle_l4p/syncookie.h
+++ b/lib/libtle_l4p/syncookie.h
@@ -184,8 +184,7 @@ fill_tcb_rcv(struct tcb *tcb, uint32_t seq, uint32_t wscale,
tcb->rcv.nxt = seq;
tcb->rcv.irs = seq - 1;
tcb->rcv.ts = to->val;
- tcb->rcv.wscale = (wscale == TCP_WSCALE_NONE) ?
- TCP_WSCALE_NONE : TCP_WSCALE_DEFAULT;
+ tcb->rcv.wscale = wscale;
}
static inline void
@@ -219,6 +218,10 @@ sync_fill_tcb(struct tcb *tcb, const union seg_info *si,
wscale = to->ecr & SYNC_TMS_WSCALE_MASK;
fill_tcb_snd(tcb, seq, ack, mss, si->wnd, wscale, to);
+
+ wscale = ((to->ecr & SYNC_TMS_WSCALE_MASK) == TCP_WSCALE_NONE) ?
+ TCP_WSCALE_NONE : TCP_WSCALE_DEFAULT;
+
fill_tcb_rcv(tcb, seq, wscale, to);
tcb->so.mss = mss;
diff --git a/lib/libtle_l4p/tcp_rxtx.c b/lib/libtle_l4p/tcp_rxtx.c
index 8056619..9c80f66 100644
--- a/lib/libtle_l4p/tcp_rxtx.c
+++ b/lib/libtle_l4p/tcp_rxtx.c
@@ -2273,7 +2273,7 @@ tcb_establish(struct tle_tcp_stream *s, const struct tle_tcp_conn_info *ci)
s->tcb.so = ci->so;
fill_tcb_snd(&s->tcb, ci->ack, ci->seq, mss,
ci->wnd, ci->so.wscale, &ci->so.ts);
- fill_tcb_rcv(&s->tcb, ci->ack, ci->so.wscale, &ci->so.ts);
+ fill_tcb_rcv(&s->tcb, ci->ack, ci->so.l_wscale, &ci->so.ts);
s->tcb.rcv.wnd = calc_rx_wnd(s, s->tcb.rcv.wscale);
diff --git a/lib/libtle_l4p/tle_tcp.h b/lib/libtle_l4p/tle_tcp.h
index be0c7a9..860da92 100644
--- a/lib/libtle_l4p/tle_tcp.h
+++ b/lib/libtle_l4p/tle_tcp.h
@@ -122,8 +122,12 @@ union tle_tcp_tsopt {
* SYN time option values.
*/
struct tle_tcp_syn_opts {
+ /* mss to use when communicating with the peer */
uint16_t mss;
+ /* peer window scaling factor */
uint8_t wscale;
+ /* local window scaling factor, only used via tcp_establish */
+ uint8_t l_wscale;
union tle_tcp_tsopt ts;
};