From patchwork Thu Nov 7 13:22:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Emese Nyiri X-Patchwork-Id: 13866448 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C687B20264B for ; Thu, 7 Nov 2024 13:23:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730985785; cv=none; b=PWjetn2RlweXa9fIfw8QlQIR+oJLCCGUPPOSrwzWtokFF/kupT9NQfZXEymHtr3jXwwe+m8UsuNGcSsrdi8qd/slcNAjiaN6NWU+MTIjK+DFkY0tADG3uLGU7t4sigzsolZseY3SzS7NJL8HYRmL6GMRLysJ9YizxpkMKiafFQ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730985785; c=relaxed/simple; bh=uakT95QRKAMPGr5rnEGSIF9eg7YeOoKPeqHEZ1Rwq1Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gAz7R9Itead5Ui4TgKuuJo4sCe4bPkzxdKjhO/ngcna7CzD1pJ+KvwiRWHSByjRRFaPYZ3rR5/1t+0yGVgeL0dswQPQM1rHOXoDYrYiePDu+mr7Fs0PV5xycKMi9DjaSMMc0WfT20goLDomv0PvEEQgRy7nafRx98hmOSG5nj/k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=R8UndFW4; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="R8UndFW4" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-43163667f0eso8482485e9.0 for ; Thu, 07 Nov 2024 05:23:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1730985782; x=1731590582; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OQCT6XBkf8PIWDwSJOYK/aa3L+Wngjl/kOH95i7z8SM=; b=R8UndFW4DVSUcz4OTcfCylZOzOzbO0chj3n50yRxFyES+R5e3NQaRX8GnrnDSuvfoA Wf4vxQRNS+cIUCSJsBmbsXe/uzxTb9BT2rWj7sK2kUL7N6EkfgfsAJoBalJKhoN2teSD H8nP9JUpTtrR+D4S7fmVAogLuTWNHfMZASIgzPDJvZtF96AfjTMPpqgPFzmmdrltP/Sz QLjnVSd+/9cdy0DPacQbZtlYRvcXZBEiWpFX9gDQ/Fpa+k+SpTruAExTD9lG99lgDvPn JPfeIgiIhG/PxC4oqgFavRvzBcD5wTcJHx3FqQHxd1Ntxt5eRYDRPNaue4TneAa8nDsh 7YXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1730985782; x=1731590582; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OQCT6XBkf8PIWDwSJOYK/aa3L+Wngjl/kOH95i7z8SM=; b=Sj4aLlwMN+rMx8K/IUS07v9hES5gOLZiwn5Ru65FpJkHyMYx33n2V2S1VHBDJ5Wwmg vkWpB/0XjqjJIqmYbT35iV8aq1Lt3KQt+Pinc9kXMkRANfJhynsmq4BVQulD9gJc8MDR ceoWZTujefkStXcqWvuaZV4QQSr/CgPr46JkaNeLJWcDo65ldGC07sGY9MhHFEu0odYR xo9+UqquFHWGqpl8s1BcEy/mYKcv6oztUrNW4J2Vh4AOyoA385peTU2jEoeWXPbR5kwK 0pE1FNFYFO5Ibo6s9IDrnrvdbmOC5yTogRz58kDFJxMg/KH/1KHMLeA/ihVrasycs4Y2 eEcw== X-Gm-Message-State: AOJu0YyUuNltG/m8JyAGnth/Ptoq5I7Go/nR5R367YBYvOfLEzqwy/DS JChHUfdT68rrR35d1WL1fk7nfEq8nKZpF/oP3scvF6GjT1xSWEwiJb8UvNnw X-Google-Smtp-Source: AGHT+IHZ8nDuF4S8EY3SoNlZX6/LU7oASeMi5NYSrG4Fkg1lDnM6yhlvMqeR7eArYzJRr7pkkht5kw== X-Received: by 2002:a05:600c:3c9d:b0:42f:823d:dddd with SMTP id 5b1f17b1804b1-4328327e6ddmr195374135e9.27.1730985781897; Thu, 07 Nov 2024 05:23:01 -0800 (PST) Received: from localhost.localdomain (20014C4E1E912B00E77793ED09024636.dsl.pool.telekom.hu. [2001:4c4e:1e91:2b00:e777:93ed:902:4636]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-432b05e5bddsm24372355e9.38.2024.11.07.05.23.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 Nov 2024 05:23:01 -0800 (PST) From: Anna Emese Nyiri To: netdev@vger.kernel.org Cc: fejes@inf.elte.hu, annaemesenyiri@gmail.com, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, willemdebruijn.kernel@gmail.com Subject: [PATCH net-next v3 1/3] net: Introduce sk_set_prio_allowed helper function Date: Thu, 7 Nov 2024 14:22:29 +0100 Message-ID: <20241107132231.9271-2-annaemesenyiri@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241107132231.9271-1-annaemesenyiri@gmail.com> References: <20241107132231.9271-1-annaemesenyiri@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Simplify priority setting permissions with the `sk_set_prio_allowed` function, centralizing the validation logic. This change is made in anticipation of a second caller in a following patch. No functional changes. Suggested-by: Willem de Bruijn Signed-off-by: Anna Emese Nyiri Reviewed-by: Eric Dumazet Reviewed-by: Willem de Bruijn --- net/core/sock.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/net/core/sock.c b/net/core/sock.c index 7f398bd07fb7..5ecf6f1a470c 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -454,6 +454,13 @@ static int sock_set_timeout(long *timeo_p, sockptr_t optval, int optlen, return 0; } +static bool sk_set_prio_allowed(const struct sock *sk, int val) +{ + return ((val >= TC_PRIO_BESTEFFORT && val <= TC_PRIO_INTERACTIVE) || + sockopt_ns_capable(sock_net(sk)->user_ns, CAP_NET_RAW) || + sockopt_ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)); +} + static bool sock_needs_netstamp(const struct sock *sk) { switch (sk->sk_family) { @@ -1187,9 +1194,7 @@ int sk_setsockopt(struct sock *sk, int level, int optname, /* handle options which do not require locking the socket. */ switch (optname) { case SO_PRIORITY: - if ((val >= 0 && val <= 6) || - sockopt_ns_capable(sock_net(sk)->user_ns, CAP_NET_RAW) || - sockopt_ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) { + if (sk_set_prio_allowed(sk, val)) { sock_set_priority(sk, val); return 0; } From patchwork Thu Nov 7 13:22:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Emese Nyiri X-Patchwork-Id: 13866449 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0BDC9210180 for ; Thu, 7 Nov 2024 13:23:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730985786; cv=none; b=nwhY0u1Gds42fj6geldRHvNTRyoh1V2mjg9k20/DQ2Bmb290zt2rNKvz9CCkX8lvSBbxjmO+saoaHSN8Pei9VL95PH3GMTk6xMEZOX1f4nquopjieNsRCIKq7GoJXHjZMwcDkyEUEetlORdHaeVSSAzk0U1c/ZvA+TSeAXtKglo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730985786; c=relaxed/simple; bh=pH8vvNaBECo7SSWxOeqlGxhO2jAwMFsB4Bw/iTfrQkY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G08BaHFlSqqw2owb+KL/MEYQFpnVg5vXfGTaBRYVtAgGsZ+DWEbUMaE2nzMGXHwCMZaSQgWN6taR4fKOhhbLG8E8wESjyi9sNgeuG3Del7JUvQuvRAGhW6fxVeGf8jhIlLl7VWcUhlNvjzaUfVaNl6MkUTvv2TfXmqlL4xFqlyA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Tx6ZJavg; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Tx6ZJavg" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-43161c0068bso8375905e9.1 for ; Thu, 07 Nov 2024 05:23:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1730985783; x=1731590583; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8pa2RDce8b3fUpa5ZPGXF6ddVAaLQ7nrHKF95AIjDLk=; b=Tx6ZJavg6QAORoYQZnXrhZGMT7YdVIWddZwrdAeYXvUb+bYisqVK4z7zGb/6VGi3i5 pfcYEIyfwd4VK/2oRt4LTEVjf5O5qF9Fs2UETefJ5WS+gMx0g5pEYP3Gdq/8qX48m6M7 eS9Y8TkWZcNsA9vldQDqEG5/v+iBcRx8C/vdbk+SKa2to5x/Pd/MxEBLOyXnceB8SbuP Y/YBzmXIwvr9UrtQF5xKOWB0F+OXO5EQSU2iXmjkhrnQ7ypYrb8fqU1ddOcuB4MRimzW AuOKtpBYux0YmBvDXOoeBZjqBm4JizF3Tl+q/GbDRWqzo5jXHE2cbWqUn4t7X4sTbkTZ TdrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1730985783; x=1731590583; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8pa2RDce8b3fUpa5ZPGXF6ddVAaLQ7nrHKF95AIjDLk=; b=UtesPBYIozkKVk9DcT8mVYL+RXLegbQ3/M7BiuDQqBWnCwnWYqTUIFgqFZBsbsJ4X4 14gUWMc2x5XtYqPP537awe22ul/XCbh3B3hFGaiG/EaLldUDy3QcPVgWO2OZImNbY991 0rzoKQJRiB6lW0wDPQJGRHHXH/X3XGka7GryoEylUxhz9xsOSm2rRh1d7WepBXacD6y+ 43SL0yiDTYe+tmGXeujO8Gfqzy1C0lA62ep3wYVnUjMd/XOlhYT7yMaqkKu5VBcy884x Kvvu31jF0PLVWzvaWeWADl6+xeRB5QZneLLq9bVhN4KzfhtYGg7nBdbsh5iXr0YzRgEi Bb7w== X-Gm-Message-State: AOJu0Yxybk+MA2o8iLdzp0eGZW+2c+f5EXk9pHwysM0B9cdHv+J2D+B8 ydG13PDrCyqiXQcLsefLXB5BOMSEemZ+FVNPiCirsygBGB4CJwd92mb4/ZI+ X-Google-Smtp-Source: AGHT+IHhuyF3Q5aMoRxTcIKNOLnWZcRH8x48JErwwfXrQ47VzMIdT98GE3bYCvYXoGlJMY1BxV6q6g== X-Received: by 2002:a05:600c:3b14:b0:431:612f:189b with SMTP id 5b1f17b1804b1-43283246c05mr219961935e9.12.1730985783062; Thu, 07 Nov 2024 05:23:03 -0800 (PST) Received: from localhost.localdomain (20014C4E1E912B00E77793ED09024636.dsl.pool.telekom.hu. [2001:4c4e:1e91:2b00:e777:93ed:902:4636]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-432b05e5bddsm24372355e9.38.2024.11.07.05.23.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 Nov 2024 05:23:02 -0800 (PST) From: Anna Emese Nyiri To: netdev@vger.kernel.org Cc: fejes@inf.elte.hu, annaemesenyiri@gmail.com, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, willemdebruijn.kernel@gmail.com Subject: [PATCH net-next v3 2/3] net: support SO_PRIORITY cmsg Date: Thu, 7 Nov 2024 14:22:30 +0100 Message-ID: <20241107132231.9271-3-annaemesenyiri@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241107132231.9271-1-annaemesenyiri@gmail.com> References: <20241107132231.9271-1-annaemesenyiri@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The Linux socket API currently allows setting SO_PRIORITY at the socket level, applying a uniform priority to all packets sent through that socket. The exception to this is IP_TOS, when the priority value is calculated during the handling of ancillary data, as implemented in commit ("ipv4: IP_TOS and IP_TTL can be specified as ancillary data"). However, this is a computed value, and there is currently no mechanism to set a custom priority via control messages prior to this patch. According to this pacth, if SO_PRIORITY is specified as ancillary data, the packet is sent with the priority value set through sockc->priority, overriding the socket-level values set via the traditional setsockopt() method. This is analogous to the existing support for SO_MARK, as implemented in commit ("ip: support SO_MARK cmsg"). Suggested-by: Ferenc Fejes Signed-off-by: Anna Emese Nyiri Reviewed-by: Eric Dumazet Reviewed-by: Willem de Bruijn --- include/net/inet_sock.h | 2 +- include/net/ip.h | 2 +- include/net/sock.h | 4 +++- net/can/raw.c | 2 +- net/core/sock.c | 7 +++++++ net/ipv4/ip_output.c | 4 ++-- net/ipv4/ip_sockglue.c | 2 +- net/ipv4/raw.c | 2 +- net/ipv6/ip6_output.c | 3 ++- net/ipv6/raw.c | 3 ++- net/ipv6/udp.c | 1 + net/packet/af_packet.c | 2 +- 12 files changed, 23 insertions(+), 11 deletions(-) diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index 56d8bc5593d3..3ccbad881d74 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h @@ -172,7 +172,7 @@ struct inet_cork { u8 tx_flags; __u8 ttl; __s16 tos; - char priority; + u32 priority; __u16 gso_size; u32 ts_opt_id; u64 transmit_time; diff --git a/include/net/ip.h b/include/net/ip.h index 0e548c1f2a0e..9f5e33e371fc 100644 --- a/include/net/ip.h +++ b/include/net/ip.h @@ -81,7 +81,6 @@ struct ipcm_cookie { __u8 protocol; __u8 ttl; __s16 tos; - char priority; __u16 gso_size; }; @@ -96,6 +95,7 @@ static inline void ipcm_init_sk(struct ipcm_cookie *ipcm, ipcm_init(ipcm); ipcm->sockc.mark = READ_ONCE(inet->sk.sk_mark); + ipcm->sockc.priority = READ_ONCE(inet->sk.sk_priority); ipcm->sockc.tsflags = READ_ONCE(inet->sk.sk_tsflags); ipcm->oif = READ_ONCE(inet->sk.sk_bound_dev_if); ipcm->addr = inet->inet_saddr; diff --git a/include/net/sock.h b/include/net/sock.h index 7464e9f9f47c..316a34d6c48b 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1814,13 +1814,15 @@ struct sockcm_cookie { u32 mark; u32 tsflags; u32 ts_opt_id; + u32 priority; }; static inline void sockcm_init(struct sockcm_cookie *sockc, const struct sock *sk) { *sockc = (struct sockcm_cookie) { - .tsflags = READ_ONCE(sk->sk_tsflags) + .tsflags = READ_ONCE(sk->sk_tsflags), + .priority = READ_ONCE(sk->sk_priority), }; } diff --git a/net/can/raw.c b/net/can/raw.c index 255c0a8f39d6..46e8ed9d64da 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -962,7 +962,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) } skb->dev = dev; - skb->priority = READ_ONCE(sk->sk_priority); + skb->priority = sockc.priority; skb->mark = READ_ONCE(sk->sk_mark); skb->tstamp = sockc.transmit_time; diff --git a/net/core/sock.c b/net/core/sock.c index 5ecf6f1a470c..68e2af168da7 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -2941,6 +2941,13 @@ int __sock_cmsg_send(struct sock *sk, struct cmsghdr *cmsg, case SCM_RIGHTS: case SCM_CREDENTIALS: break; + case SO_PRIORITY: + if (cmsg->cmsg_len != CMSG_LEN(sizeof(u32))) + return -EINVAL; + if (!sk_set_prio_allowed(sk, *(u32 *)CMSG_DATA(cmsg))) + return -EPERM; + sockc->priority = *(u32 *)CMSG_DATA(cmsg); + break; default: return -EINVAL; } diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 0065b1996c94..cd3e788600cc 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -1328,7 +1328,7 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork, cork->ttl = ipc->ttl; cork->tos = ipc->tos; cork->mark = ipc->sockc.mark; - cork->priority = ipc->priority; + cork->priority = ipc->sockc.priority; cork->transmit_time = ipc->sockc.transmit_time; cork->tx_flags = 0; sock_tx_timestamp(sk, &ipc->sockc, &cork->tx_flags); @@ -1465,7 +1465,7 @@ struct sk_buff *__ip_make_skb(struct sock *sk, ip_options_build(skb, opt, cork->addr, rt); } - skb->priority = (cork->tos != -1) ? cork->priority: READ_ONCE(sk->sk_priority); + skb->priority = cork->priority; skb->mark = cork->mark; if (sk_is_tcp(sk)) skb_set_delivery_time(skb, cork->transmit_time, SKB_CLOCK_MONOTONIC); diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index cf377377b52d..f6a03b418dde 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -315,7 +315,7 @@ int ip_cmsg_send(struct sock *sk, struct msghdr *msg, struct ipcm_cookie *ipc, if (val < 0 || val > 255) return -EINVAL; ipc->tos = val; - ipc->priority = rt_tos2priority(ipc->tos); + ipc->sockc.priority = rt_tos2priority(ipc->tos); break; case IP_PROTOCOL: if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 0e9e01967ec9..4304a68d1db0 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -358,7 +358,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4, skb_reserve(skb, hlen); skb->protocol = htons(ETH_P_IP); - skb->priority = READ_ONCE(sk->sk_priority); + skb->priority = sockc->priority; skb->mark = sockc->mark; skb_set_delivery_type_by_clockid(skb, sockc->transmit_time, sk->sk_clockid); skb_dst_set(skb, &rt->dst); diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index f7b4608bb316..ec9673b7ab16 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -1401,6 +1401,7 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork, cork->base.gso_size = ipc6->gso_size; cork->base.tx_flags = 0; cork->base.mark = ipc6->sockc.mark; + cork->base.priority = ipc6->sockc.priority; sock_tx_timestamp(sk, &ipc6->sockc, &cork->base.tx_flags); if (ipc6->sockc.tsflags & SOCKCM_FLAG_TS_OPT_ID) { cork->base.flags |= IPCORK_TS_OPT_ID; @@ -1939,7 +1940,7 @@ struct sk_buff *__ip6_make_skb(struct sock *sk, hdr->saddr = fl6->saddr; hdr->daddr = *final_dst; - skb->priority = READ_ONCE(sk->sk_priority); + skb->priority = cork->base.priority; skb->mark = cork->base.mark; if (sk_is_tcp(sk)) skb_set_delivery_time(skb, cork->base.transmit_time, SKB_CLOCK_MONOTONIC); diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 8476a3944a88..a45aba090aa4 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -619,7 +619,7 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length, skb_reserve(skb, hlen); skb->protocol = htons(ETH_P_IPV6); - skb->priority = READ_ONCE(sk->sk_priority); + skb->priority = sockc->priority; skb->mark = sockc->mark; skb_set_delivery_type_by_clockid(skb, sockc->transmit_time, sk->sk_clockid); @@ -780,6 +780,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ipcm6_init(&ipc6); ipc6.sockc.tsflags = READ_ONCE(sk->sk_tsflags); ipc6.sockc.mark = fl6.flowi6_mark; + ipc6.sockc.priority = READ_ONCE(sk->sk_priority); if (sin6) { if (addr_len < SIN6_LEN_RFC2133) diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 0cef8ae5d1ea..dcce9fd33e98 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1353,6 +1353,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ipc6.gso_size = READ_ONCE(up->gso_size); ipc6.sockc.tsflags = READ_ONCE(sk->sk_tsflags); ipc6.sockc.mark = READ_ONCE(sk->sk_mark); + ipc6.sockc.priority = READ_ONCE(sk->sk_priority); /* destination address check */ if (sin6) { diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 886c0dd47b66..f8d87d622699 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -3126,7 +3126,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) skb->protocol = proto; skb->dev = dev; - skb->priority = READ_ONCE(sk->sk_priority); + skb->priority = sockc.priority; skb->mark = sockc.mark; skb_set_delivery_type_by_clockid(skb, sockc.transmit_time, sk->sk_clockid); From patchwork Thu Nov 7 13:22:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Emese Nyiri X-Patchwork-Id: 13866450 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8C5F12101A2 for ; Thu, 7 Nov 2024 13:23:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730985788; cv=none; b=aYsrMDFnaify8vyCgnRHaJq9ATbKAy65ezuR8tB7fvEhHeNrPTDbjrmtOaDuTqp/nY1N9hlx3exXKWpuNqU+pHnvBGkoWOr2qjnVkd5BVj4lifGCE8paVzDbz/eD6xEUjGjfmnVxK1S8s9N3aTt7c212PcmOx0/Y0XZSofq+OcE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730985788; c=relaxed/simple; bh=QrKnFThf7Ojg+CHdcfzz7KPz55eHvLQBTLw9aj0u7/I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ffMt/ienYAZ+W0sConSHOnaRZO3ch7UEI+L3rEdqi78waPnz3f1UK5Zz9zrCJEYG758mYYZOAS7ov5Gb4JBw03/1j1U4HTHAdCQdv3/tFz6CLcEtzXTD2CSvDo5ocMudmkFegKmiQA/FEtr/rSEzkz5YQeYCtrxZCZspiuEOEqM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dgX47SZa; arc=none smtp.client-ip=209.85.221.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dgX47SZa" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-37ed7eb07a4so636414f8f.2 for ; Thu, 07 Nov 2024 05:23:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1730985785; x=1731590585; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4AWOfXlIgdSR56jbZ5dsGGdY8onlRqeVAIoHDtSILrY=; b=dgX47SZa18oniURJzPDlgQ+RfFUyI7tlnkZOpCiWjTIU+RSY5zMWfwBDn9usClbGTy T6OjQVHoLMPX7lBc2Y6D5l6hHyKCuM3XhffJ4sq7JxaUH0wQUxtspeOqI9ybUgZ+Kd1e iiupBTbyK6zPY6k09SW4VnPRH7JqnDmtsp2kZvWZL3MZUu+86IoleflwwttdjE5n0bSC 0gdQbXBFf/XWpq1zoQ8EOiU+Y22U3z1Y+4vHixhCh0xc1S2zpRm98UDsRZOrduZMh15C /k/2TTfgxWmD3v83SXszed6X66e6aSntT7SGfhAM5aA7xjBcmdEGshysU8zToOio4ZHs z0Ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1730985785; x=1731590585; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4AWOfXlIgdSR56jbZ5dsGGdY8onlRqeVAIoHDtSILrY=; b=jMxh9cZiDYyTd3M+g+nV6karGk9oHcYPyYld9tp/r0+ggVZtglF2doUlUrPGQiSZR+ AkGPNHdXTch4pnKFMl5x+atdJwf37GMm9Y37FTVw7kEUMJOV6Ni4jTAkIRMoi869tXRC qBGPU3Wcvqbuot0eMvTI8JP2rZ+xW/cHikG5fHoiQDmdtASOSKddE0tpz/aJVoRkwgzG EWXPbEdBTYcPFaa8UpgxSw/m94Wr4Gx69IheZmk4Tz2D4rFL2vyqwoQHCKCgRe7sdPWe 73etM363O/MSXm3k7TQYGkx2Qyjk5aVIwZA/kelqARzsTl4onX66tkAgR2ESt4eCTfDp q3gQ== X-Gm-Message-State: AOJu0YzZnMzfzJyd9og0Gc3wYsToWyZTcr2app+BdnikayPP/j8PnWaa eoGhya/9tETO8vAfo3WqIFqsHAnMOuFcsuP4OGjxaZhXiyiHY3EiqIvl9FbI X-Google-Smtp-Source: AGHT+IF2yJoWifQ2nskmji6rQ67wTpx1FVksSQorsMsJHwkEmYCStPE1EmBhQ5Oq4uxUwOfDwfBkcw== X-Received: by 2002:a05:6000:1548:b0:37d:4cd5:fff2 with SMTP id ffacd0b85a97d-381ef681c7emr1080823f8f.6.1730985784590; Thu, 07 Nov 2024 05:23:04 -0800 (PST) Received: from localhost.localdomain (20014C4E1E912B00E77793ED09024636.dsl.pool.telekom.hu. [2001:4c4e:1e91:2b00:e777:93ed:902:4636]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-432b05e5bddsm24372355e9.38.2024.11.07.05.23.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 Nov 2024 05:23:04 -0800 (PST) From: Anna Emese Nyiri To: netdev@vger.kernel.org Cc: fejes@inf.elte.hu, annaemesenyiri@gmail.com, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, willemdebruijn.kernel@gmail.com, Ido Schimmel Subject: [PATCH net-next v3 3/3] selftest: net: test SO_PRIORITY ancillary data with cmsg_sender Date: Thu, 7 Nov 2024 14:22:31 +0100 Message-ID: <20241107132231.9271-4-annaemesenyiri@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241107132231.9271-1-annaemesenyiri@gmail.com> References: <20241107132231.9271-1-annaemesenyiri@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Extend cmsg_sender.c with a new option '-Q' to send SO_PRIORITY ancillary data. Add the `cmsg_so_priority.sh` script, which sets up two network namespaces (red and green) and uses the `cmsg_sender.c` program to send messages between them. The script sets packet priorities both via `setsockopt` and control messages (cmsg) and verifies whether packets are routed to the same queue based on priority settings. Suggested-by: Ido Schimmel Signed-off-by: Anna Emese Nyiri --- tools/testing/selftests/net/cmsg_sender.c | 11 +- .../testing/selftests/net/cmsg_so_priority.sh | 115 ++++++++++++++++++ 2 files changed, 125 insertions(+), 1 deletion(-) create mode 100755 tools/testing/selftests/net/cmsg_so_priority.sh diff --git a/tools/testing/selftests/net/cmsg_sender.c b/tools/testing/selftests/net/cmsg_sender.c index 876c2db02a63..6fbe93dd63d2 100644 --- a/tools/testing/selftests/net/cmsg_sender.c +++ b/tools/testing/selftests/net/cmsg_sender.c @@ -52,6 +52,7 @@ struct options { unsigned int tclass; unsigned int hlimit; unsigned int priority; + unsigned int priority_cmsg; } sockopt; struct { unsigned int family; @@ -59,6 +60,7 @@ struct options { unsigned int proto; } sock; struct option_cmsg_u32 mark; + struct option_cmsg_u32 priority_cmsg; struct { bool ena; unsigned int delay; @@ -97,6 +99,7 @@ static void __attribute__((noreturn)) cs_usage(const char *bin) "\n" "\t\t-m val Set SO_MARK with given value\n" "\t\t-M val Set SO_MARK via setsockopt\n" + "\t\t-Q val Set SO_PRIORITY via cmsg\n" "\t\t-d val Set SO_TXTIME with given delay (usec)\n" "\t\t-t Enable time stamp reporting\n" "\t\t-f val Set don't fragment via cmsg\n" @@ -115,7 +118,7 @@ static void cs_parse_args(int argc, char *argv[]) { int o; - while ((o = getopt(argc, argv, "46sS:p:P:m:M:n:d:tf:F:c:C:l:L:H:")) != -1) { + while ((o = getopt(argc, argv, "46sS:p:P:m:M:n:d:tf:F:c:C:l:L:H:Q:")) != -1) { switch (o) { case 's': opt.silent_send = true; @@ -148,6 +151,10 @@ static void cs_parse_args(int argc, char *argv[]) opt.mark.ena = true; opt.mark.val = atoi(optarg); break; + case 'Q': + opt.priority_cmsg.ena = true; + opt.priority_cmsg.val = atoi(optarg); + break; case 'M': opt.sockopt.mark = atoi(optarg); break; @@ -252,6 +259,8 @@ cs_write_cmsg(int fd, struct msghdr *msg, char *cbuf, size_t cbuf_sz) ca_write_cmsg_u32(cbuf, cbuf_sz, &cmsg_len, SOL_SOCKET, SO_MARK, &opt.mark); + ca_write_cmsg_u32(cbuf, cbuf_sz, &cmsg_len, + SOL_SOCKET, SO_PRIORITY, &opt.priority_cmsg); ca_write_cmsg_u32(cbuf, cbuf_sz, &cmsg_len, SOL_IPV6, IPV6_DONTFRAG, &opt.v6.dontfrag); ca_write_cmsg_u32(cbuf, cbuf_sz, &cmsg_len, diff --git a/tools/testing/selftests/net/cmsg_so_priority.sh b/tools/testing/selftests/net/cmsg_so_priority.sh new file mode 100755 index 000000000000..706d29b251e9 --- /dev/null +++ b/tools/testing/selftests/net/cmsg_so_priority.sh @@ -0,0 +1,115 @@ +#!/bin/bash + +source lib.sh + +IP4=192.168.0.2/16 +TGT4=192.168.0.3/16 +TGT4_NO_MASK=192.168.0.3 +IP6=2001:db8::2/64 +TGT6=2001:db8::3/64 +TGT6_NO_MASK=2001:db8::3 +IP4BR=192.168.0.1/16 +IP6BR=2001:db8::1/64 +PORT=8080 +DELAY=400000 +QUEUE_NUM=4 + + +cleanup() { + ip netns del red 2>/dev/null + ip netns del green 2>/dev/null + ip link del br0 2>/dev/null + ip link del vethcab0 2>/dev/null + ip link del vethcab1 2>/dev/null +} + +trap cleanup EXIT + +priority_values=($(seq 0 $((QUEUE_NUM - 1)))) + +queue_config="" +for ((i=0; i<$QUEUE_NUM; i++)); do + queue_config+=" 1@$i" +done + +map_config=$(seq 0 $((QUEUE_NUM - 1)) | tr '\n' ' ') + +ip netns add red +ip netns add green +ip link add br0 type bridge +ip link set br0 up +ip addr add $IP4BR dev br0 +ip addr add $IP6BR dev br0 + +ip link add vethcab0 type veth peer name red0 +ip link set vethcab0 master br0 +ip link set red0 netns red +ip netns exec red bash -c " +ip link set lo up +ip link set red0 up +ip addr add $IP4 dev red0 +ip addr add $IP6 dev red0 +sysctl -w net.ipv4.ping_group_range='0 2147483647' +exit" +ip link set vethcab0 up + +ip link add vethcab1 type veth peer name green0 +ip link set vethcab1 master br0 +ip link set green0 netns green +ip netns exec green bash -c " +ip link set lo up +ip link set green0 up +ip addr add $TGT4 dev green0 +ip addr add $TGT6 dev green0 +exit" +ip link set vethcab1 up + +ip netns exec red bash -c " +sudo ethtool -L red0 tx $QUEUE_NUM rx $QUEUE_NUM +sudo tc qdisc add dev red0 root mqprio num_tc $QUEUE_NUM queues $queue_config map $map_config hw 0 +exit" + +get_queue_bytes() { + ip netns exec red sudo tc -s qdisc show dev red0 | grep 'Sent' | awk '{print $2}' +} + +TOTAL_TESTS=0 +FAILED_TESTS=0 + +check_result() { + ((TOTAL_TESTS++)) + if [ "$1" -ne 0 ]; then + ((FAILED_TESTS++)) + fi +} + + +for i in 4 6; do + [ $i == 4 ] && TGT=$TGT4_NO_MASK || TGT=$TGT6_NO_MASK + + for p in u i r; do + echo "Test IPV$i, prot: $p" + for value in "${priority_values[@]}"; do + ip netns exec red ./cmsg_sender -$i -Q $value -d "${DELAY}" -p $p $TGT $PORT + setsockopt_priority_bytes_num=($(get_queue_bytes)) + + ip netns exec red ./cmsg_sender -$i -P $value -d "${DELAY}" -p $p $TGT $PORT + cmsg_priority_bytes_num=($(get_queue_bytes)) + + if [[ "${cmsg_priority_bytes_num[$actual_queue]}" != \ + "${setsockopt_priority_bytes_num[$actual_queue]}" ]]; then + check_result 0 + else + check_result 1 + fi + done + done +done + +if [ $FAILED_TESTS -ne 0 ]; then + echo "FAIL - $FAILED_TESTS/$TOTAL_TESTS tests failed" + exit 1 +else + echo "OK - All $TOTAL_TESTS tests passed" + exit 0 +fi