Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: udp: test for passing SO_MARK as cmsg

Before fix:
| Case IPv6 rejection returned 0, expected 1
|FAIL - 1/4 cases failed

With the fix:
| OK

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: David Ahern <dsahern@kernel.org>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jakub Kicinski and committed by
David S. Miller
b0ced8f2 42dcfd85

+131
+1
tools/testing/selftests/net/.gitignore
··· 35 35 gro 36 36 ioam6_parser 37 37 toeplitz 38 + cmsg_so_mark
+2
tools/testing/selftests/net/Makefile
··· 28 28 TEST_PROGS += ioam6.sh 29 29 TEST_PROGS += gro.sh 30 30 TEST_PROGS += gre_gso.sh 31 + TEST_PROGS += cmsg_so_mark.sh 31 32 TEST_PROGS_EXTENDED := in_netns.sh 32 33 TEST_GEN_FILES = socket nettest 33 34 TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any ··· 45 44 TEST_GEN_PROGS = reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa 46 45 TEST_GEN_PROGS += reuseport_dualstack reuseaddr_conflict tls 47 46 TEST_GEN_FILES += toeplitz 47 + TEST_GEN_FILES += cmsg_so_mark 48 48 49 49 TEST_FILES := settings 50 50
+67
tools/testing/selftests/net/cmsg_so_mark.c
··· 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 + }
+61
tools/testing/selftests/net/cmsg_so_mark.sh
··· 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