| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| source lib.sh |
| |
| IP6=2001:db8:1::1/64 |
| TGT6=2001:db8:1::2 |
| TMPF=$(mktemp --suffix ".pcap") |
| |
| cleanup() |
| { |
| rm -f $TMPF |
| cleanup_ns $NS |
| } |
| |
| trap cleanup EXIT |
| |
| tcpdump -h | grep immediate-mode >> /dev/null |
| if [ $? -ne 0 ]; then |
| echo "SKIP - tcpdump with --immediate-mode option required" |
| exit $ksft_skip |
| fi |
| |
| # Namespaces |
| setup_ns NS |
| NSEXE="ip netns exec $NS" |
| |
| $NSEXE sysctl -w net.ipv4.ping_group_range='0 2147483647' > /dev/null |
| |
| # Connectivity |
| ip -netns $NS link add type dummy |
| ip -netns $NS link set dev dummy0 up |
| ip -netns $NS addr add $IP6 dev dummy0 |
| |
| # Test |
| BAD=0 |
| TOTAL=0 |
| |
| check_result() { |
| ((TOTAL++)) |
| if [ $1 -ne $2 ]; then |
| echo " Case $3 returned $1, expected $2" |
| ((BAD++)) |
| fi |
| } |
| |
| # IPV6_DONTFRAG |
| for ovr in setsock cmsg both diff; do |
| for df in 0 1; do |
| for p in u i r; do |
| [ $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 |
| done |
| done |
| |
| # IPV6_TCLASS |
| TOS=0x10 |
| TOS2=0x20 |
| |
| ip -6 -netns $NS rule add tos $TOS lookup 300 |
| ip -6 -netns $NS route add table 300 prohibit any |
| |
| for ovr in setsock cmsg both diff; do |
| for p in u i r; do |
| [ $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 -6 -p $p $m $((TOS2)) $TGT6 1234 |
| check_result $? 0 "TCLASS $prot $ovr - pass" |
| |
| while [ -d /proc/$BG ]; do |
| $NSEXE ./cmsg_sender -6 -p u $TGT6 1234 |
| done |
| |
| tcpdump -r $TMPF -v 2>&1 | grep "class $TOS2" >> /dev/null |
| check_result $? 0 "TCLASS $prot $ovr - packet data" |
| rm $TMPF |
| |
| [ $ovr == "both" ] && m="-C $((TOS )) -c" |
| [ $ovr == "diff" ] && m="-C $((TOS2)) -c" |
| |
| $NSEXE ./cmsg_sender -6 -p $p $m $((TOS)) -s $TGT6 1234 |
| check_result $? 1 "TCLASS $prot $ovr - rejection" |
| done |
| done |
| |
| # IPV6_HOPLIMIT |
| LIM=4 |
| |
| for ovr in setsock cmsg both diff; do |
| for p in u i r; do |
| [ $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 -6 -p $p $m $LIM $TGT6 1234 |
| check_result $? 0 "HOPLIMIT $prot $ovr - pass" |
| |
| while [ -d /proc/$BG ]; do |
| $NSEXE ./cmsg_sender -6 -p u $TGT6 1234 |
| done |
| |
| tcpdump -r $TMPF -v 2>&1 | grep "hlim $LIM[^0-9]" >> /dev/null |
| check_result $? 0 "HOPLIMIT $prot $ovr - packet data" |
| rm $TMPF |
| done |
| done |
| |
| # IPV6 exthdr |
| for p in 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" |
| done |
| done |
| |
| # Summary |
| if [ $BAD -ne 0 ]; then |
| echo "FAIL - $BAD/$TOTAL cases failed" |
| exit 1 |
| else |
| echo "OK" |
| exit 0 |
| fi |