api: refactor vlibmemory
[vpp.git] / src / plugins / nat / nat_api.c
index f1d9ec8..bc192a7 100644 (file)
@@ -174,8 +174,7 @@ vl_api_nat_set_workers_t_print (vl_api_nat_set_workers_t * mp, void *handle)
 }
 
 static void
-send_nat_worker_details (u32 worker_index, unix_shared_memory_queue_t * q,
-                        u32 context)
+send_nat_worker_details (u32 worker_index, svm_queue_t * q, u32 context)
 {
   vl_api_nat_worker_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -196,7 +195,7 @@ send_nat_worker_details (u32 worker_index, unix_shared_memory_queue_t * q,
 static void
 vl_api_nat_worker_dump_t_handler (vl_api_nat_worker_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   u32 *worker_index;
 
@@ -316,7 +315,7 @@ vl_api_nat_get_reass_t_print (vl_api_nat_get_reass_t * mp, void *handle)
 
 typedef struct nat_api_walk_ctx_t_
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   u32 context;
 } nat_api_walk_ctx_t;
 
@@ -369,7 +368,7 @@ nat_ip6_reass_walk_api (nat_reass_ip6_t * reass, void *arg)
 static void
 vl_api_nat_reass_dump_t_handler (vl_api_nat_reass_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
 
   q = vl_api_client_index_to_input_queue (mp->client_index);
   if (q == 0)
@@ -435,13 +434,16 @@ static void
   for (i = 0; i < count; i++)
     {
       if (mp->is_add)
-       snat_add_address (sm, &this_addr, vrf_id);
+       snat_add_address (sm, &this_addr, vrf_id, mp->twice_nat);
       else
-       rv = snat_del_address (sm, this_addr, 0);
+       rv = snat_del_address (sm, this_addr, 0, mp->twice_nat);
 
       if (rv)
        goto send_reply;
 
+      if (sm->out2in_dpo)
+       nat44_add_del_address_dpo (this_addr, mp->is_add);
+
       increment_v4_address (&this_addr);
     }
 
@@ -460,12 +462,13 @@ static void *vl_api_nat44_add_del_address_range_t_print
     {
       s = format (s, " - %U ", format_ip4_address, mp->last_ip_address);
     }
+  s = format (s, "twice_nat %d ", mp->twice_nat);
   FINISH;
 }
 
 static void
 send_nat44_address_details (snat_address_t * a,
-                           unix_shared_memory_queue_t * q, u32 context)
+                           svm_queue_t * q, u32 context, u8 twice_nat)
 {
   vl_api_nat44_address_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -481,6 +484,7 @@ send_nat44_address_details (snat_address_t * a,
     }
   else
     rmp->vrf_id = ~0;
+  rmp->twice_nat = twice_nat;
   rmp->context = context;
 
   vl_msg_api_send_shmem (q, (u8 *) & rmp);
@@ -489,7 +493,7 @@ send_nat44_address_details (snat_address_t * a,
 static void
 vl_api_nat44_address_dump_t_handler (vl_api_nat44_address_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   snat_address_t *a;
 
@@ -499,7 +503,9 @@ vl_api_nat44_address_dump_t_handler (vl_api_nat44_address_dump_t * mp)
 
   /* *INDENT-OFF* */
   vec_foreach (a, sm->addresses)
-    send_nat44_address_details (a, q, mp->context);
+    send_nat44_address_details (a, q, mp->context, 0);
+  vec_foreach (a, sm->twice_nat_addresses)
+    send_nat44_address_details (a, q, mp->context, 1);
   /* *INDENT-ON* */
 }
 
@@ -548,7 +554,7 @@ static void *vl_api_nat44_interface_add_del_feature_t_print
 
 static void
 send_nat44_interface_details (snat_interface_t * i,
-                             unix_shared_memory_queue_t * q, u32 context)
+                             svm_queue_t * q, u32 context)
 {
   vl_api_nat44_interface_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -568,7 +574,7 @@ send_nat44_interface_details (snat_interface_t * i,
 static void
 vl_api_nat44_interface_dump_t_handler (vl_api_nat44_interface_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   snat_interface_t *i;
 
@@ -630,8 +636,7 @@ static void *vl_api_nat44_interface_add_del_output_feature_t_print
 
 static void
 send_nat44_interface_output_feature_details (snat_interface_t * i,
-                                            unix_shared_memory_queue_t * q,
-                                            u32 context)
+                                            svm_queue_t * q, u32 context)
 {
   vl_api_nat44_interface_output_feature_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -651,7 +656,7 @@ static void
   vl_api_nat44_interface_output_feature_dump_t_handler
   (vl_api_nat44_interface_output_feature_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   snat_interface_t *i;
 
@@ -702,7 +707,8 @@ static void
 
   rv = snat_add_static_mapping (local_addr, external_addr, local_port,
                                external_port, vrf_id, mp->addr_only,
-                               external_sw_if_index, proto, mp->is_add);
+                               external_sw_if_index, proto, mp->is_add,
+                               mp->twice_nat);
 
   REPLY_MACRO (VL_API_NAT44_ADD_DEL_STATIC_MAPPING_REPLY);
 }
@@ -723,6 +729,8 @@ static void *vl_api_nat44_add_del_static_mapping_t_print
                clib_net_to_host_u16 (mp->local_port),
                clib_net_to_host_u16 (mp->external_port));
 
+  s = format (s, "twice_nat %d ", mp->twice_nat);
+
   if (mp->vrf_id != ~0)
     s = format (s, "vrf %d", clib_net_to_host_u32 (mp->vrf_id));
 
@@ -734,8 +742,7 @@ static void *vl_api_nat44_add_del_static_mapping_t_print
 
 static void
 send_nat44_static_mapping_details (snat_static_mapping_t * m,
-                                  unix_shared_memory_queue_t * q,
-                                  u32 context)
+                                  svm_queue_t * q, u32 context)
 {
   vl_api_nat44_static_mapping_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -753,14 +760,14 @@ send_nat44_static_mapping_details (snat_static_mapping_t * m,
   rmp->vrf_id = htonl (m->vrf_id);
   rmp->protocol = snat_proto_to_ip_proto (m->proto);
   rmp->context = context;
+  rmp->twice_nat = m->twice_nat;
 
   vl_msg_api_send_shmem (q, (u8 *) & rmp);
 }
 
 static void
 send_nat44_static_map_resolve_details (snat_static_map_resolve_t * m,
-                                      unix_shared_memory_queue_t * q,
-                                      u32 context)
+                                      svm_queue_t * q, u32 context)
 {
   vl_api_nat44_static_mapping_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -777,6 +784,7 @@ send_nat44_static_map_resolve_details (snat_static_map_resolve_t * m,
   rmp->vrf_id = htonl (m->vrf_id);
   rmp->protocol = snat_proto_to_ip_proto (m->proto);
   rmp->context = context;
+  rmp->twice_nat = m->twice_nat;
 
   vl_msg_api_send_shmem (q, (u8 *) & rmp);
 }
@@ -785,7 +793,7 @@ static void
 vl_api_nat44_static_mapping_dump_t_handler (vl_api_nat44_static_mapping_dump_t
                                            * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   snat_static_mapping_t *m;
   snat_static_map_resolve_t *rp;
@@ -849,7 +857,7 @@ static void
 
   rv =
     snat_add_static_mapping (addr, addr, port, port, vrf_id, mp->addr_only,
-                            sw_if_index, proto, mp->is_add);
+                            sw_if_index, proto, mp->is_add, 0);
 
   REPLY_MACRO (VL_API_NAT44_ADD_DEL_IDENTITY_MAPPING_REPLY);
 }
@@ -878,8 +886,7 @@ static void *vl_api_nat44_add_del_identity_mapping_t_print
 
 static void
 send_nat44_identity_mapping_details (snat_static_mapping_t * m,
-                                    unix_shared_memory_queue_t * q,
-                                    u32 context)
+                                    svm_queue_t * q, u32 context)
 {
   vl_api_nat44_identity_mapping_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -901,8 +908,7 @@ send_nat44_identity_mapping_details (snat_static_mapping_t * m,
 
 static void
 send_nat44_identity_map_resolve_details (snat_static_map_resolve_t * m,
-                                        unix_shared_memory_queue_t * q,
-                                        u32 context)
+                                        svm_queue_t * q, u32 context)
 {
   vl_api_nat44_identity_mapping_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -925,7 +931,7 @@ static void
   vl_api_nat44_identity_mapping_dump_t_handler
   (vl_api_nat44_identity_mapping_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   snat_static_mapping_t *m;
   snat_static_map_resolve_t *rp;
@@ -973,7 +979,7 @@ static void
 
   VALIDATE_SW_IF_INDEX (mp);
 
-  rv = snat_add_interface_address (sm, sw_if_index, is_del);
+  rv = snat_add_interface_address (sm, sw_if_index, is_del, mp->twice_nat);
 
   BAD_SW_IF_INDEX_LABEL;
 
@@ -986,17 +992,16 @@ static void *vl_api_nat44_add_del_interface_addr_t_print
   u8 *s;
 
   s = format (0, "SCRIPT: nat44_add_del_interface_addr ");
-  s = format (s, "sw_if_index %d %s",
+  s = format (s, "sw_if_index %d twice_nat %d %s",
              clib_host_to_net_u32 (mp->sw_if_index),
-             mp->is_add ? "" : "del");
+             mp->twice_nat, mp->is_add ? "" : "del");
 
   FINISH;
 }
 
 static void
 send_nat44_interface_addr_details (u32 sw_if_index,
-                                  unix_shared_memory_queue_t * q,
-                                  u32 context)
+                                  svm_queue_t * q, u32 context, u8 twice_nat)
 {
   vl_api_nat44_interface_addr_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1006,6 +1011,7 @@ send_nat44_interface_addr_details (u32 sw_if_index,
   rmp->_vl_msg_id =
     ntohs (VL_API_NAT44_INTERFACE_ADDR_DETAILS + sm->msg_id_base);
   rmp->sw_if_index = ntohl (sw_if_index);
+  rmp->twice_nat = twice_nat;
   rmp->context = context;
 
   vl_msg_api_send_shmem (q, (u8 *) & rmp);
@@ -1015,7 +1021,7 @@ static void
 vl_api_nat44_interface_addr_dump_t_handler (vl_api_nat44_interface_addr_dump_t
                                            * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   u32 *i;
 
@@ -1025,7 +1031,9 @@ vl_api_nat44_interface_addr_dump_t_handler (vl_api_nat44_interface_addr_dump_t
 
   /* *INDENT-OFF* */
   vec_foreach (i, sm->auto_add_sw_if_indices)
-    send_nat44_interface_addr_details(*i, q, mp->context);
+    send_nat44_interface_addr_details(*i, q, mp->context, 0);
+  vec_foreach (i, sm->auto_add_sw_if_indices_twice_nat)
+    send_nat44_interface_addr_details(*i, q, mp->context, 1);
   /* *INDENT-ON* */
 }
 
@@ -1041,8 +1049,7 @@ vl_api_nat44_interface_addr_dump_t_print (vl_api_nat44_interface_addr_dump_t *
 }
 
 static void
-send_nat44_user_details (snat_user_t * u, unix_shared_memory_queue_t * q,
-                        u32 context)
+send_nat44_user_details (snat_user_t * u, svm_queue_t * q, u32 context)
 {
   vl_api_nat44_user_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1065,7 +1072,7 @@ send_nat44_user_details (snat_user_t * u, unix_shared_memory_queue_t * q,
 static void
 vl_api_nat44_user_dump_t_handler (vl_api_nat44_user_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   snat_main_per_thread_data_t *tsm;
   snat_user_t *u;
@@ -1093,7 +1100,7 @@ vl_api_nat44_user_dump_t_print (vl_api_nat44_user_dump_t * mp, void *handle)
 
 static void
 send_nat44_user_session_details (snat_session_t * s,
-                                unix_shared_memory_queue_t * q, u32 context)
+                                svm_queue_t * q, u32 context)
 {
   vl_api_nat44_user_session_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1129,7 +1136,7 @@ static void
 vl_api_nat44_user_session_dump_t_handler (vl_api_nat44_user_session_dump_t *
                                          mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   snat_main_per_thread_data_t *tsm;
   snat_session_t *s;
@@ -1231,7 +1238,7 @@ static void
     nat44_add_del_lb_static_mapping (e_addr,
                                     clib_net_to_host_u16 (mp->external_port),
                                     proto, clib_net_to_host_u32 (mp->vrf_id),
-                                    locals, mp->is_add);
+                                    locals, mp->is_add, mp->twice_nat);
 
   vec_free (locals);
 
@@ -1244,15 +1251,14 @@ static void *vl_api_nat44_add_del_lb_static_mapping_t_print
   u8 *s;
 
   s = format (0, "SCRIPT: nat44_add_del_lb_static_mapping ");
-  s = format (s, "is_add %d\n", mp->is_add);
+  s = format (s, "is_add %d twice_nat %d", mp->is_add, mp->twice_nat);
 
   FINISH;
 }
 
 static void
 send_nat44_lb_static_mapping_details (snat_static_mapping_t * m,
-                                     unix_shared_memory_queue_t * q,
-                                     u32 context)
+                                     svm_queue_t * q, u32 context)
 {
   vl_api_nat44_lb_static_mapping_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1271,6 +1277,7 @@ send_nat44_lb_static_mapping_details (snat_static_mapping_t * m,
   rmp->protocol = snat_proto_to_ip_proto (m->proto);
   rmp->vrf_id = ntohl (m->vrf_id);
   rmp->context = context;
+  rmp->twice_nat = m->twice_nat;
 
   locals = (vl_api_nat44_lb_addr_port_t *) rmp->locals;
   vec_foreach (ap, m->locals)
@@ -1289,7 +1296,7 @@ static void
   vl_api_nat44_lb_static_mapping_dump_t_handler
   (vl_api_nat44_lb_static_mapping_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   snat_static_mapping_t *m;
 
@@ -1352,6 +1359,63 @@ vl_api_nat44_del_session_t_print (vl_api_nat44_del_session_t * mp,
   FINISH;
 }
 
+static void
+  vl_api_nat44_forwarding_enable_disable_t_handler
+  (vl_api_nat44_forwarding_enable_disable_t * mp)
+{
+  snat_main_t *sm = &snat_main;
+  vl_api_nat44_forwarding_enable_disable_reply_t *rmp;
+  int rv = 0;
+
+  sm->forwarding_enabled = mp->enable != 0;
+
+  REPLY_MACRO (VL_API_NAT44_FORWARDING_ENABLE_DISABLE_REPLY);
+}
+
+static void *vl_api_nat44_forwarding_enable_disable_t_print
+  (vl_api_nat44_forwarding_enable_disable_t * mp, void *handle)
+{
+  u8 *s;
+
+  s = format (0, "SCRIPT: nat44_forwarding_enable_disable ");
+  s = format (s, "enable %d", mp->enable != 0);
+
+  FINISH;
+}
+
+static void
+  vl_api_nat44_forwarding_is_enabled_t_handler
+  (vl_api_nat44_forwarding_is_enabled_t * mp)
+{
+  svm_queue_t *q;
+  snat_main_t *sm = &snat_main;
+  vl_api_nat44_forwarding_is_enabled_reply_t *rmp;
+
+  q = vl_api_client_index_to_input_queue (mp->client_index);
+  if (q == 0)
+    return;
+
+  rmp = vl_msg_api_alloc (sizeof (*rmp));
+  memset (rmp, 0, sizeof (*rmp));
+  rmp->_vl_msg_id =
+    ntohs (VL_API_NAT44_FORWARDING_IS_ENABLED_REPLY + sm->msg_id_base);
+  rmp->context = mp->context;
+
+  rmp->enabled = sm->forwarding_enabled;
+
+  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+}
+
+static void *vl_api_nat44_forwarding_is_enabled_t_print
+  (vl_api_nat44_forwarding_is_enabled_t * mp, void *handle)
+{
+  u8 *s;
+
+  s = format (0, "SCRIPT: nat44_forwarding_is_enabled ");
+
+  FINISH;
+}
+
 /*******************************/
 /*** Deterministic NAT (CGN) ***/
 /*******************************/
@@ -1488,8 +1552,7 @@ vl_api_nat_det_reverse_t_print (vl_api_nat_det_reverse_t * mp, void *handle)
 }
 
 static void
-sent_nat_det_map_details (snat_det_map_t * m, unix_shared_memory_queue_t * q,
-                         u32 context)
+sent_nat_det_map_details (snat_det_map_t * m, svm_queue_t * q, u32 context)
 {
   vl_api_nat_det_map_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1513,7 +1576,7 @@ sent_nat_det_map_details (snat_det_map_t * m, unix_shared_memory_queue_t * q,
 static void
 vl_api_nat_det_map_dump_t_handler (vl_api_nat_det_map_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   snat_det_map_t *m;
 
@@ -1704,7 +1767,7 @@ vl_api_nat_det_close_session_in_t_print (vl_api_nat_det_close_session_in_t *
 
 static void
 send_nat_det_session_details (snat_det_session_t * s,
-                             unix_shared_memory_queue_t * q, u32 context)
+                             svm_queue_t * q, u32 context)
 {
   vl_api_nat_det_session_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1726,7 +1789,7 @@ send_nat_det_session_details (snat_det_session_t * s,
 static void
 vl_api_nat_det_session_dump_t_handler (vl_api_nat_det_session_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   snat_main_t *sm = &snat_main;
   ip4_address_t user_addr;
   snat_det_map_t *dm;
@@ -1822,7 +1885,7 @@ static void *vl_api_nat64_add_del_pool_addr_range_t_print
 
 typedef struct nat64_api_walk_ctx_t_
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   u32 context;
   nat64_db_t *db;
 } nat64_api_walk_ctx_t;
@@ -1857,7 +1920,7 @@ nat64_api_pool_walk (snat_address_t * a, void *arg)
 static void
 vl_api_nat64_pool_addr_dump_t_handler (vl_api_nat64_pool_addr_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
 
   q = vl_api_client_index_to_input_queue (mp->client_index);
   if (q == 0)
@@ -1939,7 +2002,7 @@ nat64_api_interface_walk (snat_interface_t * i, void *arg)
 static void
 vl_api_nat64_interface_dump_t_handler (vl_api_nat64_interface_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
 
   q = vl_api_client_index_to_input_queue (mp->client_index);
   if (q == 0)
@@ -2037,7 +2100,7 @@ nat64_api_bib_walk (nat64_db_bib_entry_t * bibe, void *arg)
 static void
 vl_api_nat64_bib_dump_t_handler (vl_api_nat64_bib_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   nat64_main_t *nm = &nat64_main;
   nat64_db_t *db;
 
@@ -2170,7 +2233,7 @@ nat64_api_st_walk (nat64_db_st_entry_t * ste, void *arg)
 static void
 vl_api_nat64_st_dump_t_handler (vl_api_nat64_st_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   nat64_main_t *nm = &nat64_main;
   nat64_db_t *db;
 
@@ -2254,7 +2317,7 @@ nat64_api_prefix_walk (nat64_prefix_t * p, void *arg)
 static void
 vl_api_nat64_prefix_dump_t_handler (vl_api_nat64_prefix_dump_t * mp)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
 
   q = vl_api_client_index_to_input_queue (mp->client_index);
   if (q == 0)
@@ -2420,6 +2483,8 @@ _(NAT44_INTERFACE_OUTPUT_FEATURE_DUMP,                                  \
 _(NAT44_ADD_DEL_LB_STATIC_MAPPING, nat44_add_del_lb_static_mapping)     \
 _(NAT44_LB_STATIC_MAPPING_DUMP, nat44_lb_static_mapping_dump)           \
 _(NAT44_DEL_SESSION, nat44_del_session)                                 \
+_(NAT44_FORWARDING_ENABLE_DISABLE, nat44_forwarding_enable_disable)     \
+_(NAT44_FORWARDING_IS_ENABLED, nat44_forwarding_is_enabled)             \
 _(NAT_DET_ADD_DEL_MAP, nat_det_add_del_map)                             \
 _(NAT_DET_FORWARD, nat_det_forward)                                     \
 _(NAT_DET_REVERSE, nat_det_reverse)                                     \