batman-adv: tvlv - add network coding container
Create network coding container to announce network coding capabilities (if enabled). Signed-off-by: Marek Lindner <lindner_marek@yahoo.de> Signed-off-by: Antonio Quartulli <antonio@meshcoding.com>
This commit is contained in:
parent
17cf0ea455
commit
3f4841ffb3
5 changed files with 75 additions and 1 deletions
|
@ -58,6 +58,59 @@ static void batadv_nc_start_timer(struct batadv_priv *bat_priv)
|
||||||
msecs_to_jiffies(10));
|
msecs_to_jiffies(10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* batadv_nc_tvlv_container_update - update the network coding tvlv container
|
||||||
|
* after network coding setting change
|
||||||
|
* @bat_priv: the bat priv with all the soft interface information
|
||||||
|
*/
|
||||||
|
static void batadv_nc_tvlv_container_update(struct batadv_priv *bat_priv)
|
||||||
|
{
|
||||||
|
char nc_mode;
|
||||||
|
|
||||||
|
nc_mode = atomic_read(&bat_priv->network_coding);
|
||||||
|
|
||||||
|
switch (nc_mode) {
|
||||||
|
case 0:
|
||||||
|
batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_NC, 1);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
batadv_tvlv_container_register(bat_priv, BATADV_TVLV_NC, 1,
|
||||||
|
NULL, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* batadv_nc_status_update - update the network coding tvlv container after
|
||||||
|
* network coding setting change
|
||||||
|
* @net_dev: the soft interface net device
|
||||||
|
*/
|
||||||
|
void batadv_nc_status_update(struct net_device *net_dev)
|
||||||
|
{
|
||||||
|
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||||
|
batadv_nc_tvlv_container_update(bat_priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* batadv_nc_tvlv_ogm_handler_v1 - process incoming nc tvlv container
|
||||||
|
* @bat_priv: the bat priv with all the soft interface information
|
||||||
|
* @orig: the orig_node of the ogm
|
||||||
|
* @flags: flags indicating the tvlv state (see batadv_tvlv_handler_flags)
|
||||||
|
* @tvlv_value: tvlv buffer containing the gateway data
|
||||||
|
* @tvlv_value_len: tvlv buffer length
|
||||||
|
*/
|
||||||
|
static void batadv_nc_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
|
||||||
|
struct batadv_orig_node *orig,
|
||||||
|
uint8_t flags,
|
||||||
|
void *tvlv_value,
|
||||||
|
uint16_t tvlv_value_len)
|
||||||
|
{
|
||||||
|
if (flags & BATADV_TVLV_HANDLER_OGM_CIFNOTFND)
|
||||||
|
orig->capabilities &= ~BATADV_ORIG_CAPA_HAS_NC;
|
||||||
|
else
|
||||||
|
orig->capabilities |= BATADV_ORIG_CAPA_HAS_NC;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* batadv_nc_mesh_init - initialise coding hash table and start house keeping
|
* batadv_nc_mesh_init - initialise coding hash table and start house keeping
|
||||||
* @bat_priv: the bat priv with all the soft interface information
|
* @bat_priv: the bat priv with all the soft interface information
|
||||||
|
@ -87,6 +140,10 @@ int batadv_nc_mesh_init(struct batadv_priv *bat_priv)
|
||||||
INIT_DELAYED_WORK(&bat_priv->nc.work, batadv_nc_worker);
|
INIT_DELAYED_WORK(&bat_priv->nc.work, batadv_nc_worker);
|
||||||
batadv_nc_start_timer(bat_priv);
|
batadv_nc_start_timer(bat_priv);
|
||||||
|
|
||||||
|
batadv_tvlv_handler_register(bat_priv, batadv_nc_tvlv_ogm_handler_v1,
|
||||||
|
NULL, BATADV_TVLV_NC, 1,
|
||||||
|
BATADV_TVLV_HANDLER_OGM_CIFNOTFND);
|
||||||
|
batadv_nc_tvlv_container_update(bat_priv);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
@ -802,6 +859,10 @@ void batadv_nc_update_nc_node(struct batadv_priv *bat_priv,
|
||||||
if (!atomic_read(&bat_priv->network_coding))
|
if (!atomic_read(&bat_priv->network_coding))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
/* check if orig node is network coding enabled */
|
||||||
|
if (!(orig_node->capabilities & BATADV_ORIG_CAPA_HAS_NC))
|
||||||
|
goto out;
|
||||||
|
|
||||||
/* accept ogms from 'good' neighbors and single hop neighbors */
|
/* accept ogms from 'good' neighbors and single hop neighbors */
|
||||||
if (!batadv_can_nc_with_orig(bat_priv, orig_node, ogm_packet) &&
|
if (!batadv_can_nc_with_orig(bat_priv, orig_node, ogm_packet) &&
|
||||||
!is_single_hop_neigh)
|
!is_single_hop_neigh)
|
||||||
|
@ -1735,6 +1796,8 @@ static int batadv_nc_recv_coded_packet(struct sk_buff *skb,
|
||||||
*/
|
*/
|
||||||
void batadv_nc_mesh_free(struct batadv_priv *bat_priv)
|
void batadv_nc_mesh_free(struct batadv_priv *bat_priv)
|
||||||
{
|
{
|
||||||
|
batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_NC, 1);
|
||||||
|
batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_NC, 1);
|
||||||
cancel_delayed_work_sync(&bat_priv->nc.work);
|
cancel_delayed_work_sync(&bat_priv->nc.work);
|
||||||
|
|
||||||
batadv_nc_purge_paths(bat_priv, bat_priv->nc.coding_hash, NULL);
|
batadv_nc_purge_paths(bat_priv, bat_priv->nc.coding_hash, NULL);
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#ifdef CONFIG_BATMAN_ADV_NC
|
#ifdef CONFIG_BATMAN_ADV_NC
|
||||||
|
|
||||||
|
void batadv_nc_status_update(struct net_device *net_dev);
|
||||||
int batadv_nc_init(void);
|
int batadv_nc_init(void);
|
||||||
int batadv_nc_mesh_init(struct batadv_priv *bat_priv);
|
int batadv_nc_mesh_init(struct batadv_priv *bat_priv);
|
||||||
void batadv_nc_mesh_free(struct batadv_priv *bat_priv);
|
void batadv_nc_mesh_free(struct batadv_priv *bat_priv);
|
||||||
|
@ -47,6 +48,10 @@ int batadv_nc_init_debugfs(struct batadv_priv *bat_priv);
|
||||||
|
|
||||||
#else /* ifdef CONFIG_BATMAN_ADV_NC */
|
#else /* ifdef CONFIG_BATMAN_ADV_NC */
|
||||||
|
|
||||||
|
static inline void batadv_nc_status_update(struct net_device *net_dev)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static inline int batadv_nc_init(void)
|
static inline int batadv_nc_init(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -122,10 +122,12 @@ enum batadv_bla_claimframe {
|
||||||
* enum batadv_tvlv_type - tvlv type definitions
|
* enum batadv_tvlv_type - tvlv type definitions
|
||||||
* @BATADV_TVLV_GW: gateway tvlv
|
* @BATADV_TVLV_GW: gateway tvlv
|
||||||
* @BATADV_TVLV_DAT: distributed arp table tvlv
|
* @BATADV_TVLV_DAT: distributed arp table tvlv
|
||||||
|
* @BATADV_TVLV_NC: network coding tvlv
|
||||||
*/
|
*/
|
||||||
enum batadv_tvlv_type {
|
enum batadv_tvlv_type {
|
||||||
BATADV_TVLV_GW = 0x01,
|
BATADV_TVLV_GW = 0x01,
|
||||||
BATADV_TVLV_DAT = 0x02,
|
BATADV_TVLV_DAT = 0x02,
|
||||||
|
BATADV_TVLV_NC = 0x03,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* the destination hardware field in the ARP frame is used to
|
/* the destination hardware field in the ARP frame is used to
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "sysfs.h"
|
#include "sysfs.h"
|
||||||
#include "translation-table.h"
|
#include "translation-table.h"
|
||||||
#include "distributed-arp-table.h"
|
#include "distributed-arp-table.h"
|
||||||
|
#include "network-coding.h"
|
||||||
#include "originator.h"
|
#include "originator.h"
|
||||||
#include "hard-interface.h"
|
#include "hard-interface.h"
|
||||||
#include "gateway_common.h"
|
#include "gateway_common.h"
|
||||||
|
@ -447,7 +448,8 @@ static BATADV_ATTR(gw_bandwidth, S_IRUGO | S_IWUSR, batadv_show_gw_bwidth,
|
||||||
BATADV_ATTR_SIF_UINT(log_level, S_IRUGO | S_IWUSR, 0, BATADV_DBG_ALL, NULL);
|
BATADV_ATTR_SIF_UINT(log_level, S_IRUGO | S_IWUSR, 0, BATADV_DBG_ALL, NULL);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_BATMAN_ADV_NC
|
#ifdef CONFIG_BATMAN_ADV_NC
|
||||||
BATADV_ATTR_SIF_BOOL(network_coding, S_IRUGO | S_IWUSR, NULL);
|
BATADV_ATTR_SIF_BOOL(network_coding, S_IRUGO | S_IWUSR,
|
||||||
|
batadv_nc_status_update);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct batadv_attribute *batadv_mesh_attrs[] = {
|
static struct batadv_attribute *batadv_mesh_attrs[] = {
|
||||||
|
|
|
@ -188,9 +188,11 @@ struct batadv_orig_node {
|
||||||
/**
|
/**
|
||||||
* enum batadv_orig_capabilities - orig node capabilities
|
* enum batadv_orig_capabilities - orig node capabilities
|
||||||
* @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table enabled
|
* @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table enabled
|
||||||
|
* @BATADV_ORIG_CAPA_HAS_NC: orig node has network coding enabled
|
||||||
*/
|
*/
|
||||||
enum batadv_orig_capabilities {
|
enum batadv_orig_capabilities {
|
||||||
BATADV_ORIG_CAPA_HAS_DAT = BIT(0),
|
BATADV_ORIG_CAPA_HAS_DAT = BIT(0),
|
||||||
|
BATADV_ORIG_CAPA_HAS_NC = BIT(1),
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue