/* Hey Emacs use -*- mode: C -*- */
/*
 * Copyright (c) 2018 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file
 * This file defines QoS record, store and mark API messages which are generally
 *    called through a shared memory interface.
 *
 * Definitions of verbs:
 *  store: write a QoS value into the buffer meta-data
 *  record: Extract a QoS value from a packet header and store it.
 *  mark: Make a change to the content of a packet header by writing a stored
 *        QoS value
 */
option version = "1.1.1";

import "vnet/ip/ip_types.api";
import "vnet/interface_types.api";

enum qos_source : u8
{
  QOS_API_SOURCE_EXT = 0,
  QOS_API_SOURCE_VLAN = 1,
  QOS_API_SOURCE_MPLS = 2,
  QOS_API_SOURCE_IP = 3,
};

/**
 * QoS store.
 * @param sw_if_index - The interface on which store is enabled.
 * @param input_source - The input source/layer at which the QoS bits are stored
 *                       See qos_source_t. This determines what packets have a
 *                       value stored. i.e. If IP is seleted this affects on IP
 *                       packets.
 * @param value - The value to store.
 */
typedef qos_store
{
  vl_api_interface_index_t sw_if_index;
  vl_api_qos_source_t input_source;
  u8 value;
};

/**
 * Enable/Disable QoS storing
 * The QoS bits from the packet at the specified input layer are copied
 * into the packet. Storeing should be used in conjunction with marking
 * @param enable - enable=1 or disable the feature
 * @param store - Store configuration
 */
autoreply define qos_store_enable_disable
{
  u32 client_index;
  u32 context;
  bool enable [default=true];
  vl_api_qos_store_t store;
};

/**
 * Dump the QoS store configs
 */
define qos_store_dump
{
  u32 client_index;
  u32 context;
};

/**
 * Details of QoS recording configs
 */
define qos_store_details
{
  u32 context;
  vl_api_qos_store_t store;
};

/**
 * QoS recording.
 * @param sw_if_index - The interface on which recording is enabled.
 * @param input_source - The input source/layer at which the QoS bits
                         are copied from the packet. See qos_source_t.
 */
typedef qos_record
{
  vl_api_interface_index_t sw_if_index;
  vl_api_qos_source_t input_source;
};

/**
 * Enable/Disable QoS recording
 * The QoS bits from the packet at the specified input layer are copied
 * into the packet. Recording should be used in conjunction with marking
 * @param enable - enable=1 or disable the feature
 * @param record - Recording configuration
 */
autoreply define qos_record_enable_disable
{
  u32 client_index;
  u32 context;
  bool enable [default=true];
  vl_api_qos_record_t record;
};

/**
 * Dump the QoS record configs
 */
define qos_record_dump
{
  u32 client_index;
  u32 context;
};

/**
 * Details of QoS recording configs
 */
define qos_record_details
{
  u32 context;
  vl_api_qos_record_t record;
};

/**
 * @brief A row within a QoS map
 *  Each value translates from an input value to an output.
 */
typedef qos_egress_map_row
{
  u8 outputs[256];
};

/**
 * QoS Translation Map
 *
 * @param id - client provided identifier for the map
 * @param rows - one row (per-input source) of output values
 */
typedef qos_egress_map
{
  u32 id;
  vl_api_qos_egress_map_row_t rows[4];
};

/**
 *  @brief Update a QoS Map
 *   A QoS map, translates from the QoS value in the packet set by the 'record'
 *   feature, to the value used for output in the 'mark' feature.
 *   There is one row in the map for each input/record source.
 *   The MAP is then applied to the egress interface at for a given output source
 * @param map - The Map
 */
autoreply define qos_egress_map_update
{
  u32 client_index;
  u32 context;
  vl_api_qos_egress_map_t map;
};

/**
 * @brief Delete a Qos Map
 * @param map_id - ID of the map to delete
 */
autoreply define qos_egress_map_delete
{
  u32 client_index;
  u32 context;
  u32 id;
};

/**
 * Dump the QoS egress maps
 */
define qos_egress_map_dump
{
  u32 client_index;
  u32 context;
};

/**
 * QoS map details
 */
define qos_egress_map_details
{
  u32 context;
  vl_api_qos_egress_map_t map;
};

/**
 * QoS marking Cponfiguration
 * The QoS bits from the buffer are mapped (using the desired egress map)
 * into the header of the 'output-source'. Marking should be used in
 * conjunction with recording
 * @param sw_if_index - The interface on which recording is enabled.
 * @param output_source - The output source/layer at which the QoS bits
 *                        are written into the packet. See qos_source_t.
 * @param map_id - The ID of the MAP in which the translation from input
 *                 to output is performed.
 */
typedef qos_mark
{
  u32 sw_if_index;
  u32 map_id;
  vl_api_qos_source_t output_source;
};

/**
 * @brief Enable/Disable QoS marking
 * @param enable - enable=1 or disable the feature
 * @param mark - Marking config
 */
autoreply define qos_mark_enable_disable
{
  u32 client_index;
  u32 context;
  bool enable [default=true];
  vl_api_qos_mark_t mark;
};

/**
 * Dump QoS marking configs
 */
define qos_mark_dump
{
  u32 client_index;
  u32 context;
  vl_api_interface_index_t sw_if_index;
};

/**
 * QoS marking details
 */
autoreply define qos_mark_details
{
  u32 context;
  vl_api_qos_mark_t mark;
};

/*
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */