1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# Test ipv6 stats on the incoming if when forwarding with VRF 5 6ALL_TESTS=" 7 ipv6_ping 8 ipv6_in_too_big_err 9 ipv6_in_hdr_err 10 ipv6_in_addr_err 11 ipv6_in_discard 12" 13 14NUM_NETIFS=4 15source lib.sh 16 17require_command $TROUTE6 18 19h1_create() 20{ 21 simple_if_init $h1 2001:1:1::2/64 22 ip -6 route add vrf v$h1 2001:1:2::/64 via 2001:1:1::1 23} 24 25h1_destroy() 26{ 27 ip -6 route del vrf v$h1 2001:1:2::/64 via 2001:1:1::1 28 simple_if_fini $h1 2001:1:1::2/64 29} 30 31router_create() 32{ 33 vrf_create router 34 __simple_if_init $rtr1 router 2001:1:1::1/64 35 __simple_if_init $rtr2 router 2001:1:2::1/64 36 mtu_set $rtr2 1280 37} 38 39router_destroy() 40{ 41 mtu_restore $rtr2 42 __simple_if_fini $rtr2 2001:1:2::1/64 43 __simple_if_fini $rtr1 2001:1:1::1/64 44 vrf_destroy router 45} 46 47h2_create() 48{ 49 simple_if_init $h2 2001:1:2::2/64 50 ip -6 route add vrf v$h2 2001:1:1::/64 via 2001:1:2::1 51 mtu_set $h2 1280 52} 53 54h2_destroy() 55{ 56 mtu_restore $h2 57 ip -6 route del vrf v$h2 2001:1:1::/64 via 2001:1:2::1 58 simple_if_fini $h2 2001:1:2::2/64 59} 60 61setup_prepare() 62{ 63 h1=${NETIFS[p1]} 64 rtr1=${NETIFS[p2]} 65 66 rtr2=${NETIFS[p3]} 67 h2=${NETIFS[p4]} 68 69 vrf_prepare 70 h1_create 71 router_create 72 h2_create 73 74 forwarding_enable 75} 76 77cleanup() 78{ 79 pre_cleanup 80 81 forwarding_restore 82 83 h2_destroy 84 router_destroy 85 h1_destroy 86 vrf_cleanup 87} 88 89ipv6_in_too_big_err() 90{ 91 RET=0 92 93 local t0=$(ipv6_stats_get $rtr1 Ip6InTooBigErrors) 94 local vrf_name=$(master_name_get $h1) 95 96 # Send too big packets 97 ip vrf exec $vrf_name \ 98 $PING6 -s 1300 2001:1:2::2 -c 1 -w $PING_TIMEOUT &> /dev/null 99 100 local t1=$(ipv6_stats_get $rtr1 Ip6InTooBigErrors) 101 test "$((t1 - t0))" -ne 0 102 check_err $? 103 log_test "Ip6InTooBigErrors" 104} 105 106ipv6_in_hdr_err() 107{ 108 RET=0 109 110 local t0=$(ipv6_stats_get $rtr1 Ip6InHdrErrors) 111 local vrf_name=$(master_name_get $h1) 112 113 # Send packets with hop limit 1, easiest with traceroute6 as some ping6 114 # doesn't allow hop limit to be specified 115 ip vrf exec $vrf_name \ 116 $TROUTE6 2001:1:2::2 &> /dev/null 117 118 local t1=$(ipv6_stats_get $rtr1 Ip6InHdrErrors) 119 test "$((t1 - t0))" -ne 0 120 check_err $? 121 log_test "Ip6InHdrErrors" 122} 123 124ipv6_in_addr_err() 125{ 126 RET=0 127 128 local t0=$(ipv6_stats_get $rtr1 Ip6InAddrErrors) 129 local vrf_name=$(master_name_get $h1) 130 131 # Disable forwarding temporary while sending the packet 132 sysctl -qw net.ipv6.conf.all.forwarding=0 133 ip vrf exec $vrf_name \ 134 $PING6 2001:1:2::2 -c 1 -w $PING_TIMEOUT &> /dev/null 135 sysctl -qw net.ipv6.conf.all.forwarding=1 136 137 local t1=$(ipv6_stats_get $rtr1 Ip6InAddrErrors) 138 test "$((t1 - t0))" -ne 0 139 check_err $? 140 log_test "Ip6InAddrErrors" 141} 142 143ipv6_in_discard() 144{ 145 RET=0 146 147 local t0=$(ipv6_stats_get $rtr1 Ip6InDiscards) 148 local vrf_name=$(master_name_get $h1) 149 150 # Add a policy to discard 151 ip xfrm policy add dst 2001:1:2::2/128 dir fwd action block 152 ip vrf exec $vrf_name \ 153 $PING6 2001:1:2::2 -c 1 -w $PING_TIMEOUT &> /dev/null 154 ip xfrm policy del dst 2001:1:2::2/128 dir fwd 155 156 local t1=$(ipv6_stats_get $rtr1 Ip6InDiscards) 157 test "$((t1 - t0))" -ne 0 158 check_err $? 159 log_test "Ip6InDiscards" 160} 161ipv6_ping() 162{ 163 RET=0 164 165 ping6_test $h1 2001:1:2::2 166} 167 168trap cleanup EXIT 169 170setup_prepare 171setup_wait 172tests_run 173 174exit $EXIT_STATUS 175