Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 300585
b: refs/heads/master
c: 20ff9d5
h: refs/heads/master
i:
  300583: bdfef71
v: v3
  • Loading branch information
Simon Wunderlich authored and Antonio Quartulli committed Apr 11, 2012
1 parent b670cec commit 645e176
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: db08e6e557ebc8ffedf6530693937d0e51b8f6b9
refs/heads/master: 20ff9d593f8ff20c2ef24498f77a8bc30b3a059a
50 changes: 50 additions & 0 deletions trunk/net/batman-adv/bridge_loop_avoidance.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "hard-interface.h"
#include "originator.h"
#include "bridge_loop_avoidance.h"
#include "translation-table.h"
#include "send.h"

#include <linux/etherdevice.h>
Expand Down Expand Up @@ -359,6 +360,7 @@ static struct backbone_gw *bla_get_backbone_gw(struct bat_priv *bat_priv,
uint8_t *orig, short vid)
{
struct backbone_gw *entry;
struct orig_node *orig_node;
int hash_added;

entry = backbone_hash_find(bat_priv, orig, vid);
Expand Down Expand Up @@ -393,6 +395,13 @@ static struct backbone_gw *bla_get_backbone_gw(struct bat_priv *bat_priv,
return NULL;
}

/* this is a gateway now, remove any tt entries */
orig_node = orig_hash_find(bat_priv, orig);
if (orig_node) {
tt_global_del_orig(bat_priv, orig_node,
"became a backbone gateway");
orig_node_free_ref(orig_node);
}
return entry;
}

Expand Down Expand Up @@ -1049,6 +1058,47 @@ int bla_init(struct bat_priv *bat_priv)
return 1;
}

/**
* @bat_priv: the bat priv with all the soft interface information
* @orig: originator mac address
*
* check if the originator is a gateway for any VLAN ID.
*
* returns 1 if it is found, 0 otherwise
*
*/

int bla_is_backbone_gw_orig(struct bat_priv *bat_priv, uint8_t *orig)
{
struct hashtable_t *hash = bat_priv->backbone_hash;
struct hlist_head *head;
struct hlist_node *node;
struct backbone_gw *backbone_gw;
int i;

if (!atomic_read(&bat_priv->bridge_loop_avoidance))
return 0;

if (!hash)
return 0;

for (i = 0; i < hash->size; i++) {
head = &hash->table[i];

rcu_read_lock();
hlist_for_each_entry_rcu(backbone_gw, node, head, hash_entry) {
if (compare_eth(backbone_gw->orig, orig)) {
rcu_read_unlock();
return 1;
}
}
rcu_read_unlock();
}

return 0;
}


/**
* @skb: the frame to be checked
* @orig_node: the orig_node of the frame
Expand Down
1 change: 1 addition & 0 deletions trunk/net/batman-adv/bridge_loop_avoidance.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ int bla_tx(struct bat_priv *bat_priv, struct sk_buff *skb, short vid);
int bla_is_backbone_gw(struct sk_buff *skb,
struct orig_node *orig_node, int hdr_size);
int bla_claim_table_seq_print_text(struct seq_file *seq, void *offset);
int bla_is_backbone_gw_orig(struct bat_priv *bat_priv, uint8_t *orig);
void bla_update_orig_address(struct bat_priv *bat_priv,
struct hard_iface *primary_if,
struct hard_iface *oldif);
Expand Down
7 changes: 7 additions & 0 deletions trunk/net/batman-adv/routing.c
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,13 @@ int recv_roam_adv(struct sk_buff *skb, struct hard_iface *recv_if)
if (!is_my_mac(roam_adv_packet->dst))
return route_unicast_packet(skb, recv_if);

/* check if it is a backbone gateway. we don't accept
* roaming advertisement from it, as it has the same
* entries as we have.
*/
if (bla_is_backbone_gw_orig(bat_priv, roam_adv_packet->src))
goto out;

orig_node = orig_hash_find(bat_priv, roam_adv_packet->src);
if (!orig_node)
goto out;
Expand Down
18 changes: 16 additions & 2 deletions trunk/net/batman-adv/translation-table.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "hash.h"
#include "originator.h"
#include "routing.h"
#include "bridge_loop_avoidance.h"

#include <linux/crc16.h>

Expand Down Expand Up @@ -1615,10 +1616,15 @@ static bool send_my_tt_response(struct bat_priv *bat_priv,
bool send_tt_response(struct bat_priv *bat_priv,
struct tt_query_packet *tt_request)
{
if (is_my_mac(tt_request->dst))
if (is_my_mac(tt_request->dst)) {
/* don't answer backbone gws! */
if (bla_is_backbone_gw_orig(bat_priv, tt_request->src))
return true;

return send_my_tt_response(bat_priv, tt_request);
else
} else {
return send_other_tt_response(bat_priv, tt_request);
}
}

static void _tt_update_changes(struct bat_priv *bat_priv,
Expand Down Expand Up @@ -1722,6 +1728,10 @@ void handle_tt_response(struct bat_priv *bat_priv,
tt_response->src, tt_response->ttvn, tt_response->tt_data,
(tt_response->flags & TT_FULL_TABLE ? 'F' : '.'));

/* we should have never asked a backbone gw */
if (bla_is_backbone_gw_orig(bat_priv, tt_response->src))
goto out;

orig_node = orig_hash_find(bat_priv, tt_response->src);
if (!orig_node)
goto out;
Expand Down Expand Up @@ -2052,6 +2062,10 @@ void tt_update_orig(struct bat_priv *bat_priv, struct orig_node *orig_node,
uint8_t orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
bool full_table = true;

/* don't care about a backbone gateways updates. */
if (bla_is_backbone_gw_orig(bat_priv, orig_node->orig))
return;

/* orig table not initialised AND first diff is in the OGM OR the ttvn
* increased by one -> we can apply the attached changes */
if ((!orig_node->tt_initialised && ttvn == 1) ||
Expand Down

0 comments on commit 645e176

Please sign in to comment.