xref: /openbmc/linux/tools/testing/selftests/net/cmsg_ipv6.sh (revision 695c312ec5a68e4373d063ee649c7b925ffb5da7)
16f97c7c6SJakub Kicinski#!/bin/bash
26f97c7c6SJakub Kicinski# SPDX-License-Identifier: GPL-2.0
36f97c7c6SJakub Kicinski
49657ad09SJakub Kicinskiksft_skip=4
59657ad09SJakub Kicinski
66f97c7c6SJakub KicinskiNS=ns
76f97c7c6SJakub KicinskiIP6=2001:db8:1::1/64
86f97c7c6SJakub KicinskiTGT6=2001:db8:1::2
9a6efc42aSAndrei GherzanTMPF=$(mktemp --suffix ".pcap")
106f97c7c6SJakub Kicinski
116f97c7c6SJakub Kicinskicleanup()
126f97c7c6SJakub Kicinski{
139657ad09SJakub Kicinski    rm -f $TMPF
146f97c7c6SJakub Kicinski    ip netns del $NS
156f97c7c6SJakub Kicinski}
166f97c7c6SJakub Kicinski
176f97c7c6SJakub Kicinskitrap cleanup EXIT
186f97c7c6SJakub Kicinski
196f97c7c6SJakub KicinskiNSEXE="ip netns exec $NS"
206f97c7c6SJakub Kicinski
219657ad09SJakub Kicinskitcpdump -h | grep immediate-mode >> /dev/null
229657ad09SJakub Kicinskiif [ $? -ne 0 ]; then
239657ad09SJakub Kicinski    echo "SKIP - tcpdump with --immediate-mode option required"
249657ad09SJakub Kicinski    exit $ksft_skip
259657ad09SJakub Kicinskifi
269657ad09SJakub Kicinski
276f97c7c6SJakub Kicinski# Namespaces
286f97c7c6SJakub Kicinskiip netns add $NS
296f97c7c6SJakub Kicinski
306f97c7c6SJakub Kicinski$NSEXE sysctl -w net.ipv4.ping_group_range='0 2147483647' > /dev/null
316f97c7c6SJakub Kicinski
326f97c7c6SJakub Kicinski# Connectivity
336f97c7c6SJakub Kicinskiip -netns $NS link add type dummy
346f97c7c6SJakub Kicinskiip -netns $NS link set dev dummy0 up
356f97c7c6SJakub Kicinskiip -netns $NS addr add $IP6 dev dummy0
366f97c7c6SJakub Kicinski
376f97c7c6SJakub Kicinski# Test
386f97c7c6SJakub KicinskiBAD=0
396f97c7c6SJakub KicinskiTOTAL=0
406f97c7c6SJakub Kicinski
416f97c7c6SJakub Kicinskicheck_result() {
426f97c7c6SJakub Kicinski    ((TOTAL++))
436f97c7c6SJakub Kicinski    if [ $1 -ne $2 ]; then
446f97c7c6SJakub Kicinski	echo "  Case $3 returned $1, expected $2"
456f97c7c6SJakub Kicinski	((BAD++))
466f97c7c6SJakub Kicinski    fi
476f97c7c6SJakub Kicinski}
486f97c7c6SJakub Kicinski
496f97c7c6SJakub Kicinski# IPV6_DONTFRAG
506f97c7c6SJakub Kicinskifor ovr in setsock cmsg both diff; do
516f97c7c6SJakub Kicinski    for df in 0 1; do
526f97c7c6SJakub Kicinski	for p in u i r; do
536f97c7c6SJakub Kicinski	    [ $p == "u" ] && prot=UDP
546f97c7c6SJakub Kicinski	    [ $p == "i" ] && prot=ICMP
556f97c7c6SJakub Kicinski	    [ $p == "r" ] && prot=RAW
566f97c7c6SJakub Kicinski
576f97c7c6SJakub Kicinski	    [ $ovr == "setsock" ] && m="-F $df"
586f97c7c6SJakub Kicinski	    [ $ovr == "cmsg" ]    && m="-f $df"
596f97c7c6SJakub Kicinski	    [ $ovr == "both" ]    && m="-F $df -f $df"
606f97c7c6SJakub Kicinski	    [ $ovr == "diff" ]    && m="-F $((1 - df)) -f $df"
616f97c7c6SJakub Kicinski
626f97c7c6SJakub Kicinski	    $NSEXE ./cmsg_sender -s -S 2000 -6 -p $p $m $TGT6 1234
636f97c7c6SJakub Kicinski	    check_result $? $df "DONTFRAG $prot $ovr"
646f97c7c6SJakub Kicinski	done
656f97c7c6SJakub Kicinski    done
666f97c7c6SJakub Kicinskidone
676f97c7c6SJakub Kicinski
689657ad09SJakub Kicinski# IPV6_TCLASS
699657ad09SJakub KicinskiTOS=0x10
709657ad09SJakub KicinskiTOS2=0x20
719657ad09SJakub Kicinski
729657ad09SJakub Kicinskiip -6 -netns $NS rule add tos $TOS lookup 300
739657ad09SJakub Kicinskiip -6 -netns $NS route add table 300 prohibit any
749657ad09SJakub Kicinski
759657ad09SJakub Kicinskifor ovr in setsock cmsg both diff; do
769657ad09SJakub Kicinski    for p in u i r; do
779657ad09SJakub Kicinski	[ $p == "u" ] && prot=UDP
789657ad09SJakub Kicinski	[ $p == "i" ] && prot=ICMP
799657ad09SJakub Kicinski	[ $p == "r" ] && prot=RAW
809657ad09SJakub Kicinski
819657ad09SJakub Kicinski	[ $ovr == "setsock" ] && m="-C"
829657ad09SJakub Kicinski	[ $ovr == "cmsg" ]    && m="-c"
839657ad09SJakub Kicinski	[ $ovr == "both" ]    && m="-C $((TOS2)) -c"
849657ad09SJakub Kicinski	[ $ovr == "diff" ]    && m="-C $((TOS )) -c"
859657ad09SJakub Kicinski
869657ad09SJakub Kicinski	$NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &
879657ad09SJakub Kicinski	BG=$!
889657ad09SJakub Kicinski	sleep 0.05
899657ad09SJakub Kicinski
909657ad09SJakub Kicinski	$NSEXE ./cmsg_sender -6 -p $p $m $((TOS2)) $TGT6 1234
919657ad09SJakub Kicinski	check_result $? 0 "TCLASS $prot $ovr - pass"
929657ad09SJakub Kicinski
939657ad09SJakub Kicinski	while [ -d /proc/$BG ]; do
94*84bfcb77SJakub Kicinski	    $NSEXE ./cmsg_sender -6 -p $p $m $((TOS2)) $TGT6 1234
959657ad09SJakub Kicinski	done
969657ad09SJakub Kicinski
979657ad09SJakub Kicinski	tcpdump -r $TMPF -v 2>&1 | grep "class $TOS2" >> /dev/null
989657ad09SJakub Kicinski	check_result $? 0 "TCLASS $prot $ovr - packet data"
999657ad09SJakub Kicinski	rm $TMPF
1009657ad09SJakub Kicinski
1019657ad09SJakub Kicinski	[ $ovr == "both" ]    && m="-C $((TOS )) -c"
1029657ad09SJakub Kicinski	[ $ovr == "diff" ]    && m="-C $((TOS2)) -c"
1039657ad09SJakub Kicinski
1049657ad09SJakub Kicinski	$NSEXE ./cmsg_sender -6 -p $p $m $((TOS)) -s $TGT6 1234
1059657ad09SJakub Kicinski	check_result $? 1 "TCLASS $prot $ovr - rejection"
1069657ad09SJakub Kicinski    done
1079657ad09SJakub Kicinskidone
1089657ad09SJakub Kicinski
10905ae83d5SJakub Kicinski# IPV6_HOPLIMIT
11005ae83d5SJakub KicinskiLIM=4
11105ae83d5SJakub Kicinski
11205ae83d5SJakub Kicinskifor ovr in setsock cmsg both diff; do
11305ae83d5SJakub Kicinski    for p in u i r; do
11405ae83d5SJakub Kicinski	[ $p == "u" ] && prot=UDP
11505ae83d5SJakub Kicinski	[ $p == "i" ] && prot=ICMP
11605ae83d5SJakub Kicinski	[ $p == "r" ] && prot=RAW
11705ae83d5SJakub Kicinski
11805ae83d5SJakub Kicinski	[ $ovr == "setsock" ] && m="-L"
11905ae83d5SJakub Kicinski	[ $ovr == "cmsg" ]    && m="-l"
12005ae83d5SJakub Kicinski	[ $ovr == "both" ]    && m="-L $LIM -l"
12105ae83d5SJakub Kicinski	[ $ovr == "diff" ]    && m="-L $((LIM + 1)) -l"
12205ae83d5SJakub Kicinski
12305ae83d5SJakub Kicinski	$NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &
12405ae83d5SJakub Kicinski	BG=$!
12505ae83d5SJakub Kicinski	sleep 0.05
12605ae83d5SJakub Kicinski
12705ae83d5SJakub Kicinski	$NSEXE ./cmsg_sender -6 -p $p $m $LIM $TGT6 1234
12805ae83d5SJakub Kicinski	check_result $? 0 "HOPLIMIT $prot $ovr - pass"
12905ae83d5SJakub Kicinski
13005ae83d5SJakub Kicinski	while [ -d /proc/$BG ]; do
131*84bfcb77SJakub Kicinski	    $NSEXE ./cmsg_sender -6 -p $p $m $LIM $TGT6 1234
13205ae83d5SJakub Kicinski	done
13305ae83d5SJakub Kicinski
13405ae83d5SJakub Kicinski	tcpdump -r $TMPF -v 2>&1 | grep "hlim $LIM[^0-9]" >> /dev/null
13505ae83d5SJakub Kicinski	check_result $? 0 "HOPLIMIT $prot $ovr - packet data"
13605ae83d5SJakub Kicinski	rm $TMPF
13705ae83d5SJakub Kicinski    done
13805ae83d5SJakub Kicinskidone
13905ae83d5SJakub Kicinski
140a22982c3SJakub Kicinski# IPV6 exthdr
141a22982c3SJakub Kicinskifor p in u i r; do
142a22982c3SJakub Kicinski    # Very basic "does it crash" test
143a22982c3SJakub Kicinski    for h in h d r; do
144a22982c3SJakub Kicinski	$NSEXE ./cmsg_sender -p $p -6 -H $h $TGT6 1234
145a22982c3SJakub Kicinski	check_result $? 0 "ExtHdr $prot $ovr - pass"
146a22982c3SJakub Kicinski    done
147a22982c3SJakub Kicinskidone
148a22982c3SJakub Kicinski
1496f97c7c6SJakub Kicinski# Summary
1506f97c7c6SJakub Kicinskiif [ $BAD -ne 0 ]; then
1516f97c7c6SJakub Kicinski    echo "FAIL - $BAD/$TOTAL cases failed"
1526f97c7c6SJakub Kicinski    exit 1
1536f97c7c6SJakub Kicinskielse
1546f97c7c6SJakub Kicinski    echo "OK"
1556f97c7c6SJakub Kicinski    exit 0
1566f97c7c6SJakub Kicinskifi
157