nat: elog rewrite for multi-worker support
[vpp.git] / src / plugins / nat / nat_api.c
index fce557f..ff11a82 100644 (file)
@@ -201,16 +201,20 @@ send_nat_worker_details (u32 worker_index, vl_api_registration_t * reg,
   snat_main_t *sm = &snat_main;
   vlib_worker_thread_t *w =
     vlib_worker_threads + worker_index + sm->first_worker_index;
+  u32 len = vec_len (w->name);
 
-  rmp = vl_msg_api_alloc (sizeof (*rmp) + ARRAY_LEN (w->name) - 1);
-  clib_memset (rmp, 0, sizeof (*rmp) + ARRAY_LEN (w->name) - 1);
+  if (len)
+    --len;
+
+  rmp = vl_msg_api_alloc (sizeof (*rmp) + len);
+  clib_memset (rmp, 0, sizeof (*rmp) + len);
   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->cpu_id);
 
-  vl_api_to_api_string (ARRAY_LEN (w->name) - 1, (char *) w->name,
-                       &rmp->name);
+  if (len)
+    vl_api_to_api_string (len, (char *) w->name, &rmp->name);
 
   vl_api_send_msg (reg, (u8 *) rmp);
 }
@@ -245,6 +249,33 @@ vl_api_nat_worker_dump_t_print (vl_api_nat_worker_dump_t * mp, void *handle)
   FINISH;
 }
 
+static void
+vl_api_nat_set_log_level_t_handler (vl_api_nat_set_log_level_t * mp)
+{
+  snat_main_t *sm = &snat_main;
+  vl_api_nat_set_log_level_reply_t *rmp;
+  int rv = 0;
+
+  if (sm->log_level > NAT_LOG_DEBUG)
+    rv = VNET_API_ERROR_UNSUPPORTED;
+  else
+    sm->log_level = mp->log_level;
+
+  REPLY_MACRO (VL_API_NAT_SET_WORKERS_REPLY);
+}
+
+static void *
+vl_api_nat_set_log_level_t_print (vl_api_nat_set_log_level_t *
+                                 mp, void *handle)
+{
+  u8 *s;
+
+  s = format (0, "SCRIPT: nat_set_log_level ");
+  s = format (s, "log_level %d", mp->log_level);
+
+  FINISH;
+}
+
 static void
 vl_api_nat_ipfix_enable_disable_t_handler (vl_api_nat_ipfix_enable_disable_t *
                                           mp)
@@ -1186,6 +1217,14 @@ static void
       goto send_reply;
     }
 
+  len = vl_api_string_len (&mp->tag);
+
+  if (len > 64)
+    {
+      rv = VNET_API_ERROR_INVALID_VALUE;
+      goto send_reply;
+    }
+
   memcpy (&local_addr.as_u8, mp->local_ip_address, 4);
   memcpy (&external_addr.as_u8, mp->external_ip_address, 4);
 
@@ -1204,9 +1243,8 @@ static void
   else if (mp->flags & NAT_API_IS_SELF_TWICE_NAT)
     twice_nat = TWICE_NAT_SELF;
 
-  len = vl_api_string_len (&mp->tag);
-
   tag = vec_new (u8, len);
+
   memcpy (tag, mp->tag.buf, len);
   vec_terminate_c_string (tag);
 
@@ -2025,7 +2063,7 @@ send_nat44_lb_static_mapping_details (snat_static_mapping_t * m,
       rmp = vl_msg_api_alloc (len);
       clib_memset (rmp, 0, len);
 
-      sp = (void *) &m->locals +
+      sp = (void *) &rmp->locals +
        sizeof (vl_api_nat44_lb_addr_port_t) * pool_elts (m->locals);
       vl_api_to_api_string (vec_len (m->tag), (char *) m->tag, sp);
     }
@@ -2996,7 +3034,7 @@ vl_api_nat64_add_del_prefix_t_handler (vl_api_nat64_add_del_prefix_t * mp)
   ip6_address_t prefix;
   int rv = 0;
 
-  memcpy (&prefix.as_u8, mp->prefix.prefix, 16);
+  memcpy (&prefix.as_u8, mp->prefix.address, 16);
 
   rv =
     nat64_add_del_prefix (&prefix, mp->prefix.len,
@@ -3011,7 +3049,7 @@ vl_api_nat64_add_del_prefix_t_print (vl_api_nat64_add_del_prefix_t * mp,
   u8 *s;
 
   s = format (0, "SCRIPT: nat64_add_del_prefix %U/%u vrf_id %u %s\n",
-             format_ip6_address, mp->prefix.prefix, mp->prefix.len,
+             format_ip6_address, mp->prefix.address, mp->prefix.len,
              ntohl (mp->vrf_id), mp->is_add ? "" : "del");
 
   FINISH;
@@ -3027,7 +3065,7 @@ nat64_api_prefix_walk (nat64_prefix_t * p, void *arg)
   rmp = vl_msg_api_alloc (sizeof (*rmp));
   clib_memset (rmp, 0, sizeof (*rmp));
   rmp->_vl_msg_id = ntohs (VL_API_NAT64_PREFIX_DETAILS + sm->msg_id_base);
-  clib_memcpy (rmp->prefix.prefix, &(p->prefix), 16);
+  clib_memcpy (rmp->prefix.address, &(p->prefix), 16);
   rmp->prefix.len = p->plen;
   rmp->vrf_id = ntohl (p->vrf_id);
   rmp->context = ctx->context;
@@ -3513,6 +3551,7 @@ _(NAT_CONTROL_PING, nat_control_ping)                                   \
 _(NAT_SHOW_CONFIG, nat_show_config)                                     \
 _(NAT_SET_WORKERS, nat_set_workers)                                     \
 _(NAT_WORKER_DUMP, nat_worker_dump)                                     \
+_(NAT_SET_LOG_LEVEL, nat_set_log_level)                                 \
 _(NAT_IPFIX_ENABLE_DISABLE, nat_ipfix_enable_disable)                   \
 _(NAT_SET_REASS, nat_set_reass)                                         \
 _(NAT_GET_REASS, nat_get_reass)                                         \