* [PATCH net-next] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg().
@ 2022-04-26 17:38 Erin MacNeil
2022-04-27 1:43 ` kernel test robot
2022-04-27 3:25 ` [PATCH net-next] net: Add SO_RCVMARK socket option to provide " kernel test robot
0 siblings, 2 replies; 19+ messages in thread
From: Erin MacNeil @ 2022-04-26 17:38 UTC (permalink / raw)
To: netdev; +Cc: Erin MacNeil
Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
should be included in the ancillary data returned by recvmsg().
Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
---
include/net/sock.h | 14 ++++++++------
include/uapi/asm-generic/socket.h | 2 ++
net/atm/common.c | 2 +-
net/bluetooth/af_bluetooth.c | 4 ++--
net/can/bcm.c | 2 +-
net/can/j1939/socket.c | 2 +-
net/can/raw.c | 2 +-
net/core/sock.c | 7 +++++++
net/ieee802154/socket.c | 4 ++--
net/ipv4/raw.c | 2 +-
net/ipv4/udp.c | 2 +-
net/ipv6/raw.c | 2 +-
net/ipv6/udp.c | 2 +-
net/key/af_key.c | 2 +-
net/mctp/af_mctp.c | 2 +-
net/packet/af_packet.c | 2 +-
net/sctp/socket.c | 2 +-
net/socket.c | 15 ++++++++++++---
18 files changed, 45 insertions(+), 25 deletions(-)
diff --git a/include/net/sock.h b/include/net/sock.h
index a01d6c421aa2..51585f0bc212 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -895,6 +895,7 @@ enum sock_flags {
SOCK_TXTIME,
SOCK_XDP, /* XDP is attached */
SOCK_TSTAMP_NEW, /* Indicates 64 bit timestamps always */
+ SOCK_RCVMARK, /* Receive SO_MARK ancillary data with packet */
};
#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
@@ -2649,20 +2650,21 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
__sock_recv_wifi_status(msg, sk, skb);
}
-void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
+void __sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
struct sk_buff *skb);
#define SK_DEFAULT_STAMP (-1L * NSEC_PER_SEC)
-static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
+static inline void sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
struct sk_buff *skb)
{
-#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \
- (1UL << SOCK_RCVTSTAMP))
+#define FLAGS_RECV_CMSGS ((1UL << SOCK_RXQ_OVFL) | \
+ (1UL << SOCK_RCVTSTAMP) | \
+ (1UL << SOCK_RCVMARK))
#define TSFLAGS_ANY (SOF_TIMESTAMPING_SOFTWARE | \
SOF_TIMESTAMPING_RAW_HARDWARE)
- if (sk->sk_flags & FLAGS_TS_OR_DROPS || sk->sk_tsflags & TSFLAGS_ANY)
- __sock_recv_ts_and_drops(msg, sk, skb);
+ if (sk->sk_flags & FLAGS_RECV_CMSGS || sk->sk_tsflags & TSFLAGS_ANY)
+ __sock_recv_cmsgs(msg, sk, skb);
else if (unlikely(sock_flag(sk, SOCK_TIMESTAMP)))
sock_write_timestamp(sk, skb->tstamp);
else if (unlikely(sk->sk_stamp == SK_DEFAULT_STAMP))
diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h
index 467ca2f28760..638230899e98 100644
--- a/include/uapi/asm-generic/socket.h
+++ b/include/uapi/asm-generic/socket.h
@@ -130,6 +130,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
diff --git a/net/atm/common.c b/net/atm/common.c
index d0c8ab7ff8f6..f7019df41c3e 100644
--- a/net/atm/common.c
+++ b/net/atm/common.c
@@ -553,7 +553,7 @@ int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
error = skb_copy_datagram_msg(skb, 0, msg, copied);
if (error)
return error;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (!(flags & MSG_PEEK)) {
pr_debug("%d -= %d\n", atomic_read(&sk->sk_rmem_alloc),
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
index 62705734343b..b506409bb498 100644
--- a/net/bluetooth/af_bluetooth.c
+++ b/net/bluetooth/af_bluetooth.c
@@ -280,7 +280,7 @@ int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
skb_reset_transport_header(skb);
err = skb_copy_datagram_msg(skb, 0, msg, copied);
if (err == 0) {
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name && bt_sk(sk)->skb_msg_name)
bt_sk(sk)->skb_msg_name(skb, msg->msg_name,
@@ -384,7 +384,7 @@ int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
copied += chunk;
size -= chunk;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (!(flags & MSG_PEEK)) {
int skb_len = skb_headlen(skb);
diff --git a/net/can/bcm.c b/net/can/bcm.c
index 64c07e650bb4..65ee1b784a30 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -1647,7 +1647,7 @@ static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
return err;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
__sockaddr_check_size(BCM_MIN_NAMELEN);
diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c
index 0bb4fd3f6264..f5ecfdcf57b2 100644
--- a/net/can/j1939/socket.c
+++ b/net/can/j1939/socket.c
@@ -841,7 +841,7 @@ static int j1939_sk_recvmsg(struct socket *sock, struct msghdr *msg,
paddr->can_addr.j1939.pgn = skcb->addr.pgn;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
msg->msg_flags |= skcb->msg_flags;
skb_free_datagram(sk, skb);
diff --git a/net/can/raw.c b/net/can/raw.c
index 0cf728dcff36..b7dbb57557f3 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c
@@ -866,7 +866,7 @@ static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
return err;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
__sockaddr_check_size(RAW_MIN_NAMELEN);
diff --git a/net/core/sock.c b/net/core/sock.c
index 29abec3eabd8..673b6e49f109 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1311,6 +1311,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
__sock_set_mark(sk, val);
break;
+ case SO_RCVMARK:
+ sock_valbool_flag(sk, SOCK_RCVMARK, valbool);
+ break;
case SO_RXQ_OVFL:
sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool);
@@ -1737,6 +1740,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
v.val = sk->sk_mark;
break;
+ case SO_RCVMARK:
+ v.val = sock_flag(sk, SOCK_RCVMARK);
+ break;
+
case SO_RXQ_OVFL:
v.val = sock_flag(sk, SOCK_RXQ_OVFL);
break;
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c
index f24852814fa3..718fb77bb372 100644
--- a/net/ieee802154/socket.c
+++ b/net/ieee802154/socket.c
@@ -328,7 +328,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (flags & MSG_TRUNC)
copied = skb->len;
@@ -718,7 +718,7 @@ static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (saddr) {
/* Clear the implicit padding in struct sockaddr_ieee802154
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 4056b0da85ea..bbd717805b10 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -783,7 +783,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (sin) {
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index aa8545ca6964..9d5071c79c95 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1909,7 +1909,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
UDP_INC_STATS(sock_net(sk),
UDP_MIB_INDATAGRAMS, is_udplite);
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (sin) {
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 0d7c13d33d1a..3b7cbd522b54 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -512,7 +512,7 @@ static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
*addr_len = sizeof(*sin6);
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (np->rxopt.all)
ip6_datagram_recv_ctl(sk, msg, skb);
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 688af6f809fe..3fc97d4621ac 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -391,7 +391,7 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (!peeking)
SNMP_INC_STATS(mib, UDP_MIB_INDATAGRAMS);
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (msg->msg_name) {
diff --git a/net/key/af_key.c b/net/key/af_key.c
index d09ec26b1081..175a162eec58 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -3711,7 +3711,7 @@ static int pfkey_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (err)
goto out_free;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
err = (flags & MSG_TRUNC) ? skb->len : copied;
diff --git a/net/mctp/af_mctp.c b/net/mctp/af_mctp.c
index 221863afc4b1..c2fc2a7b2528 100644
--- a/net/mctp/af_mctp.c
+++ b/net/mctp/af_mctp.c
@@ -238,7 +238,7 @@ static int mctp_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (rc < 0)
goto out_free;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (addr) {
struct mctp_skb_cb *cb = mctp_cb(skb);
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index fd31334cf688..677f9cfa9660 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -3477,7 +3477,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
sll->sll_protocol = skb->protocol;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
const size_t max_len = min(sizeof(skb->cb),
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 3e3fe923bed5..6d37d2dfb3da 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -2128,7 +2128,7 @@ static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
head_skb = event->chunk->head_skb;
else
head_skb = skb;
- sock_recv_ts_and_drops(msg, sk, head_skb);
+ sock_recv_cmsgs(msg, sk, head_skb);
if (sctp_ulpevent_is_notification(event)) {
msg->msg_flags |= MSG_NOTIFICATION;
sp->pf->event_msgname(event, msg->msg_name, addr_len);
diff --git a/net/socket.c b/net/socket.c
index 6887840682bb..9b40be3d0456 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -930,13 +930,22 @@ static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
sizeof(__u32), &SOCK_SKB_CB(skb)->dropcount);
}
-void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb)
+static inline void sock_recv_mark(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb)
+{
+ if (sock_flag(sk, SOCK_RCVMARK) && skb)
+ put_cmsg(msg, SOL_SOCKET, SO_MARK, sizeof(__u32),
+ &skb->mark);
+}
+
+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);
}
-EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
+EXPORT_SYMBOL_GPL(__sock_recv_cmsgs);
INDIRECT_CALLABLE_DECLARE(int inet_recvmsg(struct socket *, struct msghdr *,
size_t, int));
--
2.20.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH net-next] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg().
2022-04-26 17:38 [PATCH net-next] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg() Erin MacNeil
@ 2022-04-27 1:43 ` kernel test robot
2022-04-27 3:21 ` Erin MacNeil
2022-04-27 20:02 ` Erin MacNeil
2022-04-27 3:25 ` [PATCH net-next] net: Add SO_RCVMARK socket option to provide " kernel test robot
1 sibling, 2 replies; 19+ messages in thread
From: kernel test robot @ 2022-04-27 1:43 UTC (permalink / raw)
To: Erin MacNeil, netdev; +Cc: kbuild-all, Erin MacNeil
Hi Erin,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on net-next/master]
url: https://github.com/intel-lab-lkp/linux/commits/Erin-MacNeil/net-Add-SO_RCVMARK-socket-option-to-provide-SO_MARK-with-recvmsg/20220427-014257
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 561215482cc69d1c758944d4463b3d5d96d37bd1
config: alpha-defconfig (https://download.01.org/0day-ci/archive/20220427/202204270907.nUUrw3dS-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/ba0c57c49e3f18b23fe626dd2e603cf4ed91ebf7
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Erin-MacNeil/net-Add-SO_RCVMARK-socket-option-to-provide-SO_MARK-with-recvmsg/20220427-014257
git checkout ba0c57c49e3f18b23fe626dd2e603cf4ed91ebf7
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=alpha SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
net/core/sock.c: In function 'sock_setsockopt':
>> net/core/sock.c:1314:14: error: 'SO_RCVMARK' undeclared (first use in this function); did you mean 'SOCK_RCVMARK'?
1314 | case SO_RCVMARK:
| ^~~~~~~~~~
| SOCK_RCVMARK
net/core/sock.c:1314:14: note: each undeclared identifier is reported only once for each function it appears in
net/core/sock.c: In function 'sock_getsockopt':
net/core/sock.c:1743:14: error: 'SO_RCVMARK' undeclared (first use in this function); did you mean 'SOCK_RCVMARK'?
1743 | case SO_RCVMARK:
| ^~~~~~~~~~
| SOCK_RCVMARK
vim +1314 net/core/sock.c
1031
1032 /*
1033 * This is meant for all protocols to use and covers goings on
1034 * at the socket level. Everything here is generic.
1035 */
1036
1037 int sock_setsockopt(struct socket *sock, int level, int optname,
1038 sockptr_t optval, unsigned int optlen)
1039 {
1040 struct so_timestamping timestamping;
1041 struct sock_txtime sk_txtime;
1042 struct sock *sk = sock->sk;
1043 int val;
1044 int valbool;
1045 struct linger ling;
1046 int ret = 0;
1047
1048 /*
1049 * Options without arguments
1050 */
1051
1052 if (optname == SO_BINDTODEVICE)
1053 return sock_setbindtodevice(sk, optval, optlen);
1054
1055 if (optlen < sizeof(int))
1056 return -EINVAL;
1057
1058 if (copy_from_sockptr(&val, optval, sizeof(val)))
1059 return -EFAULT;
1060
1061 valbool = val ? 1 : 0;
1062
1063 lock_sock(sk);
1064
1065 switch (optname) {
1066 case SO_DEBUG:
1067 if (val && !capable(CAP_NET_ADMIN))
1068 ret = -EACCES;
1069 else
1070 sock_valbool_flag(sk, SOCK_DBG, valbool);
1071 break;
1072 case SO_REUSEADDR:
1073 sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE);
1074 break;
1075 case SO_REUSEPORT:
1076 sk->sk_reuseport = valbool;
1077 break;
1078 case SO_TYPE:
1079 case SO_PROTOCOL:
1080 case SO_DOMAIN:
1081 case SO_ERROR:
1082 ret = -ENOPROTOOPT;
1083 break;
1084 case SO_DONTROUTE:
1085 sock_valbool_flag(sk, SOCK_LOCALROUTE, valbool);
1086 sk_dst_reset(sk);
1087 break;
1088 case SO_BROADCAST:
1089 sock_valbool_flag(sk, SOCK_BROADCAST, valbool);
1090 break;
1091 case SO_SNDBUF:
1092 /* Don't error on this BSD doesn't and if you think
1093 * about it this is right. Otherwise apps have to
1094 * play 'guess the biggest size' games. RCVBUF/SNDBUF
1095 * are treated in BSD as hints
1096 */
1097 val = min_t(u32, val, sysctl_wmem_max);
1098 set_sndbuf:
1099 /* Ensure val * 2 fits into an int, to prevent max_t()
1100 * from treating it as a negative value.
1101 */
1102 val = min_t(int, val, INT_MAX / 2);
1103 sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
1104 WRITE_ONCE(sk->sk_sndbuf,
1105 max_t(int, val * 2, SOCK_MIN_SNDBUF));
1106 /* Wake up sending tasks if we upped the value. */
1107 sk->sk_write_space(sk);
1108 break;
1109
1110 case SO_SNDBUFFORCE:
1111 if (!capable(CAP_NET_ADMIN)) {
1112 ret = -EPERM;
1113 break;
1114 }
1115
1116 /* No negative values (to prevent underflow, as val will be
1117 * multiplied by 2).
1118 */
1119 if (val < 0)
1120 val = 0;
1121 goto set_sndbuf;
1122
1123 case SO_RCVBUF:
1124 /* Don't error on this BSD doesn't and if you think
1125 * about it this is right. Otherwise apps have to
1126 * play 'guess the biggest size' games. RCVBUF/SNDBUF
1127 * are treated in BSD as hints
1128 */
1129 __sock_set_rcvbuf(sk, min_t(u32, val, sysctl_rmem_max));
1130 break;
1131
1132 case SO_RCVBUFFORCE:
1133 if (!capable(CAP_NET_ADMIN)) {
1134 ret = -EPERM;
1135 break;
1136 }
1137
1138 /* No negative values (to prevent underflow, as val will be
1139 * multiplied by 2).
1140 */
1141 __sock_set_rcvbuf(sk, max(val, 0));
1142 break;
1143
1144 case SO_KEEPALIVE:
1145 if (sk->sk_prot->keepalive)
1146 sk->sk_prot->keepalive(sk, valbool);
1147 sock_valbool_flag(sk, SOCK_KEEPOPEN, valbool);
1148 break;
1149
1150 case SO_OOBINLINE:
1151 sock_valbool_flag(sk, SOCK_URGINLINE, valbool);
1152 break;
1153
1154 case SO_NO_CHECK:
1155 sk->sk_no_check_tx = valbool;
1156 break;
1157
1158 case SO_PRIORITY:
1159 if ((val >= 0 && val <= 6) ||
1160 ns_capable(sock_net(sk)->user_ns, CAP_NET_RAW) ||
1161 ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))
1162 sk->sk_priority = val;
1163 else
1164 ret = -EPERM;
1165 break;
1166
1167 case SO_LINGER:
1168 if (optlen < sizeof(ling)) {
1169 ret = -EINVAL; /* 1003.1g */
1170 break;
1171 }
1172 if (copy_from_sockptr(&ling, optval, sizeof(ling))) {
1173 ret = -EFAULT;
1174 break;
1175 }
1176 if (!ling.l_onoff)
1177 sock_reset_flag(sk, SOCK_LINGER);
1178 else {
1179 #if (BITS_PER_LONG == 32)
1180 if ((unsigned int)ling.l_linger >= MAX_SCHEDULE_TIMEOUT/HZ)
1181 sk->sk_lingertime = MAX_SCHEDULE_TIMEOUT;
1182 else
1183 #endif
1184 sk->sk_lingertime = (unsigned int)ling.l_linger * HZ;
1185 sock_set_flag(sk, SOCK_LINGER);
1186 }
1187 break;
1188
1189 case SO_BSDCOMPAT:
1190 break;
1191
1192 case SO_PASSCRED:
1193 if (valbool)
1194 set_bit(SOCK_PASSCRED, &sock->flags);
1195 else
1196 clear_bit(SOCK_PASSCRED, &sock->flags);
1197 break;
1198
1199 case SO_TIMESTAMP_OLD:
1200 case SO_TIMESTAMP_NEW:
1201 case SO_TIMESTAMPNS_OLD:
1202 case SO_TIMESTAMPNS_NEW:
1203 sock_set_timestamp(sk, optname, valbool);
1204 break;
1205
1206 case SO_TIMESTAMPING_NEW:
1207 case SO_TIMESTAMPING_OLD:
1208 if (optlen == sizeof(timestamping)) {
1209 if (copy_from_sockptr(×tamping, optval,
1210 sizeof(timestamping))) {
1211 ret = -EFAULT;
1212 break;
1213 }
1214 } else {
1215 memset(×tamping, 0, sizeof(timestamping));
1216 timestamping.flags = val;
1217 }
1218 ret = sock_set_timestamping(sk, optname, timestamping);
1219 break;
1220
1221 case SO_RCVLOWAT:
1222 if (val < 0)
1223 val = INT_MAX;
1224 if (sock->ops->set_rcvlowat)
1225 ret = sock->ops->set_rcvlowat(sk, val);
1226 else
1227 WRITE_ONCE(sk->sk_rcvlowat, val ? : 1);
1228 break;
1229
1230 case SO_RCVTIMEO_OLD:
1231 case SO_RCVTIMEO_NEW:
1232 ret = sock_set_timeout(&sk->sk_rcvtimeo, optval,
1233 optlen, optname == SO_RCVTIMEO_OLD);
1234 break;
1235
1236 case SO_SNDTIMEO_OLD:
1237 case SO_SNDTIMEO_NEW:
1238 ret = sock_set_timeout(&sk->sk_sndtimeo, optval,
1239 optlen, optname == SO_SNDTIMEO_OLD);
1240 break;
1241
1242 case SO_ATTACH_FILTER: {
1243 struct sock_fprog fprog;
1244
1245 ret = copy_bpf_fprog_from_user(&fprog, optval, optlen);
1246 if (!ret)
1247 ret = sk_attach_filter(&fprog, sk);
1248 break;
1249 }
1250 case SO_ATTACH_BPF:
1251 ret = -EINVAL;
1252 if (optlen == sizeof(u32)) {
1253 u32 ufd;
1254
1255 ret = -EFAULT;
1256 if (copy_from_sockptr(&ufd, optval, sizeof(ufd)))
1257 break;
1258
1259 ret = sk_attach_bpf(ufd, sk);
1260 }
1261 break;
1262
1263 case SO_ATTACH_REUSEPORT_CBPF: {
1264 struct sock_fprog fprog;
1265
1266 ret = copy_bpf_fprog_from_user(&fprog, optval, optlen);
1267 if (!ret)
1268 ret = sk_reuseport_attach_filter(&fprog, sk);
1269 break;
1270 }
1271 case SO_ATTACH_REUSEPORT_EBPF:
1272 ret = -EINVAL;
1273 if (optlen == sizeof(u32)) {
1274 u32 ufd;
1275
1276 ret = -EFAULT;
1277 if (copy_from_sockptr(&ufd, optval, sizeof(ufd)))
1278 break;
1279
1280 ret = sk_reuseport_attach_bpf(ufd, sk);
1281 }
1282 break;
1283
1284 case SO_DETACH_REUSEPORT_BPF:
1285 ret = reuseport_detach_prog(sk);
1286 break;
1287
1288 case SO_DETACH_FILTER:
1289 ret = sk_detach_filter(sk);
1290 break;
1291
1292 case SO_LOCK_FILTER:
1293 if (sock_flag(sk, SOCK_FILTER_LOCKED) && !valbool)
1294 ret = -EPERM;
1295 else
1296 sock_valbool_flag(sk, SOCK_FILTER_LOCKED, valbool);
1297 break;
1298
1299 case SO_PASSSEC:
1300 if (valbool)
1301 set_bit(SOCK_PASSSEC, &sock->flags);
1302 else
1303 clear_bit(SOCK_PASSSEC, &sock->flags);
1304 break;
1305 case SO_MARK:
1306 if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_RAW) &&
1307 !ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) {
1308 ret = -EPERM;
1309 break;
1310 }
1311
1312 __sock_set_mark(sk, val);
1313 break;
> 1314 case SO_RCVMARK:
1315 sock_valbool_flag(sk, SOCK_RCVMARK, valbool);
1316 break;
1317
1318 case SO_RXQ_OVFL:
1319 sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool);
1320 break;
1321
1322 case SO_WIFI_STATUS:
1323 sock_valbool_flag(sk, SOCK_WIFI_STATUS, valbool);
1324 break;
1325
1326 case SO_PEEK_OFF:
1327 if (sock->ops->set_peek_off)
1328 ret = sock->ops->set_peek_off(sk, val);
1329 else
1330 ret = -EOPNOTSUPP;
1331 break;
1332
1333 case SO_NOFCS:
1334 sock_valbool_flag(sk, SOCK_NOFCS, valbool);
1335 break;
1336
1337 case SO_SELECT_ERR_QUEUE:
1338 sock_valbool_flag(sk, SOCK_SELECT_ERR_QUEUE, valbool);
1339 break;
1340
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH net-next v2] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg().
2022-04-27 1:43 ` kernel test robot
@ 2022-04-27 3:21 ` Erin MacNeil
2022-04-27 20:02 ` Erin MacNeil
1 sibling, 0 replies; 19+ messages in thread
From: Erin MacNeil @ 2022-04-27 3:21 UTC (permalink / raw)
To: lnx.erin
Cc: Richard Henderson, Ivan Kokshaysky, Matt Turner,
Thomas Bogendoerfer, James E.J. Bottomley, Helge Deller,
David S. Miller, Jakub Kicinski, Paolo Abeni, Arnd Bergmann,
Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
Oliver Hartkopp, Marc Kleine-Budde, Robin van der Gracht,
Oleksij Rempel, kernel, Alexander Aring, Stefan Schmidt,
Hideaki YOSHIFUJI, David Ahern, Steffen Klassert, Herbert Xu,
Jeremy Kerr, Matt Johnston, Vlad Yasevich, Neil Horman,
Marcelo Ricardo Leitner, Eric Dumazet, Akhmat Karakotov,
Stephen Rothwell, Martynas Pumputis, Pavel Tikhomirov,
Lorenz Bauer, Wei Wang, Yangbo Lu, Florian Westphal,
Thomas Gleixner, Richard Palethorpe, Hangbin Liu,
Willem de Bruijn, Pablo Neira Ayuso, Richard Sanger, Yajun Deng,
Jiapeng Chong, linux-alpha, linux-kernel, linux-mips,
linux-parisc, sparclinux, netdev, linux-arch, linux-bluetooth,
linux-can, linux-wpan, linux-sctp
Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
should be included in the ancillary data returned by recvmsg().
Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
---
arch/alpha/include/uapi/asm/socket.h | 2 ++
arch/mips/include/uapi/asm/socket.h | 2 ++
arch/parisc/include/uapi/asm/socket.h | 2 ++
arch/sparc/include/uapi/asm/socket.h | 2 ++
include/net/sock.h | 18 ++++++++++--------
include/uapi/asm-generic/socket.h | 2 ++
net/atm/common.c | 2 +-
net/bluetooth/af_bluetooth.c | 4 ++--
net/can/bcm.c | 2 +-
net/can/j1939/socket.c | 2 +-
net/can/raw.c | 2 +-
net/core/sock.c | 7 +++++++
net/ieee802154/socket.c | 4 ++--
net/ipv4/raw.c | 2 +-
net/ipv4/udp.c | 2 +-
net/ipv6/raw.c | 2 +-
net/ipv6/udp.c | 2 +-
net/key/af_key.c | 2 +-
net/mctp/af_mctp.c | 2 +-
net/packet/af_packet.c | 2 +-
net/sctp/socket.c | 2 +-
net/socket.c | 15 ++++++++++++---
tools/include/uapi/asm-generic/socket.h | 2 ++
23 files changed, 57 insertions(+), 27 deletions(-)
diff --git a/arch/alpha/include/uapi/asm/socket.h b/arch/alpha/include/uapi/asm/socket.h
index 7d81535893af..739891b94136 100644
--- a/arch/alpha/include/uapi/asm/socket.h
+++ b/arch/alpha/include/uapi/asm/socket.h
@@ -135,6 +135,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/mips/include/uapi/asm/socket.h b/arch/mips/include/uapi/asm/socket.h
index 1d55e57b8466..18f3d95ecfec 100644
--- a/arch/mips/include/uapi/asm/socket.h
+++ b/arch/mips/include/uapi/asm/socket.h
@@ -146,6 +146,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h
index 654061e0964e..f486d3dfb6bb 100644
--- a/arch/parisc/include/uapi/asm/socket.h
+++ b/arch/parisc/include/uapi/asm/socket.h
@@ -127,6 +127,8 @@
#define SO_TXREHASH 0x4048
+#define SO_RCVMARK 0x4049
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h
index 666f81e617ea..ff08038fc2b2 100644
--- a/arch/sparc/include/uapi/asm/socket.h
+++ b/arch/sparc/include/uapi/asm/socket.h
@@ -128,6 +128,8 @@
#define SO_TXREHASH 0x0053
+#define SO_RCVMARK 0x0054
+
#if !defined(__KERNEL__)
diff --git a/include/net/sock.h b/include/net/sock.h
index a01d6c421aa2..30e7cbad194c 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -895,6 +895,7 @@ enum sock_flags {
SOCK_TXTIME,
SOCK_XDP, /* XDP is attached */
SOCK_TSTAMP_NEW, /* Indicates 64 bit timestamps always */
+ SOCK_RCVMARK, /* Receive SO_MARK ancillary data with packet */
};
#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
@@ -2649,20 +2650,21 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
__sock_recv_wifi_status(msg, sk, skb);
}
-void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb);
+void __sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb);
#define SK_DEFAULT_STAMP (-1L * NSEC_PER_SEC)
-static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb)
+static inline void sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb)
{
-#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \
- (1UL << SOCK_RCVTSTAMP))
+#define FLAGS_RECV_CMSGS ((1UL << SOCK_RXQ_OVFL) | \
+ (1UL << SOCK_RCVTSTAMP) | \
+ (1UL << SOCK_RCVMARK))
#define TSFLAGS_ANY (SOF_TIMESTAMPING_SOFTWARE | \
SOF_TIMESTAMPING_RAW_HARDWARE)
- if (sk->sk_flags & FLAGS_TS_OR_DROPS || sk->sk_tsflags & TSFLAGS_ANY)
- __sock_recv_ts_and_drops(msg, sk, skb);
+ if (sk->sk_flags & FLAGS_RECV_CMSGS || sk->sk_tsflags & TSFLAGS_ANY)
+ __sock_recv_cmsgs(msg, sk, skb);
else if (unlikely(sock_flag(sk, SOCK_TIMESTAMP)))
sock_write_timestamp(sk, skb->tstamp);
else if (unlikely(sk->sk_stamp == SK_DEFAULT_STAMP))
diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h
index 467ca2f28760..638230899e98 100644
--- a/include/uapi/asm-generic/socket.h
+++ b/include/uapi/asm-generic/socket.h
@@ -130,6 +130,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
diff --git a/net/atm/common.c b/net/atm/common.c
index d0c8ab7ff8f6..f7019df41c3e 100644
--- a/net/atm/common.c
+++ b/net/atm/common.c
@@ -553,7 +553,7 @@ int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
error = skb_copy_datagram_msg(skb, 0, msg, copied);
if (error)
return error;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (!(flags & MSG_PEEK)) {
pr_debug("%d -= %d\n", atomic_read(&sk->sk_rmem_alloc),
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
index 62705734343b..b506409bb498 100644
--- a/net/bluetooth/af_bluetooth.c
+++ b/net/bluetooth/af_bluetooth.c
@@ -280,7 +280,7 @@ int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
skb_reset_transport_header(skb);
err = skb_copy_datagram_msg(skb, 0, msg, copied);
if (err == 0) {
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name && bt_sk(sk)->skb_msg_name)
bt_sk(sk)->skb_msg_name(skb, msg->msg_name,
@@ -384,7 +384,7 @@ int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
copied += chunk;
size -= chunk;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (!(flags & MSG_PEEK)) {
int skb_len = skb_headlen(skb);
diff --git a/net/can/bcm.c b/net/can/bcm.c
index 64c07e650bb4..65ee1b784a30 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -1647,7 +1647,7 @@ static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
return err;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
__sockaddr_check_size(BCM_MIN_NAMELEN);
diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c
index 0bb4fd3f6264..f5ecfdcf57b2 100644
--- a/net/can/j1939/socket.c
+++ b/net/can/j1939/socket.c
@@ -841,7 +841,7 @@ static int j1939_sk_recvmsg(struct socket *sock, struct msghdr *msg,
paddr->can_addr.j1939.pgn = skcb->addr.pgn;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
msg->msg_flags |= skcb->msg_flags;
skb_free_datagram(sk, skb);
diff --git a/net/can/raw.c b/net/can/raw.c
index 0cf728dcff36..b7dbb57557f3 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c
@@ -866,7 +866,7 @@ static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
return err;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
__sockaddr_check_size(RAW_MIN_NAMELEN);
diff --git a/net/core/sock.c b/net/core/sock.c
index 29abec3eabd8..673b6e49f109 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1311,6 +1311,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
__sock_set_mark(sk, val);
break;
+ case SO_RCVMARK:
+ sock_valbool_flag(sk, SOCK_RCVMARK, valbool);
+ break;
case SO_RXQ_OVFL:
sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool);
@@ -1737,6 +1740,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
v.val = sk->sk_mark;
break;
+ case SO_RCVMARK:
+ v.val = sock_flag(sk, SOCK_RCVMARK);
+ break;
+
case SO_RXQ_OVFL:
v.val = sock_flag(sk, SOCK_RXQ_OVFL);
break;
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c
index f24852814fa3..718fb77bb372 100644
--- a/net/ieee802154/socket.c
+++ b/net/ieee802154/socket.c
@@ -328,7 +328,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (flags & MSG_TRUNC)
copied = skb->len;
@@ -718,7 +718,7 @@ static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (saddr) {
/* Clear the implicit padding in struct sockaddr_ieee802154
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 4056b0da85ea..bbd717805b10 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -783,7 +783,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (sin) {
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index aa8545ca6964..9d5071c79c95 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1909,7 +1909,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
UDP_INC_STATS(sock_net(sk),
UDP_MIB_INDATAGRAMS, is_udplite);
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (sin) {
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 0d7c13d33d1a..3b7cbd522b54 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -512,7 +512,7 @@ static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
*addr_len = sizeof(*sin6);
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (np->rxopt.all)
ip6_datagram_recv_ctl(sk, msg, skb);
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 688af6f809fe..3fc97d4621ac 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -391,7 +391,7 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (!peeking)
SNMP_INC_STATS(mib, UDP_MIB_INDATAGRAMS);
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (msg->msg_name) {
diff --git a/net/key/af_key.c b/net/key/af_key.c
index d09ec26b1081..175a162eec58 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -3711,7 +3711,7 @@ static int pfkey_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (err)
goto out_free;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
err = (flags & MSG_TRUNC) ? skb->len : copied;
diff --git a/net/mctp/af_mctp.c b/net/mctp/af_mctp.c
index 221863afc4b1..c2fc2a7b2528 100644
--- a/net/mctp/af_mctp.c
+++ b/net/mctp/af_mctp.c
@@ -238,7 +238,7 @@ static int mctp_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (rc < 0)
goto out_free;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (addr) {
struct mctp_skb_cb *cb = mctp_cb(skb);
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index fd31334cf688..677f9cfa9660 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -3477,7 +3477,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
sll->sll_protocol = skb->protocol;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
const size_t max_len = min(sizeof(skb->cb),
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 3e3fe923bed5..6d37d2dfb3da 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -2128,7 +2128,7 @@ static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
head_skb = event->chunk->head_skb;
else
head_skb = skb;
- sock_recv_ts_and_drops(msg, sk, head_skb);
+ sock_recv_cmsgs(msg, sk, head_skb);
if (sctp_ulpevent_is_notification(event)) {
msg->msg_flags |= MSG_NOTIFICATION;
sp->pf->event_msgname(event, msg->msg_name, addr_len);
diff --git a/net/socket.c b/net/socket.c
index 6887840682bb..f0c39c874665 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -930,13 +930,22 @@ static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
sizeof(__u32), &SOCK_SKB_CB(skb)->dropcount);
}
-void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb)
+static void sock_recv_mark(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb)
+{
+ if (sock_flag(sk, SOCK_RCVMARK) && skb)
+ put_cmsg(msg, SOL_SOCKET, SO_MARK, sizeof(__u32),
+ &skb->mark);
+}
+
+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);
}
-EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
+EXPORT_SYMBOL_GPL(__sock_recv_cmsgs);
INDIRECT_CALLABLE_DECLARE(int inet_recvmsg(struct socket *, struct msghdr *,
size_t, int));
diff --git a/tools/include/uapi/asm-generic/socket.h b/tools/include/uapi/asm-generic/socket.h
index 77f7c1638eb1..8756df13be50 100644
--- a/tools/include/uapi/asm-generic/socket.h
+++ b/tools/include/uapi/asm-generic/socket.h
@@ -119,6 +119,8 @@
#define SO_DETACH_REUSEPORT_BPF 68
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
--
2.20.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH net-next v2] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg().
@ 2022-04-27 3:21 ` Erin MacNeil
0 siblings, 0 replies; 19+ messages in thread
From: Erin MacNeil @ 2022-04-27 3:21 UTC (permalink / raw)
To: lnx.erin
Cc: Richard Henderson, Ivan Kokshaysky, Matt Turner,
Thomas Bogendoerfer, James E.J. Bottomley, Helge Deller,
David S. Miller, Jakub Kicinski, Paolo Abeni, Arnd Bergmann,
Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
Oliver Hartkopp, Marc Kleine-Budde, Robin van der Gracht,
Oleksij Rempel, kernel, Alexander Aring, Stefan
Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
should be included in the ancillary data returned by recvmsg().
Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
---
arch/alpha/include/uapi/asm/socket.h | 2 ++
arch/mips/include/uapi/asm/socket.h | 2 ++
arch/parisc/include/uapi/asm/socket.h | 2 ++
arch/sparc/include/uapi/asm/socket.h | 2 ++
include/net/sock.h | 18 ++++++++++--------
include/uapi/asm-generic/socket.h | 2 ++
net/atm/common.c | 2 +-
net/bluetooth/af_bluetooth.c | 4 ++--
net/can/bcm.c | 2 +-
net/can/j1939/socket.c | 2 +-
net/can/raw.c | 2 +-
net/core/sock.c | 7 +++++++
net/ieee802154/socket.c | 4 ++--
net/ipv4/raw.c | 2 +-
net/ipv4/udp.c | 2 +-
net/ipv6/raw.c | 2 +-
net/ipv6/udp.c | 2 +-
net/key/af_key.c | 2 +-
net/mctp/af_mctp.c | 2 +-
net/packet/af_packet.c | 2 +-
net/sctp/socket.c | 2 +-
net/socket.c | 15 ++++++++++++---
tools/include/uapi/asm-generic/socket.h | 2 ++
23 files changed, 57 insertions(+), 27 deletions(-)
diff --git a/arch/alpha/include/uapi/asm/socket.h b/arch/alpha/include/uapi/asm/socket.h
index 7d81535893af..739891b94136 100644
--- a/arch/alpha/include/uapi/asm/socket.h
+++ b/arch/alpha/include/uapi/asm/socket.h
@@ -135,6 +135,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/mips/include/uapi/asm/socket.h b/arch/mips/include/uapi/asm/socket.h
index 1d55e57b8466..18f3d95ecfec 100644
--- a/arch/mips/include/uapi/asm/socket.h
+++ b/arch/mips/include/uapi/asm/socket.h
@@ -146,6 +146,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h
index 654061e0964e..f486d3dfb6bb 100644
--- a/arch/parisc/include/uapi/asm/socket.h
+++ b/arch/parisc/include/uapi/asm/socket.h
@@ -127,6 +127,8 @@
#define SO_TXREHASH 0x4048
+#define SO_RCVMARK 0x4049
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h
index 666f81e617ea..ff08038fc2b2 100644
--- a/arch/sparc/include/uapi/asm/socket.h
+++ b/arch/sparc/include/uapi/asm/socket.h
@@ -128,6 +128,8 @@
#define SO_TXREHASH 0x0053
+#define SO_RCVMARK 0x0054
+
#if !defined(__KERNEL__)
diff --git a/include/net/sock.h b/include/net/sock.h
index a01d6c421aa2..30e7cbad194c 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -895,6 +895,7 @@ enum sock_flags {
SOCK_TXTIME,
SOCK_XDP, /* XDP is attached */
SOCK_TSTAMP_NEW, /* Indicates 64 bit timestamps always */
+ SOCK_RCVMARK, /* Receive SO_MARK ancillary data with packet */
};
#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
@@ -2649,20 +2650,21 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
__sock_recv_wifi_status(msg, sk, skb);
}
-void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb);
+void __sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb);
#define SK_DEFAULT_STAMP (-1L * NSEC_PER_SEC)
-static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb)
+static inline void sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb)
{
-#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \
- (1UL << SOCK_RCVTSTAMP))
+#define FLAGS_RECV_CMSGS ((1UL << SOCK_RXQ_OVFL) | \
+ (1UL << SOCK_RCVTSTAMP) | \
+ (1UL << SOCK_RCVMARK))
#define TSFLAGS_ANY (SOF_TIMESTAMPING_SOFTWARE | \
SOF_TIMESTAMPING_RAW_HARDWARE)
- if (sk->sk_flags & FLAGS_TS_OR_DROPS || sk->sk_tsflags & TSFLAGS_ANY)
- __sock_recv_ts_and_drops(msg, sk, skb);
+ if (sk->sk_flags & FLAGS_RECV_CMSGS || sk->sk_tsflags & TSFLAGS_ANY)
+ __sock_recv_cmsgs(msg, sk, skb);
else if (unlikely(sock_flag(sk, SOCK_TIMESTAMP)))
sock_write_timestamp(sk, skb->tstamp);
else if (unlikely(sk->sk_stamp == SK_DEFAULT_STAMP))
diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h
index 467ca2f28760..638230899e98 100644
--- a/include/uapi/asm-generic/socket.h
+++ b/include/uapi/asm-generic/socket.h
@@ -130,6 +130,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
diff --git a/net/atm/common.c b/net/atm/common.c
index d0c8ab7ff8f6..f7019df41c3e 100644
--- a/net/atm/common.c
+++ b/net/atm/common.c
@@ -553,7 +553,7 @@ int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
error = skb_copy_datagram_msg(skb, 0, msg, copied);
if (error)
return error;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (!(flags & MSG_PEEK)) {
pr_debug("%d -= %d\n", atomic_read(&sk->sk_rmem_alloc),
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
index 62705734343b..b506409bb498 100644
--- a/net/bluetooth/af_bluetooth.c
+++ b/net/bluetooth/af_bluetooth.c
@@ -280,7 +280,7 @@ int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
skb_reset_transport_header(skb);
err = skb_copy_datagram_msg(skb, 0, msg, copied);
if (err == 0) {
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name && bt_sk(sk)->skb_msg_name)
bt_sk(sk)->skb_msg_name(skb, msg->msg_name,
@@ -384,7 +384,7 @@ int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
copied += chunk;
size -= chunk;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (!(flags & MSG_PEEK)) {
int skb_len = skb_headlen(skb);
diff --git a/net/can/bcm.c b/net/can/bcm.c
index 64c07e650bb4..65ee1b784a30 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -1647,7 +1647,7 @@ static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
return err;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
__sockaddr_check_size(BCM_MIN_NAMELEN);
diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c
index 0bb4fd3f6264..f5ecfdcf57b2 100644
--- a/net/can/j1939/socket.c
+++ b/net/can/j1939/socket.c
@@ -841,7 +841,7 @@ static int j1939_sk_recvmsg(struct socket *sock, struct msghdr *msg,
paddr->can_addr.j1939.pgn = skcb->addr.pgn;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
msg->msg_flags |= skcb->msg_flags;
skb_free_datagram(sk, skb);
diff --git a/net/can/raw.c b/net/can/raw.c
index 0cf728dcff36..b7dbb57557f3 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c
@@ -866,7 +866,7 @@ static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
return err;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
__sockaddr_check_size(RAW_MIN_NAMELEN);
diff --git a/net/core/sock.c b/net/core/sock.c
index 29abec3eabd8..673b6e49f109 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1311,6 +1311,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
__sock_set_mark(sk, val);
break;
+ case SO_RCVMARK:
+ sock_valbool_flag(sk, SOCK_RCVMARK, valbool);
+ break;
case SO_RXQ_OVFL:
sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool);
@@ -1737,6 +1740,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
v.val = sk->sk_mark;
break;
+ case SO_RCVMARK:
+ v.val = sock_flag(sk, SOCK_RCVMARK);
+ break;
+
case SO_RXQ_OVFL:
v.val = sock_flag(sk, SOCK_RXQ_OVFL);
break;
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c
index f24852814fa3..718fb77bb372 100644
--- a/net/ieee802154/socket.c
+++ b/net/ieee802154/socket.c
@@ -328,7 +328,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (flags & MSG_TRUNC)
copied = skb->len;
@@ -718,7 +718,7 @@ static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (saddr) {
/* Clear the implicit padding in struct sockaddr_ieee802154
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 4056b0da85ea..bbd717805b10 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -783,7 +783,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (sin) {
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index aa8545ca6964..9d5071c79c95 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1909,7 +1909,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
UDP_INC_STATS(sock_net(sk),
UDP_MIB_INDATAGRAMS, is_udplite);
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (sin) {
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 0d7c13d33d1a..3b7cbd522b54 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -512,7 +512,7 @@ static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
*addr_len = sizeof(*sin6);
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (np->rxopt.all)
ip6_datagram_recv_ctl(sk, msg, skb);
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 688af6f809fe..3fc97d4621ac 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -391,7 +391,7 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (!peeking)
SNMP_INC_STATS(mib, UDP_MIB_INDATAGRAMS);
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (msg->msg_name) {
diff --git a/net/key/af_key.c b/net/key/af_key.c
index d09ec26b1081..175a162eec58 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -3711,7 +3711,7 @@ static int pfkey_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (err)
goto out_free;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
err = (flags & MSG_TRUNC) ? skb->len : copied;
diff --git a/net/mctp/af_mctp.c b/net/mctp/af_mctp.c
index 221863afc4b1..c2fc2a7b2528 100644
--- a/net/mctp/af_mctp.c
+++ b/net/mctp/af_mctp.c
@@ -238,7 +238,7 @@ static int mctp_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (rc < 0)
goto out_free;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (addr) {
struct mctp_skb_cb *cb = mctp_cb(skb);
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index fd31334cf688..677f9cfa9660 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -3477,7 +3477,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
sll->sll_protocol = skb->protocol;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
const size_t max_len = min(sizeof(skb->cb),
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 3e3fe923bed5..6d37d2dfb3da 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -2128,7 +2128,7 @@ static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
head_skb = event->chunk->head_skb;
else
head_skb = skb;
- sock_recv_ts_and_drops(msg, sk, head_skb);
+ sock_recv_cmsgs(msg, sk, head_skb);
if (sctp_ulpevent_is_notification(event)) {
msg->msg_flags |= MSG_NOTIFICATION;
sp->pf->event_msgname(event, msg->msg_name, addr_len);
diff --git a/net/socket.c b/net/socket.c
index 6887840682bb..f0c39c874665 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -930,13 +930,22 @@ static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
sizeof(__u32), &SOCK_SKB_CB(skb)->dropcount);
}
-void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb)
+static void sock_recv_mark(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb)
+{
+ if (sock_flag(sk, SOCK_RCVMARK) && skb)
+ put_cmsg(msg, SOL_SOCKET, SO_MARK, sizeof(__u32),
+ &skb->mark);
+}
+
+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);
}
-EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
+EXPORT_SYMBOL_GPL(__sock_recv_cmsgs);
INDIRECT_CALLABLE_DECLARE(int inet_recvmsg(struct socket *, struct msghdr *,
size_t, int));
diff --git a/tools/include/uapi/asm-generic/socket.h b/tools/include/uapi/asm-generic/socket.h
index 77f7c1638eb1..8756df13be50 100644
--- a/tools/include/uapi/asm-generic/socket.h
+++ b/tools/include/uapi/asm-generic/socket.h
@@ -119,6 +119,8 @@
#define SO_DETACH_REUSEPORT_BPF 68
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
--
2.20.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH net-next] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg().
2022-04-26 17:38 [PATCH net-next] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg() Erin MacNeil
2022-04-27 1:43 ` kernel test robot
@ 2022-04-27 3:25 ` kernel test robot
1 sibling, 0 replies; 19+ messages in thread
From: kernel test robot @ 2022-04-27 3:25 UTC (permalink / raw)
To: Erin MacNeil, netdev; +Cc: llvm, kbuild-all, Erin MacNeil
Hi Erin,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on net-next/master]
url: https://github.com/intel-lab-lkp/linux/commits/Erin-MacNeil/net-Add-SO_RCVMARK-socket-option-to-provide-SO_MARK-with-recvmsg/20220427-014257
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 561215482cc69d1c758944d4463b3d5d96d37bd1
config: mips-malta_kvm_defconfig (https://download.01.org/0day-ci/archive/20220427/202204271132.O9UPUBp2-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 1cddcfdc3c683b393df1a5c9063252eb60e52818)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install mips cross compiling tool for clang build
# apt-get install binutils-mips-linux-gnu
# https://github.com/intel-lab-lkp/linux/commit/ba0c57c49e3f18b23fe626dd2e603cf4ed91ebf7
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Erin-MacNeil/net-Add-SO_RCVMARK-socket-option-to-provide-SO_MARK-with-recvmsg/20220427-014257
git checkout ba0c57c49e3f18b23fe626dd2e603cf4ed91ebf7
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=mips SHELL=/bin/bash net/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> net/core/sock.c:1314:7: error: use of undeclared identifier 'SO_RCVMARK'; did you mean 'SOCK_RCVMARK'?
case SO_RCVMARK:
^~~~~~~~~~
SOCK_RCVMARK
include/net/sock.h:898:2: note: 'SOCK_RCVMARK' declared here
SOCK_RCVMARK, /* Receive SO_MARK ancillary data with packet */
^
>> net/core/sock.c:1314:7: error: duplicate case value: '27' and 'SOCK_RCVMARK' both equal '27'
case SO_RCVMARK:
^
net/core/sock.c:1288:7: note: previous case defined here
case SO_DETACH_FILTER:
^
arch/mips/include/uapi/asm/socket.h:65:26: note: expanded from macro 'SO_DETACH_FILTER'
#define SO_DETACH_FILTER 27
^
net/core/sock.c:1743:7: error: use of undeclared identifier 'SO_RCVMARK'; did you mean 'SOCK_RCVMARK'?
case SO_RCVMARK:
^~~~~~~~~~
SOCK_RCVMARK
include/net/sock.h:898:2: note: 'SOCK_RCVMARK' declared here
SOCK_RCVMARK, /* Receive SO_MARK ancillary data with packet */
^
3 errors generated.
vim +1314 net/core/sock.c
1031
1032 /*
1033 * This is meant for all protocols to use and covers goings on
1034 * at the socket level. Everything here is generic.
1035 */
1036
1037 int sock_setsockopt(struct socket *sock, int level, int optname,
1038 sockptr_t optval, unsigned int optlen)
1039 {
1040 struct so_timestamping timestamping;
1041 struct sock_txtime sk_txtime;
1042 struct sock *sk = sock->sk;
1043 int val;
1044 int valbool;
1045 struct linger ling;
1046 int ret = 0;
1047
1048 /*
1049 * Options without arguments
1050 */
1051
1052 if (optname == SO_BINDTODEVICE)
1053 return sock_setbindtodevice(sk, optval, optlen);
1054
1055 if (optlen < sizeof(int))
1056 return -EINVAL;
1057
1058 if (copy_from_sockptr(&val, optval, sizeof(val)))
1059 return -EFAULT;
1060
1061 valbool = val ? 1 : 0;
1062
1063 lock_sock(sk);
1064
1065 switch (optname) {
1066 case SO_DEBUG:
1067 if (val && !capable(CAP_NET_ADMIN))
1068 ret = -EACCES;
1069 else
1070 sock_valbool_flag(sk, SOCK_DBG, valbool);
1071 break;
1072 case SO_REUSEADDR:
1073 sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE);
1074 break;
1075 case SO_REUSEPORT:
1076 sk->sk_reuseport = valbool;
1077 break;
1078 case SO_TYPE:
1079 case SO_PROTOCOL:
1080 case SO_DOMAIN:
1081 case SO_ERROR:
1082 ret = -ENOPROTOOPT;
1083 break;
1084 case SO_DONTROUTE:
1085 sock_valbool_flag(sk, SOCK_LOCALROUTE, valbool);
1086 sk_dst_reset(sk);
1087 break;
1088 case SO_BROADCAST:
1089 sock_valbool_flag(sk, SOCK_BROADCAST, valbool);
1090 break;
1091 case SO_SNDBUF:
1092 /* Don't error on this BSD doesn't and if you think
1093 * about it this is right. Otherwise apps have to
1094 * play 'guess the biggest size' games. RCVBUF/SNDBUF
1095 * are treated in BSD as hints
1096 */
1097 val = min_t(u32, val, sysctl_wmem_max);
1098 set_sndbuf:
1099 /* Ensure val * 2 fits into an int, to prevent max_t()
1100 * from treating it as a negative value.
1101 */
1102 val = min_t(int, val, INT_MAX / 2);
1103 sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
1104 WRITE_ONCE(sk->sk_sndbuf,
1105 max_t(int, val * 2, SOCK_MIN_SNDBUF));
1106 /* Wake up sending tasks if we upped the value. */
1107 sk->sk_write_space(sk);
1108 break;
1109
1110 case SO_SNDBUFFORCE:
1111 if (!capable(CAP_NET_ADMIN)) {
1112 ret = -EPERM;
1113 break;
1114 }
1115
1116 /* No negative values (to prevent underflow, as val will be
1117 * multiplied by 2).
1118 */
1119 if (val < 0)
1120 val = 0;
1121 goto set_sndbuf;
1122
1123 case SO_RCVBUF:
1124 /* Don't error on this BSD doesn't and if you think
1125 * about it this is right. Otherwise apps have to
1126 * play 'guess the biggest size' games. RCVBUF/SNDBUF
1127 * are treated in BSD as hints
1128 */
1129 __sock_set_rcvbuf(sk, min_t(u32, val, sysctl_rmem_max));
1130 break;
1131
1132 case SO_RCVBUFFORCE:
1133 if (!capable(CAP_NET_ADMIN)) {
1134 ret = -EPERM;
1135 break;
1136 }
1137
1138 /* No negative values (to prevent underflow, as val will be
1139 * multiplied by 2).
1140 */
1141 __sock_set_rcvbuf(sk, max(val, 0));
1142 break;
1143
1144 case SO_KEEPALIVE:
1145 if (sk->sk_prot->keepalive)
1146 sk->sk_prot->keepalive(sk, valbool);
1147 sock_valbool_flag(sk, SOCK_KEEPOPEN, valbool);
1148 break;
1149
1150 case SO_OOBINLINE:
1151 sock_valbool_flag(sk, SOCK_URGINLINE, valbool);
1152 break;
1153
1154 case SO_NO_CHECK:
1155 sk->sk_no_check_tx = valbool;
1156 break;
1157
1158 case SO_PRIORITY:
1159 if ((val >= 0 && val <= 6) ||
1160 ns_capable(sock_net(sk)->user_ns, CAP_NET_RAW) ||
1161 ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))
1162 sk->sk_priority = val;
1163 else
1164 ret = -EPERM;
1165 break;
1166
1167 case SO_LINGER:
1168 if (optlen < sizeof(ling)) {
1169 ret = -EINVAL; /* 1003.1g */
1170 break;
1171 }
1172 if (copy_from_sockptr(&ling, optval, sizeof(ling))) {
1173 ret = -EFAULT;
1174 break;
1175 }
1176 if (!ling.l_onoff)
1177 sock_reset_flag(sk, SOCK_LINGER);
1178 else {
1179 #if (BITS_PER_LONG == 32)
1180 if ((unsigned int)ling.l_linger >= MAX_SCHEDULE_TIMEOUT/HZ)
1181 sk->sk_lingertime = MAX_SCHEDULE_TIMEOUT;
1182 else
1183 #endif
1184 sk->sk_lingertime = (unsigned int)ling.l_linger * HZ;
1185 sock_set_flag(sk, SOCK_LINGER);
1186 }
1187 break;
1188
1189 case SO_BSDCOMPAT:
1190 break;
1191
1192 case SO_PASSCRED:
1193 if (valbool)
1194 set_bit(SOCK_PASSCRED, &sock->flags);
1195 else
1196 clear_bit(SOCK_PASSCRED, &sock->flags);
1197 break;
1198
1199 case SO_TIMESTAMP_OLD:
1200 case SO_TIMESTAMP_NEW:
1201 case SO_TIMESTAMPNS_OLD:
1202 case SO_TIMESTAMPNS_NEW:
1203 sock_set_timestamp(sk, optname, valbool);
1204 break;
1205
1206 case SO_TIMESTAMPING_NEW:
1207 case SO_TIMESTAMPING_OLD:
1208 if (optlen == sizeof(timestamping)) {
1209 if (copy_from_sockptr(×tamping, optval,
1210 sizeof(timestamping))) {
1211 ret = -EFAULT;
1212 break;
1213 }
1214 } else {
1215 memset(×tamping, 0, sizeof(timestamping));
1216 timestamping.flags = val;
1217 }
1218 ret = sock_set_timestamping(sk, optname, timestamping);
1219 break;
1220
1221 case SO_RCVLOWAT:
1222 if (val < 0)
1223 val = INT_MAX;
1224 if (sock->ops->set_rcvlowat)
1225 ret = sock->ops->set_rcvlowat(sk, val);
1226 else
1227 WRITE_ONCE(sk->sk_rcvlowat, val ? : 1);
1228 break;
1229
1230 case SO_RCVTIMEO_OLD:
1231 case SO_RCVTIMEO_NEW:
1232 ret = sock_set_timeout(&sk->sk_rcvtimeo, optval,
1233 optlen, optname == SO_RCVTIMEO_OLD);
1234 break;
1235
1236 case SO_SNDTIMEO_OLD:
1237 case SO_SNDTIMEO_NEW:
1238 ret = sock_set_timeout(&sk->sk_sndtimeo, optval,
1239 optlen, optname == SO_SNDTIMEO_OLD);
1240 break;
1241
1242 case SO_ATTACH_FILTER: {
1243 struct sock_fprog fprog;
1244
1245 ret = copy_bpf_fprog_from_user(&fprog, optval, optlen);
1246 if (!ret)
1247 ret = sk_attach_filter(&fprog, sk);
1248 break;
1249 }
1250 case SO_ATTACH_BPF:
1251 ret = -EINVAL;
1252 if (optlen == sizeof(u32)) {
1253 u32 ufd;
1254
1255 ret = -EFAULT;
1256 if (copy_from_sockptr(&ufd, optval, sizeof(ufd)))
1257 break;
1258
1259 ret = sk_attach_bpf(ufd, sk);
1260 }
1261 break;
1262
1263 case SO_ATTACH_REUSEPORT_CBPF: {
1264 struct sock_fprog fprog;
1265
1266 ret = copy_bpf_fprog_from_user(&fprog, optval, optlen);
1267 if (!ret)
1268 ret = sk_reuseport_attach_filter(&fprog, sk);
1269 break;
1270 }
1271 case SO_ATTACH_REUSEPORT_EBPF:
1272 ret = -EINVAL;
1273 if (optlen == sizeof(u32)) {
1274 u32 ufd;
1275
1276 ret = -EFAULT;
1277 if (copy_from_sockptr(&ufd, optval, sizeof(ufd)))
1278 break;
1279
1280 ret = sk_reuseport_attach_bpf(ufd, sk);
1281 }
1282 break;
1283
1284 case SO_DETACH_REUSEPORT_BPF:
1285 ret = reuseport_detach_prog(sk);
1286 break;
1287
1288 case SO_DETACH_FILTER:
1289 ret = sk_detach_filter(sk);
1290 break;
1291
1292 case SO_LOCK_FILTER:
1293 if (sock_flag(sk, SOCK_FILTER_LOCKED) && !valbool)
1294 ret = -EPERM;
1295 else
1296 sock_valbool_flag(sk, SOCK_FILTER_LOCKED, valbool);
1297 break;
1298
1299 case SO_PASSSEC:
1300 if (valbool)
1301 set_bit(SOCK_PASSSEC, &sock->flags);
1302 else
1303 clear_bit(SOCK_PASSSEC, &sock->flags);
1304 break;
1305 case SO_MARK:
1306 if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_RAW) &&
1307 !ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) {
1308 ret = -EPERM;
1309 break;
1310 }
1311
1312 __sock_set_mark(sk, val);
1313 break;
> 1314 case SO_RCVMARK:
1315 sock_valbool_flag(sk, SOCK_RCVMARK, valbool);
1316 break;
1317
1318 case SO_RXQ_OVFL:
1319 sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool);
1320 break;
1321
1322 case SO_WIFI_STATUS:
1323 sock_valbool_flag(sk, SOCK_WIFI_STATUS, valbool);
1324 break;
1325
1326 case SO_PEEK_OFF:
1327 if (sock->ops->set_peek_off)
1328 ret = sock->ops->set_peek_off(sk, val);
1329 else
1330 ret = -EOPNOTSUPP;
1331 break;
1332
1333 case SO_NOFCS:
1334 sock_valbool_flag(sk, SOCK_NOFCS, valbool);
1335 break;
1336
1337 case SO_SELECT_ERR_QUEUE:
1338 sock_valbool_flag(sk, SOCK_SELECT_ERR_QUEUE, valbool);
1339 break;
1340
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 19+ messages in thread
* RE: [net-next,v2] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg().
2022-04-27 3:21 ` Erin MacNeil
(?)
@ 2022-04-27 4:37 ` bluez.test.bot
-1 siblings, 0 replies; 19+ messages in thread
From: bluez.test.bot @ 2022-04-27 4:37 UTC (permalink / raw)
To: linux-bluetooth, lnx.erin
[-- Attachment #1: Type: text/plain, Size: 1706 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=636000
---Test result---
Test Summary:
CheckPatch PASS 5.26 seconds
GitLint FAIL 1.08 seconds
SubjectPrefix FAIL 0.96 seconds
BuildKernel PASS 33.03 seconds
BuildKernel32 PASS 29.22 seconds
Incremental Build with patchesPASS 39.41 seconds
TestRunner: Setup PASS 495.09 seconds
TestRunner: l2cap-tester PASS 18.12 seconds
TestRunner: bnep-tester PASS 6.47 seconds
TestRunner: mgmt-tester PASS 105.38 seconds
TestRunner: rfcomm-tester PASS 10.06 seconds
TestRunner: sco-tester PASS 9.79 seconds
TestRunner: smp-tester PASS 9.70 seconds
TestRunner: userchan-tester PASS 6.66 seconds
Details
##############################
Test: GitLint - FAIL - 1.08 seconds
Run gitlint with rule in .gitlint
[net-next,v2] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg().
1: T1 Title exceeds max length (82>80): "[net-next,v2] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg()."
1: T3 Title has trailing punctuation (.): "[net-next,v2] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg()."
##############################
Test: SubjectPrefix - FAIL - 0.96 seconds
Check subject contains "Bluetooth" prefix
"Bluetooth: " is not specified in the subject
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
2022-04-27 1:43 ` kernel test robot
@ 2022-04-27 20:02 ` Erin MacNeil
2022-04-27 20:02 ` Erin MacNeil
1 sibling, 0 replies; 19+ messages in thread
From: Erin MacNeil @ 2022-04-27 20:02 UTC (permalink / raw)
To: lnx.erin
Cc: Richard Henderson, Ivan Kokshaysky, Matt Turner,
Thomas Bogendoerfer, James E.J. Bottomley, Helge Deller,
David S. Miller, Jakub Kicinski, Paolo Abeni, Arnd Bergmann,
Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
Oliver Hartkopp, Marc Kleine-Budde, Robin van der Gracht,
Oleksij Rempel, kernel, Alexander Aring, Stefan Schmidt,
Hideaki YOSHIFUJI, David Ahern, Steffen Klassert, Herbert Xu,
Jeremy Kerr, Matt Johnston, Vlad Yasevich, Neil Horman,
Marcelo Ricardo Leitner, Eric Dumazet, Lorenz Bauer,
Pavel Tikhomirov, Martynas Pumputis, Akhmat Karakotov,
Stephen Rothwell, Wei Wang, Yangbo Lu, Florian Westphal,
Thomas Gleixner, Richard Palethorpe, Willem de Bruijn,
Hangbin Liu, Pablo Neira Ayuso, Richard Sanger, Yajun Deng,
Jiapeng Chong, linux-alpha, linux-kernel, linux-mips,
linux-parisc, sparclinux, netdev, linux-arch, linux-bluetooth,
linux-can, linux-wpan, linux-sctp
Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
should be included in the ancillary data returned by recvmsg().
Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
---
arch/alpha/include/uapi/asm/socket.h | 2 ++
arch/mips/include/uapi/asm/socket.h | 2 ++
arch/parisc/include/uapi/asm/socket.h | 2 ++
arch/sparc/include/uapi/asm/socket.h | 1 +
include/net/sock.h | 18 ++++++++++--------
include/uapi/asm-generic/socket.h | 2 ++
net/atm/common.c | 2 +-
net/bluetooth/af_bluetooth.c | 4 ++--
net/can/bcm.c | 2 +-
net/can/j1939/socket.c | 2 +-
net/can/raw.c | 2 +-
net/core/sock.c | 7 +++++++
net/ieee802154/socket.c | 4 ++--
net/ipv4/raw.c | 2 +-
net/ipv4/udp.c | 2 +-
net/ipv6/raw.c | 2 +-
net/ipv6/udp.c | 2 +-
net/key/af_key.c | 2 +-
net/mctp/af_mctp.c | 2 +-
net/packet/af_packet.c | 2 +-
net/sctp/socket.c | 2 +-
net/socket.c | 15 ++++++++++++---
tools/include/uapi/asm-generic/socket.h | 2 ++
23 files changed, 56 insertions(+), 27 deletions(-)
diff --git a/arch/alpha/include/uapi/asm/socket.h b/arch/alpha/include/uapi/asm/socket.h
index 7d81535893af..739891b94136 100644
--- a/arch/alpha/include/uapi/asm/socket.h
+++ b/arch/alpha/include/uapi/asm/socket.h
@@ -135,6 +135,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/mips/include/uapi/asm/socket.h b/arch/mips/include/uapi/asm/socket.h
index 1d55e57b8466..18f3d95ecfec 100644
--- a/arch/mips/include/uapi/asm/socket.h
+++ b/arch/mips/include/uapi/asm/socket.h
@@ -146,6 +146,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h
index 654061e0964e..f486d3dfb6bb 100644
--- a/arch/parisc/include/uapi/asm/socket.h
+++ b/arch/parisc/include/uapi/asm/socket.h
@@ -127,6 +127,8 @@
#define SO_TXREHASH 0x4048
+#define SO_RCVMARK 0x4049
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h
index 666f81e617ea..2fda57a3ea86 100644
--- a/arch/sparc/include/uapi/asm/socket.h
+++ b/arch/sparc/include/uapi/asm/socket.h
@@ -128,6 +128,7 @@
#define SO_TXREHASH 0x0053
+#define SO_RCVMARK 0x0054
#if !defined(__KERNEL__)
diff --git a/include/net/sock.h b/include/net/sock.h
index a01d6c421aa2..30e7cbad194c 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -895,6 +895,7 @@ enum sock_flags {
SOCK_TXTIME,
SOCK_XDP, /* XDP is attached */
SOCK_TSTAMP_NEW, /* Indicates 64 bit timestamps always */
+ SOCK_RCVMARK, /* Receive SO_MARK ancillary data with packet */
};
#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
@@ -2649,20 +2650,21 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
__sock_recv_wifi_status(msg, sk, skb);
}
-void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb);
+void __sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb);
#define SK_DEFAULT_STAMP (-1L * NSEC_PER_SEC)
-static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb)
+static inline void sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb)
{
-#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \
- (1UL << SOCK_RCVTSTAMP))
+#define FLAGS_RECV_CMSGS ((1UL << SOCK_RXQ_OVFL) | \
+ (1UL << SOCK_RCVTSTAMP) | \
+ (1UL << SOCK_RCVMARK))
#define TSFLAGS_ANY (SOF_TIMESTAMPING_SOFTWARE | \
SOF_TIMESTAMPING_RAW_HARDWARE)
- if (sk->sk_flags & FLAGS_TS_OR_DROPS || sk->sk_tsflags & TSFLAGS_ANY)
- __sock_recv_ts_and_drops(msg, sk, skb);
+ if (sk->sk_flags & FLAGS_RECV_CMSGS || sk->sk_tsflags & TSFLAGS_ANY)
+ __sock_recv_cmsgs(msg, sk, skb);
else if (unlikely(sock_flag(sk, SOCK_TIMESTAMP)))
sock_write_timestamp(sk, skb->tstamp);
else if (unlikely(sk->sk_stamp == SK_DEFAULT_STAMP))
diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h
index 467ca2f28760..638230899e98 100644
--- a/include/uapi/asm-generic/socket.h
+++ b/include/uapi/asm-generic/socket.h
@@ -130,6 +130,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
diff --git a/net/atm/common.c b/net/atm/common.c
index d0c8ab7ff8f6..f7019df41c3e 100644
--- a/net/atm/common.c
+++ b/net/atm/common.c
@@ -553,7 +553,7 @@ int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
error = skb_copy_datagram_msg(skb, 0, msg, copied);
if (error)
return error;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (!(flags & MSG_PEEK)) {
pr_debug("%d -= %d\n", atomic_read(&sk->sk_rmem_alloc),
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
index 62705734343b..b506409bb498 100644
--- a/net/bluetooth/af_bluetooth.c
+++ b/net/bluetooth/af_bluetooth.c
@@ -280,7 +280,7 @@ int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
skb_reset_transport_header(skb);
err = skb_copy_datagram_msg(skb, 0, msg, copied);
if (err == 0) {
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name && bt_sk(sk)->skb_msg_name)
bt_sk(sk)->skb_msg_name(skb, msg->msg_name,
@@ -384,7 +384,7 @@ int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
copied += chunk;
size -= chunk;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (!(flags & MSG_PEEK)) {
int skb_len = skb_headlen(skb);
diff --git a/net/can/bcm.c b/net/can/bcm.c
index 64c07e650bb4..65ee1b784a30 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -1647,7 +1647,7 @@ static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
return err;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
__sockaddr_check_size(BCM_MIN_NAMELEN);
diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c
index 0bb4fd3f6264..f5ecfdcf57b2 100644
--- a/net/can/j1939/socket.c
+++ b/net/can/j1939/socket.c
@@ -841,7 +841,7 @@ static int j1939_sk_recvmsg(struct socket *sock, struct msghdr *msg,
paddr->can_addr.j1939.pgn = skcb->addr.pgn;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
msg->msg_flags |= skcb->msg_flags;
skb_free_datagram(sk, skb);
diff --git a/net/can/raw.c b/net/can/raw.c
index 0cf728dcff36..b7dbb57557f3 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c
@@ -866,7 +866,7 @@ static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
return err;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
__sockaddr_check_size(RAW_MIN_NAMELEN);
diff --git a/net/core/sock.c b/net/core/sock.c
index 29abec3eabd8..673b6e49f109 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1311,6 +1311,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
__sock_set_mark(sk, val);
break;
+ case SO_RCVMARK:
+ sock_valbool_flag(sk, SOCK_RCVMARK, valbool);
+ break;
case SO_RXQ_OVFL:
sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool);
@@ -1737,6 +1740,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
v.val = sk->sk_mark;
break;
+ case SO_RCVMARK:
+ v.val = sock_flag(sk, SOCK_RCVMARK);
+ break;
+
case SO_RXQ_OVFL:
v.val = sock_flag(sk, SOCK_RXQ_OVFL);
break;
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c
index f24852814fa3..718fb77bb372 100644
--- a/net/ieee802154/socket.c
+++ b/net/ieee802154/socket.c
@@ -328,7 +328,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (flags & MSG_TRUNC)
copied = skb->len;
@@ -718,7 +718,7 @@ static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (saddr) {
/* Clear the implicit padding in struct sockaddr_ieee802154
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 4056b0da85ea..bbd717805b10 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -783,7 +783,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (sin) {
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index aa8545ca6964..9d5071c79c95 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1909,7 +1909,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
UDP_INC_STATS(sock_net(sk),
UDP_MIB_INDATAGRAMS, is_udplite);
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (sin) {
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 0d7c13d33d1a..3b7cbd522b54 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -512,7 +512,7 @@ static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
*addr_len = sizeof(*sin6);
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (np->rxopt.all)
ip6_datagram_recv_ctl(sk, msg, skb);
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 688af6f809fe..3fc97d4621ac 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -391,7 +391,7 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (!peeking)
SNMP_INC_STATS(mib, UDP_MIB_INDATAGRAMS);
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (msg->msg_name) {
diff --git a/net/key/af_key.c b/net/key/af_key.c
index d09ec26b1081..175a162eec58 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -3711,7 +3711,7 @@ static int pfkey_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (err)
goto out_free;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
err = (flags & MSG_TRUNC) ? skb->len : copied;
diff --git a/net/mctp/af_mctp.c b/net/mctp/af_mctp.c
index 221863afc4b1..c2fc2a7b2528 100644
--- a/net/mctp/af_mctp.c
+++ b/net/mctp/af_mctp.c
@@ -238,7 +238,7 @@ static int mctp_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (rc < 0)
goto out_free;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (addr) {
struct mctp_skb_cb *cb = mctp_cb(skb);
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index fd31334cf688..677f9cfa9660 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -3477,7 +3477,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
sll->sll_protocol = skb->protocol;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
const size_t max_len = min(sizeof(skb->cb),
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 3e3fe923bed5..6d37d2dfb3da 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -2128,7 +2128,7 @@ static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
head_skb = event->chunk->head_skb;
else
head_skb = skb;
- sock_recv_ts_and_drops(msg, sk, head_skb);
+ sock_recv_cmsgs(msg, sk, head_skb);
if (sctp_ulpevent_is_notification(event)) {
msg->msg_flags |= MSG_NOTIFICATION;
sp->pf->event_msgname(event, msg->msg_name, addr_len);
diff --git a/net/socket.c b/net/socket.c
index 6887840682bb..f0c39c874665 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -930,13 +930,22 @@ static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
sizeof(__u32), &SOCK_SKB_CB(skb)->dropcount);
}
-void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb)
+static void sock_recv_mark(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb)
+{
+ if (sock_flag(sk, SOCK_RCVMARK) && skb)
+ put_cmsg(msg, SOL_SOCKET, SO_MARK, sizeof(__u32),
+ &skb->mark);
+}
+
+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);
}
-EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
+EXPORT_SYMBOL_GPL(__sock_recv_cmsgs);
INDIRECT_CALLABLE_DECLARE(int inet_recvmsg(struct socket *, struct msghdr *,
size_t, int));
diff --git a/tools/include/uapi/asm-generic/socket.h b/tools/include/uapi/asm-generic/socket.h
index 77f7c1638eb1..8756df13be50 100644
--- a/tools/include/uapi/asm-generic/socket.h
+++ b/tools/include/uapi/asm-generic/socket.h
@@ -119,6 +119,8 @@
#define SO_DETACH_REUSEPORT_BPF 68
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
--
2.20.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
@ 2022-04-27 20:02 ` Erin MacNeil
0 siblings, 0 replies; 19+ messages in thread
From: Erin MacNeil @ 2022-04-27 20:02 UTC (permalink / raw)
To: lnx.erin
Cc: Richard Henderson, Ivan Kokshaysky, Matt Turner,
Thomas Bogendoerfer, James E.J. Bottomley, Helge Deller,
David S. Miller, Jakub Kicinski, Paolo Abeni, Arnd Bergmann,
Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
Oliver Hartkopp, Marc Kleine-Budde, Robin van der Gracht,
Oleksij Rempel, kernel, Alexander Aring, Stefan
Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
should be included in the ancillary data returned by recvmsg().
Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
---
arch/alpha/include/uapi/asm/socket.h | 2 ++
arch/mips/include/uapi/asm/socket.h | 2 ++
arch/parisc/include/uapi/asm/socket.h | 2 ++
arch/sparc/include/uapi/asm/socket.h | 1 +
include/net/sock.h | 18 ++++++++++--------
include/uapi/asm-generic/socket.h | 2 ++
net/atm/common.c | 2 +-
net/bluetooth/af_bluetooth.c | 4 ++--
net/can/bcm.c | 2 +-
net/can/j1939/socket.c | 2 +-
net/can/raw.c | 2 +-
net/core/sock.c | 7 +++++++
net/ieee802154/socket.c | 4 ++--
net/ipv4/raw.c | 2 +-
net/ipv4/udp.c | 2 +-
net/ipv6/raw.c | 2 +-
net/ipv6/udp.c | 2 +-
net/key/af_key.c | 2 +-
net/mctp/af_mctp.c | 2 +-
net/packet/af_packet.c | 2 +-
net/sctp/socket.c | 2 +-
net/socket.c | 15 ++++++++++++---
tools/include/uapi/asm-generic/socket.h | 2 ++
23 files changed, 56 insertions(+), 27 deletions(-)
diff --git a/arch/alpha/include/uapi/asm/socket.h b/arch/alpha/include/uapi/asm/socket.h
index 7d81535893af..739891b94136 100644
--- a/arch/alpha/include/uapi/asm/socket.h
+++ b/arch/alpha/include/uapi/asm/socket.h
@@ -135,6 +135,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/mips/include/uapi/asm/socket.h b/arch/mips/include/uapi/asm/socket.h
index 1d55e57b8466..18f3d95ecfec 100644
--- a/arch/mips/include/uapi/asm/socket.h
+++ b/arch/mips/include/uapi/asm/socket.h
@@ -146,6 +146,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h
index 654061e0964e..f486d3dfb6bb 100644
--- a/arch/parisc/include/uapi/asm/socket.h
+++ b/arch/parisc/include/uapi/asm/socket.h
@@ -127,6 +127,8 @@
#define SO_TXREHASH 0x4048
+#define SO_RCVMARK 0x4049
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64
diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h
index 666f81e617ea..2fda57a3ea86 100644
--- a/arch/sparc/include/uapi/asm/socket.h
+++ b/arch/sparc/include/uapi/asm/socket.h
@@ -128,6 +128,7 @@
#define SO_TXREHASH 0x0053
+#define SO_RCVMARK 0x0054
#if !defined(__KERNEL__)
diff --git a/include/net/sock.h b/include/net/sock.h
index a01d6c421aa2..30e7cbad194c 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -895,6 +895,7 @@ enum sock_flags {
SOCK_TXTIME,
SOCK_XDP, /* XDP is attached */
SOCK_TSTAMP_NEW, /* Indicates 64 bit timestamps always */
+ SOCK_RCVMARK, /* Receive SO_MARK ancillary data with packet */
};
#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
@@ -2649,20 +2650,21 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
__sock_recv_wifi_status(msg, sk, skb);
}
-void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb);
+void __sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb);
#define SK_DEFAULT_STAMP (-1L * NSEC_PER_SEC)
-static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb)
+static inline void sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb)
{
-#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \
- (1UL << SOCK_RCVTSTAMP))
+#define FLAGS_RECV_CMSGS ((1UL << SOCK_RXQ_OVFL) | \
+ (1UL << SOCK_RCVTSTAMP) | \
+ (1UL << SOCK_RCVMARK))
#define TSFLAGS_ANY (SOF_TIMESTAMPING_SOFTWARE | \
SOF_TIMESTAMPING_RAW_HARDWARE)
- if (sk->sk_flags & FLAGS_TS_OR_DROPS || sk->sk_tsflags & TSFLAGS_ANY)
- __sock_recv_ts_and_drops(msg, sk, skb);
+ if (sk->sk_flags & FLAGS_RECV_CMSGS || sk->sk_tsflags & TSFLAGS_ANY)
+ __sock_recv_cmsgs(msg, sk, skb);
else if (unlikely(sock_flag(sk, SOCK_TIMESTAMP)))
sock_write_timestamp(sk, skb->tstamp);
else if (unlikely(sk->sk_stamp == SK_DEFAULT_STAMP))
diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h
index 467ca2f28760..638230899e98 100644
--- a/include/uapi/asm-generic/socket.h
+++ b/include/uapi/asm-generic/socket.h
@@ -130,6 +130,8 @@
#define SO_TXREHASH 74
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
diff --git a/net/atm/common.c b/net/atm/common.c
index d0c8ab7ff8f6..f7019df41c3e 100644
--- a/net/atm/common.c
+++ b/net/atm/common.c
@@ -553,7 +553,7 @@ int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
error = skb_copy_datagram_msg(skb, 0, msg, copied);
if (error)
return error;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (!(flags & MSG_PEEK)) {
pr_debug("%d -= %d\n", atomic_read(&sk->sk_rmem_alloc),
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
index 62705734343b..b506409bb498 100644
--- a/net/bluetooth/af_bluetooth.c
+++ b/net/bluetooth/af_bluetooth.c
@@ -280,7 +280,7 @@ int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
skb_reset_transport_header(skb);
err = skb_copy_datagram_msg(skb, 0, msg, copied);
if (err == 0) {
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name && bt_sk(sk)->skb_msg_name)
bt_sk(sk)->skb_msg_name(skb, msg->msg_name,
@@ -384,7 +384,7 @@ int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
copied += chunk;
size -= chunk;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (!(flags & MSG_PEEK)) {
int skb_len = skb_headlen(skb);
diff --git a/net/can/bcm.c b/net/can/bcm.c
index 64c07e650bb4..65ee1b784a30 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -1647,7 +1647,7 @@ static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
return err;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
__sockaddr_check_size(BCM_MIN_NAMELEN);
diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c
index 0bb4fd3f6264..f5ecfdcf57b2 100644
--- a/net/can/j1939/socket.c
+++ b/net/can/j1939/socket.c
@@ -841,7 +841,7 @@ static int j1939_sk_recvmsg(struct socket *sock, struct msghdr *msg,
paddr->can_addr.j1939.pgn = skcb->addr.pgn;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
msg->msg_flags |= skcb->msg_flags;
skb_free_datagram(sk, skb);
diff --git a/net/can/raw.c b/net/can/raw.c
index 0cf728dcff36..b7dbb57557f3 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c
@@ -866,7 +866,7 @@ static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
return err;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
__sockaddr_check_size(RAW_MIN_NAMELEN);
diff --git a/net/core/sock.c b/net/core/sock.c
index 29abec3eabd8..673b6e49f109 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1311,6 +1311,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
__sock_set_mark(sk, val);
break;
+ case SO_RCVMARK:
+ sock_valbool_flag(sk, SOCK_RCVMARK, valbool);
+ break;
case SO_RXQ_OVFL:
sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool);
@@ -1737,6 +1740,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
v.val = sk->sk_mark;
break;
+ case SO_RCVMARK:
+ v.val = sock_flag(sk, SOCK_RCVMARK);
+ break;
+
case SO_RXQ_OVFL:
v.val = sock_flag(sk, SOCK_RXQ_OVFL);
break;
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c
index f24852814fa3..718fb77bb372 100644
--- a/net/ieee802154/socket.c
+++ b/net/ieee802154/socket.c
@@ -328,7 +328,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (flags & MSG_TRUNC)
copied = skb->len;
@@ -718,7 +718,7 @@ static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (saddr) {
/* Clear the implicit padding in struct sockaddr_ieee802154
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 4056b0da85ea..bbd717805b10 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -783,7 +783,7 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (err)
goto done;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (sin) {
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index aa8545ca6964..9d5071c79c95 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1909,7 +1909,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
UDP_INC_STATS(sock_net(sk),
UDP_MIB_INDATAGRAMS, is_udplite);
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (sin) {
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 0d7c13d33d1a..3b7cbd522b54 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -512,7 +512,7 @@ static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
*addr_len = sizeof(*sin6);
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (np->rxopt.all)
ip6_datagram_recv_ctl(sk, msg, skb);
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 688af6f809fe..3fc97d4621ac 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -391,7 +391,7 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
if (!peeking)
SNMP_INC_STATS(mib, UDP_MIB_INDATAGRAMS);
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
/* Copy the address. */
if (msg->msg_name) {
diff --git a/net/key/af_key.c b/net/key/af_key.c
index d09ec26b1081..175a162eec58 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -3711,7 +3711,7 @@ static int pfkey_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (err)
goto out_free;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
err = (flags & MSG_TRUNC) ? skb->len : copied;
diff --git a/net/mctp/af_mctp.c b/net/mctp/af_mctp.c
index 221863afc4b1..c2fc2a7b2528 100644
--- a/net/mctp/af_mctp.c
+++ b/net/mctp/af_mctp.c
@@ -238,7 +238,7 @@ static int mctp_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (rc < 0)
goto out_free;
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (addr) {
struct mctp_skb_cb *cb = mctp_cb(skb);
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index fd31334cf688..677f9cfa9660 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -3477,7 +3477,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
sll->sll_protocol = skb->protocol;
}
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_cmsgs(msg, sk, skb);
if (msg->msg_name) {
const size_t max_len = min(sizeof(skb->cb),
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 3e3fe923bed5..6d37d2dfb3da 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -2128,7 +2128,7 @@ static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
head_skb = event->chunk->head_skb;
else
head_skb = skb;
- sock_recv_ts_and_drops(msg, sk, head_skb);
+ sock_recv_cmsgs(msg, sk, head_skb);
if (sctp_ulpevent_is_notification(event)) {
msg->msg_flags |= MSG_NOTIFICATION;
sp->pf->event_msgname(event, msg->msg_name, addr_len);
diff --git a/net/socket.c b/net/socket.c
index 6887840682bb..f0c39c874665 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -930,13 +930,22 @@ static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
sizeof(__u32), &SOCK_SKB_CB(skb)->dropcount);
}
-void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
- struct sk_buff *skb)
+static void sock_recv_mark(struct msghdr *msg, struct sock *sk,
+ struct sk_buff *skb)
+{
+ if (sock_flag(sk, SOCK_RCVMARK) && skb)
+ put_cmsg(msg, SOL_SOCKET, SO_MARK, sizeof(__u32),
+ &skb->mark);
+}
+
+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);
}
-EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
+EXPORT_SYMBOL_GPL(__sock_recv_cmsgs);
INDIRECT_CALLABLE_DECLARE(int inet_recvmsg(struct socket *, struct msghdr *,
size_t, int));
diff --git a/tools/include/uapi/asm-generic/socket.h b/tools/include/uapi/asm-generic/socket.h
index 77f7c1638eb1..8756df13be50 100644
--- a/tools/include/uapi/asm-generic/socket.h
+++ b/tools/include/uapi/asm-generic/socket.h
@@ -119,6 +119,8 @@
#define SO_DETACH_REUSEPORT_BPF 68
+#define SO_RCVMARK 75
+
#if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
--
2.20.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
2022-04-27 20:02 ` Erin MacNeil
@ 2022-04-27 20:47 ` Eric Dumazet
-1 siblings, 0 replies; 19+ messages in thread
From: Eric Dumazet @ 2022-04-27 20:47 UTC (permalink / raw)
To: Erin MacNeil
Cc: Richard Henderson, Ivan Kokshaysky, Matt Turner,
Thomas Bogendoerfer, James E.J. Bottomley, Helge Deller,
David S. Miller, Jakub Kicinski, Paolo Abeni, Arnd Bergmann,
Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
Oliver Hartkopp, Marc Kleine-Budde, Robin van der Gracht,
Oleksij Rempel, kernel, Alexander Aring, Stefan Schmidt,
Hideaki YOSHIFUJI, David Ahern, Steffen Klassert, Herbert Xu,
Jeremy Kerr, Matt Johnston, Vlad Yasevich, Neil Horman,
Marcelo Ricardo Leitner, Lorenz Bauer, Pavel Tikhomirov,
Martynas Pumputis, Akhmat Karakotov, Stephen Rothwell, Wei Wang,
Yangbo Lu, Florian Westphal, Thomas Gleixner, Richard Palethorpe,
Willem de Bruijn, Hangbin Liu, Pablo Neira Ayuso, Richard Sanger,
Yajun Deng, Jiapeng Chong, linux-alpha, LKML, linux-mips,
linux-parisc, sparclinux, netdev, linux-arch, linux-bluetooth,
linux-can, linux-wpan, linux-sctp
On Wed, Apr 27, 2022 at 1:03 PM Erin MacNeil <lnx.erin@gmail.com> wrote:
>
> Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
> should be included in the ancillary data returned by recvmsg().
>
> Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
>
> Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Thanks.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
@ 2022-04-27 20:47 ` Eric Dumazet
0 siblings, 0 replies; 19+ messages in thread
From: Eric Dumazet @ 2022-04-27 20:47 UTC (permalink / raw)
To: Erin MacNeil
Cc: Richard Henderson, Ivan Kokshaysky, Matt Turner,
Thomas Bogendoerfer, James E.J. Bottomley, Helge Deller,
David S. Miller, Jakub Kicinski, Paolo Abeni, Arnd Bergmann,
Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
Oliver Hartkopp, Marc Kleine-Budde, Robin van der Gracht,
Oleksij Rempel, kernel, Alexander Aring, Stefan
On Wed, Apr 27, 2022 at 1:03 PM Erin MacNeil <lnx.erin@gmail.com> wrote:
>
> Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
> should be included in the ancillary data returned by recvmsg().
>
> Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
>
> Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Thanks.
^ permalink raw reply [flat|nested] 19+ messages in thread
* RE: [net-next,v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
2022-04-27 20:02 ` Erin MacNeil
(?)
(?)
@ 2022-04-27 21:05 ` bluez.test.bot
-1 siblings, 0 replies; 19+ messages in thread
From: bluez.test.bot @ 2022-04-27 21:05 UTC (permalink / raw)
To: linux-bluetooth, lnx.erin
[-- Attachment #1: Type: text/plain, Size: 1267 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=636346
---Test result---
Test Summary:
CheckPatch PASS 5.22 seconds
GitLint PASS 1.07 seconds
SubjectPrefix FAIL 0.90 seconds
BuildKernel PASS 31.48 seconds
BuildKernel32 PASS 27.89 seconds
Incremental Build with patchesPASS 38.28 seconds
TestRunner: Setup PASS 470.72 seconds
TestRunner: l2cap-tester PASS 17.48 seconds
TestRunner: bnep-tester PASS 6.24 seconds
TestRunner: mgmt-tester PASS 101.20 seconds
TestRunner: rfcomm-tester PASS 9.74 seconds
TestRunner: sco-tester PASS 9.47 seconds
TestRunner: smp-tester PASS 9.56 seconds
TestRunner: userchan-tester PASS 6.38 seconds
Details
##############################
Test: SubjectPrefix - FAIL - 0.90 seconds
Check subject contains "Bluetooth" prefix
"Bluetooth: " is not specified in the subject
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
2022-04-27 20:02 ` Erin MacNeil
@ 2022-04-28 1:27 ` David Ahern
-1 siblings, 0 replies; 19+ messages in thread
From: David Ahern @ 2022-04-28 1:27 UTC (permalink / raw)
To: Erin MacNeil
Cc: Richard Henderson, Ivan Kokshaysky, Matt Turner,
Thomas Bogendoerfer, James E.J. Bottomley, Helge Deller,
David S. Miller, Jakub Kicinski, Paolo Abeni, Arnd Bergmann,
Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
Oliver Hartkopp, Marc Kleine-Budde, Robin van der Gracht,
Oleksij Rempel, kernel, Alexander Aring, Stefan Schmidt,
Hideaki YOSHIFUJI, Steffen Klassert, Herbert Xu, Jeremy Kerr,
Matt Johnston, Vlad Yasevich, Neil Horman,
Marcelo Ricardo Leitner, Eric Dumazet, Lorenz Bauer,
Pavel Tikhomirov, Martynas Pumputis, Akhmat Karakotov,
Stephen Rothwell, Wei Wang, Yangbo Lu, Florian Westphal,
Thomas Gleixner, Richard Palethorpe, Willem de Bruijn,
Hangbin Liu, Pablo Neira Ayuso, Richard Sanger, Yajun Deng,
Jiapeng Chong, linux-alpha, linux-kernel, linux-mips,
linux-parisc, sparclinux, netdev, linux-arch, linux-bluetooth,
linux-can, linux-wpan, linux-sctp
On 4/27/22 2:02 PM, Erin MacNeil wrote:
> Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
> should be included in the ancillary data returned by recvmsg().
>
> Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
>
> Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
> ---
Reviewed-by: David Ahern <dsahern@kernel.org>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
@ 2022-04-28 1:27 ` David Ahern
0 siblings, 0 replies; 19+ messages in thread
From: David Ahern @ 2022-04-28 1:27 UTC (permalink / raw)
To: Erin MacNeil
Cc: Richard Henderson, Ivan Kokshaysky, Matt Turner,
Thomas Bogendoerfer, James E.J. Bottomley, Helge Deller,
David S. Miller, Jakub Kicinski, Paolo Abeni, Arnd Bergmann,
Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
Oliver Hartkopp, Marc Kleine-Budde, Robin van der Gracht,
Oleksij Rempel, kernel, Alexander Aring, Stefan
On 4/27/22 2:02 PM, Erin MacNeil wrote:
> Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
> should be included in the ancillary data returned by recvmsg().
>
> Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
>
> Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
> ---
Reviewed-by: David Ahern <dsahern@kernel.org>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
2022-04-27 20:02 ` Erin MacNeil
@ 2022-04-28 6:32 ` Marc Kleine-Budde
-1 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2022-04-28 6:32 UTC (permalink / raw)
To: Erin MacNeil
Cc: Richard Henderson, Ivan Kokshaysky, Matt Turner,
Thomas Bogendoerfer, James E.J. Bottomley, Helge Deller,
David S. Miller, Jakub Kicinski, Paolo Abeni, Arnd Bergmann,
Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
Oliver Hartkopp, Robin van der Gracht, Oleksij Rempel, kernel,
Alexander Aring, Stefan Schmidt, Hideaki YOSHIFUJI, David Ahern,
Steffen Klassert, Herbert Xu, Jeremy Kerr, Matt Johnston,
Vlad Yasevich, Neil Horman, Marcelo Ricardo Leitner,
Eric Dumazet, Lorenz Bauer, Pavel Tikhomirov, Martynas Pumputis,
Akhmat Karakotov, Stephen Rothwell, Wei Wang, Yangbo Lu,
Florian Westphal, Thomas Gleixner, Richard Palethorpe,
Willem de Bruijn, Hangbin Liu, Pablo Neira Ayuso, Richard Sanger,
Yajun Deng, Jiapeng Chong, linux-alpha, linux-kernel, linux-mips,
linux-parisc, sparclinux, netdev, linux-arch, linux-bluetooth,
linux-can, linux-wpan, linux-sctp
[-- Attachment #1: Type: text/plain, Size: 843 bytes --]
On 27.04.2022 16:02:37, Erin MacNeil wrote:
> Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
> should be included in the ancillary data returned by recvmsg().
>
> Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
>
> Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
> ---
> net/can/bcm.c | 2 +-
> net/can/j1939/socket.c | 2 +-
> net/can/raw.c | 2 +-
For the net/can changes:
Acked-by: Marc Kleine-Budde <mkl@pengutronix.de>
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
@ 2022-04-28 6:32 ` Marc Kleine-Budde
0 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2022-04-28 6:32 UTC (permalink / raw)
To: Erin MacNeil
Cc: Richard Henderson, Ivan Kokshaysky, Matt Turner,
Thomas Bogendoerfer, James E.J. Bottomley, Helge Deller,
David S. Miller, Jakub Kicinski, Paolo Abeni, Arnd Bergmann,
Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
Oliver Hartkopp, Robin van der Gracht, Oleksij Rempel, kernel,
Alexander Aring, Stefan Schmidt, Hide
[-- Attachment #1: Type: text/plain, Size: 843 bytes --]
On 27.04.2022 16:02:37, Erin MacNeil wrote:
> Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
> should be included in the ancillary data returned by recvmsg().
>
> Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
>
> Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
> ---
> net/can/bcm.c | 2 +-
> net/can/j1939/socket.c | 2 +-
> net/can/raw.c | 2 +-
For the net/can changes:
Acked-by: Marc Kleine-Budde <mkl@pengutronix.de>
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
2022-04-27 20:02 ` Erin MacNeil
@ 2022-04-28 21:20 ` patchwork-bot+netdevbpf
-1 siblings, 0 replies; 19+ messages in thread
From: patchwork-bot+netdevbpf @ 2022-04-28 21:20 UTC (permalink / raw)
To: Erin MacNeil
Cc: rth, ink, mattst88, tsbogend, James.Bottomley, deller, davem,
kuba, pabeni, arnd, marcel, johan.hedberg, luiz.dentz, socketcan,
mkl, robin, linux, kernel, alex.aring, stefan, yoshfuji, dsahern,
steffen.klassert, herbert, jk, matt, vyasevich, nhorman,
marcelo.leitner, edumazet, lmb, ptikhomirov, m, hmukos, sfr,
weiwan, yangbo.lu, fw, tglx, rpalethorpe, willemb, liuhangbin,
pablo, rsanger, yajun.deng, jiapeng.chong, linux-alpha,
linux-kernel, linux-mips, linux-parisc, sparclinux, netdev,
linux-arch, linux-bluetooth, linux-can, linux-wpan, linux-sctp
Hello:
This patch was applied to netdev/net-next.git (master)
by Jakub Kicinski <kuba@kernel.org>:
On Wed, 27 Apr 2022 16:02:37 -0400 you wrote:
> Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
> should be included in the ancillary data returned by recvmsg().
>
> Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
>
> Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
>
> [...]
Here is the summary with links:
- [net-next,v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
https://git.kernel.org/netdev/net-next/c/6fd1d51cfa25
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
@ 2022-04-28 21:20 ` patchwork-bot+netdevbpf
0 siblings, 0 replies; 19+ messages in thread
From: patchwork-bot+netdevbpf @ 2022-04-28 21:20 UTC (permalink / raw)
To: Erin MacNeil
Cc: rth, ink, mattst88, tsbogend, James.Bottomley, deller, davem,
kuba, pabeni, arnd, marcel, johan.hedberg, luiz.dentz, socketcan,
mkl, robin, linux, kernel, alex.aring, stefan, yoshfuji, dsahern,
steffen.klassert, herbert, jk, matt, vyasevich, nhorman,
marcelo.leitner, edumazet, lmb, ptikhomirov, m, hmukos, sfr
Hello:
This patch was applied to netdev/net-next.git (master)
by Jakub Kicinski <kuba@kernel.org>:
On Wed, 27 Apr 2022 16:02:37 -0400 you wrote:
> Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
> should be included in the ancillary data returned by recvmsg().
>
> Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
>
> Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
>
> [...]
Here is the summary with links:
- [net-next,v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
https://git.kernel.org/netdev/net-next/c/6fd1d51cfa25
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
2022-04-27 20:02 ` Erin MacNeil
@ 2022-04-30 8:00 ` patchwork-bot+bluetooth
-1 siblings, 0 replies; 19+ messages in thread
From: patchwork-bot+bluetooth @ 2022-04-30 8:00 UTC (permalink / raw)
To: Erin MacNeil
Cc: rth, ink, mattst88, tsbogend, James.Bottomley, deller, davem,
kuba, pabeni, arnd, marcel, johan.hedberg, luiz.dentz, socketcan,
mkl, robin, linux, kernel, alex.aring, stefan, yoshfuji, dsahern,
steffen.klassert, herbert, jk, matt, vyasevich, nhorman,
marcelo.leitner, edumazet, lmb, ptikhomirov, m, hmukos, sfr,
weiwan, yangbo.lu, fw, tglx, rpalethorpe, willemb, liuhangbin,
pablo, rsanger, yajun.deng, jiapeng.chong, linux-alpha,
linux-kernel, linux-mips, linux-parisc, sparclinux, netdev,
linux-arch, linux-bluetooth, linux-can, linux-wpan, linux-sctp
Hello:
This patch was applied to bluetooth/bluetooth-next.git (master)
by Jakub Kicinski <kuba@kernel.org>:
On Wed, 27 Apr 2022 16:02:37 -0400 you wrote:
> Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
> should be included in the ancillary data returned by recvmsg().
>
> Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
>
> Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
>
> [...]
Here is the summary with links:
- [net-next,v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
https://git.kernel.org/bluetooth/bluetooth-next/c/6fd1d51cfa25
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH net-next v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
@ 2022-04-30 8:00 ` patchwork-bot+bluetooth
0 siblings, 0 replies; 19+ messages in thread
From: patchwork-bot+bluetooth @ 2022-04-30 8:00 UTC (permalink / raw)
To: Erin MacNeil
Cc: rth, ink, mattst88, tsbogend, James.Bottomley, deller, davem,
kuba, pabeni, arnd, marcel, johan.hedberg, luiz.dentz, socketcan,
mkl, robin, linux, kernel, alex.aring, stefan, yoshfuji, dsahern,
steffen.klassert, herbert, jk, matt, vyasevich, nhorman,
marcelo.leitner, edumazet, lmb, ptikhomirov, m, hmukos, sfr
Hello:
This patch was applied to bluetooth/bluetooth-next.git (master)
by Jakub Kicinski <kuba@kernel.org>:
On Wed, 27 Apr 2022 16:02:37 -0400 you wrote:
> Adding a new socket option, SO_RCVMARK, to indicate that SO_MARK
> should be included in the ancillary data returned by recvmsg().
>
> Renamed the sock_recv_ts_and_drops() function to sock_recv_cmsgs().
>
> Signed-off-by: Erin MacNeil <lnx.erin@gmail.com>
>
> [...]
Here is the summary with links:
- [net-next,v3] net: SO_RCVMARK socket option for SO_MARK with recvmsg()
https://git.kernel.org/bluetooth/bluetooth-next/c/6fd1d51cfa25
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2022-04-30 8:00 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-26 17:38 [PATCH net-next] net: Add SO_RCVMARK socket option to provide SO_MARK with recvmsg() Erin MacNeil
2022-04-27 1:43 ` kernel test robot
2022-04-27 3:21 ` [PATCH net-next v2] " Erin MacNeil
2022-04-27 3:21 ` Erin MacNeil
2022-04-27 4:37 ` [net-next,v2] " bluez.test.bot
2022-04-27 20:02 ` [PATCH net-next v3] net: SO_RCVMARK socket option for " Erin MacNeil
2022-04-27 20:02 ` Erin MacNeil
2022-04-27 20:47 ` Eric Dumazet
2022-04-27 20:47 ` Eric Dumazet
2022-04-27 21:05 ` [net-next,v3] " bluez.test.bot
2022-04-28 1:27 ` [PATCH net-next v3] " David Ahern
2022-04-28 1:27 ` David Ahern
2022-04-28 6:32 ` Marc Kleine-Budde
2022-04-28 6:32 ` Marc Kleine-Budde
2022-04-28 21:20 ` patchwork-bot+netdevbpf
2022-04-28 21:20 ` patchwork-bot+netdevbpf
2022-04-30 8:00 ` patchwork-bot+bluetooth
2022-04-30 8:00 ` patchwork-bot+bluetooth
2022-04-27 3:25 ` [PATCH net-next] net: Add SO_RCVMARK socket option to provide " kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.