Skip to content

Commit 2d5545e

Browse files
Geliang Tangintel-lab-lkp
authored andcommitted
mptcp: add local & remote parameters for set_flags
This patch updates the interfaces set_flags to reduce repetitive code, adds two more parameters 'local' and 'remote' for them. These addresses are parsed in public helper mptcp_pm_nl_set_flags_doit(), then pass them to mptcp_pm_nl_set_flags() and mptcp_userspace_pm_set_flags(). Signed-off-by: Geliang Tang <[email protected]>
1 parent e9828c5 commit 2d5545e

File tree

4 files changed

+69
-64
lines changed

4 files changed

+69
-64
lines changed

net/mptcp/pm.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,11 +449,13 @@ int mptcp_pm_dump_addr(struct sk_buff *msg, struct netlink_callback *cb)
449449
return mptcp_pm_nl_dump_addr(msg, cb);
450450
}
451451

452-
int mptcp_pm_set_flags(struct genl_info *info)
452+
int mptcp_pm_set_flags(struct mptcp_pm_addr_entry *local,
453+
struct mptcp_addr_info *remote,
454+
struct genl_info *info)
453455
{
454456
if (info->attrs[MPTCP_PM_ATTR_TOKEN])
455-
return mptcp_userspace_pm_set_flags(info);
456-
return mptcp_pm_nl_set_flags(info);
457+
return mptcp_userspace_pm_set_flags(local, remote, info);
458+
return mptcp_pm_nl_set_flags(local, remote, info);
457459
}
458460

459461
void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk)

net/mptcp/pm_netlink.c

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1981,63 +1981,87 @@ static int mptcp_nl_set_flags(struct net *net,
19811981
return ret;
19821982
}
19831983

1984-
int mptcp_pm_nl_set_flags(struct genl_info *info)
1984+
int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
1985+
struct mptcp_addr_info *remote,
1986+
struct genl_info *info)
19851987
{
1986-
struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, };
1987-
struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
19881988
u8 changed, mask = MPTCP_PM_ADDR_FLAG_BACKUP |
19891989
MPTCP_PM_ADDR_FLAG_FULLMESH;
19901990
struct net *net = genl_info_net(info);
19911991
struct mptcp_pm_addr_entry *entry;
19921992
struct pm_nl_pernet *pernet;
19931993
u8 lookup_by_id = 0;
19941994
u8 bkup = 0;
1995-
int ret;
19961995

19971996
pernet = pm_nl_get_pernet(net);
19981997

1999-
ret = mptcp_pm_parse_entry(attr, info, false, &addr);
2000-
if (ret < 0)
2001-
return ret;
2002-
2003-
if (addr.addr.family == AF_UNSPEC) {
1998+
if (local->addr.family == AF_UNSPEC)
20041999
lookup_by_id = 1;
2005-
if (!addr.addr.id) {
2006-
GENL_SET_ERR_MSG(info, "missing required inputs");
2007-
return -EOPNOTSUPP;
2008-
}
2009-
}
20102000

2011-
if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
2001+
if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
20122002
bkup = 1;
20132003

20142004
spin_lock_bh(&pernet->lock);
2015-
entry = lookup_by_id ? __lookup_addr_by_id(pernet, addr.addr.id) :
2016-
__lookup_addr(pernet, &addr.addr);
2005+
entry = lookup_by_id ? __lookup_addr_by_id(pernet, local->addr.id) :
2006+
__lookup_addr(pernet, &local->addr);
20172007
if (!entry) {
20182008
spin_unlock_bh(&pernet->lock);
20192009
GENL_SET_ERR_MSG(info, "address not found");
20202010
return -EINVAL;
20212011
}
2022-
if ((addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH) &&
2012+
if ((local->flags & MPTCP_PM_ADDR_FLAG_FULLMESH) &&
20232013
(entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) {
20242014
spin_unlock_bh(&pernet->lock);
20252015
GENL_SET_ERR_MSG(info, "invalid addr flags");
20262016
return -EINVAL;
20272017
}
20282018

2029-
changed = (addr.flags ^ entry->flags) & mask;
2030-
entry->flags = (entry->flags & ~mask) | (addr.flags & mask);
2031-
addr = *entry;
2019+
changed = (local->flags ^ entry->flags) & mask;
2020+
entry->flags = (entry->flags & ~mask) | (local->flags & mask);
2021+
*local = *entry;
20322022
spin_unlock_bh(&pernet->lock);
20332023

2034-
mptcp_nl_set_flags(net, &addr.addr, bkup, changed);
2024+
mptcp_nl_set_flags(net, &local->addr, bkup, changed);
20352025
return 0;
20362026
}
20372027

20382028
int mptcp_pm_nl_set_flags_doit(struct sk_buff *skb, struct genl_info *info)
20392029
{
2040-
return mptcp_pm_set_flags(info);
2030+
struct mptcp_pm_addr_entry loc = { .addr = { .family = AF_UNSPEC }, };
2031+
struct nlattr *attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
2032+
struct mptcp_addr_info rem = { .family = AF_UNSPEC, };
2033+
struct nlattr *attr_loc;
2034+
int ret;
2035+
2036+
if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR))
2037+
return -EINVAL;
2038+
2039+
attr_loc = info->attrs[MPTCP_PM_ATTR_ADDR];
2040+
ret = mptcp_pm_parse_entry(attr_loc, info, false, &loc);
2041+
if (ret < 0)
2042+
return ret;
2043+
2044+
if (loc.addr.family == AF_UNSPEC) {
2045+
if (!loc.addr.id) {
2046+
NL_SET_ERR_MSG_ATTR(info->extack, attr_loc,
2047+
"missing address ID");
2048+
return -EOPNOTSUPP;
2049+
}
2050+
}
2051+
2052+
if (attr_rem) {
2053+
ret = mptcp_pm_parse_addr(attr_rem, info, &rem);
2054+
if (ret < 0)
2055+
return ret;
2056+
2057+
if (rem.family == AF_UNSPEC) {
2058+
NL_SET_ERR_MSG_ATTR(info->extack, attr_rem,
2059+
"invalid remote address family");
2060+
return -EINVAL;
2061+
}
2062+
}
2063+
2064+
return mptcp_pm_set_flags(&loc, &rem, info);
20412065
}
20422066

20432067
static void mptcp_nl_mcast_send(struct net *net, struct sk_buff *nlskb, gfp_t gfp)

net/mptcp/pm_userspace.c

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -569,12 +569,10 @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
569569
return err;
570570
}
571571

572-
int mptcp_userspace_pm_set_flags(struct genl_info *info)
572+
int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
573+
struct mptcp_addr_info *remote,
574+
struct genl_info *info)
573575
{
574-
struct mptcp_pm_addr_entry loc = { .addr = { .family = AF_UNSPEC }, };
575-
struct nlattr *attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
576-
struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
577-
struct mptcp_addr_info rem = { .family = AF_UNSPEC, };
578576
struct mptcp_pm_addr_entry *entry;
579577
struct mptcp_sock *msk;
580578
u8 lookup_by_id = 0;
@@ -588,42 +586,17 @@ int mptcp_userspace_pm_set_flags(struct genl_info *info)
588586

589587
sk = (struct sock *)msk;
590588

591-
ret = mptcp_pm_parse_entry(attr, info, false, &loc);
592-
if (ret < 0)
593-
goto set_flags_err;
594-
595-
if (loc.addr.family == AF_UNSPEC) {
589+
if (local->addr.family == AF_UNSPEC)
596590
lookup_by_id = 1;
597-
if (!loc.addr.id) {
598-
NL_SET_ERR_MSG_ATTR(info->extack, attr,
599-
"missing address ID");
600-
ret = -EOPNOTSUPP;
601-
goto set_flags_err;
602-
}
603-
}
604591

605-
if (attr_rem) {
606-
ret = mptcp_pm_parse_addr(attr_rem, info, &rem);
607-
if (ret < 0)
608-
goto set_flags_err;
609-
610-
if (rem.family == AF_UNSPEC) {
611-
NL_SET_ERR_MSG_ATTR(info->extack, attr_rem,
612-
"invalid remote address family");
613-
ret = -EINVAL;
614-
goto set_flags_err;
615-
}
616-
}
617-
618-
if (loc.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
592+
if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
619593
bkup = 1;
620594

621595
spin_lock_bh(&msk->pm.lock);
622-
entry = lookup_by_id ? mptcp_userspace_pm_lookup_addr_by_id(msk, loc.addr.id) :
623-
mptcp_userspace_pm_lookup_addr(msk, &loc.addr);
596+
entry = lookup_by_id ? mptcp_userspace_pm_lookup_addr_by_id(msk, local->addr.id) :
597+
mptcp_userspace_pm_lookup_addr(msk, &local->addr);
624598
if (!entry) {
625599
spin_unlock_bh(&msk->pm.lock);
626-
ret = -EINVAL;
627600
goto set_flags_err;
628601
}
629602

@@ -634,7 +607,7 @@ int mptcp_userspace_pm_set_flags(struct genl_info *info)
634607
spin_unlock_bh(&msk->pm.lock);
635608

636609
lock_sock(sk);
637-
ret = mptcp_pm_nl_mp_prio_send_ack(msk, &entry->addr, &rem, bkup);
610+
ret = mptcp_pm_nl_mp_prio_send_ack(msk, &entry->addr, remote, bkup);
638611
release_sock(sk);
639612

640613
set_flags_err:

net/mptcp/protocol.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,9 +1028,15 @@ bool mptcp_lookup_subflow_by_saddr(const struct list_head *list,
10281028
const struct mptcp_addr_info *saddr);
10291029
bool mptcp_remove_anno_list_by_saddr(struct mptcp_sock *msk,
10301030
const struct mptcp_addr_info *addr);
1031-
int mptcp_pm_set_flags(struct genl_info *info);
1032-
int mptcp_pm_nl_set_flags(struct genl_info *info);
1033-
int mptcp_userspace_pm_set_flags(struct genl_info *info);
1031+
int mptcp_pm_set_flags(struct mptcp_pm_addr_entry *local,
1032+
struct mptcp_addr_info *remote,
1033+
struct genl_info *info);
1034+
int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
1035+
struct mptcp_addr_info *remote,
1036+
struct genl_info *info);
1037+
int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
1038+
struct mptcp_addr_info *remote,
1039+
struct genl_info *info);
10341040
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
10351041
const struct mptcp_addr_info *addr,
10361042
bool echo);

0 commit comments

Comments
 (0)