]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
sock: Introduce SO_RCVPRIORITY socket option
authorAnna Emese Nyiri <annaemesenyiri@gmail.com>
Fri, 13 Dec 2024 08:44:57 +0000 (09:44 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 17 Dec 2024 02:16:44 +0000 (18:16 -0800)
Add new socket option, SO_RCVPRIORITY, to include SO_PRIORITY in the
ancillary data returned by recvmsg().
This is analogous to the existing support for SO_RCVMARK,
as implemented in commit 6fd1d51cfa253 ("net: SO_RCVMARK socket option
for SO_MARK with recvmsg()").

Reviewed-by: Willem de Bruijn <willemb@google.com>
Suggested-by: Ferenc Fejes <fejes@inf.elte.hu>
Signed-off-by: Anna Emese Nyiri <annaemesenyiri@gmail.com>
Link: https://patch.msgid.link/20241213084457.45120-5-annaemesenyiri@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
arch/alpha/include/uapi/asm/socket.h
arch/mips/include/uapi/asm/socket.h
arch/parisc/include/uapi/asm/socket.h
arch/sparc/include/uapi/asm/socket.h
include/net/sock.h
include/uapi/asm-generic/socket.h
net/core/sock.c
net/socket.c
tools/include/uapi/asm-generic/socket.h

index 302507bf9b5ddb98421706f667ee8105c873a572..3df5f2dd4c0fab2207d543a943adb03d203058d6 100644 (file)
 
 #define SCM_TS_OPT_ID          81
 
+#define SO_RCVPRIORITY         82
+
 #if !defined(__KERNEL__)
 
 #if __BITS_PER_LONG == 64
index d118d47315801b61f68bb0cc2edce9f7662d6d0f..22fa8f19924a7f64a3faebb7c4b81525d21665b3 100644 (file)
 
 #define SCM_TS_OPT_ID          81
 
+#define SO_RCVPRIORITY         82
+
 #if !defined(__KERNEL__)
 
 #if __BITS_PER_LONG == 64
index d268d69bfcd27e39dcae1ff6f65bca09b31609ad..aa9cd4b951fe534048e79a4e7c88ac9de689f1f6 100644 (file)
 
 #define SCM_TS_OPT_ID          0x404C
 
+#define SO_RCVPRIORITY         0x404D
+
 #if !defined(__KERNEL__)
 
 #if __BITS_PER_LONG == 64
index 113cd9f353e35f07d925550054935f3f7102974a..5b464a568664016b64fe0d978f6ccbe4ad5702dc 100644 (file)
 
 #define SCM_TS_OPT_ID            0x005a
 
+#define SO_RCVPRIORITY           0x005b
+
 #if !defined(__KERNEL__)
 
 
index 316a34d6c48b733ee9f7fdf137a1dec69a39d61f..d4bdd3286e03f84dc1ec9adce9ba268d3b7929e8 100644 (file)
@@ -953,6 +953,7 @@ enum sock_flags {
        SOCK_XDP, /* XDP is attached */
        SOCK_TSTAMP_NEW, /* Indicates 64 bit timestamps always */
        SOCK_RCVMARK, /* Receive SO_MARK  ancillary data with packet */
+       SOCK_RCVPRIORITY, /* Receive SO_PRIORITY ancillary data with packet */
 };
 
 #define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
@@ -2660,7 +2661,8 @@ static inline void sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
 {
 #define FLAGS_RECV_CMSGS ((1UL << SOCK_RXQ_OVFL)                       | \
                           (1UL << SOCK_RCVTSTAMP)                      | \
-                          (1UL << SOCK_RCVMARK))
+                          (1UL << SOCK_RCVMARK)                        |\
+                          (1UL << SOCK_RCVPRIORITY))
 #define TSFLAGS_ANY      (SOF_TIMESTAMPING_SOFTWARE                    | \
                           SOF_TIMESTAMPING_RAW_HARDWARE)
 
index deacfd6dd197fb6ae96a630ad07f40f6f7a822f8..aa5016ff3d9115cfc99cad48f7e4f5828d1a34d4 100644 (file)
 
 #define SCM_TS_OPT_ID          81
 
+#define SO_RCVPRIORITY         82
+
 #if !defined(__KERNEL__)
 
 #if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
index a3d9941c1d3257eb9edc8f3f1abed783a4009037..e7bcc8952248fae155e7fe56d07932c8fb4a395e 100644 (file)
@@ -1519,6 +1519,10 @@ set_sndbuf:
                sock_valbool_flag(sk, SOCK_RCVMARK, valbool);
                break;
 
+       case SO_RCVPRIORITY:
+               sock_valbool_flag(sk, SOCK_RCVPRIORITY, valbool);
+               break;
+
        case SO_RXQ_OVFL:
                sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool);
                break;
@@ -1947,6 +1951,10 @@ int sk_getsockopt(struct sock *sk, int level, int optname,
                v.val = sock_flag(sk, SOCK_RCVMARK);
                break;
 
+       case SO_RCVPRIORITY:
+               v.val = sock_flag(sk, SOCK_RCVPRIORITY);
+               break;
+
        case SO_RXQ_OVFL:
                v.val = sock_flag(sk, SOCK_RXQ_OVFL);
                break;
index 9a117248f18f13d574d099c80128986c744fa97f..16402b8be5a7f3abeeac0f762e6846b00024a1a1 100644 (file)
@@ -1008,12 +1008,23 @@ static void sock_recv_mark(struct msghdr *msg, struct sock *sk,
        }
 }
 
+static void sock_recv_priority(struct msghdr *msg, struct sock *sk,
+                              struct sk_buff *skb)
+{
+       if (sock_flag(sk, SOCK_RCVPRIORITY) && skb) {
+               __u32 priority = skb->priority;
+
+               put_cmsg(msg, SOL_SOCKET, SO_PRIORITY, sizeof(__u32), &priority);
+       }
+}
+
 void __sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
                       struct sk_buff *skb)
 {
        sock_recv_timestamp(msg, sk, skb);
        sock_recv_drops(msg, sk, skb);
        sock_recv_mark(msg, sk, skb);
+       sock_recv_priority(msg, sk, skb);
 }
 EXPORT_SYMBOL_GPL(__sock_recv_cmsgs);
 
index 281df9139d2b906efcf67c55ed75af1dec8028e2..ffff554a52300da1e969b5a066ea47ac8ae30be4 100644 (file)
 
 #define SCM_TS_OPT_ID          78
 
+#define SO_RCVPRIORITY         79
+
 #if !defined(__KERNEL__)
 
 #if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))