batman-adv: Distributed ARP Table - add runtime switch
[firefly-linux-kernel-4.4.55.git] / net / batman-adv / distributed-arp-table.c
index f43bf8e4a2b748b9a18dc37dafea11c2c2f4b0a4..c1a74a126f583cb46085017b3df94cb119ae57cc 100644 (file)
@@ -621,6 +621,9 @@ out:
  */
 static void batadv_dat_hash_free(struct batadv_priv *bat_priv)
 {
+       if (!bat_priv->dat.hash)
+               return;
+
        __batadv_dat_purge(bat_priv, NULL);
 
        batadv_hash_destroy(bat_priv->dat.hash);
@@ -790,6 +793,9 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
        struct sk_buff *skb_new;
        struct batadv_hard_iface *primary_if = NULL;
 
+       if (!atomic_read(&bat_priv->distributed_arp_table))
+               goto out;
+
        type = batadv_arp_get_type(bat_priv, skb, 0);
        /* If the node gets an ARP_REQUEST it has to send a DHT_GET unicast
         * message to the selected DHT candidates
@@ -861,6 +867,9 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
        bool ret = false;
        int err;
 
+       if (!atomic_read(&bat_priv->distributed_arp_table))
+               goto out;
+
        type = batadv_arp_get_type(bat_priv, skb, hdr_size);
        if (type != ARPOP_REQUEST)
                goto out;
@@ -924,6 +933,9 @@ void batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv,
        __be32 ip_src, ip_dst;
        uint8_t *hw_src, *hw_dst;
 
+       if (!atomic_read(&bat_priv->distributed_arp_table))
+               return;
+
        type = batadv_arp_get_type(bat_priv, skb, 0);
        if (type != ARPOP_REPLY)
                return;
@@ -959,6 +971,9 @@ bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
        uint8_t *hw_src, *hw_dst;
        bool ret = false;
 
+       if (!atomic_read(&bat_priv->distributed_arp_table))
+               goto out;
+
        type = batadv_arp_get_type(bat_priv, skb, hdr_size);
        if (type != ARPOP_REPLY)
                goto out;
@@ -1003,6 +1018,9 @@ bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
        bool ret = false;
        const size_t bcast_len = sizeof(struct batadv_bcast_packet);
 
+       if (!atomic_read(&bat_priv->distributed_arp_table))
+               goto out;
+
        /* If this packet is an ARP_REQUEST and the node already has the
         * information that it is going to ask, then the packet can be dropped
         */