Introduced by 99a6eb50ef5066e125cedb97bc0fcfcdff4f08cc
("batman-adv: deselect current GW on client mode switch off")
Reported-by: Marek Lindner <mareklindner(a)neomailbox.ch>
Signed-off-by: Antonio Quartulli <antonio(a)meshcoding.com>
---
gateway_client.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/gateway_client.c b/gateway_client.c
index dca73bb..2d23c82 100644
--- a/gateway_client.c
+++ b/gateway_client.c
@@ -224,7 +224,8 @@ void batadv_gw_check_client_stop(struct batadv_priv *bat_priv)
return;
/* deselect the current gateway so that next time that client mode is
- * enabled a proper GW_ADD event can be sent */
+ * enabled a proper GW_ADD event can be sent
+ */
batadv_gw_select(bat_priv, NULL);
/* if batman-adv is switching the gw client mode off and a gateway was
--
1.8.4.2
Provide a lua script that uses alfred to propagate and collect all interface
mac + names, then generate a /tmp/bat-hosts file.
If there's already a (probably hand-made) /etc/bat-hosts it won't overwrite it
but if there's none, it will symlink /etc/bat-hosts -> /tmp/bat-hosts
Signed-off-by: Gui Iribarren <gui(a)altermundi.net>
Thanks-to: Joshua Head <joshua.head(a)outlook.com>
---
alfred/Makefile | 2 +
alfred/files/bat-hosts.lua | 107 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 109 insertions(+)
create mode 100644 alfred/files/bat-hosts.lua
diff --git a/alfred/Makefile b/alfred/Makefile
index db9c71f..7027192 100644
--- a/alfred/Makefile
+++ b/alfred/Makefile
@@ -74,6 +74,8 @@ define Package/alfred/install
$(INSTALL_BIN) ./files/alfred.init $(1)/etc/init.d/alfred
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DATA) ./files/alfred.config $(1)/etc/config/alfred
+ $(INSTALL_DIR) $(1)/etc/alfred
+ $(INSTALL_BIN) ./files/bat-hosts.lua $(1)/etc/alfred/bat-hosts.lua
endef
$(eval $(call BuildPackage,alfred))
diff --git a/alfred/files/bat-hosts.lua b/alfred/files/bat-hosts.lua
new file mode 100644
index 0000000..19f2cad
--- /dev/null
+++ b/alfred/files/bat-hosts.lua
@@ -0,0 +1,107 @@
+#!/usr/bin/lua
+
+local type_id = 64 -- bat-hosts
+
+function get_hostname()
+ local hostfile = io.open("/proc/sys/kernel/hostname", "r")
+ local ret_string = hostfile:read("*a")
+ ret_string = string.gsub(ret_string, "\n", "")
+ hostfile:close()
+ return ret_string
+end
+
+function get_interfaces_names()
+ local ret = {}
+
+ for name in io.popen("ls -1 /sys/class/net/"):lines() do
+ table.insert(ret, name)
+ end
+
+ return ret
+end
+
+function get_interface_address(name)
+ local addressfile = io.open("/sys/class/net/"..name.."/address", "r")
+ local ret_string = addressfile:read("*a")
+ ret_string = string.gsub(ret_string, "\n", "")
+ addressfile:close()
+ return ret_string
+end
+
+
+local function generate_bat_hosts()
+-- get hostname and interface macs/names
+-- then return a table containing valid bat-hosts lines
+ local n, i
+ local ifaces, ret = {}, {}
+
+ local hostname = get_hostname()
+
+ for n, i in ipairs(get_interfaces_names()) do
+ local address = get_interface_address(i)
+ ifaces[address] = i
+ end
+
+ for mac, iname in pairs(ifaces) do
+ if mac:match("^%x%x:%x%x:%x%x:%x%x:%x%x:%x%x$") and not mac:match("00:00:00:00:00:00") then
+ table.insert(ret, mac.." "..hostname.."_"..iname.."\n")
+ end
+ end
+
+ return ret
+end
+
+local function publish_bat_hosts()
+-- pass a raw chunk of data to alfred
+ local fd = io.popen("alfred -s " .. type_id, "w")
+ if fd then
+ local ret = generate_bat_hosts()
+ if ret then
+ fd:write(table.concat(ret))
+ end
+ fd:close()
+ end
+end
+
+local function receive_bat_hosts()
+-- read raw chunks from alfred, convert them to a nested table and call write_bat_hosts
+ local fd = io.popen("alfred -r " .. type_id)
+ --[[ this command returns something like
+ { "54:e6:fc:b9:cb:37", "00:11:22:33:44:55 ham_wlan0\x0a00:22:33:22:33:22 ham_eth0\x0a" },
+ { "90:f6:52:bb:ec:57", "00:22:33:22:33:23 spam\x0a" },
+ ]]--
+
+ if fd then
+ local output = fd:read("*a")
+ if output then
+ assert(loadstring("rows = {" .. output .. "}"))()
+ write_bat_hosts(rows)
+ end
+ fd:close()
+ end
+end
+
+local function write_bat_hosts(rows)
+ local content = { "### File generated by alfred-bat-hosts\n" }
+
+ -- merge the chunks from all nodes, de-escaping newlines
+ for _, row in ipairs(rows) do
+ local node, value = unpack(row)
+ table.insert(content, "# Node ".. node .. "\n")
+ table.insert(content, value:gsub("\x0a", "\n") .. "\n")
+ end
+
+ -- write parsed content down to disk
+ local fd = io.open("/tmp/bat-hosts", "w")
+ if fd then
+ fd:write(table.concat(content))
+ fd:close()
+ end
+
+ -- try to make a symlink in /etc pointing to /tmp,
+ -- if it exists, ln will do nothing.
+ os.execute("ln -ns /tmp/bat-hosts /etc/bat-hosts 2>/dev/null")
+end
+
+publish_bat_hosts()
+receive_bat_hosts()
--
1.7.10.4
Hello list,
quite some time ago I sent a first version of this patchset together
with other changes. At that time we decided to split the features up and to
postpone the Extended Isolation for later sending.
Now here it is!
This feature is an extension of the already existing "AP isolation" which aims
to generalise the latter.
The idea is based on considering a particular subset of non-mesh clients as
"ISOLATED" and then apply the same policy that batman-adv already applies for
WiFi clients.
To decide which client belongs to this subset batman-adv uses the skb->mark
field which value can be altered by several components in the kernel (e.g.
netfilter). When an skb hits the soft-interface (e.g. bat0) the skb->mark
is compared to a preconfigured value and the source client is classified as
"ISOLATED" only in case of match.
The pre-configured mark (and its mask) is a user choice and can be set through
a new sysfs interface that is added within this patchset.
"ISOLATED" clients won't be able to talk to each other (batman-adv will drop
any packet originated by an isolated client and directed to another isolated
client) like it now happens for WiFi ones (when AP isolation is on).
Moreover broadcast packets sent by ISOLATED clients are marked on the
receiving node with the same mark that the user configured through the sysfs.
In this way netfilter (or any other program) can make decisions about
these packets on the receiver side (e.g. a rule could be "broadcast packets
created by ISOLATED clients cannot be forwarded over any port of the bridge X")
A draft of the documentation (with an example of how to use tc to mark/filter
packets) is available here[1] and will be improved as soon as the feature is
released.
Cheers,
[1] http://www.open-mesh.org/projects/batman-adv/wiki/Extended-isolation
p.s. I don't know if this can make a difference, but this patchset is based on
master + all my other patches pending on the mailing list.
Antonio Quartulli (5):
batman-adv: add isolation_mark sysfs attribute
batman-adv: mark a local client as isolated when needed
batman-adv: print the new BATADV_TT_CLIENT_ISOLA flag
batman-adv: extend the ap_isolation mechanism
batman-adv: set the isolation mark in the skb if needed
main.h | 2 ++
multicast.c | 3 ++-
packet.h | 1 +
soft-interface.c | 23 ++++++++++++++----
sysfs.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++
translation-table.c | 57 ++++++++++++++++++++++++++++++++++++++++----
translation-table.h | 4 +++-
types.h | 2 ++
8 files changed, 148 insertions(+), 12 deletions(-)
--
1.8.4.3
The new bitfield allows us to keep track whether capability subsets of
an originator have gone through their initialization phase yet.
The translation table is the only user right now, but a new one will be
added soon.
Signed-off-by: Linus Lüssing <linus.luessing(a)web.de>
---
* fix typo: BATADV_ORIG_CAPA_HAS_TVLV -> BATADV_ORIG_CAPA_HAS_TT
(plus one comment)
originator.c | 1 -
translation-table.c | 12 +++++++-----
types.h | 6 ++++--
3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/originator.c b/originator.c
index edfb921..24e0681 100644
--- a/originator.c
+++ b/originator.c
@@ -335,7 +335,6 @@ struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,
/* extra reference for return */
atomic_set(&orig_node->refcount, 2);
- orig_node->tt_initialised = false;
orig_node->bat_priv = bat_priv;
memcpy(orig_node->orig, addr, ETH_ALEN);
batadv_dat_init_orig_node_addr(orig_node);
diff --git a/translation-table.c b/translation-table.c
index 1f482a4..be3468b 100644
--- a/translation-table.c
+++ b/translation-table.c
@@ -1748,7 +1748,7 @@ void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
}
spin_unlock_bh(list_lock);
}
- orig_node->tt_initialised = false;
+ orig_node->capa_initialized &= ~BATADV_ORIG_CAPA_HAS_TT;
}
static bool batadv_tt_global_to_purge(struct batadv_tt_global_entry *tt_global,
@@ -2702,7 +2702,7 @@ static void _batadv_tt_update_changes(struct batadv_priv *bat_priv,
return;
}
}
- orig_node->tt_initialised = true;
+ orig_node->capa_initialized |= BATADV_ORIG_CAPA_HAS_TT;
}
static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv,
@@ -3192,13 +3192,15 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
uint8_t orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
struct batadv_tvlv_tt_vlan_data *tt_vlan;
bool full_table = true;
+ bool has_tt_init;
tt_vlan = (struct batadv_tvlv_tt_vlan_data *)tt_buff;
+ has_tt_init = orig_node->capa_initialized & BATADV_ORIG_CAPA_HAS_TT;
+
/* orig table not initialised AND first diff is in the OGM OR the ttvn
* increased by one -> we can apply the attached changes
*/
- if ((!orig_node->tt_initialised && ttvn == 1) ||
- ttvn - orig_ttvn == 1) {
+ if ((!has_tt_init && ttvn == 1) || ttvn - orig_ttvn == 1) {
/* the OGM could not contain the changes due to their size or
* because they have already been sent BATADV_TT_OGM_APPEND_MAX
* times.
@@ -3239,7 +3241,7 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
/* if we missed more than one change or our tables are not
* in sync anymore -> request fresh tt data
*/
- if (!orig_node->tt_initialised || ttvn != orig_ttvn ||
+ if (!has_tt_init || ttvn != orig_ttvn ||
!batadv_tt_global_check_crc(orig_node, tt_vlan,
tt_num_vlan)) {
request_table:
diff --git a/types.h b/types.h
index 8966508..4e5468f 100644
--- a/types.h
+++ b/types.h
@@ -166,13 +166,12 @@ struct batadv_orig_bat_iv {
* @bcast_seqno_reset: time when the broadcast seqno window was reset
* @batman_seqno_reset: time when the batman seqno window was reset
* @capabilities: announced capabilities of this originator
+ * @capa_initialized: bitfield to remember whether a capability was initialized
* @last_ttvn: last seen translation table version number
* @tt_buff: last tt changeset this node received from the orig node
* @tt_buff_len: length of the last tt changeset this node received from the
* orig node
* @tt_buff_lock: lock that protects tt_buff and tt_buff_len
- * @tt_initialised: bool keeping track of whether or not this node have received
- * any translation table information from the orig node yet
* @tt_lock: prevents from updating the table while reading it. Table update is
* made up by two operations (data structure update and metdata -CRC/TTVN-
* recalculation) and they have to be executed atomically in order to avoid
@@ -213,6 +212,7 @@ struct batadv_orig_node {
unsigned long bcast_seqno_reset;
unsigned long batman_seqno_reset;
uint8_t capabilities;
+ uint8_t capa_initialized;
atomic_t last_ttvn;
unsigned char *tt_buff;
int16_t tt_buff_len;
@@ -251,10 +251,12 @@ struct batadv_orig_node {
* enum batadv_orig_capabilities - orig node capabilities
* @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table enabled
* @BATADV_ORIG_CAPA_HAS_NC: orig node has network coding enabled
+ * @BATADV_ORIG_CAPA_HAS_TT: orig node has tt capability
*/
enum batadv_orig_capabilities {
BATADV_ORIG_CAPA_HAS_DAT = BIT(0),
BATADV_ORIG_CAPA_HAS_NC = BIT(1),
+ BATADV_ORIG_CAPA_HAS_TT = BIT(2),
};
/**
--
1.7.10.4
A typo resulted into the following build warning:
"In function 'batadv_mcast_mla_softif_get':
warning: assignment from incompatible pointer type"
This commit fixes it by using the correct name for the according struct.
Introduced by: a3f58139efedb96222dffdda89896c243fdff49e
("batman-adv: Multicast Listener Announcements via Translation Table")
Signed-off-by: Linus Lüssing <linus.luessing(a)web.de>
---
compat.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/compat.h b/compat.h
index 186547b..c83ac2c 100644
--- a/compat.h
+++ b/compat.h
@@ -103,8 +103,8 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
#undef netdev_for_each_mc_addr
#define netdev_for_each_mc_addr(mclist, dev) \
- for (mclist = (struct bat_dev_addr_list *)dev->mc_list; mclist; \
- mclist = (struct bat_dev_addr_list *)mclist->next)
+ for (mclist = (struct batadv_dev_addr_list *)dev->mc_list; mclist; \
+ mclist = (struct batadv_dev_addr_list *)mclist->next)
/* Note, that this breaks the usage of the normal 'struct netdev_hw_addr'
* for kernels < 2.6.35 in batman-adv!
--
1.7.10.4
The new bitfield allows us to keep track whether capability subsets of
an originator have gone through their initialization phase yet.
The translation table is the only user right now, but a new one will be
added soon.
Signed-off-by: Linus Lüssing <linus.luessing(a)web.de>
---
* style improvements (+has_tt_init)
originator.c | 1 -
translation-table.c | 12 +++++++-----
types.h | 6 ++++--
3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/originator.c b/originator.c
index edfb921..24e0681 100644
--- a/originator.c
+++ b/originator.c
@@ -335,7 +335,6 @@ struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,
/* extra reference for return */
atomic_set(&orig_node->refcount, 2);
- orig_node->tt_initialised = false;
orig_node->bat_priv = bat_priv;
memcpy(orig_node->orig, addr, ETH_ALEN);
batadv_dat_init_orig_node_addr(orig_node);
diff --git a/translation-table.c b/translation-table.c
index 1f482a4..2b7bb2e 100644
--- a/translation-table.c
+++ b/translation-table.c
@@ -1748,7 +1748,7 @@ void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
}
spin_unlock_bh(list_lock);
}
- orig_node->tt_initialised = false;
+ orig_node->capa_initialized &= ~BATADV_ORIG_CAPA_HAS_TVLV;
}
static bool batadv_tt_global_to_purge(struct batadv_tt_global_entry *tt_global,
@@ -2702,7 +2702,7 @@ static void _batadv_tt_update_changes(struct batadv_priv *bat_priv,
return;
}
}
- orig_node->tt_initialised = true;
+ orig_node->capa_initialized |= BATADV_ORIG_CAPA_HAS_TVLV;
}
static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv,
@@ -3192,13 +3192,15 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
uint8_t orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
struct batadv_tvlv_tt_vlan_data *tt_vlan;
bool full_table = true;
+ bool has_tt_init;
tt_vlan = (struct batadv_tvlv_tt_vlan_data *)tt_buff;
+ has_tt_init = orig_node->capa_initialized & BATADV_ORIG_CAPA_HAS_TVLV;
+
/* orig table not initialised AND first diff is in the OGM OR the ttvn
* increased by one -> we can apply the attached changes
*/
- if ((!orig_node->tt_initialised && ttvn == 1) ||
- ttvn - orig_ttvn == 1) {
+ if ((!has_tt_init && ttvn == 1) || ttvn - orig_ttvn == 1) {
/* the OGM could not contain the changes due to their size or
* because they have already been sent BATADV_TT_OGM_APPEND_MAX
* times.
@@ -3239,7 +3241,7 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
/* if we missed more than one change or our tables are not
* in sync anymore -> request fresh tt data
*/
- if (!orig_node->tt_initialised || ttvn != orig_ttvn ||
+ if (!has_tt_init || ttvn != orig_ttvn ||
!batadv_tt_global_check_crc(orig_node, tt_vlan,
tt_num_vlan)) {
request_table:
diff --git a/types.h b/types.h
index 8966508..54ea34a 100644
--- a/types.h
+++ b/types.h
@@ -166,13 +166,12 @@ struct batadv_orig_bat_iv {
* @bcast_seqno_reset: time when the broadcast seqno window was reset
* @batman_seqno_reset: time when the batman seqno window was reset
* @capabilities: announced capabilities of this originator
+ * @capa_initialized: bitfield to remember whether a capability was initialized
* @last_ttvn: last seen translation table version number
* @tt_buff: last tt changeset this node received from the orig node
* @tt_buff_len: length of the last tt changeset this node received from the
* orig node
* @tt_buff_lock: lock that protects tt_buff and tt_buff_len
- * @tt_initialised: bool keeping track of whether or not this node have received
- * any translation table information from the orig node yet
* @tt_lock: prevents from updating the table while reading it. Table update is
* made up by two operations (data structure update and metdata -CRC/TTVN-
* recalculation) and they have to be executed atomically in order to avoid
@@ -213,6 +212,7 @@ struct batadv_orig_node {
unsigned long bcast_seqno_reset;
unsigned long batman_seqno_reset;
uint8_t capabilities;
+ uint8_t capa_initialized;
atomic_t last_ttvn;
unsigned char *tt_buff;
int16_t tt_buff_len;
@@ -251,10 +251,12 @@ struct batadv_orig_node {
* enum batadv_orig_capabilities - orig node capabilities
* @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table enabled
* @BATADV_ORIG_CAPA_HAS_NC: orig node has network coding enabled
+ * @BATADV_ORIG_CAPA_HAS_TVLV: orig node has tvlv capability
*/
enum batadv_orig_capabilities {
BATADV_ORIG_CAPA_HAS_DAT = BIT(0),
BATADV_ORIG_CAPA_HAS_NC = BIT(1),
+ BATADV_ORIG_CAPA_HAS_TVLV = BIT(2),
};
/**
--
1.7.10.4
The new bitfield allows us to keep track whether capability subsets of
an originator have gone through their initialization phase yet.
The translation table is the only user right now, but a new one will be
added soon.
Signed-off-by: Linus Lüssing <linus.luessing(a)web.de>
---
originator.c | 1 -
translation-table.c | 11 ++++++-----
types.h | 6 ++++--
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/originator.c b/originator.c
index edfb921..24e0681 100644
--- a/originator.c
+++ b/originator.c
@@ -335,7 +335,6 @@ struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,
/* extra reference for return */
atomic_set(&orig_node->refcount, 2);
- orig_node->tt_initialised = false;
orig_node->bat_priv = bat_priv;
memcpy(orig_node->orig, addr, ETH_ALEN);
batadv_dat_init_orig_node_addr(orig_node);
diff --git a/translation-table.c b/translation-table.c
index 1f482a4..128d20c 100644
--- a/translation-table.c
+++ b/translation-table.c
@@ -1748,7 +1748,7 @@ void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
}
spin_unlock_bh(list_lock);
}
- orig_node->tt_initialised = false;
+ orig_node->capa_initialized &= ~BATADV_ORIG_CAPA_HAS_TVLV;
}
static bool batadv_tt_global_to_purge(struct batadv_tt_global_entry *tt_global,
@@ -2702,7 +2702,7 @@ static void _batadv_tt_update_changes(struct batadv_priv *bat_priv,
return;
}
}
- orig_node->tt_initialised = true;
+ orig_node->capa_initialized |= BATADV_ORIG_CAPA_HAS_TVLV;
}
static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv,
@@ -3197,8 +3197,8 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
/* orig table not initialised AND first diff is in the OGM OR the ttvn
* increased by one -> we can apply the attached changes
*/
- if ((!orig_node->tt_initialised && ttvn == 1) ||
- ttvn - orig_ttvn == 1) {
+ if ((!(orig_node->capa_initialized & BATADV_ORIG_CAPA_HAS_TVLV) &&
+ ttvn == 1) || ttvn - orig_ttvn == 1) {
/* the OGM could not contain the changes due to their size or
* because they have already been sent BATADV_TT_OGM_APPEND_MAX
* times.
@@ -3239,7 +3239,8 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
/* if we missed more than one change or our tables are not
* in sync anymore -> request fresh tt data
*/
- if (!orig_node->tt_initialised || ttvn != orig_ttvn ||
+ if (!(orig_node->capa_initialized
+ & BATADV_ORIG_CAPA_HAS_TVLV) || ttvn != orig_ttvn ||
!batadv_tt_global_check_crc(orig_node, tt_vlan,
tt_num_vlan)) {
request_table:
diff --git a/types.h b/types.h
index 8966508..54ea34a 100644
--- a/types.h
+++ b/types.h
@@ -166,13 +166,12 @@ struct batadv_orig_bat_iv {
* @bcast_seqno_reset: time when the broadcast seqno window was reset
* @batman_seqno_reset: time when the batman seqno window was reset
* @capabilities: announced capabilities of this originator
+ * @capa_initialized: bitfield to remember whether a capability was initialized
* @last_ttvn: last seen translation table version number
* @tt_buff: last tt changeset this node received from the orig node
* @tt_buff_len: length of the last tt changeset this node received from the
* orig node
* @tt_buff_lock: lock that protects tt_buff and tt_buff_len
- * @tt_initialised: bool keeping track of whether or not this node have received
- * any translation table information from the orig node yet
* @tt_lock: prevents from updating the table while reading it. Table update is
* made up by two operations (data structure update and metdata -CRC/TTVN-
* recalculation) and they have to be executed atomically in order to avoid
@@ -213,6 +212,7 @@ struct batadv_orig_node {
unsigned long bcast_seqno_reset;
unsigned long batman_seqno_reset;
uint8_t capabilities;
+ uint8_t capa_initialized;
atomic_t last_ttvn;
unsigned char *tt_buff;
int16_t tt_buff_len;
@@ -251,10 +251,12 @@ struct batadv_orig_node {
* enum batadv_orig_capabilities - orig node capabilities
* @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table enabled
* @BATADV_ORIG_CAPA_HAS_NC: orig node has network coding enabled
+ * @BATADV_ORIG_CAPA_HAS_TVLV: orig node has tvlv capability
*/
enum batadv_orig_capabilities {
BATADV_ORIG_CAPA_HAS_DAT = BIT(0),
BATADV_ORIG_CAPA_HAS_NC = BIT(1),
+ BATADV_ORIG_CAPA_HAS_TVLV = BIT(2),
};
/**
--
1.7.10.4