187 lines · 4.3 KB · Shell
RawDownload
#!/bin/bash# SPDX-License-Identifier: GPL-2.0 source lib.sh IP4=172.16.0.1/24TGT4=172.16.0.2IP6=2001:db8:1::1/64TGT6=2001:db8:1::2TMPF=$(mktemp --suffix ".pcap") cleanup(){    rm -f $TMPF    cleanup_ns $NS} trap cleanup EXIT tcpdump -h | grep immediate-mode >> /dev/nullif [ $? -ne 0 ]; then    echo "SKIP - tcpdump with --immediate-mode option required"    exit $ksft_skipfi # Namespacessetup_ns NSNSEXE="ip netns exec $NS" $NSEXE sysctl -w net.ipv4.ping_group_range='0 2147483647' > /dev/null # Connectivityip -netns $NS link add type dummyip -netns $NS link set dev dummy0 upip -netns $NS addr add $IP4 dev dummy0ip -netns $NS addr add $IP6 dev dummy0 # TestBAD=0TOTAL=0 check_result() {    ((TOTAL++))    if [ $1 -ne $2 ]; then	echo "  Case $3 returned $1, expected $2"	((BAD++))    fi} # IPV6_DONTFRAGfor ovr in setsock cmsg both diff; do    for df in 0 1; do	for p in u U i r; do	    [ $p == "u" ] && prot=UDP	    [ $p == "U" ] && prot=UDP	    [ $p == "i" ] && prot=ICMP	    [ $p == "r" ] && prot=RAW 	    [ $ovr == "setsock" ] && m="-F $df"	    [ $ovr == "cmsg" ]    && m="-f $df"	    [ $ovr == "both" ]    && m="-F $df -f $df"	    [ $ovr == "diff" ]    && m="-F $((1 - df)) -f $df" 	    $NSEXE ./cmsg_sender -s -S 2000 -6 -p $p $m $TGT6 1234	    check_result $? $df "DONTFRAG $prot $ovr"	done    donedone # IP_TOS + IPV6_TCLASS test_dscp() {    local -r IPVER=$1    local -r TGT=$2    local -r MATCH=$3     local -r TOS=0x10    local -r TOS2=0x20    local -r ECN=0x3     ip $IPVER -netns $NS rule add tos $TOS lookup 300    ip $IPVER -netns $NS route add table 300 prohibit any     for ovr in setsock cmsg both diff; do	for p in u U i r; do	    [ $p == "u" ] && prot=UDP	    [ $p == "U" ] && prot=UDP	    [ $p == "i" ] && prot=ICMP	    [ $p == "r" ] && prot=RAW 	    [ $ovr == "setsock" ] && m="-C"	    [ $ovr == "cmsg" ]    && m="-c"	    [ $ovr == "both" ]    && m="-C $((TOS2)) -c"	    [ $ovr == "diff" ]    && m="-C $((TOS )) -c" 	    $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &	    BG=$!	    sleep 0.05 	    $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS2)) $TGT 1234	    check_result $? 0 "$MATCH $prot $ovr - pass" 	    while [ -d /proc/$BG ]; do	        $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS2)) $TGT 1234	    done 	    tcpdump -r $TMPF -v 2>&1 | grep "$MATCH $TOS2" >> /dev/null	    check_result $? 0 "$MATCH $prot $ovr - packet data"	    rm $TMPF 	    [ $ovr == "both" ]    && m="-C $((TOS )) -c"	    [ $ovr == "diff" ]    && m="-C $((TOS2)) -c" 	    # Match prohibit rule: expect failure	    $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS)) -s $TGT 1234	    check_result $? 1 "$MATCH $prot $ovr - rejection" 	    # Match prohibit rule: IPv4 masks ECN: expect failure	    if [[ "$IPVER" == "-4" ]]; then		$NSEXE ./cmsg_sender $IPVER -p $p $m "$((TOS | ECN))" -s $TGT 1234		check_result $? 1 "$MATCH $prot $ovr - rejection (ECN)"	    fi	done    done} test_dscp -4 $TGT4 tostest_dscp -6 $TGT6 class # IP_TTL + IPV6_HOPLIMITtest_ttl_hoplimit() {    local -r IPVER=$1    local -r TGT=$2    local -r MATCH=$3     local -r LIM=4     for ovr in setsock cmsg both diff; do	for p in u U i r; do	    [ $p == "u" ] && prot=UDP	    [ $p == "U" ] && prot=UDP	    [ $p == "i" ] && prot=ICMP	    [ $p == "r" ] && prot=RAW 	    [ $ovr == "setsock" ] && m="-L"	    [ $ovr == "cmsg" ]    && m="-l"	    [ $ovr == "both" ]    && m="-L $LIM -l"	    [ $ovr == "diff" ]    && m="-L $((LIM + 1)) -l" 	    $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &	    BG=$!	    sleep 0.05 	    $NSEXE ./cmsg_sender $IPVER -p $p $m $LIM $TGT 1234	    check_result $? 0 "$MATCH $prot $ovr - pass" 	    while [ -d /proc/$BG ]; do		$NSEXE ./cmsg_sender $IPVER -p $p $m $LIM $TGT 1234	    done 	    tcpdump -r $TMPF -v 2>&1 | grep "$MATCH $LIM[^0-9]" >> /dev/null	    check_result $? 0 "$MATCH $prot $ovr - packet data"	    rm $TMPF	done    done} test_ttl_hoplimit -4 $TGT4 ttltest_ttl_hoplimit -6 $TGT6 hlim # IPV6 exthdrfor p in u U i r; do    # Very basic "does it crash" test    for h in h d r; do	$NSEXE ./cmsg_sender -p $p -6 -H $h $TGT6 1234	check_result $? 0 "ExtHdr $prot $ovr - pass"    donedone # Summaryif [ $BAD -ne 0 ]; then    echo "FAIL - $BAD/$TOTAL cases failed"    exit 1else    echo "OK"    exit 0fi