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