[PATCH mptcp-next 07/10] selftests: mptcp: add endpoint_ops API helper

Geliang Tang posted 10 patches 1 year, 11 months ago
There is a newer version of this series
[PATCH mptcp-next 07/10] selftests: mptcp: add endpoint_ops API helper
Posted by Geliang Tang 1 year, 11 months ago
From: Geliang Tang <tanggeliang@kylinos.cn>

This patch moves six endpoint operation helpers with the pm_nl_ prefix:

	pm_nl_limits(),
	pm_nl_add_endpoint(),
	pm_nl_del_endpoint(),
	pm_nl_flush_endpoint(),
	pm_nl_show_endpoints() and
	pm_nl_change_endpoint()

from mptcp_join.sh into mptcp_lib.sh as public functions, and renamed each
of them with a mptcp_lib_ prefix.

Add a new helper mptcp_lib_endpoint_ops() in mptcp_lib.sh as the API for
all endpoint operation helpers, which invokes each of mptcp_lib_ prefix
helpers according to the first argument of it is "limits", "add", "del",
"flush", "show" or "change".

Usage:
        mptcp_lib_endpoint_ops limits $ns $addrs $subflows
        mptcp_lib_endpoint_ops add $ns $addr
        mptcp_lib_endpoint_ops del $ns $id $addr
        mptcp_lib_endpoint_ops flush $ns
        mptcp_lib_endpoint_ops show $ns
        mptcp_lib_endpoint_ops change $ns $id $flags

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 .../testing/selftests/net/mptcp/mptcp_join.sh | 107 +------------
 .../testing/selftests/net/mptcp/mptcp_lib.sh  | 148 ++++++++++++++++++
 2 files changed, 155 insertions(+), 100 deletions(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 431233e25abc..8e35f875147b 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -603,132 +603,39 @@ kill_events_pids()
 	evts_ns2_pid=0
 }
 
-pm_nl_limits()
-{
-	local ns=$1
-	local addrs=$2
-	local subflows=$3
-
-	if mptcp_lib_is_ip_mptcp; then
-		local limits="limits"
-
-		if [ -n "$addrs" ] && [ -n "$subflows" ]; then
-			limits+=" set add_addr_accepted $addrs subflows $subflows"
-		fi
-		ip -n $ns mptcp $limits
-	else
-		ip netns exec $ns ./pm_nl_ctl limits $addrs $subflows
-	fi
-}
-
 pm_nl_set_limits()
 {
-	pm_nl_limits "${@}"
+	mptcp_lib_endpoint_ops limits "${@}"
 }
 
 pm_nl_get_limits()
 {
-	pm_nl_limits "${@}"
+	mptcp_lib_endpoint_ops limits "${@}"
 }
 
 pm_nl_add_endpoint()
 {
-	local ns=$1
-	local addr=$2
-	local flags _flags
-	local port _port
-	local dev _dev
-	local id _id
-	local nr=2
-
-	local p
-	for p in "${@}"
-	do
-		if [ $p = "flags" ]; then
-			eval _flags=\$"$nr"
-			[ -n "$_flags" ]; flags="flags $_flags"
-		fi
-		if [ $p = "dev" ]; then
-			eval _dev=\$"$nr"
-			[ -n "$_dev" ]; dev="dev $_dev"
-		fi
-		if [ $p = "id" ]; then
-			eval _id=\$"$nr"
-			[ -n "$_id" ]; id="id $_id"
-		fi
-		if [ $p = "port" ]; then
-			eval _port=\$"$nr"
-			[ -n "$_port" ]; port="port $_port"
-		fi
-
-		nr=$((nr + 1))
-	done
-
-	if mptcp_lib_is_ip_mptcp; then
-		ip -n $ns mptcp endpoint add $addr ${_flags//","/" "} $dev $id $port
-	else
-		ip netns exec $ns ./pm_nl_ctl add $addr $flags $dev $id $port
-	fi
+	mptcp_lib_endpoint_ops add "${@}"
 }
 
 pm_nl_del_endpoint()
 {
-	local ns=$1
-	local id=$2
-	local addr=$3
-
-	if mptcp_lib_is_ip_mptcp; then
-		[ $id -ne 0 ] && addr=''
-		ip -n $ns mptcp endpoint delete id $id $addr
-	else
-		ip netns exec $ns ./pm_nl_ctl del $id $addr
-	fi
+	mptcp_lib_endpoint_ops del "${@}"
 }
 
 pm_nl_flush_endpoint()
 {
-	local ns=$1
-
-	if mptcp_lib_is_ip_mptcp; then
-		ip -n $ns mptcp endpoint flush
-	else
-		ip netns exec $ns ./pm_nl_ctl flush
-	fi
+	mptcp_lib_endpoint_ops flush "${@}"
 }
 
 pm_nl_show_endpoints()
 {
-	local ns=$1
-	local id=$2
-
-	if mptcp_lib_is_ip_mptcp; then
-		local show="show"
-
-		[ -n "$id" ] && show+=" id $id"
-		ip -n $ns mptcp endpoint $show
-	else
-		local dump="dump"
-
-		[ -n "$id" ] && dump="get $id"
-		ip netns exec $ns ./pm_nl_ctl $dump
-	fi
+	mptcp_lib_endpoint_ops show "${@}"
 }
 
 pm_nl_change_endpoint()
 {
-	local ns=$1
-	local addr=$2
-	local flags=$3
-
-	if ! mptcp_lib_is_addr "$addr"; then
-		[ $addr -gt 0 ] && [ $addr -lt 256 ] && addr="id $addr"
-	fi
-
-	if mptcp_lib_is_ip_mptcp; then
-		ip -n $ns mptcp endpoint change $addr ${flags//","/" "}
-	else
-		ip netns exec $ns ./pm_nl_ctl set $addr flags $flags
-	fi
+	mptcp_lib_endpoint_ops change "${@}"
 }
 
 pm_nl_check_endpoint()
diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
index c465f1d59419..d395692fac0d 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
@@ -523,3 +523,151 @@ mptcp_lib_is_ip_mptcp() {
 
 	[ ${mptcp_lib_ip_mptcp} -eq 1 ]
 }
+
+mptcp_lib_limits() {
+	local ns=${1}
+	local addrs=${2}
+	local subflows=${3}
+
+	if mptcp_lib_is_ip_mptcp; then
+		local limits="limits"
+
+		if [ -n "${addrs}" ] && [ -n "${subflows}" ]; then
+			limits+=" set add_addr_accepted ${addrs} subflows ${subflows}"
+		fi
+		# shellcheck disable=SC2086
+		ip -n "${ns}" mptcp ${limits}
+	else
+		# shellcheck disable=SC2086
+		ip netns exec "${ns}" ./pm_nl_ctl limits "${addrs}" ${subflows}
+	fi
+}
+
+mptcp_lib_add_endpoint() {
+	local ns=${1}
+	local addr=${2}
+	local flags _flags
+	local port _port
+	local dev _dev
+	local id _id
+	local nr=2
+
+	local p
+	for p in "${@}"
+	do
+		if [ "${p}" = "flags" ]; then
+			eval _flags=\$"${nr}"
+			[ -n "${_flags}" ]; flags="flags ${_flags}"
+		fi
+		if [ "${p}" = "dev" ]; then
+			eval _dev=\$"${nr}"
+			[ -n "${_dev}" ]; dev="dev ${_dev}"
+		fi
+		if [ "${p}" = "id" ]; then
+			eval _id=\$"${nr}"
+			[ -n "${_id}" ]; id="id ${_id}"
+		fi
+		if [ "${p}" = "port" ]; then
+			eval _port=\$"${nr}"
+			[ -n "${_port}" ]; port="port ${_port}"
+		fi
+
+		nr=$((nr + 1))
+	done
+
+	if mptcp_lib_is_ip_mptcp; then
+		# shellcheck disable=SC2086
+		ip -n "${ns}" mptcp endpoint add "${addr}" ${_flags//","/" "} ${dev} ${id} ${port}
+	else
+		# shellcheck disable=SC2086
+		ip netns exec "${ns}" ./pm_nl_ctl add "${addr}" ${flags} ${dev} ${id} ${port}
+	fi
+}
+
+mptcp_lib_del_endpoint() {
+	local ns=${1}
+	local id=${2}
+	local addr=${3}
+
+	if mptcp_lib_is_ip_mptcp; then
+		[ "${id}" -ne 0 ] && addr=''
+		# shellcheck disable=SC2086
+		ip -n "${ns}" mptcp endpoint delete id "${id}" ${addr}
+	else
+		ip netns exec "${ns}" ./pm_nl_ctl del "${id}" "${addr}"
+	fi
+}
+
+mptcp_lib_flush_endpoint() {
+	local ns=${1}
+
+	if mptcp_lib_is_ip_mptcp; then
+		ip -n "${ns}" mptcp endpoint flush
+	else
+		ip netns exec "${ns}" ./pm_nl_ctl flush
+	fi
+}
+
+mptcp_lib_show_endpoints() {
+	local ns=${1}
+	local id=${2}
+
+	if mptcp_lib_is_ip_mptcp; then
+		local show="show"
+
+		[ -n "${id}" ] && show+=" id ${id}"
+		# shellcheck disable=SC2086
+		ip -n "${ns}" mptcp endpoint ${show}
+	else
+		local dump="dump"
+
+		[ -n "${id}" ] && dump="get ${id}"
+		# shellcheck disable=SC2086
+		ip netns exec "${ns}" ./pm_nl_ctl ${dump}
+	fi
+}
+
+mptcp_lib_change_endpoint() {
+	local ns=${1}
+	local addr=${2}
+	local flags=${3}
+
+	if ! mptcp_lib_is_addr "${addr}"; then
+		[ "${addr}" -gt 0 ] && [ "${addr}" -lt 256 ] && addr="id ${addr}"
+	fi
+
+	if mptcp_lib_is_ip_mptcp; then
+		# shellcheck disable=SC2086
+		ip -n "${ns}" mptcp endpoint change ${addr} ${flags//","/" "}
+	else
+		# shellcheck disable=SC2086
+		ip netns exec "${ns}" ./pm_nl_ctl set ${addr} flags "${flags}"
+	fi
+}
+
+mptcp_lib_endpoint_ops() {
+	[ "$#" -lt 2 ] && return 1
+
+	case "$1" in
+	"limits")
+		mptcp_lib_limits "${@:2}"
+		;;
+	"add")
+		mptcp_lib_add_endpoint "${@:2}"
+		;;
+	"del")
+		mptcp_lib_del_endpoint "${@:2}"
+		;;
+	"flush")
+		mptcp_lib_flush_endpoint "${@:2}"
+		;;
+	"show")
+		mptcp_lib_show_endpoints "${@:2}"
+		;;
+	"change")
+		mptcp_lib_change_endpoint "${@:2}"
+		;;
+	*)
+		;;
+	esac
+}
-- 
2.40.1
Re: [PATCH mptcp-next 07/10] selftests: mptcp: add endpoint_ops API helper
Posted by Matthieu Baerts 1 year, 11 months ago
Hi Geliang,

On 11/03/2024 02:48, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
> 
> This patch moves six endpoint operation helpers with the pm_nl_ prefix:
> 
> 	pm_nl_limits(),
> 	pm_nl_add_endpoint(),
> 	pm_nl_del_endpoint(),
> 	pm_nl_flush_endpoint(),
> 	pm_nl_show_endpoints() and
> 	pm_nl_change_endpoint()
> 
> from mptcp_join.sh into mptcp_lib.sh as public functions, and renamed each
> of them with a mptcp_lib_ prefix.
> 
> Add a new helper mptcp_lib_endpoint_ops() in mptcp_lib.sh as the API for
> all endpoint operation helpers, which invokes each of mptcp_lib_ prefix
> helpers according to the first argument of it is "limits", "add", "del",
> "flush", "show" or "change".
> 
> Usage:
>         mptcp_lib_endpoint_ops limits $ns $addrs $subflows
>         mptcp_lib_endpoint_ops add $ns $addr
>         mptcp_lib_endpoint_ops del $ns $id $addr
>         mptcp_lib_endpoint_ops flush $ns
>         mptcp_lib_endpoint_ops show $ns
>         mptcp_lib_endpoint_ops change $ns $id $flags

I'm not sure to understand why you called this helper "endpoint". With
"pm_nl", it means it is linked to the Path Manager, the Netlink
interface. Maybe best to use 'mptcp_lib_pm_nl_ops'?

(...)

> diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
> index c465f1d59419..d395692fac0d 100644
> --- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
> +++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
> @@ -523,3 +523,151 @@ mptcp_lib_is_ip_mptcp() {
>  
>  	[ ${mptcp_lib_ip_mptcp} -eq 1 ]
>  }
> +
> +mptcp_lib_limits() {

Same here for the prefix, "limits" is too vague:

  mptcp_lib_pm_nl_limits()

> +	local ns=${1}
> +	local addrs=${2}
> +	local subflows=${3}
> +
> +	if mptcp_lib_is_ip_mptcp; then
> +		local limits="limits"
> +
> +		if [ -n "${addrs}" ] && [ -n "${subflows}" ]; then
> +			limits+=" set add_addr_accepted ${addrs} subflows ${subflows}"
> +		fi
> +		# shellcheck disable=SC2086

Please *always* *always* justify why you ignore a rule, e.g.

  # shellcheck disable=SCXXXX  ## <reason>

or

  # <long description>
  # <on multiple lines>
  # shellcheck disable=SCXXXX


(I guess you don't need to ignore that if you look at my comment on
patch 2/10, same below)

> +		ip -n "${ns}" mptcp ${limits}
> +	else
> +		# shellcheck disable=SC2086
> +		ip netns exec "${ns}" ./pm_nl_ctl limits "${addrs}" ${subflows}
> +	fi
> +}
> +
> +mptcp_lib_add_endpoint() {
> +	local ns=${1}
> +	local addr=${2}
> +	local flags _flags
> +	local port _port
> +	local dev _dev
> +	local id _id
> +	local nr=2
> +
> +	local p
> +	for p in "${@}"
> +	do
> +		if [ "${p}" = "flags" ]; then
> +			eval _flags=\$"${nr}"
> +			[ -n "${_flags}" ]; flags="flags ${_flags}"
> +		fi
> +		if [ "${p}" = "dev" ]; then
> +			eval _dev=\$"${nr}"
> +			[ -n "${_dev}" ]; dev="dev ${_dev}"
> +		fi
> +		if [ "${p}" = "id" ]; then
> +			eval _id=\$"${nr}"
> +			[ -n "${_id}" ]; id="id ${_id}"
> +		fi
> +		if [ "${p}" = "port" ]; then
> +			eval _port=\$"${nr}"
> +			[ -n "${_port}" ]; port="port ${_port}"
> +		fi
> +
> +		nr=$((nr + 1))
> +	done
> +
> +	if mptcp_lib_is_ip_mptcp; then
> +		# shellcheck disable=SC2086

I wonder if you couldn't use arrays:

  dev=(dev "${_dev}")
  (...)
  ip (...) "${dev[@]}")

> +		ip -n "${ns}" mptcp endpoint add "${addr}" ${_flags//","/" "} ${dev} ${id} ${port}
> +	else
> +		# shellcheck disable=SC2086
> +		ip netns exec "${ns}" ./pm_nl_ctl add "${addr}" ${flags} ${dev} ${id} ${port}
> +	fi
> +}
> +
> +mptcp_lib_del_endpoint() {
> +	local ns=${1}
> +	local id=${2}
> +	local addr=${3}
> +
> +	if mptcp_lib_is_ip_mptcp; then
> +		[ "${id}" -ne 0 ] && addr=''
> +		# shellcheck disable=SC2086
> +		ip -n "${ns}" mptcp endpoint delete id "${id}" ${addr}

or something like that to avoid the disable:

  ${addr:+"${addr}"}

> +	else
> +		ip netns exec "${ns}" ./pm_nl_ctl del "${id}" "${addr}"
> +	fi
> +}
> +
> +mptcp_lib_flush_endpoint() {
> +	local ns=${1}
> +
> +	if mptcp_lib_is_ip_mptcp; then
> +		ip -n "${ns}" mptcp endpoint flush
> +	else
> +		ip netns exec "${ns}" ./pm_nl_ctl flush
> +	fi
> +}
> +
> +mptcp_lib_show_endpoints() {

(I guess this one is only needed in pm_netlink.sh, no?)

> +	local ns=${1}
> +	local id=${2}
> +
> +	if mptcp_lib_is_ip_mptcp; then
> +		local show="show"
> +
> +		[ -n "${id}" ] && show+=" id ${id}"
> +		# shellcheck disable=SC2086
> +		ip -n "${ns}" mptcp endpoint ${show}

Maybe this to avoid the disable:

  ip -n "${ns}" mptcp endpoint show ${id:+id "${id}"}

Same below

> +	else
> +		local dump="dump"
> +
> +		[ -n "${id}" ] && dump="get ${id}"
> +		# shellcheck disable=SC2086
> +		ip netns exec "${ns}" ./pm_nl_ctl ${dump}
> +	fi
> +}
> +
> +mptcp_lib_change_endpoint() {

(I guess this one is only needed in pm_netlink.sh, no?)

> +	local ns=${1}
> +	local addr=${2}
> +	local flags=${3}
> +
> +	if ! mptcp_lib_is_addr "${addr}"; then
> +		[ "${addr}" -gt 0 ] && [ "${addr}" -lt 256 ] && addr="id ${addr}"

use an array?

  XX=("${addr}")
  XX=("id ${addr}")
  ${XX[@]}

> +	fi
> +
> +	if mptcp_lib_is_ip_mptcp; then
> +		# shellcheck disable=SC2086
> +		ip -n "${ns}" mptcp endpoint change ${addr} ${flags//","/" "}
> +	else
> +		# shellcheck disable=SC2086
> +		ip netns exec "${ns}" ./pm_nl_ctl set ${addr} flags "${flags}"
> +	fi
> +}
> +
> +mptcp_lib_endpoint_ops() {
> +	[ "$#" -lt 2 ] && return 1
> +
> +	case "$1" in

(missing {} → ${1})

> +	"limits")
> +		mptcp_lib_limits "${@:2}"
> +		;;
> +	"add")
> +		mptcp_lib_add_endpoint "${@:2}"
> +		;;
> +	"del")
> +		mptcp_lib_del_endpoint "${@:2}"
> +		;;
> +	"flush")
> +		mptcp_lib_flush_endpoint "${@:2}"
> +		;;
> +	"show")
> +		mptcp_lib_show_endpoints "${@:2}"
> +		;;
> +	"change")
> +		mptcp_lib_change_endpoint "${@:2}"
> +		;;
> +	*)
> +		;;
> +	esac
> +}

I'm not sure to see the advantage of using mptcp_lib_endpoint_ops(), why
not directly calling mptcp_lib_pm_nl_limits, etc.?

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.