Skip to content

Commit 7be49d2

Browse files
committed
Merge branch 'SO_MARK-routing'
Jakub Kicinski says: ==================== udp6: allow SO_MARK ctrl msg to affect routing Looks like SO_MARK from cmsg does not affect routing policy. This seems accidental. I opted for net because of the discrepancy between IPv4 and IPv6, but it never worked and doesn't cause crashes.. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 6de6e46 + b0ced8f commit 7be49d2

File tree

5 files changed

+132
-1
lines changed

5 files changed

+132
-1
lines changed

net/ipv6/udp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1435,7 +1435,6 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
14351435
if (!fl6.flowi6_oif)
14361436
fl6.flowi6_oif = np->sticky_pktinfo.ipi6_ifindex;
14371437

1438-
fl6.flowi6_mark = ipc6.sockc.mark;
14391438
fl6.flowi6_uid = sk->sk_uid;
14401439

14411440
if (msg->msg_controllen) {
@@ -1471,6 +1470,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
14711470
ipc6.opt = opt;
14721471

14731472
fl6.flowi6_proto = sk->sk_protocol;
1473+
fl6.flowi6_mark = ipc6.sockc.mark;
14741474
fl6.daddr = *daddr;
14751475
if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr))
14761476
fl6.saddr = np->saddr;

tools/testing/selftests/net/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,4 @@ test_unix_oob
3535
gro
3636
ioam6_parser
3737
toeplitz
38+
cmsg_so_mark

tools/testing/selftests/net/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ TEST_PROGS += veth.sh
2828
TEST_PROGS += ioam6.sh
2929
TEST_PROGS += gro.sh
3030
TEST_PROGS += gre_gso.sh
31+
TEST_PROGS += cmsg_so_mark.sh
3132
TEST_PROGS_EXTENDED := in_netns.sh
3233
TEST_GEN_FILES = socket nettest
3334
TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any
@@ -44,6 +45,7 @@ TEST_GEN_FILES += gro
4445
TEST_GEN_PROGS = reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa
4546
TEST_GEN_PROGS += reuseport_dualstack reuseaddr_conflict tls
4647
TEST_GEN_FILES += toeplitz
48+
TEST_GEN_FILES += cmsg_so_mark
4749

4850
TEST_FILES := settings
4951

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later
2+
#include <errno.h>
3+
#include <netdb.h>
4+
#include <stdio.h>
5+
#include <stdlib.h>
6+
#include <string.h>
7+
#include <unistd.h>
8+
#include <linux/types.h>
9+
#include <sys/socket.h>
10+
11+
int main(int argc, const char **argv)
12+
{
13+
char cbuf[CMSG_SPACE(sizeof(__u32))];
14+
struct addrinfo hints, *ai;
15+
struct cmsghdr *cmsg;
16+
struct iovec iov[1];
17+
struct msghdr msg;
18+
int mark;
19+
int err;
20+
int fd;
21+
22+
if (argc != 4) {
23+
fprintf(stderr, "Usage: %s <dst_ip> <port> <mark>\n", argv[0]);
24+
return 1;
25+
}
26+
mark = atoi(argv[3]);
27+
28+
memset(&hints, 0, sizeof(hints));
29+
hints.ai_family = AF_UNSPEC;
30+
hints.ai_socktype = SOCK_DGRAM;
31+
32+
ai = NULL;
33+
err = getaddrinfo(argv[1], argv[2], &hints, &ai);
34+
if (err) {
35+
fprintf(stderr, "Can't resolve address: %s\n", strerror(errno));
36+
return 1;
37+
}
38+
39+
fd = socket(ai->ai_family, SOCK_DGRAM, IPPROTO_UDP);
40+
if (fd < 0) {
41+
fprintf(stderr, "Can't open socket: %s\n", strerror(errno));
42+
freeaddrinfo(ai);
43+
return 1;
44+
}
45+
46+
iov[0].iov_base = "bla";
47+
iov[0].iov_len = 4;
48+
49+
msg.msg_name = ai->ai_addr;
50+
msg.msg_namelen = ai->ai_addrlen;
51+
msg.msg_iov = iov;
52+
msg.msg_iovlen = 1;
53+
msg.msg_control = cbuf;
54+
msg.msg_controllen = sizeof(cbuf);
55+
56+
cmsg = CMSG_FIRSTHDR(&msg);
57+
cmsg->cmsg_level = SOL_SOCKET;
58+
cmsg->cmsg_type = SO_MARK;
59+
cmsg->cmsg_len = CMSG_LEN(sizeof(__u32));
60+
*(__u32 *)CMSG_DATA(cmsg) = mark;
61+
62+
err = sendmsg(fd, &msg, 0);
63+
64+
close(fd);
65+
freeaddrinfo(ai);
66+
return err != 4;
67+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/bin/bash
2+
# SPDX-License-Identifier: GPL-2.0
3+
4+
NS=ns
5+
IP4=172.16.0.1/24
6+
TGT4=172.16.0.2
7+
IP6=2001:db8:1::1/64
8+
TGT6=2001:db8:1::2
9+
MARK=1000
10+
11+
cleanup()
12+
{
13+
ip netns del $NS
14+
}
15+
16+
trap cleanup EXIT
17+
18+
# Namespaces
19+
ip netns add $NS
20+
21+
# Connectivity
22+
ip -netns $NS link add type dummy
23+
ip -netns $NS link set dev dummy0 up
24+
ip -netns $NS addr add $IP4 dev dummy0
25+
ip -netns $NS addr add $IP6 dev dummy0
26+
27+
ip -netns $NS rule add fwmark $MARK lookup 300
28+
ip -6 -netns $NS rule add fwmark $MARK lookup 300
29+
ip -netns $NS route add prohibit any table 300
30+
ip -6 -netns $NS route add prohibit any table 300
31+
32+
# Test
33+
BAD=0
34+
TOTAL=0
35+
36+
check_result() {
37+
((TOTAL++))
38+
if [ $1 -ne $2 ]; then
39+
echo " Case $3 returned $1, expected $2"
40+
((BAD++))
41+
fi
42+
}
43+
44+
ip netns exec $NS ./cmsg_so_mark $TGT4 1234 $((MARK + 1))
45+
check_result $? 0 "IPv4 pass"
46+
ip netns exec $NS ./cmsg_so_mark $TGT6 1234 $((MARK + 1))
47+
check_result $? 0 "IPv6 pass"
48+
49+
ip netns exec $NS ./cmsg_so_mark $TGT4 1234 $MARK
50+
check_result $? 1 "IPv4 rejection"
51+
ip netns exec $NS ./cmsg_so_mark $TGT6 1234 $MARK
52+
check_result $? 1 "IPv6 rejection"
53+
54+
# Summary
55+
if [ $BAD -ne 0 ]; then
56+
echo "FAIL - $BAD/$TOTAL cases failed"
57+
exit 1
58+
else
59+
echo "OK"
60+
exit 0
61+
fi

0 commit comments

Comments
 (0)