git: d66540e829ec - main - tcp: improve sending of TTL/hoplimit and DSCP
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 05 Jun 2023 21:01:20 UTC
The branch main has been updated by tuexen:
URL: https://cgit.FreeBSD.org/src/commit/?id=d66540e829ec22b9654cf4b9119bed9326f89fad
commit d66540e829ec22b9654cf4b9119bed9326f89fad
Author: Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2023-06-05 16:43:06 +0000
Commit: Michael Tuexen <tuexen@FreeBSD.org>
CommitDate: 2023-06-05 16:43:06 +0000
tcp: improve sending of TTL/hoplimit and DSCP
Ensure that a user specified value of TTL/hoplimit and DSCP is
used when sending packets.
Reviewed by: cc, rscheff
MFC after: 1 week
Sponsored by: Netflix, Inc.
Differential Revision: https://reviews.freebsd.org/D40423
---
sys/netinet/tcp_stacks/rack.c | 27 ++-------------------------
sys/netinet/tcp_subr.c | 13 ++++++++++---
2 files changed, 12 insertions(+), 28 deletions(-)
diff --git a/sys/netinet/tcp_stacks/rack.c b/sys/netinet/tcp_stacks/rack.c
index affd135bb453..c9b5b937cc46 100644
--- a/sys/netinet/tcp_stacks/rack.c
+++ b/sys/netinet/tcp_stacks/rack.c
@@ -18826,7 +18826,7 @@ rack_fast_rsm_output(struct tcpcb *tp, struct tcp_rack *rack, struct rack_sendma
}
#ifdef INET6
if (rack->r_is_v6) {
- error = ip6_output(m, NULL,
+ error = ip6_output(m, inp->in6p_outputopts,
&inp->inp_route6,
ip_sendflag, NULL, NULL, inp);
}
@@ -19338,7 +19338,7 @@ again:
lgb = NULL;
#ifdef INET6
if (rack->r_is_v6) {
- error = ip6_output(m, NULL,
+ error = ip6_output(m, inp->in6p_outputopts,
&inp->inp_route6,
0, NULL, NULL, inp);
}
@@ -21792,11 +21792,7 @@ send:
TCP_PROBE5(send, NULL, tp, ip6, tp, th);
/* TODO: IPv6 IP6TOS_ECT bit on */
error = ip6_output(m,
-#if defined(IPSEC) || defined(IPSEC_SUPPORT)
inp->in6p_outputopts,
-#else
- NULL,
-#endif
&inp->inp_route6,
((rsm || sack_rxmit) ? IP_NO_SND_TAG_RL : 0),
NULL, NULL, inp);
@@ -23448,10 +23444,6 @@ static int
rack_set_sockopt(struct tcpcb *tp, struct sockopt *sopt)
{
struct inpcb *inp = tptoinpcb(tp);
-#ifdef INET6
- struct ip6_hdr *ip6;
- int32_t mask, tclass;
-#endif
#ifdef INET
struct ip *ip;
#endif
@@ -23465,9 +23457,6 @@ rack_set_sockopt(struct tcpcb *tp, struct sockopt *sopt)
INP_WUNLOCK(inp);
return (EINVAL);
}
-#ifdef INET6
- ip6 = (struct ip6_hdr *)rack->r_ctl.fsb.tcp_ip_hdr;
-#endif
#ifdef INET
ip = (struct ip *)rack->r_ctl.fsb.tcp_ip_hdr;
#endif
@@ -23480,18 +23469,6 @@ rack_set_sockopt(struct tcpcb *tp, struct sockopt *sopt)
case IPV6_USE_MIN_MTU:
tcp6_use_min_mtu(tp);
break;
- case IPV6_TCLASS:
- /*
- * The DSCP codepoint has changed, update the fsb
- * by overwriting any previous traffic class.
- */
- if (inp->in6p_outputopts) {
- mask = 0xfc;
- tclass = inp->in6p_outputopts->ip6po_tclass;
- ip6->ip6_flow &= htonl((~mask) << 20);
- ip6->ip6_flow |= htonl((tclass & mask) << 20);
- }
- break;
}
INP_WUNLOCK(inp);
return (0);
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index fe065fd08737..47eb2d80efd6 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -2049,9 +2049,15 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m,
ulen = tlen - sizeof(struct ip);
uh->uh_ulen = htons(ulen);
}
- ip->ip_tos = ect;
ip->ip_len = htons(tlen);
- ip->ip_ttl = V_ip_defttl;
+ if (inp != NULL) {
+ ip->ip_tos = inp->inp_ip_tos & ~IPTOS_ECN_MASK;
+ ip->ip_ttl = inp->inp_ip_ttl;
+ } else {
+ ip->ip_tos = 0;
+ ip->ip_ttl = V_ip_defttl;
+ }
+ ip->ip_tos |= ect;
if (port) {
ip->ip_p = IPPROTO_UDP;
} else {
@@ -2195,7 +2201,8 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m,
#ifdef INET6
if (isipv6) {
TCP_PROBE5(send, NULL, tp, ip6, tp, nth);
- output_ret = ip6_output(m, NULL, NULL, 0, NULL, NULL, inp);
+ output_ret = ip6_output(m, inp ? inp->in6p_outputopts : NULL,
+ NULL, 0, NULL, NULL, inp);
}
#endif /* INET6 */
#if defined(INET) && defined(INET6)