Skip to content

Commit

Permalink
mptcp: use GENL_REQ_ATTR_CHECK in userspace pm
Browse files Browse the repository at this point in the history
A more general way to check if MPTCP_PM_ATTR_* exists in 'info'
is to use GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_*) instead of
directly reading info->attrs[MPTCP_PM_ATTR_*] and then checking
if it's NULL.

So this patch uses GENL_REQ_ATTR_CHECK() for userspace PM in
mptcp_pm_nl_announce_doit(), mptcp_pm_nl_remove_doit(),
mptcp_pm_nl_subflow_create_doit(), mptcp_pm_nl_subflow_destroy_doit()
and mptcp_userspace_pm_get_sock().

'Suggested-by: Jakub Kicinski <[email protected]>'
Signed-off-by: Geliang Tang <[email protected]>
Message-Id: <ef87c8dd40c8dac4b946bf77e272d01ca64cc9dd.1734941967.git.tanggeliang@kylinos.cn>
  • Loading branch information
Geliang Tang authored and Patchew Applier committed Dec 23, 2024
1 parent 7482f17 commit bf380db
Showing 1 changed file with 35 additions and 34 deletions.
69 changes: 35 additions & 34 deletions net/mptcp/pm_userspace.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,17 +175,17 @@ bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,

static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
{
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
struct mptcp_sock *msk;

if (!token) {
GENL_SET_ERR_MSG(info, "missing required token");
if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_TOKEN))
return NULL;
}

msk = mptcp_token_get_sock(genl_info_net(info), nla_get_u32(token));
msk = mptcp_token_get_sock(genl_info_net(info),
nla_get_u32(info->attrs[MPTCP_PM_ATTR_TOKEN]));
if (!msk) {
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
NL_SET_ERR_MSG_ATTR(info->extack,
info->attrs[MPTCP_PM_ATTR_TOKEN],
"invalid token");
return NULL;
}

Expand All @@ -200,24 +200,22 @@ static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *in

int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
{
struct nlattr *addr = info->attrs[MPTCP_PM_ATTR_ADDR];
struct mptcp_pm_addr_entry addr_val;
struct mptcp_sock *msk;
int err = -EINVAL;
struct sock *sk;

if (!addr) {
GENL_SET_ERR_MSG(info, "missing required address");
if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR))
return err;
}

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

sk = (struct sock *)msk;

err = mptcp_pm_parse_entry(addr, info, true, &addr_val);
err = mptcp_pm_parse_entry(info->attrs[MPTCP_PM_ATTR_ADDR],
info, true, &addr_val);
if (err < 0) {
GENL_SET_ERR_MSG(info, "error parsing local address");
goto announce_err;
Expand Down Expand Up @@ -309,19 +307,16 @@ void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,

int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
{
struct nlattr *id = info->attrs[MPTCP_PM_ATTR_LOC_ID];
struct mptcp_pm_addr_entry *match;
struct mptcp_sock *msk;
int err = -EINVAL;
struct sock *sk;
u8 id_val;

if (!id) {
GENL_SET_ERR_MSG(info, "missing required ID");
if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_LOC_ID))
return err;
}

id_val = nla_get_u8(id);
id_val = nla_get_u8(info->attrs[MPTCP_PM_ATTR_LOC_ID]);

msk = mptcp_userspace_pm_get_sock(info);
if (!msk)
Expand Down Expand Up @@ -362,29 +357,29 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)

int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
{
struct nlattr *raddr = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
struct mptcp_pm_addr_entry entry = { 0 };
struct mptcp_addr_info addr_r;
struct mptcp_pm_local local;
struct mptcp_sock *msk;
int err = -EINVAL;
struct sock *sk;

if (!laddr || !raddr) {
GENL_SET_ERR_MSG(info, "missing required address(es)");
if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR) ||
GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
return err;
}

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

sk = (struct sock *)msk;

err = mptcp_pm_parse_entry(laddr, info, true, &entry);
err = mptcp_pm_parse_entry(info->attrs[MPTCP_PM_ATTR_ADDR],
info, true, &entry);
if (err < 0) {
NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr");
NL_SET_ERR_MSG_ATTR(info->extack,
info->attrs[MPTCP_PM_ATTR_ADDR],
"error parsing local addr");
goto create_err;
}

Expand All @@ -395,9 +390,12 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
}
entry.flags |= MPTCP_PM_ADDR_FLAG_SUBFLOW;

err = mptcp_pm_parse_addr(raddr, info, &addr_r);
err = mptcp_pm_parse_addr(info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE],
info, &addr_r);
if (err < 0) {
NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr");
NL_SET_ERR_MSG_ATTR(info->extack,
info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE],
"error parsing remote addr");
goto create_err;
}

Expand Down Expand Up @@ -483,34 +481,37 @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,

int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info)
{
struct nlattr *raddr = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
struct mptcp_pm_addr_entry addr_l;
struct mptcp_addr_info addr_r;
struct mptcp_sock *msk;
struct sock *sk, *ssk;
int err = -EINVAL;

if (!laddr || !raddr) {
GENL_SET_ERR_MSG(info, "missing required address(es)");
if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR) ||
GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
return err;
}

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

sk = (struct sock *)msk;

err = mptcp_pm_parse_entry(laddr, info, true, &addr_l);
err = mptcp_pm_parse_entry(info->attrs[MPTCP_PM_ATTR_ADDR],
info, true, &addr_l);
if (err < 0) {
NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr");
NL_SET_ERR_MSG_ATTR(info->extack,
info->attrs[MPTCP_PM_ATTR_ADDR],
"error parsing local addr");
goto destroy_err;
}

err = mptcp_pm_parse_addr(raddr, info, &addr_r);
err = mptcp_pm_parse_addr(info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE],
info, &addr_r);
if (err < 0) {
NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr");
NL_SET_ERR_MSG_ATTR(info->extack,
info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE],
"error parsing remote addr");
goto destroy_err;
}

Expand Down

0 comments on commit bf380db

Please sign in to comment.