Commit d47b8075 authored by Geliang Tang's avatar Geliang Tang Committed by Paolo Abeni
Browse files

mptcp: pm: add id parameter for get_addr



The address id is parsed both in mptcp_pm_nl_get_addr() and
mptcp_userspace_pm_get_addr(), this makes the code somewhat repetitive.

So this patch adds a new parameter 'id' for all get_addr() interfaces.
The address id is only parsed in mptcp_pm_nl_get_addr_doit(), then pass
it to both mptcp_pm_nl_get_addr() and mptcp_userspace_pm_get_addr().

Signed-off-by: default avatarGeliang Tang <tanggeliang@kylinos.cn>
Reviewed-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 67dcf659
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -434,16 +434,28 @@ bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
	return mptcp_pm_nl_is_backup(msk, &skc_local);
}

static int mptcp_pm_get_addr(struct genl_info *info)
static int mptcp_pm_get_addr(u8 id, struct genl_info *info)
{
	if (info->attrs[MPTCP_PM_ATTR_TOKEN])
		return mptcp_userspace_pm_get_addr(info);
	return mptcp_pm_nl_get_addr(info);
		return mptcp_userspace_pm_get_addr(id, info);
	return mptcp_pm_nl_get_addr(id, info);
}

int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info)
{
	return mptcp_pm_get_addr(info);
	struct mptcp_pm_addr_entry addr;
	struct nlattr *attr;
	int ret;

	if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ENDPOINT_ADDR))
		return -EINVAL;

	attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
	ret = mptcp_pm_parse_entry(attr, info, false, &addr);
	if (ret < 0)
		return ret;

	return mptcp_pm_get_addr(addr.addr.id, info);
}

static int mptcp_pm_dump_addr(struct sk_buff *msg, struct netlink_callback *cb)
+4 −12
Original line number Diff line number Diff line
@@ -1773,23 +1773,15 @@ int mptcp_nl_fill_addr(struct sk_buff *skb,
	return -EMSGSIZE;
}

int mptcp_pm_nl_get_addr(struct genl_info *info)
int mptcp_pm_nl_get_addr(u8 id, struct genl_info *info)
{
	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 mptcp_pm_addr_entry *entry;
	struct sk_buff *msg;
	struct nlattr *attr;
	void *reply;
	int ret;

	if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ENDPOINT_ADDR))
		return -EINVAL;

	attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
	ret = mptcp_pm_parse_entry(attr, info, false, &addr);
	if (ret < 0)
		return ret;

	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
	if (!msg)
		return -ENOMEM;
@@ -1803,7 +1795,7 @@ int mptcp_pm_nl_get_addr(struct genl_info *info)
	}

	rcu_read_lock();
	entry = __lookup_addr_by_id(pernet, addr.addr.id);
	entry = __lookup_addr_by_id(pernet, id);
	if (!entry) {
		NL_SET_ERR_MSG_ATTR(info->extack, attr, "address not found");
		ret = -EINVAL;
+4 −12
Original line number Diff line number Diff line
@@ -684,30 +684,22 @@ int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
	return ret;
}

int mptcp_userspace_pm_get_addr(struct genl_info *info)
int mptcp_userspace_pm_get_addr(u8 id, struct genl_info *info)
{
	struct mptcp_pm_addr_entry addr, *entry;
	struct nlattr *attr = attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
	struct mptcp_pm_addr_entry *entry;
	struct mptcp_sock *msk;
	struct sk_buff *msg;
	struct nlattr *attr;
	int ret = -EINVAL;
	struct sock *sk;
	void *reply;

	if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ENDPOINT_ADDR))
		return ret;

	msk = mptcp_userspace_pm_get_sock(info);
	if (!msk)
		return ret;

	sk = (struct sock *)msk;

	attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
	ret = mptcp_pm_parse_entry(attr, info, false, &addr);
	if (ret < 0)
		goto out;

	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
	if (!msg) {
		ret = -ENOMEM;
@@ -724,7 +716,7 @@ int mptcp_userspace_pm_get_addr(struct genl_info *info)

	lock_sock(sk);
	spin_lock_bh(&msk->pm.lock);
	entry = mptcp_userspace_pm_lookup_addr_by_id(msk, addr.addr.id);
	entry = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
	if (!entry) {
		NL_SET_ERR_MSG_ATTR(info->extack, attr, "address not found");
		ret = -EINVAL;
+2 −2
Original line number Diff line number Diff line
@@ -1134,8 +1134,8 @@ int mptcp_pm_nl_dump_addr(struct sk_buff *msg,
			  struct netlink_callback *cb);
int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
				 struct netlink_callback *cb);
int mptcp_pm_nl_get_addr(struct genl_info *info);
int mptcp_userspace_pm_get_addr(struct genl_info *info);
int mptcp_pm_nl_get_addr(u8 id, struct genl_info *info);
int mptcp_userspace_pm_get_addr(u8 id, struct genl_info *info);

static inline u8 subflow_get_local_id(const struct mptcp_subflow_context *subflow)
{