Skip to content

Commit de25881

Browse files
Geliang Tangintel-lab-lkp
authored andcommitted
mptcp: pm: add remote parameter for set_flags
The remote address of set_flags() interface is useful for userspace PM, but unused in in-kernel PM. But an additional "changed" parameter needs to be passed to set_flags() of in-kernel PM. One option is to add a "u8 changed" parameter to set_flags() interface: set_flags(struct mptcp_pm_addr_entry *local, struct mptcp_addr_info *remote, u8 changed) A better option is to add a struct mptcp_pm_addr_entry "remote" parameter for set_flags(), so that "remote->addr" can be used for userspace PM, and "remote->flags" can be used for in-kernel PM to replace the additional "changed" parameter. Signed-off-by: Geliang Tang <[email protected]>
1 parent 51915bd commit de25881

File tree

4 files changed

+22
-22
lines changed

4 files changed

+22
-22
lines changed

net/mptcp/pm.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,8 @@ int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg,
531531
static int mptcp_pm_set_flags(struct genl_info *info)
532532
{
533533
struct mptcp_pm_addr_entry loc = { .addr = { .family = AF_UNSPEC }, };
534-
struct nlattr *attr_loc;
534+
struct mptcp_pm_addr_entry rem = { .addr = { .family = AF_UNSPEC }, };
535+
struct nlattr *attr_loc, *attr_rem;
535536
int ret = -EINVAL;
536537

537538
if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR))
@@ -542,9 +543,20 @@ static int mptcp_pm_set_flags(struct genl_info *info)
542543
if (ret < 0)
543544
return ret;
544545

545-
if (info->attrs[MPTCP_PM_ATTR_TOKEN])
546-
return mptcp_userspace_pm_set_flags(&loc, info);
547-
return mptcp_pm_nl_set_flags(&loc, info);
546+
if (info->attrs[MPTCP_PM_ATTR_TOKEN]) {
547+
attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
548+
ret = mptcp_pm_parse_entry(attr_rem, info, false, &rem);
549+
if (ret < 0)
550+
return ret;
551+
552+
if (rem.addr.family == AF_UNSPEC) {
553+
NL_SET_ERR_MSG_ATTR(info->extack, attr_rem,
554+
"invalid remote address family");
555+
return -EINVAL;
556+
}
557+
return mptcp_userspace_pm_set_flags(&loc, &rem, info);
558+
}
559+
return mptcp_pm_nl_set_flags(&loc, &rem, info);
548560
}
549561

550562
int mptcp_pm_nl_set_flags_doit(struct sk_buff *skb, struct genl_info *info)

net/mptcp/pm_netlink.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1949,6 +1949,7 @@ static void mptcp_nl_set_flags(struct net *net,
19491949
}
19501950

19511951
int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
1952+
struct mptcp_pm_addr_entry *remote,
19521953
struct genl_info *info)
19531954
{
19541955
struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];

net/mptcp/pm_userspace.c

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -553,19 +553,16 @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
553553
}
554554

555555
int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
556+
struct mptcp_pm_addr_entry *remote,
556557
struct genl_info *info)
557558
{
558-
struct mptcp_addr_info rem = { .family = AF_UNSPEC, };
559559
struct mptcp_pm_addr_entry *entry;
560-
struct nlattr *attr, *attr_rem;
561560
struct mptcp_sock *msk;
561+
struct nlattr *attr;
562562
int ret = -EINVAL;
563563
struct sock *sk;
564564
u8 bkup = 0;
565565

566-
if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
567-
return ret;
568-
569566
msk = mptcp_userspace_pm_get_sock(info);
570567
if (!msk)
571568
return ret;
@@ -580,18 +577,6 @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
580577
goto set_flags_err;
581578
}
582579

583-
attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
584-
ret = mptcp_pm_parse_addr(attr_rem, info, &rem);
585-
if (ret < 0)
586-
goto set_flags_err;
587-
588-
if (rem.family == AF_UNSPEC) {
589-
NL_SET_ERR_MSG_ATTR(info->extack, attr_rem,
590-
"invalid remote address family");
591-
ret = -EINVAL;
592-
goto set_flags_err;
593-
}
594-
595580
if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
596581
bkup = 1;
597582

@@ -606,7 +591,7 @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
606591
spin_unlock_bh(&msk->pm.lock);
607592

608593
lock_sock(sk);
609-
ret = mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, &rem, bkup);
594+
ret = mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, &remote->addr, bkup);
610595
release_sock(sk);
611596

612597
/* mptcp_pm_nl_mp_prio_send_ack() only fails in one case */

net/mptcp/protocol.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,8 +1038,10 @@ bool mptcp_lookup_subflow_by_saddr(const struct list_head *list,
10381038
bool mptcp_remove_anno_list_by_saddr(struct mptcp_sock *msk,
10391039
const struct mptcp_addr_info *addr);
10401040
int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
1041+
struct mptcp_pm_addr_entry *remote,
10411042
struct genl_info *info);
10421043
int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
1044+
struct mptcp_pm_addr_entry *remote,
10431045
struct genl_info *info);
10441046
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
10451047
const struct mptcp_addr_info *addr,

0 commit comments

Comments
 (0)