21 #include <vpp/app/version.h> 29 .arc_name =
"ip6-unicast",
30 .node_name =
"nat66-in2out",
35 .arc_name =
"ip6-unicast",
36 .node_name =
"nat66-out2in",
43 #define fail_if_enabled() \ 46 nat66_main_t *nm = &nat66_main; \ 47 if (PREDICT_FALSE (nm->enabled)) \ 49 nat66_elog_warn ("plugin enabled"); \ 55 #define fail_if_disabled() \ 58 nat66_main_t *nm = &nat66_main; \ 59 if (PREDICT_FALSE (!nm->enabled)) \ 61 nat66_elog_warn ("plugin disabled"); \ 90 u32 static_mapping_buckets = 1024;
91 uword static_mapping_memory_size = 64 << 20;
95 clib_bihash_init_24_8 (&nm->
sm_l,
"nat66-static-map-by-local",
96 static_mapping_buckets, static_mapping_memory_size);
97 clib_bihash_init_24_8 (&nm->
sm_e,
"nat66-static-map-by-external",
98 static_mapping_buckets, static_mapping_memory_size);
132 clib_bihash_free_24_8 (&nm->
sm_l);
133 clib_bihash_free_24_8 (&nm->
sm_e);
160 const char *feature_name;
166 if (i->sw_if_index == sw_if_index)
176 return VNET_API_ERROR_VALUE_EXIST;
188 return VNET_API_ERROR_NO_SUCH_ENTRY;
193 feature_name = is_inside ?
"nat66-in2out" :
"nat66-out2in";
198 sw_if_index, is_add, 0, 0);
222 sm_key.
addr.as_u64[0] = addr->as_u64[0];
223 sm_key.
addr.as_u64[1] = addr->as_u64[1];
231 if (!clib_bihash_search_24_8
232 (is_local ? &nm->
sm_l : &nm->
sm_e, &kv, &value))
251 sm_key.
addr.as_u64[0] = l_addr->as_u64[0];
252 sm_key.
addr.as_u64[1] = l_addr->as_u64[1];
259 if (!clib_bihash_search_24_8 (&nm->
sm_l, &kv, &value))
265 return VNET_API_ERROR_VALUE_EXIST;
271 sm->
l_addr.as_u64[0] = l_addr->as_u64[0];
272 sm->
l_addr.as_u64[1] = l_addr->as_u64[1];
273 sm->
e_addr.as_u64[0] = e_addr->as_u64[0];
274 sm->
e_addr.as_u64[1] = e_addr->as_u64[1];
282 if (clib_bihash_add_del_24_8 (&nm->
sm_l, &kv, 1))
284 sm_key.
addr.as_u64[0] = e_addr->as_u64[0];
285 sm_key.
addr.as_u64[1] = e_addr->as_u64[1];
290 if (clib_bihash_add_del_24_8 (&nm->
sm_e, &kv, 1))
299 return VNET_API_ERROR_NO_SUCH_ENTRY;
302 if (clib_bihash_add_del_24_8 (&nm->
sm_l, &kv, 0))
304 sm_key.
addr.as_u64[0] = e_addr->as_u64[0];
305 sm_key.
addr.as_u64[1] = e_addr->as_u64[1];
310 if (clib_bihash_add_del_24_8 (&nm->
sm_e, &kv, 0))
334 .version = VPP_BUILD_VER,
335 .description =
"NAT66",
int(* nat66_interface_walk_fn_t)(nat66_interface_t *i, void *ctx)
void vlib_validate_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
validate a combined counter
#define NAT66_INTERFACE_FLAG_IS_INSIDE
#define pool_foreach(VAR, POOL)
Iterate through pool.
static void nat66_validate_counters(nat66_main_t *nm, u32 sw_if_index)
#define pool_dup(P)
Return copy of pool without alignment.
vlib_simple_counter_main_t in2out_packets
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
add paths without path extensions
static clib_error_t * nat66_init(vlib_main_t *vm)
nat66_interface_t * interfaces
Interface pool.
clib_bihash_24_8_t sm_e
Static mapping by external address lookup table.
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
#define fail_if_enabled()
#define nat66_interface_is_inside(i)
void vlib_clear_combined_counters(vlib_combined_counter_main_t *cm)
Clear a collection of combined counters.
#define VLIB_INIT_FUNCTION(x)
#define nat66_elog_warn(nat_elog_str)
u32 fib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
fib_source_t fib_source_allocate(const char *name, fib_source_priority_t prio, fib_source_behaviour_t bh)
char * name
The counter collection's name.
int nat66_plugin_disable()
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
static void vlib_zero_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
Clear a combined counter Clears the set of per-thread counters.
vl_api_interface_index_t sw_if_index
void nat66_static_mappings_walk(nat66_static_mapping_walk_fn_t fn, void *ctx)
#define FIB_SOURCE_PRIORITY_HI
Some priority values that plugins might use when they are not to concerned where in the list they'll ...
IPv6 shallow virtual reassembly.
vlib_simple_counter_main_t out2in_packets
#define pool_put(P, E)
Free an object E in pool P.
int vnet_feature_enable_disable(const char *arc_name, const char *node_name, u32 sw_if_index, int enable_disable, void *feature_config, u32 n_feature_config_bytes)
int(* nat66_static_mapping_walk_fn_t)(nat66_static_mapping_t *sm, void *ctx)
void fib_table_unlock(u32 fib_index, fib_protocol_t proto, fib_source_t source)
Take a reference counting lock on the table.
clib_error_t * nat66_plugin_api_hookup(vlib_main_t *vm)
#define pool_free(p)
Free a pool.
int nat66_interface_add_del(u32 sw_if_index, u8 is_inside, u8 is_add)
sll srl srl sll sra u16x4 i
clib_bihash_24_8_t sm_l
Static mapping by local address lookup table.
int nat66_plugin_enable(u32 outside_vrf)
VNET_FEATURE_INIT(nat66_in2out, static)
void vlib_validate_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
validate a simple counter
u32 fib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id, fib_source_t src)
Get the index of the FIB for a Table-ID.
fib_source_t nat_fib_src_hi
static void vlib_zero_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
Clear a simple counter Clears the set of per-thread u16 counters, and the u64 counter.
#define fail_if_disabled()
#define nat66_interface_is_outside(i)
int ip6_sv_reass_enable_disable_with_refcnt(u32 sw_if_index, int is_enable)
#define VNET_FEATURES(...)
vlib_combined_counter_main_t session_counters
Session counters.
void nat66_interfaces_walk(nat66_interface_walk_fn_t fn, void *ctx)
char * stat_segment_name
Name in stat segment directory.
char * name
The counter collection's name.
int nat66_static_mapping_add_del(ip6_address_t *l_addr, ip6_address_t *e_addr, u32 vrf_id, u8 is_add)
void vlib_clear_simple_counters(vlib_simple_counter_main_t *cm)
Clear a collection of simple counters.
nat66_static_mapping_t * sm
Static mapping pool.
NAT66 global declarations.
nat66_static_mapping_t * nat66_static_mapping_get(ip6_address_t *addr, u32 fib_index, u8 is_local)
#define NAT66_INTERFACE_FLAG_IS_OUTSIDE