These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / net / batman-adv / translation-table.c
index 07b263a..83b0ca2 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2015 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich, Antonio Quartulli
  *
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "main.h"
 #include "translation-table.h"
-#include "soft-interface.h"
+#include "main.h"
+
+#include <linux/atomic.h>
+#include <linux/bitops.h>
+#include <linux/bug.h>
+#include <linux/byteorder/generic.h>
+#include <linux/compiler.h>
+#include <linux/crc32c.h>
+#include <linux/errno.h>
+#include <linux/etherdevice.h>
+#include <linux/fs.h>
+#include <linux/if_ether.h>
+#include <linux/jhash.h>
+#include <linux/jiffies.h>
+#include <linux/kernel.h>
+#include <linux/list.h>
+#include <linux/lockdep.h>
+#include <linux/netdevice.h>
+#include <linux/rculist.h>
+#include <linux/rcupdate.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/stddef.h>
+#include <linux/string.h>
+#include <linux/workqueue.h>
+#include <net/net_namespace.h>
+
+#include "bridge_loop_avoidance.h"
 #include "hard-interface.h"
-#include "send.h"
 #include "hash.h"
-#include "originator.h"
-#include "routing.h"
-#include "bridge_loop_avoidance.h"
 #include "multicast.h"
-
-#include <linux/crc32c.h>
+#include "originator.h"
+#include "packet.h"
+#include "soft-interface.h"
 
 /* hash class keys */
 static struct lock_class_key batadv_tt_local_hash_lock_class_key;
 static struct lock_class_key batadv_tt_global_hash_lock_class_key;
 
-static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client,
+static void batadv_send_roam_adv(struct batadv_priv *bat_priv, u8 *client,
                                 unsigned short vid,
                                 struct batadv_orig_node *orig_node);
 static void batadv_tt_purge(struct work_struct *work);
@@ -44,13 +68,15 @@ static void batadv_tt_global_del(struct batadv_priv *bat_priv,
                                 unsigned short vid, const char *message,
                                 bool roaming);
 
-/* returns 1 if they are the same mac addr */
+/* returns 1 if they are the same mac addr and vid */
 static int batadv_compare_tt(const struct hlist_node *node, const void *data2)
 {
        const void *data1 = container_of(node, struct batadv_tt_common_entry,
                                         hash_entry);
+       const struct batadv_tt_common_entry *tt1 = data1;
+       const struct batadv_tt_common_entry *tt2 = data2;
 
-       return batadv_compare_eth(data1, data2);
+       return (tt1->vid == tt2->vid) && batadv_compare_eth(data1, data2);
 }
 
 /**
@@ -61,18 +87,14 @@ static int batadv_compare_tt(const struct hlist_node *node, const void *data2)
  * Returns the hash index where the object represented by 'data' should be
  * stored at.
  */
-static inline uint32_t batadv_choose_tt(const void *data, uint32_t size)
+static inline u32 batadv_choose_tt(const void *data, u32 size)
 {
        struct batadv_tt_common_entry *tt;
-       uint32_t hash = 0;
+       u32 hash = 0;
 
        tt = (struct batadv_tt_common_entry *)data;
-       hash = batadv_hash_bytes(hash, &tt->addr, ETH_ALEN);
-       hash = batadv_hash_bytes(hash, &tt->vid, sizeof(tt->vid));
-
-       hash += (hash << 3);
-       hash ^= (hash >> 11);
-       hash += (hash << 15);
+       hash = jhash(&tt->addr, ETH_ALEN, hash);
+       hash = jhash(&tt->vid, sizeof(tt->vid), hash);
 
        return hash % size;
 }
@@ -87,12 +109,12 @@ static inline uint32_t batadv_choose_tt(const void *data, uint32_t size)
  * found, NULL otherwise.
  */
 static struct batadv_tt_common_entry *
-batadv_tt_hash_find(struct batadv_hashtable *hash, const uint8_t *addr,
+batadv_tt_hash_find(struct batadv_hashtable *hash, const u8 *addr,
                    unsigned short vid)
 {
        struct hlist_head *head;
        struct batadv_tt_common_entry to_search, *tt, *tt_tmp = NULL;
-       uint32_t index;
+       u32 index;
 
        if (!hash)
                return NULL;
@@ -132,7 +154,7 @@ batadv_tt_hash_find(struct batadv_hashtable *hash, const uint8_t *addr,
  * found, NULL otherwise.
  */
 static struct batadv_tt_local_entry *
-batadv_tt_local_hash_find(struct batadv_priv *bat_priv, const uint8_t *addr,
+batadv_tt_local_hash_find(struct batadv_priv *bat_priv, const u8 *addr,
                          unsigned short vid)
 {
        struct batadv_tt_common_entry *tt_common_entry;
@@ -157,7 +179,7 @@ batadv_tt_local_hash_find(struct batadv_priv *bat_priv, const uint8_t *addr,
  * is found, NULL otherwise.
  */
 static struct batadv_tt_global_entry *
-batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const uint8_t *addr,
+batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const u8 *addr,
                           unsigned short vid)
 {
        struct batadv_tt_common_entry *tt_common_entry;
@@ -203,7 +225,7 @@ batadv_tt_global_entry_free_ref(struct batadv_tt_global_entry *tt_global_entry)
  * (excluding ourself).
  */
 int batadv_tt_global_hash_count(struct batadv_priv *bat_priv,
-                               const uint8_t *addr, unsigned short vid)
+                               const u8 *addr, unsigned short vid)
 {
        struct batadv_tt_global_entry *tt_global_entry;
        int count;
@@ -218,20 +240,6 @@ int batadv_tt_global_hash_count(struct batadv_priv *bat_priv,
        return count;
 }
 
-static void batadv_tt_orig_list_entry_free_rcu(struct rcu_head *rcu)
-{
-       struct batadv_tt_orig_list_entry *orig_entry;
-
-       orig_entry = container_of(rcu, struct batadv_tt_orig_list_entry, rcu);
-
-       /* We are in an rcu callback here, therefore we cannot use
-        * batadv_orig_node_free_ref() and its call_rcu():
-        * An rcu_barrier() wouldn't wait for that to finish
-        */
-       batadv_orig_node_free_ref_now(orig_entry->orig_node);
-       kfree(orig_entry);
-}
-
 /**
  * batadv_tt_local_size_mod - change the size by v of the local table identified
  *  by vid
@@ -295,7 +303,7 @@ static void batadv_tt_global_size_mod(struct batadv_orig_node *orig_node,
 
        if (atomic_add_return(v, &vlan->tt.num_entries) == 0) {
                spin_lock_bh(&orig_node->vlan_list_lock);
-               list_del_rcu(&vlan->list);
+               hlist_del_init_rcu(&vlan->list);
                spin_unlock_bh(&orig_node->vlan_list_lock);
                batadv_orig_node_vlan_free_ref(vlan);
        }
@@ -327,13 +335,25 @@ static void batadv_tt_global_size_dec(struct batadv_orig_node *orig_node,
        batadv_tt_global_size_mod(orig_node, vid, -1);
 }
 
+/**
+ * batadv_tt_orig_list_entry_release - release tt orig entry from lists and
+ *  queue for free after rcu grace period
+ * @orig_entry: tt orig entry to be free'd
+ */
+static void
+batadv_tt_orig_list_entry_release(struct batadv_tt_orig_list_entry *orig_entry)
+{
+       batadv_orig_node_free_ref(orig_entry->orig_node);
+       kfree_rcu(orig_entry, rcu);
+}
+
 static void
 batadv_tt_orig_list_entry_free_ref(struct batadv_tt_orig_list_entry *orig_entry)
 {
        if (!atomic_dec_and_test(&orig_entry->refcount))
                return;
 
-       call_rcu(&orig_entry->rcu, batadv_tt_orig_list_entry_free_rcu);
+       batadv_tt_orig_list_entry_release(orig_entry);
 }
 
 /**
@@ -344,11 +364,11 @@ batadv_tt_orig_list_entry_free_ref(struct batadv_tt_orig_list_entry *orig_entry)
  */
 static void batadv_tt_local_event(struct batadv_priv *bat_priv,
                                  struct batadv_tt_local_entry *tt_local_entry,
-                                 uint8_t event_flags)
+                                 u8 event_flags)
 {
        struct batadv_tt_change_node *tt_change_node, *entry, *safe;
        struct batadv_tt_common_entry *common = &tt_local_entry->common;
-       uint8_t flags = common->flags | event_flags;
+       u8 flags = common->flags | event_flags;
        bool event_removed = false;
        bool del_op_requested, del_op_entry;
 
@@ -428,7 +448,7 @@ static int batadv_tt_len(int changes_num)
  *
  * Returns the number of entries.
  */
-static uint16_t batadv_tt_entries(uint16_t tt_len)
+static u16 batadv_tt_entries(u16 tt_len)
 {
        return tt_len / batadv_tt_len(1);
 }
@@ -442,7 +462,8 @@ static uint16_t batadv_tt_entries(uint16_t tt_len)
  */
 static int batadv_tt_local_table_transmit_size(struct batadv_priv *bat_priv)
 {
-       uint16_t num_vlan = 0, tt_local_entries = 0;
+       u16 num_vlan = 0;
+       u16 tt_local_entries = 0;
        struct batadv_softif_vlan *vlan;
        int hdr_size;
 
@@ -505,8 +526,8 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv,
  *
  * Returns true if the client was successfully added, false otherwise.
  */
-bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
-                        unsigned short vid, int ifindex, uint32_t mark)
+bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr,
+                        unsigned short vid, int ifindex, u32 mark)
 {
        struct batadv_priv *bat_priv = netdev_priv(soft_iface);
        struct batadv_tt_local_entry *tt_local;
@@ -516,9 +537,10 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
        struct hlist_head *head;
        struct batadv_tt_orig_list_entry *orig_entry;
        int hash_added, table_size, packet_size_max;
-       bool ret = false, roamed_back = false;
-       uint8_t remote_flags;
-       uint32_t match_mark;
+       bool ret = false;
+       bool roamed_back = false;
+       u8 remote_flags;
+       u32 match_mark;
 
        if (ifindex != BATADV_NULL_IFINDEX)
                in_dev = dev_get_by_index(&init_net, ifindex);
@@ -575,11 +597,17 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
 
        /* increase the refcounter of the related vlan */
        vlan = batadv_softif_vlan_get(bat_priv, vid);
+       if (WARN(!vlan, "adding TT local entry %pM to non-existent VLAN %d",
+                addr, BATADV_PRINT_VID(vid))) {
+               kfree(tt_local);
+               tt_local = NULL;
+               goto out;
+       }
 
        batadv_dbg(BATADV_DBG_TT, bat_priv,
                   "Creating new local tt entry: %pM (vid: %d, ttvn: %d)\n",
                   addr, BATADV_PRINT_VID(vid),
-                  (uint8_t)atomic_read(&bat_priv->tt.vn));
+                  (u8)atomic_read(&bat_priv->tt.vn));
 
        ether_addr_copy(tt_local->common.addr, addr);
        /* The local entry has to be marked as NEW to avoid to send it in
@@ -698,19 +726,22 @@ out:
  *
  * Return the size of the allocated buffer or 0 in case of failure.
  */
-static uint16_t
+static u16
 batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
                                   struct batadv_tvlv_tt_data **tt_data,
                                   struct batadv_tvlv_tt_change **tt_change,
-                                  int32_t *tt_len)
+                                  s32 *tt_len)
 {
-       uint16_t num_vlan = 0, num_entries = 0, change_offset, tvlv_len;
+       u16 num_vlan = 0;
+       u16 num_entries = 0;
+       u16 change_offset;
+       u16 tvlv_len;
        struct batadv_tvlv_tt_vlan_data *tt_vlan;
        struct batadv_orig_node_vlan *vlan;
-       uint8_t *tt_change_ptr;
+       u8 *tt_change_ptr;
 
        rcu_read_lock();
-       list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
+       hlist_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
                num_vlan++;
                num_entries += atomic_read(&vlan->tt.num_entries);
        }
@@ -736,14 +767,14 @@ batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
        (*tt_data)->num_vlan = htons(num_vlan);
 
        tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(*tt_data + 1);
-       list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
+       hlist_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
                tt_vlan->vid = htons(vlan->vid);
                tt_vlan->crc = htonl(vlan->tt.crc);
 
                tt_vlan++;
        }
 
-       tt_change_ptr = (uint8_t *)*tt_data + change_offset;
+       tt_change_ptr = (u8 *)*tt_data + change_offset;
        *tt_change = (struct batadv_tvlv_tt_change *)tt_change_ptr;
 
 out:
@@ -769,16 +800,18 @@ out:
  *
  * Return the size of the allocated buffer or 0 in case of failure.
  */
-static uint16_t
+static u16
 batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
                                  struct batadv_tvlv_tt_data **tt_data,
                                  struct batadv_tvlv_tt_change **tt_change,
-                                 int32_t *tt_len)
+                                 s32 *tt_len)
 {
        struct batadv_tvlv_tt_vlan_data *tt_vlan;
        struct batadv_softif_vlan *vlan;
-       uint16_t num_vlan = 0, num_entries = 0, tvlv_len;
-       uint8_t *tt_change_ptr;
+       u16 num_vlan = 0;
+       u16 num_entries = 0;
+       u16 tvlv_len;
+       u8 *tt_change_ptr;
        int change_offset;
 
        rcu_read_lock();
@@ -815,7 +848,7 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
                tt_vlan++;
        }
 
-       tt_change_ptr = (uint8_t *)*tt_data + change_offset;
+       tt_change_ptr = (u8 *)*tt_data + change_offset;
        *tt_change = (struct batadv_tvlv_tt_change *)tt_change_ptr;
 
 out:
@@ -834,8 +867,9 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
        struct batadv_tvlv_tt_data *tt_data;
        struct batadv_tvlv_tt_change *tt_change;
        int tt_diff_len, tt_change_len = 0;
-       int tt_diff_entries_num = 0, tt_diff_entries_count = 0;
-       uint16_t tvlv_len;
+       int tt_diff_entries_num = 0;
+       int tt_diff_entries_count = 0;
+       u16 tvlv_len;
 
        tt_diff_entries_num = atomic_read(&bat_priv->tt.local_changes);
        tt_diff_len = batadv_tt_len(tt_diff_entries_num);
@@ -909,12 +943,12 @@ int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
        struct batadv_softif_vlan *vlan;
        struct hlist_head *head;
        unsigned short vid;
-       uint32_t i;
+       u32 i;
        int last_seen_secs;
        int last_seen_msecs;
        unsigned long last_seen_jiffies;
        bool no_purge;
-       uint16_t np_flag = BATADV_TT_CLIENT_NOPURGE;
+       u16 np_flag = BATADV_TT_CLIENT_NOPURGE;
 
        primary_if = batadv_seq_print_text_primary_if_get(seq);
        if (!primary_if)
@@ -922,7 +956,7 @@ int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
 
        seq_printf(seq,
                   "Locally retrieved addresses (from %s) announced via TT (TTVN: %u):\n",
-                  net_dev->name, (uint8_t)atomic_read(&bat_priv->tt.vn));
+                  net_dev->name, (u8)atomic_read(&bat_priv->tt.vn));
        seq_printf(seq, "       %-13s  %s %-8s %-9s (%-10s)\n", "Client", "VID",
                   "Flags", "Last seen", "CRC");
 
@@ -954,17 +988,17 @@ int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
                                   " * %pM %4i [%c%c%c%c%c%c] %3u.%03u   (%#.8x)\n",
                                   tt_common_entry->addr,
                                   BATADV_PRINT_VID(tt_common_entry->vid),
-                                  (tt_common_entry->flags &
-                                   BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
+                                  ((tt_common_entry->flags &
+                                    BATADV_TT_CLIENT_ROAM) ? 'R' : '.'),
                                   no_purge ? 'P' : '.',
-                                  (tt_common_entry->flags &
-                                   BATADV_TT_CLIENT_NEW ? 'N' : '.'),
-                                  (tt_common_entry->flags &
-                                   BATADV_TT_CLIENT_PENDING ? 'X' : '.'),
-                                  (tt_common_entry->flags &
-                                   BATADV_TT_CLIENT_WIFI ? 'W' : '.'),
-                                  (tt_common_entry->flags &
-                                   BATADV_TT_CLIENT_ISOLA ? 'I' : '.'),
+                                  ((tt_common_entry->flags &
+                                    BATADV_TT_CLIENT_NEW) ? 'N' : '.'),
+                                  ((tt_common_entry->flags &
+                                    BATADV_TT_CLIENT_PENDING) ? 'X' : '.'),
+                                  ((tt_common_entry->flags &
+                                    BATADV_TT_CLIENT_WIFI) ? 'W' : '.'),
+                                  ((tt_common_entry->flags &
+                                    BATADV_TT_CLIENT_ISOLA) ? 'I' : '.'),
                                   no_purge ? 0 : last_seen_secs,
                                   no_purge ? 0 : last_seen_msecs,
                                   vlan->tt.crc);
@@ -982,7 +1016,7 @@ out:
 static void
 batadv_tt_local_set_pending(struct batadv_priv *bat_priv,
                            struct batadv_tt_local_entry *tt_local_entry,
-                           uint16_t flags, const char *message)
+                           u16 flags, const char *message)
 {
        batadv_tt_local_event(bat_priv, tt_local_entry, flags);
 
@@ -1008,13 +1042,14 @@ batadv_tt_local_set_pending(struct batadv_priv *bat_priv,
  *
  * Returns the flags assigned to the local entry before being deleted
  */
-uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv,
-                               const uint8_t *addr, unsigned short vid,
-                               const char *message, bool roaming)
+u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr,
+                          unsigned short vid, const char *message,
+                          bool roaming)
 {
        struct batadv_tt_local_entry *tt_local_entry;
-       uint16_t flags, curr_flags = BATADV_NO_FLAGS;
+       u16 flags, curr_flags = BATADV_NO_FLAGS;
        struct batadv_softif_vlan *vlan;
+       void *tt_entry_exists;
 
        tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid);
        if (!tt_local_entry)
@@ -1042,11 +1077,22 @@ uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv,
         * immediately purge it
         */
        batadv_tt_local_event(bat_priv, tt_local_entry, BATADV_TT_CLIENT_DEL);
-       hlist_del_rcu(&tt_local_entry->common.hash_entry);
+
+       tt_entry_exists = batadv_hash_remove(bat_priv->tt.local_hash,
+                                            batadv_compare_tt,
+                                            batadv_choose_tt,
+                                            &tt_local_entry->common);
+       if (!tt_entry_exists)
+               goto out;
+
+       /* extra call to free the local tt entry */
        batadv_tt_local_entry_free_ref(tt_local_entry);
 
        /* decrease the reference held for this vlan */
        vlan = batadv_softif_vlan_get(bat_priv, vid);
+       if (!vlan)
+               goto out;
+
        batadv_softif_vlan_free_ref(vlan);
        batadv_softif_vlan_free_ref(vlan);
 
@@ -1104,7 +1150,7 @@ static void batadv_tt_local_purge(struct batadv_priv *bat_priv,
        struct batadv_hashtable *hash = bat_priv->tt.local_hash;
        struct hlist_head *head;
        spinlock_t *list_lock; /* protects write access to the hash lists */
-       uint32_t i;
+       u32 i;
 
        for (i = 0; i < hash->size; i++) {
                head = &hash->table[i];
@@ -1125,7 +1171,7 @@ static void batadv_tt_local_table_free(struct batadv_priv *bat_priv)
        struct batadv_softif_vlan *vlan;
        struct hlist_node *node_tmp;
        struct hlist_head *head;
-       uint32_t i;
+       u32 i;
 
        if (!bat_priv->tt.local_hash)
                return;
@@ -1147,8 +1193,10 @@ static void batadv_tt_local_table_free(struct batadv_priv *bat_priv)
                        /* decrease the reference held for this vlan */
                        vlan = batadv_softif_vlan_get(bat_priv,
                                                      tt_common_entry->vid);
-                       batadv_softif_vlan_free_ref(vlan);
-                       batadv_softif_vlan_free_ref(vlan);
+                       if (vlan) {
+                               batadv_softif_vlan_free_ref(vlan);
+                               batadv_softif_vlan_free_ref(vlan);
+                       }
 
                        batadv_tt_local_entry_free_ref(tt_local);
                }
@@ -1298,15 +1346,14 @@ out:
 static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
                                 struct batadv_orig_node *orig_node,
                                 const unsigned char *tt_addr,
-                                unsigned short vid, uint16_t flags,
-                                uint8_t ttvn)
+                                unsigned short vid, u16 flags, u8 ttvn)
 {
        struct batadv_tt_global_entry *tt_global_entry;
        struct batadv_tt_local_entry *tt_local_entry;
        bool ret = false;
        int hash_added;
        struct batadv_tt_common_entry *common;
-       uint16_t local_flags;
+       u16 local_flags;
 
        /* ignore global entries from backbone nodes */
        if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig, vid))
@@ -1380,9 +1427,15 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
                }
 
                /* if the client was temporary added before receiving the first
-                * OGM announcing it, we have to clear the TEMP flag
+                * OGM announcing it, we have to clear the TEMP flag. Also,
+                * remove the previous temporary orig node and re-add it
+                * if required. If the orig entry changed, the new one which
+                * is a non-temporary entry is preferred.
                 */
-               common->flags &= ~BATADV_TT_CLIENT_TEMP;
+               if (common->flags & BATADV_TT_CLIENT_TEMP) {
+                       batadv_tt_global_del_orig_list(tt_global_entry);
+                       common->flags &= ~BATADV_TT_CLIENT_TEMP;
+               }
 
                /* the change can carry possible "attribute" flags like the
                 * TT_CLIENT_WIFI, therefore they have to be copied in the
@@ -1503,8 +1556,8 @@ batadv_tt_global_print_entry(struct batadv_priv *bat_priv,
        struct batadv_tt_common_entry *tt_common_entry;
        struct batadv_orig_node_vlan *vlan;
        struct hlist_head *head;
-       uint8_t last_ttvn;
-       uint16_t flags;
+       u8 last_ttvn;
+       u16 flags;
 
        tt_common_entry = &tt_global_entry->common;
        flags = tt_common_entry->flags;
@@ -1528,10 +1581,10 @@ batadv_tt_global_print_entry(struct batadv_priv *bat_priv,
                           BATADV_PRINT_VID(tt_global_entry->common.vid),
                           best_entry->ttvn, best_entry->orig_node->orig,
                           last_ttvn, vlan->tt.crc,
-                          (flags & BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
-                          (flags & BATADV_TT_CLIENT_WIFI ? 'W' : '.'),
-                          (flags & BATADV_TT_CLIENT_ISOLA ? 'I' : '.'),
-                          (flags & BATADV_TT_CLIENT_TEMP ? 'T' : '.'));
+                          ((flags & BATADV_TT_CLIENT_ROAM) ? 'R' : '.'),
+                          ((flags & BATADV_TT_CLIENT_WIFI) ? 'W' : '.'),
+                          ((flags & BATADV_TT_CLIENT_ISOLA) ? 'I' : '.'),
+                          ((flags & BATADV_TT_CLIENT_TEMP) ? 'T' : '.'));
 
                batadv_orig_node_vlan_free_ref(vlan);
        }
@@ -1560,10 +1613,10 @@ print_list:
                           BATADV_PRINT_VID(tt_global_entry->common.vid),
                           orig_entry->ttvn, orig_entry->orig_node->orig,
                           last_ttvn, vlan->tt.crc,
-                          (flags & BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
-                          (flags & BATADV_TT_CLIENT_WIFI ? 'W' : '.'),
-                          (flags & BATADV_TT_CLIENT_ISOLA ? 'I' : '.'),
-                          (flags & BATADV_TT_CLIENT_TEMP ? 'T' : '.'));
+                          ((flags & BATADV_TT_CLIENT_ROAM) ? 'R' : '.'),
+                          ((flags & BATADV_TT_CLIENT_WIFI) ? 'W' : '.'),
+                          ((flags & BATADV_TT_CLIENT_ISOLA) ? 'I' : '.'),
+                          ((flags & BATADV_TT_CLIENT_TEMP) ? 'T' : '.'));
 
                batadv_orig_node_vlan_free_ref(vlan);
        }
@@ -1578,7 +1631,7 @@ int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset)
        struct batadv_tt_global_entry *tt_global;
        struct batadv_hard_iface *primary_if;
        struct hlist_head *head;
-       uint32_t i;
+       u32 i;
 
        primary_if = batadv_seq_print_text_primary_if_get(seq);
        if (!primary_if)
@@ -1611,20 +1664,28 @@ out:
 }
 
 /**
- * batadv_tt_global_del_orig_entry - remove and free an orig_entry
+ * _batadv_tt_global_del_orig_entry - remove and free an orig_entry
  * @tt_global_entry: the global entry to remove the orig_entry from
  * @orig_entry: the orig entry to remove and free
  *
  * Remove an orig_entry from its list in the given tt_global_entry and
  * free this orig_entry afterwards.
+ *
+ * Caller must hold tt_global_entry->list_lock and ensure orig_entry->list is
+ * part of a list.
  */
 static void
-batadv_tt_global_del_orig_entry(struct batadv_tt_global_entry *tt_global_entry,
-                               struct batadv_tt_orig_list_entry *orig_entry)
+_batadv_tt_global_del_orig_entry(struct batadv_tt_global_entry *tt_global_entry,
+                                struct batadv_tt_orig_list_entry *orig_entry)
 {
+       lockdep_assert_held(&tt_global_entry->list_lock);
+
        batadv_tt_global_size_dec(orig_entry->orig_node,
                                  tt_global_entry->common.vid);
        atomic_dec(&tt_global_entry->orig_list_count);
+       /* requires holding tt_global_entry->list_lock and orig_entry->list
+        * being part of a list
+        */
        hlist_del_rcu(&orig_entry->list);
        batadv_tt_orig_list_entry_free_ref(orig_entry);
 }
@@ -1640,7 +1701,7 @@ batadv_tt_global_del_orig_list(struct batadv_tt_global_entry *tt_global_entry)
        spin_lock_bh(&tt_global_entry->list_lock);
        head = &tt_global_entry->orig_list;
        hlist_for_each_entry_safe(orig_entry, safe, head, list)
-               batadv_tt_global_del_orig_entry(tt_global_entry, orig_entry);
+               _batadv_tt_global_del_orig_entry(tt_global_entry, orig_entry);
        spin_unlock_bh(&tt_global_entry->list_lock);
 }
 
@@ -1675,8 +1736,8 @@ batadv_tt_global_del_orig_node(struct batadv_priv *bat_priv,
                                   orig_node->orig,
                                   tt_global_entry->common.addr,
                                   BATADV_PRINT_VID(vid), message);
-                       batadv_tt_global_del_orig_entry(tt_global_entry,
-                                                       orig_entry);
+                       _batadv_tt_global_del_orig_entry(tt_global_entry,
+                                                        orig_entry);
                }
        }
        spin_unlock_bh(&tt_global_entry->list_lock);
@@ -1798,12 +1859,12 @@ out:
  */
 void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
                               struct batadv_orig_node *orig_node,
-                              int32_t match_vid,
+                              s32 match_vid,
                               const char *message)
 {
        struct batadv_tt_global_entry *tt_global;
        struct batadv_tt_common_entry *tt_common_entry;
-       uint32_t i;
+       u32 i;
        struct batadv_hashtable *hash = bat_priv->tt.global_hash;
        struct hlist_node *safe;
        struct hlist_head *head;
@@ -1843,7 +1904,7 @@ void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
                }
                spin_unlock_bh(list_lock);
        }
-       orig_node->capa_initialized &= ~BATADV_ORIG_CAPA_HAS_TT;
+       clear_bit(BATADV_ORIG_CAPA_HAS_TT, &orig_node->capa_initialized);
 }
 
 static bool batadv_tt_global_to_purge(struct batadv_tt_global_entry *tt_global,
@@ -1874,7 +1935,7 @@ static void batadv_tt_global_purge(struct batadv_priv *bat_priv)
        struct hlist_head *head;
        struct hlist_node *node_tmp;
        spinlock_t *list_lock; /* protects write access to the hash lists */
-       uint32_t i;
+       u32 i;
        char *msg = NULL;
        struct batadv_tt_common_entry *tt_common;
        struct batadv_tt_global_entry *tt_global;
@@ -1915,7 +1976,7 @@ static void batadv_tt_global_table_free(struct batadv_priv *bat_priv)
        struct batadv_tt_global_entry *tt_global;
        struct hlist_node *node_tmp;
        struct hlist_head *head;
-       uint32_t i;
+       u32 i;
 
        if (!bat_priv->tt.global_hash)
                return;
@@ -1976,8 +2037,8 @@ _batadv_is_ap_isolated(struct batadv_tt_local_entry *tt_local_entry,
  * If the two clients are AP isolated the function returns NULL.
  */
 struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv,
-                                                 const uint8_t *src,
-                                                 const uint8_t *addr,
+                                                 const u8 *src,
+                                                 const u8 *addr,
                                                  unsigned short vid)
 {
        struct batadv_tt_local_entry *tt_local_entry = NULL;
@@ -2045,16 +2106,16 @@ out:
  *
  * Returns the checksum of the global table of a given originator.
  */
-static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv,
-                                    struct batadv_orig_node *orig_node,
-                                    unsigned short vid)
+static u32 batadv_tt_global_crc(struct batadv_priv *bat_priv,
+                               struct batadv_orig_node *orig_node,
+                               unsigned short vid)
 {
        struct batadv_hashtable *hash = bat_priv->tt.global_hash;
        struct batadv_tt_common_entry *tt_common;
        struct batadv_tt_global_entry *tt_global;
        struct hlist_head *head;
-       uint32_t i, crc_tmp, crc = 0;
-       uint8_t flags;
+       u32 i, crc_tmp, crc = 0;
+       u8 flags;
        __be16 tmp_vid;
 
        for (i = 0; i < hash->size; i++) {
@@ -2122,14 +2183,14 @@ static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv,
  *
  * Returns the checksum of the local table
  */
-static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv,
-                                   unsigned short vid)
+static u32 batadv_tt_local_crc(struct batadv_priv *bat_priv,
+                              unsigned short vid)
 {
        struct batadv_hashtable *hash = bat_priv->tt.local_hash;
        struct batadv_tt_common_entry *tt_common;
        struct hlist_head *head;
-       uint32_t i, crc_tmp, crc = 0;
-       uint8_t flags;
+       u32 i, crc_tmp, crc = 0;
+       u8 flags;
        __be16 tmp_vid;
 
        for (i = 0; i < hash->size; i++) {
@@ -2171,12 +2232,13 @@ static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv,
 
 static void batadv_tt_req_list_free(struct batadv_priv *bat_priv)
 {
-       struct batadv_tt_req_node *node, *safe;
+       struct batadv_tt_req_node *node;
+       struct hlist_node *safe;
 
        spin_lock_bh(&bat_priv->tt.req_list_lock);
 
-       list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
-               list_del(&node->list);
+       hlist_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
+               hlist_del_init(&node->list);
                kfree(node);
        }
 
@@ -2186,7 +2248,7 @@ static void batadv_tt_req_list_free(struct batadv_priv *bat_priv)
 static void batadv_tt_save_orig_buffer(struct batadv_priv *bat_priv,
                                       struct batadv_orig_node *orig_node,
                                       const void *tt_buff,
-                                      uint16_t tt_buff_len)
+                                      u16 tt_buff_len)
 {
        /* Replace the old buffer only if I received something in the
         * last OGM (the OGM could carry no changes)
@@ -2206,30 +2268,36 @@ static void batadv_tt_save_orig_buffer(struct batadv_priv *bat_priv,
 
 static void batadv_tt_req_purge(struct batadv_priv *bat_priv)
 {
-       struct batadv_tt_req_node *node, *safe;
+       struct batadv_tt_req_node *node;
+       struct hlist_node *safe;
 
        spin_lock_bh(&bat_priv->tt.req_list_lock);
-       list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
+       hlist_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
                if (batadv_has_timed_out(node->issued_at,
                                         BATADV_TT_REQUEST_TIMEOUT)) {
-                       list_del(&node->list);
+                       hlist_del_init(&node->list);
                        kfree(node);
                }
        }
        spin_unlock_bh(&bat_priv->tt.req_list_lock);
 }
 
-/* returns the pointer to the new tt_req_node struct if no request
- * has already been issued for this orig_node, NULL otherwise
+/**
+ * batadv_tt_req_node_new - search and possibly create a tt_req_node object
+ * @bat_priv: the bat priv with all the soft interface information
+ * @orig_node: orig node this request is being issued for
+ *
+ * Returns the pointer to the new tt_req_node struct if no request
+ * has already been issued for this orig_node, NULL otherwise.
  */
 static struct batadv_tt_req_node *
-batadv_new_tt_req_node(struct batadv_priv *bat_priv,
+batadv_tt_req_node_new(struct batadv_priv *bat_priv,
                       struct batadv_orig_node *orig_node)
 {
        struct batadv_tt_req_node *tt_req_node_tmp, *tt_req_node = NULL;
 
        spin_lock_bh(&bat_priv->tt.req_list_lock);
-       list_for_each_entry(tt_req_node_tmp, &bat_priv->tt.req_list, list) {
+       hlist_for_each_entry(tt_req_node_tmp, &bat_priv->tt.req_list, list) {
                if (batadv_compare_eth(tt_req_node_tmp, orig_node) &&
                    !batadv_has_timed_out(tt_req_node_tmp->issued_at,
                                          BATADV_TT_REQUEST_TIMEOUT))
@@ -2243,7 +2311,7 @@ batadv_new_tt_req_node(struct batadv_priv *bat_priv,
        ether_addr_copy(tt_req_node->addr, orig_node->orig);
        tt_req_node->issued_at = jiffies;
 
-       list_add(&tt_req_node->list, &bat_priv->tt.req_list);
+       hlist_add_head(&tt_req_node->list, &bat_priv->tt.req_list);
 unlock:
        spin_unlock_bh(&bat_priv->tt.req_list_lock);
        return tt_req_node;
@@ -2295,15 +2363,15 @@ static int batadv_tt_global_valid(const void *entry_ptr,
  */
 static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
                                    struct batadv_hashtable *hash,
-                                   void *tvlv_buff, uint16_t tt_len,
+                                   void *tvlv_buff, u16 tt_len,
                                    int (*valid_cb)(const void *, const void *),
                                    void *cb_data)
 {
        struct batadv_tt_common_entry *tt_common_entry;
        struct batadv_tvlv_tt_change *tt_change;
        struct hlist_head *head;
-       uint16_t tt_tot, tt_num_entries = 0;
-       uint32_t i;
+       u16 tt_tot, tt_num_entries = 0;
+       u32 i;
 
        tt_tot = batadv_tt_entries(tt_len);
        tt_change = (struct batadv_tvlv_tt_change *)tvlv_buff;
@@ -2345,11 +2413,11 @@ static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
  */
 static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node,
                                       struct batadv_tvlv_tt_vlan_data *tt_vlan,
-                                      uint16_t num_vlan)
+                                      u16 num_vlan)
 {
        struct batadv_tvlv_tt_vlan_data *tt_vlan_tmp;
        struct batadv_orig_node_vlan *vlan;
-       uint32_t crc;
+       u32 crc;
        int i;
 
        /* check if each received CRC matches the locally stored one */
@@ -2404,11 +2472,11 @@ static void batadv_tt_global_update_crc(struct batadv_priv *bat_priv,
                                        struct batadv_orig_node *orig_node)
 {
        struct batadv_orig_node_vlan *vlan;
-       uint32_t crc;
+       u32 crc;
 
        /* recompute the global CRC for each VLAN */
        rcu_read_lock();
-       list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
+       hlist_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
                /* if orig_node is a backbone node for this VLAN, don't compute
                 * the CRC as we ignore all the global entries over it
                 */
@@ -2434,9 +2502,9 @@ static void batadv_tt_global_update_crc(struct batadv_priv *bat_priv,
  */
 static int batadv_send_tt_request(struct batadv_priv *bat_priv,
                                  struct batadv_orig_node *dst_orig_node,
-                                 uint8_t ttvn,
+                                 u8 ttvn,
                                  struct batadv_tvlv_tt_vlan_data *tt_vlan,
-                                 uint16_t num_vlan, bool full_table)
+                                 u16 num_vlan, bool full_table)
 {
        struct batadv_tvlv_tt_data *tvlv_tt_data = NULL;
        struct batadv_tt_req_node *tt_req_node = NULL;
@@ -2452,7 +2520,7 @@ static int batadv_send_tt_request(struct batadv_priv *bat_priv,
        /* The new tt_req will be issued only if I'm not waiting for a
         * reply from the same orig_node yet
         */
-       tt_req_node = batadv_new_tt_req_node(bat_priv, dst_orig_node);
+       tt_req_node = batadv_tt_req_node_new(bat_priv, dst_orig_node);
        if (!tt_req_node)
                goto out;
 
@@ -2494,7 +2562,8 @@ out:
                batadv_hardif_free_ref(primary_if);
        if (ret && tt_req_node) {
                spin_lock_bh(&bat_priv->tt.req_list_lock);
-               list_del(&tt_req_node->list);
+               /* hlist_del_init() verifies tt_req_node still is in the list */
+               hlist_del_init(&tt_req_node->list);
                spin_unlock_bh(&bat_priv->tt.req_list_lock);
                kfree(tt_req_node);
        }
@@ -2514,7 +2583,7 @@ out:
  */
 static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv,
                                          struct batadv_tvlv_tt_data *tt_data,
-                                         uint8_t *req_src, uint8_t *req_dst)
+                                         u8 *req_src, u8 *req_dst)
 {
        struct batadv_orig_node *req_dst_orig_node;
        struct batadv_orig_node *res_dst_orig_node = NULL;
@@ -2522,14 +2591,14 @@ static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv,
        struct batadv_tvlv_tt_data *tvlv_tt_data = NULL;
        struct batadv_tvlv_tt_vlan_data *tt_vlan;
        bool ret = false, full_table;
-       uint8_t orig_ttvn, req_ttvn;
-       uint16_t tvlv_len;
-       int32_t tt_len;
+       u8 orig_ttvn, req_ttvn;
+       u16 tvlv_len;
+       s32 tt_len;
 
        batadv_dbg(BATADV_DBG_TT, bat_priv,
                   "Received TT_REQUEST from %pM for ttvn: %u (%pM) [%c]\n",
                   req_src, tt_data->ttvn, req_dst,
-                  (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
+                  ((tt_data->flags & BATADV_TT_FULL_TABLE) ? 'F' : '.'));
 
        /* Let's get the orig node of the REAL destination */
        req_dst_orig_node = batadv_orig_hash_find(bat_priv, req_dst);
@@ -2540,7 +2609,7 @@ static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv,
        if (!res_dst_orig_node)
                goto out;
 
-       orig_ttvn = (uint8_t)atomic_read(&req_dst_orig_node->last_ttvn);
+       orig_ttvn = (u8)atomic_read(&req_dst_orig_node->last_ttvn);
        req_ttvn = tt_data->ttvn;
 
        tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(tt_data + 1);
@@ -2646,25 +2715,25 @@ out:
  */
 static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
                                       struct batadv_tvlv_tt_data *tt_data,
-                                      uint8_t *req_src)
+                                      u8 *req_src)
 {
        struct batadv_tvlv_tt_data *tvlv_tt_data = NULL;
        struct batadv_hard_iface *primary_if = NULL;
        struct batadv_tvlv_tt_change *tt_change;
        struct batadv_orig_node *orig_node;
-       uint8_t my_ttvn, req_ttvn;
-       uint16_t tvlv_len;
+       u8 my_ttvn, req_ttvn;
+       u16 tvlv_len;
        bool full_table;
-       int32_t tt_len;
+       s32 tt_len;
 
        batadv_dbg(BATADV_DBG_TT, bat_priv,
                   "Received TT_REQUEST from %pM for ttvn: %u (me) [%c]\n",
                   req_src, tt_data->ttvn,
-                  (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
+                  ((tt_data->flags & BATADV_TT_FULL_TABLE) ? 'F' : '.'));
 
        spin_lock_bh(&bat_priv->tt.commit_lock);
 
-       my_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
+       my_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
        req_ttvn = tt_data->ttvn;
 
        orig_node = batadv_orig_hash_find(bat_priv, req_src);
@@ -2703,7 +2772,7 @@ static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
                       bat_priv->tt.last_changeset_len);
                spin_unlock_bh(&bat_priv->tt.last_changeset_lock);
        } else {
-               req_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
+               req_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
 
                /* allocate the tvlv, put the tt_data and all the tt_vlan_data
                 * in the initial part
@@ -2764,7 +2833,7 @@ out:
  */
 static bool batadv_send_tt_response(struct batadv_priv *bat_priv,
                                    struct batadv_tvlv_tt_data *tt_data,
-                                   uint8_t *req_src, uint8_t *req_dst)
+                                   u8 *req_src, u8 *req_dst)
 {
        if (batadv_is_my_mac(bat_priv, req_dst))
                return batadv_send_my_tt_response(bat_priv, tt_data, req_src);
@@ -2775,7 +2844,7 @@ static bool batadv_send_tt_response(struct batadv_priv *bat_priv,
 static void _batadv_tt_update_changes(struct batadv_priv *bat_priv,
                                      struct batadv_orig_node *orig_node,
                                      struct batadv_tvlv_tt_change *tt_change,
-                                     uint16_t tt_num_changes, uint8_t ttvn)
+                                     u16 tt_num_changes, u8 ttvn)
 {
        int i;
        int roams;
@@ -2802,13 +2871,13 @@ static void _batadv_tt_update_changes(struct batadv_priv *bat_priv,
                                return;
                }
        }
-       orig_node->capa_initialized |= BATADV_ORIG_CAPA_HAS_TT;
+       set_bit(BATADV_ORIG_CAPA_HAS_TT, &orig_node->capa_initialized);
 }
 
 static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv,
                                  struct batadv_tvlv_tt_change *tt_change,
-                                 uint8_t ttvn, uint8_t *resp_src,
-                                 uint16_t num_entries)
+                                 u8 ttvn, u8 *resp_src,
+                                 u16 num_entries)
 {
        struct batadv_orig_node *orig_node;
 
@@ -2838,7 +2907,7 @@ out:
 
 static void batadv_tt_update_changes(struct batadv_priv *bat_priv,
                                     struct batadv_orig_node *orig_node,
-                                    uint16_t tt_num_changes, uint8_t ttvn,
+                                    u16 tt_num_changes, u8 ttvn,
                                     struct batadv_tvlv_tt_change *tt_change)
 {
        _batadv_tt_update_changes(bat_priv, orig_node, tt_change,
@@ -2857,7 +2926,7 @@ static void batadv_tt_update_changes(struct batadv_priv *bat_priv,
  *
  * Returns true if the client is served by this node, false otherwise.
  */
-bool batadv_is_my_client(struct batadv_priv *bat_priv, const uint8_t *addr,
+bool batadv_is_my_client(struct batadv_priv *bat_priv, const u8 *addr,
                         unsigned short vid)
 {
        struct batadv_tt_local_entry *tt_local_entry;
@@ -2888,18 +2957,19 @@ out:
  */
 static void batadv_handle_tt_response(struct batadv_priv *bat_priv,
                                      struct batadv_tvlv_tt_data *tt_data,
-                                     uint8_t *resp_src, uint16_t num_entries)
+                                     u8 *resp_src, u16 num_entries)
 {
-       struct batadv_tt_req_node *node, *safe;
+       struct batadv_tt_req_node *node;
+       struct hlist_node *safe;
        struct batadv_orig_node *orig_node = NULL;
        struct batadv_tvlv_tt_change *tt_change;
-       uint8_t *tvlv_ptr = (uint8_t *)tt_data;
-       uint16_t change_offset;
+       u8 *tvlv_ptr = (u8 *)tt_data;
+       u16 change_offset;
 
        batadv_dbg(BATADV_DBG_TT, bat_priv,
                   "Received TT_RESPONSE from %pM for ttvn %d t_size: %d [%c]\n",
                   resp_src, tt_data->ttvn, num_entries,
-                  (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
+                  ((tt_data->flags & BATADV_TT_FULL_TABLE) ? 'F' : '.'));
 
        orig_node = batadv_orig_hash_find(bat_priv, resp_src);
        if (!orig_node)
@@ -2928,10 +2998,10 @@ static void batadv_handle_tt_response(struct batadv_priv *bat_priv,
 
        /* Delete the tt_req_node from pending tt_requests list */
        spin_lock_bh(&bat_priv->tt.req_list_lock);
-       list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
+       hlist_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
                if (!batadv_compare_eth(node->addr, resp_src))
                        continue;
-               list_del(&node->list);
+               hlist_del_init(&node->list);
                kfree(node);
        }
 
@@ -2977,8 +3047,7 @@ static void batadv_tt_roam_purge(struct batadv_priv *bat_priv)
  *
  * returns true if the ROAMING_ADV can be sent, false otherwise
  */
-static bool batadv_tt_check_roam_count(struct batadv_priv *bat_priv,
-                                      uint8_t *client)
+static bool batadv_tt_check_roam_count(struct batadv_priv *bat_priv, u8 *client)
 {
        struct batadv_tt_roam_node *tt_roam_node;
        bool ret = false;
@@ -3033,7 +3102,7 @@ unlock:
  * for this particular roamed client has to be forwarded to the sender of the
  * roaming message.
  */
-static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client,
+static void batadv_send_roam_adv(struct batadv_priv *bat_priv, u8 *client,
                                 unsigned short vid,
                                 struct batadv_orig_node *orig_node)
 {
@@ -3111,14 +3180,14 @@ void batadv_tt_free(struct batadv_priv *bat_priv)
  * @enable: whether to set or unset the flag
  * @count: whether to increase the TT size by the number of changed entries
  */
-static void batadv_tt_local_set_flags(struct batadv_priv *bat_priv,
-                                     uint16_t flags, bool enable, bool count)
+static void batadv_tt_local_set_flags(struct batadv_priv *bat_priv, u16 flags,
+                                     bool enable, bool count)
 {
        struct batadv_hashtable *hash = bat_priv->tt.local_hash;
        struct batadv_tt_common_entry *tt_common_entry;
-       uint16_t changed_num = 0;
+       u16 changed_num = 0;
        struct hlist_head *head;
-       uint32_t i;
+       u32 i;
 
        if (!hash)
                return;
@@ -3160,7 +3229,7 @@ static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv)
        struct hlist_node *node_tmp;
        struct hlist_head *head;
        spinlock_t *list_lock; /* protects write access to the hash lists */
-       uint32_t i;
+       u32 i;
 
        if (!hash)
                return;
@@ -3188,8 +3257,10 @@ static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv)
 
                        /* decrease the reference held for this vlan */
                        vlan = batadv_softif_vlan_get(bat_priv, tt_common->vid);
-                       batadv_softif_vlan_free_ref(vlan);
-                       batadv_softif_vlan_free_ref(vlan);
+                       if (vlan) {
+                               batadv_softif_vlan_free_ref(vlan);
+                               batadv_softif_vlan_free_ref(vlan);
+                       }
 
                        batadv_tt_local_entry_free_ref(tt_local);
                }
@@ -3206,6 +3277,8 @@ static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv)
  */
 static void batadv_tt_local_commit_changes_nolock(struct batadv_priv *bat_priv)
 {
+       lockdep_assert_held(&bat_priv->tt.commit_lock);
+
        /* Update multicast addresses in local translation table */
        batadv_mcast_mla_update(bat_priv);
 
@@ -3224,7 +3297,7 @@ static void batadv_tt_local_commit_changes_nolock(struct batadv_priv *bat_priv)
        atomic_inc(&bat_priv->tt.vn);
        batadv_dbg(BATADV_DBG_TT, bat_priv,
                   "Local changes committed, updating to ttvn %u\n",
-                  (uint8_t)atomic_read(&bat_priv->tt.vn));
+                  (u8)atomic_read(&bat_priv->tt.vn));
 
        /* reset the sending counter */
        atomic_set(&bat_priv->tt.ogm_append_cnt, BATADV_TT_OGM_APPEND_MAX);
@@ -3243,8 +3316,8 @@ void batadv_tt_local_commit_changes(struct batadv_priv *bat_priv)
        spin_unlock_bh(&bat_priv->tt.commit_lock);
 }
 
-bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, uint8_t *src,
-                          uint8_t *dst, unsigned short vid)
+bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, u8 *src, u8 *dst,
+                          unsigned short vid)
 {
        struct batadv_tt_local_entry *tt_local_entry = NULL;
        struct batadv_tt_global_entry *tt_global_entry = NULL;
@@ -3292,17 +3365,18 @@ out:
  */
 static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
                                  struct batadv_orig_node *orig_node,
-                                 const void *tt_buff, uint16_t tt_num_vlan,
+                                 const void *tt_buff, u16 tt_num_vlan,
                                  struct batadv_tvlv_tt_change *tt_change,
-                                 uint16_t tt_num_changes, uint8_t ttvn)
+                                 u16 tt_num_changes, u8 ttvn)
 {
-       uint8_t orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
+       u8 orig_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
        struct batadv_tvlv_tt_vlan_data *tt_vlan;
        bool full_table = true;
        bool has_tt_init;
 
        tt_vlan = (struct batadv_tvlv_tt_vlan_data *)tt_buff;
-       has_tt_init = orig_node->capa_initialized & BATADV_ORIG_CAPA_HAS_TT;
+       has_tt_init = test_bit(BATADV_ORIG_CAPA_HAS_TT,
+                              &orig_node->capa_initialized);
 
        /* orig table not initialised AND first diff is in the OGM OR the ttvn
         * increased by one -> we can apply the attached changes
@@ -3374,7 +3448,7 @@ request_table:
  * deleted later by a DEL or because of timeout
  */
 bool batadv_tt_global_client_is_roaming(struct batadv_priv *bat_priv,
-                                       uint8_t *addr, unsigned short vid)
+                                       u8 *addr, unsigned short vid)
 {
        struct batadv_tt_global_entry *tt_global_entry;
        bool ret = false;
@@ -3400,7 +3474,7 @@ out:
  * to keep the latter consistent with the node TTVN
  */
 bool batadv_tt_local_client_is_roaming(struct batadv_priv *bat_priv,
-                                      uint8_t *addr, unsigned short vid)
+                                      u8 *addr, unsigned short vid)
 {
        struct batadv_tt_local_entry *tt_local_entry;
        bool ret = false;
@@ -3486,13 +3560,13 @@ void batadv_tt_local_resize_to_mtu(struct net_device *soft_iface)
  */
 static void batadv_tt_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
                                          struct batadv_orig_node *orig,
-                                         uint8_t flags, void *tvlv_value,
-                                         uint16_t tvlv_value_len)
+                                         u8 flags, void *tvlv_value,
+                                         u16 tvlv_value_len)
 {
        struct batadv_tvlv_tt_vlan_data *tt_vlan;
        struct batadv_tvlv_tt_change *tt_change;
        struct batadv_tvlv_tt_data *tt_data;
-       uint16_t num_entries, num_vlan;
+       u16 num_entries, num_vlan;
 
        if (tvlv_value_len < sizeof(*tt_data))
                return;
@@ -3528,12 +3602,12 @@ static void batadv_tt_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
  * otherwise.
  */
 static int batadv_tt_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
-                                            uint8_t *src, uint8_t *dst,
+                                            u8 *src, u8 *dst,
                                             void *tvlv_value,
-                                            uint16_t tvlv_value_len)
+                                            u16 tvlv_value_len)
 {
        struct batadv_tvlv_tt_data *tt_data;
-       uint16_t tt_vlan_len, tt_num_entries;
+       u16 tt_vlan_len, tt_num_entries;
        char tt_flag;
        bool ret;
 
@@ -3609,9 +3683,9 @@ static int batadv_tt_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
  * otherwise.
  */
 static int batadv_roam_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
-                                              uint8_t *src, uint8_t *dst,
+                                              u8 *src, u8 *dst,
                                               void *tvlv_value,
-                                              uint16_t tvlv_value_len)
+                                              u16 tvlv_value_len)
 {
        struct batadv_tvlv_roam_adv *roaming_adv;
        struct batadv_orig_node *orig_node = NULL;
@@ -3693,7 +3767,7 @@ int batadv_tt_init(struct batadv_priv *bat_priv)
  * otherwise
  */
 bool batadv_tt_global_is_isolated(struct batadv_priv *bat_priv,
-                                 const uint8_t *addr, unsigned short vid)
+                                 const u8 *addr, unsigned short vid)
 {
        struct batadv_tt_global_entry *tt;
        bool ret;