NAT44: asymmetrical load balancing static mapping rule (VPP-1132)
[vpp.git] / src / plugins / nat / nat_api.c
index 5071609..dc9fc5d 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)
@@ -442,6 +441,9 @@ static void
       if (rv)
        goto send_reply;
 
+      if (sm->out2in_dpo)
+       nat44_add_del_address_dpo (this_addr, mp->is_add);
+
       increment_v4_address (&this_addr);
     }
 
@@ -466,8 +468,7 @@ static void *vl_api_nat44_add_del_address_range_t_print
 
 static void
 send_nat44_address_details (snat_address_t * a,
-                           unix_shared_memory_queue_t * q, u32 context,
-                           u8 twice_nat)
+                           svm_queue_t * q, u32 context, u8 twice_nat)
 {
   vl_api_nat44_address_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -492,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;
 
@@ -553,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;
@@ -573,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;
 
@@ -635,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;
@@ -656,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;
 
@@ -742,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;
@@ -768,8 +767,7 @@ send_nat44_static_mapping_details (snat_static_mapping_t * m,
 
 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;
@@ -795,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;
@@ -888,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;
@@ -911,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;
@@ -935,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;
@@ -1005,8 +1001,7 @@ static void *vl_api_nat44_add_del_interface_addr_t_print
 
 static void
 send_nat44_interface_addr_details (u32 sw_if_index,
-                                  unix_shared_memory_queue_t * q,
-                                  u32 context, u8 twice_nat)
+                                  svm_queue_t * q, u32 context, u8 twice_nat)
 {
   vl_api_nat44_interface_addr_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1026,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;
 
@@ -1054,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;
@@ -1078,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;
@@ -1106,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;
@@ -1142,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;
@@ -1244,7 +1238,8 @@ 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, mp->twice_nat);
+                                    locals, mp->is_add, mp->twice_nat,
+                                    mp->out2in_only);
 
   vec_free (locals);
 
@@ -1257,15 +1252,15 @@ 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 twice_nat %d", mp->is_add, mp->twice_nat);
+  s = format (s, "is_add %d twice_nat %d out2in_only ",
+             mp->is_add, mp->twice_nat, mp->out2in_only);
 
   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;
@@ -1285,6 +1280,7 @@ send_nat44_lb_static_mapping_details (snat_static_mapping_t * m,
   rmp->vrf_id = ntohl (m->vrf_id);
   rmp->context = context;
   rmp->twice_nat = m->twice_nat;
+  rmp->out2in_only = m->out2in_only;
 
   locals = (vl_api_nat44_lb_addr_port_t *) rmp->locals;
   vec_foreach (ap, m->locals)
@@ -1303,7 +1299,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;
 
@@ -1366,6 +1362,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) ***/
 /*******************************/
@@ -1502,8 +1555,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;
@@ -1527,7 +1579,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;
 
@@ -1718,7 +1770,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;
@@ -1740,7 +1792,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;
@@ -1836,7 +1888,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;
@@ -1871,7 +1923,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)
@@ -1953,7 +2005,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)
@@ -2051,7 +2103,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;
 
@@ -2184,7 +2236,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;
 
@@ -2268,7 +2320,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)
@@ -2336,10 +2388,14 @@ vl_api_dslite_set_aftr_addr_t_handler (vl_api_dslite_set_aftr_addr_t * mp)
   dslite_main_t *dm = &dslite_main;
   int rv = 0;
   ip6_address_t ip6_addr;
+  ip4_address_t ip4_addr;
 
   memcpy (&ip6_addr.as_u8, mp->ip6_addr, 16);
+  memcpy (&ip4_addr.as_u8, mp->ip4_addr, 4);
 
   rv = dslite_set_aftr_ip6_addr (dm, &ip6_addr);
+  if (rv == 0)
+    rv = dslite_set_aftr_ip4_addr (dm, &ip4_addr);
 
   REPLY_MACRO (VL_API_DSLITE_SET_AFTR_ADDR_REPLY);
 }
@@ -2358,6 +2414,96 @@ vl_api_dslite_set_aftr_addr_t_print (vl_api_dslite_set_aftr_addr_t * mp,
   FINISH;
 }
 
+static void
+vl_api_dslite_get_aftr_addr_t_handler (vl_api_dslite_get_aftr_addr_t * mp)
+{
+  snat_main_t *sm = &snat_main;
+  vl_api_dslite_get_aftr_addr_reply_t *rmp;
+  dslite_main_t *dm = &dslite_main;
+  int rv = 0;
+
+  /* *INDENT-OFF* */
+  REPLY_MACRO2 (VL_API_DSLITE_GET_AFTR_ADDR_REPLY,
+  ({
+    memcpy (rmp->ip4_addr, &dm->aftr_ip4_addr.as_u8, 4);
+    memcpy (rmp->ip6_addr, &dm->aftr_ip6_addr.as_u8, 16);
+  }))
+  /* *INDENT-ON* */
+}
+
+static void *
+vl_api_dslite_get_aftr_addr_t_print (vl_api_dslite_get_aftr_addr_t * mp,
+                                    void *handle)
+{
+  u8 *s;
+
+  s = format (0, "SCRIPT: dslite_get_aftr_addr");
+
+  FINISH;
+}
+
+static void
+vl_api_dslite_set_b4_addr_t_handler (vl_api_dslite_set_b4_addr_t * mp)
+{
+  vl_api_dslite_set_b4_addr_reply_t *rmp;
+  snat_main_t *sm = &snat_main;
+  dslite_main_t *dm = &dslite_main;
+  int rv = 0;
+  ip6_address_t ip6_addr;
+  ip4_address_t ip4_addr;
+
+  memcpy (&ip6_addr.as_u8, mp->ip6_addr, 16);
+  memcpy (&ip4_addr.as_u8, mp->ip4_addr, 4);
+
+  rv = dslite_set_b4_ip6_addr (dm, &ip6_addr);
+  if (rv == 0)
+    rv = dslite_set_b4_ip4_addr (dm, &ip4_addr);
+
+  REPLY_MACRO (VL_API_DSLITE_SET_B4_ADDR_REPLY);
+}
+
+static void *
+vl_api_dslite_set_b4_addr_t_print (vl_api_dslite_set_b4_addr_t * mp,
+                                  void *handle)
+{
+  u8 *s;
+
+  s = format (0, "SCRIPT: dslite_set_b4_addr ");
+  s = format (s, "ip6_addr %U ip4_addr %U\n",
+             format_ip6_address, mp->ip6_addr,
+             format_ip6_address, mp->ip4_addr);
+
+  FINISH;
+}
+
+static void
+vl_api_dslite_get_b4_addr_t_handler (vl_api_dslite_get_b4_addr_t * mp)
+{
+  snat_main_t *sm = &snat_main;
+  vl_api_dslite_get_b4_addr_reply_t *rmp;
+  dslite_main_t *dm = &dslite_main;
+  int rv = 0;
+
+  /* *INDENT-OFF* */
+  REPLY_MACRO2 (VL_API_DSLITE_GET_AFTR_ADDR_REPLY,
+  ({
+    memcpy (rmp->ip4_addr, &dm->b4_ip4_addr.as_u8, 4);
+    memcpy (rmp->ip6_addr, &dm->b4_ip6_addr.as_u8, 16);
+  }))
+  /* *INDENT-ON* */
+}
+
+static void *
+vl_api_dslite_get_b4_addr_t_print (vl_api_dslite_get_b4_addr_t * mp,
+                                  void *handle)
+{
+  u8 *s;
+
+  s = format (0, "SCRIPT: dslite_get_b4_addr");
+
+  FINISH;
+}
+
 static void
   vl_api_dslite_add_del_pool_addr_range_t_handler
   (vl_api_dslite_add_del_pool_addr_range_t * mp)
@@ -2434,6 +2580,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)                                     \
@@ -2456,7 +2604,10 @@ _(NAT64_ADD_DEL_PREFIX, nat64_add_del_prefix)                           \
 _(NAT64_PREFIX_DUMP, nat64_prefix_dump)                                 \
 _(NAT64_ADD_DEL_INTERFACE_ADDR, nat64_add_del_interface_addr)           \
 _(DSLITE_ADD_DEL_POOL_ADDR_RANGE, dslite_add_del_pool_addr_range)       \
-_(DSLITE_SET_AFTR_ADDR, dslite_set_aftr_addr)
+_(DSLITE_SET_AFTR_ADDR, dslite_set_aftr_addr)                           \
+_(DSLITE_GET_AFTR_ADDR, dslite_get_aftr_addr)                           \
+_(DSLITE_SET_B4_ADDR, dslite_set_b4_addr)                               \
+_(DSLITE_GET_B4_ADDR, dslite_get_b4_addr)
 
 /* Set up the API message handling tables */
 static clib_error_t *