The batadv_hash_remove is a function which searches the hashtable for an
entry using a needle, a hashtable bucket selection function and a compare
function. It will lock the bucket list and delete an entry when the compare
function matches it with the needle. It returns the pointer to the
hlist_node which matches or NULL when no entry matches the needle.
The batadv_bla_del_claim is not itself protected in anyway to avoid that
any other function is modifying the hashtable between the search for the
entry and the call to batadv_hash_remove. It can therefore happen that the
entry either doesn't exist anymore or an entry was deleted which is not the
same object as the needle. In such an situation, the reference counter (for
the reference stored in the hashtable) must not be reduced for the needle.
Instead the reference counter of the actually removed entry has to be
reduced.
Otherwise the reference counter will underflow and the object might be
freed before all its references were dropped. The kref helpers reported
this problem as:
refcount_t: underflow; use-after-free.
Fixes: a9ce0dc43e2c ("batman-adv: add basic bridge loop avoidance code")
Signed-off-by: Sven Eckelmann <sven(a)narfation.org>
---
Cc: Simon Wunderlich <sw(a)simonwunderlich.de>
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
index ef39aabdb69435f384ae2ebef26d4d31367f427c..4fb01108e5f534b8a055edface0717f950ccdacc 100644
--- a/net/batman-adv/bridge_loop_avoidance.c
+++ b/net/batman-adv/bridge_loop_avoidance.c
@@ -803,6 +803,8 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
const u8 *mac, const unsigned short vid)
{
struct batadv_bla_claim search_claim, *claim;
+ struct batadv_bla_claim *claim_removed_entry;
+ struct hlist_node *claim_removed_node;
ether_addr_copy(search_claim.addr, mac);
search_claim.vid = vid;
@@ -813,10 +815,18 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
batadv_dbg(BATADV_DBG_BLA, bat_priv, "%s(): %pM, vid %d\n", __func__,
mac, batadv_print_vid(vid));
- batadv_hash_remove(bat_priv->bla.claim_hash, batadv_compare_claim,
- batadv_choose_claim, claim);
- batadv_claim_put(claim); /* reference from the hash is gone */
+ claim_removed_node = batadv_hash_remove(bat_priv->bla.claim_hash,
+ batadv_compare_claim,
+ batadv_choose_claim, claim);
+ if (!claim_removed_node)
+ goto free_claim;
+ /* reference from the hash is gone */
+ claim_removed_entry = hlist_entry(claim_removed_node,
+ struct batadv_bla_claim, hash_entry);
+ batadv_claim_put(claim_removed_entry);
+
+free_claim:
/* don't need the reference from hash_find() anymore */
batadv_claim_put(claim);
}
OpenWrt was switched to use batctl as abstraction of the sysfs and netlink
configuration interface. The only additional configuration option to finish
this process is hop_penalty. It is required to defines the penalty which
will be applied to an not available via batctl was hop_penalty originator
message's tq-field on every hop.
Signed-off-by: Sven Eckelmann <sven(a)narfation.org>
---
Makefile | 1 +
README.rst | 15 +++++++
hop_penalty.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++
man/batctl.8 | 4 ++
4 files changed, 135 insertions(+)
create mode 100644 hop_penalty.c
diff --git a/Makefile b/Makefile
index 4d8b709..55105cc 100755
--- a/Makefile
+++ b/Makefile
@@ -63,6 +63,7 @@ $(eval $(call add_command,event,y))
$(eval $(call add_command,fragmentation,y))
$(eval $(call add_command,gateways,y))
$(eval $(call add_command,gw_mode,y))
+$(eval $(call add_command,hop_penalty,y))
$(eval $(call add_command,interface,y))
$(eval $(call add_command,isolation_mark,y))
$(eval $(call add_command,log,y))
diff --git a/README.rst b/README.rst
index 4c0f544..e30b5b9 100644
--- a/README.rst
+++ b/README.rst
@@ -530,6 +530,21 @@ Usage::
batctl aggregation|ag [0|1]
+batctl hop_penalty
+==================
+
+display or modify the hop_penalty (0-255)
+
+Usage::
+
+ batctl hop_penalty|hp [penalty]
+
+Example::
+
+ $ batctl penalty
+ 30
+
+
batctl isolation_mark
=====================
diff --git a/hop_penalty.c b/hop_penalty.c
new file mode 100644
index 0000000..58067bf
--- /dev/null
+++ b/hop_penalty.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (C) 2009-2019 B.A.T.M.A.N. contributors:
+ *
+ * Marek Lindner <mareklindner(a)neomailbox.ch>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA
+ *
+ * License-Filename: LICENSES/preferred/GPL-2.0
+ */
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "main.h"
+#include "sys.h"
+
+static struct hop_penalty_data {
+ uint8_t hop_penalty;
+} hop_penalty;
+
+static int parse_hop_penalty(struct state *state, int argc, char *argv[])
+{
+ struct settings_data *settings = state->cmd->arg;
+ struct hop_penalty_data *data = settings->data;
+ char *endptr;
+
+ if (argc != 2) {
+ fprintf(stderr, "Error - incorrect number of arguments (expected 1)\n");
+ return -EINVAL;
+ }
+
+ data->hop_penalty = strtoul(argv[1], &endptr, 0);
+ if (!endptr || *endptr != '\0') {
+ fprintf(stderr, "Error - the supplied argument is invalid: %s\n", argv[1]);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int print_hop_penalty(struct nl_msg *msg, void *arg)
+{
+ struct nlattr *attrs[BATADV_ATTR_MAX + 1];
+ struct nlmsghdr *nlh = nlmsg_hdr(msg);
+ struct genlmsghdr *ghdr;
+ int *result = arg;
+
+ if (!genlmsg_valid_hdr(nlh, 0))
+ return NL_OK;
+
+ ghdr = nlmsg_data(nlh);
+
+ if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
+ genlmsg_len(ghdr), batadv_netlink_policy)) {
+ return NL_OK;
+ }
+
+ if (!attrs[BATADV_ATTR_HOP_PENALTY])
+ return NL_OK;
+
+ printf("%u\n", nla_get_u8(attrs[BATADV_ATTR_HOP_PENALTY]));
+
+ *result = 0;
+ return NL_STOP;
+}
+
+static int get_hop_penalty(struct state *state)
+{
+ return sys_simple_nlquery(state, BATADV_CMD_GET_MESH,
+ NULL, print_hop_penalty);
+}
+
+static int set_attrs_hop_penalty(struct nl_msg *msg, void *arg)
+{
+ struct state *state = arg;
+ struct settings_data *settings = state->cmd->arg;
+ struct hop_penalty_data *data = settings->data;
+
+ nla_put_u8(msg, BATADV_ATTR_HOP_PENALTY, data->hop_penalty);
+
+ return 0;
+}
+
+static int set_hop_penalty(struct state *state)
+{
+ return sys_simple_nlquery(state, BATADV_CMD_SET_MESH,
+ set_attrs_hop_penalty, NULL);
+}
+
+static struct settings_data batctl_settings_hop_penalty = {
+ .sysfs_name = "hop_penalty",
+ .data = &hop_penalty,
+ .parse = parse_hop_penalty,
+ .netlink_get = get_hop_penalty,
+ .netlink_set = set_hop_penalty,
+};
+
+COMMAND_NAMED(SUBCOMMAND, hop_penalty, "hp", handle_sys_setting,
+ COMMAND_FLAG_MESH_IFACE | COMMAND_FLAG_NETLINK,
+ &batctl_settings_hop_penalty,
+ "[penalty] \tdisplay or modify hop_penalty setting");
diff --git a/man/batctl.8 b/man/batctl.8
index ed8e71f..0fbf1dd 100644
--- a/man/batctl.8
+++ b/man/batctl.8
@@ -97,6 +97,10 @@ when parameter \fB\-t\fP is specified. Parameter \fB\-r\fP will do the same but
If no parameter is given the current fragmentation mode setting is displayed. Otherwise the parameter is used to enable or
disable fragmentation.
.br
+.IP "\fBhop_penalty\fP|\fBhp\fP [\fBpenalty\fP]"
+If no parameter is given the current hop penalty setting is displayed. Otherwise the parameter is used to set the
+hop penalty. The penalty is can be 0-255 (255 sets originator message's TQ to zero when forwarded by this hop).
+.br
.IP "\fBnetwork_coding\fP|\fBnc\fP [\fB0\fP|\fB1\fP]"
If no parameter is given the current network coding mode setting is displayed. Otherwise the parameter is used to enable or
disable network coding.
--
2.20.1
When CONFIG_CFG80211 isn't enabled the compiler correcly warns about
'sinfo.pertid' may be unused. It can also happen for other error
conditions that it not warn about.
net/batman-adv/bat_v_elp.c: In function ‘batadv_v_elp_get_throughput.isra.0’:
include/net/cfg80211.h:6370:13: warning: ‘sinfo.pertid’ may be used
uninitialized in this function [-Wmaybe-uninitialized]
kfree(sinfo->pertid);
~~~~~^~~~~~~~
Rework so that we only release '&sinfo' if cfg80211_get_station returns
zero.
Signed-off-by: Anders Roxell <anders.roxell(a)linaro.org>
---
net/batman-adv/bat_v_elp.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c
index a9b7919c9de5..d5df0114f08a 100644
--- a/net/batman-adv/bat_v_elp.c
+++ b/net/batman-adv/bat_v_elp.c
@@ -104,8 +104,10 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh)
ret = cfg80211_get_station(real_netdev, neigh->addr, &sinfo);
- /* free the TID stats immediately */
- cfg80211_sinfo_release_content(&sinfo);
+ if (!ret) {
+ /* free the TID stats immediately */
+ cfg80211_sinfo_release_content(&sinfo);
+ }
dev_put(real_netdev);
if (ret == -ENOENT) {
--
2.19.2
A gratuitous ARP Reply has the following format (example):
Sender MAC: 00:12:34:56:78:9A
Sender IP: 192.168.2.3
Target MAC: FF:FF:FF:FF:FF:FF
Target IP: 192.168.2.3
A gratuitous ARP Reply is commonly used to update an ARP table in the
network in an unsolicited way. Here, the host with the MAC address
00:12:34:56:78:9A announces that it is now the owner of 192.168.2.3.
Gratuitous ARP Replies are usually used for redundancy or for IP address
handovers between hosts.
So far, gratuitous ARP Replies were ignored for DAT processing as it
contains a broadcast MAC address. This patch changes this and allows
snooping such ARP messages, too.
Special care needs to be taken with the target MAC, to not accidentally
add this broadcast MAC to the DAT cache.
Signed-off-by: Linus Lüssing <linus.luessing(a)c0d3.blue>
---
Gratuitous ARP Replies were ignored since this commit:
ab361a9ccc5 ("batman-adv: filter ARP packets with invalid MAC addresses in DAT")
Daniel Ehlers is currently working on a distributed DHCP server for mesh
networks. For cases like these it would be helpful if userspace programs
were able to add entries to the DAT, too. Sending gratuitous ARP Replies
would be one easy way for userspace tools to do so.
This patch was verified in VMs with gratuitous ARP Replies generated via
"mausezahn". Sending such packets with a 00:00:00:00:00:00 ethernet
frame destination address even allows updating the DAT without actually
broadcasting the original frame into the mesh.
[0]: https://github.com/sargon/ddhcpd,
[1]: https://media.freifunk.net/search/?q=ddhcp
---
net/batman-adv/distributed-arp-table.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c
index 310a4f35..c8923c7d 100644
--- a/net/batman-adv/distributed-arp-table.c
+++ b/net/batman-adv/distributed-arp-table.c
@@ -373,9 +373,12 @@ batadv_dat_entry_hash_find(struct batadv_priv *bat_priv, __be32 ip,
static void batadv_dat_entry_add(struct batadv_priv *bat_priv, __be32 ip,
u8 *mac_addr, unsigned short vid)
{
- struct batadv_dat_entry *dat_entry;
+ struct batadv_dat_entry *dat_entry = NULL;
int hash_added;
+ if (is_multicast_ether_addr(mac_addr))
+ goto out;
+
dat_entry = batadv_dat_entry_hash_find(bat_priv, ip, vid);
/* if this entry is already known, just update it */
if (dat_entry) {
@@ -1117,8 +1120,7 @@ static u16 batadv_arp_get_type(struct batadv_priv *bat_priv,
/* don't care about the destination MAC address in ARP requests */
if (arphdr->ar_op != htons(ARPOP_REQUEST)) {
hw_dst = batadv_arp_hw_dst(skb, hdr_size);
- if (is_zero_ether_addr(hw_dst) ||
- is_multicast_ether_addr(hw_dst))
+ if (is_zero_ether_addr(hw_dst))
goto out;
}
--
2.11.0
This patch adds an option for the new multicast_fanout setting in
batman-adv.
Signed-off-by: Linus Lüssing <linus.luessing(a)c0d3.blue>
---
Makefile | 1 +
README.rst | 10 +++++
batman_adv.h | 7 ++++
man/batctl.8 | 5 +++
multicast_fanout.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 138 insertions(+)
create mode 100644 multicast_fanout.c
diff --git a/Makefile b/Makefile
index 4d8b709..15bc3ec 100755
--- a/Makefile
+++ b/Makefile
@@ -69,6 +69,7 @@ $(eval $(call add_command,log,y))
$(eval $(call add_command,loglevel,y))
$(eval $(call add_command,mcast_flags,y))
$(eval $(call add_command,multicast_mode,y))
+$(eval $(call add_command,multicast_fanout,y))
$(eval $(call add_command,nc_nodes,y))
$(eval $(call add_command,neighbors,y))
$(eval $(call add_command,network_coding,y))
diff --git a/README.rst b/README.rst
index 4c0f544..a3a61ac 100644
--- a/README.rst
+++ b/README.rst
@@ -478,6 +478,16 @@ Usage::
batctl multicast_mode|mm [0|1]
+batctl multicast_fanout
+=====================
+
+display or modify the multicast fanout setting
+
+Usage::
+
+ batctl multicast_fanout|mo [fanout]
+
+
batctl mcast_flags
==================
diff --git a/batman_adv.h b/batman_adv.h
index 9b12d2a..2f956e6 100644
--- a/batman_adv.h
+++ b/batman_adv.h
@@ -491,6 +491,13 @@ enum batadv_nl_attrs {
*/
BATADV_ATTR_THROUGHPUT_OVERRIDE,
+ /**
+ * @BATADV_ATTR_MULTICAST_FANOUT: defines the maximum number of packet
+ * copies that may be generated for a multicast-to-unicast conversion.
+ * Once this limit is exceeded distribution will fall back to broadcast.
+ */
+ BATADV_ATTR_MULTICAST_FANOUT,
+
/* add attributes above here, update the policy in netlink.c */
/**
diff --git a/man/batctl.8 b/man/batctl.8
index ed8e71f..92c0e32 100644
--- a/man/batctl.8
+++ b/man/batctl.8
@@ -105,6 +105,11 @@ disable network coding.
If no parameter is given the current multicast mode setting is displayed. Otherwise the parameter is used to enable or
disable multicast optimizations (i.e. disabling means always sending own multicast frames via classic flooding).
.br
+.IP "\fBmulticast_fanout\fP|\fBmo\fP [\fBfanout\fP]"
+If no parameter is given the current multicast fanout setting is displayed. Otherwise the parameter is used to set
+the multicast fanout. The multicast fanout defines the maximum number of packet copies that may be generated for a
+multicast-to-unicast conversion. Once this limit is exceeded distribution will fall back to broadcast.
+.br
.IP "\fBloglevel\fP|\fBll\fP [\fBlevel\fP[ \fBlevel\fP[ \fBlevel\fP]] \fB...\fP]"
If no parameter is given the current log level settings are displayed otherwise the parameter(s) is/are used to set the log
level. Level 'none' disables all verbose logging. Level 'batman' enables messages related to routing / flooding / broadcasting.
diff --git a/multicast_fanout.c b/multicast_fanout.c
new file mode 100644
index 0000000..b48912b
--- /dev/null
+++ b/multicast_fanout.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (C) 2009-2019 B.A.T.M.A.N. contributors:
+ *
+ * Marek Lindner <mareklindner(a)neomailbox.ch>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA
+ *
+ * License-Filename: LICENSES/preferred/GPL-2.0
+ */
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "main.h"
+#include "sys.h"
+
+static struct multicast_fanout_data {
+ uint32_t multicast_fanout;
+} multicast_fanout;
+
+static int parse_multicast_fanout(struct state *state, int argc, char *argv[])
+{
+ struct settings_data *settings = state->cmd->arg;
+ struct multicast_fanout_data *data = settings->data;
+ char *endptr;
+
+ if (argc != 2) {
+ fprintf(stderr, "Error - incorrect number of arguments (expected 1)\n");
+ return -EINVAL;
+ }
+
+ data->multicast_fanout = strtoul(argv[1], &endptr, 0);
+ if (!endptr || *endptr != '\0') {
+ fprintf(stderr, "Error - the supplied argument is invalid: %s\n", argv[1]);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int print_multicast_fanout(struct nl_msg *msg, void *arg)
+{
+ struct nlattr *attrs[BATADV_ATTR_MAX + 1];
+ struct nlmsghdr *nlh = nlmsg_hdr(msg);
+ struct genlmsghdr *ghdr;
+ int *result = arg;
+
+ if (!genlmsg_valid_hdr(nlh, 0))
+ return NL_OK;
+
+ ghdr = nlmsg_data(nlh);
+
+ if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
+ genlmsg_len(ghdr), batadv_netlink_policy)) {
+ return NL_OK;
+ }
+
+ if (!attrs[BATADV_ATTR_MULTICAST_FANOUT])
+ return NL_OK;
+
+ printf("%u\n", nla_get_u32(attrs[BATADV_ATTR_MULTICAST_FANOUT]));
+
+ *result = 0;
+ return NL_STOP;
+}
+
+static int get_multicast_fanout(struct state *state)
+{
+ return sys_simple_nlquery(state, BATADV_CMD_GET_MESH,
+ NULL, print_multicast_fanout);
+}
+
+static int set_attrs_multicast_fanout(struct nl_msg *msg, void *arg)
+{
+ struct state *state = arg;
+ struct settings_data *settings = state->cmd->arg;
+ struct multicast_fanout_data *data = settings->data;
+
+ nla_put_u32(msg, BATADV_ATTR_MULTICAST_FANOUT, data->multicast_fanout);
+
+ return 0;
+}
+
+static int set_multicast_fanout(struct state *state)
+{
+ return sys_simple_nlquery(state, BATADV_CMD_SET_MESH,
+ set_attrs_multicast_fanout, NULL);
+}
+
+static struct settings_data batctl_settings_multicast_fanout = {
+ .sysfs_name = "multicast_fanout",
+ .data = &multicast_fanout,
+ .parse = parse_multicast_fanout,
+ .netlink_get = get_multicast_fanout,
+ .netlink_set = set_multicast_fanout,
+};
+
+COMMAND_NAMED(SUBCOMMAND, multicast_fanout, "mo", handle_sys_setting,
+ COMMAND_FLAG_MESH_IFACE | COMMAND_FLAG_NETLINK,
+ &batctl_settings_multicast_fanout,
+ "[fanout] \tdisplay or modify multicast_fanout setting");
--
2.11.0
Hi David,
here is another pull request for batman-adv to go into net-next. The main
patchset is Svens netlink restructure series, which was also discussed on netdev
for quite some time now and should be ready to be integrated.
Please pull or let me know of any problem!
Thank you,
Simon
The following changes since commit 7a79d717e0817610932ce3b7b6033ea06ee1d577:
batman-adv: Update copyright years for 2019 (2019-01-04 11:04:24 +0100)
are available in the git repository at:
git://git.open-mesh.org/linux-merge.git tags/batadv-next-for-davem-20190213
for you to fetch changes up to 7e6f461efe2554e35b740f3faea2994fc9551947:
batman-adv: Trigger genl notification on sysfs config change (2019-02-09 14:28:15 +0100)
----------------------------------------------------------------
This feature/cleanup patchset includes the following patches:
- fix memory leak in in batadv_dat_put_dhcp, by Martin Weinelt
- fix typo, by Sven Eckelmann
- netlink restructuring patch series (part 2), by Sven Eckelmann
(19 patches)
----------------------------------------------------------------
Martin Weinelt (1):
batman-adv: fix memory leak in in batadv_dat_put_dhcp
Sven Eckelmann (20):
batman-adv: Fix typo "reseved" -> "reserved"
batman-adv: Move common genl doit code pre/post hooks
batman-adv: Prepare framework for mesh genl config
batman-adv: Prepare framework for hardif genl config
batman-adv: Prepare framework for vlan genl config
batman-adv: Add aggregated_ogms mesh genl configuration
batman-adv: Add ap_isolation mesh/vlan genl configuration
batman-adv: Add bonding mesh genl configuration
batman-adv: Add bridge_loop_avoidance mesh genl configuration
batman-adv: Add distributed_arp_table mesh genl configuration
batman-adv: Add fragmentation mesh genl configuration
batman-adv: Add gateway mesh genl configuration
batman-adv: Add hop_penalty mesh genl configuration
batman-adv: Add log_level mesh genl configuration
batman-adv: Add multicast forceflood mesh genl configuration
batman-adv: Add network_coding mesh genl configuration
batman-adv: Add orig_interval mesh genl configuration
batman-adv: Add elp_interval hardif genl configuration
batman-adv: Add throughput_override hardif genl configuration
batman-adv: Trigger genl notification on sysfs config change
include/uapi/linux/batadv_packet.h | 2 +-
include/uapi/linux/batman_adv.h | 190 +++++-
net/batman-adv/distributed-arp-table.c | 2 +
net/batman-adv/gateway_client.c | 1 -
net/batman-adv/gateway_common.c | 1 +
net/batman-adv/gateway_common.h | 6 -
net/batman-adv/netlink.c | 1080 ++++++++++++++++++++++++++++----
net/batman-adv/netlink.h | 6 +
net/batman-adv/soft-interface.c | 2 +-
net/batman-adv/sysfs.c | 64 +-
10 files changed, 1206 insertions(+), 148 deletions(-)