mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 03:27:30 -04:00
mptcp: pm: uniform announced addresses helpers
Similar to the previous commit, only using the 'add' or 'anno' prefixes is confusing -- generally associated to the action of adding something, or the Latin name for "year" -- and lack of uniformity. This has been causing issues in the past, e.g. del_add_timer seemed to suggest the goal is to delete a previously added timer. Instead, use the mptcp_pm_announced_ prefix. While at it, slightly improves some helpers: - mptcp_lookup_anno_list_by_saddr: no need to specify what is used to do the lookup: mptcp_pm_announced_lookup. - mptcp_pm_sport_in_anno_list: it doesn't just compare the port, but the whole address linked to the sublow: mptcp_pm_announced_has_ssk. - mptcp_pm_alloc_anno_list: it allocates one item of the list, not a whole list: mptcp_pm_announced_alloc. Reviewed-by: Mat Martineau <martineau@kernel.org> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Link: https://patch.msgid.link/20260605-net-next-mptcp-add-addr6-port-ts-v2-11-758e7ca73f4d@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
350d76dd6e
commit
7d4dacc8cc
@@ -1183,7 +1183,7 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
|
||||
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR);
|
||||
} else {
|
||||
mptcp_pm_add_addr_echoed(msk, &mp_opt.addr);
|
||||
mptcp_pm_del_add_timer(msk, &mp_opt.addr, true);
|
||||
mptcp_pm_announced_del_timer(msk, &mp_opt.addr, true);
|
||||
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD);
|
||||
}
|
||||
|
||||
|
||||
@@ -134,8 +134,8 @@ bool mptcp_pm_has_subflow_saddr(const struct mptcp_sock *msk,
|
||||
}
|
||||
|
||||
static struct mptcp_pm_add_addr *
|
||||
mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr)
|
||||
mptcp_pm_announced_lookup(const struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr)
|
||||
{
|
||||
struct mptcp_pm_add_addr *entry;
|
||||
|
||||
@@ -149,26 +149,26 @@ mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool mptcp_remove_anno_list_by_saddr(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr)
|
||||
bool mptcp_pm_announced_remove(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr)
|
||||
{
|
||||
struct mptcp_pm_add_addr *entry;
|
||||
bool ret;
|
||||
|
||||
entry = mptcp_pm_del_add_timer(msk, addr, false);
|
||||
entry = mptcp_pm_announced_del_timer(msk, addr, false);
|
||||
ret = entry;
|
||||
kfree_rcu(entry, rcu);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk)
|
||||
bool mptcp_pm_announced_has_ssk(struct mptcp_sock *msk, const struct sock *ssk)
|
||||
{
|
||||
struct mptcp_pm_add_addr *entry;
|
||||
struct mptcp_addr_info saddr;
|
||||
bool ret = false;
|
||||
|
||||
mptcp_local_address((struct sock_common *)sk, &saddr);
|
||||
mptcp_local_address((struct sock_common *)ssk, &saddr);
|
||||
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
list_for_each_entry(entry, &msk->pm.anno_list, list) {
|
||||
@@ -364,7 +364,7 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
|
||||
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
|
||||
/* The cancel path (mptcp_pm_del_add_timer()) can race with this
|
||||
/* The cancel path (mptcp_pm_announced_del_timer()) can race with this
|
||||
* callback. Once cancel updates retrans_times to MAX, suppress further
|
||||
* retransmissions here. If this callback acquires pm.lock first, one
|
||||
* final transmit attempt is still possible.
|
||||
@@ -398,8 +398,8 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
|
||||
}
|
||||
|
||||
struct mptcp_pm_add_addr *
|
||||
mptcp_pm_del_add_timer(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr, bool check_id)
|
||||
mptcp_pm_announced_del_timer(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr, bool check_id)
|
||||
{
|
||||
struct sock *sk = (struct sock *)msk;
|
||||
struct mptcp_pm_add_addr *entry;
|
||||
@@ -408,7 +408,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
|
||||
rcu_read_lock();
|
||||
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
entry = mptcp_lookup_anno_list_by_saddr(msk, addr);
|
||||
entry = mptcp_pm_announced_lookup(msk, addr);
|
||||
if (entry && (!check_id || entry->addr.id == addr->id)) {
|
||||
entry->retrans_times = ADD_ADDR_RETRANS_MAX;
|
||||
stop_timer = true;
|
||||
@@ -431,7 +431,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
|
||||
return entry;
|
||||
}
|
||||
|
||||
bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
|
||||
bool mptcp_pm_announced_alloc(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr)
|
||||
{
|
||||
struct mptcp_pm_add_addr *add_entry = NULL;
|
||||
@@ -440,8 +440,7 @@ bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
|
||||
|
||||
lockdep_assert_held(&msk->pm.lock);
|
||||
|
||||
add_entry = mptcp_lookup_anno_list_by_saddr(msk, addr);
|
||||
|
||||
add_entry = mptcp_pm_announced_lookup(msk, addr);
|
||||
if (add_entry) {
|
||||
if (WARN_ON_ONCE(mptcp_pm_is_kernel(msk)))
|
||||
return false;
|
||||
@@ -469,7 +468,7 @@ bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
|
||||
return true;
|
||||
}
|
||||
|
||||
static void mptcp_pm_free_anno_list(struct mptcp_sock *msk)
|
||||
static void mptcp_pm_free_announced_list(struct mptcp_sock *msk)
|
||||
{
|
||||
struct mptcp_pm_add_addr *entry, *tmp;
|
||||
struct sock *sk = (struct sock *)msk;
|
||||
@@ -738,7 +737,7 @@ void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
|
||||
|
||||
spin_lock_bh(&pm->lock);
|
||||
|
||||
if (mptcp_lookup_anno_list_by_saddr(msk, addr) && READ_ONCE(pm->work_pending))
|
||||
if (mptcp_pm_announced_lookup(msk, addr) && READ_ONCE(pm->work_pending))
|
||||
mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED);
|
||||
|
||||
spin_unlock_bh(&pm->lock);
|
||||
@@ -975,7 +974,7 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, int *size, int remaining,
|
||||
* let the PM state machine progress.
|
||||
*/
|
||||
if (skip_add_addr) {
|
||||
mptcp_pm_del_add_timer(msk, addr, true);
|
||||
mptcp_pm_announced_del_timer(msk, addr, true);
|
||||
mptcp_pm_subflow_established(msk);
|
||||
}
|
||||
return ret;
|
||||
@@ -1139,7 +1138,7 @@ void mptcp_pm_worker(struct mptcp_sock *msk)
|
||||
|
||||
void mptcp_pm_destroy(struct mptcp_sock *msk)
|
||||
{
|
||||
mptcp_pm_free_anno_list(msk);
|
||||
mptcp_pm_free_announced_list(msk);
|
||||
|
||||
if (mptcp_pm_is_userspace(msk))
|
||||
mptcp_userspace_pm_free_local_addr_list(msk);
|
||||
|
||||
@@ -374,7 +374,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
|
||||
/* If the alloc fails, we are on memory pressure, not worth
|
||||
* continuing, and trying to create subflows.
|
||||
*/
|
||||
if (!mptcp_pm_alloc_anno_list(msk, &local.addr))
|
||||
if (!mptcp_pm_announced_alloc(msk, &local.addr))
|
||||
return;
|
||||
|
||||
__clear_bit(endp_id, msk->pm.id_avail_bitmap);
|
||||
@@ -1053,7 +1053,7 @@ int mptcp_pm_nl_add_addr_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mptcp_pm_remove_anno_addr(struct mptcp_sock *msk,
|
||||
static void mptcp_pm_remove_announced(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr,
|
||||
bool force)
|
||||
{
|
||||
@@ -1062,7 +1062,7 @@ static void mptcp_pm_remove_anno_addr(struct mptcp_sock *msk,
|
||||
|
||||
list.ids[list.nr++] = mptcp_endp_get_local_id(msk, addr);
|
||||
|
||||
announced = mptcp_remove_anno_list_by_saddr(msk, addr);
|
||||
announced = mptcp_pm_announced_remove(msk, addr);
|
||||
if (announced || force) {
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
if (announced)
|
||||
@@ -1099,7 +1099,7 @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
|
||||
|
||||
lock_sock(sk);
|
||||
remove_subflow = mptcp_pm_has_subflow_saddr(msk, addr);
|
||||
mptcp_pm_remove_anno_addr(msk, addr, remove_subflow &&
|
||||
mptcp_pm_remove_announced(msk, addr, remove_subflow &&
|
||||
!(entry->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT));
|
||||
|
||||
list.ids[0] = mptcp_endp_get_local_id(msk, addr);
|
||||
@@ -1239,7 +1239,7 @@ static void mptcp_pm_flush_addrs_and_subflows(struct mptcp_sock *msk,
|
||||
if (mptcp_pm_has_subflow_saddr(msk, &entry->addr))
|
||||
slist.ids[slist.nr++] = mptcp_endp_get_local_id(msk, &entry->addr);
|
||||
|
||||
if (mptcp_remove_anno_list_by_saddr(msk, &entry->addr))
|
||||
if (mptcp_pm_announced_remove(msk, &entry->addr))
|
||||
alist.ids[alist.nr++] = mptcp_endp_get_local_id(msk, &entry->addr);
|
||||
|
||||
if (slist.nr == MPTCP_RM_IDS_MAX ||
|
||||
|
||||
@@ -228,7 +228,7 @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
lock_sock(sk);
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
|
||||
if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr)) {
|
||||
if (mptcp_pm_announced_alloc(msk, &addr_val.addr)) {
|
||||
msk->pm.add_addr_signaled++;
|
||||
mptcp_pm_announce_addr(msk, &addr_val.addr, false);
|
||||
mptcp_pm_addr_send_ack(msk);
|
||||
@@ -281,7 +281,7 @@ void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
|
||||
int anno_nr = 0;
|
||||
|
||||
/* only delete if either announced or matching a subflow */
|
||||
if (mptcp_remove_anno_list_by_saddr(msk, &entry->addr))
|
||||
if (mptcp_pm_announced_remove(msk, &entry->addr))
|
||||
anno_nr++;
|
||||
else if (!mptcp_pm_has_subflow_saddr(msk, &entry->addr))
|
||||
return;
|
||||
|
||||
@@ -1130,16 +1130,16 @@ int mptcp_pm_mp_prio_send_ack(struct mptcp_sock *msk,
|
||||
struct mptcp_addr_info *addr,
|
||||
struct mptcp_addr_info *rem,
|
||||
u8 bkup);
|
||||
bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
|
||||
bool mptcp_pm_announced_alloc(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr);
|
||||
bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
|
||||
struct mptcp_pm_add_addr *
|
||||
mptcp_pm_del_add_timer(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr, bool check_id);
|
||||
mptcp_pm_announced_del_timer(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr, bool check_id);
|
||||
bool mptcp_pm_announced_remove(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr);
|
||||
bool mptcp_pm_announced_has_ssk(struct mptcp_sock *msk, const struct sock *ssk);
|
||||
bool mptcp_pm_has_subflow_saddr(const struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *saddr);
|
||||
bool mptcp_remove_anno_list_by_saddr(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr);
|
||||
int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
|
||||
struct genl_info *info);
|
||||
int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
|
||||
|
||||
@@ -235,7 +235,7 @@ static int subflow_check_req(struct request_sock *req,
|
||||
pr_debug("syn inet_sport=%d %d\n",
|
||||
ntohs(inet_sk(sk_listener)->inet_sport),
|
||||
ntohs(inet_sk((struct sock *)subflow_req->msk)->inet_sport));
|
||||
if (!mptcp_pm_sport_in_anno_list(subflow_req->msk, sk_listener)) {
|
||||
if (!mptcp_pm_announced_has_ssk(subflow_req->msk, sk_listener)) {
|
||||
SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_MISMATCHPORTSYNRX);
|
||||
subflow_add_reset_reason(skb, MPTCP_RST_EPROHIBIT);
|
||||
return -EPERM;
|
||||
@@ -926,7 +926,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
|
||||
pr_debug("ack inet_sport=%d %d\n",
|
||||
ntohs(inet_sk(sk)->inet_sport),
|
||||
ntohs(inet_sk((struct sock *)owner)->inet_sport));
|
||||
if (!mptcp_pm_sport_in_anno_list(owner, sk)) {
|
||||
if (!mptcp_pm_announced_has_ssk(owner, sk)) {
|
||||
SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_MISMATCHPORTACKRX);
|
||||
subflow_add_reset_reason(skb, MPTCP_RST_EPROHIBIT);
|
||||
goto dispose_child;
|
||||
|
||||
Reference in New Issue
Block a user