blob: fbb0415ae8790ad73f77ad59017f8e671d92cb74 [file] [log] [blame]
/*
**************************************************************************
* Copyright (c) 2014, 2017-2018 The Linux Foundation. All rights reserved.
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all copies.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
**************************************************************************
*/
/**
* @file nss_shaper.h
* NSS Shaper definitions
*/
#ifndef __NSS_SHAPER_H
#define __NSS_SHAPER_H
/**
* @addtogroup nss_shaper_subsystem
* @{
*/
/**
* nss_shaper_node_types
* Types of shaper nodes that are exported to the HLOS.
*/
enum nss_shaper_node_types {
NSS_SHAPER_NODE_TYPE_CODEL = 1,
NSS_SHAPER_NODE_TYPE_PRIO = 3,
NSS_SHAPER_NODE_TYPE_FIFO = 4,
NSS_SHAPER_NODE_TYPE_TBL = 5,
NSS_SHAPER_NODE_TYPE_BF = 6,
NSS_SHAPER_NODE_TYPE_BF_GROUP = 7,
NSS_SHAPER_NODE_TYPE_WRR = 9,
NSS_SHAPER_NODE_TYPE_WRR_GROUP = 10,
NSS_SHAPER_NODE_TYPE_HTB = 11,
NSS_SHAPER_NODE_TYPE_HTB_GROUP = 12,
NSS_SHAPER_NODE_TYPE_WRED = 13,
NSS_SHAPER_NODE_TYPE_PPE_SN = 14,
NSS_SHAPER_NODE_TYPE_MAX,
};
typedef enum nss_shaper_node_types nss_shaper_node_type_t;
/**< Types of shaper nodes that are exported to the HLOS. */
/**
* nss_shaper_config_types
* Types of shaper configuration messages.
*/
enum nss_shaper_config_types {
NSS_SHAPER_CONFIG_TYPE_ALLOC_SHAPER_NODE,
NSS_SHAPER_CONFIG_TYPE_FREE_SHAPER_NODE,
NSS_SHAPER_CONFIG_TYPE_SET_DEFAULT,
NSS_SHAPER_CONFIG_TYPE_SET_ROOT,
NSS_SHAPER_CONFIG_TYPE_SHAPER_NODE_BASIC_STATS_GET,
NSS_SHAPER_CONFIG_TYPE_SHAPER_NODE_ATTACH,
NSS_SHAPER_CONFIG_TYPE_SHAPER_NODE_DETACH,
NSS_SHAPER_CONFIG_TYPE_SHAPER_NODE_CHANGE_PARAM,
NSS_SHAPER_CONFIG_TYPE_HYBRID_MODE_ENABLE,
NSS_SHAPER_CONFIG_TYPE_HYBRID_MODE_DISABLE,
NSS_SHAPER_CONFIG_TYPE_SHAPER_NODE_MEM_REQ,
};
typedef enum nss_shaper_config_types nss_shaper_config_type_t;
/**< Types of shaper configuration messages. */
/**
* nss_shaper_response_types
* Types of shaper configuration responses.
*/
enum nss_shaper_response_types {
NSS_SHAPER_RESPONSE_TYPE_SUCCESS,
NSS_SHAPER_RESPONSE_TYPE_NO_SHAPER_NODE,
NSS_SHAPER_RESPONSE_TYPE_NO_SHAPER_NODES,
NSS_SHAPER_RESPONSE_TYPE_OLD,
NSS_SHAPER_RESPONSE_TYPE_UNRECOGNISED,
NSS_SHAPER_RESPONSE_TYPE_BAD_DEFAULT_CHOICE,
NSS_SHAPER_RESPONSE_TYPE_DUPLICATE_QOS_TAG,
NSS_SHAPER_RESPONSE_TYPE_TBL_CIR_RATE_AND_BURST_REQUIRED,
NSS_SHAPER_RESPONSE_TYPE_TBL_CIR_BURST_LESS_THAN_MTU,
NSS_SHAPER_RESPONSE_TYPE_CODEL_ALL_PARAMS_REQUIRED,
NSS_SHAPER_RESPONSE_TYPE_BF_GROUP_RATE_AND_BURST_REQUIRED,
NSS_SHAPER_RESPONSE_TYPE_BF_GROUP_BURST_LESS_THAN_MTU,
NSS_SHAPER_RESPONSE_TYPE_CHILD_NOT_BF_GROUP,
NSS_SHAPER_RESPONSE_TYPE_WRR_GROUP_INVALID_QUANTUM,
NSS_SHAPER_RESPONSE_TYPE_CHILD_NOT_WRR_GROUP,
NSS_SHAPER_RESPONSE_TYPE_WRR_INVALID_OPERATION_MODE,
NSS_SHAPER_RESPONSE_TYPE_HTB_GROUP_BURST_LESS_THAN_MTU,
NSS_SHAPER_RESPONSE_TYPE_HTB_GROUP_PRIORITY_OUT_OF_RANGE,
NSS_SHAPER_RESPONSE_TYPE_CHILDREN_BELONG_TO_MIXED_TYPES,
NSS_SHAPER_RESPONSE_TYPE_CHILD_ALREADY_PRESENT,
NSS_SHAPER_RESPONSE_TYPE_CHILD_MISMATCH,
NSS_SHAPER_RESPONSE_TYPE_CHILD_UNSUPPORTED,
NSS_SHAPER_RESPONSE_TYPE_CHILD_NOT_FOUND,
NSS_SHAPER_RESPONSE_TYPE_ATTACH_FAIL,
NSS_SHAPER_RESPONSE_TYPE_WRED_WEIGHT_MODE_INVALID,
NSS_SHAPER_RESPONSE_TYPE_PPE_SN_UCAST_BASE_OFFSET_INVALID,
NSS_SHAPER_RESPONSE_TYPE_PPE_SN_MCAST_BASE_OFFSET_INVALID,
NSS_SHAPER_RESPONSE_TYPE_PPE_SN_UCAST_QUEUE_ALLOC_FAILED,
NSS_SHAPER_RESPONSE_TYPE_PPE_SN_MCAST_QUEUE_ALLOC_FAILED,
NSS_SHAPER_RESPONSE_TYPE_PPE_SN_INVALID_LIMIT,
NSS_SHAPER_RESPONSE_TYPE_PPE_SN_UCAST_QUEUE_CHANGED,
NSS_SHAPER_RESPONSE_TYPE_PPE_SN_MCAST_QUEUE_CHANGED,
NSS_SHAPER_RESPONSE_TYPE_CODEL_FQ_MEM_INSUFFICIENT,
NSS_SHAPER_RESPONSE_TYPE_CODEL_FQ_COUNT_CHANGE_NOT_ALLOWED,
NSS_SHAPER_RESPONSE_TYPE_CODEL_FQ_COUNT_INVALID,
NSS_SHAPER_RESPONSE_TYPE_CODEL_MODE_CHANGE_NOT_ALLOWED,
};
typedef enum nss_shaper_response_types nss_shaper_response_type_t;
/**< Types of shaper configuration responses. */
/**
* nss_shaper_config_alloc_shaper_node
* Message information for allocating a shaper node for a NSS interface.
*/
struct nss_shaper_config_alloc_shaper_node {
nss_shaper_node_type_t node_type; /**< Type of shaper node. */
uint32_t qos_tag; /**< QoS tag of the node. */
};
/**
* nss_shaper_config_free_shaper_node
* Message information for freeing a shaper node from a NSS interface.
*/
struct nss_shaper_config_free_shaper_node {
uint32_t qos_tag; /**< QoS tag of the node. */
};
/**
* nss_shaper_config_set_root_node
* Message information for setting a shaper node as the root.
*/
struct nss_shaper_config_set_root_node {
uint32_t qos_tag; /**< QoS tag of the node. */
};
/**
* nss_shaper_config_set_default_node
* Message information for setting a shaper node as the default node for enqueueing.
*/
struct nss_shaper_config_set_default_node {
uint32_t qos_tag; /**< QoS tag of the node. */
};
/**
* nss_shaper_config_set_hybrid_mode
* Message information for setting a shaper to operate in hybrid mode.
*/
struct nss_shaper_config_set_hybrid_mode {
uint32_t offset; /**< Queue offset for packets sent to the hardware. */
};
/**
* nss_shaper_config_prio_attach
* Message information for attaching a shaper node to a PRIO shaper node.
*/
struct nss_shaper_config_prio_attach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
uint32_t priority; /**< Priority of the child shaper node. */
};
/**
* nss_shaper_config_prio_detach
* Message information for detaching a shaper node from a PRIO shaper node.
*/
struct nss_shaper_config_prio_detach {
uint32_t priority; /**< Priority of the child shaper node. */
};
/**
* nss_shaper_config_codel_alg_param
* Message information for configuring a CoDel algorithm.
*/
struct nss_shaper_config_codel_alg_param {
uint16_t interval; /**< Buffer time to smooth a state transition. */
uint16_t target; /**< Acceptable delay associated with a queue. */
uint16_t mtu; /**< MTU for the associated interface. */
uint16_t reserved; /**< Alignment padding. */
};
/**
* nss_shaper_config_codel_param
* Message information for configuring a CoDel shaper node.
*/
struct nss_shaper_config_codel_param {
int32_t qlen_max; /**< Maximum number of packets that can be enqueued. */
struct nss_shaper_config_codel_alg_param cap;
/**< Configuration for the CoDel algorithm. */
uint32_t flows; /**< Number of flow hash buckets. */
uint32_t flows_mem; /**< Host allocated memory for flow queues. */
uint32_t flows_mem_sz; /**< Memory size allocated for flow queues. */
uint32_t quantum; /**< Quantum (in bytes) to round-robin the flow buckets. */
uint32_t ecn; /**< 0 - ECN disabled, 1 - ECN enabled. */
};
/**
* nss_shaper_config_codel_mem_req
* Message to get CoDel memory requirement per flow queue (needed for fq_codel).
*/
struct nss_shaper_config_codel_mem_req {
uint32_t mem_req; /**< Memory needed per flow queue (in bytes). */
};
/**
* nss_shaper_config_rate_param
* Message information for configuring the rate limiter algorithm.
*/
struct nss_shaper_config_rate_param {
uint32_t rate;
/**< Allowed traffic rate measured in bytes per second. */
uint32_t burst;
/**< Maximum bytes that can be sent in a burst. */
uint32_t max_size;
/**< Maximum size of the supported packets (in bytes). */
/**
* Specifies whether the rate limiter will be bypassed (short circuited).
*/
bool short_circuit;
};
/**
* nss_shaper_configure_tbl_attach
* Message information for attaching a shaper node to a TBL shaper node.
*/
struct nss_shaper_config_tbl_attach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_configure_tbl_param
* Message information for detaching a shaper node from a TBL shaper node.
*/
struct nss_shaper_config_tbl_param {
struct nss_shaper_config_rate_param lap_cir;
/**< Configuration parameters for the committed information rate. */
struct nss_shaper_config_rate_param lap_pir;
/**< Configuration parameters for the peak information rate. */
};
/**
* nss_shaper_config_bf_attach
* Message information for attaching a shaper node to a BF shaper node.
*/
struct nss_shaper_config_bf_attach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_config_bf_detach
* Message information for detaching a shaper node from a BF shaper node.
*/
struct nss_shaper_config_bf_detach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_config_bf_group_attach
* Message information for attaching a shaper node to a BF group shaper node.
*/
struct nss_shaper_config_bf_group_attach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_config_bf_group_param
* Configuration parameters for a BF group shaper node.
*/
struct nss_shaper_config_bf_group_param {
uint32_t quantum;
/**< Smallest increment value for the DRRs. */
struct nss_shaper_config_rate_param lap;
/**< Configuration of the rate control algorithm. */
};
/**
* nss_shaper_config_fifo_limit_set
* Drop modes for the FIFO shaper in the NSS interface.
*/
enum nss_shaper_config_fifo_drop_modes {
NSS_SHAPER_FIFO_DROP_MODE_HEAD = 0,
NSS_SHAPER_FIFO_DROP_MODE_TAIL,
NSS_SHAPER_FIFO_DROP_MODES,
};
typedef enum nss_shaper_config_fifo_drop_modes nss_shaper_config_fifo_drop_mode_t;
/**< Drop modes for the FIFO shaper in the NSS interface. */
/**
* nss_shaper_config_fifo_param
* Message information for configuring a FIFO shaper node.
*/
struct nss_shaper_config_fifo_param {
uint32_t limit; /**< Queue limit in packets. */
nss_shaper_config_fifo_drop_mode_t drop_mode;
/**< FIFO drop mode when a queue is full. */
};
/**
* nss_shaper_config_wred_weight_modes
* Supported weight modes.
*/
enum nss_shaper_config_wred_weight_modes {
NSS_SHAPER_WRED_WEIGHT_MODE_DSCP = 0,
NSS_SHAPER_WRED_WEIGHT_MODES,
};
typedef enum nss_shaper_config_wred_weight_modes nss_shaper_config_wred_weight_mode_t;
/**< Supported weight modes. */
/**
* nss_shaper_red_alg_param
* Message information for configuring the RED algorithm.
*/
struct nss_shaper_red_alg_param {
uint32_t min; /**< Minimum size of the queue. */
uint32_t max; /**< Maximum size of the queue. */
/**
* Probability of dropped packets when the average queue size (qlen_avg) = max.
*/
uint32_t probability;
/**
* Exponential weight factor to calculate the average queue size.
*/
uint32_t exp_weight_factor;
};
/**
* nss_shaper_config_wred_param
* Message information for configuring the WRED algorithm.
*/
struct nss_shaper_config_wred_param {
uint32_t limit; /**< Queue limit in bytes. */
nss_shaper_config_wred_weight_mode_t weight_mode;
/**< WRED weight mode. */
uint32_t traffic_classes; /**< Number of traffic classes (drop probability). */
uint32_t def_traffic_class; /**< Default traffic class used when there is no match. */
uint32_t traffic_id; /**< Traffic class to configure. */
uint32_t weight_mode_value; /**< Value to match the selected header field against. */
struct nss_shaper_red_alg_param rap;
/**< Configuration parameters for the RED algorithm. */
uint8_t ecn; /**< Mark an ECN bit or drop packet. */
};
/**
* nss_shaper_config_wrr_attach
* Message information for attaching a shaper node to a WRR shaper node.
*/
struct nss_shaper_config_wrr_attach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_config_wrr_detach
* Message information for detaching a child node from a WRR shaper node.
*/
struct nss_shaper_config_wrr_detach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_config_wrr_group_attach
* Message information for attaching a shaper node to a WRR group.
*/
struct nss_shaper_config_wrr_group_attach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_wrr_operation_modes
* Modes of WRR operation.
*/
enum nss_shaper_wrr_operation_modes {
NSS_SHAPER_WRR_MODE_ROUND_ROBIN = 0,
NSS_SHAPER_WRR_MODE_FAIR_QUEUEING = 1,
NSS_SHAPER_WRR_MODE_TYPE_MAX,
};
/**
* nss_shaper_config_wrr_param
* Message information for configuring the operation mode of a WRR shaper node.
*/
struct nss_shaper_config_wrr_param {
uint32_t operation_mode; /**< Mode in which to operate. */
};
/**
* nss_shaper_config_wrr_group_param
* Message information for configuring a quantum value of a WRR group shaper node.
*/
struct nss_shaper_config_wrr_group_param {
uint32_t quantum; /**< Smallest increment value for the DRRs. */
};
/**
* nss_shaper_config_htb_attach
* Message information for attaching a shaper node to an HTB shaper node.
*/
struct nss_shaper_config_htb_attach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_config_htb_group_attach
* Message information for attaching a shaper node to an HTB group.
*/
struct nss_shaper_config_htb_group_attach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_config_htb_group_detach
* Message information for detaching a shaper node from an HTB group.
*/
struct nss_shaper_config_htb_group_detach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_config_htb_group_param
* Message information for configuring an HTB group shaper node.
*/
struct nss_shaper_config_htb_group_param {
uint32_t quantum; /**< Smallest increment value for the DRRs. */
uint32_t priority; /**< Value of the priority for this group. */
uint32_t overhead; /**< Overhead in bytes to be added per packet. */
struct nss_shaper_config_rate_param rate_police;
/**< Configuration parameters for the policing rate. */
struct nss_shaper_config_rate_param rate_ceil;
/**< Configuration parameters for the ceiling rate. */
};
/**
* nss_shaper_config_ppe_sn_attach
* Message information for attaching a shaper node to a PPE shaper node.
*/
struct nss_shaper_config_ppe_sn_attach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_config_ppe_sn_detach
* Message information for detaching a shaper node from a PPE shaper node.
*/
struct nss_shaper_config_ppe_sn_detach {
uint32_t child_qos_tag; /**< QoS tag of the child shaper node. */
};
/**
* nss_shaper_config_ppe_sn_type
* Types of PPE shaper nodes.
*/
enum nss_shaper_config_ppe_sn_type {
/*
* Scheduler types.
*/
NSS_SHAPER_CONFIG_PPE_SN_TYPE_HTB,
NSS_SHAPER_CONFIG_PPE_SN_TYPE_HTB_GROUP,
NSS_SHAPER_CONFIG_PPE_SN_TYPE_TBL,
NSS_SHAPER_CONFIG_PPE_SN_TYPE_WRR,
NSS_SHAPER_CONFIG_PPE_SN_TYPE_WRR_GROUP,
NSS_SHAPER_CONFIG_PPE_SN_TYPE_PRIO,
NSS_SHAPER_CONFIG_PPE_SN_SCH_MAX = 0xFF,
/*
* Queue types.
*/
NSS_SHAPER_CONFIG_PPE_SN_TYPE_FIFO,
NSS_SHAPER_CONFIG_PPE_SN_TYPE_RED,
NSS_SHAPER_CONFIG_PPE_SN_TYPE_MAX,
};
/**
* nss_shaper_config_ppe_sn_param
* Message information for configuring a PPE shaper node.
*/
struct nss_shaper_config_ppe_sn_param {
enum nss_shaper_config_ppe_sn_type type;
/**< Type of PPE shaper node. */
uint16_t ucast_base; /**< Resource ID of the base hardware for unicast queue. */
uint16_t ucast_offset; /**< Offset from the base resource ID for unicast queue. */
uint16_t mcast_base; /**< Resource ID of the base hardware for multicast queue. */
uint16_t mcast_offset; /**< Offset from the base resource ID for multicast queue. */
uint8_t port; /**< PPE port on which this shaper node is configured. */
uint8_t reserved; /**< Reserved for padding. */
uint16_t limit; /**< Limit of the queue. */
};
/*
* nss_shaper_node_config
* Configuration messages for all types of shaper nodes.
*/
struct nss_shaper_node_config {
uint32_t qos_tag; /**< ID of the shaper node to be configured. */
/**
* Configuration messages for all types of shaper nodes.
*/
union {
struct nss_shaper_config_prio_attach prio_attach;
/**< Attach a shaper node to a PRIO shaper node. */
struct nss_shaper_config_prio_detach prio_detach;
/**< Detach a shaper node from a PRIO shaper node. */
struct nss_shaper_config_codel_param codel_param;
/**< Configure a CoDel shaper node. */
struct nss_shaper_config_codel_mem_req codel_mem_req;
/**< Get CoDel memory requirement. */
struct nss_shaper_config_tbl_attach tbl_attach;
/**< Attach a shaper node to a TBL shaper node. */
struct nss_shaper_config_tbl_param tbl_param;
/**< Configuration parameters for a TBL shaper node. */
struct nss_shaper_config_bf_attach bf_attach;
/**< Attach a shaper node to a BF shaper node. */
struct nss_shaper_config_bf_detach bf_detach;
/**< Detach a child shaper node from BF shaper node. */
struct nss_shaper_config_bf_group_attach bf_group_attach;
/**< Attach a shaper node to a BF group shaper node. */
struct nss_shaper_config_bf_group_param bf_group_param;
/**< Configure parameters for a BF group shaper node. */
struct nss_shaper_config_fifo_param fifo_param;
/**< Configure a FIFO shaper node. */
struct nss_shaper_config_wrr_attach wrr_attach;
/**< Attach a shaper node to a WRR shaper node. */
struct nss_shaper_config_wrr_detach wrr_detach;
/**< Detach a shaper node from a WRR shaper node. */
struct nss_shaper_config_wrr_param wrr_param;
/**< Configuration parameters for a WRR shaper node . */
struct nss_shaper_config_wrr_group_attach wrr_group_attach;
/**< Attach a shaper node to a WRR group shaper node. */
struct nss_shaper_config_wrr_group_param wrr_group_param;
/**< Configure a WRR group shaper node with a quantum value. */
struct nss_shaper_config_htb_attach htb_attach;
/**< Attach a shaper node to an HTB shaper node. */
struct nss_shaper_config_htb_group_attach htb_group_attach;
/**< Attach a shaper node to an HTB group shaper node. */
struct nss_shaper_config_htb_group_detach htb_group_detach;
/**< Detach a shaper node from an HTB group shaper node. */
struct nss_shaper_config_htb_group_param htb_group_param;
/**< Configuration parameters for an HTB group shaper node. */
struct nss_shaper_config_wred_param wred_param;
/**< Configuration parameters for a WRED shaper node. */
struct nss_shaper_config_ppe_sn_attach ppe_sn_attach;
/**< Attach a shaper node to a PPE shaper node. */
struct nss_shaper_config_ppe_sn_detach ppe_sn_detach;
/**< Detach a shaper node from a PPE shaper node. */
struct nss_shaper_config_ppe_sn_param ppe_sn_param;
/**< Configuration parameters for a PPE shaper node. */
} snc; /**< Types of shaper node configuration messages. */
};
/**
* nss_shaper_node_codel_fq_stats_delta
* CoDel flow queue mode statistics sent as deltas.
*/
struct nss_shaper_node_codel_fq_stats_delta {
uint32_t new_flow_cnt; /**< Total number of new flows seen. */
uint32_t ecn_mark_cnt; /**< Number of packets marked with ECN. */
};
/**
* nss_shaper_node_codel_fq_stats
* CoDel flow queue mode statistics.
*/
struct nss_shaper_node_codel_fq_stats {
struct nss_shaper_node_codel_fq_stats_delta delta;
/**< CoDel flow queue statistics sent as deltas. */
uint32_t new_flows_len; /**< Current number of new flows. */
uint32_t old_flows_len; /**< Current number of old flows. */
uint32_t maxpacket; /**< Largest packet seen so far. */
};
/**
* nss_shaper_node_codel_sq_stats
* CoDel single queue mode statistics.
*/
struct nss_shaper_node_codel_sq_stats {
/**
* Maximum amount of time (in milliseconds) that a packet was in this shaper
* node before being dequeued.
*/
uint32_t packet_latency_peak_msec_dequeued;
/**
* Maximum amount of time (in milliseconds) that a packet was in this shaper
* node before being dropped.
*/
uint32_t packet_latency_peak_msec_dropped;
};
/**
* nss_shaper_node_codel_stats
* CoDel shaper node statistics.
*/
struct nss_shaper_node_codel_stats {
struct nss_shaper_node_codel_sq_stats sq; /**< Single queue mode statistics. */
struct nss_shaper_node_codel_fq_stats fq; /**< Flow queue mode statistics. */
};
/**
* nss_shaper_node_stats_delta
* Statistics that are sent as deltas.
*/
struct nss_shaper_node_stats_delta {
uint32_t enqueued_bytes; /**< Bytes enqueued successfully. */
uint32_t enqueued_packets; /**< Packets enqueued successfully. */
/**
* Bytes dropped during an enqueue operation because of node limits.
*/
uint32_t enqueued_bytes_dropped;
/**
* Packets dropped during an enqueue operation because of node limits.
*/
uint32_t enqueued_packets_dropped;
uint32_t dequeued_bytes;
/**< Bytes dequeued successfully from a shaper node. */
uint32_t dequeued_packets;
/**< Packets dequeued successfully from a shaper node. */
/**
* Bytes dropped by this node during dequeuing (some nodes drop packets during
* dequeuing rather than enqueuing).
*/
uint32_t dequeued_bytes_dropped;
/**
* Packets dropped by this node during dequeuing (some nodes drop packets during
* dequeuing rather than enqueuing).
*/
uint32_t dequeued_packets_dropped;
/**
* Number of times any queue limit was overrun, leading to packet drops.
*/
uint32_t queue_overrun;
uint32_t unused[4]; /**< Reserved for future statistics expansion. */
};
/**
* nss_shaper_node_stats
* Common shaper node statistics.
*/
struct nss_shaper_node_stats {
uint32_t qlen_bytes; /**< Total size of packets waiting in the queue. */
uint32_t qlen_packets; /**< Number of packets waiting in the queue. */
uint32_t unused[4]; /**< Reserved for future statistics expansion. */
struct nss_shaper_node_stats_delta delta;
/**< Statistics that are sent as deltas. */
};
/**
* nss_shaper_node_stats_response
* Statistics response for shaper nodes.
*/
struct nss_shaper_node_stats_response {
struct nss_shaper_node_stats sn_stats; /**< Common shaper node statistics. */
/**
* All shaper nodes that need to maintain unique statistics need
* to add their statistics structure here.
*/
union {
struct nss_shaper_node_codel_stats codel;
/**< CoDel specific statistics. */
} per_sn_stats; /**< Shaper specific statistics. */
};
/**
* nss_shaper_node_stats_get
* Statistics of a shaper node.
*/
struct nss_shaper_node_stats_get {
/*
* Request
*/
uint32_t qos_tag; /**< QoS tag of the shaper node. */
/*
* Response
*/
struct nss_shaper_node_stats_response response;
/**< Shaper node statistics response */
};
/**
* nss_shaper_configure
* Configuration message for a shaper node.
*/
struct nss_shaper_configure {
nss_shaper_config_type_t request_type; /**< Message is a request. */
nss_shaper_response_type_t response_type; /**< Message is a response. */
/**
* Types of configuration messages for a shaper node.
*/
union {
struct nss_shaper_config_alloc_shaper_node alloc_shaper_node;
/**< Allocate a shaper node in the NSS interface. */
struct nss_shaper_config_free_shaper_node free_shaper_node;
/**< Free a shaper node from the NSS interface. */
struct nss_shaper_config_set_default_node set_default_node;
/**< Set a shaper node as the default node for a queue. */
struct nss_shaper_config_set_root_node set_root_node;
/**< Set a shaper node as the root shaper nod. */
struct nss_shaper_config_set_hybrid_mode set_hybrid_mode;
/**< Set a shaper to operate in Hybrid mode. */
struct nss_shaper_node_config shaper_node_config;
/**< Configuration message for any type of shaper node. */
struct nss_shaper_node_stats_get shaper_node_stats_get;
/**< Statistics for a shaper node. */
} msg; /**< Types of configuration messages. */
};
/**
* Registrant callback to receive shaper bounced packets
*
* @datatypes
* sk_buff
*
* @param[in] app_data Pointer to the application context of the message.
* @param[in] skb Pointer to the data socket buffer.
*/
typedef void (*nss_shaper_bounced_callback_t)(void *app_data, struct sk_buff *skb);
/**
* nss_shaper_register_shaping
* Registers a shaper node with the NSS interface for basic shaping operations.
*
* @return
* Pointer to the NSS core context.
*/
extern void *nss_shaper_register_shaping(void);
/**
* nss_shaper_unregister_shaping
* Deregisters a shaper node from the NSS interface.
*
* @param[in] ctx Pointer to the NSS context.
*
* @dependencies
* The shaper node must have been previously registered.
*/
extern void nss_shaper_unregister_shaping(void *ctx);
/**
* nss_shaper_register_shaper_bounce_interface
* Registers a shaper bounce interface with the NSS interface for receiving
* shaper-bounced packets.
*
* @datatypes
* nss_shaper_bounced_callback_t \n
* module
*
* @param[in] if_num NSS interface number.
* @param[in] cb Callback function for the message. This callback is
* invoked when the NSS returns a sk_buff after shaping.
* @param[in] app_data Pointer to the application context of the message.
* This context is passed to the callback together with the
* sk_buff to provide context to the registrant (state).
* @param[in] owner Pointer to the kernel module. The module is held until it deregisters.
*
* @return
* Pointer to the NSS core context.
*/
extern void *nss_shaper_register_shaper_bounce_interface(uint32_t if_num, nss_shaper_bounced_callback_t cb, void *app_data, struct module *owner);
/**
* nss_shaper_unregister_shaper_bounce_interface
* Deregisters a shaper bounce interface from the NSS interface.
*
* @param[in] if_num NSS interface number.
*
* @return
* None.
*
* @dependencies
* The shaper bounce interface must have been previously registered.
*/
extern void nss_shaper_unregister_shaper_bounce_interface(uint32_t if_num);
/**
* nss_shaper_register_shaper_bounce_bridge
* Registers a shaper bounce bridge with the NSS interface for receiving
* shaper-bounced packets.
*
* @datatypes
* nss_shaper_bounced_callback_t \n
* module
*
* @param[in] if_num NSS interface number.
* @param[in] cb Callback function for the message. This callback is
* invoked when the NSS returns a sk_buff after shaping.
* @param[in] app_data Pointer to the application context of the message.
* This context is passed to the callback together with the
* sk_buff to provide context to the registrant (state).
* @param[in] owner Pointer to the kernel module.
*
* @return
* Pointer to the NSS core context.
*/
extern void *nss_shaper_register_shaper_bounce_bridge(uint32_t if_num, nss_shaper_bounced_callback_t cb, void *app_data, struct module *owner);
/**
* nss_shaper_unregister_shaper_bounce_bridge
* Deregisters a shaper bounce bridge from the NSS interface.
*
* @param[in] if_num NSS interface number.
*
* @return
* None.
*
* @dependencies
* The shaper bounce bridge must have been previously registered.
*/
extern void nss_shaper_unregister_shaper_bounce_bridge(uint32_t if_num);
/**
* nss_shaper_bounce_interface_packet
* Issues a packet for shaping via a bounce operation.
*
* @datatypes
* sk_buff
*
* @param[in] ctx Pointer to the NSS context provided during registration.
* @param[in] if_num NSS interface number.
* @param[in] skb Pointer to the data socket buffer.
*
* @return
* Success or failure.
*/
extern nss_tx_status_t nss_shaper_bounce_interface_packet(void *ctx, uint32_t if_num, struct sk_buff *skb);
/**
* nss_shaper_bounce_bridge_packet
* Issues a packet for shaping via a bounce bridge.
*
* @datatypes
* sk_buff
*
* @param[in] ctx Pointer to the NSS context provided during registration.
* @param[in] if_num NSS interface number.
* @param[in] skb Pointer to the data socket buffer.
*
* @return
* Success or failure.
*/
extern nss_tx_status_t nss_shaper_bounce_bridge_packet(void *ctx, uint32_t if_num, struct sk_buff *skb);
/**
* nss_shaper_config_send
* Sends a shaping configuration message.
*
* @datatypes
* nss_shaper_configure
*
* @param[in] ctx Pointer to the NSS context.
* @param[in] config Pointer to the configuration message.
*
* @return
* Indication if the configuration message was issued.
* @par
* This indication does not mean the configuration message was successfully
* processed. Success or failure is provided in the response issued to the
* given callback function as specified in nss_shaper_configure.
*/
nss_tx_status_t nss_shaper_config_send(void *ctx, struct nss_shaper_configure *config);
/**
* nss_shaper_get_device
* Gets the original device from probe.
*
* @return
* Pointer to the device.
*/
extern struct device *nss_shaper_get_dev(void);
/**
* @}
*/
#endif