Bluetooth: Fix reference counting for LE-scan based connections
[linux-drm-fsl-dcu.git] / net / batman-adv / translation-table.c
index 5809b39c1922320e8dbb353de212b472199c796d..4228b10c47ead06db9284997afc1899e181d6505 100644 (file)
@@ -19,6 +19,7 @@
 #include "main.h"
 
 #include <linux/atomic.h>
+#include <linux/bitops.h>
 #include <linux/bug.h>
 #include <linux/byteorder/generic.h>
 #include <linux/compiler.h>
@@ -55,7 +56,7 @@
 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);
@@ -84,10 +85,10 @@ 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 = jhash(&tt->addr, ETH_ALEN, hash);
@@ -106,12 +107,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;
@@ -151,7 +152,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;
@@ -176,7 +177,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;
@@ -222,7 +223,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;
@@ -314,7 +315,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);
        }
@@ -363,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;
 
@@ -447,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);
 }
@@ -461,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;
 
@@ -524,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;
@@ -535,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);
@@ -604,7 +607,7 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
        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
@@ -723,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);
        }
@@ -761,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:
@@ -794,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();
@@ -840,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:
@@ -859,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);
@@ -934,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)
@@ -947,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");
 
@@ -1007,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);
 
@@ -1033,12 +1042,12 @@ 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;
 
@@ -1141,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];
@@ -1162,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;
@@ -1337,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))
@@ -1542,8 +1550,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;
@@ -1617,7 +1625,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)
@@ -1650,20 +1658,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);
 }
@@ -1679,7 +1695,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);
 }
 
@@ -1714,8 +1730,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);
@@ -1837,12 +1853,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;
@@ -1882,7 +1898,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,
@@ -1913,7 +1929,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;
@@ -1954,7 +1970,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;
@@ -2015,8 +2031,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;
@@ -2084,16 +2100,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++) {
@@ -2161,14 +2177,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++) {
@@ -2210,12 +2226,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);
        }
 
@@ -2225,7 +2242,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)
@@ -2245,30 +2262,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))
@@ -2282,7 +2305,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;
@@ -2334,15 +2357,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;
@@ -2384,11 +2407,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 */
@@ -2443,11 +2466,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
                 */
@@ -2473,9 +2496,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;
@@ -2491,7 +2514,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;
 
@@ -2533,7 +2556,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);
        }
@@ -2553,7 +2577,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;
@@ -2561,9 +2585,9 @@ 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",
@@ -2579,7 +2603,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);
@@ -2685,16 +2709,16 @@ 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",
@@ -2703,7 +2727,7 @@ static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
 
        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);
@@ -2742,7 +2766,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
@@ -2803,7 +2827,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);
@@ -2814,7 +2838,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;
@@ -2841,13 +2865,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;
 
@@ -2877,7 +2901,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,
@@ -2896,7 +2920,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;
@@ -2927,13 +2951,14 @@ 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",
@@ -2967,10 +2992,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);
        }
 
@@ -3016,8 +3041,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;
@@ -3072,7 +3096,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)
 {
@@ -3150,14 +3174,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;
@@ -3199,7 +3223,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;
@@ -3247,6 +3271,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);
 
@@ -3265,7 +3291,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);
@@ -3284,8 +3310,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;
@@ -3333,17 +3359,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
@@ -3415,7 +3442,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;
@@ -3441,7 +3468,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;
@@ -3527,13 +3554,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;
@@ -3569,12 +3596,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;
 
@@ -3650,9 +3677,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;
@@ -3734,7 +3761,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;