[PATCH mptcp-next v3 1/3] mptcp: set fullmesh flag in pm_netlink

Geliang Tang posted 3 patches 4 years ago
There is a newer version of this series
[PATCH mptcp-next v3 1/3] mptcp: set fullmesh flag in pm_netlink
Posted by Geliang Tang 4 years ago
This patch added the fullmesh flag setting support in pm_netlink.

If the fullmesh flag of the address is changed, remove all the related
subflows, update the fullmesh flag and create subflows again.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 net/mptcp/pm_netlink.c | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 4c06cd6381ef..ef1d58373ef2 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1722,7 +1722,18 @@ mptcp_nl_cmd_get_limits(struct sk_buff *skb, struct genl_info *info)
 	return -EMSGSIZE;
 }
 
-static int mptcp_nl_addr_backup(struct net *net,
+static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
+				 struct mptcp_addr_info *addr)
+{
+	struct mptcp_rm_list list = { .nr = 0 };
+
+	list.ids[list.nr++] = addr->id;
+
+	mptcp_pm_nl_rm_subflow_received(msk, &list);
+	mptcp_pm_create_subflow_or_signal_addr(msk);
+}
+
+static int mptcp_nl_addr_flags(struct net *net,
 				struct mptcp_addr_info *addr,
 				u8 bkup)
 {
@@ -1739,6 +1750,7 @@ static int mptcp_nl_addr_backup(struct net *net,
 		lock_sock(sk);
 		spin_lock_bh(&msk->pm.lock);
 		ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup);
+		mptcp_pm_nl_fullmesh(msk, addr);
 		spin_unlock_bh(&msk->pm.lock);
 		release_sock(sk);
 
@@ -1757,6 +1769,7 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
 	struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
 	struct net *net = sock_net(skb->sk);
 	u8 bkup = 0, lookup_by_id = 0;
+	u8 fullmesh = 0;
 	int ret;
 
 	ret = mptcp_pm_parse_addr(attr, info, false, &addr);
@@ -1765,6 +1778,8 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
 
 	if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
 		bkup = 1;
+	else if (addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH)
+		fullmesh = 1;
 	if (addr.addr.family == AF_UNSPEC) {
 		lookup_by_id = 1;
 		if (!addr.addr.id)
@@ -1778,14 +1793,25 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
 		return -EINVAL;
 	}
 
+	if (fullmesh && (entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) {
+		spin_unlock_bh(&pernet->lock);
+		return -EINVAL;
+	}
+
 	if (bkup)
 		entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
 	else
 		entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
+
+	if (fullmesh)
+		entry->flags |= MPTCP_PM_ADDR_FLAG_FULLMESH;
+	else
+		entry->flags &= ~MPTCP_PM_ADDR_FLAG_FULLMESH;
+
 	addr = *entry;
 	spin_unlock_bh(&pernet->lock);
 
-	mptcp_nl_addr_backup(net, &addr.addr, bkup);
+	mptcp_nl_addr_flags(net, &addr.addr, bkup);
 	return 0;
 }
 
-- 
2.31.1


Re: [PATCH mptcp-next v3 1/3] mptcp: set fullmesh flag in pm_netlink
Posted by Paolo Abeni 4 years ago
On Tue, 2022-01-11 at 23:06 +0800, Geliang Tang wrote:
> This patch added the fullmesh flag setting support in pm_netlink.
> 
> If the fullmesh flag of the address is changed, remove all the related
> subflows, update the fullmesh flag and create subflows again.
> 
> Signed-off-by: Geliang Tang <geliang.tang@suse.com>
> ---
>  net/mptcp/pm_netlink.c | 30 ++++++++++++++++++++++++++++--
>  1 file changed, 28 insertions(+), 2 deletions(-)
> 
> diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
> index 4c06cd6381ef..ef1d58373ef2 100644
> --- a/net/mptcp/pm_netlink.c
> +++ b/net/mptcp/pm_netlink.c
> @@ -1722,7 +1722,18 @@ mptcp_nl_cmd_get_limits(struct sk_buff *skb, struct genl_info *info)
>  	return -EMSGSIZE;
>  }
>  
> -static int mptcp_nl_addr_backup(struct net *net,
> +static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
> +				 struct mptcp_addr_info *addr)
> +{
> +	struct mptcp_rm_list list = { .nr = 0 };
> +
> +	list.ids[list.nr++] = addr->id;
> +
> +	mptcp_pm_nl_rm_subflow_received(msk, &list);
> +	mptcp_pm_create_subflow_or_signal_addr(msk);
> +}
> +
> +static int mptcp_nl_addr_flags(struct net *net,
>  				struct mptcp_addr_info *addr,
>  				u8 bkup)
>  {
> @@ -1739,6 +1750,7 @@ static int mptcp_nl_addr_backup(struct net *net,
>  		lock_sock(sk);
>  		spin_lock_bh(&msk->pm.lock);
>  		ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup);
> +		mptcp_pm_nl_fullmesh(msk, addr);

I think it would be better moving the check for
MPTCP_PM_ADDR_FLAG_SIGNAL here (the following assumes
mptcp_nl_addr_flags() get a mptcp_pm_addr_entry argument, see below):

		if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL))
			mptcp_pm_nl_fullmesh(msk, &entry->addr);

>  		spin_unlock_bh(&msk->pm.lock);
>  		release_sock(sk);
>  
> @@ -1757,6 +1769,7 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
>  	struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
>  	struct net *net = sock_net(skb->sk);
>  	u8 bkup = 0, lookup_by_id = 0;
> +	u8 fullmesh = 0;
>  	int ret;
>  
>  	ret = mptcp_pm_parse_addr(attr, info, false, &addr);
> @@ -1765,6 +1778,8 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
>  
>  	if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
>  		bkup = 1;
> +	else if (addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH)
> +		fullmesh = 1;
>  	if (addr.addr.family == AF_UNSPEC) {
>  		lookup_by_id = 1;
>  		if (!addr.addr.id)
> @@ -1778,14 +1793,25 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
>  		return -EINVAL;
>  	}
>  
> +	if (fullmesh && (entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) {
> +		spin_unlock_bh(&pernet->lock);
> +		return -EINVAL;

With the change proposed above we can drop this chunk, and avoiding
returning an error.

> +	}
> +
>  	if (bkup)
>  		entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
>  	else
>  		entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
> +
> +	if (fullmesh)
> +		entry->flags |= MPTCP_PM_ADDR_FLAG_FULLMESH;
> +	else
> +		entry->flags &= ~MPTCP_PM_ADDR_FLAG_FULLMESH;
> +
>  	addr = *entry;
>  	spin_unlock_bh(&pernet->lock);
>  
> -	mptcp_nl_addr_backup(net, &addr.addr, bkup);
> +	mptcp_nl_addr_flags(net, &addr.addr, bkup);

If we change the 2# arguments of mptcp_nl_addr_flags() to
'mptcp_pm_addr_entry' and we pass '&addr' here, we can drop the 'bkup'
argument. It's a bit strange to provide 'bkup' but not 'fullmesh'.

I think all the mentioned changes could land in a squash-to patch, if
that fits others.

Thanks!

Paolo