-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mptcp: handle local addrs announced by userspace PMs
This change adds an internal function to store/retrieve local addrs announced by userspace PM implementations to/from its kernel context. The function addresses the requirements of three scenarios: 1) ADD_ADDR announcements (which require that a local id be provided), 2) retrieving the local id associated with an address, and also where one may need to be assigned, and 3) reissuance of ADD_ADDRs when there's a successful match of addr/id. The list of all stored local addr entries is held under the MPTCP sock structure. Memory for these entries is allocated from the sock option buffer, so the list of addrs is bounded by optmem_max. The list if not released via REMOVE_ADDR signals is ultimately freed when the sock is destructed. Acked-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Kishen Maloor <kishen.maloor@intel.com> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Kishen Maloor
authored and
David S. Miller
committed
May 4, 2022
1 parent
f43f0cd
commit 4638de5
Showing
6 changed files
with
113 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Multipath TCP | ||
* | ||
* Copyright (c) 2022, Intel Corporation. | ||
*/ | ||
|
||
#include "protocol.h" | ||
|
||
void mptcp_free_local_addr_list(struct mptcp_sock *msk) | ||
{ | ||
struct mptcp_pm_addr_entry *entry, *tmp; | ||
struct sock *sk = (struct sock *)msk; | ||
LIST_HEAD(free_list); | ||
|
||
if (!mptcp_pm_is_userspace(msk)) | ||
return; | ||
|
||
spin_lock_bh(&msk->pm.lock); | ||
list_splice_init(&msk->pm.userspace_pm_local_addr_list, &free_list); | ||
spin_unlock_bh(&msk->pm.lock); | ||
|
||
list_for_each_entry_safe(entry, tmp, &free_list, list) { | ||
sock_kfree_s(sk, entry, sizeof(*entry)); | ||
} | ||
} | ||
|
||
int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, | ||
struct mptcp_pm_addr_entry *entry) | ||
{ | ||
DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); | ||
struct mptcp_pm_addr_entry *match = NULL; | ||
struct sock *sk = (struct sock *)msk; | ||
struct mptcp_pm_addr_entry *e; | ||
bool addr_match = false; | ||
bool id_match = false; | ||
int ret = -EINVAL; | ||
|
||
bitmap_zero(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); | ||
|
||
spin_lock_bh(&msk->pm.lock); | ||
list_for_each_entry(e, &msk->pm.userspace_pm_local_addr_list, list) { | ||
addr_match = mptcp_addresses_equal(&e->addr, &entry->addr, true); | ||
if (addr_match && entry->addr.id == 0) | ||
entry->addr.id = e->addr.id; | ||
id_match = (e->addr.id == entry->addr.id); | ||
if (addr_match && id_match) { | ||
match = e; | ||
break; | ||
} else if (addr_match || id_match) { | ||
break; | ||
} | ||
__set_bit(e->addr.id, id_bitmap); | ||
} | ||
|
||
if (!match && !addr_match && !id_match) { | ||
/* Memory for the entry is allocated from the | ||
* sock option buffer. | ||
*/ | ||
e = sock_kmalloc(sk, sizeof(*e), GFP_ATOMIC); | ||
if (!e) { | ||
spin_unlock_bh(&msk->pm.lock); | ||
return -ENOMEM; | ||
} | ||
|
||
*e = *entry; | ||
if (!e->addr.id) | ||
e->addr.id = find_next_zero_bit(id_bitmap, | ||
MPTCP_PM_MAX_ADDR_ID + 1, | ||
1); | ||
list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list); | ||
ret = e->addr.id; | ||
} else if (match) { | ||
ret = entry->addr.id; | ||
} | ||
|
||
spin_unlock_bh(&msk->pm.lock); | ||
return ret; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters