| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| # Test ipv6 stats on the incoming if when forwarding with VRF |
| |
| ALL_TESTS=" |
| ipv6_ping |
| ipv6_in_too_big_err |
| ipv6_in_hdr_err |
| ipv6_in_addr_err |
| ipv6_in_discard |
| " |
| |
| NUM_NETIFS=4 |
| source lib.sh |
| |
| h1_create() |
| { |
| simple_if_init $h1 2001:1:1::2/64 |
| ip -6 route add vrf v$h1 2001:1:2::/64 via 2001:1:1::1 |
| } |
| |
| h1_destroy() |
| { |
| ip -6 route del vrf v$h1 2001:1:2::/64 via 2001:1:1::1 |
| simple_if_fini $h1 2001:1:1::2/64 |
| } |
| |
| router_create() |
| { |
| vrf_create router |
| __simple_if_init $rtr1 router 2001:1:1::1/64 |
| __simple_if_init $rtr2 router 2001:1:2::1/64 |
| mtu_set $rtr2 1280 |
| } |
| |
| router_destroy() |
| { |
| mtu_restore $rtr2 |
| __simple_if_fini $rtr2 2001:1:2::1/64 |
| __simple_if_fini $rtr1 2001:1:1::1/64 |
| vrf_destroy router |
| } |
| |
| h2_create() |
| { |
| simple_if_init $h2 2001:1:2::2/64 |
| ip -6 route add vrf v$h2 2001:1:1::/64 via 2001:1:2::1 |
| mtu_set $h2 1280 |
| } |
| |
| h2_destroy() |
| { |
| mtu_restore $h2 |
| ip -6 route del vrf v$h2 2001:1:1::/64 via 2001:1:2::1 |
| simple_if_fini $h2 2001:1:2::2/64 |
| } |
| |
| setup_prepare() |
| { |
| h1=${NETIFS[p1]} |
| rtr1=${NETIFS[p2]} |
| |
| rtr2=${NETIFS[p3]} |
| h2=${NETIFS[p4]} |
| |
| vrf_prepare |
| h1_create |
| router_create |
| h2_create |
| |
| forwarding_enable |
| } |
| |
| cleanup() |
| { |
| pre_cleanup |
| |
| forwarding_restore |
| |
| h2_destroy |
| router_destroy |
| h1_destroy |
| vrf_cleanup |
| } |
| |
| ipv6_in_too_big_err() |
| { |
| RET=0 |
| |
| local t0=$(ipv6_stats_get $rtr1 Ip6InTooBigErrors) |
| local vrf_name=$(master_name_get $h1) |
| |
| # Send too big packets |
| ip vrf exec $vrf_name \ |
| $PING6 -s 1300 2001:1:2::2 -c 1 -w $PING_TIMEOUT &> /dev/null |
| |
| local t1=$(ipv6_stats_get $rtr1 Ip6InTooBigErrors) |
| test "$((t1 - t0))" -ne 0 |
| check_err $? |
| log_test "Ip6InTooBigErrors" |
| } |
| |
| ipv6_in_hdr_err() |
| { |
| RET=0 |
| |
| local t0=$(ipv6_stats_get $rtr1 Ip6InHdrErrors) |
| local vrf_name=$(master_name_get $h1) |
| |
| # Send packets with hop limit 1, easiest with traceroute6 as some ping6 |
| # doesn't allow hop limit to be specified |
| ip vrf exec $vrf_name \ |
| $TROUTE6 2001:1:2::2 &> /dev/null |
| |
| local t1=$(ipv6_stats_get $rtr1 Ip6InHdrErrors) |
| test "$((t1 - t0))" -ne 0 |
| check_err $? |
| log_test "Ip6InHdrErrors" |
| } |
| |
| ipv6_in_addr_err() |
| { |
| RET=0 |
| |
| local t0=$(ipv6_stats_get $rtr1 Ip6InAddrErrors) |
| local vrf_name=$(master_name_get $h1) |
| |
| # Disable forwarding temporary while sending the packet |
| sysctl -qw net.ipv6.conf.all.forwarding=0 |
| ip vrf exec $vrf_name \ |
| $PING6 2001:1:2::2 -c 1 -w $PING_TIMEOUT &> /dev/null |
| sysctl -qw net.ipv6.conf.all.forwarding=1 |
| |
| local t1=$(ipv6_stats_get $rtr1 Ip6InAddrErrors) |
| test "$((t1 - t0))" -ne 0 |
| check_err $? |
| log_test "Ip6InAddrErrors" |
| } |
| |
| ipv6_in_discard() |
| { |
| RET=0 |
| |
| local t0=$(ipv6_stats_get $rtr1 Ip6InDiscards) |
| local vrf_name=$(master_name_get $h1) |
| |
| # Add a policy to discard |
| ip xfrm policy add dst 2001:1:2::2/128 dir fwd action block |
| ip vrf exec $vrf_name \ |
| $PING6 2001:1:2::2 -c 1 -w $PING_TIMEOUT &> /dev/null |
| ip xfrm policy del dst 2001:1:2::2/128 dir fwd |
| |
| local t1=$(ipv6_stats_get $rtr1 Ip6InDiscards) |
| test "$((t1 - t0))" -ne 0 |
| check_err $? |
| log_test "Ip6InDiscards" |
| } |
| ipv6_ping() |
| { |
| RET=0 |
| |
| ping6_test $h1 2001:1:2::2 |
| } |
| |
| trap cleanup EXIT |
| |
| setup_prepare |
| setup_wait |
| tests_run |
| |
| exit $EXIT_STATUS |