When the node checks for a packet to be re-routed or not, first it
should consider whether the destination is a local client. Only after
this check, the node can eventually search the global table.

This was introduced by ("batman-adv: substitute tt_poss_change with a
per-tt_entry flag")

Signed-off-by: Antonio Quartulli <[email protected]>
---
 routing.c | 31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/routing.c b/routing.c
index d5a01d1..c190c73 100644
--- a/routing.c
+++ b/routing.c
@@ -890,22 +890,37 @@ batadv_reroute_unicast_packet(struct batadv_priv 
*bat_priv,
                              struct batadv_unicast_packet *unicast_packet,
                              uint8_t *dst_addr)
 {
-       struct batadv_orig_node *orig_node;
+       struct batadv_orig_node *orig_node = NULL;
+       struct batadv_hard_iface *primary_if = NULL;
        bool ret = false;
+       uint8_t *orig_addr, orig_ttvn;
 
-       orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr);
-       if (!orig_node)
-               goto out;
+       if (batadv_is_my_client(bat_priv, dst_addr)) {
+               primary_if = batadv_primary_if_get_selected(bat_priv);
+               if (!primary_if)
+                       goto out;
+               orig_addr = primary_if->net_dev->dev_addr;
+               orig_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
+       } else {
+               orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr);
+               if (!orig_node)
+                       goto out;
 
-       if (batadv_compare_eth(orig_node->orig, unicast_packet->dest))
-               goto out;
+               if (batadv_compare_eth(orig_node->orig, unicast_packet->dest))
+                       goto out;
+
+               orig_addr = orig_node->orig;
+               orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
+       }
 
        /* update the packet header */
-       memcpy(unicast_packet->dest, orig_node->orig, ETH_ALEN);
-       unicast_packet->ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
+       memcpy(unicast_packet->dest, orig_addr, ETH_ALEN);
+       unicast_packet->ttvn = orig_ttvn;
 
        ret = true;
 out:
+       if (primary_if)
+               batadv_hardif_free_ref(primary_if);
        if (orig_node)
                batadv_orig_node_free_ref(orig_node);
 
-- 
1.8.0

Reply via email to