To use network coding efficiently, a relay must know when neighbor nodes are likely to have enough information to be able to decode a network coded packet. This is detected by using OGMs from batman-adv to discover when one neighbor is in range of another neighbor. The relay check the TLL to detect when an OGM is forwarded from one neighbor by another neighbor, and thereby knows that the two neighbors are in range and thus overhear packets sent by each other. This information is saved in the orig_node struct to be used when searching for coding opportunities. Two lists are added to the orig_node struct: One for neighbors that can hear the orig_node (outgoing nc_nodes) and one for neighbors that the orig_node can hear (incoming nc_nodes). Information about nc_nodes is kept for 10 seconds and is available through debugfs in batman_adv/nc_nodes to use when debugging network coding. Signed-off-by: Martin Hundebøll <martin@hundeboll.net> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de> Signed-off-by: Antonio Quartulli <ordex@autistici.org>
95 lines
2.7 KiB
C
95 lines
2.7 KiB
C
/* Copyright (C) 2012-2013 B.A.T.M.A.N. contributors:
|
|
*
|
|
* Martin Hundebøll, Jeppe Ledet-Pedersen
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of version 2 of the GNU General Public
|
|
* License as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301, USA
|
|
*/
|
|
|
|
#ifndef _NET_BATMAN_ADV_NETWORK_CODING_H_
|
|
#define _NET_BATMAN_ADV_NETWORK_CODING_H_
|
|
|
|
#ifdef CONFIG_BATMAN_ADV_NC
|
|
|
|
int batadv_nc_init(struct batadv_priv *bat_priv);
|
|
void batadv_nc_free(struct batadv_priv *bat_priv);
|
|
void batadv_nc_update_nc_node(struct batadv_priv *bat_priv,
|
|
struct batadv_orig_node *orig_node,
|
|
struct batadv_orig_node *orig_neigh_node,
|
|
struct batadv_ogm_packet *ogm_packet,
|
|
int is_single_hop_neigh);
|
|
void batadv_nc_purge_orig(struct batadv_priv *bat_priv,
|
|
struct batadv_orig_node *orig_node,
|
|
bool (*to_purge)(struct batadv_priv *,
|
|
struct batadv_nc_node *));
|
|
void batadv_nc_init_bat_priv(struct batadv_priv *bat_priv);
|
|
void batadv_nc_init_orig(struct batadv_orig_node *orig_node);
|
|
int batadv_nc_nodes_seq_print_text(struct seq_file *seq, void *offset);
|
|
int batadv_nc_init_debugfs(struct batadv_priv *bat_priv);
|
|
|
|
#else /* ifdef CONFIG_BATMAN_ADV_NC */
|
|
|
|
static inline int batadv_nc_init(struct batadv_priv *bat_priv)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void batadv_nc_free(struct batadv_priv *bat_priv)
|
|
{
|
|
return;
|
|
}
|
|
|
|
static inline void
|
|
batadv_nc_update_nc_node(struct batadv_priv *bat_priv,
|
|
struct batadv_orig_node *orig_node,
|
|
struct batadv_orig_node *orig_neigh_node,
|
|
struct batadv_ogm_packet *ogm_packet,
|
|
int is_single_hop_neigh)
|
|
{
|
|
return;
|
|
}
|
|
|
|
static inline void
|
|
batadv_nc_purge_orig(struct batadv_priv *bat_priv,
|
|
struct batadv_orig_node *orig_node,
|
|
bool (*to_purge)(struct batadv_priv *,
|
|
struct batadv_nc_node *))
|
|
{
|
|
return;
|
|
}
|
|
|
|
static inline void batadv_nc_init_bat_priv(struct batadv_priv *bat_priv)
|
|
{
|
|
return;
|
|
}
|
|
|
|
static inline void batadv_nc_init_orig(struct batadv_orig_node *orig_node)
|
|
{
|
|
return;
|
|
}
|
|
|
|
static inline int batadv_nc_nodes_seq_print_text(struct seq_file *seq,
|
|
void *offset)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int batadv_nc_init_debugfs(struct batadv_priv *bat_priv)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
#endif /* ifdef CONFIG_BATMAN_ADV_NC */
|
|
|
|
#endif /* _NET_BATMAN_ADV_NETWORK_CODING_H_ */
|