Commit 28709878b6a7d15362ba63bde01d42c38f88be9d

Authored by Simon Wunderlich
Committed by Antonio Quartulli
1 parent d807f27287

batman-adv: wait multiple periods before activating bla

For some reasons (bridge forward delay, network device setup order, etc)
the initial bridge loop avoidance announcement packets may be lost. This
may lead to problems in finding other backbone gws, and therfore create
loops in the startup time.

Fix this by extending the waiting periods to 3 (define can be changed)
before allowing broadcast traffic.

Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Antonio Quartulli <ordex@autistici.org>

Showing 3 changed files with 10 additions and 1 deletions Side-by-side Diff

net/batman-adv/bridge_loop_avoidance.c
... ... @@ -378,6 +378,7 @@
378 378 entry->crc = BATADV_BLA_CRC_INIT;
379 379 entry->bat_priv = bat_priv;
380 380 atomic_set(&entry->request_sent, 0);
  381 + atomic_set(&entry->wait_periods, 0);
381 382 memcpy(entry->orig, orig, ETH_ALEN);
382 383  
383 384 /* one for the hash, one for returning */
... ... @@ -407,6 +408,7 @@
407 408  
408 409 /* this will be decreased in the worker thread */
409 410 atomic_inc(&entry->request_sent);
  411 + atomic_set(&entry->wait_periods, BATADV_BLA_WAIT_PERIODS);
410 412 atomic_inc(&bat_priv->bla.num_requests);
411 413 }
412 414  
413 415  
... ... @@ -1148,10 +1150,15 @@
1148 1150 * problems when we are not yet known as backbone gw
1149 1151 * in the backbone.
1150 1152 *
1151   - * We can reset this now and allow traffic again.
  1153 + * We can reset this now after we waited some periods
  1154 + * to give bridge forward delays and bla group forming
  1155 + * some grace time.
1152 1156 */
1153 1157  
1154 1158 if (atomic_read(&backbone_gw->request_sent) == 0)
  1159 + continue;
  1160 +
  1161 + if (!atomic_dec_and_test(&backbone_gw->wait_periods))
1155 1162 continue;
1156 1163  
1157 1164 atomic_dec(&backbone_gw->bat_priv->bla.num_requests);
net/batman-adv/main.h
... ... @@ -95,6 +95,7 @@
95 95 #define BATADV_BLA_PERIOD_LENGTH 10000 /* 10 seconds */
96 96 #define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 3)
97 97 #define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10)
  98 +#define BATADV_BLA_WAIT_PERIODS 3
98 99  
99 100 #define BATADV_DUPLIST_SIZE 16
100 101 #define BATADV_DUPLIST_TIMEOUT 500 /* 500 ms */
net/batman-adv/types.h
... ... @@ -369,6 +369,7 @@
369 369 struct hlist_node hash_entry;
370 370 struct batadv_priv *bat_priv;
371 371 unsigned long lasttime; /* last time we heard of this backbone gw */
  372 + atomic_t wait_periods;
372 373 atomic_t request_sent;
373 374 atomic_t refcount;
374 375 struct rcu_head rcu;