Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -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)
{
	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
	 */
+3 −0
Original line number Diff line number Diff line
@@ -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);
+7 −0
Original line number Diff line number Diff line
@@ -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,
+3 −0
Original line number Diff line number Diff line
@@ -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 */