-/******************************/
-/*** Common NAT plugin APIs ***/
-/******************************/
-
-static void
-vl_api_nat_control_ping_t_handler (vl_api_nat_control_ping_t * mp)
-{
- vl_api_nat_control_ping_reply_t *rmp;
- snat_main_t *sm = &snat_main;
- int rv = 0;
-
- /* *INDENT-OFF* */
- REPLY_MACRO2 (VL_API_NAT_CONTROL_PING_REPLY,
- ({
- rmp->vpe_pid = ntohl (getpid ());
- }));
- /* *INDENT-ON* */
-}
-
-static void *
-vl_api_nat_control_ping_t_print (vl_api_nat_control_ping_t * mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: nat_control_ping ");
-
- FINISH;
-}
-
-static void
-vl_api_nat_show_config_t_handler (vl_api_nat_show_config_t * mp)
-{
- vl_api_nat_show_config_reply_t *rmp;
- snat_main_t *sm = &snat_main;
- int rv = 0;
-
- /* *INDENT-OFF* */
- REPLY_MACRO2 (VL_API_NAT_SHOW_CONFIG_REPLY,
- ({
- rmp->translation_buckets = htonl (sm->translation_buckets);
- rmp->translation_memory_size = htonl (sm->translation_memory_size);
- rmp->user_buckets = htonl (sm->user_buckets);
- rmp->user_memory_size = htonl (sm->user_memory_size);
- rmp->max_translations_per_user = htonl (sm->max_translations_per_user);
- rmp->outside_vrf_id = htonl (sm->outside_vrf_id);
- rmp->inside_vrf_id = htonl (sm->inside_vrf_id);
- rmp->static_mapping_only = sm->static_mapping_only;
- rmp->static_mapping_connection_tracking =
- sm->static_mapping_connection_tracking;
- rmp->deterministic = sm->deterministic;
- }));
- /* *INDENT-ON* */
-}
-
-static void *
-vl_api_nat_show_config_t_print (vl_api_nat_show_config_t * mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: nat_show_config ");
-
- FINISH;
-}
-
-static void
-vl_api_nat_set_workers_t_handler (vl_api_nat_set_workers_t * mp)
-{
- snat_main_t *sm = &snat_main;
- vl_api_snat_set_workers_reply_t *rmp;
- int rv = 0;
- uword *bitmap = 0;
- u64 mask = clib_net_to_host_u64 (mp->worker_mask);
-
- if (sm->num_workers < 2)
- {
- rv = VNET_API_ERROR_FEATURE_DISABLED;
- goto send_reply;
- }
-
- bitmap = clib_bitmap_set_multiple (bitmap, 0, mask, BITS (mask));
- rv = snat_set_workers (bitmap);
- clib_bitmap_free (bitmap);
-
-send_reply:
- REPLY_MACRO (VL_API_NAT_SET_WORKERS_REPLY);
-}
-
-static void *
-vl_api_nat_set_workers_t_print (vl_api_nat_set_workers_t * mp, void *handle)
-{
- u8 *s;
- uword *bitmap = 0;
- u8 first = 1;
- int i;
- u64 mask = clib_net_to_host_u64 (mp->worker_mask);
-
- s = format (0, "SCRIPT: nat_set_workers ");
- bitmap = clib_bitmap_set_multiple (bitmap, 0, mask, BITS (mask));
- /* *INDENT-OFF* */
- clib_bitmap_foreach (i, bitmap,
- ({
- if (first)
- s = format (s, "%d", i);
- else
- s = format (s, ",%d", i);
- first = 0;
- }));
- /* *INDENT-ON* */
- clib_bitmap_free (bitmap);
- FINISH;
-}
-
-static void
-send_nat_worker_details (u32 worker_index, unix_shared_memory_queue_t * q,
- u32 context)
-{
- vl_api_nat_worker_details_t *rmp;
- snat_main_t *sm = &snat_main;
- vlib_worker_thread_t *w =
- vlib_worker_threads + worker_index + sm->first_worker_index;
-
- rmp = vl_msg_api_alloc (sizeof (*rmp));
- memset (rmp, 0, sizeof (*rmp));
- rmp->_vl_msg_id = ntohs (VL_API_NAT_WORKER_DETAILS + sm->msg_id_base);
- rmp->context = context;
- rmp->worker_index = htonl (worker_index);
- rmp->lcore_id = htonl (w->lcore_id);
- strncpy ((char *) rmp->name, (char *) w->name, ARRAY_LEN (rmp->name) - 1);
-
- vl_msg_api_send_shmem (q, (u8 *) & rmp);
-}
-
-static void
-vl_api_nat_worker_dump_t_handler (vl_api_nat_worker_dump_t * mp)
-{
- unix_shared_memory_queue_t *q;
- snat_main_t *sm = &snat_main;
- u32 *worker_index;
-
- q = vl_api_client_index_to_input_queue (mp->client_index);
- if (q == 0)
- return;
-
- /* *INDENT-OFF* */
- vec_foreach (worker_index, sm->workers)
- send_nat_worker_details(*worker_index, q, mp->context);
- /* *INDENT-ON* */
-}
-
-static void *
-vl_api_nat_worker_dump_t_print (vl_api_nat_worker_dump_t * mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: nat_worker_dump ");
-
- FINISH;
-}
-
-static void
-vl_api_nat_ipfix_enable_disable_t_handler (vl_api_nat_ipfix_enable_disable_t *
- mp)
-{
- snat_main_t *sm = &snat_main;
- vl_api_nat_ipfix_enable_disable_reply_t *rmp;
- int rv = 0;
-
- rv = snat_ipfix_logging_enable_disable (mp->enable,
- clib_host_to_net_u32
- (mp->domain_id),
- clib_host_to_net_u16
- (mp->src_port));
-
- REPLY_MACRO (VL_API_NAT_IPFIX_ENABLE_DISABLE_REPLY);
-}
-
-static void *
-vl_api_nat_ipfix_enable_disable_t_print (vl_api_nat_ipfix_enable_disable_t *
- mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: nat_ipfix_enable_disable ");
- if (mp->domain_id)
- s = format (s, "domain %d ", clib_net_to_host_u32 (mp->domain_id));
- if (mp->src_port)
- s = format (s, "src_port %d ", clib_net_to_host_u16 (mp->src_port));
- if (!mp->enable)
- s = format (s, "disable ");
-
- FINISH;
-}
-
-static void
-vl_api_nat_set_reass_t_handler (vl_api_nat_set_reass_t * mp)
-{
- snat_main_t *sm = &snat_main;
- vl_api_nat_set_reass_reply_t *rmp;
- int rv = 0;
-
- rv =
- nat_reass_set (ntohl (mp->timeout), ntohs (mp->max_reass), mp->max_frag,
- mp->drop_frag, mp->is_ip6);
-
- REPLY_MACRO (VL_API_NAT_SET_REASS_REPLY);
-}
-
-static void *
-vl_api_nat_set_reass_t_print (vl_api_nat_set_reass_t * mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: nat_set_reass ");
- s = format (s, "timeout %d max_reass %d max_frag %d drop_frag %d is_ip6 %d",
- clib_host_to_net_u32 (mp->timeout),
- clib_host_to_net_u16 (mp->max_reass),
- mp->max_frag, mp->drop_frag, mp->is_ip6);
-
- FINISH;
-}
-
-static void
-vl_api_nat_get_reass_t_handler (vl_api_nat_get_reass_t * mp)
-{
- snat_main_t *sm = &snat_main;
- vl_api_nat_get_reass_reply_t *rmp;
- int rv = 0;
-
- /* *INDENT-OFF* */
- REPLY_MACRO2 (VL_API_NAT_GET_REASS_REPLY,
- ({
- rmp->ip4_timeout = htonl (nat_reass_get_timeout(0));
- rmp->ip4_max_reass = htons (nat_reass_get_max_reass(0));
- rmp->ip4_max_frag = nat_reass_get_max_frag(0);
- rmp->ip4_drop_frag = nat_reass_is_drop_frag(0);
- rmp->ip6_timeout = htonl (nat_reass_get_timeout(1));
- rmp->ip6_max_reass = htons (nat_reass_get_max_reass(1));
- rmp->ip6_max_frag = nat_reass_get_max_frag(1);
- rmp->ip6_drop_frag = nat_reass_is_drop_frag(1);
- }))
- /* *INDENT-ON* */
-}
-
-static void *
-vl_api_nat_get_reass_t_print (vl_api_nat_get_reass_t * mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: nat_get_reass");
-
- FINISH;
-}
-
-typedef struct nat_api_walk_ctx_t_
-{
- unix_shared_memory_queue_t *q;
- u32 context;
-} nat_api_walk_ctx_t;
-
-static int
-nat_ip4_reass_walk_api (nat_reass_ip4_t * reass, void *arg)
-{
- vl_api_nat_reass_details_t *rmp;
- snat_main_t *sm = &snat_main;
- nat_api_walk_ctx_t *ctx = arg;
-
- rmp = vl_msg_api_alloc (sizeof (*rmp));
- memset (rmp, 0, sizeof (*rmp));
- rmp->_vl_msg_id = ntohs (VL_API_NAT_REASS_DETAILS + sm->msg_id_base);
- rmp->context = ctx->context;
- clib_memcpy (rmp->src_addr, &(reass->key.src), 4);
- clib_memcpy (rmp->dst_addr, &(reass->key.dst), 4);
- rmp->proto = reass->key.proto;
- rmp->frag_id = ntohl (reass->key.frag_id);
- rmp->frag_n = reass->frag_n;
- rmp->is_ip4 = 1;
-
- vl_msg_api_send_shmem (ctx->q, (u8 *) & rmp);
-
- return 0;
-}
-
-static int
-nat_ip6_reass_walk_api (nat_reass_ip6_t * reass, void *arg)