mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
batman-adv: add bridge loop avoidance compile option
The define CONFIG_BATMAN_ADV_BLA switches the bridge loop avoidance on - skip it, and the bridge loop avoidance is not compiled in. This is useful if binary size should be saved or the feature is not needed. Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> Signed-off-by: Antonio Quartulli <ordex@autistici.org>
This commit is contained in:
parent
38ef3d1d91
commit
7a5cc24277
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
config BATMAN_ADV
|
config BATMAN_ADV
|
||||||
tristate "B.A.T.M.A.N. Advanced Meshing Protocol"
|
tristate "B.A.T.M.A.N. Advanced Meshing Protocol"
|
||||||
depends on NET && INET
|
depends on NET
|
||||||
select CRC16
|
select CRC16
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
@ -14,6 +14,16 @@ config BATMAN_ADV
|
|||||||
http://www.open-mesh.org/ for more information and user space
|
http://www.open-mesh.org/ for more information and user space
|
||||||
tools.
|
tools.
|
||||||
|
|
||||||
|
config BATMAN_ADV_BLA
|
||||||
|
bool "Bridge Loop Avoidance"
|
||||||
|
depends on BATMAN_ADV && INET
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
This option enables BLA (Bridge Loop Avoidance), a mechanism
|
||||||
|
to avoid Ethernet frames looping when mesh nodes are connected
|
||||||
|
to both the same LAN and the same mesh. If you will never use
|
||||||
|
more than one mesh node in the same LAN, you can safely remove
|
||||||
|
this feature and save some space.
|
||||||
|
|
||||||
config BATMAN_ADV_DEBUG
|
config BATMAN_ADV_DEBUG
|
||||||
bool "B.A.T.M.A.N. debugging"
|
bool "B.A.T.M.A.N. debugging"
|
||||||
|
@ -23,7 +23,7 @@ batman-adv-y += bat_debugfs.o
|
|||||||
batman-adv-y += bat_iv_ogm.o
|
batman-adv-y += bat_iv_ogm.o
|
||||||
batman-adv-y += bat_sysfs.o
|
batman-adv-y += bat_sysfs.o
|
||||||
batman-adv-y += bitarray.o
|
batman-adv-y += bitarray.o
|
||||||
batman-adv-y += bridge_loop_avoidance.o
|
batman-adv-$(CONFIG_BATMAN_ADV_BLA) += bridge_loop_avoidance.o
|
||||||
batman-adv-y += gateway_client.o
|
batman-adv-y += gateway_client.o
|
||||||
batman-adv-y += gateway_common.o
|
batman-adv-y += gateway_common.o
|
||||||
batman-adv-y += hard-interface.o
|
batman-adv-y += hard-interface.o
|
||||||
|
@ -245,12 +245,13 @@ static int transtable_global_open(struct inode *inode, struct file *file)
|
|||||||
return single_open(file, tt_global_seq_print_text, net_dev);
|
return single_open(file, tt_global_seq_print_text, net_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
static int bla_claim_table_open(struct inode *inode, struct file *file)
|
static int bla_claim_table_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||||
return single_open(file, bla_claim_table_seq_print_text, net_dev);
|
return single_open(file, bla_claim_table_seq_print_text, net_dev);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int transtable_local_open(struct inode *inode, struct file *file)
|
static int transtable_local_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
@ -285,7 +286,9 @@ static BAT_DEBUGINFO(routing_algos, S_IRUGO, bat_algorithms_open);
|
|||||||
static BAT_DEBUGINFO(originators, S_IRUGO, originators_open);
|
static BAT_DEBUGINFO(originators, S_IRUGO, originators_open);
|
||||||
static BAT_DEBUGINFO(gateways, S_IRUGO, gateways_open);
|
static BAT_DEBUGINFO(gateways, S_IRUGO, gateways_open);
|
||||||
static BAT_DEBUGINFO(transtable_global, S_IRUGO, transtable_global_open);
|
static BAT_DEBUGINFO(transtable_global, S_IRUGO, transtable_global_open);
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
static BAT_DEBUGINFO(bla_claim_table, S_IRUGO, bla_claim_table_open);
|
static BAT_DEBUGINFO(bla_claim_table, S_IRUGO, bla_claim_table_open);
|
||||||
|
#endif
|
||||||
static BAT_DEBUGINFO(transtable_local, S_IRUGO, transtable_local_open);
|
static BAT_DEBUGINFO(transtable_local, S_IRUGO, transtable_local_open);
|
||||||
static BAT_DEBUGINFO(vis_data, S_IRUGO, vis_data_open);
|
static BAT_DEBUGINFO(vis_data, S_IRUGO, vis_data_open);
|
||||||
|
|
||||||
@ -293,7 +296,9 @@ static struct bat_debuginfo *mesh_debuginfos[] = {
|
|||||||
&bat_debuginfo_originators,
|
&bat_debuginfo_originators,
|
||||||
&bat_debuginfo_gateways,
|
&bat_debuginfo_gateways,
|
||||||
&bat_debuginfo_transtable_global,
|
&bat_debuginfo_transtable_global,
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
&bat_debuginfo_bla_claim_table,
|
&bat_debuginfo_bla_claim_table,
|
||||||
|
#endif
|
||||||
&bat_debuginfo_transtable_local,
|
&bat_debuginfo_transtable_local,
|
||||||
&bat_debuginfo_vis_data,
|
&bat_debuginfo_vis_data,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -386,7 +386,9 @@ static ssize_t store_gw_bwidth(struct kobject *kobj, struct attribute *attr,
|
|||||||
|
|
||||||
BAT_ATTR_BOOL(aggregated_ogms, S_IRUGO | S_IWUSR, NULL);
|
BAT_ATTR_BOOL(aggregated_ogms, S_IRUGO | S_IWUSR, NULL);
|
||||||
BAT_ATTR_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
|
BAT_ATTR_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
BAT_ATTR_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR, NULL);
|
BAT_ATTR_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR, NULL);
|
||||||
|
#endif
|
||||||
BAT_ATTR_BOOL(fragmentation, S_IRUGO | S_IWUSR, update_min_mtu);
|
BAT_ATTR_BOOL(fragmentation, S_IRUGO | S_IWUSR, update_min_mtu);
|
||||||
BAT_ATTR_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL);
|
BAT_ATTR_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL);
|
||||||
static BAT_ATTR(vis_mode, S_IRUGO | S_IWUSR, show_vis_mode, store_vis_mode);
|
static BAT_ATTR(vis_mode, S_IRUGO | S_IWUSR, show_vis_mode, store_vis_mode);
|
||||||
@ -405,7 +407,9 @@ BAT_ATTR_UINT(log_level, S_IRUGO | S_IWUSR, 0, 15, NULL);
|
|||||||
static struct bat_attribute *mesh_attrs[] = {
|
static struct bat_attribute *mesh_attrs[] = {
|
||||||
&bat_attr_aggregated_ogms,
|
&bat_attr_aggregated_ogms,
|
||||||
&bat_attr_bonding,
|
&bat_attr_bonding,
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
&bat_attr_bridge_loop_avoidance,
|
&bat_attr_bridge_loop_avoidance,
|
||||||
|
#endif
|
||||||
&bat_attr_fragmentation,
|
&bat_attr_fragmentation,
|
||||||
&bat_attr_ap_isolation,
|
&bat_attr_ap_isolation,
|
||||||
&bat_attr_vis_mode,
|
&bat_attr_vis_mode,
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#ifndef _NET_BATMAN_ADV_BLA_H_
|
#ifndef _NET_BATMAN_ADV_BLA_H_
|
||||||
#define _NET_BATMAN_ADV_BLA_H_
|
#define _NET_BATMAN_ADV_BLA_H_
|
||||||
|
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
int bla_rx(struct bat_priv *bat_priv, struct sk_buff *skb, short vid);
|
int bla_rx(struct bat_priv *bat_priv, struct sk_buff *skb, short vid);
|
||||||
int bla_tx(struct bat_priv *bat_priv, struct sk_buff *skb, short vid);
|
int bla_tx(struct bat_priv *bat_priv, struct sk_buff *skb, short vid);
|
||||||
int bla_is_backbone_gw(struct sk_buff *skb,
|
int bla_is_backbone_gw(struct sk_buff *skb,
|
||||||
@ -37,5 +38,61 @@ int bla_init(struct bat_priv *bat_priv);
|
|||||||
void bla_free(struct bat_priv *bat_priv);
|
void bla_free(struct bat_priv *bat_priv);
|
||||||
|
|
||||||
#define BLA_CRC_INIT 0
|
#define BLA_CRC_INIT 0
|
||||||
|
#else /* ifdef CONFIG_BATMAN_ADV_BLA */
|
||||||
|
|
||||||
|
static inline int bla_rx(struct bat_priv *bat_priv, struct sk_buff *skb,
|
||||||
|
short vid)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int bla_tx(struct bat_priv *bat_priv, struct sk_buff *skb,
|
||||||
|
short vid)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int bla_is_backbone_gw(struct sk_buff *skb,
|
||||||
|
struct orig_node *orig_node,
|
||||||
|
int hdr_size)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int bla_claim_table_seq_print_text(struct seq_file *seq,
|
||||||
|
void *offset)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int bla_is_backbone_gw_orig(struct bat_priv *bat_priv,
|
||||||
|
uint8_t *orig)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int bla_check_bcast_duplist(struct bat_priv *bat_priv,
|
||||||
|
struct bcast_packet *bcast_packet,
|
||||||
|
int hdr_size)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void bla_update_orig_address(struct bat_priv *bat_priv,
|
||||||
|
struct hard_iface *primary_if,
|
||||||
|
struct hard_iface *oldif)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int bla_init(struct bat_priv *bat_priv)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void bla_free(struct bat_priv *bat_priv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ifdef CONFIG_BATMAN_ADV_BLA */
|
||||||
|
|
||||||
#endif /* ifndef _NET_BATMAN_ADV_BLA_H_ */
|
#endif /* ifndef _NET_BATMAN_ADV_BLA_H_ */
|
||||||
|
@ -134,7 +134,7 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)
|
|||||||
0x00};
|
0x00};
|
||||||
unsigned int header_len = 0;
|
unsigned int header_len = 0;
|
||||||
int data_len = skb->len, ret;
|
int data_len = skb->len, ret;
|
||||||
short vid = -1;
|
short vid __maybe_unused = -1;
|
||||||
bool do_bcast = false;
|
bool do_bcast = false;
|
||||||
|
|
||||||
if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE)
|
if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE)
|
||||||
@ -256,7 +256,7 @@ void interface_rx(struct net_device *soft_iface,
|
|||||||
struct bat_priv *bat_priv = netdev_priv(soft_iface);
|
struct bat_priv *bat_priv = netdev_priv(soft_iface);
|
||||||
struct ethhdr *ethhdr;
|
struct ethhdr *ethhdr;
|
||||||
struct vlan_ethhdr *vhdr;
|
struct vlan_ethhdr *vhdr;
|
||||||
short vid = -1;
|
short vid __maybe_unused = -1;
|
||||||
|
|
||||||
/* check if enough space is available for pulling, and pull */
|
/* check if enough space is available for pulling, and pull */
|
||||||
if (!pskb_may_pull(skb, hdr_size))
|
if (!pskb_may_pull(skb, hdr_size))
|
||||||
|
@ -140,11 +140,13 @@ struct neigh_node {
|
|||||||
spinlock_t tq_lock; /* protects: tq_recv, tq_index */
|
spinlock_t tq_lock; /* protects: tq_recv, tq_index */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
struct bcast_duplist_entry {
|
struct bcast_duplist_entry {
|
||||||
uint8_t orig[ETH_ALEN];
|
uint8_t orig[ETH_ALEN];
|
||||||
uint16_t crc;
|
uint16_t crc;
|
||||||
unsigned long entrytime;
|
unsigned long entrytime;
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
struct bat_priv {
|
struct bat_priv {
|
||||||
atomic_t mesh_state;
|
atomic_t mesh_state;
|
||||||
@ -186,14 +188,18 @@ struct bat_priv {
|
|||||||
struct hashtable_t *orig_hash;
|
struct hashtable_t *orig_hash;
|
||||||
struct hashtable_t *tt_local_hash;
|
struct hashtable_t *tt_local_hash;
|
||||||
struct hashtable_t *tt_global_hash;
|
struct hashtable_t *tt_global_hash;
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
struct hashtable_t *claim_hash;
|
struct hashtable_t *claim_hash;
|
||||||
struct hashtable_t *backbone_hash;
|
struct hashtable_t *backbone_hash;
|
||||||
|
#endif
|
||||||
struct list_head tt_req_list; /* list of pending tt_requests */
|
struct list_head tt_req_list; /* list of pending tt_requests */
|
||||||
struct list_head tt_roam_list;
|
struct list_head tt_roam_list;
|
||||||
struct hashtable_t *vis_hash;
|
struct hashtable_t *vis_hash;
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
struct bcast_duplist_entry bcast_duplist[DUPLIST_SIZE];
|
struct bcast_duplist_entry bcast_duplist[DUPLIST_SIZE];
|
||||||
int bcast_duplist_curr;
|
int bcast_duplist_curr;
|
||||||
struct bla_claim_dst claim_dest;
|
struct bla_claim_dst claim_dest;
|
||||||
|
#endif
|
||||||
spinlock_t forw_bat_list_lock; /* protects forw_bat_list */
|
spinlock_t forw_bat_list_lock; /* protects forw_bat_list */
|
||||||
spinlock_t forw_bcast_list_lock; /* protects */
|
spinlock_t forw_bcast_list_lock; /* protects */
|
||||||
spinlock_t tt_changes_list_lock; /* protects tt_changes */
|
spinlock_t tt_changes_list_lock; /* protects tt_changes */
|
||||||
@ -261,6 +267,7 @@ struct tt_orig_list_entry {
|
|||||||
struct hlist_node list;
|
struct hlist_node list;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
struct backbone_gw {
|
struct backbone_gw {
|
||||||
uint8_t orig[ETH_ALEN];
|
uint8_t orig[ETH_ALEN];
|
||||||
short vid; /* used VLAN ID */
|
short vid; /* used VLAN ID */
|
||||||
@ -282,6 +289,7 @@ struct claim {
|
|||||||
atomic_t refcount;
|
atomic_t refcount;
|
||||||
struct hlist_node hash_entry;
|
struct hlist_node hash_entry;
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
struct tt_change_node {
|
struct tt_change_node {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user