Commit 33af49ad authored by Antonio Quartulli's avatar Antonio Quartulli

batman-adv: Distributed ARP Table - add runtime switch

This patch adds a runtime switch that enables the user to turn the DAT feature
on or off at runtime
Signed-off-by: default avatarAntonio Quartulli <ordex@autistici.org>
parent 17224474
...@@ -621,6 +621,9 @@ static bool batadv_dat_send_data(struct batadv_priv *bat_priv, ...@@ -621,6 +621,9 @@ static bool batadv_dat_send_data(struct batadv_priv *bat_priv,
*/ */
static void batadv_dat_hash_free(struct batadv_priv *bat_priv) static void batadv_dat_hash_free(struct batadv_priv *bat_priv)
{ {
if (!bat_priv->dat.hash)
return;
__batadv_dat_purge(bat_priv, NULL); __batadv_dat_purge(bat_priv, NULL);
batadv_hash_destroy(bat_priv->dat.hash); batadv_hash_destroy(bat_priv->dat.hash);
...@@ -790,6 +793,9 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv, ...@@ -790,6 +793,9 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
struct sk_buff *skb_new; struct sk_buff *skb_new;
struct batadv_hard_iface *primary_if = NULL; 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); type = batadv_arp_get_type(bat_priv, skb, 0);
/* If the node gets an ARP_REQUEST it has to send a DHT_GET unicast /* If the node gets an ARP_REQUEST it has to send a DHT_GET unicast
* message to the selected DHT candidates * message to the selected DHT candidates
...@@ -861,6 +867,9 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv, ...@@ -861,6 +867,9 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
bool ret = false; bool ret = false;
int err; int err;
if (!atomic_read(&bat_priv->distributed_arp_table))
goto out;
type = batadv_arp_get_type(bat_priv, skb, hdr_size); type = batadv_arp_get_type(bat_priv, skb, hdr_size);
if (type != ARPOP_REQUEST) if (type != ARPOP_REQUEST)
goto out; goto out;
...@@ -924,6 +933,9 @@ void batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv, ...@@ -924,6 +933,9 @@ void batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv,
__be32 ip_src, ip_dst; __be32 ip_src, ip_dst;
uint8_t *hw_src, *hw_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); type = batadv_arp_get_type(bat_priv, skb, 0);
if (type != ARPOP_REPLY) if (type != ARPOP_REPLY)
return; return;
...@@ -959,6 +971,9 @@ bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv, ...@@ -959,6 +971,9 @@ bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
uint8_t *hw_src, *hw_dst; uint8_t *hw_src, *hw_dst;
bool ret = false; bool ret = false;
if (!atomic_read(&bat_priv->distributed_arp_table))
goto out;
type = batadv_arp_get_type(bat_priv, skb, hdr_size); type = batadv_arp_get_type(bat_priv, skb, hdr_size);
if (type != ARPOP_REPLY) if (type != ARPOP_REPLY)
goto out; goto out;
...@@ -1003,6 +1018,9 @@ bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv, ...@@ -1003,6 +1018,9 @@ bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
bool ret = false; bool ret = false;
const size_t bcast_len = sizeof(struct batadv_bcast_packet); 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 /* 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 * information that it is going to ask, then the packet can be dropped
*/ */
......
...@@ -480,6 +480,9 @@ struct net_device *batadv_softif_create(const char *name) ...@@ -480,6 +480,9 @@ struct net_device *batadv_softif_create(const char *name)
atomic_set(&bat_priv->aggregated_ogms, 1); atomic_set(&bat_priv->aggregated_ogms, 1);
atomic_set(&bat_priv->bonding, 0); atomic_set(&bat_priv->bonding, 0);
atomic_set(&bat_priv->bridge_loop_avoidance, 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->ap_isolation, 0);
atomic_set(&bat_priv->vis_mode, BATADV_VIS_TYPE_CLIENT_UPDATE); atomic_set(&bat_priv->vis_mode, BATADV_VIS_TYPE_CLIENT_UPDATE);
atomic_set(&bat_priv->gw_mode, BATADV_GW_MODE_OFF); atomic_set(&bat_priv->gw_mode, BATADV_GW_MODE_OFF);
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "main.h" #include "main.h"
#include "sysfs.h" #include "sysfs.h"
#include "translation-table.h" #include "translation-table.h"
#include "distributed-arp-table.h"
#include "originator.h" #include "originator.h"
#include "hard-interface.h" #include "hard-interface.h"
#include "gateway_common.h" #include "gateway_common.h"
...@@ -420,6 +421,9 @@ BATADV_ATTR_SIF_BOOL(bonding, S_IRUGO | S_IWUSR, NULL); ...@@ -420,6 +421,9 @@ BATADV_ATTR_SIF_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
#ifdef CONFIG_BATMAN_ADV_BLA #ifdef CONFIG_BATMAN_ADV_BLA
BATADV_ATTR_SIF_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR, NULL); BATADV_ATTR_SIF_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR, NULL);
#endif #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(fragmentation, S_IRUGO | S_IWUSR, batadv_update_min_mtu);
BATADV_ATTR_SIF_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL); BATADV_ATTR_SIF_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL);
static BATADV_ATTR(vis_mode, S_IRUGO | S_IWUSR, batadv_show_vis_mode, static BATADV_ATTR(vis_mode, S_IRUGO | S_IWUSR, batadv_show_vis_mode,
...@@ -444,6 +448,9 @@ static struct batadv_attribute *batadv_mesh_attrs[] = { ...@@ -444,6 +448,9 @@ static struct batadv_attribute *batadv_mesh_attrs[] = {
&batadv_attr_bonding, &batadv_attr_bonding,
#ifdef CONFIG_BATMAN_ADV_BLA #ifdef CONFIG_BATMAN_ADV_BLA
&batadv_attr_bridge_loop_avoidance, &batadv_attr_bridge_loop_avoidance,
#endif
#ifdef CONFIG_BATMAN_ADV_DAT
&batadv_attr_distributed_arp_table,
#endif #endif
&batadv_attr_fragmentation, &batadv_attr_fragmentation,
&batadv_attr_ap_isolation, &batadv_attr_ap_isolation,
......
...@@ -275,6 +275,9 @@ struct batadv_priv { ...@@ -275,6 +275,9 @@ struct batadv_priv {
atomic_t fragmentation; /* boolean */ atomic_t fragmentation; /* boolean */
atomic_t ap_isolation; /* boolean */ atomic_t ap_isolation; /* boolean */
atomic_t bridge_loop_avoidance; /* 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 vis_mode; /* VIS_TYPE_* */
atomic_t gw_mode; /* GW_MODE_* */ atomic_t gw_mode; /* GW_MODE_* */
atomic_t gw_sel_class; /* uint */ atomic_t gw_sel_class; /* uint */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment