File Index
Files and directories
Sign in
FILE

cmsg_ip.sh

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/net/cmsg_ip.sh BASH
  1#!/bin/bash
  2# SPDX-License-Identifier: GPL-2.0
  3
  4source lib.sh
  5
  6IP4=172.16.0.1/24
  7TGT4=172.16.0.2
  8IP6=2001:db8:1::1/64
  9TGT6=2001:db8:1::2
 10TMPF=$(mktemp --suffix ".pcap")
 11
 12cleanup()
 13{
 14    rm -f $TMPF
 15    cleanup_ns $NS
 16}
 17
 18trap cleanup EXIT
 19
 20tcpdump -h | grep immediate-mode >> /dev/null
 21if [ $? -ne 0 ]; then
 22    echo "SKIP - tcpdump with --immediate-mode option required"
 23    exit $ksft_skip
 24fi
 25
 26# Namespaces
 27setup_ns NS
 28NSEXE="ip netns exec $NS"
 29
 30$NSEXE sysctl -w net.ipv4.ping_group_range='0 2147483647' > /dev/null
 31
 32# Connectivity
 33ip -netns $NS link add type dummy
 34ip -netns $NS link set dev dummy0 up
 35ip -netns $NS addr add $IP4 dev dummy0
 36ip -netns $NS addr add $IP6 dev dummy0
 37
 38# Test
 39BAD=0
 40TOTAL=0
 41
 42check_result() {
 43    ((TOTAL++))
 44    if [ $1 -ne $2 ]; then
 45	echo "  Case $3 returned $1, expected $2"
 46	((BAD++))
 47    fi
 48}
 49
 50# IPV6_DONTFRAG
 51for ovr in setsock cmsg both diff; do
 52    for df in 0 1; do
 53	for p in u U i r; do
 54	    [ $p == "u" ] && prot=UDP
 55	    [ $p == "U" ] && prot=UDP
 56	    [ $p == "i" ] && prot=ICMP
 57	    [ $p == "r" ] && prot=RAW
 58
 59	    [ $ovr == "setsock" ] && m="-F $df"
 60	    [ $ovr == "cmsg" ]    && m="-f $df"
 61	    [ $ovr == "both" ]    && m="-F $df -f $df"
 62	    [ $ovr == "diff" ]    && m="-F $((1 - df)) -f $df"
 63
 64	    $NSEXE ./cmsg_sender -s -S 2000 -6 -p $p $m $TGT6 1234
 65	    check_result $? $df "DONTFRAG $prot $ovr"
 66	done
 67    done
 68done
 69
 70# IP_TOS + IPV6_TCLASS
 71
 72test_dscp() {
 73    local -r IPVER=$1
 74    local -r TGT=$2
 75    local -r MATCH=$3
 76
 77    local -r TOS=0x10
 78    local -r TOS2=0x20
 79    local -r ECN=0x3
 80
 81    ip $IPVER -netns $NS rule add tos $TOS lookup 300
 82    ip $IPVER -netns $NS route add table 300 prohibit any
 83
 84    for ovr in setsock cmsg both diff; do
 85	for p in u U i r; do
 86	    [ $p == "u" ] && prot=UDP
 87	    [ $p == "U" ] && prot=UDP
 88	    [ $p == "i" ] && prot=ICMP
 89	    [ $p == "r" ] && prot=RAW
 90
 91	    [ $ovr == "setsock" ] && m="-C"
 92	    [ $ovr == "cmsg" ]    && m="-c"
 93	    [ $ovr == "both" ]    && m="-C $((TOS2)) -c"
 94	    [ $ovr == "diff" ]    && m="-C $((TOS )) -c"
 95
 96	    $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &
 97	    BG=$!
 98	    sleep 0.05
 99
100	    $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS2)) $TGT 1234
101	    check_result $? 0 "$MATCH $prot $ovr - pass"
102
103	    while [ -d /proc/$BG ]; do
104	        $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS2)) $TGT 1234
105	    done
106
107	    tcpdump -r $TMPF -v 2>&1 | grep "$MATCH $TOS2" >> /dev/null
108	    check_result $? 0 "$MATCH $prot $ovr - packet data"
109	    rm $TMPF
110
111	    [ $ovr == "both" ]    && m="-C $((TOS )) -c"
112	    [ $ovr == "diff" ]    && m="-C $((TOS2)) -c"
113
114	    # Match prohibit rule: expect failure
115	    $NSEXE ./cmsg_sender $IPVER -p $p $m $((TOS)) -s $TGT 1234
116	    check_result $? 1 "$MATCH $prot $ovr - rejection"
117
118	    # Match prohibit rule: IPv4 masks ECN: expect failure
119	    if [[ "$IPVER" == "-4" ]]; then
120		$NSEXE ./cmsg_sender $IPVER -p $p $m "$((TOS | ECN))" -s $TGT 1234
121		check_result $? 1 "$MATCH $prot $ovr - rejection (ECN)"
122	    fi
123	done
124    done
125}
126
127test_dscp -4 $TGT4 tos
128test_dscp -6 $TGT6 class
129
130# IP_TTL + IPV6_HOPLIMIT
131test_ttl_hoplimit() {
132    local -r IPVER=$1
133    local -r TGT=$2
134    local -r MATCH=$3
135
136    local -r LIM=4
137
138    for ovr in setsock cmsg both diff; do
139	for p in u U i r; do
140	    [ $p == "u" ] && prot=UDP
141	    [ $p == "U" ] && prot=UDP
142	    [ $p == "i" ] && prot=ICMP
143	    [ $p == "r" ] && prot=RAW
144
145	    [ $ovr == "setsock" ] && m="-L"
146	    [ $ovr == "cmsg" ]    && m="-l"
147	    [ $ovr == "both" ]    && m="-L $LIM -l"
148	    [ $ovr == "diff" ]    && m="-L $((LIM + 1)) -l"
149
150	    $NSEXE nohup tcpdump --immediate-mode -p -ni dummy0 -w $TMPF -c 4 2> /dev/null &
151	    BG=$!
152	    sleep 0.05
153
154	    $NSEXE ./cmsg_sender $IPVER -p $p $m $LIM $TGT 1234
155	    check_result $? 0 "$MATCH $prot $ovr - pass"
156
157	    while [ -d /proc/$BG ]; do
158		$NSEXE ./cmsg_sender $IPVER -p $p $m $LIM $TGT 1234
159	    done
160
161	    tcpdump -r $TMPF -v 2>&1 | grep "$MATCH $LIM[^0-9]" >> /dev/null
162	    check_result $? 0 "$MATCH $prot $ovr - packet data"
163	    rm $TMPF
164	done
165    done
166}
167
168test_ttl_hoplimit -4 $TGT4 ttl
169test_ttl_hoplimit -6 $TGT6 hlim
170
171# IPV6 exthdr
172for p in u U i r; do
173    # Very basic "does it crash" test
174    for h in h d r; do
175	$NSEXE ./cmsg_sender -p $p -6 -H $h $TGT6 1234
176	check_result $? 0 "ExtHdr $prot $ovr - pass"
177    done
178done
179
180# Summary
181if [ $BAD -ne 0 ]; then
182    echo "FAIL - $BAD/$TOTAL cases failed"
183    exit 1
184else
185    echo "OK"
186    exit 0
187fi
~/ Read-only file preview.