These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / net / batman-adv / bridge_loop_avoidance.c
index ac4b96e..f5d2fe5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011-2014 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2015 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich
  *
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "main.h"
-#include "hash.h"
-#include "hard-interface.h"
-#include "originator.h"
 #include "bridge_loop_avoidance.h"
-#include "translation-table.h"
-#include "send.h"
+#include "main.h"
 
-#include <linux/etherdevice.h>
+#include <linux/atomic.h>
+#include <linux/byteorder/generic.h>
+#include <linux/compiler.h>
 #include <linux/crc16.h>
+#include <linux/errno.h>
+#include <linux/etherdevice.h>
+#include <linux/fs.h>
 #include <linux/if_arp.h>
-#include <net/arp.h>
+#include <linux/if_ether.h>
 #include <linux/if_vlan.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/skbuff.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/stddef.h>
+#include <linux/string.h>
+#include <linux/workqueue.h>
+#include <net/arp.h>
 
-static const uint8_t batadv_announce_mac[4] = {0x43, 0x05, 0x43, 0x05};
+#include "hard-interface.h"
+#include "hash.h"
+#include "originator.h"
+#include "packet.h"
+#include "translation-table.h"
+
+static const u8 batadv_announce_mac[4] = {0x43, 0x05, 0x43, 0x05};
 
 static void batadv_bla_periodic_work(struct work_struct *work);
 static void
@@ -37,34 +59,25 @@ batadv_bla_send_announce(struct batadv_priv *bat_priv,
                         struct batadv_bla_backbone_gw *backbone_gw);
 
 /* return the index of the claim */
-static inline uint32_t batadv_choose_claim(const void *data, uint32_t size)
+static inline u32 batadv_choose_claim(const void *data, u32 size)
 {
        struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;
-       uint32_t hash = 0;
-
-       hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr));
-       hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid));
+       u32 hash = 0;
 
-       hash += (hash << 3);
-       hash ^= (hash >> 11);
-       hash += (hash << 15);
+       hash = jhash(&claim->addr, sizeof(claim->addr), hash);
+       hash = jhash(&claim->vid, sizeof(claim->vid), hash);
 
        return hash % size;
 }
 
 /* return the index of the backbone gateway */
-static inline uint32_t batadv_choose_backbone_gw(const void *data,
-                                                uint32_t size)
+static inline u32 batadv_choose_backbone_gw(const void *data, u32 size)
 {
        const struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;
-       uint32_t hash = 0;
+       u32 hash = 0;
 
-       hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr));
-       hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid));
-
-       hash += (hash << 3);
-       hash ^= (hash >> 11);
-       hash += (hash << 15);
+       hash = jhash(&claim->addr, sizeof(claim->addr), hash);
+       hash = jhash(&claim->vid, sizeof(claim->vid), hash);
 
        return hash % size;
 }
@@ -75,7 +88,8 @@ static int batadv_compare_backbone_gw(const struct hlist_node *node,
 {
        const void *data1 = container_of(node, struct batadv_bla_backbone_gw,
                                         hash_entry);
-       const struct batadv_bla_backbone_gw *gw1 = data1, *gw2 = data2;
+       const struct batadv_bla_backbone_gw *gw1 = data1;
+       const struct batadv_bla_backbone_gw *gw2 = data2;
 
        if (!batadv_compare_eth(gw1->orig, gw2->orig))
                return 0;
@@ -92,7 +106,8 @@ static int batadv_compare_claim(const struct hlist_node *node,
 {
        const void *data1 = container_of(node, struct batadv_bla_claim,
                                         hash_entry);
-       const struct batadv_bla_claim *cl1 = data1, *cl2 = data2;
+       const struct batadv_bla_claim *cl1 = data1;
+       const struct batadv_bla_claim *cl2 = data2;
 
        if (!batadv_compare_eth(cl1->addr, cl2->addr))
                return 0;
@@ -112,21 +127,17 @@ batadv_backbone_gw_free_ref(struct batadv_bla_backbone_gw *backbone_gw)
 }
 
 /* finally deinitialize the claim */
-static void batadv_claim_free_rcu(struct rcu_head *rcu)
+static void batadv_claim_release(struct batadv_bla_claim *claim)
 {
-       struct batadv_bla_claim *claim;
-
-       claim = container_of(rcu, struct batadv_bla_claim, rcu);
-
        batadv_backbone_gw_free_ref(claim->backbone_gw);
-       kfree(claim);
+       kfree_rcu(claim, rcu);
 }
 
 /* free a claim, call claim_free_rcu if its the last reference */
 static void batadv_claim_free_ref(struct batadv_bla_claim *claim)
 {
        if (atomic_dec_and_test(&claim->refcount))
-               call_rcu(&claim->rcu, batadv_claim_free_rcu);
+               batadv_claim_release(claim);
 }
 
 /**
@@ -178,8 +189,8 @@ static struct batadv_bla_claim
  * Returns claim if found or NULL otherwise.
  */
 static struct batadv_bla_backbone_gw *
-batadv_backbone_hash_find(struct batadv_priv *bat_priv,
-                         uint8_t *addr, unsigned short vid)
+batadv_backbone_hash_find(struct batadv_priv *bat_priv, u8 *addr,
+                         unsigned short vid)
 {
        struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
        struct hlist_head *head;
@@ -255,14 +266,14 @@ batadv_bla_del_backbone_claims(struct batadv_bla_backbone_gw *backbone_gw)
  * @vid: the VLAN ID
  * @claimtype: the type of the claim (CLAIM, UNCLAIM, ANNOUNCE, ...)
  */
-static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac,
+static void batadv_bla_send_claim(struct batadv_priv *bat_priv, u8 *mac,
                                  unsigned short vid, int claimtype)
 {
        struct sk_buff *skb;
        struct ethhdr *ethhdr;
        struct batadv_hard_iface *primary_if;
        struct net_device *soft_iface;
-       uint8_t *hw_src;
+       u8 *hw_src;
        struct batadv_bla_claim_dst local_claim_dest;
        __be32 zeroip = 0;
 
@@ -290,13 +301,13 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac,
                          * with XX   = claim type
                          * and YY:YY = group id
                          */
-                        (uint8_t *)&local_claim_dest);
+                        (u8 *)&local_claim_dest);
 
        if (!skb)
                goto out;
 
        ethhdr = (struct ethhdr *)skb->data;
-       hw_src = (uint8_t *)ethhdr + ETH_HLEN + sizeof(struct arphdr);
+       hw_src = (u8 *)ethhdr + ETH_HLEN + sizeof(struct arphdr);
 
        /* now we pretend that the client would have sent this ... */
        switch (claimtype) {
@@ -369,7 +380,7 @@ out:
  * be found.
  */
 static struct batadv_bla_backbone_gw *
-batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig,
+batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, u8 *orig,
                           unsigned short vid, bool own_backbone)
 {
        struct batadv_bla_backbone_gw *entry;
@@ -538,7 +549,7 @@ static void batadv_bla_send_request(struct batadv_bla_backbone_gw *backbone_gw)
 static void batadv_bla_send_announce(struct batadv_priv *bat_priv,
                                     struct batadv_bla_backbone_gw *backbone_gw)
 {
-       uint8_t mac[ETH_ALEN];
+       u8 mac[ETH_ALEN];
        __be16 crc;
 
        memcpy(mac, batadv_announce_mac, 4);
@@ -557,7 +568,7 @@ static void batadv_bla_send_announce(struct batadv_priv *bat_priv,
  * @backbone_gw: the backbone gateway which claims it
  */
 static void batadv_bla_add_claim(struct batadv_priv *bat_priv,
-                                const uint8_t *mac, const unsigned short vid,
+                                const u8 *mac, const unsigned short vid,
                                 struct batadv_bla_backbone_gw *backbone_gw)
 {
        struct batadv_bla_claim *claim;
@@ -621,7 +632,7 @@ claim_free_ref:
  * given mac address and vid.
  */
 static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
-                                const uint8_t *mac, const unsigned short vid)
+                                const u8 *mac, const unsigned short vid)
 {
        struct batadv_bla_claim search_claim, *claim;
 
@@ -645,12 +656,11 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
 }
 
 /* check for ANNOUNCE frame, return 1 if handled */
-static int batadv_handle_announce(struct batadv_priv *bat_priv,
-                                 uint8_t *an_addr, uint8_t *backbone_addr,
-                                 unsigned short vid)
+static int batadv_handle_announce(struct batadv_priv *bat_priv, u8 *an_addr,
+                                 u8 *backbone_addr, unsigned short vid)
 {
        struct batadv_bla_backbone_gw *backbone_gw;
-       uint16_t crc;
+       u16 crc;
 
        if (memcmp(an_addr, batadv_announce_mac, 4) != 0)
                return 0;
@@ -694,8 +704,8 @@ static int batadv_handle_announce(struct batadv_priv *bat_priv,
 /* check for REQUEST frame, return 1 if handled */
 static int batadv_handle_request(struct batadv_priv *bat_priv,
                                 struct batadv_hard_iface *primary_if,
-                                uint8_t *backbone_addr,
-                                struct ethhdr *ethhdr, unsigned short vid)
+                                u8 *backbone_addr, struct ethhdr *ethhdr,
+                                unsigned short vid)
 {
        /* check for REQUEST frame */
        if (!batadv_compare_eth(backbone_addr, ethhdr->h_dest))
@@ -718,8 +728,8 @@ static int batadv_handle_request(struct batadv_priv *bat_priv,
 /* check for UNCLAIM frame, return 1 if handled */
 static int batadv_handle_unclaim(struct batadv_priv *bat_priv,
                                 struct batadv_hard_iface *primary_if,
-                                uint8_t *backbone_addr,
-                                uint8_t *claim_addr, unsigned short vid)
+                                u8 *backbone_addr, u8 *claim_addr,
+                                unsigned short vid)
 {
        struct batadv_bla_backbone_gw *backbone_gw;
 
@@ -747,7 +757,7 @@ static int batadv_handle_unclaim(struct batadv_priv *bat_priv,
 /* check for CLAIM frame, return 1 if handled */
 static int batadv_handle_claim(struct batadv_priv *bat_priv,
                               struct batadv_hard_iface *primary_if,
-                              uint8_t *backbone_addr, uint8_t *claim_addr,
+                              u8 *backbone_addr, u8 *claim_addr,
                               unsigned short vid)
 {
        struct batadv_bla_backbone_gw *backbone_gw;
@@ -791,10 +801,10 @@ static int batadv_handle_claim(struct batadv_priv *bat_priv,
  */
 static int batadv_check_claim_group(struct batadv_priv *bat_priv,
                                    struct batadv_hard_iface *primary_if,
-                                   uint8_t *hw_src, uint8_t *hw_dst,
+                                   u8 *hw_src, u8 *hw_dst,
                                    struct ethhdr *ethhdr)
 {
-       uint8_t *backbone_addr;
+       u8 *backbone_addr;
        struct batadv_orig_node *orig_node;
        struct batadv_bla_claim_dst *bla_dst, *bla_dst_own;
 
@@ -863,7 +873,7 @@ static int batadv_bla_process_claim(struct batadv_priv *bat_priv,
                                    struct sk_buff *skb)
 {
        struct batadv_bla_claim_dst *bla_dst, *bla_dst_own;
-       uint8_t *hw_src, *hw_dst;
+       u8 *hw_src, *hw_dst;
        struct vlan_hdr *vhdr, vhdr_buf;
        struct ethhdr *ethhdr;
        struct arphdr *arphdr;
@@ -909,7 +919,7 @@ static int batadv_bla_process_claim(struct batadv_priv *bat_priv,
 
        /* pskb_may_pull() may have modified the pointers, get ethhdr again */
        ethhdr = eth_hdr(skb);
-       arphdr = (struct arphdr *)((uint8_t *)ethhdr + headlen);
+       arphdr = (struct arphdr *)((u8 *)ethhdr + headlen);
 
        /* Check whether the ARP frame carries a valid
         * IP information
@@ -923,7 +933,7 @@ static int batadv_bla_process_claim(struct batadv_priv *bat_priv,
        if (arphdr->ar_pln != 4)
                return 0;
 
-       hw_src = (uint8_t *)arphdr + sizeof(struct arphdr);
+       hw_src = (u8 *)arphdr + sizeof(struct arphdr);
        hw_dst = hw_src + ETH_ALEN + 4;
        bla_dst = (struct batadv_bla_claim_dst *)hw_dst;
        bla_dst_own = &bat_priv->bla.claim_dest;
@@ -1224,9 +1234,9 @@ static struct lock_class_key batadv_backbone_hash_lock_class_key;
 int batadv_bla_init(struct batadv_priv *bat_priv)
 {
        int i;
-       uint8_t claim_dest[ETH_ALEN] = {0xff, 0x43, 0x05, 0x00, 0x00, 0x00};
+       u8 claim_dest[ETH_ALEN] = {0xff, 0x43, 0x05, 0x00, 0x00, 0x00};
        struct batadv_hard_iface *primary_if;
-       uint16_t crc;
+       u16 crc;
        unsigned long entrytime;
 
        spin_lock_init(&bat_priv->bla.bcast_duplist_lock);
@@ -1354,7 +1364,7 @@ out:
  *
  * Returns true if orig is a backbone for this vid, false otherwise.
  */
-bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig,
+bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, u8 *orig,
                                    unsigned short vid)
 {
        struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
@@ -1633,9 +1643,9 @@ int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset)
        struct batadv_bla_claim *claim;
        struct batadv_hard_iface *primary_if;
        struct hlist_head *head;
-       uint32_t i;
+       u32 i;
        bool is_own;
-       uint8_t *primary_addr;
+       u8 *primary_addr;
 
        primary_if = batadv_seq_print_text_primary_if_get(seq);
        if (!primary_if)
@@ -1678,9 +1688,9 @@ int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset)
        struct batadv_hard_iface *primary_if;
        struct hlist_head *head;
        int secs, msecs;
-       uint32_t i;
+       u32 i;
        bool is_own;
-       uint8_t *primary_addr;
+       u8 *primary_addr;
 
        primary_if = batadv_seq_print_text_primary_if_get(seq);
        if (!primary_if)