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