Commit 7a5cc242 authored by Simon Wunderlich's avatar Simon Wunderlich Committed by Antonio Quartulli

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: default avatarSimon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: default avatarAntonio Quartulli <ordex@autistici.org>
parent 38ef3d1d
...@@ -4,7 +4,7 @@ ...@@ -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 ...@@ -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 ...@@ -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) ...@@ -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); ...@@ -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[] = { ...@@ -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, ...@@ -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); ...@@ -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 @@ ...@@ -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); ...@@ -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) ...@@ -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, ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment