Commit 9bbfbc92 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller
Browse files

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: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0344488e
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -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);

+18 −10
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ check_result() {
    fi
}

for ovr in setsock cmsg both; do
    for i in 4 6; do
	[ $i == 4 ] && TGT=$TGT4 || TGT=$TGT6

@@ -51,11 +52,18 @@ for i in 4 6; do
	    [ $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