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