Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 300586
b: refs/heads/master
c: fe2da6f
h: refs/heads/master
v: v3
  • Loading branch information
Simon Wunderlich authored and Antonio Quartulli committed Apr 11, 2012
1 parent 645e176 commit 9f83d20
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 20ff9d593f8ff20c2ef24498f77a8bc30b3a059a
refs/heads/master: fe2da6ff27c73c1d102ec2189f94e8bc729d1a9b
75 changes: 75 additions & 0 deletions trunk/net/batman-adv/bridge_loop_avoidance.c
Original file line number Diff line number Diff line change
Expand Up @@ -1041,8 +1041,16 @@ static void bla_periodic_work(struct work_struct *work)
/* initialize all bla structures */
int bla_init(struct bat_priv *bat_priv)
{
int i;

bat_dbg(DBG_BLA, bat_priv, "bla hash registering\n");

/* initialize the duplicate list */
for (i = 0; i < DUPLIST_SIZE; i++)
bat_priv->bcast_duplist[i].entrytime =
jiffies - msecs_to_jiffies(DUPLIST_TIMEOUT);
bat_priv->bcast_duplist_curr = 0;

if (bat_priv->claim_hash)
return 1;

Expand All @@ -1058,6 +1066,73 @@ int bla_init(struct bat_priv *bat_priv)
return 1;
}

/**
* @bat_priv: the bat priv with all the soft interface information
* @bcast_packet: originator mac address
* @hdr_size: maximum length of the frame
*
* check if it is on our broadcast list. Another gateway might
* have sent the same packet because it is connected to the same backbone,
* so we have to remove this duplicate.
*
* This is performed by checking the CRC, which will tell us
* with a good chance that it is the same packet. If it is furthermore
* sent by another host, drop it. We allow equal packets from
* the same host however as this might be intended.
*
**/

int bla_check_bcast_duplist(struct bat_priv *bat_priv,
struct bcast_packet *bcast_packet,
int hdr_size)
{
int i, length, curr;
uint8_t *content;
uint16_t crc;
struct bcast_duplist_entry *entry;

length = hdr_size - sizeof(*bcast_packet);
content = (uint8_t *)bcast_packet;
content += sizeof(*bcast_packet);

/* calculate the crc ... */
crc = crc16(0, content, length);

for (i = 0 ; i < DUPLIST_SIZE; i++) {
curr = (bat_priv->bcast_duplist_curr + i) % DUPLIST_SIZE;
entry = &bat_priv->bcast_duplist[curr];

/* we can stop searching if the entry is too old ;
* later entries will be even older
*/
if (has_timed_out(entry->entrytime, DUPLIST_TIMEOUT))
break;

if (entry->crc != crc)
continue;

if (compare_eth(entry->orig, bcast_packet->orig))
continue;

/* this entry seems to match: same crc, not too old,
* and from another gw. therefore return 1 to forbid it.
*/
return 1;
}
/* not found, add a new entry (overwrite the oldest entry) */
curr = (bat_priv->bcast_duplist_curr + DUPLIST_SIZE - 1) % DUPLIST_SIZE;
entry = &bat_priv->bcast_duplist[curr];
entry->crc = crc;
entry->entrytime = jiffies;
memcpy(entry->orig, bcast_packet->orig, ETH_ALEN);
bat_priv->bcast_duplist_curr = curr;

/* allow it, its the first occurence. */
return 0;
}



/**
* @bat_priv: the bat priv with all the soft interface information
* @orig: originator mac address
Expand Down
2 changes: 2 additions & 0 deletions trunk/net/batman-adv/bridge_loop_avoidance.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ 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);
int bla_check_bcast_duplist(struct bat_priv *bat_priv,
struct bcast_packet *bcast_packet, int hdr_size);
void bla_update_orig_address(struct bat_priv *bat_priv,
struct hard_iface *primary_if,
struct hard_iface *oldif);
Expand Down
3 changes: 3 additions & 0 deletions trunk/net/batman-adv/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@
#define BLA_PERIOD_LENGTH 10000 /* 10 seconds */
#define BLA_BACKBONE_TIMEOUT (BLA_PERIOD_LENGTH * 3)
#define BLA_CLAIM_TIMEOUT (BLA_PERIOD_LENGTH * 10)

#define DUPLIST_SIZE 16
#define DUPLIST_TIMEOUT 500 /* 500 ms */
/* don't reset again within 30 seconds */
#define RESET_PROTECTION_MS 30000
#define EXPECTED_SEQNO_RANGE 65536
Expand Down
4 changes: 4 additions & 0 deletions trunk/net/batman-adv/routing.c
Original file line number Diff line number Diff line change
Expand Up @@ -1076,6 +1076,10 @@ int recv_bcast_packet(struct sk_buff *skb, struct hard_iface *recv_if)

spin_unlock_bh(&orig_node->bcast_seqno_lock);

/* check whether this has been sent by another originator before */
if (bla_check_bcast_duplist(bat_priv, bcast_packet, hdr_size))
goto out;

/* rebroadcast packet */
add_bcast_packet_to_list(bat_priv, skb, 1);

Expand Down
7 changes: 7 additions & 0 deletions trunk/net/batman-adv/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,11 @@ struct neigh_node {
spinlock_t tq_lock; /* protects: tq_recv, tq_index */
};

struct bcast_duplist_entry {
uint8_t orig[ETH_ALEN];
uint16_t crc;
unsigned long entrytime;
};

struct bat_priv {
atomic_t mesh_state;
Expand Down Expand Up @@ -186,6 +191,8 @@ struct bat_priv {
struct list_head tt_req_list; /* list of pending tt_requests */
struct list_head tt_roam_list;
struct hashtable_t *vis_hash;
struct bcast_duplist_entry bcast_duplist[DUPLIST_SIZE];
int bcast_duplist_curr;
spinlock_t forw_bat_list_lock; /* protects forw_bat_list */
spinlock_t forw_bcast_list_lock; /* protects */
spinlock_t tt_changes_list_lock; /* protects tt_changes */
Expand Down

0 comments on commit 9f83d20

Please sign in to comment.