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>
This commit is contained in:
Jakub Kicinski 2022-02-09 16:36:46 -08:00 committed by David S. Miller
parent 0344488e11
commit 9bbfbc92c6
2 changed files with 31 additions and 11 deletions

View 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);

View File

@ -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