155 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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 $p $m $((TOS2)) $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 $p $m $LIM $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
 |