git: 984a58c13166 - stable/14 - udp: honor IPV6_TCLASS cmsg for UDP/IPv4 packets

From: Michael Tuexen <tuexen_at_FreeBSD.org>
Date: Fri, 31 Oct 2025 19:12:44 UTC
The branch stable/14 has been updated by tuexen:

URL: https://cgit.FreeBSD.org/src/commit/?id=984a58c13166f9fffe1c7b03d89e3f3d790d07cb

commit 984a58c13166f9fffe1c7b03d89e3f3d790d07cb
Author:     Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2025-10-26 17:58:15 +0000
Commit:     Michael Tuexen <tuexen@FreeBSD.org>
CommitDate: 2025-10-31 14:12:22 +0000

    udp: honor IPV6_TCLASS cmsg for UDP/IPv4 packets
    
    Honor the IPPROTO_IPV6-level cmsg of type IPV6_TCLASS when sending
    an UDP/IPv4 packet on an AF_INET6 socket.
    
    Reviewed by:            bz
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D53347
    
    (cherry picked from commit d3a3854fdc6e8da3bc6c1c13aab8d371445d2914)
---
 sys/netinet/udp_usrreq.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index fdde19bc4475..a1000dadf583 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -1182,6 +1182,23 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
 			error = udp_v4mapped_pktinfo(cm, &src, inp, flags);
 			if (error != 0)
 				break;
+			if (((flags & PRUS_IPV6) != 0) &&
+			    (cm->cmsg_level == IPPROTO_IPV6) &&
+			    (cm->cmsg_type == IPV6_TCLASS)) {
+				int tclass;
+
+				if (cm->cmsg_len != CMSG_LEN(sizeof(int))) {
+					error = EINVAL;
+					break;
+				}
+				tclass = *(int *)CMSG_DATA(cm);
+				if (tclass < -1 || tclass > 255) {
+					error = EINVAL;
+					break;
+				}
+				if (tclass != -1)
+					tos = (u_char)tclass;
+			}
 #endif
 			if (cm->cmsg_level != IPPROTO_IP)
 				continue;