summaryrefslogtreecommitdiffstats
path: root/src/vnet/l2/l2_learn.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/l2/l2_learn.c')
-rw-r--r--src/vnet/l2/l2_learn.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/vnet/l2/l2_learn.c b/src/vnet/l2/l2_learn.c
index 6f2201b3ade..3b9b1dbcaa9 100644
--- a/src/vnet/l2/l2_learn.c
+++ b/src/vnet/l2/l2_learn.c
@@ -119,6 +119,8 @@ l2learn_process (vlib_node_runtime_t * node,
u32 * count,
l2fib_entry_result_t * result0, u16 * next0, u8 timestamp)
{
+ l2_bridge_domain_t *bd_config =
+ vec_elt_at_index (l2input_main.bd_configs, vnet_buffer (b0)->l2.bd_index);
/* Set up the default next node (typically L2FWD) */
*next0 = vnet_l2_feature_next (b0, msm->feat_next_node_index,
L2INPUT_FEAT_LEARN);
@@ -137,6 +139,8 @@ l2learn_process (vlib_node_runtime_t * node,
return; /* Static MAC always age_not */
if (msm->global_learn_count > msm->global_learn_limit)
return; /* Above learn limit - do not update */
+ if (bd_config->learn_count > bd_config->learn_limit)
+ return; /* Above bridge domain learn limit - do not update */
/* Limit updates per l2-learn node call to avoid prolonged update burst
* as dtime advance over 1 minute mark, unless more than 1 min behind
@@ -152,7 +156,8 @@ l2learn_process (vlib_node_runtime_t * node,
/* Entry not in L2FIB - add it */
counter_base[L2LEARN_ERROR_MISS] += 1;
- if (msm->global_learn_count >= msm->global_learn_limit)
+ if ((msm->global_learn_count >= msm->global_learn_limit) ||
+ (bd_config->learn_count >= bd_config->learn_limit))
{
/*
* Global limit reached. Do not learn the mac but forward the packet.
@@ -169,7 +174,11 @@ l2learn_process (vlib_node_runtime_t * node,
return;
/* It is ok to learn */
+ /* learn_count variable may have little inaccuracy because they are not
+ * incremented/decremented with atomic operations */
+ /* l2fib_scan is call every 2sec fixing potential inaccuracy */
msm->global_learn_count++;
+ bd_config->learn_count++;
result0->raw = 0; /* clear all fields */
result0->fields.sw_if_index = sw_if_index0;
if (msm->client_pid != 0)
@@ -208,7 +217,12 @@ l2learn_process (vlib_node_runtime_t * node,
if (l2fib_entry_result_is_set_AGE_NOT (result0))
{
/* The mac was provisioned */
+ /* learn_count variable may have little inaccuracy because they are
+ * not incremented/decremented with atomic operations */
+ /* l2fib_scan is call every 2sec fixing potential inaccuracy */
msm->global_learn_count++;
+ bd_config->learn_count++;
+
l2fib_entry_result_clear_AGE_NOT (result0);
}
if (msm->client_pid != 0)
@@ -470,6 +484,11 @@ l2learn_init (vlib_main_t * vm)
*/
mp->global_learn_limit = L2LEARN_DEFAULT_LIMIT;
+ /*
+ * Set the default number of dynamically learned macs to the number
+ * of buckets.
+ */
+ mp->bd_default_learn_limit = L2LEARN_DEFAULT_LIMIT;
return 0;
}