+/**
+ * @brief Add/delete static BIB entry in worker thread.
+ */
+static uword
+nat64_static_bib_worker_fn (vlib_main_t * vm, vlib_node_runtime_t * rt,
+ vlib_frame_t * f)
+{
+ nat64_main_t *nm = &nat64_main;
+ u32 thread_index = vm->thread_index;
+ nat64_db_t *db = &nm->db[thread_index];
+ nat64_static_bib_to_update_t *static_bib;
+ nat64_db_bib_entry_t *bibe;
+ ip46_address_t addr;
+
+ /* *INDENT-OFF* */
+ pool_foreach (static_bib, nm->static_bibs,
+ ({
+ if ((static_bib->thread_index != thread_index) || (static_bib->done))
+ continue;
+
+ if (static_bib->is_add)
+ {
+ (void) nat64_db_bib_entry_create (thread_index, db,
+ &static_bib->in_addr,
+ &static_bib->out_addr,
+ static_bib->in_port,
+ static_bib->out_port,
+ static_bib->fib_index,
+ static_bib->proto, 1);
+ vlib_set_simple_counter (&nm->total_bibs, thread_index, 0,
+ db->bib.bib_entries_num);
+ }
+ else
+ {
+ addr.as_u64[0] = static_bib->in_addr.as_u64[0];
+ addr.as_u64[1] = static_bib->in_addr.as_u64[1];
+ bibe = nat64_db_bib_entry_find (db, &addr, static_bib->in_port,
+ static_bib->proto,
+ static_bib->fib_index, 1);
+ if (bibe)
+ {
+ nat64_db_bib_entry_free (thread_index, db, bibe);
+ vlib_set_simple_counter (&nm->total_bibs, thread_index, 0,
+ db->bib.bib_entries_num);
+ vlib_set_simple_counter (&nm->total_sessions, thread_index, 0,
+ db->st.st_entries_num);
+ }
+ }
+
+ static_bib->done = 1;
+ }));
+ /* *INDENT-ON* */
+
+ return 0;
+}
+
+static vlib_node_registration_t nat64_static_bib_worker_node;
+
+/* *INDENT-OFF* */
+VLIB_REGISTER_NODE (nat64_static_bib_worker_node, static) = {
+ .function = nat64_static_bib_worker_fn,
+ .type = VLIB_NODE_TYPE_INPUT,
+ .state = VLIB_NODE_STATE_INTERRUPT,
+ .name = "nat64-static-bib-worker",
+};
+/* *INDENT-ON* */
+