]> Pileus Git - ~andy/linux/commitdiff
batman-adv: Distributed ARP Table - add runtime switch
authorAntonio Quartulli <ordex@autistici.org>
Wed, 8 Aug 2012 16:50:57 +0000 (18:50 +0200)
committerAntonio Quartulli <ordex@autistici.org>
Wed, 7 Nov 2012 19:00:22 +0000 (20:00 +0100)
This patch adds a runtime switch that enables the user to turn the DAT feature
on or off at runtime

Signed-off-by: Antonio Quartulli <ordex@autistici.org>
net/batman-adv/distributed-arp-table.c
net/batman-adv/soft-interface.c
net/batman-adv/sysfs.c
net/batman-adv/types.h

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
         */
index 9dc0ae1d4da3264698b2114d457c20a9cee5b128..7b4a3a3d9dd570e6c1a8f6a5446919734beca0bb 100644 (file)
@@ -480,6 +480,9 @@ struct net_device *batadv_softif_create(const char *name)
        atomic_set(&bat_priv->aggregated_ogms, 1);
        atomic_set(&bat_priv->bonding, 0);
        atomic_set(&bat_priv->bridge_loop_avoidance, 0);
+#ifdef CONFIG_BATMAN_ADV_DAT
+       atomic_set(&bat_priv->distributed_arp_table, 1);
+#endif
        atomic_set(&bat_priv->ap_isolation, 0);
        atomic_set(&bat_priv->vis_mode, BATADV_VIS_TYPE_CLIENT_UPDATE);
        atomic_set(&bat_priv->gw_mode, BATADV_GW_MODE_OFF);
index 42cd09e24c5fb8f276b58ea5bbeb25fcad95e1df..fa3cc1af09187a6facbc8c6f6a0aa78b368fad1f 100644 (file)
@@ -20,6 +20,7 @@
 #include "main.h"
 #include "sysfs.h"
 #include "translation-table.h"
+#include "distributed-arp-table.h"
 #include "originator.h"
 #include "hard-interface.h"
 #include "gateway_common.h"
@@ -420,6 +421,9 @@ BATADV_ATTR_SIF_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
 #ifdef CONFIG_BATMAN_ADV_BLA
 BATADV_ATTR_SIF_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR, NULL);
 #endif
+#ifdef CONFIG_BATMAN_ADV_DAT
+BATADV_ATTR_SIF_BOOL(distributed_arp_table, S_IRUGO | S_IWUSR, NULL);
+#endif
 BATADV_ATTR_SIF_BOOL(fragmentation, S_IRUGO | S_IWUSR, batadv_update_min_mtu);
 BATADV_ATTR_SIF_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL);
 static BATADV_ATTR(vis_mode, S_IRUGO | S_IWUSR, batadv_show_vis_mode,
@@ -444,6 +448,9 @@ static struct batadv_attribute *batadv_mesh_attrs[] = {
        &batadv_attr_bonding,
 #ifdef CONFIG_BATMAN_ADV_BLA
        &batadv_attr_bridge_loop_avoidance,
+#endif
+#ifdef CONFIG_BATMAN_ADV_DAT
+       &batadv_attr_distributed_arp_table,
 #endif
        &batadv_attr_fragmentation,
        &batadv_attr_ap_isolation,
index 00d3093f3a9cfa181e98120eaf7f79b85ca62f6a..0afeb2b43f70849f42aa44981c54947fdddb3c3d 100644 (file)
@@ -275,6 +275,9 @@ struct batadv_priv {
        atomic_t fragmentation;         /* boolean */
        atomic_t ap_isolation;          /* boolean */
        atomic_t bridge_loop_avoidance; /* boolean */
+#ifdef CONFIG_BATMAN_ADV_DAT
+       atomic_t distributed_arp_table; /* boolean */
+#endif
        atomic_t vis_mode;              /* VIS_TYPE_* */
        atomic_t gw_mode;               /* GW_MODE_* */
        atomic_t gw_sel_class;          /* uint */