xref: /linux/tools/testing/selftests/net/cmsg_ip.sh (revision 1a9239bb4253f9076b5b4b2a1a4e8d7defd77a95)
12e5584e0SWillem de Bruijn#!/bin/bash
22e5584e0SWillem de Bruijn# SPDX-License-Identifier: GPL-2.0
32e5584e0SWillem de Bruijn
42e5584e0SWillem de Bruijnsource lib.sh
52e5584e0SWillem de Bruijn
62e5584e0SWillem de BruijnIP4=172.16.0.1/24
72e5584e0SWillem de BruijnTGT4=172.16.0.2
82e5584e0SWillem de BruijnIP6=2001:db8:1::1/64
92e5584e0SWillem de BruijnTGT6=2001:db8:1::2
102e5584e0SWillem de BruijnTMPF=$(mktemp --suffix ".pcap")
112e5584e0SWillem de Bruijn
122e5584e0SWillem de Bruijncleanup()
132e5584e0SWillem de Bruijn{
142e5584e0SWillem de Bruijn    rm -f $TMPF
152e5584e0SWillem de Bruijn    cleanup_ns $NS
162e5584e0SWillem de Bruijn}
172e5584e0SWillem de Bruijn
182e5584e0SWillem de Bruijntrap cleanup EXIT
192e5584e0SWillem de Bruijn
202e5584e0SWillem de Bruijntcpdump -h | grep immediate-mode >> /dev/null
212e5584e0SWillem de Bruijnif [ $? -ne 0 ]; then
222e5584e0SWillem de Bruijn    echo "SKIP - tcpdump with --immediate-mode option required"
232e5584e0SWillem de Bruijn    exit $ksft_skip
242e5584e0SWillem de Bruijnfi
252e5584e0SWillem de Bruijn
262e5584e0SWillem de Bruijn# Namespaces
272e5584e0SWillem de Bruijnsetup_ns NS
282e5584e0SWillem de BruijnNSEXE="ip netns exec $NS"
292e5584e0SWillem de Bruijn
302e5584e0SWillem de Bruijn$NSEXE sysctl -w net.ipv4.ping_group_range='0 2147483647' > /dev/null
312e5584e0SWillem de Bruijn
322e5584e0SWillem de Bruijn# Connectivity
332e5584e0SWillem de Bruijnip -netns $NS link add type dummy
342e5584e0SWillem de Bruijnip -netns $NS link set dev dummy0 up
352e5584e0SWillem de Bruijnip -netns $NS addr add $IP4 dev dummy0
362e5584e0SWillem de Bruijnip -netns $NS addr add $IP6 dev dummy0
372e5584e0SWillem de Bruijn
382e5584e0SWillem de Bruijn# Test
392e5584e0SWillem de BruijnBAD=0
402e5584e0SWillem de BruijnTOTAL=0
412e5584e0SWillem de Bruijn
422e5584e0SWillem de Bruijncheck_result() {
432e5584e0SWillem de Bruijn    ((TOTAL++))
442e5584e0SWillem de Bruijn    if [ $1 -ne $2 ]; then
452e5584e0SWillem de Bruijn	echo "  Case $3 returned $1, expected $2"
462e5584e0SWillem de Bruijn	((BAD++))
472e5584e0SWillem de Bruijn    fi
482e5584e0SWillem de Bruijn}
492e5584e0SWillem de Bruijn
502e5584e0SWillem de Bruijn# IPV6_DONTFRAG
512e5584e0SWillem de Bruijnfor ovr in setsock cmsg both diff; do
522e5584e0SWillem de Bruijn    for df in 0 1; do
53*0922cb68SWillem de Bruijn	for p in u U i r; do
542e5584e0SWillem de Bruijn	    [ $p == "u" ] && prot=UDP
55*0922cb68SWillem de Bruijn	    [ $p == "U" ] && prot=UDP
562e5584e0SWillem de Bruijn	    [ $p == "i" ] && prot=ICMP
572e5584e0SWillem de Bruijn	    [ $p == "r" ] && prot=RAW
582e5584e0SWillem de Bruijn
592e5584e0SWillem de Bruijn	    [ $ovr == "setsock" ] && m="-F $df"
602e5584e0SWillem de Bruijn	    [ $ovr == "cmsg" ]    && m="-f $df"
612e5584e0SWillem de Bruijn	    [ $ovr == "both" ]    && m="-F $df -f $df"
622e5584e0SWillem de Bruijn	    [ $ovr == "diff" ]    && m="-F $((1 - df)) -f $df"
632e5584e0SWillem de Bruijn
642e5584e0SWillem de Bruijn	    $NSEXE ./cmsg_sender -s -S 2000 -6 -p $p $m $TGT6 1234
652e5584e0SWillem de Bruijn	    check_result $? $df "DONTFRAG $prot $ovr"
662e5584e0SWillem de Bruijn	done
672e5584e0SWillem de Bruijn    done
682e5584e0SWillem de Bruijndone
692e5584e0SWillem de Bruijn
702e5584e0SWillem de Bruijn# IP_TOS + IPV6_TCLASS
712e5584e0SWillem de Bruijn
722e5584e0SWillem de Bruijntest_dscp() {
732e5584e0SWillem de Bruijn    local -r IPVER=$1
742e5584e0SWillem de Bruijn    local -r TGT=$2
752e5584e0SWillem de Bruijn    local -r MATCH=$3
762e5584e0SWillem de Bruijn
772e5584e0SWillem de Bruijn    local -r TOS=0x10
782e5584e0SWillem de Bruijn    local -r TOS2=0x20
792e5584e0SWillem de Bruijn    local -r ECN=0x3
802e5584e0SWillem de Bruijn
812e5584e0SWillem de Bruijn    ip $IPVER -netns $NS rule add tos $TOS lookup 300
822e5584e0SWillem de Bruijn    ip $IPVER -netns $NS route add table 300 prohibit any
832e5584e0SWillem de Bruijn
842e5584e0SWillem de Bruijn    for ovr in setsock cmsg both diff; do
85*0922cb68SWillem de Bruijn	for p in u U i r; do
862e5584e0SWillem de Bruijn	    [ $p == "u" ] && prot=UDP
87*0922cb68SWillem de Bruijn	    [ $p == "U" ] && prot=UDP
882e5584e0SWillem de Bruijn	    [ $p == "i" ] && prot=ICMP
892e5584e0SWillem de Bruijn	    [ $p == "r" ] && prot=RAW
902e5584e0SWillem de Bruijn
912e5584e0SWillem de Bruijn	    [ $ovr == "setsock" ] && m="-C"
922e5584e0SWillem de Bruijn	    [ $ovr == "cmsg" ]    && m="-c"
932e5584e0SWillem de Bruijn	    [ $ovr == "both" ]    && m="-C $((TOS2)) -c"
942e5584e0SWillem de Bruijn	    [ $ovr == "diff" ]    && m="-C $((TOS )) -c"
952e5584e0SWillem de Bruijn
962e5584e0SWillem de Bruijn	    $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &
972e5584e0SWillem de Bruijn	    BG=$!
982e5584e0SWillem de Bruijn	    sleep 0.05
992e5584e0SWillem de Bruijn
1002e5584e0SWillem de Bruijn	    $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS2)) $TGT 1234
1012e5584e0SWillem de Bruijn	    check_result $? 0 "$MATCH $prot $ovr - pass"
1022e5584e0SWillem de Bruijn
1032e5584e0SWillem de Bruijn	    while [ -d /proc/$BG ]; do
1042e5584e0SWillem de Bruijn	        $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS2)) $TGT 1234
1052e5584e0SWillem de Bruijn	    done
1062e5584e0SWillem de Bruijn
1072e5584e0SWillem de Bruijn	    tcpdump -r $TMPF -v 2>&1 | grep "$MATCH $TOS2" >> /dev/null
1082e5584e0SWillem de Bruijn	    check_result $? 0 "$MATCH $prot $ovr - packet data"
1092e5584e0SWillem de Bruijn	    rm $TMPF
1102e5584e0SWillem de Bruijn
1112e5584e0SWillem de Bruijn	    [ $ovr == "both" ]    && m="-C $((TOS )) -c"
1122e5584e0SWillem de Bruijn	    [ $ovr == "diff" ]    && m="-C $((TOS2)) -c"
1132e5584e0SWillem de Bruijn
1142e5584e0SWillem de Bruijn	    # Match prohibit rule: expect failure
1152e5584e0SWillem de Bruijn	    $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS)) -s $TGT 1234
1162e5584e0SWillem de Bruijn	    check_result $? 1 "$MATCH $prot $ovr - rejection"
1172e5584e0SWillem de Bruijn
1182e5584e0SWillem de Bruijn	    # Match prohibit rule: IPv4 masks ECN: expect failure
1192e5584e0SWillem de Bruijn	    if [[ "$IPVER" == "-4" ]]; then
1202e5584e0SWillem de Bruijn		$NSEXE ./cmsg_sender $IPVER -p $p $m "$((TOS | ECN))" -s $TGT 1234
1212e5584e0SWillem de Bruijn		check_result $? 1 "$MATCH $prot $ovr - rejection (ECN)"
1222e5584e0SWillem de Bruijn	    fi
1232e5584e0SWillem de Bruijn	done
1242e5584e0SWillem de Bruijn    done
1252e5584e0SWillem de Bruijn}
1262e5584e0SWillem de Bruijn
1272e5584e0SWillem de Bruijntest_dscp -4 $TGT4 tos
1282e5584e0SWillem de Bruijntest_dscp -6 $TGT6 class
1292e5584e0SWillem de Bruijn
1302e5584e0SWillem de Bruijn# IP_TTL + IPV6_HOPLIMIT
1312e5584e0SWillem de Bruijntest_ttl_hoplimit() {
1322e5584e0SWillem de Bruijn    local -r IPVER=$1
1332e5584e0SWillem de Bruijn    local -r TGT=$2
1342e5584e0SWillem de Bruijn    local -r MATCH=$3
1352e5584e0SWillem de Bruijn
1362e5584e0SWillem de Bruijn    local -r LIM=4
1372e5584e0SWillem de Bruijn
1382e5584e0SWillem de Bruijn    for ovr in setsock cmsg both diff; do
139*0922cb68SWillem de Bruijn	for p in u U i r; do
1402e5584e0SWillem de Bruijn	    [ $p == "u" ] && prot=UDP
141*0922cb68SWillem de Bruijn	    [ $p == "U" ] && prot=UDP
1422e5584e0SWillem de Bruijn	    [ $p == "i" ] && prot=ICMP
1432e5584e0SWillem de Bruijn	    [ $p == "r" ] && prot=RAW
1442e5584e0SWillem de Bruijn
1452e5584e0SWillem de Bruijn	    [ $ovr == "setsock" ] && m="-L"
1462e5584e0SWillem de Bruijn	    [ $ovr == "cmsg" ]    && m="-l"
1472e5584e0SWillem de Bruijn	    [ $ovr == "both" ]    && m="-L $LIM -l"
1482e5584e0SWillem de Bruijn	    [ $ovr == "diff" ]    && m="-L $((LIM + 1)) -l"
1492e5584e0SWillem de Bruijn
1502e5584e0SWillem de Bruijn	    $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &
1512e5584e0SWillem de Bruijn	    BG=$!
1522e5584e0SWillem de Bruijn	    sleep 0.05
1532e5584e0SWillem de Bruijn
1542e5584e0SWillem de Bruijn	    $NSEXE ./cmsg_sender $IPVER -p $p $m $LIM $TGT 1234
1552e5584e0SWillem de Bruijn	    check_result $? 0 "$MATCH $prot $ovr - pass"
1562e5584e0SWillem de Bruijn
1572e5584e0SWillem de Bruijn	    while [ -d /proc/$BG ]; do
1582e5584e0SWillem de Bruijn		$NSEXE ./cmsg_sender $IPVER -p $p $m $LIM $TGT 1234
1592e5584e0SWillem de Bruijn	    done
1602e5584e0SWillem de Bruijn
1612e5584e0SWillem de Bruijn	    tcpdump -r $TMPF -v 2>&1 | grep "$MATCH $LIM[^0-9]" >> /dev/null
1622e5584e0SWillem de Bruijn	    check_result $? 0 "$MATCH $prot $ovr - packet data"
1632e5584e0SWillem de Bruijn	    rm $TMPF
1642e5584e0SWillem de Bruijn	done
1652e5584e0SWillem de Bruijn    done
1662e5584e0SWillem de Bruijn}
1672e5584e0SWillem de Bruijn
1682e5584e0SWillem de Bruijntest_ttl_hoplimit -4 $TGT4 ttl
1692e5584e0SWillem de Bruijntest_ttl_hoplimit -6 $TGT6 hlim
1702e5584e0SWillem de Bruijn
1712e5584e0SWillem de Bruijn# IPV6 exthdr
172*0922cb68SWillem de Bruijnfor p in u U i r; do
1732e5584e0SWillem de Bruijn    # Very basic "does it crash" test
1742e5584e0SWillem de Bruijn    for h in h d r; do
1752e5584e0SWillem de Bruijn	$NSEXE ./cmsg_sender -p $p -6 -H $h $TGT6 1234
1762e5584e0SWillem de Bruijn	check_result $? 0 "ExtHdr $prot $ovr - pass"
1772e5584e0SWillem de Bruijn    done
1782e5584e0SWillem de Bruijndone
1792e5584e0SWillem de Bruijn
1802e5584e0SWillem de Bruijn# Summary
1812e5584e0SWillem de Bruijnif [ $BAD -ne 0 ]; then
1822e5584e0SWillem de Bruijn    echo "FAIL - $BAD/$TOTAL cases failed"
1832e5584e0SWillem de Bruijn    exit 1
1842e5584e0SWillem de Bruijnelse
1852e5584e0SWillem de Bruijn    echo "OK"
1862e5584e0SWillem de Bruijn    exit 0
1872e5584e0SWillem de Bruijnfi
188