From: Geliang Tang <redacted>
Currently, nvmet-tcp only applies the received IPv4 TOS value when setting
up a queue socket, but does not handle the IPv6 traffic class.
Extend the queue socket setup to handle AF_INET6 sockets. Obtain the
traffic class from the IPv6 socket's rcv_flowinfo and apply it through
IPV6_TCLASS using do_sock_setsockopt().
Signed-off-by: Geliang Tang <redacted>
---
drivers/nvme/target/tcp.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
index e64592b79257..d34249cf3756 100644
--- a/drivers/nvme/target/tcp.c
+++ b/drivers/nvme/target/tcp.c
@@ -1735,6 +1735,20 @@ static void nvmet_tcp_sock_set_tos(struct sock *sk)
KERNEL_SOCKPTR(&tos), sizeof(tos));
}
+static void nvmet_tcp_sock_set_tclass(struct sock *sk)
+{
+#if IS_ENABLED(CONFIG_IPV6)
+ if (sk->sk_family == AF_INET6) {
+ u8 tclass = ip6_tclass(inet6_sk(sk)->rcv_flowinfo);
+
+ if (tclass > 0)
+ do_sock_setsockopt(sk->sk_socket, false, SOL_IPV6,
+ IPV6_TCLASS, KERNEL_SOCKPTR(&tclass),
+ sizeof(tclass));
+ }
+#endif
+}
+
static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue)
{
struct socket *sock = queue->sock;@@ -1762,6 +1776,7 @@ static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue)
/* Set socket type of service */
nvmet_tcp_sock_set_tos(sock->sk);
+ nvmet_tcp_sock_set_tclass(sock->sk);
ret = 0;
write_lock_bh(&sock->sk->sk_callback_lock);
--
2.53.0