[PATCH v4 4/4] nvme-tcp: support IPv6 traffic class
Geliang Tang <[email protected]>
| Newsgroups | org.infradead.lists.linux-nvme,dev.linux.lists.mptcp,org.kernel.vger.netdev |
|---|---|
| Message-ID | <d6095cd3809af7addc44ed162d70d6327dc237ac.1786947923.git.tanggeliang@kylinos.cn> |
From: Geliang Tang <[email protected]> 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 <[email protected]> --- drivers/nvme/host/tcp.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 025cade370b2..5f30be04a9dd 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1815,6 +1815,17 @@ static int nvme_tcp_sock_set_tos(struct sock *sk, int tos) KERNEL_SOCKPTR(&tos), sizeof(tos)); } +static int nvme_tcp_sock_set_tclass(struct sock *sk, int tclass) +{ +#if IS_ENABLED(CONFIG_IPV6) + if (sk->sk_family == AF_INET6) + return do_sock_setsockopt(sk->sk_socket, false, SOL_IPV6, + IPV6_TCLASS, KERNEL_SOCKPTR(&tclass), + sizeof(tclass)); +#endif + return 0; +} + static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid, key_serial_t pskid) { @@ -1909,6 +1920,15 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid, qid, ret); goto err_sock; } + + ret = nvme_tcp_sock_set_tclass(queue->sock->sk, + nctrl->opts->tos); + if (ret) { + dev_err(nctrl->device, + "failed to set IPV6_TCLASS on queue %d err %d\n", + qid, ret); + goto err_sock; + } } /* Set 10 seconds timeout for icresp recvmsg */ -- 2.53.0