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

selftests: net: cmsg_so_mark: test with SO_MARK set by setsockopt

Test if setting SO_MARK with setsockopt works and if cmsg
takes precedence over it.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jakub Kicinski and committed by
David S. Miller
9bbfbc92 0344488e

+31 -11
+13 -1
tools/testing/selftests/net/cmsg_sender.c
··· 30 30 const char *host; 31 31 const char *service; 32 32 struct { 33 + unsigned int mark; 34 + } sockopt; 35 + struct { 33 36 unsigned int family; 34 37 unsigned int type; 35 38 unsigned int proto; ··· 59 56 "\t\t (u = UDP (default); i = ICMP; r = RAW)\n" 60 57 "\n" 61 58 "\t\t-m val Set SO_MARK with given value\n" 59 + "\t\t-M val Set SO_MARK via setsockopt\n" 62 60 ""); 63 61 exit(ERN_HELP); 64 62 } ··· 68 64 { 69 65 char o; 70 66 71 - while ((o = getopt(argc, argv, "46sp:m:")) != -1) { 67 + while ((o = getopt(argc, argv, "46sp:m:M:")) != -1) { 72 68 switch (o) { 73 69 case 's': 74 70 opt.silent_send = true; ··· 94 90 case 'm': 95 91 opt.mark.ena = true; 96 92 opt.mark.val = atoi(optarg); 93 + break; 94 + case 'M': 95 + opt.sockopt.mark = atoi(optarg); 97 96 break; 98 97 } 99 98 } ··· 181 174 memcpy(buf, &hdr, sizeof(hdr)); 182 175 sin6->sin6_port = htons(opt.sock.proto); 183 176 } 177 + 178 + if (opt.sockopt.mark && 179 + setsockopt(fd, SOL_SOCKET, SO_MARK, 180 + &opt.sockopt.mark, sizeof(opt.sockopt.mark))) 181 + error(ERN_SOCKOPT, errno, "setsockopt SO_MARK"); 184 182 185 183 iov[0].iov_base = buf; 186 184 iov[0].iov_len = sizeof(buf);
+18 -10
tools/testing/selftests/net/cmsg_so_mark.sh
··· 43 43 fi 44 44 } 45 45 46 - for i in 4 6; do 47 - [ $i == 4 ] && TGT=$TGT4 || TGT=$TGT6 46 + for ovr in setsock cmsg both; do 47 + for i in 4 6; do 48 + [ $i == 4 ] && TGT=$TGT4 || TGT=$TGT6 48 49 49 - for p in u i r; do 50 - [ $p == "u" ] && prot=UDP 51 - [ $p == "i" ] && prot=ICMP 52 - [ $p == "r" ] && prot=RAW 50 + for p in u i r; do 51 + [ $p == "u" ] && prot=UDP 52 + [ $p == "i" ] && prot=ICMP 53 + [ $p == "r" ] && prot=RAW 53 54 54 - ip netns exec $NS ./cmsg_sender -$i -p $p -m $((MARK + 1)) $TGT 1234 55 - check_result $? 0 "$prot pass" 55 + [ $ovr == "setsock" ] && m="-M" 56 + [ $ovr == "cmsg" ] && m="-m" 57 + [ $ovr == "both" ] && m="-M $MARK -m" 56 58 57 - ip netns exec $NS ./cmsg_sender -$i -p $p -m $MARK -s $TGT 1234 58 - check_result $? 1 "$prot rejection" 59 + ip netns exec $NS ./cmsg_sender -$i -p $p $m $((MARK + 1)) $TGT 1234 60 + check_result $? 0 "$prot $ovr - pass" 61 + 62 + [ $ovr == "diff" ] && m="-M $((MARK + 1)) -m" 63 + 64 + ip netns exec $NS ./cmsg_sender -$i -p $p $m $MARK -s $TGT 1234 65 + check_result $? 1 "$prot $ovr - rejection" 66 + done 59 67 done 60 68 done 61 69