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

Commit 3ea00443 authored by David S. Miller's avatar David S. Miller
Browse files

Merge tag 'batadv-next-for-davem-20160701' of git://git.open-mesh.org/linux-merge



Simon Wunderlich says:

====================
This feature patchset includes the following changes:

 - two patches with minimal clean up work by Antonio Quartulli and
   Simon Wunderlich

 - eight patches of B.A.T.M.A.N. V, API and documentation clean
   up work, by Antonio Quartulli and Marek Lindner

 - Andrew Lunn fixed the skb priority adoption when forwarding
   fragmented packets (two patches)

 - Multicast optimization support is now enabled for bridges which
   comes with some protocol updates, by Linus Luessing
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ca9354a1 4e3e823b
Loading
Loading
Loading
Loading
+10 −10
Original line number Original line Diff line number Diff line


What:		/sys/class/net/<iface>/batman-adv/throughput_override
Date:		Feb 2014
Contact:	Antonio Quartulli <antonio@meshcoding.com>
description:
		Defines the throughput value to be used by B.A.T.M.A.N. V
		when estimating the link throughput using this interface.
		If the value is set to 0 then batman-adv will try to
		estimate the throughput by itself.

What:           /sys/class/net/<iface>/batman-adv/elp_interval
What:           /sys/class/net/<iface>/batman-adv/elp_interval
Date:           Feb 2014
Date:           Feb 2014
Contact:        Linus Lüssing <linus.luessing@web.de>
Contact:        Linus Lüssing <linus.luessing@web.de>
Description:
Description:
                Defines the interval in milliseconds in which batman
                Defines the interval in milliseconds in which batman
                sends its probing packets for link quality measurements.
                emits probing packets for neighbor sensing (ELP).


What:           /sys/class/net/<iface>/batman-adv/iface_status
What:           /sys/class/net/<iface>/batman-adv/iface_status
Date:           May 2010
Date:           May 2010
@@ -28,3 +19,12 @@ Description:
                The /sys/class/net/<iface>/batman-adv/mesh_iface file
                The /sys/class/net/<iface>/batman-adv/mesh_iface file
                displays the batman mesh interface this <iface>
                displays the batman mesh interface this <iface>
                currently is associated with.
                currently is associated with.

What:           /sys/class/net/<iface>/batman-adv/throughput_override
Date:           Feb 2014
Contact:        Antonio Quartulli <a@unstable.cc>
description:
                Defines the throughput value to be used by B.A.T.M.A.N. V
                when estimating the link throughput using this interface.
                If the value is set to 0 then batman-adv will try to
                estimate the throughput by itself.
+1 −1
Original line number Original line Diff line number Diff line
@@ -66,7 +66,7 @@ config BATMAN_ADV_NC


config BATMAN_ADV_MCAST
config BATMAN_ADV_MCAST
	bool "Multicast optimisation"
	bool "Multicast optimisation"
	depends on BATMAN_ADV
	depends on BATMAN_ADV && INET && !(BRIDGE=m && BATMAN_ADV=y)
	default n
	default n
	help
	help
	  This option enables the multicast optimisation which aims to
	  This option enables the multicast optimisation which aims to
+6 −1
Original line number Original line Diff line number Diff line
@@ -18,13 +18,14 @@
#ifndef _NET_BATMAN_ADV_BAT_ALGO_H_
#ifndef _NET_BATMAN_ADV_BAT_ALGO_H_
#define _NET_BATMAN_ADV_BAT_ALGO_H_
#define _NET_BATMAN_ADV_BAT_ALGO_H_


struct batadv_priv;
#include "main.h"


int batadv_iv_init(void);
int batadv_iv_init(void);


#ifdef CONFIG_BATMAN_ADV_BATMAN_V
#ifdef CONFIG_BATMAN_ADV_BATMAN_V


int batadv_v_init(void);
int batadv_v_init(void);
void batadv_v_hardif_init(struct batadv_hard_iface *hardif);
int batadv_v_mesh_init(struct batadv_priv *bat_priv);
int batadv_v_mesh_init(struct batadv_priv *bat_priv);
void batadv_v_mesh_free(struct batadv_priv *bat_priv);
void batadv_v_mesh_free(struct batadv_priv *bat_priv);


@@ -35,6 +36,10 @@ static inline int batadv_v_init(void)
	return 0;
	return 0;
}
}


static inline void batadv_v_hardif_init(struct batadv_hard_iface *hardif)
{
}

static inline int batadv_v_mesh_init(struct batadv_priv *bat_priv)
static inline int batadv_v_mesh_init(struct batadv_priv *bat_priv)
{
{
	return 0;
	return 0;
+67 −5
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@
#include <linux/if_ether.h>
#include <linux/if_ether.h>
#include <linux/init.h>
#include <linux/init.h>
#include <linux/jiffies.h>
#include <linux/jiffies.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/list.h>
#include <linux/kref.h>
#include <linux/kref.h>
#include <linux/lockdep.h>
#include <linux/lockdep.h>
@@ -58,6 +59,8 @@
#include "send.h"
#include "send.h"
#include "translation-table.h"
#include "translation-table.h"


static void batadv_iv_send_outstanding_bat_ogm_packet(struct work_struct *work);

/**
/**
 * enum batadv_dup_status - duplicate status
 * enum batadv_dup_status - duplicate status
 * @BATADV_NO_DUP: the packet is no duplicate
 * @BATADV_NO_DUP: the packet is no duplicate
@@ -336,7 +339,8 @@ batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface,
{
{
	struct batadv_neigh_node *neigh_node;
	struct batadv_neigh_node *neigh_node;


	neigh_node = batadv_neigh_node_new(orig_node, hard_iface, neigh_addr);
	neigh_node = batadv_neigh_node_get_or_create(orig_node,
						     hard_iface, neigh_addr);
	if (!neigh_node)
	if (!neigh_node)
		goto out;
		goto out;


@@ -730,7 +734,7 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,


	/* start timer for this packet */
	/* start timer for this packet */
	INIT_DELAYED_WORK(&forw_packet_aggr->delayed_work,
	INIT_DELAYED_WORK(&forw_packet_aggr->delayed_work,
			  batadv_send_outstanding_bat_ogm_packet);
			  batadv_iv_send_outstanding_bat_ogm_packet);
	queue_delayed_work(batadv_event_workqueue,
	queue_delayed_work(batadv_event_workqueue,
			   &forw_packet_aggr->delayed_work,
			   &forw_packet_aggr->delayed_work,
			   send_time - jiffies);
			   send_time - jiffies);
@@ -937,6 +941,19 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
	u16 tvlv_len = 0;
	u16 tvlv_len = 0;
	unsigned long send_time;
	unsigned long send_time;


	if ((hard_iface->if_status == BATADV_IF_NOT_IN_USE) ||
	    (hard_iface->if_status == BATADV_IF_TO_BE_REMOVED))
		return;

	/* the interface gets activated here to avoid race conditions between
	 * the moment of activating the interface in
	 * hardif_activate_interface() where the originator mac is set and
	 * outdated packets (especially uninitialized mac addresses) in the
	 * packet queue
	 */
	if (hard_iface->if_status == BATADV_IF_TO_BE_ACTIVATED)
		hard_iface->if_status = BATADV_IF_ACTIVE;

	primary_if = batadv_primary_if_get_selected(bat_priv);
	primary_if = batadv_primary_if_get_selected(bat_priv);


	if (hard_iface == primary_if) {
	if (hard_iface == primary_if) {
@@ -1778,6 +1795,45 @@ static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset,
	batadv_orig_node_put(orig_node);
	batadv_orig_node_put(orig_node);
}
}


static void batadv_iv_send_outstanding_bat_ogm_packet(struct work_struct *work)
{
	struct delayed_work *delayed_work;
	struct batadv_forw_packet *forw_packet;
	struct batadv_priv *bat_priv;

	delayed_work = to_delayed_work(work);
	forw_packet = container_of(delayed_work, struct batadv_forw_packet,
				   delayed_work);
	bat_priv = netdev_priv(forw_packet->if_incoming->soft_iface);
	spin_lock_bh(&bat_priv->forw_bat_list_lock);
	hlist_del(&forw_packet->list);
	spin_unlock_bh(&bat_priv->forw_bat_list_lock);

	if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
		goto out;

	batadv_iv_ogm_emit(forw_packet);

	/* we have to have at least one packet in the queue to determine the
	 * queues wake up time unless we are shutting down.
	 *
	 * only re-schedule if this is the "original" copy, e.g. the OGM of the
	 * primary interface should only be rescheduled once per period, but
	 * this function will be called for the forw_packet instances of the
	 * other secondary interfaces as well.
	 */
	if (forw_packet->own &&
	    forw_packet->if_incoming == forw_packet->if_outgoing)
		batadv_iv_ogm_schedule(forw_packet->if_incoming);

out:
	/* don't count own packet */
	if (!forw_packet->own)
		atomic_inc(&bat_priv->batman_queue_left);

	batadv_forw_packet_free(forw_packet);
}

static int batadv_iv_ogm_receive(struct sk_buff *skb,
static int batadv_iv_ogm_receive(struct sk_buff *skb,
				 struct batadv_hard_iface *if_incoming)
				 struct batadv_hard_iface *if_incoming)
{
{
@@ -1794,7 +1850,8 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
	/* did we receive a B.A.T.M.A.N. IV OGM packet on an interface
	/* did we receive a B.A.T.M.A.N. IV OGM packet on an interface
	 * that does not have B.A.T.M.A.N. IV enabled ?
	 * that does not have B.A.T.M.A.N. IV enabled ?
	 */
	 */
	if (bat_priv->bat_algo_ops->bat_ogm_emit != batadv_iv_ogm_emit)
	if (bat_priv->bat_algo_ops->bat_iface_enable !=
	    batadv_iv_ogm_iface_enable)
		return NET_RX_DROP;
		return NET_RX_DROP;


	batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_RX);
	batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_RX);
@@ -2052,14 +2109,19 @@ batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1,
	return ret;
	return ret;
}
}


static void batadv_iv_iface_activate(struct batadv_hard_iface *hard_iface)
{
	/* begin scheduling originator messages on that interface */
	batadv_iv_ogm_schedule(hard_iface);
}

static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
	.name = "BATMAN_IV",
	.name = "BATMAN_IV",
	.bat_iface_activate = batadv_iv_iface_activate,
	.bat_iface_enable = batadv_iv_ogm_iface_enable,
	.bat_iface_enable = batadv_iv_ogm_iface_enable,
	.bat_iface_disable = batadv_iv_ogm_iface_disable,
	.bat_iface_disable = batadv_iv_ogm_iface_disable,
	.bat_iface_update_mac = batadv_iv_ogm_iface_update_mac,
	.bat_iface_update_mac = batadv_iv_ogm_iface_update_mac,
	.bat_primary_iface_set = batadv_iv_ogm_primary_iface_set,
	.bat_primary_iface_set = batadv_iv_ogm_primary_iface_set,
	.bat_ogm_schedule = batadv_iv_ogm_schedule,
	.bat_ogm_emit = batadv_iv_ogm_emit,
	.bat_neigh_cmp = batadv_iv_ogm_neigh_cmp,
	.bat_neigh_cmp = batadv_iv_ogm_neigh_cmp,
	.bat_neigh_is_similar_or_better = batadv_iv_ogm_neigh_is_sob,
	.bat_neigh_is_similar_or_better = batadv_iv_ogm_neigh_is_sob,
	.bat_neigh_print = batadv_iv_neigh_print,
	.bat_neigh_print = batadv_iv_neigh_print,
+14 −15
Original line number Original line Diff line number Diff line
@@ -70,11 +70,6 @@ static int batadv_v_iface_enable(struct batadv_hard_iface *hard_iface)
	if (ret < 0)
	if (ret < 0)
		batadv_v_elp_iface_disable(hard_iface);
		batadv_v_elp_iface_disable(hard_iface);


	/* enable link throughput auto-detection by setting the throughput
	 * override to zero
	 */
	atomic_set(&hard_iface->bat_v.throughput_override, 0);

	return ret;
	return ret;
}
}


@@ -119,14 +114,6 @@ batadv_v_hardif_neigh_init(struct batadv_hardif_neigh_node *hardif_neigh)
		  batadv_v_elp_throughput_metric_update);
		  batadv_v_elp_throughput_metric_update);
}
}


static void batadv_v_ogm_schedule(struct batadv_hard_iface *hard_iface)
{
}

static void batadv_v_ogm_emit(struct batadv_forw_packet *forw_packet)
{
}

/**
/**
 * batadv_v_orig_print_neigh - print neighbors for the originator table
 * batadv_v_orig_print_neigh - print neighbors for the originator table
 * @orig_node: the orig_node for which the neighbors are printed
 * @orig_node: the orig_node for which the neighbors are printed
@@ -340,14 +327,26 @@ static struct batadv_algo_ops batadv_batman_v __read_mostly = {
	.bat_iface_update_mac = batadv_v_iface_update_mac,
	.bat_iface_update_mac = batadv_v_iface_update_mac,
	.bat_primary_iface_set = batadv_v_primary_iface_set,
	.bat_primary_iface_set = batadv_v_primary_iface_set,
	.bat_hardif_neigh_init = batadv_v_hardif_neigh_init,
	.bat_hardif_neigh_init = batadv_v_hardif_neigh_init,
	.bat_ogm_emit = batadv_v_ogm_emit,
	.bat_ogm_schedule = batadv_v_ogm_schedule,
	.bat_orig_print = batadv_v_orig_print,
	.bat_orig_print = batadv_v_orig_print,
	.bat_neigh_cmp = batadv_v_neigh_cmp,
	.bat_neigh_cmp = batadv_v_neigh_cmp,
	.bat_neigh_is_similar_or_better = batadv_v_neigh_is_sob,
	.bat_neigh_is_similar_or_better = batadv_v_neigh_is_sob,
	.bat_neigh_print = batadv_v_neigh_print,
	.bat_neigh_print = batadv_v_neigh_print,
};
};


/**
 * batadv_v_hardif_init - initialize the algorithm specific fields in the
 *  hard-interface object
 * @hard_iface: the hard-interface to initialize
 */
void batadv_v_hardif_init(struct batadv_hard_iface *hard_iface)
{
	/* enable link throughput auto-detection by setting the throughput
	 * override to zero
	 */
	atomic_set(&hard_iface->bat_v.throughput_override, 0);
	atomic_set(&hard_iface->bat_v.elp_interval, 500);
}

/**
/**
 * batadv_v_mesh_init - initialize the B.A.T.M.A.N. V private resources for a
 * batadv_v_mesh_init - initialize the B.A.T.M.A.N. V private resources for a
 *  mesh
 *  mesh
Loading