]> git.baikalelectronics.ru Git - kernel.git/commitdiff
selftests: net: cmsg_so_mark: test with SO_MARK set by setsockopt
authorJakub Kicinski <kuba@kernel.org>
Thu, 10 Feb 2022 00:36:46 +0000 (16:36 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Feb 2022 15:04:51 +0000 (15:04 +0000)
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>
tools/testing/selftests/net/cmsg_sender.c
tools/testing/selftests/net/cmsg_so_mark.sh

index edb8c427c7cbd1a49eef6a4c19fa67e8eaf0539c..c7586a4b0361d13fdd78e673baa8ab75592dc19b 100644 (file)
@@ -29,6 +29,9 @@ struct options {
        bool silent_send;
        const char *host;
        const char *service;
+       struct {
+               unsigned int mark;
+       } sockopt;
        struct {
                unsigned int family;
                unsigned int type;
@@ -56,6 +59,7 @@ static void __attribute__((noreturn)) cs_usage(const char *bin)
               "\t\t        (u = UDP (default); i = ICMP; r = RAW)\n"
               "\n"
               "\t\t-m val  Set SO_MARK with given value\n"
+              "\t\t-M val  Set SO_MARK via setsockopt\n"
               "");
        exit(ERN_HELP);
 }
@@ -64,7 +68,7 @@ static void cs_parse_args(int argc, char *argv[])
 {
        char o;
 
-       while ((o = getopt(argc, argv, "46sp:m:")) != -1) {
+       while ((o = getopt(argc, argv, "46sp:m:M:")) != -1) {
                switch (o) {
                case 's':
                        opt.silent_send = true;
@@ -91,6 +95,9 @@ static void cs_parse_args(int argc, char *argv[])
                        opt.mark.ena = true;
                        opt.mark.val = atoi(optarg);
                        break;
+               case 'M':
+                       opt.sockopt.mark = atoi(optarg);
+                       break;
                }
        }
 
@@ -175,6 +182,11 @@ int main(int argc, char *argv[])
                sin6->sin6_port = htons(opt.sock.proto);
        }
 
+       if (opt.sockopt.mark &&
+           setsockopt(fd, SOL_SOCKET, SO_MARK,
+                      &opt.sockopt.mark, sizeof(opt.sockopt.mark)))
+               error(ERN_SOCKOPT, errno, "setsockopt SO_MARK");
+
        iov[0].iov_base = buf;
        iov[0].iov_len = sizeof(buf);
 
index 925f6b9deee2131961c5d748e312b1ca1d009c19..1650b8622f2fc3b3baac737c65cb2490fd301640 100755 (executable)
@@ -43,19 +43,27 @@ check_result() {
     fi
 }
 
-for i in 4 6; do
-    [ $i == 4 ] && TGT=$TGT4 || TGT=$TGT6
+for ovr in setsock cmsg both; do
+    for i in 4 6; do
+       [ $i == 4 ] && TGT=$TGT4 || TGT=$TGT6
 
-    for p in u i r; do
-       [ $p == "u" ] && prot=UDP
-       [ $p == "i" ] && prot=ICMP
-       [ $p == "r" ] && prot=RAW
+       for p in u i r; do
+           [ $p == "u" ] && prot=UDP
+           [ $p == "i" ] && prot=ICMP
+           [ $p == "r" ] && prot=RAW
 
-       ip netns exec $NS ./cmsg_sender -$i -p $p -m $((MARK + 1)) $TGT 1234
-       check_result $? 0 "$prot pass"
+           [ $ovr == "setsock" ] && m="-M"
+           [ $ovr == "cmsg" ]    && m="-m"
+           [ $ovr == "both" ]    && m="-M $MARK -m"
 
-       ip netns exec $NS ./cmsg_sender -$i -p $p -m $MARK -s $TGT 1234
-       check_result $? 1 "$prot rejection"
+           ip netns exec $NS ./cmsg_sender -$i -p $p $m $((MARK + 1)) $TGT 1234
+           check_result $? 0 "$prot $ovr - pass"
+
+           [ $ovr == "diff" ] && m="-M $((MARK + 1)) -m"
+
+           ip netns exec $NS ./cmsg_sender -$i -p $p $m $MARK -s $TGT 1234
+           check_result $? 1 "$prot $ovr - rejection"
+       done
     done
 done