The batadv_orig_to_router() function will invoke batadv_find_router() to
get the neighbor node (router) for the specified interface. But
batadv_find_router() also is responsible for the bonding code when the
default (NULL) interface is specified. This is rather unexpected for the
OGM code.

Instead provide a simpler function which never tries to interact with the
bonding candidates and only returns the router on a specific interface.

Fixes: fa15d5b68da1 ("batman-adv: stop caching unowned originator pointers in 
BAT IV")
Signed-off-by: Sven Eckelmann <[email protected]>
---
Just meant as quick note about
https://lore.kernel.org/batman/[email protected]/T/#m3cdc727832b0f7cd7112bf004630d37103a36270

Don't have anything to test this at the moment.
---
 net/batman-adv/bat_iv_ogm.c | 31 +++++++++++++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
index d5f926e2..74ef7dc2 100644
--- a/net/batman-adv/bat_iv_ogm.c
+++ b/net/batman-adv/bat_iv_ogm.c
@@ -1310,6 +1310,32 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
        return ret;
 }
 
+/**
+ * batadv_orig_to_direct_router() - get direct next hop neighbor to an orig 
address
+ * @bat_priv: the bat priv with all the mesh interface information
+ * @orig_addr: the originator MAC address to search the best next hop router 
for
+ * @if_outgoing: the interface where the OGM should be sent to
+ *
+ * Return: A neighbor node which is the best router towards the given 
originator
+ * address. Bonding candidates are ignored.
+ */
+static struct batadv_neigh_node *
+batadv_orig_to_direct_router(struct batadv_priv *bat_priv, u8 *orig_addr,
+                            struct batadv_hard_iface *if_outgoing)
+{
+       struct batadv_neigh_node *neigh_node;
+       struct batadv_orig_node *orig_node;
+
+       orig_node = batadv_orig_hash_find(bat_priv, orig_addr);
+       if (!orig_node)
+               return NULL;
+
+       neigh_node = batadv_orig_router_get(orig_node, if_outgoing);
+       batadv_orig_node_put(orig_node);
+
+       return neigh_node;
+}
+
 /**
  * batadv_iv_ogm_process_per_outif() - process a batman iv OGM for an outgoing
  *  interface
@@ -1380,8 +1406,9 @@ batadv_iv_ogm_process_per_outif(const struct sk_buff 
*skb, int ogm_offset,
 
        router = batadv_orig_router_get(orig_node, if_outgoing);
        if (router) {
-               router_router = batadv_orig_to_router(bat_priv, router->addr,
-                                                     if_outgoing);
+               router_router = batadv_orig_to_direct_router(bat_priv,
+                                                            router->addr,
+                                                            if_outgoing);
                router_ifinfo = batadv_neigh_ifinfo_get(router, if_outgoing);
        }
 

---
base-commit: fa15d5b68da1a96c6baf846afd01390e6c217328
change-id: 20260506-direct-router-get-fix-520e9767b7ac

Best regards,
--  
Sven Eckelmann <[email protected]>

Reply via email to