batman-adv: upgrade package to latest release 2014.2.0
* remove batctl tool into separate package * support for vlan options added Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
This commit is contained in:
parent
ddcdb773b3
commit
f5205d7d24
14 changed files with 45 additions and 549 deletions
|
@ -14,16 +14,13 @@ config KMOD_BATMAN_ADV_DAT
|
||||||
depends on PACKAGE_kmod-batman-adv
|
depends on PACKAGE_kmod-batman-adv
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config KMOD_BATMAN_ADV_MCAST
|
||||||
|
bool "enable multicast transmission optimization"
|
||||||
|
depends on PACKAGE_kmod-batman-adv
|
||||||
|
default y
|
||||||
|
|
||||||
config KMOD_BATMAN_ADV_NC
|
config KMOD_BATMAN_ADV_NC
|
||||||
bool "enable network coding [requires promisc mode support]"
|
bool "enable network coding [requires promisc mode support]"
|
||||||
depends on PACKAGE_kmod-batman-adv
|
depends on PACKAGE_kmod-batman-adv
|
||||||
default n
|
default n
|
||||||
|
|
||||||
config KMOD_BATMAN_ADV_BATCTL
|
|
||||||
bool "enable batctl"
|
|
||||||
depends on PACKAGE_kmod-batman-adv
|
|
||||||
default y
|
|
||||||
help
|
|
||||||
batctl is a more intuitive managment utility for B.A.T.M.A.N.-Advanced.
|
|
||||||
It is an easier method for configuring batman-adv and
|
|
||||||
provides some additional tools for debugging as well.
|
|
||||||
|
|
|
@ -10,17 +10,14 @@ include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=batman-adv
|
PKG_NAME:=batman-adv
|
||||||
|
|
||||||
PKG_VERSION:=2014.1.0
|
PKG_VERSION:=2014.2.0
|
||||||
BATCTL_VERSION:=2014.1.0
|
PKG_RELEASE:=1
|
||||||
PKG_RELEASE:=3
|
PKG_MD5SUM:=1243029b3a3e2f4fa721d1a59c2faaf5
|
||||||
PKG_MD5SUM:=d55aabb2bc508194407187648c773c1b
|
|
||||||
BATCTL_MD5SUM:=92fd4cb60e38ec952fb5fdda4b2e6933
|
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
PKG_SOURCE_URL:=http://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
PKG_SOURCE_URL:=http://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||||
|
|
||||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(PKG_NAME)-$(PKG_VERSION)
|
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(PKG_NAME)-$(PKG_VERSION)
|
||||||
PKG_BATCTL_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/batctl-$(BATCTL_VERSION)
|
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
include $(INCLUDE_DIR)/kernel.mk
|
include $(INCLUDE_DIR)/kernel.mk
|
||||||
|
@ -29,7 +26,7 @@ define KernelPackage/batman-adv
|
||||||
URL:=http://www.open-mesh.org/
|
URL:=http://www.open-mesh.org/
|
||||||
MAINTAINER:=Marek Lindner <mareklindner@neomailbox.ch>
|
MAINTAINER:=Marek Lindner <mareklindner@neomailbox.ch>
|
||||||
SUBMENU:=Network Support
|
SUBMENU:=Network Support
|
||||||
DEPENDS:=+KMOD_BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-crypto-core +kmod-crypto-crc32c +kmod-lib-crc32c +libc +libnl-tiny
|
DEPENDS:=+KMOD_BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-crypto-core +kmod-crypto-crc32c +kmod-lib-crc32c
|
||||||
TITLE:=B.A.T.M.A.N. Adv
|
TITLE:=B.A.T.M.A.N. Adv
|
||||||
FILES:=$(PKG_BUILD_DIR)/batman-adv.$(LINUX_KMOD_SUFFIX)
|
FILES:=$(PKG_BUILD_DIR)/batman-adv.$(LINUX_KMOD_SUFFIX)
|
||||||
AUTOLOAD:=$(call AutoLoad,50,batman-adv)
|
AUTOLOAD:=$(call AutoLoad,50,batman-adv)
|
||||||
|
@ -37,9 +34,8 @@ endef
|
||||||
|
|
||||||
define KernelPackage/batman-adv/description
|
define KernelPackage/batman-adv/description
|
||||||
B.A.T.M.A.N. advanced is a kernel module which allows to
|
B.A.T.M.A.N. advanced is a kernel module which allows to
|
||||||
build layer 2 mesh networks. This package contains the
|
build layer 2 mesh networks. This package builds
|
||||||
version $(PKG_VERSION) of the kernel module plus its user space
|
version $(PKG_VERSION) of the kernel module.
|
||||||
configuration & managerment tool batctl.
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define KernelPackage/batman-adv/config
|
define KernelPackage/batman-adv/config
|
||||||
|
@ -57,74 +53,18 @@ MAKE_BATMAN_ADV_ARGS += \
|
||||||
CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_KMOD_BATMAN_ADV_DEBUG_LOG),y,n) \
|
CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_KMOD_BATMAN_ADV_DEBUG_LOG),y,n) \
|
||||||
CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_KMOD_BATMAN_ADV_BLA),y,n) \
|
CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_KMOD_BATMAN_ADV_BLA),y,n) \
|
||||||
CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_KMOD_BATMAN_ADV_DAT),y,n) \
|
CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_KMOD_BATMAN_ADV_DAT),y,n) \
|
||||||
|
CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),y,n) \
|
||||||
CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_KMOD_BATMAN_ADV_NC),y,n) \
|
CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_KMOD_BATMAN_ADV_NC),y,n) \
|
||||||
REVISION="" all
|
REVISION="" all
|
||||||
|
|
||||||
# The linker can identify unused sections of a binary when each symbol is stored
|
|
||||||
# in a separate section. This mostly removes unused linker sections and reduces
|
|
||||||
# the size by ~3% on mipsel.
|
|
||||||
|
|
||||||
TARGET_CFLAGS += -ffunction-sections -fdata-sections
|
|
||||||
TARGET_LDFLAGS += -Wl,--gc-sections
|
|
||||||
|
|
||||||
# Link-time optimization allows to move parts of the optimization from the single
|
|
||||||
# source file to the global source view. This is done by emitting the GIMPLE
|
|
||||||
# representation in each object file and analyzing it again during the link step.
|
|
||||||
|
|
||||||
TARGET_CFLAGS += -flto
|
|
||||||
TARGET_LDFLAGS += -fuse-linker-plugin
|
|
||||||
|
|
||||||
MAKE_BATCTL_ENV += \
|
|
||||||
CPPFLAGS="$(TARGET_CPPFLAGS)" \
|
|
||||||
CFLAGS="$(TARGET_CFLAGS)" \
|
|
||||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
|
||||||
LIBNL_NAME="libnl-tiny"
|
|
||||||
|
|
||||||
MAKE_BATCTL_ARGS += \
|
|
||||||
REVISION="" \
|
|
||||||
CC="$(TARGET_CC)" \
|
|
||||||
DESTDIR="$(PKG_INSTALL_DIR)" \
|
|
||||||
batctl install
|
|
||||||
|
|
||||||
ifneq ($(DEVELOPER)$(CONFIG_KMOD_BATMAN_ADV_BATCTL),)
|
|
||||||
define Download/batctl
|
|
||||||
FILE:=batctl-$(BATCTL_VERSION).tar.gz
|
|
||||||
URL:=$(PKG_SOURCE_URL)
|
|
||||||
MD5SUM:=$(BATCTL_MD5SUM)
|
|
||||||
endef
|
|
||||||
$(eval $(call Download,batctl))
|
|
||||||
|
|
||||||
BATCTL_EXTRACT = tar xzf "$(DL_DIR)/batctl-$(BATCTL_VERSION).tar.gz" -C "$(BUILD_DIR)/$(PKG_NAME)"
|
|
||||||
BATCTL_PATCH = $(call Build/DoPatch,"$(PKG_BATCTL_BUILD_DIR)","$(PATCH_DIR)","*batctl*")
|
|
||||||
BATCTL_BUILD = $(MAKE_BATCTL_ENV) $(MAKE) -C $(PKG_BATCTL_BUILD_DIR) $(MAKE_BATCTL_ARGS)
|
|
||||||
BATCTL_INSTALL = $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/local/sbin/batctl $(1)/usr/sbin/
|
|
||||||
endif
|
|
||||||
|
|
||||||
KPATCH ?= $(PATCH)
|
|
||||||
define Build/DoPatch
|
|
||||||
@if [ -d "$(2)" ]; then \
|
|
||||||
if [ "$$$$(ls $(2) | grep -Ec $(3))" -gt 0 ]; then \
|
|
||||||
$(KPATCH) "$(1)" "$(2)" "$(3)"; \
|
|
||||||
fi; \
|
|
||||||
fi
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Build/Patch
|
|
||||||
$(call Build/DoPatch,"$(PKG_BUILD_DIR)","$(PATCH_DIR)","*batman*")
|
|
||||||
$(BATCTL_EXTRACT)
|
|
||||||
$(BATCTL_PATCH)
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Build/Prepare
|
define Build/Prepare
|
||||||
$(call Build/Prepare/Default)
|
$(call Build/Prepare/Default)
|
||||||
$(SED) '/#define _NET_BATMAN_ADV_MAIN_H_/a\#undef CONFIG_MODULE_STRIPPED' \
|
$(SED) '/#define _NET_BATMAN_ADV_MAIN_H_/a\#undef CONFIG_MODULE_STRIPPED' \
|
||||||
$(PKG_BUILD_DIR)/main.h
|
$(PKG_BUILD_DIR)/main.h
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
|
||||||
define Build/Compile
|
define Build/Compile
|
||||||
$(MAKE) -C "$(PKG_BUILD_DIR)" $(MAKE_BATMAN_ADV_ARGS)
|
$(MAKE) -C "$(PKG_BUILD_DIR)" $(MAKE_BATMAN_ADV_ARGS)
|
||||||
$(BATCTL_BUILD)
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Build/Clean
|
define Build/Clean
|
||||||
|
@ -137,7 +77,7 @@ define KernelPackage/batman-adv/install
|
||||||
$(INSTALL_DATA) ./files/lib/batman-adv/config.sh $(1)/lib/batman-adv
|
$(INSTALL_DATA) ./files/lib/batman-adv/config.sh $(1)/lib/batman-adv
|
||||||
$(INSTALL_BIN) ./files/etc/hotplug.d/net/99-batman-adv $(1)/etc/hotplug.d/net
|
$(INSTALL_BIN) ./files/etc/hotplug.d/net/99-batman-adv $(1)/etc/hotplug.d/net
|
||||||
$(INSTALL_BIN) ./files/lib/netifd/proto/batadv.sh $(1)/lib/netifd/proto
|
$(INSTALL_BIN) ./files/lib/netifd/proto/batadv.sh $(1)/lib/netifd/proto
|
||||||
$(BATCTL_INSTALL)
|
$(INSTALL_BIN) ./files/lib/netifd/proto/batadv_vlan.sh $(1)/lib/netifd/proto
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call KernelPackage,batman-adv))
|
$(eval $(call KernelPackage,batman-adv))
|
||||||
|
|
|
@ -12,6 +12,7 @@ config 'mesh' 'bat0'
|
||||||
option 'vis_mode'
|
option 'vis_mode'
|
||||||
option 'bridge_loop_avoidance'
|
option 'bridge_loop_avoidance'
|
||||||
option 'distributed_arp_table'
|
option 'distributed_arp_table'
|
||||||
|
option 'multicast_mode'
|
||||||
option 'network_coding'
|
option 'network_coding'
|
||||||
option 'hop_penalty'
|
option 'hop_penalty'
|
||||||
option 'isolation_mark'
|
option 'isolation_mark'
|
||||||
|
|
|
@ -26,6 +26,7 @@ bat_config()
|
||||||
config_get gw_sel_class "$mesh" gw_sel_class
|
config_get gw_sel_class "$mesh" gw_sel_class
|
||||||
config_get hop_penalty "$mesh" hop_penalty
|
config_get hop_penalty "$mesh" hop_penalty
|
||||||
config_get isolation_mark "$mesh" isolation_mark
|
config_get isolation_mark "$mesh" isolation_mark
|
||||||
|
config_get multicast_mode "$mesh" multicast_mode
|
||||||
config_get network_coding "$mesh" network_coding
|
config_get network_coding "$mesh" network_coding
|
||||||
config_get log_level "$mesh" log_level
|
config_get log_level "$mesh" log_level
|
||||||
config_get orig_interval "$mesh" orig_interval
|
config_get orig_interval "$mesh" orig_interval
|
||||||
|
@ -44,6 +45,7 @@ bat_config()
|
||||||
[ -n "$gw_sel_class" ] && echo $gw_sel_class > /sys/class/net/$mesh/mesh/gw_sel_class
|
[ -n "$gw_sel_class" ] && echo $gw_sel_class > /sys/class/net/$mesh/mesh/gw_sel_class
|
||||||
[ -n "$hop_penalty" ] && echo $hop_penalty > /sys/class/net/$mesh/mesh/hop_penalty
|
[ -n "$hop_penalty" ] && echo $hop_penalty > /sys/class/net/$mesh/mesh/hop_penalty
|
||||||
[ -n "$isolation_mark" ] && echo $isolation_mark > /sys/class/net/$mesh/mesh/isolation_mark
|
[ -n "$isolation_mark" ] && echo $isolation_mark > /sys/class/net/$mesh/mesh/isolation_mark
|
||||||
|
[ -n "$multicast_mode" ] && echo $multicast_mode > /sys/class/net/$mesh/mesh/multicast_mode 2>&-
|
||||||
[ -n "$network_coding" ] && echo $network_coding > /sys/class/net/$mesh/mesh/network_coding 2>&-
|
[ -n "$network_coding" ] && echo $network_coding > /sys/class/net/$mesh/mesh/network_coding 2>&-
|
||||||
[ -n "$log_level" ] && echo $log_level > /sys/class/net/$mesh/mesh/log_level 2>&-
|
[ -n "$log_level" ] && echo $log_level > /sys/class/net/$mesh/mesh/log_level 2>&-
|
||||||
[ -n "$orig_interval" ] && echo $orig_interval > /sys/class/net/$mesh/mesh/orig_interval
|
[ -n "$orig_interval" ] && echo $orig_interval > /sys/class/net/$mesh/mesh/orig_interval
|
||||||
|
|
29
batman-adv/files/lib/netifd/proto/batadv_vlan.sh
Normal file
29
batman-adv/files/lib/netifd/proto/batadv_vlan.sh
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
. /lib/functions.sh
|
||||||
|
. ../netifd-proto.sh
|
||||||
|
init_proto "$@"
|
||||||
|
|
||||||
|
proto_batadv_vlan_init_config() {
|
||||||
|
proto_config_add_string "ap_isolation"
|
||||||
|
}
|
||||||
|
|
||||||
|
proto_batadv_vlan_setup() {
|
||||||
|
local config="$1"
|
||||||
|
local iface="$2"
|
||||||
|
|
||||||
|
# VLAN specific variables
|
||||||
|
local device="${iface%.*}"
|
||||||
|
local vid="${iface#*.}"
|
||||||
|
|
||||||
|
# batadv_vlan options
|
||||||
|
local ap_isolation
|
||||||
|
|
||||||
|
json_get_vars ap_isolation
|
||||||
|
|
||||||
|
echo "$ap_isolation" > "/sys/class/net/${device}/mesh/vlan${vid}/ap_isolation"
|
||||||
|
proto_init_update "$iface" 1
|
||||||
|
proto_send_update "$config"
|
||||||
|
}
|
||||||
|
|
||||||
|
add_protocol batadv_vlan
|
|
@ -1,35 +0,0 @@
|
||||||
From a424cd5a2c956ef1f0353d7e5f2b7fbc4af7d2d8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Simon Wunderlich <simon@open-mesh.com>
|
|
||||||
Date: Wed, 26 Mar 2014 15:46:21 +0100
|
|
||||||
Subject: [PATCH 1/9] batman-adv: fix neigh_ifinfo imbalance
|
|
||||||
|
|
||||||
The neigh_ifinfo object must be freed if it has been used in
|
|
||||||
batadv_iv_ogm_process_per_outif().
|
|
||||||
|
|
||||||
This is a regression introduced by
|
|
||||||
9bb33b8d88e318c4879d37d06ad28e3e018b9036 ("batman-adv: split tq
|
|
||||||
information in neigh_node struct")
|
|
||||||
|
|
||||||
Reported-by: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Signed-off-by: Simon Wunderlich <simon@open-mesh.com>
|
|
||||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
|
||||||
---
|
|
||||||
bat_iv_ogm.c | 2 ++
|
|
||||||
1 file changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c
|
|
||||||
index 8323bce..d074d06 100644
|
|
||||||
--- a/bat_iv_ogm.c
|
|
||||||
+++ b/bat_iv_ogm.c
|
|
||||||
@@ -1545,6 +1545,8 @@ out_neigh:
|
|
||||||
if ((orig_neigh_node) && (!is_single_hop_neigh))
|
|
||||||
batadv_orig_node_free_ref(orig_neigh_node);
|
|
||||||
out:
|
|
||||||
+ if (router_ifinfo)
|
|
||||||
+ batadv_neigh_ifinfo_free_ref(router_ifinfo);
|
|
||||||
if (router)
|
|
||||||
batadv_neigh_node_free_ref(router);
|
|
||||||
if (router_router)
|
|
||||||
--
|
|
||||||
2.0.0.rc2
|
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
From cdd09f69871ce8c98b8ae9fa0583f73938768943 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Simon Wunderlich <simon@open-mesh.com>
|
|
||||||
Date: Wed, 26 Mar 2014 15:46:22 +0100
|
|
||||||
Subject: [PATCH 2/9] batman-adv: fix neigh reference imbalance
|
|
||||||
|
|
||||||
When an interface is removed from batman-adv, the orig_ifinfo of a
|
|
||||||
orig_node may be removed without releasing the router first.
|
|
||||||
This will prevent the reference for the neighbor pointed at by the
|
|
||||||
orig_ifinfo->router to be released, and this leak may result in
|
|
||||||
reference leaks for the interface used by this neighbor. Fix that.
|
|
||||||
|
|
||||||
This is a regression introduced by
|
|
||||||
de6bcc76ea84fecb136f8c8f5ba1862e4a13f06b ("batman-adv: split out router
|
|
||||||
from orig_node").
|
|
||||||
|
|
||||||
Reported-by: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Signed-off-by: Simon Wunderlich <simon@open-mesh.com>
|
|
||||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
|
||||||
---
|
|
||||||
originator.c | 5 +++++
|
|
||||||
1 file changed, 5 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/originator.c b/originator.c
|
|
||||||
index 8539416..25df60d 100644
|
|
||||||
--- a/originator.c
|
|
||||||
+++ b/originator.c
|
|
||||||
@@ -500,12 +500,17 @@ batadv_neigh_node_get(const struct batadv_orig_node *orig_node,
|
|
||||||
static void batadv_orig_ifinfo_free_rcu(struct rcu_head *rcu)
|
|
||||||
{
|
|
||||||
struct batadv_orig_ifinfo *orig_ifinfo;
|
|
||||||
+ struct batadv_neigh_node *router;
|
|
||||||
|
|
||||||
orig_ifinfo = container_of(rcu, struct batadv_orig_ifinfo, rcu);
|
|
||||||
|
|
||||||
if (orig_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
|
|
||||||
batadv_hardif_free_ref_now(orig_ifinfo->if_outgoing);
|
|
||||||
|
|
||||||
+ /* this is the last reference to this object */
|
|
||||||
+ router = rcu_dereference_protected(orig_ifinfo->router, true);
|
|
||||||
+ if (router)
|
|
||||||
+ batadv_neigh_node_free_ref_now(router);
|
|
||||||
kfree(orig_ifinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.0.0.rc2
|
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
From 72125152cc46e55793329984428032769648904e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Simon Wunderlich <simon@open-mesh.com>
|
|
||||||
Date: Wed, 26 Mar 2014 15:46:23 +0100
|
|
||||||
Subject: [PATCH 3/9] batman-adv: always run purge_orig_neighbors
|
|
||||||
|
|
||||||
The current code will not execute batadv_purge_orig_neighbors() when an
|
|
||||||
orig_ifinfo has already been purged. However we need to run it in any
|
|
||||||
case. Fix that.
|
|
||||||
|
|
||||||
This is a regression introduced by
|
|
||||||
de6bcc76ea84fecb136f8c8f5ba1862e4a13f06b ("batman-adv: split out router
|
|
||||||
from orig_node")
|
|
||||||
|
|
||||||
Signed-off-by: Simon Wunderlich <simon@open-mesh.com>
|
|
||||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
|
||||||
---
|
|
||||||
originator.c | 8 ++++----
|
|
||||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/originator.c b/originator.c
|
|
||||||
index 25df60d..47b0886 100644
|
|
||||||
--- a/originator.c
|
|
||||||
+++ b/originator.c
|
|
||||||
@@ -857,7 +857,7 @@ static bool batadv_purge_orig_node(struct batadv_priv *bat_priv,
|
|
||||||
{
|
|
||||||
struct batadv_neigh_node *best_neigh_node;
|
|
||||||
struct batadv_hard_iface *hard_iface;
|
|
||||||
- bool changed;
|
|
||||||
+ bool changed_ifinfo, changed_neigh;
|
|
||||||
|
|
||||||
if (batadv_has_timed_out(orig_node->last_seen,
|
|
||||||
2 * BATADV_PURGE_TIMEOUT)) {
|
|
||||||
@@ -867,10 +867,10 @@ static bool batadv_purge_orig_node(struct batadv_priv *bat_priv,
|
|
||||||
jiffies_to_msecs(orig_node->last_seen));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
- changed = batadv_purge_orig_ifinfo(bat_priv, orig_node);
|
|
||||||
- changed = changed || batadv_purge_orig_neighbors(bat_priv, orig_node);
|
|
||||||
+ changed_ifinfo = batadv_purge_orig_ifinfo(bat_priv, orig_node);
|
|
||||||
+ changed_neigh = batadv_purge_orig_neighbors(bat_priv, orig_node);
|
|
||||||
|
|
||||||
- if (!changed)
|
|
||||||
+ if (!changed_ifinfo && !changed_neigh)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* first for NULL ... */
|
|
||||||
--
|
|
||||||
2.0.0.rc2
|
|
||||||
|
|
|
@ -1,88 +0,0 @@
|
||||||
From 9b9cdbe28e2b9c8bdf9c761f22ba9655963d13d4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Simon Wunderlich <simon@open-mesh.com>
|
|
||||||
Date: Wed, 26 Mar 2014 15:46:24 +0100
|
|
||||||
Subject: [PATCH 4/9] batman-adv: fix removing neigh_ifinfo
|
|
||||||
|
|
||||||
When an interface is removed separately, all neighbors need to be
|
|
||||||
checked if they have a neigh_ifinfo structure for that particular
|
|
||||||
interface. If that is the case, remove that ifinfo so any references to
|
|
||||||
a hard interface can be freed.
|
|
||||||
|
|
||||||
This is a regression introduced by
|
|
||||||
9bb33b8d88e318c4879d37d06ad28e3e018b9036 ("batman-adv: split tq
|
|
||||||
information in neigh_node struct")
|
|
||||||
|
|
||||||
Reported-by: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Signed-off-by: Simon Wunderlich <simon@open-mesh.com>
|
|
||||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
|
||||||
---
|
|
||||||
originator.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
1 file changed, 46 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/originator.c b/originator.c
|
|
||||||
index 47b0886..aa2468b 100644
|
|
||||||
--- a/originator.c
|
|
||||||
+++ b/originator.c
|
|
||||||
@@ -702,6 +702,47 @@ free_orig_node:
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
+ * batadv_purge_neigh_ifinfo - purge obsolete ifinfo entries from neighbor
|
|
||||||
+ * @bat_priv: the bat priv with all the soft interface information
|
|
||||||
+ * @neigh_node: orig node which is to be checked
|
|
||||||
+ */
|
|
||||||
+static void
|
|
||||||
+batadv_purge_neigh_ifinfo(struct batadv_priv *bat_priv,
|
|
||||||
+ struct batadv_neigh_node *neigh)
|
|
||||||
+{
|
|
||||||
+ struct batadv_neigh_ifinfo *neigh_ifinfo;
|
|
||||||
+ struct batadv_hard_iface *if_outgoing;
|
|
||||||
+ struct hlist_node *node_tmp;
|
|
||||||
+
|
|
||||||
+ spin_lock_bh(&neigh->ifinfo_lock);
|
|
||||||
+
|
|
||||||
+ /* for all ifinfo objects for this neighinator */
|
|
||||||
+ hlist_for_each_entry_safe(neigh_ifinfo, node_tmp,
|
|
||||||
+ &neigh->ifinfo_list, list) {
|
|
||||||
+ if_outgoing = neigh_ifinfo->if_outgoing;
|
|
||||||
+
|
|
||||||
+ /* always keep the default interface */
|
|
||||||
+ if (if_outgoing == BATADV_IF_DEFAULT)
|
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
+ /* don't purge if the interface is not (going) down */
|
|
||||||
+ if ((if_outgoing->if_status != BATADV_IF_INACTIVE) &&
|
|
||||||
+ (if_outgoing->if_status != BATADV_IF_NOT_IN_USE) &&
|
|
||||||
+ (if_outgoing->if_status != BATADV_IF_TO_BE_REMOVED))
|
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
+ batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
|
|
||||||
+ "neighbor/ifinfo purge: neighbor %pM, iface: %s\n",
|
|
||||||
+ neigh->addr, if_outgoing->net_dev->name);
|
|
||||||
+
|
|
||||||
+ hlist_del_rcu(&neigh_ifinfo->list);
|
|
||||||
+ batadv_neigh_ifinfo_free_ref(neigh_ifinfo);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ spin_unlock_bh(&neigh->ifinfo_lock);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
* batadv_purge_orig_ifinfo - purge obsolete ifinfo entries from originator
|
|
||||||
* @bat_priv: the bat priv with all the soft interface information
|
|
||||||
* @orig_node: orig node which is to be checked
|
|
||||||
@@ -800,6 +841,11 @@ batadv_purge_orig_neighbors(struct batadv_priv *bat_priv,
|
|
||||||
|
|
||||||
hlist_del_rcu(&neigh_node->list);
|
|
||||||
batadv_neigh_node_free_ref(neigh_node);
|
|
||||||
+ } else {
|
|
||||||
+ /* only neccesary if not the whole neighbor is to be deleted,
|
|
||||||
+ * but some interface has been removed.
|
|
||||||
+ */
|
|
||||||
+ batadv_purge_neigh_ifinfo(bat_priv, neigh_node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.0.0.rc2
|
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
From 1c2e700fa93e6de3a2ae3725cf437504683b894a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Date: Sat, 29 Mar 2014 17:27:38 +0100
|
|
||||||
Subject: [PATCH 5/9] batman-adv: fix local TT check for outgoing arp requests
|
|
||||||
in DAT
|
|
||||||
|
|
||||||
Change introduced by d6bd8b36fa1f3d72a6fd5942a6e9bde6ddafcd0d
|
|
||||||
("batman-adv: make DAT drop ARP requests targeting local clients")
|
|
||||||
implements a check that prevents DAT from using the caching
|
|
||||||
mechanism when the client that is supposed to provide a reply
|
|
||||||
to an arp request is local.
|
|
||||||
|
|
||||||
However change brought by 3e26722bc9f248ec4316749fc1957365c0fa5e4b
|
|
||||||
("batman-adv: make the Distributed ARP Table vlan aware")
|
|
||||||
has not converted the above check into its vlan aware version
|
|
||||||
thus making it useless when the local client is behind a vlan.
|
|
||||||
|
|
||||||
Fix the behaviour by properly specifying the vlan when
|
|
||||||
checking for a client being local or not.
|
|
||||||
|
|
||||||
Reported-by: Simon Wunderlich <simon@open-mesh.com>
|
|
||||||
Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
|
||||||
---
|
|
||||||
distributed-arp-table.c | 3 +--
|
|
||||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/distributed-arp-table.c b/distributed-arp-table.c
|
|
||||||
index 5bb37a8..a5d75be 100644
|
|
||||||
--- a/distributed-arp-table.c
|
|
||||||
+++ b/distributed-arp-table.c
|
|
||||||
@@ -940,8 +940,7 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
|
|
||||||
* additional DAT answer may trigger kernel warnings about
|
|
||||||
* a packet coming from the wrong port.
|
|
||||||
*/
|
|
||||||
- if (batadv_is_my_client(bat_priv, dat_entry->mac_addr,
|
|
||||||
- BATADV_NO_FLAGS)) {
|
|
||||||
+ if (batadv_is_my_client(bat_priv, dat_entry->mac_addr, vid)) {
|
|
||||||
ret = true;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.0.0.rc2
|
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
From 31f391475cc08724e96ab060ef4aa6503d11da8e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Date: Mon, 31 Mar 2014 13:48:10 +0200
|
|
||||||
Subject: [PATCH 6/9] batman-adv: change the MAC of each VLAN upon
|
|
||||||
ndo_set_mac_address
|
|
||||||
|
|
||||||
The MAC address of the soft-interface is used to initialise
|
|
||||||
the "non-purge" TT entry of each existing VLAN. Therefore
|
|
||||||
when the user invokes ndo_set_mac_address() all the
|
|
||||||
"non-purge" TT entries have to be updated, not only the one
|
|
||||||
belonging to the non-tagged network.
|
|
||||||
|
|
||||||
Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
|
||||||
---
|
|
||||||
soft-interface.c | 12 +++++++++---
|
|
||||||
1 file changed, 9 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/soft-interface.c b/soft-interface.c
|
|
||||||
index f82c267..d962363 100644
|
|
||||||
--- a/soft-interface.c
|
|
||||||
+++ b/soft-interface.c
|
|
||||||
@@ -105,6 +105,7 @@ static struct net_device_stats *batadv_interface_stats(struct net_device *dev)
|
|
||||||
static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
|
|
||||||
{
|
|
||||||
struct batadv_priv *bat_priv = netdev_priv(dev);
|
|
||||||
+ struct batadv_softif_vlan *vlan;
|
|
||||||
struct sockaddr *addr = p;
|
|
||||||
uint8_t old_addr[ETH_ALEN];
|
|
||||||
|
|
||||||
@@ -115,12 +116,17 @@ static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
|
|
||||||
memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
|
|
||||||
|
|
||||||
/* only modify transtable if it has been initialized before */
|
|
||||||
- if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_ACTIVE) {
|
|
||||||
- batadv_tt_local_remove(bat_priv, old_addr, BATADV_NO_FLAGS,
|
|
||||||
+ if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ rcu_read_lock();
|
|
||||||
+ hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
|
|
||||||
+ batadv_tt_local_remove(bat_priv, old_addr, vlan->vid,
|
|
||||||
"mac address changed", false);
|
|
||||||
- batadv_tt_local_add(dev, addr->sa_data, BATADV_NO_FLAGS,
|
|
||||||
+ batadv_tt_local_add(dev, addr->sa_data, vlan->vid,
|
|
||||||
BATADV_NULL_IFINDEX, BATADV_NO_MARK);
|
|
||||||
}
|
|
||||||
+ rcu_read_unlock();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.0.0.rc2
|
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
From 2ac2c94590d49e69ad8400a9df959533195143ed Mon Sep 17 00:00:00 2001
|
|
||||||
From: Marek Lindner <mareklindner@neomailbox.ch>
|
|
||||||
Date: Thu, 24 Apr 2014 03:44:25 +0800
|
|
||||||
Subject: [PATCH 7/9] batman-adv: fix indirect hard_iface NULL dereference
|
|
||||||
|
|
||||||
If hard_iface is NULL and goto out is made batadv_hardif_free_ref()
|
|
||||||
doesn't check for NULL before dereferencing it to get to refcount.
|
|
||||||
|
|
||||||
Introduced in f13f960797fd1969b3c0470cc97435ddfb6aecb4
|
|
||||||
("batman-adv: add debugfs support to view multiif tables").
|
|
||||||
|
|
||||||
Reported-by: Sven Eckelmann <sven@narfation.org>
|
|
||||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
|
||||||
Acked-by: Antonio Quartulli <antonio@meshcoding.com>
|
|
||||||
---
|
|
||||||
originator.c | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/originator.c b/originator.c
|
|
||||||
index aa2468b..35b42f8 100644
|
|
||||||
--- a/originator.c
|
|
||||||
+++ b/originator.c
|
|
||||||
@@ -1074,7 +1074,8 @@ int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset)
|
|
||||||
bat_priv->bat_algo_ops->bat_orig_print(bat_priv, seq, hard_iface);
|
|
||||||
|
|
||||||
out:
|
|
||||||
- batadv_hardif_free_ref(hard_iface);
|
|
||||||
+ if (hard_iface)
|
|
||||||
+ batadv_hardif_free_ref(hard_iface);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.0.0.rc2
|
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
From 113f264b60bc4f50011a8f736d74f91ff7da11f1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Date: Wed, 23 Apr 2014 14:05:16 +0200
|
|
||||||
Subject: [PATCH 8/9] batman-adv: fix reference counting imbalance while
|
|
||||||
sending fragment
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
In the new fragmentation code the batadv_frag_send_packet()
|
|
||||||
function obtains a reference to the primary_if, but it does
|
|
||||||
not release it upon return.
|
|
||||||
|
|
||||||
This reference imbalance prevents the primary_if (and then
|
|
||||||
the related netdevice) to be properly released on shut down.
|
|
||||||
|
|
||||||
Fix this by releasing the primary_if in batadv_frag_send_packet().
|
|
||||||
|
|
||||||
Introduced by db56e4ecf5c2b179a0101138eacc2ec52b6ef45d
|
|
||||||
("batman-adv: Fragment and send skbs larger than mtu")
|
|
||||||
|
|
||||||
Cc: Martin Hundebøll <martin@hundeboll.net>
|
|
||||||
Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
|
||||||
Acked-by: Martin Hundebøll <martin@hundeboll.net>
|
|
||||||
---
|
|
||||||
fragmentation.c | 11 ++++++++---
|
|
||||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/fragmentation.c b/fragmentation.c
|
|
||||||
index 88df9b1..cc1cfd6 100644
|
|
||||||
--- a/fragmentation.c
|
|
||||||
+++ b/fragmentation.c
|
|
||||||
@@ -418,12 +418,13 @@ bool batadv_frag_send_packet(struct sk_buff *skb,
|
|
||||||
struct batadv_neigh_node *neigh_node)
|
|
||||||
{
|
|
||||||
struct batadv_priv *bat_priv;
|
|
||||||
- struct batadv_hard_iface *primary_if;
|
|
||||||
+ struct batadv_hard_iface *primary_if = NULL;
|
|
||||||
struct batadv_frag_packet frag_header;
|
|
||||||
struct sk_buff *skb_fragment;
|
|
||||||
unsigned mtu = neigh_node->if_incoming->net_dev->mtu;
|
|
||||||
unsigned header_size = sizeof(frag_header);
|
|
||||||
unsigned max_fragment_size, max_packet_size;
|
|
||||||
+ bool ret = false;
|
|
||||||
|
|
||||||
/* To avoid merge and refragmentation at next-hops we never send
|
|
||||||
* fragments larger than BATADV_FRAG_MAX_FRAG_SIZE
|
|
||||||
@@ -483,7 +484,11 @@ bool batadv_frag_send_packet(struct sk_buff *skb,
|
|
||||||
skb->len + ETH_HLEN);
|
|
||||||
batadv_send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
|
|
||||||
|
|
||||||
- return true;
|
|
||||||
+ ret = true;
|
|
||||||
+
|
|
||||||
out_err:
|
|
||||||
- return false;
|
|
||||||
+ if (primary_if)
|
|
||||||
+ batadv_hardif_free_ref(primary_if);
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.0.0.rc2
|
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
From 8dbdee55810adceecf51548d44da893076c99219 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Date: Fri, 2 May 2014 01:35:13 +0200
|
|
||||||
Subject: [PATCH 9/9] batman-adv: increase orig refcount when storing ref in
|
|
||||||
gw_node
|
|
||||||
|
|
||||||
A pointer to the orig_node representing a bat-gateway is
|
|
||||||
stored in the gw_node->orig_node member, but the refcount
|
|
||||||
for such orig_node is never increased.
|
|
||||||
This leads to memory faults when gw_node->orig_node is accessed
|
|
||||||
and the originator has already been freed.
|
|
||||||
|
|
||||||
Fix this by increasing the refcount on gw_node creation
|
|
||||||
and decreasing it on gw_node free.
|
|
||||||
|
|
||||||
Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
|
|
||||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
|
||||||
---
|
|
||||||
gateway_client.c | 11 +++++++++--
|
|
||||||
1 file changed, 9 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gateway_client.c b/gateway_client.c
|
|
||||||
index d7fafc1..d5a40ab 100644
|
|
||||||
--- a/gateway_client.c
|
|
||||||
+++ b/gateway_client.c
|
|
||||||
@@ -42,8 +42,10 @@
|
|
||||||
|
|
||||||
static void batadv_gw_node_free_ref(struct batadv_gw_node *gw_node)
|
|
||||||
{
|
|
||||||
- if (atomic_dec_and_test(&gw_node->refcount))
|
|
||||||
+ if (atomic_dec_and_test(&gw_node->refcount)) {
|
|
||||||
+ batadv_orig_node_free_ref(gw_node->orig_node);
|
|
||||||
kfree_rcu(gw_node, rcu);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct batadv_gw_node *
|
|
||||||
@@ -406,9 +408,14 @@ static void batadv_gw_node_add(struct batadv_priv *bat_priv,
|
|
||||||
if (gateway->bandwidth_down == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
+ if (!atomic_inc_not_zero(&orig_node->refcount))
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
gw_node = kzalloc(sizeof(*gw_node), GFP_ATOMIC);
|
|
||||||
- if (!gw_node)
|
|
||||||
+ if (!gw_node) {
|
|
||||||
+ batadv_orig_node_free_ref(orig_node);
|
|
||||||
return;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
INIT_HLIST_NODE(&gw_node->list);
|
|
||||||
gw_node->orig_node = orig_node;
|
|
||||||
--
|
|
||||||
2.0.0.rc2
|
|
||||||
|
|
Loading…
Reference in a new issue