mptcp: add userspace_pm_lookup_addr_by_id helper
commit 06afe09091ee69dc7ab058b4be9917ae59cc81e5 upstream. Corresponding __lookup_addr_by_id() helper in the in-kernel netlink PM, this patch adds a new helper mptcp_userspace_pm_lookup_addr_by_id() to lookup the address entry with the given id on the userspace pm local address list. Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Reviewed-by: Mat Martineau <martineau@kernel.org> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net> Stable-dep-of: f642c5c4d528 ("mptcp: hold pm lock when deleting entry") Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
71603aa07a
commit
199af46b93
@ -106,22 +106,29 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct mptcp_pm_addr_entry *
|
||||||
|
mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
|
||||||
|
{
|
||||||
|
struct mptcp_pm_addr_entry *entry;
|
||||||
|
|
||||||
|
list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
|
||||||
|
if (entry->addr.id == id)
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,
|
int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,
|
||||||
unsigned int id,
|
unsigned int id,
|
||||||
u8 *flags, int *ifindex)
|
u8 *flags, int *ifindex)
|
||||||
{
|
{
|
||||||
struct mptcp_pm_addr_entry *entry, *match = NULL;
|
struct mptcp_pm_addr_entry *match;
|
||||||
|
|
||||||
*flags = 0;
|
*flags = 0;
|
||||||
*ifindex = 0;
|
*ifindex = 0;
|
||||||
|
|
||||||
spin_lock_bh(&msk->pm.lock);
|
spin_lock_bh(&msk->pm.lock);
|
||||||
list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
|
match = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
|
||||||
if (id == entry->addr.id) {
|
|
||||||
match = entry;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spin_unlock_bh(&msk->pm.lock);
|
spin_unlock_bh(&msk->pm.lock);
|
||||||
if (match) {
|
if (match) {
|
||||||
*flags = match->flags;
|
*flags = match->flags;
|
||||||
@ -282,7 +289,7 @@ int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info)
|
|||||||
{
|
{
|
||||||
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
|
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
|
||||||
struct nlattr *id = info->attrs[MPTCP_PM_ATTR_LOC_ID];
|
struct nlattr *id = info->attrs[MPTCP_PM_ATTR_LOC_ID];
|
||||||
struct mptcp_pm_addr_entry *match = NULL;
|
struct mptcp_pm_addr_entry *match;
|
||||||
struct mptcp_pm_addr_entry *entry;
|
struct mptcp_pm_addr_entry *entry;
|
||||||
struct mptcp_sock *msk;
|
struct mptcp_sock *msk;
|
||||||
LIST_HEAD(free_list);
|
LIST_HEAD(free_list);
|
||||||
@ -319,13 +326,7 @@ int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info)
|
|||||||
|
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
|
|
||||||
list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
|
match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val);
|
||||||
if (entry->addr.id == id_val) {
|
|
||||||
match = entry;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!match) {
|
if (!match) {
|
||||||
GENL_SET_ERR_MSG(info, "address with specified id not found");
|
GENL_SET_ERR_MSG(info, "address with specified id not found");
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
|
Loading…
Reference in New Issue
Block a user