Flowprobe: Stateful flows and IPv6, L4 recording
[vpp.git] / src / plugins / flowprobe / flowprobe_test.c
similarity index 64%
rename from src/plugins/flowperpkt/flowperpkt_test.c
rename to src/plugins/flowprobe/flowprobe_test.c
index 972a3b0..91793f5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * flowperpkt.c - skeleton vpp-api-test plug-in
+ * flowprobe.c - skeleton vpp-api-test plug-in
  *
  * Copyright (c) <current-year> <your-organization>
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,8 +19,9 @@
 #include <vlibmemory/api.h>
 #include <vlibsocket/api.h>
 #include <vppinfra/error.h>
+#include <flowprobe/flowprobe.h>
 
-#define __plugin_msg_base flowperpkt_test_main.msg_id_base
+#define __plugin_msg_base flowprobe_test_main.msg_id_base
 #include <vlibapi/vat_helper_macros.h>
 
 /**
 uword unformat_sw_if_index (unformat_input_t * input, va_list * args);
 
 /* Declare message IDs */
-#include <flowperpkt/flowperpkt_msg_enum.h>
+#include <flowprobe/flowprobe_msg_enum.h>
 
 /* define message structures */
 #define vl_typedefs
-#include <flowperpkt/flowperpkt_all_api_h.h>
+#include <flowprobe/flowprobe_all_api_h.h>
 #undef vl_typedefs
 
 /* declare message handlers for each api */
 
 #define vl_endianfun           /* define message structures */
-#include <flowperpkt/flowperpkt_all_api_h.h>
+#include <flowprobe/flowprobe_all_api_h.h>
 #undef vl_endianfun
 
 /* instantiate all the print functions we know about */
 #define vl_print(handle, ...)
 #define vl_printfun
-#include <flowperpkt/flowperpkt_all_api_h.h>
+#include <flowprobe/flowprobe_all_api_h.h>
 #undef vl_printfun
 
 /* Get the API version number. */
 #define vl_api_version(n,v) static u32 api_version=(v);
-#include <flowperpkt/flowperpkt_all_api_h.h>
+#include <flowprobe/flowprobe_all_api_h.h>
 #undef vl_api_version
 
 typedef struct
@@ -60,18 +61,19 @@ typedef struct
   u16 msg_id_base;
     /** vat_main_t pointer */
   vat_main_t *vat_main;
-} flowperpkt_test_main_t;
+} flowprobe_test_main_t;
 
-flowperpkt_test_main_t flowperpkt_test_main;
+flowprobe_test_main_t flowprobe_test_main;
 
 #define foreach_standard_reply_retval_handler   \
-_(flowperpkt_tx_interface_add_del_reply)
+_(flowprobe_tx_interface_add_del_reply)        \
+_(flowprobe_params_reply)
 
 #define _(n)                                            \
     static void vl_api_##n##_t_handler                  \
     (vl_api_##n##_t * mp)                               \
     {                                                   \
-        vat_main_t * vam = flowperpkt_test_main.vat_main;   \
+        vat_main_t * vam = flowprobe_test_main.vat_main;   \
         i32 retval = ntohl(mp->retval);                 \
         if (vam->async_mode) {                          \
             vam->async_errors += (retval < 0);          \
@@ -88,17 +90,18 @@ foreach_standard_reply_retval_handler;
  * we just generated
  */
 #define foreach_vpe_api_reply_msg               \
-_(FLOWPERPKT_TX_INTERFACE_ADD_DEL_REPLY,        \
-  flowperpkt_tx_interface_add_del_reply)
+_(FLOWPROBE_TX_INTERFACE_ADD_DEL_REPLY,        \
+  flowprobe_tx_interface_add_del_reply)        \
+_(FLOWPROBE_PARAMS_REPLY, flowprobe_params_reply)
 
 static int
-api_flowperpkt_tx_interface_add_del (vat_main_t * vam)
+api_flowprobe_tx_interface_add_del (vat_main_t * vam)
 {
   unformat_input_t *i = vam->input;
   int enable_disable = 1;
-  u8 which = 0;                        /* ipv4 by default */
+  u8 which = FLOW_VARIANT_IP4;
   u32 sw_if_index = ~0;
-  vl_api_flowperpkt_tx_interface_add_del_t *mp;
+  vl_api_flowprobe_tx_interface_add_del_t *mp;
   int ret;
 
   /* Parse args required to build the message */
@@ -110,8 +113,12 @@ api_flowperpkt_tx_interface_add_del (vat_main_t * vam)
        ;
       else if (unformat (i, "disable"))
        enable_disable = 0;
+      else if (unformat (i, "ip4"))
+       which = FLOW_VARIANT_IP4;
+      else if (unformat (i, "ip6"))
+       which = FLOW_VARIANT_IP6;
       else if (unformat (i, "l2"))
-       which = 1;
+       which = FLOW_VARIANT_L2;
       else
        break;
     }
@@ -123,7 +130,7 @@ api_flowperpkt_tx_interface_add_del (vat_main_t * vam)
     }
 
   /* Construct the API message */
-  M (FLOWPERPKT_TX_INTERFACE_ADD_DEL, mp);
+  M (FLOWPROBE_TX_INTERFACE_ADD_DEL, mp);
   mp->sw_if_index = ntohl (sw_if_index);
   mp->is_add = enable_disable;
   mp->which = which;
@@ -136,17 +143,73 @@ api_flowperpkt_tx_interface_add_del (vat_main_t * vam)
   return ret;
 }
 
+static int
+api_flowprobe_params (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  u8 record_l2 = 0, record_l3 = 0, record_l4 = 0;
+  u32 active_timer = ~0;
+  u32 passive_timer = ~0;
+  vl_api_flowprobe_params_t *mp;
+  int ret;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "active %d", &active_timer))
+       ;
+      else if (unformat (i, "passive %d", &passive_timer))
+       ;
+      else if (unformat (i, "record"))
+       while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+         {
+           if (unformat (i, "l2"))
+             record_l2 = 1;
+           else if (unformat (i, "l3"))
+             record_l3 = 1;
+           else if (unformat (i, "l4"))
+             record_l4 = 1;
+           else
+             break;
+         }
+      else
+       break;
+    }
+
+  if (passive_timer > 0 && active_timer > passive_timer)
+    {
+      errmsg ("Passive timer has to be greater than active one...\n");
+      return -99;
+    }
+
+  /* Construct the API message */
+  M (FLOWPROBE_PARAMS, mp);
+  mp->record_l2 = record_l2;
+  mp->record_l3 = record_l3;
+  mp->record_l4 = record_l4;
+  mp->active_timer = ntohl (active_timer);
+  mp->passive_timer = ntohl (passive_timer);
+
+  /* send it... */
+  S (mp);
+
+  /* Wait for a reply... */
+  W (ret);
+
+  return ret;
+}
+
 /*
  * List of messages that the api test plugin sends,
  * and that the data plane plugin processes
  */
 #define foreach_vpe_api_msg \
-_(flowperpkt_tx_interface_add_del, "<intfc> [disable]")
+_(flowprobe_tx_interface_add_del, "<intfc> [disable]") \
+_(flowprobe_params, "record <[l2] [l3] [l4]> [active <timer> passive <timer>]")
 
 static void
-flowperpkt_vat_api_hookup (vat_main_t * vam)
+flowprobe_vat_api_hookup (vat_main_t * vam)
 {
-  flowperpkt_test_main_t *sm = &flowperpkt_test_main;
+  flowprobe_test_main_t *sm = &flowprobe_test_main;
   /* Hook up handlers for replies from the data plane plug-in */
 #define _(N,n)                                                  \
     vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base),     \
@@ -173,18 +236,18 @@ flowperpkt_vat_api_hookup (vat_main_t * vam)
 clib_error_t *
 vat_plugin_register (vat_main_t * vam)
 {
-  flowperpkt_test_main_t *sm = &flowperpkt_test_main;
+  flowprobe_test_main_t *sm = &flowprobe_test_main;
   u8 *name;
 
   sm->vat_main = vam;
 
   /* Ask the vpp engine for the first assigned message-id */
-  name = format (0, "flowperpkt_%08x%c", api_version, 0);
+  name = format (0, "flowprobe_%08x%c", api_version, 0);
   sm->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
 
   /* Don't attempt to hook up API messages if the data plane plugin is AWOL */
   if (sm->msg_id_base != (u16) ~ 0)
-    flowperpkt_vat_api_hookup (vam);
+    flowprobe_vat_api_hookup (vam);
 
   vec_free (name);