acl-plugin: store sessions in a single hash table instead of a per-interface
[vpp.git] / src / plugins / acl / acl.c
index 84ed7af..e7b8549 100644 (file)
@@ -62,6 +62,7 @@ acl_main_t acl_main;
 
 #define foreach_acl_plugin_api_msg             \
 _(ACL_PLUGIN_GET_VERSION, acl_plugin_get_version) \
+_(ACL_PLUGIN_CONTROL_PING, acl_plugin_control_ping) \
 _(ACL_ADD_REPLACE, acl_add_replace)                            \
 _(ACL_DEL, acl_del)                            \
 _(ACL_INTERFACE_ADD_DEL, acl_interface_add_del)        \
@@ -106,6 +107,20 @@ vl_api_acl_plugin_get_version_t_handler (vl_api_acl_plugin_get_version_t * mp)
   vl_msg_api_send_shmem (q, (u8 *) & rmp);
 }
 
+static void
+vl_api_acl_plugin_control_ping_t_handler (vl_api_acl_plugin_control_ping_t * mp)
+{
+  vl_api_acl_plugin_control_ping_reply_t *rmp;
+  acl_main_t *am = &acl_main;
+  int rv = 0;
+
+  /* *INDENT-OFF* */
+  REPLY_MACRO2 (VL_API_ACL_PLUGIN_CONTROL_PING_REPLY,
+  ({
+    rmp->vpe_pid = ntohl (getpid ());
+  }));
+  /* *INDENT-ON* */
+}
 
 static int
 acl_add_list (u32 count, vl_api_acl_rule_t rules[],
@@ -310,13 +325,13 @@ _(ether) __ __ __ __ __ __ v __ __ __ __ __ __ v __ __ v
 }
 
 static int
-acl_classify_add_del_table_big (vnet_classify_main_t * cm, u8 * mask,
+acl_classify_add_del_table_tiny (vnet_classify_main_t * cm, u8 * mask,
                            u32 mask_len, u32 next_table_index,
                            u32 miss_next_index, u32 * table_index,
                            int is_add)
 {
-  u32 nbuckets = 65536;
-  u32 memory_size = 2 << 30;
+  u32 nbuckets = 1;
+  u32 memory_size = 2 << 13;
   u32 skip = count_skip (mask, mask_len);
   u32 match = (mask_len / 16) - skip;
   u8 *skip_mask_ptr = mask + 16 * skip;
@@ -379,7 +394,7 @@ acl_unhook_l2_input_classify (acl_main_t * am, u32 sw_if_index)
       ip4_table_index =
        am->acl_ip4_input_classify_table_by_sw_if_index[sw_if_index];
       am->acl_ip4_input_classify_table_by_sw_if_index[sw_if_index] = ~0;
-      acl_classify_add_del_table_big (cm, ip4_5tuple_mask,
+      acl_classify_add_del_table_tiny (cm, ip4_5tuple_mask,
                                  sizeof (ip4_5tuple_mask) - 1, ~0,
                                  am->l2_input_classify_next_acl_ip4,
                                  &ip4_table_index, 0);
@@ -389,7 +404,7 @@ acl_unhook_l2_input_classify (acl_main_t * am, u32 sw_if_index)
       ip6_table_index =
        am->acl_ip6_input_classify_table_by_sw_if_index[sw_if_index];
       am->acl_ip6_input_classify_table_by_sw_if_index[sw_if_index] = ~0;
-      acl_classify_add_del_table_big (cm, ip6_5tuple_mask,
+      acl_classify_add_del_table_tiny (cm, ip6_5tuple_mask,
                                  sizeof (ip6_5tuple_mask) - 1, ~0,
                                  am->l2_input_classify_next_acl_ip6,
                                  &ip6_table_index, 0);
@@ -417,7 +432,7 @@ acl_unhook_l2_output_classify (acl_main_t * am, u32 sw_if_index)
       ip4_table_index =
        am->acl_ip4_output_classify_table_by_sw_if_index[sw_if_index];
       am->acl_ip4_output_classify_table_by_sw_if_index[sw_if_index] = ~0;
-      acl_classify_add_del_table_big (cm, ip4_5tuple_mask,
+      acl_classify_add_del_table_tiny (cm, ip4_5tuple_mask,
                                  sizeof (ip4_5tuple_mask) - 1, ~0,
                                  am->l2_output_classify_next_acl_ip4,
                                  &ip4_table_index, 0);
@@ -427,7 +442,7 @@ acl_unhook_l2_output_classify (acl_main_t * am, u32 sw_if_index)
       ip6_table_index =
        am->acl_ip6_output_classify_table_by_sw_if_index[sw_if_index];
       am->acl_ip6_output_classify_table_by_sw_if_index[sw_if_index] = ~0;
-      acl_classify_add_del_table_big (cm, ip6_5tuple_mask,
+      acl_classify_add_del_table_tiny (cm, ip6_5tuple_mask,
                                  sizeof (ip6_5tuple_mask) - 1, ~0,
                                  am->l2_output_classify_next_acl_ip6,
                                  &ip6_table_index, 0);
@@ -447,20 +462,20 @@ acl_hook_l2_input_classify (acl_main_t * am, u32 sw_if_index)
   /* in case there were previous tables attached */
   acl_unhook_l2_input_classify (am, sw_if_index);
   rv =
-    acl_classify_add_del_table_big (cm, ip4_5tuple_mask,
+    acl_classify_add_del_table_tiny (cm, ip4_5tuple_mask,
                                sizeof (ip4_5tuple_mask) - 1, ~0,
                                am->l2_input_classify_next_acl_ip4,
                                &ip4_table_index, 1);
   if (rv)
     return rv;
   rv =
-    acl_classify_add_del_table_big (cm, ip6_5tuple_mask,
+    acl_classify_add_del_table_tiny (cm, ip6_5tuple_mask,
                                sizeof (ip6_5tuple_mask) - 1, ~0,
                                am->l2_input_classify_next_acl_ip6,
                                &ip6_table_index, 1);
   if (rv)
     {
-      acl_classify_add_del_table_big (cm, ip4_5tuple_mask,
+      acl_classify_add_del_table_tiny (cm, ip4_5tuple_mask,
                                  sizeof (ip4_5tuple_mask) - 1, ~0,
                                  am->l2_input_classify_next_acl_ip4,
                                  &ip4_table_index, 0);
@@ -474,11 +489,11 @@ acl_hook_l2_input_classify (acl_main_t * am, u32 sw_if_index)
      sw_if_index, ip4_table_index, ip6_table_index);
   if (rv)
     {
-      acl_classify_add_del_table_big (cm, ip6_5tuple_mask,
+      acl_classify_add_del_table_tiny (cm, ip6_5tuple_mask,
                                  sizeof (ip6_5tuple_mask) - 1, ~0,
                                  am->l2_input_classify_next_acl_ip6,
                                  &ip6_table_index, 0);
-      acl_classify_add_del_table_big (cm, ip4_5tuple_mask,
+      acl_classify_add_del_table_tiny (cm, ip4_5tuple_mask,
                                  sizeof (ip4_5tuple_mask) - 1, ~0,
                                  am->l2_input_classify_next_acl_ip4,
                                  &ip4_table_index, 0);
@@ -505,20 +520,20 @@ acl_hook_l2_output_classify (acl_main_t * am, u32 sw_if_index)
   /* in case there were previous tables attached */
   acl_unhook_l2_output_classify (am, sw_if_index);
   rv =
-    acl_classify_add_del_table_big (cm, ip4_5tuple_mask,
+    acl_classify_add_del_table_tiny (cm, ip4_5tuple_mask,
                                sizeof (ip4_5tuple_mask) - 1, ~0,
                                am->l2_output_classify_next_acl_ip4,
                                &ip4_table_index, 1);
   if (rv)
     return rv;
   rv =
-    acl_classify_add_del_table_big (cm, ip6_5tuple_mask,
+    acl_classify_add_del_table_tiny (cm, ip6_5tuple_mask,
                                sizeof (ip6_5tuple_mask) - 1, ~0,
                                am->l2_output_classify_next_acl_ip6,
                                &ip6_table_index, 1);
   if (rv)
     {
-      acl_classify_add_del_table_big (cm, ip4_5tuple_mask,
+      acl_classify_add_del_table_tiny (cm, ip4_5tuple_mask,
                                  sizeof (ip4_5tuple_mask) - 1, ~0,
                                  am->l2_output_classify_next_acl_ip4,
                                  &ip4_table_index, 0);
@@ -532,11 +547,11 @@ acl_hook_l2_output_classify (acl_main_t * am, u32 sw_if_index)
      sw_if_index, ip4_table_index, ip6_table_index);
   if (rv)
     {
-      acl_classify_add_del_table_big (cm, ip6_5tuple_mask,
+      acl_classify_add_del_table_tiny (cm, ip6_5tuple_mask,
                                  sizeof (ip6_5tuple_mask) - 1, ~0,
                                  am->l2_output_classify_next_acl_ip6,
                                  &ip6_table_index, 0);
-      acl_classify_add_del_table_big (cm, ip4_5tuple_mask,
+      acl_classify_add_del_table_tiny (cm, ip4_5tuple_mask,
                                  sizeof (ip4_5tuple_mask) - 1, ~0,
                                  am->l2_output_classify_next_acl_ip4,
                                  &ip4_table_index, 0);
@@ -1808,6 +1823,11 @@ acl_show_aclplugin_fn (vlib_main_t * vm,
         u64 n_dels = sw_if_index < vec_len(am->fa_session_dels_by_sw_if_index) ? am->fa_session_dels_by_sw_if_index[sw_if_index] : 0;
         out0 = format(out0, "sw_if_index %d: add %lu - del %lu = %lu\n", sw_if_index, n_adds, n_dels, n_adds - n_dels);
       }));
+      {
+        u64 n_adds = am->fa_session_total_adds;
+        u64 n_dels = am->fa_session_total_dels;
+        out0 = format(out0, "TOTAL: add %lu - del %lu = %lu\n", n_adds, n_dels, n_adds - n_dels);
+      }
       out0 = format(out0, "\n\nPer-worker data:\n");
       for (wk = 0; wk < vec_len (am->per_worker_data); wk++) {
         acl_fa_per_worker_data_t *pw = &am->per_worker_data[wk];
@@ -1888,9 +1908,7 @@ acl_init (vlib_main_t * vm)
   am->fa_conn_table_hash_memory_size = ACL_FA_CONN_TABLE_DEFAULT_HASH_MEMORY_SIZE;
   am->fa_conn_table_max_entries = ACL_FA_CONN_TABLE_DEFAULT_MAX_ENTRIES;
   vlib_thread_main_t *tm = vlib_get_thread_main ();
-  // vec_validate(am->per_worker_data, os_get_nthreads()-1);
   vec_validate(am->per_worker_data, tm->n_vlib_mains-1);
-  clib_warning("ACL_FA_INIT: per-worker len: %d", vec_len(am->per_worker_data));
   {
     u16 wk;
     u8 tt;
@@ -1904,7 +1922,6 @@ acl_init (vlib_main_t * vm)
       }
     }
   }
-  clib_warning("ACL_FA_INIT-DONE: per-worker len: %d", vec_len(am->per_worker_data));
 
   am->fa_min_deleted_sessions_per_interval = ACL_FA_DEFAULT_MIN_DELETED_SESSIONS_PER_INTERVAL;
   am->fa_max_deleted_sessions_per_interval = ACL_FA_DEFAULT_MAX_DELETED_SESSIONS_PER_INTERVAL;