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 302507b..3df5f2d 100644 (file)
 
 #define SCM_TS_OPT_ID          81
 
+#define SO_RCVPRIORITY         82
+
 #if !defined(__KERNEL__)
 
 #if __BITS_PER_LONG == 64
index d118d47..22fa8f1 100644 (file)
 
 #define SCM_TS_OPT_ID          81
 
+#define SO_RCVPRIORITY         82
+
 #if !defined(__KERNEL__)
 
 #if __BITS_PER_LONG == 64
index d268d69..aa9cd4b 100644 (file)
 
 #define SCM_TS_OPT_ID          0x404C
 
+#define SO_RCVPRIORITY         0x404D
+
 #if !defined(__KERNEL__)
 
 #if __BITS_PER_LONG == 64
index 113cd9f..5b464a5 100644 (file)
 
 #define SCM_TS_OPT_ID            0x005a
 
+#define SO_RCVPRIORITY           0x005b
+
 #if !defined(__KERNEL__)
 
 
index 316a34d..d4bdd32 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 deacfd6..aa5016f 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 a3d9941..e7bcc89 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 9a11724..16402b8 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 281df91..ffff554 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__))