- :ref:`Extended stats <extstats>`
- RX flow control
- Scattered TX frames
-- :ref:`QoS <qossupport>`
+- :ref:`QoS <extconf>`
- :ref:`Flow API <flowapi>`
- :ref:`Traffic metering and policing <mtrapi>`
- :ref:`Traffic Management API <tmapi>`
- ``tx_errors``: number of TX MAC errors
-.. _qossupport:
+.. _extconf:
-QoS Configuration
------------------
+External Configuration
+----------------------
-QoS configuration is done through external configuration file. Path to the
+Several driver configuration (e.g. QoS) can be done through external configuration file. Path to the
file must be given as `cfg` in driver's vdev parameter list.
Configuration syntax
cbs = <cbs>
[port <portnum> default]
+ dsa_mode = <dsa_mode>
default_tc = <default_tc>
mapping_priority = <mapping_priority>
- ``<portnum>``: DPDK Port number (0..n).
+- ``<dsa_mode>``: Indicate what is the dsa header mode (`none`, `dsa`, or `ext_dsa`).
+
- ``<default_tc>``: Default traffic class (e.g. 0)
- ``<mapping_priority>``: QoS priority for mapping (`ip`, `vlan`, `ip/vlan` or `vlan/ip`).
For an additional description please refer to DPDK :doc:`Traffic Metering and Policing API <../prog_guide/traffic_metering_and_policing>`.
-The policer objects defined by this feature can work with the default policer defined via config file as described in :ref:`QoS Support <qossupport>`.
+The policer objects defined by this feature can work with the default policer defined via config file as described in :ref:`QoS Support <extconf>`.
Limitations
~~~~~~~~~~~
/* Parsing tokens. Defined conveniently, so that any correction is easy. */
#define MRVL_TOK_DEFAULT "default"
+#define MRVL_TOK_DSA_MODE "dsa_mode"
+#define MRVL_TOK_DSA_MODE_NONE "none"
+#define MRVL_TOK_DSA_MODE_DSA "dsa"
+#define MRVL_TOK_DSA_MODE_EXT_DSA "ext_dsa"
#define MRVL_TOK_DEFAULT_TC "default_tc"
#define MRVL_TOK_DSCP "dscp"
#define MRVL_TOK_MAPPING_PRIORITY "mapping_priority"
const char *entry;
char sec_name[32];
- if (file == NULL)
- rte_exit(EXIT_FAILURE, "Cannot load configuration %s\n", path);
+ if (file == NULL) {
+ MRVL_LOG(ERR, "Cannot load configuration %s\n", path);
+ return -1;
+ }
/* Create configuration. This is never accessed on the fast path,
* so we can ignore socket.
*/
*cfg = rte_zmalloc("mrvl_qos_cfg", sizeof(struct mrvl_qos_cfg), 0);
- if (*cfg == NULL)
- rte_exit(EXIT_FAILURE, "Cannot allocate configuration %s\n",
- path);
+ if (*cfg == NULL) {
+ MRVL_LOG(ERR, "Cannot allocate configuration %s\n", path);
+ return -1;
+ }
n = rte_cfgfile_num_sections(file, MRVL_TOK_PORT,
sizeof(MRVL_TOK_PORT) - 1);
continue;
}
+ entry = rte_cfgfile_get_entry(file, sec_name,
+ MRVL_TOK_DSA_MODE);
+ if (entry) {
+ if (!strncmp(entry, MRVL_TOK_DSA_MODE_NONE,
+ sizeof(MRVL_TOK_DSA_MODE_NONE)))
+ (*cfg)->port[n].eth_start_hdr =
+ PP2_PPIO_HDR_ETH;
+ else if (!strncmp(entry, MRVL_TOK_DSA_MODE_DSA,
+ sizeof(MRVL_TOK_DSA_MODE_DSA)))
+ (*cfg)->port[n].eth_start_hdr =
+ PP2_PPIO_HDR_ETH_DSA;
+ else if (!strncmp(entry, MRVL_TOK_DSA_MODE_EXT_DSA,
+ sizeof(MRVL_TOK_DSA_MODE_EXT_DSA))) {
+ (*cfg)->port[n].eth_start_hdr =
+ PP2_PPIO_HDR_ETH_EXT_DSA;
+ } else {
+ MRVL_LOG(ERR,
+ "Error in parsing %s value (%s)!\n",
+ MRVL_TOK_DSA_MODE, entry);
+ return -1;
+ }
+ } else {
+ (*cfg)->port[n].eth_start_hdr = PP2_PPIO_HDR_ETH;
+ }
+
/*
* Read per-port rate limiting. Setting that will
* disable per-queue rate limiting.
(*cfg)->port[n].mapping_priority =
PP2_CLS_QOS_TBL_IP_PRI;
else if (!strncmp(entry, MRVL_TOK_VLAN,
- sizeof(MRVL_TOK_VLAN)))
+ sizeof(MRVL_TOK_VLAN))) {
(*cfg)->port[n].mapping_priority =
PP2_CLS_QOS_TBL_VLAN_PRI;
- else
- rte_exit(EXIT_FAILURE,
+ } else {
+ MRVL_LOG(ERR,
"Error in parsing %s value (%s)!\n",
MRVL_TOK_MAPPING_PRIORITY, entry);
+ return -1;
+ }
} else {
(*cfg)->port[n].mapping_priority =
PP2_CLS_QOS_TBL_VLAN_IP_PRI;
for (i = 0; i < MRVL_PP2_RXQ_MAX; ++i) {
ret = get_outq_cfg(file, n, i, *cfg);
- if (ret < 0)
- rte_exit(EXIT_FAILURE,
+ if (ret < 0) {
+ MRVL_LOG(ERR,
"Error %d parsing port %d outq %d!\n",
ret, n, i);
+ return -1;
+ }
}
for (i = 0; i < MRVL_PP2_TC_MAX; ++i) {
ret = parse_tc_cfg(file, n, i, *cfg);
- if (ret < 0)
- rte_exit(EXIT_FAILURE,
+ if (ret < 0) {
+ MRVL_LOG(ERR,
"Error %d parsing port %d tc %d!\n",
ret, n, i);
+ return -1;
+ }
}
entry = rte_cfgfile_get_entry(file, sec_name,
} else {
if ((*cfg)->port[n].use_global_defaults == 0) {
MRVL_LOG(ERR,
- "Default Traffic Class required in custom configuration!");
+ "Default Traffic Class required in "
+ "custom configuration!");
return -1;
}
}