From: Jiexun Wang <[email protected]>

Prevent tp_meter from starting new sender or receiver sessions after
mesh_state has left BATADV_MESH_ACTIVE.

Fixes: 33a3bb4a3345 ("batman-adv: throughput meter implementation")
Cc: [email protected]
Reported-by: Yuan Tan <[email protected]>
Reported-by: Yifan Wu <[email protected]>
Reported-by: Juefei Pu <[email protected]>
Reported-by: Xin Liu <[email protected]>
Co-developed-by: Luxing Yin <[email protected]>
Signed-off-by: Luxing Yin <[email protected]>
Signed-off-by: Jiexun Wang <[email protected]>
Signed-off-by: Ren Wei <[email protected]>
Signed-off-by: Sven Eckelmann <[email protected]>
Signed-off-by: Simon Wunderlich <[email protected]>
---
 net/batman-adv/tp_meter.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
index 2e42f6b348c83..d9a80e459c2e4 100644
--- a/net/batman-adv/tp_meter.c
+++ b/net/batman-adv/tp_meter.c
@@ -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);
 }
 
-- 
2.47.3

Reply via email to