bool silent_send;
        const char *host;
        const char *service;
+       struct {
+               unsigned int mark;
+       } sockopt;
        struct {
                unsigned int family;
                unsigned int type;
               "\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);
 }
 {
        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;
                        opt.mark.ena = true;
                        opt.mark.val = atoi(optarg);
                        break;
+               case 'M':
+                       opt.sockopt.mark = atoi(optarg);
+                       break;
                }
        }
 
                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);
 
 
     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