/* Define a simple enable-disable binary API to control the feature */

/** \file
    This file defines the vpp control-plane API messages
    used to control the flowprobe plugin
*/

option version = "2.1.0";

import "vnet/interface_types.api";

enum flowprobe_which_flags : u8
{
  FLOWPROBE_WHICH_FLAG_IP4 = 0x1,
  FLOWPROBE_WHICH_FLAG_L2  = 0x2,
  FLOWPROBE_WHICH_FLAG_IP6 = 0x4,
};

enum flowprobe_which : u8
{
  FLOWPROBE_WHICH_IP4 = 0,
  FLOWPROBE_WHICH_IP6,
  FLOWPROBE_WHICH_L2,
};

enum flowprobe_record_flags : u8
{
  FLOWPROBE_RECORD_FLAG_L2 = 0x1,
  FLOWPROBE_RECORD_FLAG_L3 = 0x2,
  FLOWPROBE_RECORD_FLAG_L4 = 0x4,
};

enum flowprobe_direction : u8
{
  FLOWPROBE_DIRECTION_RX = 0,
  FLOWPROBE_DIRECTION_TX,
  FLOWPROBE_DIRECTION_BOTH,
};

/** \brief Enable / disable per-packet IPFIX recording on an interface
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param is_add - add address if non-zero, else delete
    @param which - flags indicating forwarding path
    @param sw_if_index - index of the interface
*/
autoreply define flowprobe_tx_interface_add_del
{
  option replaced_by="flowprobe_interface_add_del";

  /* Client identifier, set from api_main.my_client_index */
  u32 client_index;

  /* Arbitrary context, so client can match reply to request */
  u32 context;

  /* Enable / disable the feature */
  bool is_add;
  vl_api_flowprobe_which_flags_t which;

  /* Interface handle */
  vl_api_interface_index_t sw_if_index;
  option vat_help = "<intfc> [disable]";
};

/** \brief Enable or disable IPFIX flow record generation on an interface
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param is_add - add interface if non-zero, else delete
    @param which - datapath on which to record flows
    @param direction - direction of recorded flows
    @param sw_if_index - index of the interface
*/
autoreply define flowprobe_interface_add_del
{
  option in_progress;
  u32 client_index;
  u32 context;
  bool is_add;
  vl_api_flowprobe_which_t which;
  vl_api_flowprobe_direction_t direction;
  vl_api_interface_index_t sw_if_index;
  option vat_help = "(<intfc> | sw_if_index <if-idx>) [(ip4|ip6|l2)] [(rx|tx|both)] [disable]";
};

/** \brief Dump interfaces for which IPFIX flow record generation is enabled
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param sw_if_index - interface index to use as filter (0xffffffff is "all")
*/
define flowprobe_interface_dump
{
  option in_progress;
  u32 client_index;
  u32 context;
  vl_api_interface_index_t sw_if_index [default=0xffffffff];
  option vat_help = "[<if-idx>]";
};

/** \brief Details about IPFIX flow record generation enabled on interface
    @param context - sender context which was passed in the request
    @param which - datapath on which to record flows
    @param direction - direction of recorded flows
    @param sw_if_index - index of the interface
*/
define flowprobe_interface_details
{
  option in_progress;
  u32 context;
  vl_api_flowprobe_which_t which;
  vl_api_flowprobe_direction_t direction;
  vl_api_interface_index_t sw_if_index;
};

autoreply define flowprobe_params
{
  option replaced_by="flowprobe_set_params";

  u32 client_index;
  u32 context;
  vl_api_flowprobe_record_flags_t record_flags;
  u32 active_timer;  /* ~0 is off, 0 is default */
  u32 passive_timer; /* ~0 is off, 0 is default */
  option vat_help = "record <[l2] [l3] [l4]> [active <timer> passive <timer>]";
};

/** \brief Set IPFIX flow record generation parameters
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param record_flags - flags indicating what data to record
    @param active_timer - time in seconds after which active flow records are
        to be exported (0 is "off", 0xffffffff is "use default value")
    @param passive_timer - time in seconds after which passive flow records are
        to be deleted (0 is "off", 0xffffffff is "use default value")
*/
autoreply define flowprobe_set_params
{
  option in_progress;
  u32 client_index;
  u32 context;
  vl_api_flowprobe_record_flags_t record_flags;
  u32 active_timer [default=0xffffffff];
  u32 passive_timer [default=0xffffffff];
  option vat_help = "record [l2] [l3] [l4] [active <timer>] [passive <timer>]";
};

/** \brief Get IPFIX flow record generation parameters
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
*/
define flowprobe_get_params
{
  option in_progress;
  u32 client_index;
  u32 context;
};

/** \brief Reply to get IPFIX flow record generation parameters
    @param context - sender context, to match reply w/ request
    @param retval - error (0 is "no error")
    @param record_flags - flags indicating what data to record
    @param active_timer - time in seconds after which active flow records are
        to be exported (0 is "off")
    @param passive_timer - time in seconds after which passive flow records are
        to be deleted (0 is "off")
*/
define flowprobe_get_params_reply
{
  option in_progress;
  u32 context;
  i32 retval;
  vl_api_flowprobe_record_flags_t record_flags;
  u32 active_timer;
  u32 passive_timer;
};