From: Geliang Tang Currently, nvme-tcp host only supports setting the IPv4 TOS value when a TOS is specified, but does not handle the IPv6 traffic class. Extend the queue socket setup to handle AF_INET6 sockets by applying the TOS value to both IPv4 and IPv6 sockets. For IPv6, the TOS value is set as the IPv6 traffic class via IPV6_TCLASS using do_sock_setsockopt(). Signed-off-by: Geliang Tang --- drivers/nvme/host/tcp.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 89a82e8248d2..657acae9e4a4 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1815,6 +1815,15 @@ static void nvme_tcp_sock_set_tos(struct sock *sk, int tos) KERNEL_SOCKPTR(&tos), sizeof(tos)); } +static void nvme_tcp_sock_set_tclass(struct sock *sk, int tclass) +{ +#if IS_ENABLED(CONFIG_IPV6) + if (sk->sk_family == AF_INET6) + do_sock_setsockopt(sk->sk_socket, false, SOL_IPV6, IPV6_TCLASS, + KERNEL_SOCKPTR(&tclass), sizeof(tclass)); +#endif +} + static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid, key_serial_t pskid) { @@ -1876,8 +1885,10 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid, nvme_tcp_sock_set_priority(queue->sock->sk, so_priority); /* Set socket type of service */ - if (nctrl->opts->tos >= 0) + if (nctrl->opts->tos >= 0) { nvme_tcp_sock_set_tos(queue->sock->sk, nctrl->opts->tos); + nvme_tcp_sock_set_tclass(queue->sock->sk, nctrl->opts->tos); + } /* Set 10 seconds timeout for icresp recvmsg */ queue->sock->sk->sk_rcvtimeo = 10 * HZ; -- 2.53.0