Merge pull request #316 from ecsv/batadv-2017.2
authorSimon Wunderlich <sw@simonwunderlich.de>
Mon, 7 Aug 2017 16:03:35 +0000 (18:03 +0200)
committerGitHub <noreply@github.com>
Mon, 7 Aug 2017 16:03:35 +0000 (18:03 +0200)
batman-adv 2017.2

alfred/Makefile
batctl/Makefile
batman-adv/Makefile
batman-adv/files/compat-hacks.h
batman-adv/patches/0001-batman-adv-fix-TT-sync-flag-inconsistencies.patch [new file with mode: 0644]

index c8725b7fdf8fa516a4454446b865cdc3f1ad0c83..0af4221228e41c008973eaf9fa930056f61d51bd 100644 (file)
@@ -7,14 +7,11 @@
 
 include $(TOPDIR)/rules.mk
 
-#
-# The latest alfred git hash in PKG_REV can be obtained from https://git.open-mesh.org/alfred.git
-#
 PKG_NAME:=alfred
-PKG_VERSION:=2017.1
-PKG_RELEASE:=1
-PKG_MD5SUM:=74e457ee49a6525ccdb3fa3bef58f685
-PKG_HASH:=f8d3a8058d076f6b7686696f6117de1780a2905d827dfa7faa3c2c0b24c2dfb0
+PKG_VERSION:=2017.2
+PKG_RELEASE:=0
+PKG_MD5SUM:=9e2090e043b940a8765ba17394606896
+PKG_HASH:=3d5256abe298f7ee266f9d2a0c41b0878e81bc5c8413c4f66cf8813e7f7f4a03
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
index 1c7aeec0e438d42d8809c94c470e42b5b0e04f93..433f0dfc7c781412cf2d9ae467684232948af521 100644 (file)
@@ -9,10 +9,10 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=batctl
 
-PKG_VERSION:=2017.1
+PKG_VERSION:=2017.2
 PKG_RELEASE:=0
-PKG_MD5SUM:=e152ad369f57a3c9f9a7de5c430790fe
-PKG_HASH:=f8311c67e448dac38f26f8a573e7c44fde65f1fee69754ccf1a070a5622aabc6
+PKG_MD5SUM:=be82ff074beb2fdb160b54d4e579fbed
+PKG_HASH:=c460d0910d03916e2cb43b60ca427d0101474680cfc096cc2d28a259a94f536c
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
index b744661ca8dbda689dedec6929cba0940e79af61..d51bc65bbdc9d1511d4f0bbc9d3a8a13ebc34201 100644 (file)
@@ -4,16 +4,15 @@
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
 #
-# $Id: Makefile 5624 2006-11-23 00:29:07Z nbd $
 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=batman-adv
 
-PKG_VERSION:=2017.1
-PKG_RELEASE:=0
-PKG_MD5SUM:=f8eb805c0a0241c3bd8ec086a00f2099
-PKG_HASH:=ec1848023308c41710eeefb544580f5853d68b88a627a3f2dabaa3472b988c15
+PKG_VERSION:=2017.2
+PKG_RELEASE:=1
+PKG_MD5SUM:=937b5f1d0188e3522d67ad45ee0a4f5a
+PKG_HASH:=d487974e21cb53d39f139e93a2cf297807df5b7bf63ba6d810bad6d91537394f
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
index 8c8a8899995756ebe7620a16aab6fc1b1bea3c6c..b8bcf72325fa5af9ad5acedb487dff12e21a4847 100644 (file)
 
 #endif /* < KERNEL_VERSION(4, 1, 0) */
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)
+
+/* Linux 3.15 misses the uapi include.... */
+#include <uapi/linux/nl80211.h>
+
+#endif /* < KERNEL_VERSION(3, 16, 0) */
+
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0)
 
 #include <linux/netdevice.h>
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
 
+/* for batadv_v_elp_get_throughput which would have used
+ * STATION_INFO_EXPECTED_THROUGHPUT in Linux 4.0.0
+ */
+#define NL80211_STA_INFO_EXPECTED_THROUGHPUT    28
+
 /* wild hack for batadv_getlink_net only */
 #define get_link_net get_xstats_size || 1 ? fallback_net : (struct net*)netdev->rtnl_link_ops->get_xstats_size
 
@@ -214,6 +226,54 @@ static inline int batadv_nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
 
 #endif /* < KERNEL_VERSION(4, 10, 0) */
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 9)
+
+/* work around missing attribute needs_free_netdev and priv_destructor in
+ * net_device
+ */
+#define ether_setup(dev) \
+       void batadv_softif_free2(struct net_device *dev) \
+       { \
+               batadv_softif_free(dev); \
+               free_netdev(dev); \
+       } \
+       void (*t1)(struct net_device *dev) __attribute__((unused)); \
+       bool t2 __attribute__((unused)); \
+       ether_setup(dev)
+#define needs_free_netdev destructor = batadv_softif_free2; t2
+#define priv_destructor destructor = batadv_softif_free2; t1
+
+#endif /* < KERNEL_VERSION(4, 11, 9) */
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 13, 0)
+
+static inline void *batadv_skb_put(struct sk_buff *skb, unsigned int len)
+{
+       return (void *)skb_put(skb, len);
+}
+#define skb_put batadv_skb_put
+
+static inline void *skb_put_zero(struct sk_buff *skb, unsigned int len)
+{
+       void *tmp = skb_put(skb, len);
+
+       memset(tmp, 0, len);
+
+       return tmp;
+}
+
+static inline void *skb_put_data(struct sk_buff *skb, const void *data,
+                                unsigned int len)
+{
+       void *tmp = skb_put(skb, len);
+
+       memcpy(tmp, data, len);
+
+       return tmp;
+}
+
+#endif /* < KERNEL_VERSION(4, 13, 0) */
+
 /* <DECLARE_EWMA> */
 
 #include <linux/version.h>
diff --git a/batman-adv/patches/0001-batman-adv-fix-TT-sync-flag-inconsistencies.patch b/batman-adv/patches/0001-batman-adv-fix-TT-sync-flag-inconsistencies.patch
new file mode 100644 (file)
index 0000000..c96f9fd
--- /dev/null
@@ -0,0 +1,208 @@
+From: Linus Lüssing <linus.luessing@c0d3.blue>
+Date: Thu, 6 Jul 2017 07:02:25 +0200
+Subject: [PATCH] batman-adv: fix TT sync flag inconsistencies
+
+This patch fixes an issue in the translation table code potentially
+leading to a TT Request + Response storm. The issue may occur for nodes
+involving BLA and an inconsistent configuration of the batman-adv AP
+isolation feature. However, since the new multicast optimizations, a
+single, malformed packet may lead to a mesh-wide, persistent
+Denial-of-Service, too.
+
+The issue occurs because nodes are currently OR-ing the TT sync flags of
+all originators announcing a specific MAC address via the
+translation table. When an intermediate node now receives a TT Request
+and wants to answer this on behave of the destination node then this
+intermediate node now responds with an altered flag field and broken
+CRC. The next OGM of the real destination will lead to a CRC mismatch
+and triggering a TT Request and Response again.
+
+Furthermore, the OR-ing is currently never undone as long as at least
+one originator announcing the according MAC address remains, leading to
+the potential persistency of this issue.
+
+This patch fixes this issue by storing the flags used in the CRC
+calculation on a a per TT orig entry basis to be able to respond with
+the correct, original flags in an intermediate TT Response for one
+thing. And to be able to correctly unset sync flags once all nodes
+announcing a sync flag vanish for another.
+
+Fixes: fa614fd04692 ("batman-adv: fix tt_global_entries flags update")
+Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
+Acked-by: Antonio Quartulli <a@unstable.cc>
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
+
+Origin: other, https://patchwork.open-mesh.org/patch/17072/
+---
+ net/batman-adv/translation-table.c | 60 ++++++++++++++++++++++++++++++++------
+ net/batman-adv/types.h             |  2 ++
+ 2 files changed, 53 insertions(+), 9 deletions(-)
+
+diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
+index e1133bc634b5e8ed9a4639677e577a0d52e7c1d5..8a3ce79b1307b7f260ce2f64e96bdacfb9a322f0 100644
+--- a/net/batman-adv/translation-table.c
++++ b/net/batman-adv/translation-table.c
+@@ -1549,9 +1549,41 @@ batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry,
+       return found;
+ }
++/**
++ * batadv_tt_global_sync_flags - update TT sync flags
++ * @tt_global: the TT global entry to update sync flags in
++ *
++ * Updates the sync flag bits in the tt_global flag attribute with a logical
++ * OR of all sync flags from any of its TT orig entries.
++ */
++static void
++batadv_tt_global_sync_flags(struct batadv_tt_global_entry *tt_global)
++{
++      struct batadv_tt_orig_list_entry *orig_entry;
++      const struct hlist_head *head;
++      u16 flags = BATADV_NO_FLAGS;
++
++      rcu_read_lock();
++      head = &tt_global->orig_list;
++      hlist_for_each_entry_rcu(orig_entry, head, list)
++              flags |= orig_entry->flags;
++      rcu_read_unlock();
++
++      flags |= tt_global->common.flags & (~BATADV_TT_SYNC_MASK);
++      tt_global->common.flags = flags;
++}
++
++/**
++ * batadv_tt_global_orig_entry_add - add or update a TT orig entry
++ * @tt_global: the TT global entry to add an orig entry in
++ * @orig_node: the originator to add an orig entry for
++ * @ttvn: translation table version number of this changeset
++ * @flags: TT sync flags
++ */
+ static void
+ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
+-                              struct batadv_orig_node *orig_node, int ttvn)
++                              struct batadv_orig_node *orig_node, int ttvn,
++                              u8 flags)
+ {
+       struct batadv_tt_orig_list_entry *orig_entry;
+@@ -1561,7 +1593,8 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
+                * was added during a "temporary client detection"
+                */
+               orig_entry->ttvn = ttvn;
+-              goto out;
++              orig_entry->flags = flags;
++              goto sync_flags;
+       }
+       orig_entry = kmem_cache_zalloc(batadv_tt_orig_cache, GFP_ATOMIC);
+@@ -1573,6 +1606,7 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
+       batadv_tt_global_size_inc(orig_node, tt_global->common.vid);
+       orig_entry->orig_node = orig_node;
+       orig_entry->ttvn = ttvn;
++      orig_entry->flags = flags;
+       kref_init(&orig_entry->refcount);
+       spin_lock_bh(&tt_global->list_lock);
+@@ -1582,6 +1616,8 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
+       spin_unlock_bh(&tt_global->list_lock);
+       atomic_inc(&tt_global->orig_list_count);
++sync_flags:
++      batadv_tt_global_sync_flags(tt_global);
+ out:
+       if (orig_entry)
+               batadv_tt_orig_list_entry_put(orig_entry);
+@@ -1703,10 +1739,10 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
+               }
+               /* the change can carry possible "attribute" flags like the
+-               * TT_CLIENT_WIFI, therefore they have to be copied in the
++               * TT_CLIENT_TEMP, therefore they have to be copied in the
+                * client entry
+                */
+-              common->flags |= flags;
++              common->flags |= flags & (~BATADV_TT_SYNC_MASK);
+               /* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
+                * one originator left in the list and we previously received a
+@@ -1723,7 +1759,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
+       }
+ add_orig_entry:
+       /* add the new orig_entry (if needed) or update it */
+-      batadv_tt_global_orig_entry_add(tt_global_entry, orig_node, ttvn);
++      batadv_tt_global_orig_entry_add(tt_global_entry, orig_node, ttvn,
++                                      flags & BATADV_TT_SYNC_MASK);
+       batadv_dbg(BATADV_DBG_TT, bat_priv,
+                  "Creating new global tt entry: %pM (vid: %d, via %pM)\n",
+@@ -1946,6 +1983,7 @@ batadv_tt_global_dump_subentry(struct sk_buff *msg, u32 portid, u32 seq,
+                              struct batadv_tt_orig_list_entry *orig,
+                              bool best)
+ {
++      u16 flags = (common->flags & (~BATADV_TT_SYNC_MASK)) | orig->flags;
+       void *hdr;
+       struct batadv_orig_node_vlan *vlan;
+       u8 last_ttvn;
+@@ -1975,7 +2013,7 @@ batadv_tt_global_dump_subentry(struct sk_buff *msg, u32 portid, u32 seq,
+           nla_put_u8(msg, BATADV_ATTR_TT_LAST_TTVN, last_ttvn) ||
+           nla_put_u32(msg, BATADV_ATTR_TT_CRC32, crc) ||
+           nla_put_u16(msg, BATADV_ATTR_TT_VID, common->vid) ||
+-          nla_put_u32(msg, BATADV_ATTR_TT_FLAGS, common->flags))
++          nla_put_u32(msg, BATADV_ATTR_TT_FLAGS, flags))
+               goto nla_put_failure;
+       if (best && nla_put_flag(msg, BATADV_ATTR_FLAG_BEST))
+@@ -2589,6 +2627,7 @@ static u32 batadv_tt_global_crc(struct batadv_priv *bat_priv,
+                               unsigned short vid)
+ {
+       struct batadv_hashtable *hash = bat_priv->tt.global_hash;
++      struct batadv_tt_orig_list_entry *tt_orig;
+       struct batadv_tt_common_entry *tt_common;
+       struct batadv_tt_global_entry *tt_global;
+       struct hlist_head *head;
+@@ -2627,8 +2666,9 @@ static u32 batadv_tt_global_crc(struct batadv_priv *bat_priv,
+                       /* find out if this global entry is announced by this
+                        * originator
+                        */
+-                      if (!batadv_tt_global_entry_has_orig(tt_global,
+-                                                           orig_node))
++                      tt_orig = batadv_tt_global_orig_entry_find(tt_global,
++                                                                 orig_node);
++                      if (!tt_orig)
+                               continue;
+                       /* use network order to read the VID: this ensures that
+@@ -2640,10 +2680,12 @@ static u32 batadv_tt_global_crc(struct batadv_priv *bat_priv,
+                       /* compute the CRC on flags that have to be kept in sync
+                        * among nodes
+                        */
+-                      flags = tt_common->flags & BATADV_TT_SYNC_MASK;
++                      flags = tt_orig->flags;
+                       crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags));
+                       crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN);
++
++                      batadv_tt_orig_list_entry_put(tt_orig);
+               }
+               rcu_read_unlock();
+       }
+diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
+index ea43a64492479809fe6bdf95b436792078f50e9f..a62795868794103d7e712ba91def5997dc3a5779 100644
+--- a/net/batman-adv/types.h
++++ b/net/batman-adv/types.h
+@@ -1260,6 +1260,7 @@ struct batadv_tt_global_entry {
+  * struct batadv_tt_orig_list_entry - orig node announcing a non-mesh client
+  * @orig_node: pointer to orig node announcing this non-mesh client
+  * @ttvn: translation table version number which added the non-mesh client
++ * @flags: per orig entry TT sync flags
+  * @list: list node for batadv_tt_global_entry::orig_list
+  * @refcount: number of contexts the object is used
+  * @rcu: struct used for freeing in an RCU-safe manner
+@@ -1267,6 +1268,7 @@ struct batadv_tt_global_entry {
+ struct batadv_tt_orig_list_entry {
+       struct batadv_orig_node *orig_node;
+       u8 ttvn;
++      u8 flags;
+       struct hlist_node list;
+       struct kref refcount;
+       struct rcu_head rcu;