Commit 7134ba69 authored by Davide Caratti's avatar Davide Caratti Committed by Geliang Tang
Browse files

net: mptcp: convert netlink from small_ops to ops

mainline inclusion
from mainline-v6.7-rc1
commit 1d0507f46843b14b0cb051fe50ebc7e6432111ab
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9VYQ9
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=1d0507f46843b14b0cb051fe50ebc7e6432111ab

--------------------------------

in the current MPTCP control plane, all operations use a netlink
attribute of the same type "MPTCP_PM_ATTR". However, add/del/get/flush
operations only parse the first element in the message _ the one that
describes MPTCP endpoints (that was named MPTCP_PM_ATTR_ADDR and
mostly used in ADD_ADDR operations _ probably the similarity of "attr",
"addr" and "add" might cause some confusion to human readers).
Convert MPTCP from 'small_ops' to 'ops', thus allowing different attributes
for each single operation, hopefully makes all this clearer to human
readers.

- use a separate attribute set for add/del/get/flush address operation,
  binary compatible with the existing one, to store the endpoint address.
  MPTCP_PM_ENDPOINT_ADDR is added to the uAPI (with the same value as
  MPTCP_PM_ATTR_ADDR) for these operations.
- convert mptcp_pm_ops[] and add policy files accordingly.

this prepares MPTCP control plane to be described as YAML spec.

Link: https://github.com/multipath-tcp/mptcp_net-next/issues/340


Acked-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarDavide Caratti <dcaratti@redhat.com>
Signed-off-by: default avatarMat Martineau <martineau@kernel.org>
Link: https://lore.kernel.org/r/20231023-send-net-next-20231023-1-v2-3-16b1f701f900@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Reviewed-by: default avatarJackie Liu <liuyun01@kylinos.cn>
Signed-off-by: default avatarGeliang Tang <tanggeliang@kylinos.cn>
parent a6bb70f5
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -65,6 +65,14 @@ enum {

#define MPTCP_PM_ATTR_MAX (__MPTCP_PM_ATTR_MAX - 1)

enum {
	MPTCP_PM_ENDPOINT_ADDR = 1,

	__MPTCP_PM_ENDPOINT_MAX
};

#define MPTCP_PM_ENDPOINT_MAX (__MPTCP_PM_ENDPOINT_MAX - 1)

enum {
	MPTCP_PM_ADDR_ATTR_UNSPEC,

+128 −65
Original line number Diff line number Diff line
@@ -48,6 +48,60 @@ struct pm_nl_pernet {
#define MPTCP_PM_ADDR_MAX	8
#define ADD_ADDR_RETRANS_MAX	3

static
const struct nla_policy mptcp_pm_address_nl_policy[MPTCP_PM_ADDR_ATTR_IF_IDX + 1] = {
	[MPTCP_PM_ADDR_ATTR_FAMILY] = { .type = NLA_U16, },
	[MPTCP_PM_ADDR_ATTR_ID] = { .type = NLA_U8, },
	[MPTCP_PM_ADDR_ATTR_ADDR4] = { .type = NLA_U32, },
	[MPTCP_PM_ADDR_ATTR_ADDR6] = NLA_POLICY_EXACT_LEN(16),
	[MPTCP_PM_ADDR_ATTR_PORT] = { .type = NLA_U16, },
	[MPTCP_PM_ADDR_ATTR_FLAGS] = { .type = NLA_U32, },
	[MPTCP_PM_ADDR_ATTR_IF_IDX] = { .type = NLA_S32, },
};

/* MPTCP_PM_CMD_ADD_ADDR / DEL / GET / FLUSH - do */
static
const struct nla_policy mptcp_pm_endpoint_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1] = {
	[MPTCP_PM_ENDPOINT_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy),
};

/* MPTCP_PM_CMD_SET_LIMITS - do */
static
const struct nla_policy mptcp_pm_set_limits_nl_policy[MPTCP_PM_ATTR_SUBFLOWS + 1] = {
	[MPTCP_PM_ATTR_RCV_ADD_ADDRS] = { .type = NLA_U32, },
	[MPTCP_PM_ATTR_SUBFLOWS] = { .type = NLA_U32, },
};

/* MPTCP_PM_CMD_SET_FLAGS - do */
static
const struct nla_policy mptcp_pm_set_flags_nl_policy[MPTCP_PM_ATTR_ADDR_REMOTE + 1] = {
	[MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy),
	[MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, },
	[MPTCP_PM_ATTR_ADDR_REMOTE] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy),
};

/* MPTCP_PM_CMD_ANNOUNCE - do */
static
const struct nla_policy mptcp_pm_announce_nl_policy[MPTCP_PM_ATTR_TOKEN + 1] = {
	[MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy),
	[MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, },
};

/* MPTCP_PM_CMD_REMOVE - do */
static
const struct nla_policy mptcp_pm_remove_nl_policy[MPTCP_PM_ATTR_LOC_ID + 1] = {
	[MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, },
	[MPTCP_PM_ATTR_LOC_ID] = { .type = NLA_U8, },
};

/* MPTCP_PM_CMD_SUBFLOW_CREATE / DESTROY - do */
static
const struct nla_policy mptcp_pm_subflow_create_nl_policy[MPTCP_PM_ATTR_ADDR_REMOTE + 1] = {
	[MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy),
	[MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, },
	[MPTCP_PM_ATTR_ADDR_REMOTE] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy),
};

static struct pm_nl_pernet *pm_nl_get_pernet(const struct net *net)
{
	return net_generic(net, pm_nl_pernet_id);
@@ -1113,29 +1167,6 @@ static const struct genl_multicast_group mptcp_pm_mcgrps[] = {
					  },
};

static const struct nla_policy
mptcp_pm_addr_policy[MPTCP_PM_ADDR_ATTR_MAX + 1] = {
	[MPTCP_PM_ADDR_ATTR_FAMILY]	= { .type	= NLA_U16,	},
	[MPTCP_PM_ADDR_ATTR_ID]		= { .type	= NLA_U8,	},
	[MPTCP_PM_ADDR_ATTR_ADDR4]	= { .type	= NLA_U32,	},
	[MPTCP_PM_ADDR_ATTR_ADDR6]	=
		NLA_POLICY_EXACT_LEN(sizeof(struct in6_addr)),
	[MPTCP_PM_ADDR_ATTR_PORT]	= { .type	= NLA_U16	},
	[MPTCP_PM_ADDR_ATTR_FLAGS]	= { .type	= NLA_U32	},
	[MPTCP_PM_ADDR_ATTR_IF_IDX]     = { .type	= NLA_S32	},
};

static const struct nla_policy mptcp_pm_policy[MPTCP_PM_ATTR_MAX + 1] = {
	[MPTCP_PM_ATTR_ADDR]		=
					NLA_POLICY_NESTED(mptcp_pm_addr_policy),
	[MPTCP_PM_ATTR_RCV_ADD_ADDRS]	= { .type	= NLA_U32,	},
	[MPTCP_PM_ATTR_SUBFLOWS]	= { .type	= NLA_U32,	},
	[MPTCP_PM_ATTR_TOKEN]		= { .type	= NLA_U32,	},
	[MPTCP_PM_ATTR_LOC_ID]		= { .type	= NLA_U8,	},
	[MPTCP_PM_ATTR_ADDR_REMOTE]	=
					NLA_POLICY_NESTED(mptcp_pm_addr_policy),
};

void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk)
{
	struct mptcp_subflow_context *iter, *subflow = mptcp_subflow_ctx(ssk);
@@ -1197,7 +1228,7 @@ static int mptcp_pm_parse_pm_addr_attr(struct nlattr *tb[],

	/* no validation needed - was already done via nested policy */
	err = nla_parse_nested_deprecated(tb, MPTCP_PM_ADDR_ATTR_MAX, attr,
					  mptcp_pm_addr_policy, info->extack);
					  mptcp_pm_address_nl_policy, info->extack);
	if (err)
		return err;

@@ -1318,7 +1349,7 @@ static bool mptcp_pm_has_addr_attr_id(const struct nlattr *attr,
	struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1];

	if (!nla_parse_nested_deprecated(tb, MPTCP_PM_ADDR_ATTR_MAX, attr,
					 mptcp_pm_addr_policy, info->extack) &&
					 mptcp_pm_address_nl_policy, info->extack) &&
	    tb[MPTCP_PM_ADDR_ATTR_ID])
		return true;
	return false;
@@ -1326,7 +1357,7 @@ static bool mptcp_pm_has_addr_attr_id(const struct nlattr *attr,

static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
{
	struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
	struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
	struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
	struct mptcp_pm_addr_entry addr, *entry;
	int ret;
@@ -1508,7 +1539,7 @@ static int mptcp_nl_remove_id_zero_address(struct net *net,

static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info)
{
	struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
	struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
	struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
	struct mptcp_pm_addr_entry addr, *entry;
	unsigned int addr_max;
@@ -1700,7 +1731,7 @@ static int mptcp_nl_fill_addr(struct sk_buff *skb,

static int mptcp_nl_cmd_get_addr(struct sk_buff *skb, struct genl_info *info)
{
	struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
	struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
	struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
	struct mptcp_pm_addr_entry addr, *entry;
	struct sk_buff *msg;
@@ -2306,59 +2337,93 @@ void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
	nlmsg_free(skb);
}

static const struct genl_small_ops mptcp_pm_ops[] = {
static const struct genl_ops mptcp_pm_ops[] = {
	{
		.cmd		= MPTCP_PM_CMD_ADD_ADDR,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_add_addr,
		.policy		= mptcp_pm_endpoint_nl_policy,
		.maxattr	= MPTCP_PM_ENDPOINT_ADDR,
		.flags		= GENL_UNS_ADMIN_PERM,
	},
	{
		.cmd		= MPTCP_PM_CMD_DEL_ADDR,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_del_addr,
		.flags  = GENL_UNS_ADMIN_PERM,
	},
	{
		.cmd    = MPTCP_PM_CMD_FLUSH_ADDRS,
		.doit   = mptcp_nl_cmd_flush_addrs,
		.policy		= mptcp_pm_endpoint_nl_policy,
		.maxattr	= MPTCP_PM_ENDPOINT_ADDR,
		.flags		= GENL_UNS_ADMIN_PERM,
	},
	{
		.cmd		= MPTCP_PM_CMD_GET_ADDR,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_get_addr,
		.dumpit		= mptcp_nl_cmd_dump_addrs,
		.policy		= mptcp_pm_endpoint_nl_policy,
		.maxattr	= MPTCP_PM_ENDPOINT_ADDR,
		.flags		= GENL_UNS_ADMIN_PERM,
	},
	{
		.cmd		= MPTCP_PM_CMD_FLUSH_ADDRS,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_flush_addrs,
		.policy		= mptcp_pm_endpoint_nl_policy,
		.maxattr	= MPTCP_PM_ENDPOINT_ADDR,
		.flags		= GENL_UNS_ADMIN_PERM,
	},
	{
		.cmd		= MPTCP_PM_CMD_SET_LIMITS,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_set_limits,
		.policy		= mptcp_pm_set_limits_nl_policy,
		.maxattr	= MPTCP_PM_ATTR_SUBFLOWS,
		.flags		= GENL_UNS_ADMIN_PERM,
	},
	{
		.cmd		= MPTCP_PM_CMD_GET_LIMITS,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_get_limits,
		.policy		= mptcp_pm_set_limits_nl_policy,
		.maxattr	= MPTCP_PM_ATTR_SUBFLOWS,
	},
	{
		.cmd		= MPTCP_PM_CMD_SET_FLAGS,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_set_flags,
		.policy		= mptcp_pm_set_flags_nl_policy,
		.maxattr	= MPTCP_PM_ATTR_ADDR_REMOTE,
		.flags		= GENL_UNS_ADMIN_PERM,
	},
	{
		.cmd		= MPTCP_PM_CMD_ANNOUNCE,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_announce,
		.policy		= mptcp_pm_announce_nl_policy,
		.maxattr	= MPTCP_PM_ATTR_TOKEN,
		.flags		= GENL_UNS_ADMIN_PERM,
	},
	{
		.cmd		= MPTCP_PM_CMD_REMOVE,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_remove,
		.policy		= mptcp_pm_remove_nl_policy,
		.maxattr	= MPTCP_PM_ATTR_LOC_ID,
		.flags		= GENL_UNS_ADMIN_PERM,
	},
	{
		.cmd		= MPTCP_PM_CMD_SUBFLOW_CREATE,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_sf_create,
		.policy		= mptcp_pm_subflow_create_nl_policy,
		.maxattr	= MPTCP_PM_ATTR_ADDR_REMOTE,
		.flags		= GENL_UNS_ADMIN_PERM,
	},
	{
		.cmd		= MPTCP_PM_CMD_SUBFLOW_DESTROY,
		.validate	= GENL_DONT_VALIDATE_STRICT,
		.doit		= mptcp_nl_cmd_sf_destroy,
		.policy		= mptcp_pm_subflow_create_nl_policy,
		.maxattr	= MPTCP_PM_ATTR_ADDR_REMOTE,
		.flags		= GENL_UNS_ADMIN_PERM,
	},
};
@@ -2366,12 +2431,10 @@ static const struct genl_small_ops mptcp_pm_ops[] = {
static struct genl_family mptcp_genl_family __ro_after_init = {
	.name		= MPTCP_PM_NAME,
	.version	= MPTCP_PM_VER,
	.maxattr	= MPTCP_PM_ATTR_MAX,
	.policy		= mptcp_pm_policy,
	.netnsok	= true,
	.module		= THIS_MODULE,
	.small_ops	= mptcp_pm_ops,
	.n_small_ops	= ARRAY_SIZE(mptcp_pm_ops),
	.ops		= mptcp_pm_ops,
	.n_ops		= ARRAY_SIZE(mptcp_pm_ops),
	.resv_start_op	= MPTCP_PM_CMD_SUBFLOW_DESTROY + 1,
	.mcgrps		= mptcp_pm_mcgrps,
	.n_mcgrps	= ARRAY_SIZE(mptcp_pm_mcgrps),