All of lore.kernel.org
 help / color / mirror / Atom feed
* [MPTCP] Re: [MPTCP][PATCH v2 mptcp-next 3/6] mptcp: add set_flags command in PM netlink
@ 2020-12-09  1:29 Mat Martineau
  0 siblings, 0 replies; only message in thread
From: Mat Martineau @ 2020-12-09  1:29 UTC (permalink / raw)
  To: mptcp

[-- Attachment #1: Type: text/plain, Size: 4261 bytes --]

On Tue, 8 Dec 2020, Geliang Tang wrote:

> This patch added a new command MPTCP_PM_CMD_SET_FLAGS in PM netlink:
>
> In mptcp_nl_cmd_set_flags, parse the input address, get the backup value
> according to whether the address's FLAG_BACKUP or FLAG_NOBACKUP flag is
> set from the user-space. Then check whether this address had been added
> in the local address list. If it had been, then call mptcp_nl_addr_backup
> to deal with this address.
>
> In mptcp_nl_addr_backup, traverse all the existing msk sockets to find
> the relevant sockets, and call mptcp_pm_nl_mp_prio_send_ack to send out
> a MP_PRIO ACK packet.
>
> Finally in mptcp_nl_cmd_set_flags, set or clear the address's FLAG_BACKUP
> flag.
>
> Signed-off-by: Geliang Tang <geliangtang(a)gmail.com>
> ---
> include/uapi/linux/mptcp.h |  2 ++
> net/mptcp/pm_netlink.c     | 67 ++++++++++++++++++++++++++++++++++++++
> 2 files changed, 69 insertions(+)
>
> diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h
> index 9762660df741..5470da50f4ac 100644
> --- a/include/uapi/linux/mptcp.h
> +++ b/include/uapi/linux/mptcp.h
> @@ -72,6 +72,7 @@ enum {
> #define MPTCP_PM_ADDR_FLAG_SIGNAL			(1 << 0)
> #define MPTCP_PM_ADDR_FLAG_SUBFLOW			(1 << 1)
> #define MPTCP_PM_ADDR_FLAG_BACKUP			(1 << 2)
> +#define MPTCP_PM_ADDR_FLAG_NOBACKUP			(1 << 3)

Hi Geliang -

My understanding of Paolo's suggestion was that 'nobackup' is helpful for 
the 'ip mptcp' command line syntax, but I don't think that means a 
separate flag at the netlink level is needed.


Mat


>
> enum {
> 	MPTCP_PM_CMD_UNSPEC,
> @@ -82,6 +83,7 @@ enum {
> 	MPTCP_PM_CMD_FLUSH_ADDRS,
> 	MPTCP_PM_CMD_SET_LIMITS,
> 	MPTCP_PM_CMD_GET_LIMITS,
> +	MPTCP_PM_CMD_SET_FLAGS,
>
> 	__MPTCP_PM_CMD_AFTER_LAST
> };
> diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
> index fc61ca6dc04d..761cb5afa922 100644
> --- a/net/mptcp/pm_netlink.c
> +++ b/net/mptcp/pm_netlink.c
> @@ -1153,6 +1153,68 @@ mptcp_nl_cmd_get_limits(struct sk_buff *skb, struct genl_info *info)
> 	return -EMSGSIZE;
> }
>
> +static int mptcp_nl_addr_backup(struct net *net,
> +				struct mptcp_addr_info *addr,
> +				u8 bkup)
> +{
> +	long s_slot = 0, s_num = 0;
> +	struct mptcp_sock *msk;
> +	int ret = -EINVAL;
> +
> +	while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
> +		struct sock *sk = (struct sock *)msk;
> +
> +		if (list_empty(&msk->conn_list))
> +			goto next;
> +
> +		lock_sock(sk);
> +		spin_lock_bh(&msk->pm.lock);
> +		ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup);
> +		spin_unlock_bh(&msk->pm.lock);
> +		release_sock(sk);
> +
> +next:
> +		sock_put(sk);
> +		cond_resched();
> +	}
> +
> +	return ret;
> +}
> +
> +static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
> +{
> +	struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
> +	struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
> +	struct mptcp_pm_addr_entry addr, *entry;
> +	struct net *net = sock_net(skb->sk);
> +	u8 bkup;
> +	int ret;
> +
> +	ret = mptcp_pm_parse_addr(attr, info, true, &addr);
> +	if (ret < 0)
> +		return ret;
> +
> +	if (addr.addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
> +		bkup = 1;
> +	else if (addr.addr.flags & MPTCP_PM_ADDR_FLAG_NOBACKUP)
> +		bkup = 0;
> +
> +	list_for_each_entry(entry, &pernet->local_addr_list, list) {
> +		if (addresses_equal(&entry->addr, &addr.addr, true)) {
> +			ret = mptcp_nl_addr_backup(net, &entry->addr, bkup);
> +			if (ret)
> +				return ret;
> +
> +			if (bkup)
> +				entry->addr.flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
> +			else
> +				entry->addr.flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
> static const struct genl_small_ops mptcp_pm_ops[] = {
> 	{
> 		.cmd    = MPTCP_PM_CMD_ADD_ADDR,
> @@ -1183,6 +1245,11 @@ static const struct genl_small_ops mptcp_pm_ops[] = {
> 		.cmd    = MPTCP_PM_CMD_GET_LIMITS,
> 		.doit   = mptcp_nl_cmd_get_limits,
> 	},
> +	{
> +		.cmd    = MPTCP_PM_CMD_SET_FLAGS,
> +		.doit   = mptcp_nl_cmd_set_flags,
> +		.flags  = GENL_ADMIN_PERM,
> +	},
> };
>
> static struct genl_family mptcp_genl_family __ro_after_init = {
> -- 
> 2.26.2

--
Mat Martineau
Intel

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-12-09  1:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-09  1:29 [MPTCP] Re: [MPTCP][PATCH v2 mptcp-next 3/6] mptcp: add set_flags command in PM netlink Mat Martineau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.