diff --git a/batman-adv/Config.in b/batman-adv/Config.in index 1330525..86fc795 100644 --- a/batman-adv/Config.in +++ b/batman-adv/Config.in @@ -14,16 +14,13 @@ config KMOD_BATMAN_ADV_DAT depends on PACKAGE_kmod-batman-adv 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 bool "enable network coding [requires promisc mode support]" depends on PACKAGE_kmod-batman-adv 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. diff --git a/batman-adv/Makefile b/batman-adv/Makefile index 4ab66f1..889dea7 100644 --- a/batman-adv/Makefile +++ b/batman-adv/Makefile @@ -10,17 +10,14 @@ include $(TOPDIR)/rules.mk PKG_NAME:=batman-adv -PKG_VERSION:=2014.1.0 -BATCTL_VERSION:=2014.1.0 -PKG_RELEASE:=3 -PKG_MD5SUM:=d55aabb2bc508194407187648c773c1b -BATCTL_MD5SUM:=92fd4cb60e38ec952fb5fdda4b2e6933 +PKG_VERSION:=2014.2.0 +PKG_RELEASE:=1 +PKG_MD5SUM:=1243029b3a3e2f4fa721d1a59c2faaf5 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz 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_BATCTL_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/batctl-$(BATCTL_VERSION) include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/kernel.mk @@ -29,7 +26,7 @@ define KernelPackage/batman-adv URL:=http://www.open-mesh.org/ MAINTAINER:=Marek Lindner 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 FILES:=$(PKG_BUILD_DIR)/batman-adv.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,batman-adv) @@ -37,9 +34,8 @@ endef define KernelPackage/batman-adv/description B.A.T.M.A.N. advanced is a kernel module which allows to -build layer 2 mesh networks. This package contains the -version $(PKG_VERSION) of the kernel module plus its user space -configuration & managerment tool batctl. +build layer 2 mesh networks. This package builds +version $(PKG_VERSION) of the kernel module. endef 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_BLA=$(if $(CONFIG_KMOD_BATMAN_ADV_BLA),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) \ 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 $(call Build/Prepare/Default) $(SED) '/#define _NET_BATMAN_ADV_MAIN_H_/a\#undef CONFIG_MODULE_STRIPPED' \ $(PKG_BUILD_DIR)/main.h endef - define Build/Compile $(MAKE) -C "$(PKG_BUILD_DIR)" $(MAKE_BATMAN_ADV_ARGS) - $(BATCTL_BUILD) endef 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_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 - $(BATCTL_INSTALL) + $(INSTALL_BIN) ./files/lib/netifd/proto/batadv_vlan.sh $(1)/lib/netifd/proto endef $(eval $(call KernelPackage,batman-adv)) diff --git a/batman-adv/files/etc/config/batman-adv b/batman-adv/files/etc/config/batman-adv index 8865ce9..f38855e 100644 --- a/batman-adv/files/etc/config/batman-adv +++ b/batman-adv/files/etc/config/batman-adv @@ -12,6 +12,7 @@ config 'mesh' 'bat0' option 'vis_mode' option 'bridge_loop_avoidance' option 'distributed_arp_table' + option 'multicast_mode' option 'network_coding' option 'hop_penalty' option 'isolation_mark' diff --git a/batman-adv/files/lib/batman-adv/config.sh b/batman-adv/files/lib/batman-adv/config.sh index c65a4b4..1429a43 100644 --- a/batman-adv/files/lib/batman-adv/config.sh +++ b/batman-adv/files/lib/batman-adv/config.sh @@ -26,6 +26,7 @@ bat_config() config_get gw_sel_class "$mesh" gw_sel_class config_get hop_penalty "$mesh" hop_penalty config_get isolation_mark "$mesh" isolation_mark + config_get multicast_mode "$mesh" multicast_mode config_get network_coding "$mesh" network_coding config_get log_level "$mesh" log_level 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 "$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 "$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 "$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 diff --git a/batman-adv/files/lib/netifd/proto/batadv_vlan.sh b/batman-adv/files/lib/netifd/proto/batadv_vlan.sh new file mode 100644 index 0000000..85002c3 --- /dev/null +++ b/batman-adv/files/lib/netifd/proto/batadv_vlan.sh @@ -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 diff --git a/batman-adv/patches/0001-batman-adv-fix-neigh_ifinfo-imbalance.patch b/batman-adv/patches/0001-batman-adv-fix-neigh_ifinfo-imbalance.patch deleted file mode 100644 index 528845b..0000000 --- a/batman-adv/patches/0001-batman-adv-fix-neigh_ifinfo-imbalance.patch +++ /dev/null @@ -1,35 +0,0 @@ -From a424cd5a2c956ef1f0353d7e5f2b7fbc4af7d2d8 Mon Sep 17 00:00:00 2001 -From: Simon Wunderlich -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 -Signed-off-by: Simon Wunderlich -Signed-off-by: Marek Lindner ---- - 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 - diff --git a/batman-adv/patches/0002-batman-adv-fix-neigh-reference-imbalance.patch b/batman-adv/patches/0002-batman-adv-fix-neigh-reference-imbalance.patch deleted file mode 100644 index 9df9855..0000000 --- a/batman-adv/patches/0002-batman-adv-fix-neigh-reference-imbalance.patch +++ /dev/null @@ -1,47 +0,0 @@ -From cdd09f69871ce8c98b8ae9fa0583f73938768943 Mon Sep 17 00:00:00 2001 -From: Simon Wunderlich -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 -Signed-off-by: Simon Wunderlich -Signed-off-by: Marek Lindner ---- - 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 - diff --git a/batman-adv/patches/0003-batman-adv-always-run-purge_orig_neighbors.patch b/batman-adv/patches/0003-batman-adv-always-run-purge_orig_neighbors.patch deleted file mode 100644 index 78e381b..0000000 --- a/batman-adv/patches/0003-batman-adv-always-run-purge_orig_neighbors.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 72125152cc46e55793329984428032769648904e Mon Sep 17 00:00:00 2001 -From: Simon Wunderlich -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 -Signed-off-by: Marek Lindner ---- - 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 - diff --git a/batman-adv/patches/0004-batman-adv-fix-removing-neigh_ifinfo.patch b/batman-adv/patches/0004-batman-adv-fix-removing-neigh_ifinfo.patch deleted file mode 100644 index 495dae5..0000000 --- a/batman-adv/patches/0004-batman-adv-fix-removing-neigh_ifinfo.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 9b9cdbe28e2b9c8bdf9c761f22ba9655963d13d4 Mon Sep 17 00:00:00 2001 -From: Simon Wunderlich -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 -Signed-off-by: Simon Wunderlich -Signed-off-by: Marek Lindner ---- - 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 - diff --git a/batman-adv/patches/0005-batman-adv-fix-local-TT-check-for-outgoing-arp-reque.patch b/batman-adv/patches/0005-batman-adv-fix-local-TT-check-for-outgoing-arp-reque.patch deleted file mode 100644 index 85ce69a..0000000 --- a/batman-adv/patches/0005-batman-adv-fix-local-TT-check-for-outgoing-arp-reque.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 1c2e700fa93e6de3a2ae3725cf437504683b894a Mon Sep 17 00:00:00 2001 -From: Antonio Quartulli -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 -Signed-off-by: Antonio Quartulli -Signed-off-by: Marek Lindner ---- - 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 - diff --git a/batman-adv/patches/0006-batman-adv-change-the-MAC-of-each-VLAN-upon-ndo_set_.patch b/batman-adv/patches/0006-batman-adv-change-the-MAC-of-each-VLAN-upon-ndo_set_.patch deleted file mode 100644 index 239b5d9..0000000 --- a/batman-adv/patches/0006-batman-adv-change-the-MAC-of-each-VLAN-upon-ndo_set_.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 31f391475cc08724e96ab060ef4aa6503d11da8e Mon Sep 17 00:00:00 2001 -From: Antonio Quartulli -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 -Signed-off-by: Marek Lindner ---- - 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 - diff --git a/batman-adv/patches/0007-batman-adv-fix-indirect-hard_iface-NULL-dereference.patch b/batman-adv/patches/0007-batman-adv-fix-indirect-hard_iface-NULL-dereference.patch deleted file mode 100644 index aa29c5d..0000000 --- a/batman-adv/patches/0007-batman-adv-fix-indirect-hard_iface-NULL-dereference.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 2ac2c94590d49e69ad8400a9df959533195143ed Mon Sep 17 00:00:00 2001 -From: Marek Lindner -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 -Signed-off-by: Marek Lindner -Acked-by: Antonio Quartulli ---- - 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 - diff --git a/batman-adv/patches/0008-batman-adv-fix-reference-counting-imbalance-while-se.patch b/batman-adv/patches/0008-batman-adv-fix-reference-counting-imbalance-while-se.patch deleted file mode 100644 index ab5a4b7..0000000 --- a/batman-adv/patches/0008-batman-adv-fix-reference-counting-imbalance-while-se.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 113f264b60bc4f50011a8f736d74f91ff7da11f1 Mon Sep 17 00:00:00 2001 -From: Antonio Quartulli -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 -Signed-off-by: Antonio Quartulli -Signed-off-by: Marek Lindner -Acked-by: Martin Hundebøll ---- - 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 - diff --git a/batman-adv/patches/0009-batman-adv-increase-orig-refcount-when-storing-ref-i.patch b/batman-adv/patches/0009-batman-adv-increase-orig-refcount-when-storing-ref-i.patch deleted file mode 100644 index d6f3dd6..0000000 --- a/batman-adv/patches/0009-batman-adv-increase-orig-refcount-when-storing-ref-i.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 8dbdee55810adceecf51548d44da893076c99219 Mon Sep 17 00:00:00 2001 -From: Antonio Quartulli -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 -Signed-off-by: Marek Lindner ---- - 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 -