summaryrefslogtreecommitdiff
path: root/cesar/cl/src/bridge_table.c
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/cl/src/bridge_table.c')
-rw-r--r--cesar/cl/src/bridge_table.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/cesar/cl/src/bridge_table.c b/cesar/cl/src/bridge_table.c
index 94d96f0cc2..c5bd352e6b 100644
--- a/cesar/cl/src/bridge_table.c
+++ b/cesar/cl/src/bridge_table.c
@@ -146,12 +146,11 @@ bridge_table_update (cl_t *ctx)
/* The temporary local bridge is now empty. */
ctx->bridge_table.table_tmp_entry_count = 0;
- /* Remove old table. */
- if (ctx->bridge_table.table)
- mac_lookup_table_release (ctx->bridge_table.table);
-
- /* Affect new local bridge table. */
+ /* Atomically replace local bridge table. */
+ mac_lookup_table_t *old_table = ctx->bridge_table.table;
ctx->bridge_table.table = mac_lookup_table_convert (new_bridge_table);
+ if (old_table)
+ mac_lookup_table_release (old_table);
/* Bridge table has been modified. */
return true;
@@ -173,12 +172,11 @@ bridge_table_update (cl_t *ctx)
0xFFFF,
ctx->bridge_table.cycle_counter);
- /* Remove old table. */
- mac_lookup_table_release (ctx->bridge_table.table);
-
/* Affect new local bridge table. */
+ mac_lookup_table_t *old_table = ctx->bridge_table.table;
ctx->bridge_table.table
= mac_lookup_table_convert (new_bridge_table);
+ mac_lookup_table_release (old_table);
/* Bridge table has been modified. */
return true;