Compare commits

...

2 Commits

Author SHA1 Message Date
Sergey Fionov
a459b21dfa
Merge 5171345eb8 into 1cc1536e6a 2024-04-18 19:20:23 +02:00
Sergey Fionov
5171345eb8 tcp: Fix TCP timestamps for big-endian systems
Current parsing code is building reverse-order integer, and then calls htonl()
to assign right value to "ts_recent" field of pcb.

This works correctly on little-endian machines, where htonl() reverses bytes.
However, on big-endian machines, htonl() is no-op, so bytes stay reversed.

This patch fixes it by building non-reversed integer.
2024-03-13 22:16:35 +02:00

View File

@ -1993,17 +1993,17 @@ tcp_parseopt(struct tcp_pcb *pcb)
return;
}
/* TCP timestamp option with valid length */
tsval = tcp_get_next_optbyte();
tsval |= (tcp_get_next_optbyte() << 8);
tsval = (tcp_get_next_optbyte() << 24);
tsval |= (tcp_get_next_optbyte() << 16);
tsval |= (tcp_get_next_optbyte() << 24);
tsval |= (tcp_get_next_optbyte() << 8);
tsval |= tcp_get_next_optbyte();
if (flags & TCP_SYN) {
pcb->ts_recent = lwip_ntohl(tsval);
pcb->ts_recent = tsval;
/* Enable sending timestamps in every segment now that we know
the remote host supports it. */
tcp_set_flags(pcb, TF_TIMESTAMP);
} else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno + tcplen)) {
pcb->ts_recent = lwip_ntohl(tsval);
pcb->ts_recent = tsval;
}
/* Advance to next option (6 bytes already read) */
tcp_optidx += LWIP_TCP_OPT_LEN_TS - 6;