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