aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2021-05-21 07:45:00 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2021-06-09 00:06:26 +0000
commit56aeedd2fda4e1a714812a1fbdc9e8a784283d94 (patch)
tree383fd0b755cfa7f9d88e91b9d4a168d7a0064daa
parent3a3bba7df566e421c385444912ce603ee845c171 (diff)
downloadsrc-56aeedd2fda4e1a714812a1fbdc9e8a784283d94.tar.gz
src-56aeedd2fda4e1a714812a1fbdc9e8a784283d94.zip
tcp: Fix sending of TCP segments with IP level options
When bringing in TCP over UDP support in https://cgit.FreeBSD.org/src/commit/?id=9e644c23000c2f5028b235f6263d17ffb24d3605, the length of IP level options was considered when locating the transport header. This was incorrect and is fixed by this patch. X-MFC with: https://cgit.FreeBSD.org/src/commit/?id=9e644c23000c2f5028b235f6263d17ffb24d3605 Reviewed by: markj, rscheff Sponsored by: Netflix, Inc. Differential Revision: https://reviews.freebsd.org/D30358 (cherry picked from commit 500eb6dd80404ea512e31a8f795c73cb802c9c64)
-rw-r--r--sys/netinet/tcp_output.c4
-rw-r--r--sys/netinet/tcp_stacks/bbr.c4
-rw-r--r--sys/netinet/tcp_stacks/rack.c4
3 files changed, 6 insertions, 6 deletions
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index 5bda2be14df0..2a91570acdad 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -1154,7 +1154,7 @@ send:
if (isipv6) {
ip6 = mtod(m, struct ip6_hdr *);
if (tp->t_port) {
- udp = (struct udphdr *)((caddr_t)ip6 + ipoptlen + sizeof(struct ip6_hdr));
+ udp = (struct udphdr *)((caddr_t)ip6 + sizeof(struct ip6_hdr));
udp->uh_sport = htons(V_tcp_udp_tunneling_port);
udp->uh_dport = tp->t_port;
ulen = hdrlen + len - sizeof(struct ip6_hdr);
@@ -1172,7 +1172,7 @@ send:
ipov = (struct ipovly *)ip;
#endif
if (tp->t_port) {
- udp = (struct udphdr *)((caddr_t)ip + ipoptlen + sizeof(struct ip));
+ udp = (struct udphdr *)((caddr_t)ip + sizeof(struct ip));
udp->uh_sport = htons(V_tcp_udp_tunneling_port);
udp->uh_dport = tp->t_port;
ulen = hdrlen + len - sizeof(struct ip);
diff --git a/sys/netinet/tcp_stacks/bbr.c b/sys/netinet/tcp_stacks/bbr.c
index f19872245e55..abc0536d47c7 100644
--- a/sys/netinet/tcp_stacks/bbr.c
+++ b/sys/netinet/tcp_stacks/bbr.c
@@ -13354,7 +13354,7 @@ send:
if (isipv6) {
ip6 = mtod(m, struct ip6_hdr *);
if (tp->t_port) {
- udp = (struct udphdr *)((caddr_t)ip6 + ipoptlen + sizeof(struct ip6_hdr));
+ udp = (struct udphdr *)((caddr_t)ip6 + sizeof(struct ip6_hdr));
udp->uh_sport = htons(V_tcp_udp_tunneling_port);
udp->uh_dport = tp->t_port;
ulen = hdrlen + len - sizeof(struct ip6_hdr);
@@ -13372,7 +13372,7 @@ send:
ipov = (struct ipovly *)ip;
#endif
if (tp->t_port) {
- udp = (struct udphdr *)((caddr_t)ip + ipoptlen + sizeof(struct ip));
+ udp = (struct udphdr *)((caddr_t)ip + sizeof(struct ip));
udp->uh_sport = htons(V_tcp_udp_tunneling_port);
udp->uh_dport = tp->t_port;
ulen = hdrlen + len - sizeof(struct ip);
diff --git a/sys/netinet/tcp_stacks/rack.c b/sys/netinet/tcp_stacks/rack.c
index 6b0eadd89004..d7a01bab6bd0 100644
--- a/sys/netinet/tcp_stacks/rack.c
+++ b/sys/netinet/tcp_stacks/rack.c
@@ -17658,7 +17658,7 @@ send:
if (isipv6) {
ip6 = mtod(m, struct ip6_hdr *);
if (tp->t_port) {
- udp = (struct udphdr *)((caddr_t)ip6 + ipoptlen + sizeof(struct ip6_hdr));
+ udp = (struct udphdr *)((caddr_t)ip6 + sizeof(struct ip6_hdr));
udp->uh_sport = htons(V_tcp_udp_tunneling_port);
udp->uh_dport = tp->t_port;
ulen = hdrlen + len - sizeof(struct ip6_hdr);
@@ -17675,7 +17675,7 @@ send:
ipov = (struct ipovly *)ip;
#endif
if (tp->t_port) {
- udp = (struct udphdr *)((caddr_t)ip + ipoptlen + sizeof(struct ip));
+ udp = (struct udphdr *)((caddr_t)ip + sizeof(struct ip));
udp->uh_sport = htons(V_tcp_udp_tunneling_port);
udp->uh_dport = tp->t_port;
ulen = hdrlen + len - sizeof(struct ip);