Skip to content

Commit

Permalink
sock: Introduce SO_RCVPRIORITY socket option
Browse files Browse the repository at this point in the history
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 6fd1d51 ("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>
  • Loading branch information
Anna Emese Nyiri authored and Jakub Kicinski committed Dec 17, 2024
1 parent cda7d5a commit e45469e
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 1 deletion.
2 changes: 2 additions & 0 deletions arch/alpha/include/uapi/asm/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@

#define SCM_TS_OPT_ID 81

#define SO_RCVPRIORITY 82

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
Expand Down
2 changes: 2 additions & 0 deletions arch/mips/include/uapi/asm/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@

#define SCM_TS_OPT_ID 81

#define SO_RCVPRIORITY 82

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
Expand Down
2 changes: 2 additions & 0 deletions arch/parisc/include/uapi/asm/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@

#define SCM_TS_OPT_ID 0x404C

#define SO_RCVPRIORITY 0x404D

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
Expand Down
2 changes: 2 additions & 0 deletions arch/sparc/include/uapi/asm/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,8 @@

#define SCM_TS_OPT_ID 0x005a

#define SO_RCVPRIORITY 0x005b

#if !defined(__KERNEL__)


Expand Down
4 changes: 3 additions & 1 deletion include/net/sock.h
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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)

Expand Down
2 changes: 2 additions & 0 deletions include/uapi/asm-generic/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@

#define SCM_TS_OPT_ID 81

#define SO_RCVPRIORITY 82

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
Expand Down
8 changes: 8 additions & 0 deletions net/core/sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -1519,6 +1519,10 @@ int sk_setsockopt(struct sock *sk, int level, int optname,
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;
Expand Down Expand Up @@ -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;
Expand Down
11 changes: 11 additions & 0 deletions net/socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 2 additions & 0 deletions tools/include/uapi/asm-generic/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@

#define SCM_TS_OPT_ID 78

#define SO_RCVPRIORITY 79

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
Expand Down

0 comments on commit e45469e

Please sign in to comment.