12e5584e0SWillem de Bruijn#!/bin/bash 22e5584e0SWillem de Bruijn# SPDX-License-Identifier: GPL-2.0 32e5584e0SWillem de Bruijn 42e5584e0SWillem de Bruijnsource lib.sh 52e5584e0SWillem de Bruijn 62e5584e0SWillem de BruijnIP4=172.16.0.1/24 72e5584e0SWillem de BruijnTGT4=172.16.0.2 82e5584e0SWillem de BruijnIP6=2001:db8:1::1/64 92e5584e0SWillem de BruijnTGT6=2001:db8:1::2 102e5584e0SWillem de BruijnTMPF=$(mktemp --suffix ".pcap") 112e5584e0SWillem de Bruijn 122e5584e0SWillem de Bruijncleanup() 132e5584e0SWillem de Bruijn{ 142e5584e0SWillem de Bruijn rm -f $TMPF 152e5584e0SWillem de Bruijn cleanup_ns $NS 162e5584e0SWillem de Bruijn} 172e5584e0SWillem de Bruijn 182e5584e0SWillem de Bruijntrap cleanup EXIT 192e5584e0SWillem de Bruijn 202e5584e0SWillem de Bruijntcpdump -h | grep immediate-mode >> /dev/null 212e5584e0SWillem de Bruijnif [ $? -ne 0 ]; then 222e5584e0SWillem de Bruijn echo "SKIP - tcpdump with --immediate-mode option required" 232e5584e0SWillem de Bruijn exit $ksft_skip 242e5584e0SWillem de Bruijnfi 252e5584e0SWillem de Bruijn 262e5584e0SWillem de Bruijn# Namespaces 272e5584e0SWillem de Bruijnsetup_ns NS 282e5584e0SWillem de BruijnNSEXE="ip netns exec $NS" 292e5584e0SWillem de Bruijn 302e5584e0SWillem de Bruijn$NSEXE sysctl -w net.ipv4.ping_group_range='0 2147483647' > /dev/null 312e5584e0SWillem de Bruijn 322e5584e0SWillem de Bruijn# Connectivity 332e5584e0SWillem de Bruijnip -netns $NS link add type dummy 342e5584e0SWillem de Bruijnip -netns $NS link set dev dummy0 up 352e5584e0SWillem de Bruijnip -netns $NS addr add $IP4 dev dummy0 362e5584e0SWillem de Bruijnip -netns $NS addr add $IP6 dev dummy0 372e5584e0SWillem de Bruijn 382e5584e0SWillem de Bruijn# Test 392e5584e0SWillem de BruijnBAD=0 402e5584e0SWillem de BruijnTOTAL=0 412e5584e0SWillem de Bruijn 422e5584e0SWillem de Bruijncheck_result() { 432e5584e0SWillem de Bruijn ((TOTAL++)) 442e5584e0SWillem de Bruijn if [ $1 -ne $2 ]; then 452e5584e0SWillem de Bruijn echo " Case $3 returned $1, expected $2" 462e5584e0SWillem de Bruijn ((BAD++)) 472e5584e0SWillem de Bruijn fi 482e5584e0SWillem de Bruijn} 492e5584e0SWillem de Bruijn 502e5584e0SWillem de Bruijn# IPV6_DONTFRAG 512e5584e0SWillem de Bruijnfor ovr in setsock cmsg both diff; do 522e5584e0SWillem de Bruijn for df in 0 1; do 53*0922cb68SWillem de Bruijn for p in u U i r; do 542e5584e0SWillem de Bruijn [ $p == "u" ] && prot=UDP 55*0922cb68SWillem de Bruijn [ $p == "U" ] && prot=UDP 562e5584e0SWillem de Bruijn [ $p == "i" ] && prot=ICMP 572e5584e0SWillem de Bruijn [ $p == "r" ] && prot=RAW 582e5584e0SWillem de Bruijn 592e5584e0SWillem de Bruijn [ $ovr == "setsock" ] && m="-F $df" 602e5584e0SWillem de Bruijn [ $ovr == "cmsg" ] && m="-f $df" 612e5584e0SWillem de Bruijn [ $ovr == "both" ] && m="-F $df -f $df" 622e5584e0SWillem de Bruijn [ $ovr == "diff" ] && m="-F $((1 - df)) -f $df" 632e5584e0SWillem de Bruijn 642e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender -s -S 2000 -6 -p $p $m $TGT6 1234 652e5584e0SWillem de Bruijn check_result $? $df "DONTFRAG $prot $ovr" 662e5584e0SWillem de Bruijn done 672e5584e0SWillem de Bruijn done 682e5584e0SWillem de Bruijndone 692e5584e0SWillem de Bruijn 702e5584e0SWillem de Bruijn# IP_TOS + IPV6_TCLASS 712e5584e0SWillem de Bruijn 722e5584e0SWillem de Bruijntest_dscp() { 732e5584e0SWillem de Bruijn local -r IPVER=$1 742e5584e0SWillem de Bruijn local -r TGT=$2 752e5584e0SWillem de Bruijn local -r MATCH=$3 762e5584e0SWillem de Bruijn 772e5584e0SWillem de Bruijn local -r TOS=0x10 782e5584e0SWillem de Bruijn local -r TOS2=0x20 792e5584e0SWillem de Bruijn local -r ECN=0x3 802e5584e0SWillem de Bruijn 812e5584e0SWillem de Bruijn ip $IPVER -netns $NS rule add tos $TOS lookup 300 822e5584e0SWillem de Bruijn ip $IPVER -netns $NS route add table 300 prohibit any 832e5584e0SWillem de Bruijn 842e5584e0SWillem de Bruijn for ovr in setsock cmsg both diff; do 85*0922cb68SWillem de Bruijn for p in u U i r; do 862e5584e0SWillem de Bruijn [ $p == "u" ] && prot=UDP 87*0922cb68SWillem de Bruijn [ $p == "U" ] && prot=UDP 882e5584e0SWillem de Bruijn [ $p == "i" ] && prot=ICMP 892e5584e0SWillem de Bruijn [ $p == "r" ] && prot=RAW 902e5584e0SWillem de Bruijn 912e5584e0SWillem de Bruijn [ $ovr == "setsock" ] && m="-C" 922e5584e0SWillem de Bruijn [ $ovr == "cmsg" ] && m="-c" 932e5584e0SWillem de Bruijn [ $ovr == "both" ] && m="-C $((TOS2)) -c" 942e5584e0SWillem de Bruijn [ $ovr == "diff" ] && m="-C $((TOS )) -c" 952e5584e0SWillem de Bruijn 962e5584e0SWillem de Bruijn $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null & 972e5584e0SWillem de Bruijn BG=$! 982e5584e0SWillem de Bruijn sleep 0.05 992e5584e0SWillem de Bruijn 1002e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS2)) $TGT 1234 1012e5584e0SWillem de Bruijn check_result $? 0 "$MATCH $prot $ovr - pass" 1022e5584e0SWillem de Bruijn 1032e5584e0SWillem de Bruijn while [ -d /proc/$BG ]; do 1042e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS2)) $TGT 1234 1052e5584e0SWillem de Bruijn done 1062e5584e0SWillem de Bruijn 1072e5584e0SWillem de Bruijn tcpdump -r $TMPF -v 2>&1 | grep "$MATCH $TOS2" >> /dev/null 1082e5584e0SWillem de Bruijn check_result $? 0 "$MATCH $prot $ovr - packet data" 1092e5584e0SWillem de Bruijn rm $TMPF 1102e5584e0SWillem de Bruijn 1112e5584e0SWillem de Bruijn [ $ovr == "both" ] && m="-C $((TOS )) -c" 1122e5584e0SWillem de Bruijn [ $ovr == "diff" ] && m="-C $((TOS2)) -c" 1132e5584e0SWillem de Bruijn 1142e5584e0SWillem de Bruijn # Match prohibit rule: expect failure 1152e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS)) -s $TGT 1234 1162e5584e0SWillem de Bruijn check_result $? 1 "$MATCH $prot $ovr - rejection" 1172e5584e0SWillem de Bruijn 1182e5584e0SWillem de Bruijn # Match prohibit rule: IPv4 masks ECN: expect failure 1192e5584e0SWillem de Bruijn if [[ "$IPVER" == "-4" ]]; then 1202e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m "$((TOS | ECN))" -s $TGT 1234 1212e5584e0SWillem de Bruijn check_result $? 1 "$MATCH $prot $ovr - rejection (ECN)" 1222e5584e0SWillem de Bruijn fi 1232e5584e0SWillem de Bruijn done 1242e5584e0SWillem de Bruijn done 1252e5584e0SWillem de Bruijn} 1262e5584e0SWillem de Bruijn 1272e5584e0SWillem de Bruijntest_dscp -4 $TGT4 tos 1282e5584e0SWillem de Bruijntest_dscp -6 $TGT6 class 1292e5584e0SWillem de Bruijn 1302e5584e0SWillem de Bruijn# IP_TTL + IPV6_HOPLIMIT 1312e5584e0SWillem de Bruijntest_ttl_hoplimit() { 1322e5584e0SWillem de Bruijn local -r IPVER=$1 1332e5584e0SWillem de Bruijn local -r TGT=$2 1342e5584e0SWillem de Bruijn local -r MATCH=$3 1352e5584e0SWillem de Bruijn 1362e5584e0SWillem de Bruijn local -r LIM=4 1372e5584e0SWillem de Bruijn 1382e5584e0SWillem de Bruijn for ovr in setsock cmsg both diff; do 139*0922cb68SWillem de Bruijn for p in u U i r; do 1402e5584e0SWillem de Bruijn [ $p == "u" ] && prot=UDP 141*0922cb68SWillem de Bruijn [ $p == "U" ] && prot=UDP 1422e5584e0SWillem de Bruijn [ $p == "i" ] && prot=ICMP 1432e5584e0SWillem de Bruijn [ $p == "r" ] && prot=RAW 1442e5584e0SWillem de Bruijn 1452e5584e0SWillem de Bruijn [ $ovr == "setsock" ] && m="-L" 1462e5584e0SWillem de Bruijn [ $ovr == "cmsg" ] && m="-l" 1472e5584e0SWillem de Bruijn [ $ovr == "both" ] && m="-L $LIM -l" 1482e5584e0SWillem de Bruijn [ $ovr == "diff" ] && m="-L $((LIM + 1)) -l" 1492e5584e0SWillem de Bruijn 1502e5584e0SWillem de Bruijn $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null & 1512e5584e0SWillem de Bruijn BG=$! 1522e5584e0SWillem de Bruijn sleep 0.05 1532e5584e0SWillem de Bruijn 1542e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m $LIM $TGT 1234 1552e5584e0SWillem de Bruijn check_result $? 0 "$MATCH $prot $ovr - pass" 1562e5584e0SWillem de Bruijn 1572e5584e0SWillem de Bruijn while [ -d /proc/$BG ]; do 1582e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m $LIM $TGT 1234 1592e5584e0SWillem de Bruijn done 1602e5584e0SWillem de Bruijn 1612e5584e0SWillem de Bruijn tcpdump -r $TMPF -v 2>&1 | grep "$MATCH $LIM[^0-9]" >> /dev/null 1622e5584e0SWillem de Bruijn check_result $? 0 "$MATCH $prot $ovr - packet data" 1632e5584e0SWillem de Bruijn rm $TMPF 1642e5584e0SWillem de Bruijn done 1652e5584e0SWillem de Bruijn done 1662e5584e0SWillem de Bruijn} 1672e5584e0SWillem de Bruijn 1682e5584e0SWillem de Bruijntest_ttl_hoplimit -4 $TGT4 ttl 1692e5584e0SWillem de Bruijntest_ttl_hoplimit -6 $TGT6 hlim 1702e5584e0SWillem de Bruijn 1712e5584e0SWillem de Bruijn# IPV6 exthdr 172*0922cb68SWillem de Bruijnfor p in u U i r; do 1732e5584e0SWillem de Bruijn # Very basic "does it crash" test 1742e5584e0SWillem de Bruijn for h in h d r; do 1752e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender -p $p -6 -H $h $TGT6 1234 1762e5584e0SWillem de Bruijn check_result $? 0 "ExtHdr $prot $ovr - pass" 1772e5584e0SWillem de Bruijn done 1782e5584e0SWillem de Bruijndone 1792e5584e0SWillem de Bruijn 1802e5584e0SWillem de Bruijn# Summary 1812e5584e0SWillem de Bruijnif [ $BAD -ne 0 ]; then 1822e5584e0SWillem de Bruijn echo "FAIL - $BAD/$TOTAL cases failed" 1832e5584e0SWillem de Bruijn exit 1 1842e5584e0SWillem de Bruijnelse 1852e5584e0SWillem de Bruijn echo "OK" 1862e5584e0SWillem de Bruijn exit 0 1872e5584e0SWillem de Bruijnfi 188