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