xref: /openbmc/linux/tools/testing/selftests/net/xfrm_policy.sh (revision f8bade6c9a6213c2c5ba6e5bf32415ecab6e41e5)
1b69d540dSFlorian Westphal#!/bin/bash
2b69d540dSFlorian Westphal# SPDX-License-Identifier: GPL-2.0
3b69d540dSFlorian Westphal#
4b69d540dSFlorian Westphal# Check xfrm policy resolution.  Topology:
5b69d540dSFlorian Westphal#
6b69d540dSFlorian Westphal# 1.2   1.1   3.1  3.10    2.1   2.2
7b69d540dSFlorian Westphal# eth1  eth1 veth0 veth0 eth1   eth1
8b69d540dSFlorian Westphal# ns1 ---- ns3 ----- ns4 ---- ns2
9b69d540dSFlorian Westphal#
10b69d540dSFlorian Westphal# ns3 and ns4 are connected via ipsec tunnel.
11b69d540dSFlorian Westphal# pings from ns1 to ns2 (and vice versa) are supposed to work like this:
12b69d540dSFlorian Westphal# ns1: ping 10.0.2.2: passes via ipsec tunnel.
13b69d540dSFlorian Westphal# ns2: ping 10.0.1.2: passes via ipsec tunnel.
14b69d540dSFlorian Westphal
15b69d540dSFlorian Westphal# ns1: ping 10.0.1.253: passes via ipsec tunnel (direct policy)
16b69d540dSFlorian Westphal# ns2: ping 10.0.2.253: passes via ipsec tunnel (direct policy)
17b69d540dSFlorian Westphal#
18b69d540dSFlorian Westphal# ns1: ping 10.0.2.254: does NOT pass via ipsec tunnel (exception)
19b69d540dSFlorian Westphal# ns2: ping 10.0.1.254: does NOT pass via ipsec tunnel (exception)
20b69d540dSFlorian Westphal
21b69d540dSFlorian Westphal# Kselftest framework requirement - SKIP code is 4.
22b69d540dSFlorian Westphalksft_skip=4
23b69d540dSFlorian Westphalret=0
2439aa6928SFlorian Westphalpolicy_checks_ok=1
25b69d540dSFlorian Westphal
26b69d540dSFlorian WestphalKEY_SHA=0xdeadbeef1234567890abcdefabcdefabcdefabcd
27b69d540dSFlorian WestphalKEY_AES=0x0123456789abcdef0123456789012345
28b69d540dSFlorian WestphalSPI1=0x1
29b69d540dSFlorian WestphalSPI2=0x2
30b69d540dSFlorian Westphal
31fcf86f55SFlorian Westphaldo_esp_policy() {
32fcf86f55SFlorian Westphal    local ns=$1
33fcf86f55SFlorian Westphal    local me=$2
34fcf86f55SFlorian Westphal    local remote=$3
35fcf86f55SFlorian Westphal    local lnet=$4
36fcf86f55SFlorian Westphal    local rnet=$5
37fcf86f55SFlorian Westphal
38fcf86f55SFlorian Westphal    # to encrypt packets as they go out (includes forwarded packets that need encapsulation)
39fcf86f55SFlorian Westphal    ip -net $ns xfrm policy add src $lnet dst $rnet dir out tmpl src $me dst $remote proto esp mode tunnel priority 100 action allow
40fcf86f55SFlorian Westphal    # to fwd decrypted packets after esp processing:
41fcf86f55SFlorian Westphal    ip -net $ns xfrm policy add src $rnet dst $lnet dir fwd tmpl src $remote dst $me proto esp mode tunnel priority 100 action allow
42fcf86f55SFlorian Westphal}
43fcf86f55SFlorian Westphal
44b69d540dSFlorian Westphaldo_esp() {
45b69d540dSFlorian Westphal    local ns=$1
46b69d540dSFlorian Westphal    local me=$2
47b69d540dSFlorian Westphal    local remote=$3
48b69d540dSFlorian Westphal    local lnet=$4
49b69d540dSFlorian Westphal    local rnet=$5
50b69d540dSFlorian Westphal    local spi_out=$6
51b69d540dSFlorian Westphal    local spi_in=$7
52b69d540dSFlorian Westphal
53b69d540dSFlorian Westphal    ip -net $ns xfrm state add src $remote dst $me proto esp spi $spi_in  enc aes $KEY_AES  auth sha1 $KEY_SHA  mode tunnel sel src $rnet dst $lnet
54b69d540dSFlorian Westphal    ip -net $ns xfrm state add src $me  dst $remote proto esp spi $spi_out enc aes $KEY_AES auth sha1 $KEY_SHA mode tunnel sel src $lnet dst $rnet
55b69d540dSFlorian Westphal
56fcf86f55SFlorian Westphal    do_esp_policy $ns $me $remote $lnet $rnet
57b69d540dSFlorian Westphal}
58b69d540dSFlorian Westphal
590977b238SFlorian Westphal# add policies with different netmasks, to make sure kernel carries
600977b238SFlorian Westphal# the policies contained within new netmask over when search tree is
610977b238SFlorian Westphal# re-built.
620977b238SFlorian Westphal# peer netns that are supposed to be encapsulated via esp have addresses
630977b238SFlorian Westphal# in the 10.0.1.0/24 and 10.0.2.0/24 subnets, respectively.
640977b238SFlorian Westphal#
650977b238SFlorian Westphal# Adding a policy for '10.0.1.0/23' will make it necessary to
660977b238SFlorian Westphal# alter the prefix of 10.0.1.0 subnet.
670977b238SFlorian Westphal# In case new prefix overlaps with existing node, the node and all
680977b238SFlorian Westphal# policies it carries need to be merged with the existing one(s).
690977b238SFlorian Westphal#
700977b238SFlorian Westphal# Do that here.
710977b238SFlorian Westphaldo_overlap()
720977b238SFlorian Westphal{
730977b238SFlorian Westphal    local ns=$1
740977b238SFlorian Westphal
750977b238SFlorian Westphal    # adds new nodes to tree (neither network exists yet in policy database).
760977b238SFlorian Westphal    ip -net $ns xfrm policy add src 10.1.0.0/24 dst 10.0.0.0/24 dir fwd priority 200 action block
770977b238SFlorian Westphal
780977b238SFlorian Westphal    # adds a new node in the 10.0.0.0/24 tree (dst node exists).
790977b238SFlorian Westphal    ip -net $ns xfrm policy add src 10.2.0.0/24 dst 10.0.0.0/24 dir fwd priority 200 action block
800977b238SFlorian Westphal
8112750abaSFlorian Westphal    # adds a 10.2.0.0/23 node, but for different dst.
8212750abaSFlorian Westphal    ip -net $ns xfrm policy add src 10.2.0.0/23 dst 10.0.1.0/24 dir fwd priority 200 action block
830977b238SFlorian Westphal
840977b238SFlorian Westphal    # dst now overlaps with the 10.0.1.0/24 ESP policy in fwd.
850977b238SFlorian Westphal    # kernel must 'promote' existing one (10.0.0.0/24) to 10.0.0.0/23.
860977b238SFlorian Westphal    # But 10.0.0.0/23 also includes existing 10.0.1.0/24, so that node
870977b238SFlorian Westphal    # also has to be merged too, including source-sorted subtrees.
880977b238SFlorian Westphal    # old:
890977b238SFlorian Westphal    # 10.0.0.0/24 (node 1 in dst tree of the bin)
900977b238SFlorian Westphal    #    10.1.0.0/24 (node in src tree of dst node 1)
910977b238SFlorian Westphal    #    10.2.0.0/24 (node in src tree of dst node 1)
920977b238SFlorian Westphal    # 10.0.1.0/24 (node 2 in dst tree of the bin)
930977b238SFlorian Westphal    #    10.0.2.0/24 (node in src tree of dst node 2)
940977b238SFlorian Westphal    #    10.2.0.0/24 (node in src tree of dst node 2)
950977b238SFlorian Westphal    #
960977b238SFlorian Westphal    # The next 'policy add' adds dst '10.0.0.0/23', which means
970977b238SFlorian Westphal    # that dst node 1 and dst node 2 have to be merged including
980977b238SFlorian Westphal    # the sub-tree.  As no duplicates are allowed, policies in
990977b238SFlorian Westphal    # the two '10.0.2.0/24' are also merged.
1000977b238SFlorian Westphal    #
1010977b238SFlorian Westphal    # after the 'add', internal search tree should look like this:
1020977b238SFlorian Westphal    # 10.0.0.0/23 (node in dst tree of bin)
1030977b238SFlorian Westphal    #     10.0.2.0/24 (node in src tree of dst node)
1040977b238SFlorian Westphal    #     10.1.0.0/24 (node in src tree of dst node)
1050977b238SFlorian Westphal    #     10.2.0.0/24 (node in src tree of dst node)
1060977b238SFlorian Westphal    #
1070977b238SFlorian Westphal    # 10.0.0.0/24 and 10.0.1.0/24 nodes have been merged as 10.0.0.0/23.
1080977b238SFlorian Westphal    ip -net $ns xfrm policy add src 10.1.0.0/24 dst 10.0.0.0/23 dir fwd priority 200 action block
109769a807dSFlorian Westphal
110769a807dSFlorian Westphal    # similar to above: add policies (with partially random address), with shrinking prefixes.
111769a807dSFlorian Westphal    for p in 29 28 27;do
112769a807dSFlorian Westphal      for k in $(seq 1 32); do
113769a807dSFlorian Westphal       ip -net $ns xfrm policy add src 10.253.1.$((RANDOM%255))/$p dst 10.254.1.$((RANDOM%255))/$p dir fwd priority $((200+k)) action block 2>/dev/null
114769a807dSFlorian Westphal      done
115769a807dSFlorian Westphal    done
1160977b238SFlorian Westphal}
1170977b238SFlorian Westphal
11839aa6928SFlorian Westphaldo_esp_policy_get_check() {
11939aa6928SFlorian Westphal    local ns=$1
12039aa6928SFlorian Westphal    local lnet=$2
12139aa6928SFlorian Westphal    local rnet=$3
12239aa6928SFlorian Westphal
12339aa6928SFlorian Westphal    ip -net $ns xfrm policy get src $lnet dst $rnet dir out > /dev/null
12439aa6928SFlorian Westphal    if [ $? -ne 0 ] && [ $policy_checks_ok -eq 1 ] ;then
12539aa6928SFlorian Westphal        policy_checks_ok=0
12639aa6928SFlorian Westphal        echo "FAIL: ip -net $ns xfrm policy get src $lnet dst $rnet dir out"
12739aa6928SFlorian Westphal        ret=1
12839aa6928SFlorian Westphal    fi
12939aa6928SFlorian Westphal
13039aa6928SFlorian Westphal    ip -net $ns xfrm policy get src $rnet dst $lnet dir fwd > /dev/null
13139aa6928SFlorian Westphal    if [ $? -ne 0 ] && [ $policy_checks_ok -eq 1 ] ;then
13239aa6928SFlorian Westphal        policy_checks_ok=0
13339aa6928SFlorian Westphal        echo "FAIL: ip -net $ns xfrm policy get src $rnet dst $lnet dir fwd"
13439aa6928SFlorian Westphal        ret=1
13539aa6928SFlorian Westphal    fi
13639aa6928SFlorian Westphal}
13739aa6928SFlorian Westphal
138b69d540dSFlorian Westphaldo_exception() {
139b69d540dSFlorian Westphal    local ns=$1
140b69d540dSFlorian Westphal    local me=$2
141b69d540dSFlorian Westphal    local remote=$3
142b69d540dSFlorian Westphal    local encryptip=$4
143b69d540dSFlorian Westphal    local plain=$5
144b69d540dSFlorian Westphal
145b69d540dSFlorian Westphal    # network $plain passes without tunnel
146b69d540dSFlorian Westphal    ip -net $ns xfrm policy add dst $plain dir out priority 10 action allow
147b69d540dSFlorian Westphal
148b69d540dSFlorian Westphal    # direct policy for $encryptip, use tunnel, higher prio takes precedence
149b69d540dSFlorian Westphal    ip -net $ns xfrm policy add dst $encryptip dir out tmpl src $me dst $remote proto esp mode tunnel priority 1 action allow
150b69d540dSFlorian Westphal}
151b69d540dSFlorian Westphal
152b69d540dSFlorian Westphal# policies that are not supposed to match any packets generated in this test.
153b69d540dSFlorian Westphaldo_dummies4() {
154b69d540dSFlorian Westphal    local ns=$1
155b69d540dSFlorian Westphal
156b69d540dSFlorian Westphal    for i in $(seq 10 16);do
157b69d540dSFlorian Westphal      # dummy policy with wildcard src/dst.
158b69d540dSFlorian Westphal      echo netns exec $ns ip xfrm policy add src 0.0.0.0/0 dst 10.$i.99.0/30 dir out action block
159b69d540dSFlorian Westphal      echo netns exec $ns ip xfrm policy add src 10.$i.99.0/30 dst 0.0.0.0/0 dir out action block
160b69d540dSFlorian Westphal      for j in $(seq 32 64);do
161b69d540dSFlorian Westphal        echo netns exec $ns ip xfrm policy add src 10.$i.1.0/30 dst 10.$i.$j.0/30 dir out action block
162b69d540dSFlorian Westphal        # silly, as it encompasses the one above too, but its allowed:
163b69d540dSFlorian Westphal        echo netns exec $ns ip xfrm policy add src 10.$i.1.0/29 dst 10.$i.$j.0/29 dir out action block
164b69d540dSFlorian Westphal        # and yet again, even more broad one.
165b69d540dSFlorian Westphal        echo netns exec $ns ip xfrm policy add src 10.$i.1.0/24 dst 10.$i.$j.0/24 dir out action block
166b69d540dSFlorian Westphal        echo netns exec $ns ip xfrm policy add src 10.$i.$j.0/24 dst 10.$i.1.0/24 dir fwd action block
167b69d540dSFlorian Westphal      done
168b69d540dSFlorian Westphal    done | ip -batch /dev/stdin
169b69d540dSFlorian Westphal}
170b69d540dSFlorian Westphal
171b69d540dSFlorian Westphaldo_dummies6() {
172b69d540dSFlorian Westphal    local ns=$1
173b69d540dSFlorian Westphal
174b69d540dSFlorian Westphal    for i in $(seq 10 16);do
175b69d540dSFlorian Westphal      for j in $(seq 32 64);do
176b69d540dSFlorian Westphal       echo netns exec $ns ip xfrm policy add src dead:$i::/64 dst dead:$i:$j::/64 dir out action block
177b69d540dSFlorian Westphal       echo netns exec $ns ip xfrm policy add src dead:$i:$j::/64 dst dead:$i::/24 dir fwd action block
178b69d540dSFlorian Westphal      done
179b69d540dSFlorian Westphal    done | ip -batch /dev/stdin
180b69d540dSFlorian Westphal}
181b69d540dSFlorian Westphal
182b69d540dSFlorian Westphalcheck_ipt_policy_count()
183b69d540dSFlorian Westphal{
184b69d540dSFlorian Westphal	ns=$1
185b69d540dSFlorian Westphal
186b69d540dSFlorian Westphal	ip netns exec $ns iptables-save -c |grep policy | ( read c rest
187b69d540dSFlorian Westphal		ip netns exec $ns iptables -Z
188b69d540dSFlorian Westphal		if [ x"$c" = x'[0:0]' ]; then
189b69d540dSFlorian Westphal			exit 0
190b69d540dSFlorian Westphal		elif [ x"$c" = x ]; then
191b69d540dSFlorian Westphal			echo "ERROR: No counters"
192b69d540dSFlorian Westphal			ret=1
193b69d540dSFlorian Westphal			exit 111
194b69d540dSFlorian Westphal		else
195b69d540dSFlorian Westphal			exit 1
196b69d540dSFlorian Westphal		fi
197b69d540dSFlorian Westphal	)
198b69d540dSFlorian Westphal}
199b69d540dSFlorian Westphal
200b69d540dSFlorian Westphalcheck_xfrm() {
201b69d540dSFlorian Westphal	# 0: iptables -m policy rule count == 0
202b69d540dSFlorian Westphal	# 1: iptables -m policy rule count != 0
203b69d540dSFlorian Westphal	rval=$1
204b69d540dSFlorian Westphal	ip=$2
205f6e9ceb7SPo-Hsu Lin	local lret=0
206b69d540dSFlorian Westphal
207b69d540dSFlorian Westphal	ip netns exec ns1 ping -q -c 1 10.0.2.$ip > /dev/null
208b69d540dSFlorian Westphal
209b69d540dSFlorian Westphal	check_ipt_policy_count ns3
210b69d540dSFlorian Westphal	if [ $? -ne $rval ] ; then
21139aa6928SFlorian Westphal		lret=1
212b69d540dSFlorian Westphal	fi
213b69d540dSFlorian Westphal	check_ipt_policy_count ns4
214b69d540dSFlorian Westphal	if [ $? -ne $rval ] ; then
21539aa6928SFlorian Westphal		lret=1
216b69d540dSFlorian Westphal	fi
217b69d540dSFlorian Westphal
218b69d540dSFlorian Westphal	ip netns exec ns2 ping -q -c 1 10.0.1.$ip > /dev/null
219b69d540dSFlorian Westphal
220b69d540dSFlorian Westphal	check_ipt_policy_count ns3
221b69d540dSFlorian Westphal	if [ $? -ne $rval ] ; then
22239aa6928SFlorian Westphal		lret=1
223b69d540dSFlorian Westphal	fi
224b69d540dSFlorian Westphal	check_ipt_policy_count ns4
225b69d540dSFlorian Westphal	if [ $? -ne $rval ] ; then
22639aa6928SFlorian Westphal		lret=1
227b69d540dSFlorian Westphal	fi
228b69d540dSFlorian Westphal
22939aa6928SFlorian Westphal	return $lret
230b69d540dSFlorian Westphal}
231b69d540dSFlorian Westphal
2320977b238SFlorian Westphalcheck_exceptions()
2330977b238SFlorian Westphal{
2340977b238SFlorian Westphal	logpostfix="$1"
2350977b238SFlorian Westphal	local lret=0
2360977b238SFlorian Westphal
2370977b238SFlorian Westphal	# ping to .254 should be excluded from the tunnel (exception is in place).
2380977b238SFlorian Westphal	check_xfrm 0 254
2390977b238SFlorian Westphal	if [ $? -ne 0 ]; then
2400977b238SFlorian Westphal		echo "FAIL: expected ping to .254 to fail ($logpostfix)"
2410977b238SFlorian Westphal		lret=1
2420977b238SFlorian Westphal	else
2430977b238SFlorian Westphal		echo "PASS: ping to .254 bypassed ipsec tunnel ($logpostfix)"
2440977b238SFlorian Westphal	fi
2450977b238SFlorian Westphal
2460977b238SFlorian Westphal	# ping to .253 should use use ipsec due to direct policy exception.
2470977b238SFlorian Westphal	check_xfrm 1 253
2480977b238SFlorian Westphal	if [ $? -ne 0 ]; then
2490977b238SFlorian Westphal		echo "FAIL: expected ping to .253 to use ipsec tunnel ($logpostfix)"
2500977b238SFlorian Westphal		lret=1
2510977b238SFlorian Westphal	else
2520977b238SFlorian Westphal		echo "PASS: direct policy matches ($logpostfix)"
2530977b238SFlorian Westphal	fi
2540977b238SFlorian Westphal
2550977b238SFlorian Westphal	# ping to .2 should use ipsec.
2560977b238SFlorian Westphal	check_xfrm 1 2
2570977b238SFlorian Westphal	if [ $? -ne 0 ]; then
2580977b238SFlorian Westphal		echo "FAIL: expected ping to .2 to use ipsec tunnel ($logpostfix)"
2590977b238SFlorian Westphal		lret=1
2600977b238SFlorian Westphal	else
2610977b238SFlorian Westphal		echo "PASS: policy matches ($logpostfix)"
2620977b238SFlorian Westphal	fi
2630977b238SFlorian Westphal
2640977b238SFlorian Westphal	return $lret
2650977b238SFlorian Westphal}
2660977b238SFlorian Westphal
267fd709721SFlorian Westphalcheck_hthresh_repeat()
268fd709721SFlorian Westphal{
269fd709721SFlorian Westphal	local log=$1
270fd709721SFlorian Westphal	i=0
271fd709721SFlorian Westphal
272fd709721SFlorian Westphal	for i in $(seq 1 10);do
273fd709721SFlorian Westphal		ip -net ns1 xfrm policy update src e000:0001::0000 dst ff01::0014:0000:0001 dir in tmpl src :: dst :: proto esp mode tunnel priority 100 action allow || break
274fd709721SFlorian Westphal		ip -net ns1 xfrm policy set hthresh6 0 28 || break
275fd709721SFlorian Westphal
276fd709721SFlorian Westphal		ip -net ns1 xfrm policy update src e000:0001::0000 dst ff01::01 dir in tmpl src :: dst :: proto esp mode tunnel priority 100 action allow || break
277fd709721SFlorian Westphal		ip -net ns1 xfrm policy set hthresh6 0 28 || break
278fd709721SFlorian Westphal	done
279fd709721SFlorian Westphal
280fd709721SFlorian Westphal	if [ $i -ne 10 ] ;then
281fd709721SFlorian Westphal		echo "FAIL: $log" 1>&2
282fd709721SFlorian Westphal		ret=1
283fd709721SFlorian Westphal		return 1
284fd709721SFlorian Westphal	fi
285fd709721SFlorian Westphal
286fd709721SFlorian Westphal	echo "PASS: $log"
287fd709721SFlorian Westphal	return 0
288fd709721SFlorian Westphal}
289fd709721SFlorian Westphal
290*da64ae2dSVisa Hankala# insert non-overlapping policies in a random order and check that
291*da64ae2dSVisa Hankala# all of them can be fetched using the traffic selectors.
292*da64ae2dSVisa Hankalacheck_random_order()
293*da64ae2dSVisa Hankala{
294*da64ae2dSVisa Hankala	local ns=$1
295*da64ae2dSVisa Hankala	local log=$2
296*da64ae2dSVisa Hankala
297*da64ae2dSVisa Hankala	for i in $(seq 100); do
298*da64ae2dSVisa Hankala		ip -net $ns xfrm policy flush
299*da64ae2dSVisa Hankala		for j in $(seq 0 16 255 | sort -R); do
300*da64ae2dSVisa Hankala			ip -net $ns xfrm policy add dst $j.0.0.0/24 dir out priority 10 action allow
301*da64ae2dSVisa Hankala		done
302*da64ae2dSVisa Hankala		for j in $(seq 0 16 255); do
303*da64ae2dSVisa Hankala			if ! ip -net $ns xfrm policy get dst $j.0.0.0/24 dir out > /dev/null; then
304*da64ae2dSVisa Hankala				echo "FAIL: $log" 1>&2
305*da64ae2dSVisa Hankala				return 1
306*da64ae2dSVisa Hankala			fi
307*da64ae2dSVisa Hankala		done
308*da64ae2dSVisa Hankala	done
309*da64ae2dSVisa Hankala
310*da64ae2dSVisa Hankala	for i in $(seq 100); do
311*da64ae2dSVisa Hankala		ip -net $ns xfrm policy flush
312*da64ae2dSVisa Hankala		for j in $(seq 0 16 255 | sort -R); do
313*da64ae2dSVisa Hankala			local addr=$(printf "e000:0000:%02x00::/56" $j)
314*da64ae2dSVisa Hankala			ip -net $ns xfrm policy add dst $addr dir out priority 10 action allow
315*da64ae2dSVisa Hankala		done
316*da64ae2dSVisa Hankala		for j in $(seq 0 16 255); do
317*da64ae2dSVisa Hankala			local addr=$(printf "e000:0000:%02x00::/56" $j)
318*da64ae2dSVisa Hankala			if ! ip -net $ns xfrm policy get dst $addr dir out > /dev/null; then
319*da64ae2dSVisa Hankala				echo "FAIL: $log" 1>&2
320*da64ae2dSVisa Hankala				return 1
321*da64ae2dSVisa Hankala			fi
322*da64ae2dSVisa Hankala		done
323*da64ae2dSVisa Hankala	done
324*da64ae2dSVisa Hankala
325*da64ae2dSVisa Hankala	ip -net $ns xfrm policy flush
326*da64ae2dSVisa Hankala
327*da64ae2dSVisa Hankala	echo "PASS: $log"
328*da64ae2dSVisa Hankala	return 0
329*da64ae2dSVisa Hankala}
330*da64ae2dSVisa Hankala
331b69d540dSFlorian Westphal#check for needed privileges
332b69d540dSFlorian Westphalif [ "$(id -u)" -ne 0 ];then
333b69d540dSFlorian Westphal	echo "SKIP: Need root privileges"
334b69d540dSFlorian Westphal	exit $ksft_skip
335b69d540dSFlorian Westphalfi
336b69d540dSFlorian Westphal
337b69d540dSFlorian Westphalip -Version 2>/dev/null >/dev/null
338b69d540dSFlorian Westphalif [ $? -ne 0 ];then
339b69d540dSFlorian Westphal	echo "SKIP: Could not run test without the ip tool"
340b69d540dSFlorian Westphal	exit $ksft_skip
341b69d540dSFlorian Westphalfi
342b69d540dSFlorian Westphal
343b69d540dSFlorian Westphal# needed to check if policy lookup got valid ipsec result
344b69d540dSFlorian Westphaliptables --version 2>/dev/null >/dev/null
345b69d540dSFlorian Westphalif [ $? -ne 0 ];then
346b69d540dSFlorian Westphal	echo "SKIP: Could not run test without iptables tool"
347b69d540dSFlorian Westphal	exit $ksft_skip
348b69d540dSFlorian Westphalfi
349b69d540dSFlorian Westphal
350b69d540dSFlorian Westphalfor i in 1 2 3 4; do
351b69d540dSFlorian Westphal    ip netns add ns$i
352b69d540dSFlorian Westphal    ip -net ns$i link set lo up
353b69d540dSFlorian Westphaldone
354b69d540dSFlorian Westphal
355b69d540dSFlorian WestphalDEV=veth0
356b69d540dSFlorian Westphalip link add $DEV netns ns1 type veth peer name eth1 netns ns3
357b69d540dSFlorian Westphalip link add $DEV netns ns2 type veth peer name eth1 netns ns4
358b69d540dSFlorian Westphal
359b69d540dSFlorian Westphalip link add $DEV netns ns3 type veth peer name veth0 netns ns4
360b69d540dSFlorian Westphal
361b69d540dSFlorian WestphalDEV=veth0
362b69d540dSFlorian Westphalfor i in 1 2; do
363b69d540dSFlorian Westphal    ip -net ns$i link set $DEV up
364b69d540dSFlorian Westphal    ip -net ns$i addr add 10.0.$i.2/24 dev $DEV
365b69d540dSFlorian Westphal    ip -net ns$i addr add dead:$i::2/64 dev $DEV
366b69d540dSFlorian Westphal
367b69d540dSFlorian Westphal    ip -net ns$i addr add 10.0.$i.253 dev $DEV
368b69d540dSFlorian Westphal    ip -net ns$i addr add 10.0.$i.254 dev $DEV
369b69d540dSFlorian Westphal    ip -net ns$i addr add dead:$i::fd dev $DEV
370b69d540dSFlorian Westphal    ip -net ns$i addr add dead:$i::fe dev $DEV
371b69d540dSFlorian Westphaldone
372b69d540dSFlorian Westphal
373b69d540dSFlorian Westphalfor i in 3 4; do
374b69d540dSFlorian Westphalip -net ns$i link set eth1 up
375b69d540dSFlorian Westphalip -net ns$i link set veth0 up
376b69d540dSFlorian Westphaldone
377b69d540dSFlorian Westphal
378b69d540dSFlorian Westphalip -net ns1 route add default via 10.0.1.1
379b69d540dSFlorian Westphalip -net ns2 route add default via 10.0.2.1
380b69d540dSFlorian Westphal
381b69d540dSFlorian Westphalip -net ns3 addr add 10.0.1.1/24 dev eth1
382b69d540dSFlorian Westphalip -net ns3 addr add 10.0.3.1/24 dev veth0
383b69d540dSFlorian Westphalip -net ns3 addr add 2001:1::1/64 dev eth1
384b69d540dSFlorian Westphalip -net ns3 addr add 2001:3::1/64 dev veth0
385b69d540dSFlorian Westphal
386b69d540dSFlorian Westphalip -net ns3 route add default via 10.0.3.10
387b69d540dSFlorian Westphal
388b69d540dSFlorian Westphalip -net ns4 addr add 10.0.2.1/24 dev eth1
389b69d540dSFlorian Westphalip -net ns4 addr add 10.0.3.10/24 dev veth0
390b69d540dSFlorian Westphalip -net ns4 addr add 2001:2::1/64 dev eth1
391b69d540dSFlorian Westphalip -net ns4 addr add 2001:3::10/64 dev veth0
392b69d540dSFlorian Westphalip -net ns4 route add default via 10.0.3.1
393b69d540dSFlorian Westphal
394b69d540dSFlorian Westphalfor j in 4 6; do
395b69d540dSFlorian Westphal	for i in 3 4;do
396b69d540dSFlorian Westphal		ip netns exec ns$i sysctl net.ipv$j.conf.eth1.forwarding=1 > /dev/null
397b69d540dSFlorian Westphal		ip netns exec ns$i sysctl net.ipv$j.conf.veth0.forwarding=1 > /dev/null
398b69d540dSFlorian Westphal	done
399b69d540dSFlorian Westphaldone
400b69d540dSFlorian Westphal
401b69d540dSFlorian Westphal# abuse iptables rule counter to check if ping matches a policy
402b69d540dSFlorian Westphalip netns exec ns3 iptables -p icmp -A FORWARD -m policy --dir out --pol ipsec
403b69d540dSFlorian Westphalip netns exec ns4 iptables -p icmp -A FORWARD -m policy --dir out --pol ipsec
404b69d540dSFlorian Westphalif [ $? -ne 0 ];then
405b69d540dSFlorian Westphal	echo "SKIP: Could not insert iptables rule"
406b69d540dSFlorian Westphal	for i in 1 2 3 4;do ip netns del ns$i;done
407b69d540dSFlorian Westphal	exit $ksft_skip
408b69d540dSFlorian Westphalfi
409b69d540dSFlorian Westphal
410b69d540dSFlorian Westphal#          localip  remoteip  localnet    remotenet
411b69d540dSFlorian Westphaldo_esp ns3 10.0.3.1 10.0.3.10 10.0.1.0/24 10.0.2.0/24 $SPI1 $SPI2
412b69d540dSFlorian Westphaldo_esp ns3 dead:3::1 dead:3::10 dead:1::/64 dead:2::/64 $SPI1 $SPI2
413b69d540dSFlorian Westphaldo_esp ns4 10.0.3.10 10.0.3.1 10.0.2.0/24 10.0.1.0/24 $SPI2 $SPI1
414b69d540dSFlorian Westphaldo_esp ns4 dead:3::10 dead:3::1 dead:2::/64 dead:1::/64 $SPI2 $SPI1
415b69d540dSFlorian Westphal
416b69d540dSFlorian Westphaldo_dummies4 ns3
417b69d540dSFlorian Westphaldo_dummies6 ns4
418b69d540dSFlorian Westphal
41939aa6928SFlorian Westphaldo_esp_policy_get_check ns3 10.0.1.0/24 10.0.2.0/24
42039aa6928SFlorian Westphaldo_esp_policy_get_check ns4 10.0.2.0/24 10.0.1.0/24
42139aa6928SFlorian Westphaldo_esp_policy_get_check ns3 dead:1::/64 dead:2::/64
42239aa6928SFlorian Westphaldo_esp_policy_get_check ns4 dead:2::/64 dead:1::/64
42339aa6928SFlorian Westphal
424b69d540dSFlorian Westphal# ping to .254 should use ipsec, exception is not installed.
425b69d540dSFlorian Westphalcheck_xfrm 1 254
426b69d540dSFlorian Westphalif [ $? -ne 0 ]; then
427b69d540dSFlorian Westphal	echo "FAIL: expected ping to .254 to use ipsec tunnel"
428b69d540dSFlorian Westphal	ret=1
429b69d540dSFlorian Westphalelse
430b69d540dSFlorian Westphal	echo "PASS: policy before exception matches"
431b69d540dSFlorian Westphalfi
432b69d540dSFlorian Westphal
433b69d540dSFlorian Westphal# installs exceptions
434b69d540dSFlorian Westphal#                localip  remoteip   encryptdst  plaindst
435b69d540dSFlorian Westphaldo_exception ns3 10.0.3.1 10.0.3.10 10.0.2.253 10.0.2.240/28
436b69d540dSFlorian Westphaldo_exception ns4 10.0.3.10 10.0.3.1 10.0.1.253 10.0.1.240/28
437b69d540dSFlorian Westphal
438b69d540dSFlorian Westphaldo_exception ns3 dead:3::1 dead:3::10 dead:2::fd  dead:2:f0::/96
439b69d540dSFlorian Westphaldo_exception ns4 dead:3::10 dead:3::1 dead:1::fd  dead:1:f0::/96
440b69d540dSFlorian Westphal
4410977b238SFlorian Westphalcheck_exceptions "exceptions"
442b69d540dSFlorian Westphalif [ $? -ne 0 ]; then
443b69d540dSFlorian Westphal	ret=1
444b69d540dSFlorian Westphalfi
445b69d540dSFlorian Westphal
4460977b238SFlorian Westphal# insert block policies with adjacent/overlapping netmasks
4470977b238SFlorian Westphaldo_overlap ns3
448b69d540dSFlorian Westphal
4490977b238SFlorian Westphalcheck_exceptions "exceptions and block policies"
450b69d540dSFlorian Westphalif [ $? -ne 0 ]; then
451b69d540dSFlorian Westphal	ret=1
452b69d540dSFlorian Westphalfi
453b69d540dSFlorian Westphal
454fcf86f55SFlorian Westphalfor n in ns3 ns4;do
455fcf86f55SFlorian Westphal	ip -net $n xfrm policy set hthresh4 28 24 hthresh6 126 125
456fcf86f55SFlorian Westphal	sleep $((RANDOM%5))
457fcf86f55SFlorian Westphaldone
458fcf86f55SFlorian Westphal
459fcf86f55SFlorian Westphalcheck_exceptions "exceptions and block policies after hresh changes"
460fcf86f55SFlorian Westphal
461fcf86f55SFlorian Westphal# full flush of policy db, check everything gets freed incl. internal meta data
462fcf86f55SFlorian Westphalip -net ns3 xfrm policy flush
463fcf86f55SFlorian Westphal
464fcf86f55SFlorian Westphaldo_esp_policy ns3 10.0.3.1 10.0.3.10 10.0.1.0/24 10.0.2.0/24
465fcf86f55SFlorian Westphaldo_exception ns3 10.0.3.1 10.0.3.10 10.0.2.253 10.0.2.240/28
466fcf86f55SFlorian Westphal
467fcf86f55SFlorian Westphal# move inexact policies to hash table
468fcf86f55SFlorian Westphalip -net ns3 xfrm policy set hthresh4 16 16
469fcf86f55SFlorian Westphal
470fcf86f55SFlorian Westphalsleep $((RANDOM%5))
471fcf86f55SFlorian Westphalcheck_exceptions "exceptions and block policies after hthresh change in ns3"
472fcf86f55SFlorian Westphal
473fcf86f55SFlorian Westphal# restore original hthresh settings -- move policies back to tables
474fcf86f55SFlorian Westphalfor n in ns3 ns4;do
475fcf86f55SFlorian Westphal	ip -net $n xfrm policy set hthresh4 32 32 hthresh6 128 128
476fcf86f55SFlorian Westphal	sleep $((RANDOM%5))
477fcf86f55SFlorian Westphaldone
478fd709721SFlorian Westphalcheck_exceptions "exceptions and block policies after htresh change to normal"
479fd709721SFlorian Westphal
480fd709721SFlorian Westphalcheck_hthresh_repeat "policies with repeated htresh change"
481fcf86f55SFlorian Westphal
482*da64ae2dSVisa Hankalacheck_random_order ns3 "policies inserted in random order"
483*da64ae2dSVisa Hankala
484b69d540dSFlorian Westphalfor i in 1 2 3 4;do ip netns del ns$i;done
485b69d540dSFlorian Westphal
486b69d540dSFlorian Westphalexit $ret
487