HI there,
I am trying to trace where the protocol updates its count of echos via
a neighbour. So far this is what I am interpreting: If I know that the
OGM came from this station, then we can record that we got the packet
in bit_mark, and update our neighbour's bcast_own_sum in their
originator entry.
if ((has_directlink_flag) && (if_incoming->addr.sin_addr.s_addr ==
bat_packet->orig) && (bat_packet->seqno - if_incoming->out.seqno + 2
== 0)) {
debug_output(4, "count own bcast (is_my_orig): old = %i, ",
orig_neigh_node->bcast_own_sum[if_incoming->if_num]);
bit_mark((TYPE_OF_WORD
*)&(orig_neigh_node->bcast_own[if_incoming->if_num * num_words]), 0);
orig_neigh_node->bcast_own_sum[if_incoming->if_num] =
bit_packet_count((TYPE_OF_WORD
*)&(orig_neigh_node->bcast_own[if_incoming->if_num * num_words]));
debug_output(4, "new = %i \n",
orig_neigh_node->bcast_own_sum[if_incoming->if_num]);
}
What I am trying to see is where the sliding window (of size
local_window_size) for echos is defined. This I cannot locate, and in
my report I am saying that bcast_own_sum is the sliding window for
echos, which I am not sure is correct or incorrect.
Thanks in advance for the help.
Regards
Dominic
UCT, SA
Hi Esteban
You can try my patch to filter OGMs:
http://git.open-mesh.org/batman-adv.git/shortlog/refs/heads/hundeboll/filter
The commit message tells how to use it. Unfortunately, its base is quite old, but it should be easy to rebase. Otherwise I can rebase it when I return from Canada next week...
Cheers,
Martin
PS: Sorry for top posting. This Android client want let me change it :(
Sven Eckelmann <sven(a)narfation.org> wrote:
>On Friday 07 September 2012 16:58:33 Esteban Municio wrote:
>> Hi list
>>
>> Is there any way to block some links between nodes in order to force a
>> specific network topology in batman-adv?
>>
>> Por example, if y have 3 nodes A, B, C and I want to create a string
>> topology A <-> B <-> C, where A can not connect directly with C, how
>> could I get it without move far away the nodes?
>
>You can try to add a your interface to a bridge (only one interface per
>bridge) and add this bridge to batman-adv. Now you can filter packets using
>ebtables (and therefore drop packets from specific hosts).
>
>Kind regards,
> Sven
Is there any manual way to prioritize a wired interface over a wireless interface? It seems to do so naturally at first, but if I unplug and replug the Ethernet cable a couple times when testing it will stay on wireless. Is this considered an optimization or a bug, and how can I make it so it should always choose the Ethernet, even in multi-hop situations? For example, Babel uses an "rxcost" metric for each interface to manually increase the cost of a route on each interface.
Thanks for your help.
Hello again nice folks,
I updated today another segment of the network with just 4 nodes, to
batman-adv 2012.2 (the one i compiled yesterday with simon patches for
blaII, marek stability fixes, and debug log enabled , yikes!)
and i couldn't get batman to work over wired ethernet?? (?)
P -(50mts wlan)- D -----(ubnt transparent bridge) 2km -- C
\----eth-------------------/
Node P and D connected by ethernet on eth0 but close enough that could
also see each other through adhoc wlan, with bla enabled, correctly
preferred ethernet connection to communicate between them (iperf
yielded 92mbps), so far so good.
now, node D and C, too far away from each other to communicate over
wlan, but connected by a "loooong eth cable" (mediated by a wds
transparent bridge) wouldn't find each other batman originator.
C originator table was empty, and D only showed P.
I thought the transparent bridge was misbehaving, so I tried in a
simpler setup using P and D, with the wifi off:
but after disabling wlan0 (batctl if del wlan0-2) and adding eth0
(batctl if add eth0) on both nodes, batman could not see each other
anymore :(
i thought i was doing something wrong, so i tried in different ways,
but could not get it to work.
batctl td eth0 shows both outgoing OGMs from local , and incoming OGMs
from remote,
but batctl l only reported outgoing OGMs.
http://pastebin.com/7DDUaXu1
diego is local node ("D"), palmeras is on the other side of the
ethernet cable ("P") (and jure is further away, connected to palmeras
by adhoc wlan, not illustrated in the previous ascii art)
i hope i'm overlooking something really obvious?
Have a nice weekend!
Gui
Any virtual device created on top of a batman-adv mesh interface must be
prevented to be used to create a new mesh network (this would lead to an
unwanted batman-over-batman configuration)
Signed-off-by: Antonio Quartulli <ordex(a)autistici.org>
---
v2:
- added check for !parent_dev with WARN_ON()
hard-interface.c | 41 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 40 insertions(+), 1 deletion(-)
diff --git a/hard-interface.c b/hard-interface.c
index fab9e41..7967f14 100644
--- a/hard-interface.c
+++ b/hard-interface.c
@@ -58,6 +58,45 @@ out:
return hard_iface;
}
+/**
+ * batadv_is_on_batman_iface - check if a device is a batman iface descendant
+ * @net_dev: the device to check
+ *
+ * If the user creates any virtual device on top of a batman-adv interface, it
+ * is important to prevent this new interface to be used to create a new mesh
+ * network (this behaviour would lead to a batman-over-batman configuration).
+ * This function recursively checks all the fathers of the device passed as
+ * argument looking for a batman-adv soft interface.
+ *
+ * Returns true if the device is descendant of a batman-adv mesh interface (or
+ * if it is a batman-adv interface itself), false otherwise
+ */
+static bool batadv_is_on_batman_iface(const struct net_device *net_dev)
+{
+ struct net_device *parent_dev;
+ bool ret;
+
+ /* check if this is a batman-adv mesh interface */
+ if (batadv_softif_is_valid(net_dev))
+ return true;
+
+ /* no more parents..stop recursion */
+ if (net_dev->iflink == net_dev->ifindex)
+ return false;
+
+ /* recurse over the parent device */
+ parent_dev = dev_get_by_index(&init_net, net_dev->iflink);
+ /* if we got a NULL parent_dev there is something broken.. */
+ if (WARN(!parent_dev, "Cannot find parent device"))
+ return false;
+
+ ret = batadv_is_on_batman_iface(parent_dev);
+
+ if (parent_dev)
+ dev_put(parent_dev);
+ return ret;
+}
+
static int batadv_is_valid_iface(const struct net_device *net_dev)
{
if (net_dev->flags & IFF_LOOPBACK)
@@ -70,7 +109,7 @@ static int batadv_is_valid_iface(const struct net_device *net_dev)
return 0;
/* no batman over batman */
- if (batadv_softif_is_valid(net_dev))
+ if (batadv_is_on_batman_iface(net_dev))
return 0;
return 1;
--
1.7.12
Classification: UNCLASSIFIED
Caveats: NONE
Hi all, I'm trying to get some information on how batman works to determine
what my next steps are for an experiment I'm running. I'm hoping someone on
the list can tell me how Batman operates RIGHT NOW, not just how it is
intended to operate in the future, so I can make reasonable plans.
1) I'm guessing from the following pages (which only describe roaming and
announcement behaviors) that the TTL field of all packets is decremented by
1. Is this true?
http://www.open-mesh.org/projects/batman-adv/wiki/Client-roaminghttp://www.open-mesh.org/projects/batman-adv/wiki/Client-announcement
2) Follow up to question 1; are the TTL fields of Batman packets and IP
packets linked in some way? The library I'm using (zeromq,
http://www.zeromq.org/) has a reliable multicast transport built on top of
OpenPGM (http://code.google.com/p/openpgm/). My plan is to simulate
reliable 1-hop broadcast by using reliable multicast and setting the TTL
field to 1. However, this will only affect the IP layer. Unless batman
also decrements the TTL field of the IP packets traveling over it, I'm kind
of stuck.
3) Finally, does batman have the equivalent of multicast or (better yet)
broadcast for data packets? That is, if I send something to a multicast IP
address which all of its 1-hop neighbors are listening to, will all of them
listen to the packet simultaneously, or will it act like a series of unicast
messages?
If you're wondering what I'm trying to do, message me directly. It's easy
to explain, but off topic for this list.
Thanks,
Cem Karan
Classification: UNCLASSIFIED
Caveats: NONE
On some architectures test_bit() can return other values than 0 or 1:
With a generic x86 OpenWrt image in a kvm setup (batadv_)test_bit()
frequently returns -1 for me, leading to batadv_iv_ogm_update_seqnos()
wrongly signaling a protected seqno window.
This patch tries to fix this issue by making batadv_test_bit() return 0
or 1 only.
Signed-off-by: Linus Lüssing <linus.luessing(a)web.de>
---
bitarray.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/bitarray.h b/bitarray.h
index a081ce1..cebaae7 100644
--- a/bitarray.h
+++ b/bitarray.h
@@ -20,8 +20,8 @@
#ifndef _NET_BATMAN_ADV_BITARRAY_H_
#define _NET_BATMAN_ADV_BITARRAY_H_
-/* returns true if the corresponding bit in the given seq_bits indicates true
- * and curr_seqno is within range of last_seqno
+/* Returns 1 if the corresponding bit in the given seq_bits indicates true
+ * and curr_seqno is within range of last_seqno. Otherwise returns 0.
*/
static inline int batadv_test_bit(const unsigned long *seq_bits,
uint32_t last_seqno, uint32_t curr_seqno)
@@ -32,7 +32,7 @@ static inline int batadv_test_bit(const unsigned long *seq_bits,
if (diff < 0 || diff >= BATADV_TQ_LOCAL_WINDOW_SIZE)
return 0;
else
- return test_bit(diff, seq_bits);
+ return test_bit(diff, seq_bits) != 0;
}
/* turn corresponding bit on, so we can remember that we got the packet */
--
1.7.10.4
The roaming re-routing procedure has been slightly revised in order to get rid
of the tt_poss_change variable that was not clearly representing the node/client
states. Now the code directly relies on the TT_CLIENT_ROAM flag that can be
set on the involved local/global clients.
This improvement also allow clients to roam multiple times in the same
originator-interval, because nodes now let packets go to the node that was
originally serving the roamed client which will then reroute the data to the
correct destination at any point in time.
Signed-off-by: Antonio Quartulli <ordex(a)autistici.org>
---
- This patch is based on top of:
"batman-adv: substitute tt_poss_change with a per-tt_entry flag"
translation-table.c | 216 ++++++++++++++++++++++++++++++++++++----------------
1 file changed, 152 insertions(+), 64 deletions(-)
diff --git a/translation-table.c b/translation-table.c
index 21830f5..e5afcee 100644
--- a/translation-table.c
+++ b/translation-table.c
@@ -238,90 +238,138 @@ static int batadv_tt_local_init(struct batadv_priv *bat_priv)
return 0;
}
+static void
+batadv_tt_global_del_struct(struct batadv_priv *bat_priv,
+ struct batadv_tt_global_entry *tt_global_entry,
+ const char *message)
+{
+ batadv_dbg(BATADV_DBG_TT, bat_priv,
+ "Deleting global tt entry %pM: %s\n",
+ tt_global_entry->common.addr, message);
+
+ batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt,
+ batadv_choose_orig, tt_global_entry->common.addr);
+ batadv_tt_global_entry_free_ref(tt_global_entry);
+
+}
+
void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
int ifindex)
{
struct batadv_priv *bat_priv = netdev_priv(soft_iface);
- struct batadv_tt_local_entry *tt_local_entry = NULL;
- struct batadv_tt_global_entry *tt_global_entry = NULL;
+ struct batadv_tt_local_entry *tt_local = NULL;
+ struct batadv_tt_global_entry *tt_global = NULL;
struct hlist_head *head;
struct hlist_node *node;
struct batadv_tt_orig_list_entry *orig_entry;
int hash_added;
+ bool back_roam = false;
- tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr);
+ tt_local = batadv_tt_local_hash_find(bat_priv, addr);
+ /* look for the global entry so that we can eventually operate on it */
+ tt_global = batadv_tt_global_hash_find(bat_priv, addr);
- if (tt_local_entry) {
- tt_local_entry->last_seen = jiffies;
- /* possibly unset the BATADV_TT_CLIENT_PENDING flag */
- tt_local_entry->common.flags &= ~BATADV_TT_CLIENT_PENDING;
- goto out;
+
+ if (tt_local) {
+ tt_local->last_seen = jiffies;
+ if (tt_local->common.flags & BATADV_TT_CLIENT_PENDING) {
+ /* if this client is marked as pending it means that it
+ * was purged out before.
+ */
+ batadv_dbg(BATADV_DBG_TT, bat_priv,
+ "Readding pending client %pM\n", addr);
+ tt_local->common.flags &= ~BATADV_TT_CLIENT_PENDING;
+ goto add_event;
+ }
+ /* if the entry is marked as NEW, it means that the node is not
+ * the original owner of this client (in this orig-interval),
+ * therefore it does need to eventually send a roaming
+ * advertisement
+ */
+ /*if (tt_local->common.flags & BATADV_TT_CLIENT_NEW)
+ goto out;*/
+
+ if (tt_local->common.flags & BATADV_TT_CLIENT_ROAM) {
+ batadv_dbg(BATADV_DBG_TT, bat_priv,
+ "Roaming client %pM came back to its original location\n",
+ addr);
+ tt_local->common.flags &= ~BATADV_TT_CLIENT_ROAM;
+ back_roam = true;
+ goto check_roaming;
+ }
+ goto check_roaming;
}
- tt_local_entry = kmalloc(sizeof(*tt_local_entry), GFP_ATOMIC);
- if (!tt_local_entry)
+ tt_local = kmalloc(sizeof(*tt_local), GFP_ATOMIC);
+ if (!tt_local)
goto out;
batadv_dbg(BATADV_DBG_TT, bat_priv,
"Creating new local tt entry: %pM (ttvn: %d)\n", addr,
(uint8_t)atomic_read(&bat_priv->tt.vn));
- memcpy(tt_local_entry->common.addr, addr, ETH_ALEN);
- tt_local_entry->common.flags = BATADV_NO_FLAGS;
+ memcpy(tt_local->common.addr, addr, ETH_ALEN);
+ tt_local->common.flags = BATADV_NO_FLAGS;
if (batadv_is_wifi_iface(ifindex))
- tt_local_entry->common.flags |= BATADV_TT_CLIENT_WIFI;
- atomic_set(&tt_local_entry->common.refcount, 2);
- tt_local_entry->last_seen = jiffies;
- tt_local_entry->common.added_at = tt_local_entry->last_seen;
+ tt_local->common.flags |= BATADV_TT_CLIENT_WIFI;
+ atomic_set(&tt_local->common.refcount, 2);
+ tt_local->last_seen = jiffies;
+ tt_local->common.added_at = tt_local->last_seen;
/* the batman interface mac address should never be purged */
if (batadv_compare_eth(addr, soft_iface->dev_addr))
- tt_local_entry->common.flags |= BATADV_TT_CLIENT_NOPURGE;
+ tt_local->common.flags |= BATADV_TT_CLIENT_NOPURGE;
/* The local entry has to be marked as NEW to avoid to send it in
* a full table response going out before the next ttvn increment
* (consistency check)
*/
- tt_local_entry->common.flags |= BATADV_TT_CLIENT_NEW;
+ tt_local->common.flags |= BATADV_TT_CLIENT_NEW;
hash_added = batadv_hash_add(bat_priv->tt.local_hash, batadv_compare_tt,
batadv_choose_orig,
- &tt_local_entry->common,
- &tt_local_entry->common.hash_entry);
+ &tt_local->common,
+ &tt_local->common.hash_entry);
if (unlikely(hash_added != 0)) {
/* remove the reference for the hash */
- batadv_tt_local_entry_free_ref(tt_local_entry);
+ batadv_tt_local_entry_free_ref(tt_local);
goto out;
}
- batadv_tt_local_event(bat_priv, addr, tt_local_entry->common.flags);
-
- /* remove address from global hash if present */
- tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr);
+add_event:
+ batadv_tt_local_event(bat_priv, addr, tt_local->common.flags);
+check_roaming:
/* Check whether it is a roaming! */
- if (tt_global_entry) {
+ if (tt_global) {
/* These node are probably going to update their tt table */
- head = &tt_global_entry->orig_list;
+ head = &tt_global->orig_list;
rcu_read_lock();
hlist_for_each_entry_rcu(orig_entry, node, head, list) {
batadv_send_roam_adv(bat_priv,
- tt_global_entry->common.addr,
+ tt_global->common.addr,
orig_entry->orig_node);
}
rcu_read_unlock();
- /* The global entry has to be marked as ROAMING and
- * has to be kept for consistency purpose
- */
- tt_global_entry->common.flags |= BATADV_TT_CLIENT_ROAM;
- tt_global_entry->roam_at = jiffies;
+ if (back_roam) {
+ batadv_tt_global_del_struct(bat_priv, tt_global,
+ "Roaming canceled");
+ tt_global = NULL;
+ } else {
+ /* The global entry has to be marked as ROAMING and
+ * has to be kept for consistency purpose
+ */
+ tt_global->common.flags |= BATADV_TT_CLIENT_ROAM;
+ tt_global->roam_at = jiffies;
+ }
}
+
out:
- if (tt_local_entry)
- batadv_tt_local_entry_free_ref(tt_local_entry);
- if (tt_global_entry)
- batadv_tt_global_entry_free_ref(tt_global_entry);
+ if (tt_local)
+ batadv_tt_local_entry_free_ref(tt_local);
+ if (tt_global)
+ batadv_tt_global_entry_free_ref(tt_global);
}
static void batadv_tt_realloc_packet_buff(unsigned char **packet_buff,
@@ -510,13 +558,28 @@ uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv,
curr_flags = tt_local_entry->common.flags;
flags = BATADV_TT_CLIENT_DEL;
+ /* if this global entry addition is due to a roaming, the node has to
+ * mark the local entry as "roamed" in order to correctly reroute
+ * packets later
+ */
if (roaming) {
flags |= BATADV_TT_CLIENT_ROAM;
/* mark the local client as ROAMed */
tt_local_entry->common.flags |= BATADV_TT_CLIENT_ROAM;
}
- batadv_tt_local_set_pending(bat_priv, tt_local_entry, flags, message);
+ if (!(tt_local_entry->common.flags & BATADV_TT_CLIENT_NEW)) {
+ batadv_tt_local_set_pending(bat_priv, tt_local_entry, flags,
+ message);
+ goto out;
+ }
+ /* if this client has been added right now, it is possible to
+ * immediately purge it
+ */
+ batadv_tt_local_event(bat_priv, tt_local_entry->common.addr,
+ curr_flags | BATADV_TT_CLIENT_DEL);
+ hlist_del_rcu(&tt_local_entry->common.hash_entry);
+ batadv_tt_local_entry_free_ref(tt_local_entry);
out:
if (tt_local_entry)
@@ -726,12 +789,22 @@ int batadv_tt_global_add(struct batadv_priv *bat_priv,
uint8_t ttvn)
{
struct batadv_tt_global_entry *tt_global_entry = NULL;
+ struct batadv_tt_local_entry *tt_local_entry = NULL;
int ret = 0;
int hash_added;
struct batadv_tt_common_entry *common;
uint16_t local_flags;
tt_global_entry = batadv_tt_global_hash_find(bat_priv, tt_addr);
+ tt_local_entry = batadv_tt_local_hash_find(bat_priv, tt_addr);
+
+ /* if the node already has a local client for this entry, it has to wait
+ * for a roaming advertisement instead of manually messing up the global
+ * table
+ */
+ if ((flags & BATADV_TT_CLIENT_TEMP) && tt_local_entry &&
+ !(tt_local_entry->common.flags & BATADV_TT_CLIENT_NEW))
+ goto out;
if (!tt_global_entry) {
tt_global_entry = kzalloc(sizeof(*tt_global_entry), GFP_ATOMIC);
@@ -766,19 +839,39 @@ int batadv_tt_global_add(struct batadv_priv *bat_priv,
goto out_remove;
}
} else {
+ common = &tt_global_entry->common;
/* If there is already a global entry, we can use this one for
* our processing.
- * But if we are trying to add a temporary client we can exit
- * directly because the temporary information should never
- * override any already known client state (whatever it is)
+ * But if we are trying to add a temporary client then here are
+ * two options at this point:
+ * 1) the global client is not a temporary client: the global
+ * client has to be left as it is, temporary information
+ * should never override any already known client state
+ * 2) the global client is a temporary client: purge the
+ * originator list and add the new one orig_entry
*/
- if (flags & BATADV_TT_CLIENT_TEMP)
- goto out;
+ if (flags & BATADV_TT_CLIENT_TEMP) {
+ if (!(common->flags & BATADV_TT_CLIENT_TEMP))
+ goto out;
+ if (batadv_tt_global_entry_has_orig(tt_global_entry,
+ orig_node))
+ goto out_remove;
+ batadv_tt_global_del_orig_list(tt_global_entry);
+ goto add_orig_entry;
+ }
/* if the client was temporary added before receiving the first
* OGM announcing it, we have to clear the TEMP flag
*/
- tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_TEMP;
+ common->flags &= ~BATADV_TT_CLIENT_TEMP;
+
+ /* if this is a normal add, possibly unset the ROAM flag. This
+ * flag could have been set before because the client was
+ * roaming, but now that the node got the ADD event, the flag
+ * can be unset
+ */
+ if (!(flags & BATADV_TT_CLIENT_ROAM))
+ common->flags &= ~BATADV_TT_CLIENT_ROAM;
/* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
* one originator left in the list and we previously received a
@@ -787,18 +880,19 @@ int batadv_tt_global_add(struct batadv_priv *bat_priv,
* We should first delete the old originator before adding the
* new one.
*/
- if (tt_global_entry->common.flags & BATADV_TT_CLIENT_ROAM) {
+ if (common->flags & BATADV_TT_CLIENT_ROAM) {
batadv_tt_global_del_orig_list(tt_global_entry);
- tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_ROAM;
+ common->flags &= ~BATADV_TT_CLIENT_ROAM;
tt_global_entry->roam_at = 0;
}
}
+add_orig_entry:
/* add the new orig_entry (if needed) or update it */
batadv_tt_global_orig_entry_add(tt_global_entry, orig_node, ttvn);
batadv_dbg(BATADV_DBG_TT, bat_priv,
"Creating new global tt entry: %pM (via %pM)\n",
- tt_global_entry->common.addr, orig_node->orig);
+ common->addr, orig_node->orig);
ret = 1;
out_remove:
@@ -806,12 +900,20 @@ out_remove:
/* remove address from local hash if present */
local_flags = batadv_tt_local_remove(bat_priv, tt_addr,
"global tt received",
- flags & BATADV_TT_CLIENT_ROAM);
+ !!(flags & BATADV_TT_CLIENT_ROAM));
tt_global_entry->common.flags |= local_flags & BATADV_TT_CLIENT_WIFI;
+ if (!(flags & BATADV_TT_CLIENT_ROAM))
+ /* this is a normal global add. Therefore the client is not in a
+ * roaming state anymore.
+ */
+ tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_ROAM;
+
out:
if (tt_global_entry)
batadv_tt_global_entry_free_ref(tt_global_entry);
+ if (tt_local_entry)
+ batadv_tt_local_entry_free_ref(tt_local_entry);
return ret;
}
@@ -929,21 +1031,6 @@ batadv_tt_global_del_orig_entry(struct batadv_priv *bat_priv,
spin_unlock_bh(&tt_global_entry->list_lock);
}
-static void
-batadv_tt_global_del_struct(struct batadv_priv *bat_priv,
- struct batadv_tt_global_entry *tt_global_entry,
- const char *message)
-{
- batadv_dbg(BATADV_DBG_TT, bat_priv,
- "Deleting global tt entry %pM: %s\n",
- tt_global_entry->common.addr, message);
-
- batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt,
- batadv_choose_orig, tt_global_entry->common.addr);
- batadv_tt_global_entry_free_ref(tt_global_entry);
-
-}
-
/* If the client is to be deleted, we check if it is the last origantor entry
* within tt_global entry. If yes, we set the BATADV_TT_CLIENT_ROAM flag and the
* timer, otherwise we simply remove the originator scheduled for deletion.
@@ -1207,7 +1294,8 @@ struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv,
if (src && atomic_read(&bat_priv->ap_isolation)) {
tt_local_entry = batadv_tt_local_hash_find(bat_priv, src);
- if (!tt_local_entry)
+ if (!tt_local_entry ||
+ (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING))
goto out;
}
--
1.7.12