#!/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
