155 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4source lib.sh5 6IP6=2001:db8:1::1/647TGT6=2001:db8:1::28TMPF=$(mktemp --suffix ".pcap")9 10cleanup()11{12 rm -f $TMPF13 cleanup_ns $NS14}15 16trap cleanup EXIT17 18tcpdump -h | grep immediate-mode >> /dev/null19if [ $? -ne 0 ]; then20 echo "SKIP - tcpdump with --immediate-mode option required"21 exit $ksft_skip22fi23 24# Namespaces25setup_ns NS26NSEXE="ip netns exec $NS"27 28$NSEXE sysctl -w net.ipv4.ping_group_range='0 2147483647' > /dev/null29 30# Connectivity31ip -netns $NS link add type dummy32ip -netns $NS link set dev dummy0 up33ip -netns $NS addr add $IP6 dev dummy034 35# Test36BAD=037TOTAL=038 39check_result() {40 ((TOTAL++))41 if [ $1 -ne $2 ]; then42 echo " Case $3 returned $1, expected $2"43 ((BAD++))44 fi45}46 47# IPV6_DONTFRAG48for ovr in setsock cmsg both diff; do49 for df in 0 1; do50 for p in u i r; do51 [ $p == "u" ] && prot=UDP52 [ $p == "i" ] && prot=ICMP53 [ $p == "r" ] && prot=RAW54 55 [ $ovr == "setsock" ] && m="-F $df"56 [ $ovr == "cmsg" ] && m="-f $df"57 [ $ovr == "both" ] && m="-F $df -f $df"58 [ $ovr == "diff" ] && m="-F $((1 - df)) -f $df"59 60 $NSEXE ./cmsg_sender -s -S 2000 -6 -p $p $m $TGT6 123461 check_result $? $df "DONTFRAG $prot $ovr"62 done63 done64done65 66# IPV6_TCLASS67TOS=0x1068TOS2=0x2069 70ip -6 -netns $NS rule add tos $TOS lookup 30071ip -6 -netns $NS route add table 300 prohibit any72 73for ovr in setsock cmsg both diff; do74 for p in u i r; do75 [ $p == "u" ] && prot=UDP76 [ $p == "i" ] && prot=ICMP77 [ $p == "r" ] && prot=RAW78 79 [ $ovr == "setsock" ] && m="-C"80 [ $ovr == "cmsg" ] && m="-c"81 [ $ovr == "both" ] && m="-C $((TOS2)) -c"82 [ $ovr == "diff" ] && m="-C $((TOS )) -c"83 84 $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &85 BG=$!86 sleep 0.0587 88 $NSEXE ./cmsg_sender -6 -p $p $m $((TOS2)) $TGT6 123489 check_result $? 0 "TCLASS $prot $ovr - pass"90 91 while [ -d /proc/$BG ]; do92 $NSEXE ./cmsg_sender -6 -p $p $m $((TOS2)) $TGT6 123493 done94 95 tcpdump -r $TMPF -v 2>&1 | grep "class $TOS2" >> /dev/null96 check_result $? 0 "TCLASS $prot $ovr - packet data"97 rm $TMPF98 99 [ $ovr == "both" ] && m="-C $((TOS )) -c"100 [ $ovr == "diff" ] && m="-C $((TOS2)) -c"101 102 $NSEXE ./cmsg_sender -6 -p $p $m $((TOS)) -s $TGT6 1234103 check_result $? 1 "TCLASS $prot $ovr - rejection"104 done105done106 107# IPV6_HOPLIMIT108LIM=4109 110for ovr in setsock cmsg both diff; do111 for p in u i r; do112 [ $p == "u" ] && prot=UDP113 [ $p == "i" ] && prot=ICMP114 [ $p == "r" ] && prot=RAW115 116 [ $ovr == "setsock" ] && m="-L"117 [ $ovr == "cmsg" ] && m="-l"118 [ $ovr == "both" ] && m="-L $LIM -l"119 [ $ovr == "diff" ] && m="-L $((LIM + 1)) -l"120 121 $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &122 BG=$!123 sleep 0.05124 125 $NSEXE ./cmsg_sender -6 -p $p $m $LIM $TGT6 1234126 check_result $? 0 "HOPLIMIT $prot $ovr - pass"127 128 while [ -d /proc/$BG ]; do129 $NSEXE ./cmsg_sender -6 -p $p $m $LIM $TGT6 1234130 done131 132 tcpdump -r $TMPF -v 2>&1 | grep "hlim $LIM[^0-9]" >> /dev/null133 check_result $? 0 "HOPLIMIT $prot $ovr - packet data"134 rm $TMPF135 done136done137 138# IPV6 exthdr139for p in u i r; do140 # Very basic "does it crash" test141 for h in h d r; do142 $NSEXE ./cmsg_sender -p $p -6 -H $h $TGT6 1234143 check_result $? 0 "ExtHdr $prot $ovr - pass"144 done145done146 147# Summary148if [ $BAD -ne 0 ]; then149 echo "FAIL - $BAD/$TOTAL cases failed"150 exit 1151else152 echo "OK"153 exit 0154fi155