mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 13:41:48 -04:00
batman-adv: reject new tp_meter sessions during teardown
Prevent tp_meter from starting new sender or receiver sessions after
mesh_state has left BATADV_MESH_ACTIVE.
Fixes: 33a3bb4a33 ("batman-adv: throughput meter implementation")
Cc: stable@kernel.org
Reported-by: Yuan Tan <yuantan098@gmail.com>
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Reported-by: Xin Liu <bird@lzu.edu.cn>
Co-developed-by: Luxing Yin <tr0jan@lzu.edu.cn>
Signed-off-by: Luxing Yin <tr0jan@lzu.edu.cn>
Signed-off-by: Jiexun Wang <wangjiexun2025@gmail.com>
Signed-off-by: Ren Wei <n05ec@lzu.edu.cn>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
This commit is contained in:
committed by
Sven Eckelmann
parent
0799e59436
commit
3243543592
@@ -947,6 +947,13 @@ void batadv_tp_start(struct batadv_priv *bat_priv, const u8 *dst,
|
||||
|
||||
/* look for an already existing test towards this node */
|
||||
spin_lock_bh(&bat_priv->tp_list_lock);
|
||||
if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE) {
|
||||
spin_unlock_bh(&bat_priv->tp_list_lock);
|
||||
batadv_tp_batctl_error_notify(BATADV_TP_REASON_DST_UNREACHABLE,
|
||||
dst, bat_priv, session_cookie);
|
||||
return;
|
||||
}
|
||||
|
||||
tp_vars = batadv_tp_list_find(bat_priv, dst);
|
||||
if (tp_vars) {
|
||||
spin_unlock_bh(&bat_priv->tp_list_lock);
|
||||
@@ -1329,9 +1336,12 @@ static struct batadv_tp_vars *
|
||||
batadv_tp_init_recv(struct batadv_priv *bat_priv,
|
||||
const struct batadv_icmp_tp_packet *icmp)
|
||||
{
|
||||
struct batadv_tp_vars *tp_vars;
|
||||
struct batadv_tp_vars *tp_vars = NULL;
|
||||
|
||||
spin_lock_bh(&bat_priv->tp_list_lock);
|
||||
if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
|
||||
goto out_unlock;
|
||||
|
||||
tp_vars = batadv_tp_list_find_session(bat_priv, icmp->orig,
|
||||
icmp->session);
|
||||
if (tp_vars)
|
||||
@@ -1464,6 +1474,9 @@ void batadv_tp_meter_recv(struct batadv_priv *bat_priv, struct sk_buff *skb)
|
||||
{
|
||||
struct batadv_icmp_tp_packet *icmp;
|
||||
|
||||
if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
|
||||
goto out;
|
||||
|
||||
icmp = (struct batadv_icmp_tp_packet *)skb->data;
|
||||
|
||||
switch (icmp->subtype) {
|
||||
@@ -1478,6 +1491,8 @@ void batadv_tp_meter_recv(struct batadv_priv *bat_priv, struct sk_buff *skb)
|
||||
"Received unknown TP Metric packet type %u\n",
|
||||
icmp->subtype);
|
||||
}
|
||||
|
||||
out:
|
||||
consume_skb(skb);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user