#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

. "$(dirname "${0}")/mptcp_lib.sh"

ret=0

usage() {
	echo "Usage: $0 [ -i ] [ -h ]"
	echo -e "\t-i: use 'ip mptcp' instead of 'pm_nl_ctl'"
	echo -e "\t-h: help"
}

optstring=hi
while getopts "$optstring" option;do
	case "$option" in
	"h")
		usage "$0"
		exit ${KSFT_PASS}
		;;
	"i")
		mptcp_lib_set_ip_mptcp
		;;
	"?")
		usage "$0"
		exit ${KSFT_FAIL}
		;;
	esac
done

ns1=""
err=$(mktemp)

# This function is used in the cleanup trap
#shellcheck disable=SC2317
cleanup()
{
	rm -f "${err}"
	mptcp_lib_ns_exit "${ns1}"
}

mptcp_lib_check_mptcp
mptcp_lib_check_tools ip

trap cleanup EXIT

mptcp_lib_ns_init ns1

format_limits() {
	local accept="${1}"
	local subflows="${2}"

	if mptcp_lib_is_ip_mptcp; then
		# with a space at the end
		printf "add_addr_accepted %d subflows %d \n" "${accept}" "${subflows}"
	else
		printf "accept %d\nsubflows %d\n" "${accept}" "${subflows}"
	fi
}

get_limits() {
	if mptcp_lib_is_ip_mptcp; then
		ip -n "${ns1}" mptcp limits
	else
		ip netns exec "${ns1}" ./pm_nl_ctl limits
	fi
}

format_endpoints() {
	mptcp_lib_pm_nl_format_endpoints "${@}"
}

get_endpoint() {
	# shellcheck disable=SC2317 # invoked indirectly
	mptcp_lib_pm_nl_get_endpoint "${ns1}" "${@}"
}

change_address() {
	local addr=${1}
	local flags=${2}

	if mptcp_lib_is_ip_mptcp; then
		ip -n "${ns1}" mptcp endpoint change "${addr}" "${flags}"
	else
		ip netns exec "${ns1}" ./pm_nl_ctl set "${addr}" flags "${flags}"
	fi
}

set_limits()
{
	mptcp_lib_pm_nl_set_limits "${ns1}" "${@}"
}

add_endpoint()
{
	mptcp_lib_pm_nl_add_endpoint "${ns1}" "${@}"
}

del_endpoint()
{
	mptcp_lib_pm_nl_del_endpoint "${ns1}" "${@}"
}

flush_endpoint()
{
	mptcp_lib_pm_nl_flush_endpoint "${ns1}"
}

show_endpoints()
{
	mptcp_lib_pm_nl_show_endpoints "${ns1}"
}

change_endpoint()
{
	mptcp_lib_pm_nl_change_endpoint "${ns1}" "${@}"
}

check()
{
	local cmd="$1"
	local expected="$2"
	local msg="$3"
	local rc=0

	mptcp_lib_print_title "$msg"
	mptcp_lib_check_output "${err}" "${cmd}" "${expected}" || rc=${?}
	if [ ${rc} -eq 2 ]; then
		mptcp_lib_result_fail "${msg} # error ${rc}"
		ret=${KSFT_FAIL}
	elif [ ${rc} -eq 0 ]; then
		mptcp_lib_print_ok "[ OK ]"
		mptcp_lib_result_pass "${msg}"
	elif [ ${rc} -eq 1 ]; then
		mptcp_lib_result_fail "${msg} # different output"
		ret=${KSFT_FAIL}
	fi
}

mptcp_lib_subtests_last_ts_reset

check "show_endpoints" "" "defaults addr list"

default_limits="$(get_limits)"
if mptcp_lib_expect_all_features; then
	check "get_limits" "$(format_limits 0 2)" "defaults limits"
fi

add_endpoint 10.0.1.1
add_endpoint 10.0.1.2 flags subflow dev lo
add_endpoint 10.0.1.3 flags signal,backup
check "get_endpoint 1" "$(format_endpoints "1,10.0.1.1")" "simple add/get addr"

check "show_endpoints" \
	"$(format_endpoints "1,10.0.1.1" \
			    "2,10.0.1.2,subflow,lo" \
			    "3,10.0.1.3,signal backup")" "dump addrs"

del_endpoint 2
check "get_endpoint 2" "" "simple del addr"
check "show_endpoints" \
	"$(format_endpoints "1,10.0.1.1" \
			    "3,10.0.1.3,signal backup")" "dump addrs after del"

add_endpoint 10.0.1.3 2>/dev/null
check "get_endpoint 4" "" "duplicate addr"

add_endpoint 10.0.1.4 flags signal
check "get_endpoint 4" "$(format_endpoints "4,10.0.1.4,signal")" "id addr increment"

for i in $(seq 5 9); do
	add_endpoint "10.0.1.${i}" flags signal >/dev/null 2>&1
done
check "get_endpoint 9" "$(format_endpoints "9,10.0.1.9,signal")" "hard addr limit"
check "get_endpoint 10" "" "above hard addr limit"

del_endpoint 9
for i in $(seq 10 255); do
	add_endpoint 10.0.0.9 id "${i}"
	del_endpoint "${i}"
done
check "show_endpoints" \
	"$(format_endpoints "1,10.0.1.1" \
			    "3,10.0.1.3,signal backup" \
			    "4,10.0.1.4,signal" \
			    "5,10.0.1.5,signal" \
			    "6,10.0.1.6,signal" \
			    "7,10.0.1.7,signal" \
			    "8,10.0.1.8,signal")" "id limit"

flush_endpoint
check "show_endpoints" "" "flush addrs"

set_limits 9 1 2>/dev/null
check "get_limits" "${default_limits}" "rcv addrs above hard limit"

set_limits 1 9 2>/dev/null
check "get_limits" "${default_limits}" "subflows above hard limit"

set_limits 8 8
check "get_limits" "$(format_limits 8 8)" "set limits"

flush_endpoint
add_endpoint 10.0.1.1
add_endpoint 10.0.1.2
add_endpoint 10.0.1.3 id 100
add_endpoint 10.0.1.4
add_endpoint 10.0.1.5 id 254
add_endpoint 10.0.1.6
add_endpoint 10.0.1.7
add_endpoint 10.0.1.8
check "show_endpoints" \
	"$(format_endpoints "1,10.0.1.1" \
			    "2,10.0.1.2" \
			    "3,10.0.1.7" \
			    "4,10.0.1.8" \
			    "100,10.0.1.3" \
			    "101,10.0.1.4" \
			    "254,10.0.1.5" \
			    "255,10.0.1.6")" "set ids"

flush_endpoint
add_endpoint 10.0.0.1
add_endpoint 10.0.0.2 id 254
add_endpoint 10.0.0.3
add_endpoint 10.0.0.4
add_endpoint 10.0.0.5 id 253
add_endpoint 10.0.0.6
add_endpoint 10.0.0.7
add_endpoint 10.0.0.8
check "show_endpoints" \
	"$(format_endpoints "1,10.0.0.1" \
			    "2,10.0.0.4" \
			    "3,10.0.0.6" \
			    "4,10.0.0.7" \
			    "5,10.0.0.8" \
			    "253,10.0.0.5" \
			    "254,10.0.0.2" \
			    "255,10.0.0.3")" "wrap-around ids"

flush_endpoint
add_endpoint 10.0.1.1 flags subflow
change_address 10.0.1.1 backup
check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow backup")" \
	"set flags (backup)"
change_address 10.0.1.1 nobackup
check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow")" \
	"          (nobackup)"

# fullmesh support has been added later
change_endpoint 1 fullmesh 2>/dev/null
if show_endpoints | grep -q "fullmesh" ||
   mptcp_lib_expect_all_features; then
	check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow fullmesh")" \
		"          (fullmesh)"
	change_endpoint 1 nofullmesh
	check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow")" \
		"          (nofullmesh)"
	change_endpoint 1 backup,fullmesh
	check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow backup fullmesh")" \
		"          (backup,fullmesh)"
else
	for st in fullmesh nofullmesh backup,fullmesh; do
		st="          (${st})"
		mptcp_lib_print_title "${st}"
		mptcp_lib_pr_skip
		mptcp_lib_result_skip "${st}"
	done
fi

mptcp_lib_result_print_all_tap
exit $ret
