1*2e5584e0SWillem de Bruijn#!/bin/bash 2*2e5584e0SWillem de Bruijn# SPDX-License-Identifier: GPL-2.0 3*2e5584e0SWillem de Bruijn 4*2e5584e0SWillem de Bruijnsource lib.sh 5*2e5584e0SWillem de Bruijn 6*2e5584e0SWillem de BruijnIP4=172.16.0.1/24 7*2e5584e0SWillem de BruijnTGT4=172.16.0.2 8*2e5584e0SWillem de BruijnIP6=2001:db8:1::1/64 9*2e5584e0SWillem de BruijnTGT6=2001:db8:1::2 10*2e5584e0SWillem de BruijnTMPF=$(mktemp --suffix ".pcap") 11*2e5584e0SWillem de Bruijn 12*2e5584e0SWillem de Bruijncleanup() 13*2e5584e0SWillem de Bruijn{ 14*2e5584e0SWillem de Bruijn rm -f $TMPF 15*2e5584e0SWillem de Bruijn cleanup_ns $NS 16*2e5584e0SWillem de Bruijn} 17*2e5584e0SWillem de Bruijn 18*2e5584e0SWillem de Bruijntrap cleanup EXIT 19*2e5584e0SWillem de Bruijn 20*2e5584e0SWillem de Bruijntcpdump -h | grep immediate-mode >> /dev/null 21*2e5584e0SWillem de Bruijnif [ $? -ne 0 ]; then 22*2e5584e0SWillem de Bruijn echo "SKIP - tcpdump with --immediate-mode option required" 23*2e5584e0SWillem de Bruijn exit $ksft_skip 24*2e5584e0SWillem de Bruijnfi 25*2e5584e0SWillem de Bruijn 26*2e5584e0SWillem de Bruijn# Namespaces 27*2e5584e0SWillem de Bruijnsetup_ns NS 28*2e5584e0SWillem de BruijnNSEXE="ip netns exec $NS" 29*2e5584e0SWillem de Bruijn 30*2e5584e0SWillem de Bruijn$NSEXE sysctl -w net.ipv4.ping_group_range='0 2147483647' > /dev/null 31*2e5584e0SWillem de Bruijn 32*2e5584e0SWillem de Bruijn# Connectivity 33*2e5584e0SWillem de Bruijnip -netns $NS link add type dummy 34*2e5584e0SWillem de Bruijnip -netns $NS link set dev dummy0 up 35*2e5584e0SWillem de Bruijnip -netns $NS addr add $IP4 dev dummy0 36*2e5584e0SWillem de Bruijnip -netns $NS addr add $IP6 dev dummy0 37*2e5584e0SWillem de Bruijn 38*2e5584e0SWillem de Bruijn# Test 39*2e5584e0SWillem de BruijnBAD=0 40*2e5584e0SWillem de BruijnTOTAL=0 41*2e5584e0SWillem de Bruijn 42*2e5584e0SWillem de Bruijncheck_result() { 43*2e5584e0SWillem de Bruijn ((TOTAL++)) 44*2e5584e0SWillem de Bruijn if [ $1 -ne $2 ]; then 45*2e5584e0SWillem de Bruijn echo " Case $3 returned $1, expected $2" 46*2e5584e0SWillem de Bruijn ((BAD++)) 47*2e5584e0SWillem de Bruijn fi 48*2e5584e0SWillem de Bruijn} 49*2e5584e0SWillem de Bruijn 50*2e5584e0SWillem de Bruijn# IPV6_DONTFRAG 51*2e5584e0SWillem de Bruijnfor ovr in setsock cmsg both diff; do 52*2e5584e0SWillem de Bruijn for df in 0 1; do 53*2e5584e0SWillem de Bruijn for p in u i r; do 54*2e5584e0SWillem de Bruijn [ $p == "u" ] && prot=UDP 55*2e5584e0SWillem de Bruijn [ $p == "i" ] && prot=ICMP 56*2e5584e0SWillem de Bruijn [ $p == "r" ] && prot=RAW 57*2e5584e0SWillem de Bruijn 58*2e5584e0SWillem de Bruijn [ $ovr == "setsock" ] && m="-F $df" 59*2e5584e0SWillem de Bruijn [ $ovr == "cmsg" ] && m="-f $df" 60*2e5584e0SWillem de Bruijn [ $ovr == "both" ] && m="-F $df -f $df" 61*2e5584e0SWillem de Bruijn [ $ovr == "diff" ] && m="-F $((1 - df)) -f $df" 62*2e5584e0SWillem de Bruijn 63*2e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender -s -S 2000 -6 -p $p $m $TGT6 1234 64*2e5584e0SWillem de Bruijn check_result $? $df "DONTFRAG $prot $ovr" 65*2e5584e0SWillem de Bruijn done 66*2e5584e0SWillem de Bruijn done 67*2e5584e0SWillem de Bruijndone 68*2e5584e0SWillem de Bruijn 69*2e5584e0SWillem de Bruijn# IP_TOS + IPV6_TCLASS 70*2e5584e0SWillem de Bruijn 71*2e5584e0SWillem de Bruijntest_dscp() { 72*2e5584e0SWillem de Bruijn local -r IPVER=$1 73*2e5584e0SWillem de Bruijn local -r TGT=$2 74*2e5584e0SWillem de Bruijn local -r MATCH=$3 75*2e5584e0SWillem de Bruijn 76*2e5584e0SWillem de Bruijn local -r TOS=0x10 77*2e5584e0SWillem de Bruijn local -r TOS2=0x20 78*2e5584e0SWillem de Bruijn local -r ECN=0x3 79*2e5584e0SWillem de Bruijn 80*2e5584e0SWillem de Bruijn ip $IPVER -netns $NS rule add tos $TOS lookup 300 81*2e5584e0SWillem de Bruijn ip $IPVER -netns $NS route add table 300 prohibit any 82*2e5584e0SWillem de Bruijn 83*2e5584e0SWillem de Bruijn for ovr in setsock cmsg both diff; do 84*2e5584e0SWillem de Bruijn for p in u i r; do 85*2e5584e0SWillem de Bruijn [ $p == "u" ] && prot=UDP 86*2e5584e0SWillem de Bruijn [ $p == "i" ] && prot=ICMP 87*2e5584e0SWillem de Bruijn [ $p == "r" ] && prot=RAW 88*2e5584e0SWillem de Bruijn 89*2e5584e0SWillem de Bruijn [ $ovr == "setsock" ] && m="-C" 90*2e5584e0SWillem de Bruijn [ $ovr == "cmsg" ] && m="-c" 91*2e5584e0SWillem de Bruijn [ $ovr == "both" ] && m="-C $((TOS2)) -c" 92*2e5584e0SWillem de Bruijn [ $ovr == "diff" ] && m="-C $((TOS )) -c" 93*2e5584e0SWillem de Bruijn 94*2e5584e0SWillem de Bruijn $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null & 95*2e5584e0SWillem de Bruijn BG=$! 96*2e5584e0SWillem de Bruijn sleep 0.05 97*2e5584e0SWillem de Bruijn 98*2e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS2)) $TGT 1234 99*2e5584e0SWillem de Bruijn check_result $? 0 "$MATCH $prot $ovr - pass" 100*2e5584e0SWillem de Bruijn 101*2e5584e0SWillem de Bruijn while [ -d /proc/$BG ]; do 102*2e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS2)) $TGT 1234 103*2e5584e0SWillem de Bruijn done 104*2e5584e0SWillem de Bruijn 105*2e5584e0SWillem de Bruijn tcpdump -r $TMPF -v 2>&1 | grep "$MATCH $TOS2" >> /dev/null 106*2e5584e0SWillem de Bruijn check_result $? 0 "$MATCH $prot $ovr - packet data" 107*2e5584e0SWillem de Bruijn rm $TMPF 108*2e5584e0SWillem de Bruijn 109*2e5584e0SWillem de Bruijn [ $ovr == "both" ] && m="-C $((TOS )) -c" 110*2e5584e0SWillem de Bruijn [ $ovr == "diff" ] && m="-C $((TOS2)) -c" 111*2e5584e0SWillem de Bruijn 112*2e5584e0SWillem de Bruijn # Match prohibit rule: expect failure 113*2e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS)) -s $TGT 1234 114*2e5584e0SWillem de Bruijn check_result $? 1 "$MATCH $prot $ovr - rejection" 115*2e5584e0SWillem de Bruijn 116*2e5584e0SWillem de Bruijn # Match prohibit rule: IPv4 masks ECN: expect failure 117*2e5584e0SWillem de Bruijn if [[ "$IPVER" == "-4" ]]; then 118*2e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m "$((TOS | ECN))" -s $TGT 1234 119*2e5584e0SWillem de Bruijn check_result $? 1 "$MATCH $prot $ovr - rejection (ECN)" 120*2e5584e0SWillem de Bruijn fi 121*2e5584e0SWillem de Bruijn done 122*2e5584e0SWillem de Bruijn done 123*2e5584e0SWillem de Bruijn} 124*2e5584e0SWillem de Bruijn 125*2e5584e0SWillem de Bruijntest_dscp -4 $TGT4 tos 126*2e5584e0SWillem de Bruijntest_dscp -6 $TGT6 class 127*2e5584e0SWillem de Bruijn 128*2e5584e0SWillem de Bruijn# IP_TTL + IPV6_HOPLIMIT 129*2e5584e0SWillem de Bruijntest_ttl_hoplimit() { 130*2e5584e0SWillem de Bruijn local -r IPVER=$1 131*2e5584e0SWillem de Bruijn local -r TGT=$2 132*2e5584e0SWillem de Bruijn local -r MATCH=$3 133*2e5584e0SWillem de Bruijn 134*2e5584e0SWillem de Bruijn local -r LIM=4 135*2e5584e0SWillem de Bruijn 136*2e5584e0SWillem de Bruijn for ovr in setsock cmsg both diff; do 137*2e5584e0SWillem de Bruijn for p in u i r; do 138*2e5584e0SWillem de Bruijn [ $p == "u" ] && prot=UDP 139*2e5584e0SWillem de Bruijn [ $p == "i" ] && prot=ICMP 140*2e5584e0SWillem de Bruijn [ $p == "r" ] && prot=RAW 141*2e5584e0SWillem de Bruijn 142*2e5584e0SWillem de Bruijn [ $ovr == "setsock" ] && m="-L" 143*2e5584e0SWillem de Bruijn [ $ovr == "cmsg" ] && m="-l" 144*2e5584e0SWillem de Bruijn [ $ovr == "both" ] && m="-L $LIM -l" 145*2e5584e0SWillem de Bruijn [ $ovr == "diff" ] && m="-L $((LIM + 1)) -l" 146*2e5584e0SWillem de Bruijn 147*2e5584e0SWillem de Bruijn $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null & 148*2e5584e0SWillem de Bruijn BG=$! 149*2e5584e0SWillem de Bruijn sleep 0.05 150*2e5584e0SWillem de Bruijn 151*2e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m $LIM $TGT 1234 152*2e5584e0SWillem de Bruijn check_result $? 0 "$MATCH $prot $ovr - pass" 153*2e5584e0SWillem de Bruijn 154*2e5584e0SWillem de Bruijn while [ -d /proc/$BG ]; do 155*2e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender $IPVER -p $p $m $LIM $TGT 1234 156*2e5584e0SWillem de Bruijn done 157*2e5584e0SWillem de Bruijn 158*2e5584e0SWillem de Bruijn tcpdump -r $TMPF -v 2>&1 | grep "$MATCH $LIM[^0-9]" >> /dev/null 159*2e5584e0SWillem de Bruijn check_result $? 0 "$MATCH $prot $ovr - packet data" 160*2e5584e0SWillem de Bruijn rm $TMPF 161*2e5584e0SWillem de Bruijn done 162*2e5584e0SWillem de Bruijn done 163*2e5584e0SWillem de Bruijn} 164*2e5584e0SWillem de Bruijn 165*2e5584e0SWillem de Bruijntest_ttl_hoplimit -4 $TGT4 ttl 166*2e5584e0SWillem de Bruijntest_ttl_hoplimit -6 $TGT6 hlim 167*2e5584e0SWillem de Bruijn 168*2e5584e0SWillem de Bruijn# IPV6 exthdr 169*2e5584e0SWillem de Bruijnfor p in u i r; do 170*2e5584e0SWillem de Bruijn # Very basic "does it crash" test 171*2e5584e0SWillem de Bruijn for h in h d r; do 172*2e5584e0SWillem de Bruijn $NSEXE ./cmsg_sender -p $p -6 -H $h $TGT6 1234 173*2e5584e0SWillem de Bruijn check_result $? 0 "ExtHdr $prot $ovr - pass" 174*2e5584e0SWillem de Bruijn done 175*2e5584e0SWillem de Bruijndone 176*2e5584e0SWillem de Bruijn 177*2e5584e0SWillem de Bruijn# Summary 178*2e5584e0SWillem de Bruijnif [ $BAD -ne 0 ]; then 179*2e5584e0SWillem de Bruijn echo "FAIL - $BAD/$TOTAL cases failed" 180*2e5584e0SWillem de Bruijn exit 1 181*2e5584e0SWillem de Bruijnelse 182*2e5584e0SWillem de Bruijn echo "OK" 183*2e5584e0SWillem de Bruijn exit 0 184*2e5584e0SWillem de Bruijnfi 185