Discussion:
[dpdk-dev] [PATCH 0/5] convert testpmd to new ethdev offloads API
(too old to reply)
Shahaf Shuler
2017-11-23 12:07:59 UTC
Permalink
This series is to convert testpmd application to the new offloads API [1].

[1] http://dpdk.org/ml/archives/dev/2017-October/077329.html

Shahaf Shuler (5):
app/testpmd: convert to new Ethdev offloads API
app/testpmd: remove txqflags
app/testpmd: add command line option for multiseg
app/testpmd: add command line option for mbuf fast free
app/testpmd: enforce offloads caps

app/test-pmd/cmdline.c | 311 ++++++++++++++---------
app/test-pmd/config.c | 103 +++++---
app/test-pmd/parameters.c | 62 ++---
app/test-pmd/testpmd.c | 55 ++--
app/test-pmd/testpmd.h | 2 +-
doc/guides/testpmd_app_ug/run_app.rst | 20 +-
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 11 -
7 files changed, 332 insertions(+), 232 deletions(-)
--
2.12.0
Shahaf Shuler
2017-11-23 12:08:00 UTC
Permalink
Ethdev Rx/Tx offloads API has changed since:

commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")

Convert the application to use the new API.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 148 +++++++++++++++++++++++++++++++++--------
app/test-pmd/config.c | 97 +++++++++++++++++++--------
app/test-pmd/parameters.c | 35 +++++-----
app/test-pmd/testpmd.c | 24 +++----
4 files changed, 219 insertions(+), 85 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d96301..b0f2325c8 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1577,6 +1577,7 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_max_pkt_len_result *res = parsed_result;
+ uint64_t rx_offloads = rx_mode.offloads;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@@ -1594,14 +1595,16 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,

rx_mode.max_rx_pkt_len = res->value;
if (res->value > ETHER_MAX_LEN)
- rx_mode.jumbo_frame = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
else
- rx_mode.jumbo_frame = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
} else {
printf("Unknown parameter\n");
return;
}

+ rx_mode.offloads = rx_offloads;
+
init_port_config();

cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
@@ -1703,6 +1706,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_rx_mode_flag *res = parsed_result;
+ uint64_t rx_offloads = rx_mode.offloads;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@@ -1711,48 +1715,48 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,

if (!strcmp(res->name, "crc-strip")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_strip_crc = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "scatter")) {
- if (!strcmp(res->value, "on"))
- rx_mode.enable_scatter = 1;
- else if (!strcmp(res->value, "off"))
- rx_mode.enable_scatter = 0;
- else {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ } else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "rx-cksum")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_ip_checksum = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_ip_checksum = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "rx-timestamp")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_timestamp = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_timestamp = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan")) {
if (!strcmp(res->value, "on")) {
- rx_mode.hw_vlan_filter = 1;
- rx_mode.hw_vlan_strip = 1;
+ rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
}
else if (!strcmp(res->value, "off")) {
- rx_mode.hw_vlan_filter = 0;
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
}
else {
printf("Unknown parameter\n");
@@ -1760,27 +1764,27 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
}
} else if (!strcmp(res->name, "hw-vlan-filter")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_filter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_filter = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan-strip")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_strip = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan-extend")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_extend = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_extend = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
else {
printf("Unknown parameter\n");
return;
@@ -1798,6 +1802,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
printf("Unknown parameter\n");
return;
}
+ rx_mode.offloads = rx_offloads;

init_port_config();

@@ -3434,7 +3439,14 @@ cmd_tx_vlan_set_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_result *res = parsed_result;

+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =
@@ -3481,7 +3493,14 @@ cmd_tx_vlan_set_qinq_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_qinq_result *res = parsed_result;

+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
+
tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer);
+
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan =
@@ -3587,7 +3606,14 @@ cmd_tx_vlan_reset_parsed(void *parsed_result,
{
struct cmd_tx_vlan_reset_result *res = parsed_result;

+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
+
tx_vlan_reset(res->port_id);
+
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan =
@@ -3680,11 +3706,16 @@ cmd_csum_parsed(void *parsed_result,
struct cmd_csum_result *res = parsed_result;
int hw = 0;
uint16_t mask = 0;
+ uint64_t csum_offloads = 0;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
printf("invalid port %d\n", res->port_id);
return;
}
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }

if (!strcmp(res->mode, "set")) {

@@ -3693,22 +3724,34 @@ cmd_csum_parsed(void *parsed_result,

if (!strcmp(res->proto, "ip")) {
mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}

- if (hw)
+ if (hw) {
ports[res->port_id].tx_ol_flags |= mask;
- else
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ csum_offloads;
+ } else {
ports[res->port_id].tx_ol_flags &= (~mask);
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ (~csum_offloads);
+ }
}
csum_show(res->port_id);
+
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
}

cmdline_parse_token_string_t cmd_csum_csum =
@@ -3832,15 +3875,24 @@ cmd_tso_set_parsed(void *parsed_result,

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }

if (!strcmp(res->mode, "set"))
ports[res->port_id].tso_segsz = res->tso_segsz;

- if (ports[res->port_id].tso_segsz == 0)
+ if (ports[res->port_id].tso_segsz == 0) {
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_TCP_TSO;
printf("TSO for non-tunneled packets is disabled\n");
- else
+ } else {
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_TCP_TSO;
printf("TSO segment size for non-tunneled packets is %d\n",
ports[res->port_id].tso_segsz);
+ }

/* display warnings if configuration is not supported by the NIC */
rte_eth_dev_info_get(res->port_id, &dev_info);
@@ -3849,6 +3901,8 @@ cmd_tso_set_parsed(void *parsed_result,
printf("Warning: TSO enabled but not "
"supported by port %d\n", res->port_id);
}
+
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
}

cmdline_parse_token_string_t cmd_tso_set_tso =
@@ -3934,13 +3988,27 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }

if (!strcmp(res->mode, "set"))
ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;

- if (ports[res->port_id].tunnel_tso_segsz == 0)
+ if (ports[res->port_id].tunnel_tso_segsz == 0) {
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ ~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO for tunneled packets is disabled\n");
- else {
+ } else {
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO segment size for tunneled packets is %d\n",
ports[res->port_id].tunnel_tso_segsz);

@@ -3966,6 +4034,8 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
printf("Warning: csum set outer-ip must be set to hw "
"if outer L3 is IPv4; not necessary for IPv6\n");
}
+
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
}

cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =
@@ -13004,11 +13074,17 @@ cmd_set_macsec_offload_on_parsed(
portid_t port_id = res->port_id;
int en = (strcmp(res->en_on_off, "on") == 0) ? 1 : 0;
int rp = (strcmp(res->rp_on_off, "on") == 0) ? 1 : 0;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }

ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
#endif
@@ -13017,6 +13093,13 @@ cmd_set_macsec_offload_on_parsed(

switch (ret) {
case 0:
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_MACSEC_INSERT) == 0) {
+ printf("Warning: macsec insert enabled but not "
+ "supported by port %d\n", port_id);
+ }
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
break;
case -ENODEV:
printf("invalid port_id %d\n", port_id);
@@ -13091,14 +13174,21 @@ cmd_set_macsec_offload_off_parsed(

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }

ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_disable(port_id);
#endif

switch (ret) {
case 0:
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
break;
case -ENODEV:
printf("invalid port_id %d\n", port_id);
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index cd2ac1164..9b6ffeca9 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -540,14 +540,12 @@ port_infos_display(portid_t port_id)
void
port_offload_cap_display(portid_t port_id)
{
- struct rte_eth_dev *dev;
struct rte_eth_dev_info dev_info;
static const char *info_border = "************";

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

- dev = &rte_eth_devices[port_id];
rte_eth_dev_info_get(port_id, &dev_info);

printf("\n%s Port %d supported offload features: %s\n",
@@ -555,7 +553,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_VLAN_STRIP) {
printf("VLAN stripped: ");
- if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_VLAN_STRIP)
printf("on\n");
else
printf("off\n");
@@ -563,7 +562,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_QINQ_STRIP) {
printf("Double VLANs stripped: ");
- if (dev->data->dev_conf.rxmode.hw_vlan_extend)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_VLAN_EXTEND)
printf("on\n");
else
printf("off\n");
@@ -571,7 +571,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
printf("RX IPv4 checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -579,7 +580,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM) {
printf("RX UDP checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_UDP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -587,18 +589,26 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
printf("RX TCP checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TCP_CKSUM)
printf("on\n");
else
printf("off\n");
}

- if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
- printf("RX Outer IPv4 checksum: on");
+ if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) {
+ printf("RX Outer IPv4 checksum: ");
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
+ printf("on\n");
+ else
+ printf("off\n");
+ }

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO) {
printf("Large receive offload: ");
- if (dev->data->dev_conf.rxmode.enable_lro)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TCP_LRO)
printf("on\n");
else
printf("off\n");
@@ -606,8 +616,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
printf("VLAN insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_VLAN_INSERT)
printf("on\n");
else
printf("off\n");
@@ -615,7 +625,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TIMESTAMP) {
printf("HW timestamp: ");
- if (dev->data->dev_conf.rxmode.hw_timestamp)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TIMESTAMP)
printf("on\n");
else
printf("off\n");
@@ -623,8 +634,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) {
printf("Double VLANs insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_QINQ_INSERT)
printf("on\n");
else
printf("off\n");
@@ -632,7 +643,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
printf("TX IPv4 checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -640,7 +652,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {
printf("TX UDP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_UDP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -648,7 +661,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
printf("TX TCP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_TCP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -656,7 +670,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) {
printf("TX SCTP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_SCTP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -664,8 +679,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
printf("TX Outer IPv4 checksum: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -673,7 +688,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) {
printf("TX TCP segmentation: ");
- if (ports[port_id].tso_segsz != 0)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_TCP_TSO)
printf("on\n");
else
printf("off\n");
@@ -681,7 +697,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TSO) {
printf("TX UDP segmentation: ");
- if (ports[port_id].tso_segsz != 0)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_UDP_TSO)
printf("on\n");
else
printf("off\n");
@@ -689,7 +706,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO) {
printf("TSO for VXLAN tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_VXLAN_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -697,7 +715,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO) {
printf("TSO for GRE tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_GRE_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -705,7 +724,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO) {
printf("TSO for IPIP tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -713,7 +733,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO) {
printf("TSO for GENEVE tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -1658,7 +1679,8 @@ rxtx_config_display(void)
printf(" %s packet forwarding%s - CRC stripping %s - "
"packets/burst=%d\n", cur_fwd_eng->fwd_mode_name,
retry_enabled == 0 ? "" : " with retry",
- rx_mode.hw_strip_crc ? "enabled" : "disabled",
+ (ports[0].dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP) ?
+ "enabled" : "disabled",
nb_pkt_per_burst);

if (cur_fwd_eng == &tx_only_engine || cur_fwd_eng == &flow_gen_engine)
@@ -2758,6 +2780,8 @@ void
tx_vlan_set(portid_t port_id, uint16_t vlan_id)
{
int vlan_offload;
+ struct rte_eth_dev_info dev_info;
+
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
if (vlan_id_is_invalid(vlan_id))
@@ -2771,13 +2795,21 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)

tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) == 0) {
+ printf("Warning: vlan insert enabled but not "
+ "supported by port %d\n", port_id);
+ }
}

void
tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
{
int vlan_offload;
+ struct rte_eth_dev_info dev_info;
+
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
if (vlan_id_is_invalid(vlan_id))
@@ -2793,8 +2825,14 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)

tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
ports[port_id].tx_vlan_id_outer = vlan_id_outer;
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) {
+ printf("Warning: qinq insert enabled but not "
+ "supported by port %d\n", port_id);
+ }
}

void
@@ -2804,6 +2842,9 @@ tx_vlan_reset(portid_t port_id)
return;
ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
TESTPMD_TX_OFFLOAD_INSERT_QINQ);
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~(DEV_TX_OFFLOAD_VLAN_INSERT |
+ DEV_TX_OFFLOAD_QINQ_INSERT);
ports[port_id].tx_vlan_id = 0;
ports[port_id].tx_vlan_id_outer = 0;
}
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 84e7a63ef..0ba73cad5 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -566,6 +566,8 @@ launch_args_parse(int argc, char** argv)
char **argvopt;
int opt_idx;
enum { TX, RX };
+ /* Default Rx offloads for all ports. */
+ uint64_t rx_offloads = rx_mode.offloads;

static struct option lgopts[] = {
{ "help", 0, 0, 0 },
@@ -804,7 +806,8 @@ launch_args_parse(int argc, char** argv)
if (n >= ETHER_MIN_LEN) {
rx_mode.max_rx_pkt_len = (uint32_t) n;
if (n > ETHER_MAX_LEN)
- rx_mode.jumbo_frame = 1;
+ rx_offloads |=
+ DEV_RX_OFFLOAD_JUMBO_FRAME;
} else
rte_exit(EXIT_FAILURE,
"Invalid max-pkt-len=%d - should be > %d\n",
@@ -897,34 +900,31 @@ launch_args_parse(int argc, char** argv)
}
#endif
if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
- rx_mode.enable_lro = 1;
- if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
- rx_mode.enable_scatter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
+ if (!strcmp(lgopts[opt_idx].name, "enable-scatter")) {
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ }
if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum"))
- rx_mode.hw_ip_checksum = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
if (!strcmp(lgopts[opt_idx].name,
"enable-rx-timestamp"))
- rx_mode.hw_timestamp = 1;
-
- if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) {
- rx_mode.hw_vlan_filter = 0;
- rx_mode.hw_vlan_strip = 0;
- rx_mode.hw_vlan_extend = 0;
- }
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
+ if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-filter"))
- rx_mode.hw_vlan_filter = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-strip"))
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-extend"))
- rx_mode.hw_vlan_extend = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;

if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))
rx_drop_en = 1;
@@ -1140,4 +1140,7 @@ launch_args_parse(int argc, char** argv)
break;
}
}
+
+ /* Set offload configuration from command line parameters. */
+ rx_mode.offloads = rx_offloads;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index c3ab44849..e3a7c26b8 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1;
*/
struct rte_eth_rxmode rx_mode = {
.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */
- .split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled. */
- .hw_ip_checksum = 0, /**< IP checksum offload disabled. */
- .hw_vlan_filter = 1, /**< VLAN filtering enabled. */
- .hw_vlan_strip = 1, /**< VLAN strip enabled. */
- .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */
- .hw_strip_crc = 1, /**< CRC stripping by hardware enabled. */
- .hw_timestamp = 0, /**< HW timestamp enabled. */
+ .offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP |
+ DEV_RX_OFFLOAD_CRC_STRIP),
+ .ignore_offload_bitfield = 1, /**< Use rte_eth_rxq_conf offloads API */
};

struct rte_fdir_conf fdir_conf = {
@@ -1495,6 +1490,10 @@ start_port(portid_t pid)
}
if (port->need_reconfig_queues > 0) {
port->need_reconfig_queues = 0;
+ /* Use rte_eth_txq_conf offloads API */
+ port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;
+ /* Apply Tx offloads configuration */
+ port->tx_conf.offloads = port->dev_conf.txmode.offloads;
/* setup tx queues */
for (qi = 0; qi < nb_txq; qi++) {
if ((numa_support) &&
@@ -1521,6 +1520,8 @@ start_port(portid_t pid)
port->need_reconfig_queues = 1;
return -1;
}
+ /* Apply Rx offloads configuration */
+ port->rx_conf.offloads = port->dev_conf.rxmode.offloads;
/* setup rx queues */
for (qi = 0; qi < nb_rxq; qi++) {
if ((numa_support) &&
@@ -1534,7 +1535,6 @@ start_port(portid_t pid)
rxring_numa[pi]);
return -1;
}
-
diag = rte_eth_rx_queue_setup(pi, qi,
nb_rxd,rxring_numa[pi],
&(port->rx_conf),mp);
@@ -2252,7 +2252,7 @@ init_port_dcb_config(portid_t pid,
retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
if (retval < 0)
return retval;
- port_conf.rxmode.hw_vlan_filter = 1;
+ port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;

/**
* Write the configuration into the device.
@@ -2301,7 +2301,7 @@ init_port_dcb_config(portid_t pid,

rxtx_port_config(rte_port);
/* VLAN filter */
- rte_port->dev_conf.rxmode.hw_vlan_filter = 1;
+ rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
for (i = 0; i < RTE_DIM(vlan_tags); i++)
rx_vft_set(pid, vlan_tags[i], 1);
--
2.12.0
Ferruh Yigit
2017-12-04 22:31:00 UTC
Permalink
Post by Shahaf Shuler
commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
Convert the application to use the new API.
Hi Shahaf,

As far as I can see patch does a few things:
1- Convert rxmode bitfields usage to rxmode offloads usage.
2- Apply some config options to port config and add some port config checks.
3- Adding device advertised capability checks for some offloads.

Would you mind separate 2 and 3 to their own patches, with that 1 should be
straightforward and 2 & 3 will be easy to review.


And is this update tested with PMDs both support new offload method and old
offload method?

Thanks,
ferruh
<...>
Post by Shahaf Shuler
} else if (!strcmp(res->name, "hw-vlan-extend")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_extend = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
Not related to this patch, but since you are touching these, what is the
difference between DEV_RX_OFFLOAD_VLAN_EXTEND and DEV_RX_OFFLOAD_QINQ_STRIP ?
Post by Shahaf Shuler
@@ -3434,7 +3439,14 @@ cmd_tx_vlan_set_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_result *res = parsed_result;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
rte_eth_rxmode bitfields to "offloads" conversion is mostly straightforward, but
is above kind of modifications part of this conversion or are you adding missing
checks?

I would prefer making only conversion related changes in this patch, and extra
improvements in other patch.
Post by Shahaf Shuler
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
Is this required for converting bitfield to offloads usage?
Post by Shahaf Shuler
}
cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =
@@ -3481,7 +3493,14 @@ cmd_tx_vlan_set_qinq_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_qinq_result *res = parsed_result;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
Same for all occurrence of these updates.

<...>
Post by Shahaf Shuler
@@ -3693,22 +3724,34 @@ cmd_csum_parsed(void *parsed_result,
if (!strcmp(res->proto, "ip")) {
mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}
- if (hw)
+ if (hw) {
ports[res->port_id].tx_ol_flags |= mask;
- else
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ csum_offloads;
So you are updating port config as well as testpmd internal configuration, again
I guess this is not related to conversion to offloads usage.

<...>
Post by Shahaf Shuler
@@ -13017,6 +13093,13 @@ cmd_set_macsec_offload_on_parsed(
switch (ret) {
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_MACSEC_INSERT) == 0) {
+ printf("Warning: macsec insert enabled but not "
+ "supported by port %d\n", port_id);
+ }
This also adding another layer of check if device advertise requested
capability, this is an improvement independent from conversion, can you please
separate into its own patch?

<...>
Post by Shahaf Shuler
@@ -606,8 +616,8 @@ port_offload_cap_display(portid_t port_id)
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
printf("VLAN insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_VLAN)
This is removing testpmd local config check, just to double check if all places
that updates this local config covered to update device config variable?

And do we still need testpmd tx_ol_flags after these changes?

<...>
Post by Shahaf Shuler
@@ -1658,7 +1679,8 @@ rxtx_config_display(void)
printf(" %s packet forwarding%s - CRC stripping %s - "
"packets/burst=%d\n", cur_fwd_eng->fwd_mode_name,
retry_enabled == 0 ? "" : " with retry",
- rx_mode.hw_strip_crc ? "enabled" : "disabled",
+ (ports[0].dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP) ?
+ "enabled" : "disabled",
There is a global config option in testpmd, for all ports. Previous log was
print based on that config option, but now you are printing the value of first port.

I believe it is wrong to display only first port values, either log can be
updated to say testpmd default configs, or remove completely, or print for all
ports, what do you think?

<...>
Post by Shahaf Shuler
@@ -897,34 +900,31 @@ launch_args_parse(int argc, char** argv)
}
#endif
if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
- rx_mode.enable_lro = 1;
- if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
- rx_mode.enable_scatter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
+ if (!strcmp(lgopts[opt_idx].name, "enable-scatter")) {
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ }
Can drop "{}"

<...>
Post by Shahaf Shuler
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index c3ab44849..e3a7c26b8 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1;
*/
struct rte_eth_rxmode rx_mode = {
.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */
- .split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled. */
- .hw_ip_checksum = 0, /**< IP checksum offload disabled. */
- .hw_vlan_filter = 1, /**< VLAN filtering enabled. */
- .hw_vlan_strip = 1, /**< VLAN strip enabled. */
- .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */
- .hw_strip_crc = 1, /**< CRC stripping by hardware enabled. */
- .hw_timestamp = 0, /**< HW timestamp enabled. */
+ .offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP |
+ DEV_RX_OFFLOAD_CRC_STRIP),
+ .ignore_offload_bitfield = 1, /**< Use rte_eth_rxq_conf offloads API */
Is comment correct?
Flag has two meaning I guess,
1) Ignore bitfield values for port based offload configuration.
2) For rxq, use rx_conf.offloads field.

testpmd is still using port based offload (rte_eth_rxmode) but "offloads"
variable instead of bitfields, right? queue specific ones are copy of port configs.

<...>
Shahaf Shuler
2017-12-05 06:39:26 UTC
Permalink
Post by Ferruh Yigit
commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API") commit
cba7f53b717d ("ethdev: introduce Tx queue offloads API")
Convert the application to use the new API.
Hi Shahaf,
1- Convert rxmode bitfields usage to rxmode offloads usage.
2- Apply some config options to port config and add some port config checks.
3- Adding device advertised capability checks for some offloads.
Would you mind separate 2 and 3 to their own patches, with that 1 should be
straightforward and 2 & 3 will be easy to review.
See below comments. #2 on your list is actually needed for the conversion patch.
I can split the extra cap check if you fill it needs to be in a separate patch.
Post by Ferruh Yigit
And is this update tested with PMDs both support new offload method and
old offload method?
It was tested with mlx5 and mlx4 PMD after the conversion to the new APIs.
I put this series early so everyone can try, test and report if something is broken.
I will try to do more testing with the old mlx PMD.

BTW - we agreed that we set DD for all PMDs to move to the new API by 18.02. I still haven't see patches for that from the rest.
Post by Ferruh Yigit
Thanks,
ferruh
<...>
} else if (!strcmp(res->name, "hw-vlan-extend")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_extend = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
Not related to this patch, but since you are touching these, what is the
difference between DEV_RX_OFFLOAD_VLAN_EXTEND and
DEV_RX_OFFLOAD_QINQ_STRIP ?
Good question, I could not figure it out either.
I guess those are identical. In the old API the hw_vlan_extend was the offload and the DEV_RX_OFFLOAD_QINQ_STRIP was the cap.
Now that we merged them we have duplication.

From one side, using DEV_RX_OFFLOAD_VLAN_EXTEND is more intuitive for application which previously used hw_vlan_extend to set the offload,
For the other side QINQ_STRIP is more explicit with respect to what the feature does, and it is the flag which is currently being used for PMDs.

So when we will change it, I guess I am in favor of the QINQ flag.
Post by Ferruh Yigit
@@ -3434,7 +3439,14 @@ cmd_tx_vlan_set_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_result *res = parsed_result;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
rte_eth_rxmode bitfields to "offloads" conversion is mostly straightforward,
but is above kind of modifications part of this conversion or are you adding
missing checks?
It is part of the conversion and this is related to testpmd design.

Previously in the old API the tx offloads were set even after the port is started. For this specific example the vlan insert just changed a flag (TESTPMD_TX_OFFLOAD_INSERT_VLAN) on the application port struct to use PKT_TX_VLAN_PKT in the mbuf ol_flags. The application didn't update the PMD in anyway. In fact, it was possible to put txq_flag which says no vlan insertion and then to set vlan insertion through the CLI.
This was OK back then because all of the Tx offloads were set by default and we assumed users know what they are doing when setting the txq_flags.

Now all the tx offloads are disabled by default. Every Tx offload being used should update the PMD (as it may need to switch tx burst function). This is why the Tx offloads configuration must be done when the port is stopped, and be followed with reconfiguration of the device and the queues.
Post by Ferruh Yigit
I would prefer making only conversion related changes in this patch, and
extra improvements in other patch.
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
Is this required for converting bitfield to offloads usage?
Yes, see above.
Post by Ferruh Yigit
}
struct cmd_tx_vlan_set_qinq_result *res = parsed_result;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
Same for all occurrence of these updates.
<...>
@@ -3693,22 +3724,34 @@ cmd_csum_parsed(void *parsed_result,
if (!strcmp(res->proto, "ip")) {
mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+ csum_offloads |=
DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}
- if (hw)
+ if (hw) {
ports[res->port_id].tx_ol_flags |= mask;
- else
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ csum_offloads;
So you are updating port config as well as testpmd internal configuration,
again I guess this is not related to conversion to offloads usage.
It is. See above.
The port config will be used for the reconfiguration of the device and queues. This is a must for the Tx offloads .
Post by Ferruh Yigit
<...>
@@ -13017,6 +13093,13 @@ cmd_set_macsec_offload_on_parsed(
switch (ret) {
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_MACSEC_INSERT) == 0) {
+ printf("Warning: macsec insert enabled but not "
+ "supported by port %d\n", port_id);
+ }
This also adding another layer of check if device advertise requested
capability, this is an improvement independent from conversion, can you
please separate into its own patch?
Yes we can do it.
Post by Ferruh Yigit
<...>
@@ -606,8 +616,8 @@ port_offload_cap_display(portid_t port_id)
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
printf("VLAN insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_VLAN)
This is removing testpmd local config check, just to double check if all places
that updates this local config covered to update device config variable?
I hope so. If you find something I missed let me know :).
Post by Ferruh Yigit
And do we still need testpmd tx_ol_flags after these changes?
Currently those flags are being used. One can prepare another patch to remove those and use the port config flags instead.
This is not related to the conversion and could be a nice cleanup.
Post by Ferruh Yigit
<...>
@@ -1658,7 +1679,8 @@ rxtx_config_display(void)
printf(" %s packet forwarding%s - CRC stripping %s - "
"packets/burst=%d\n", cur_fwd_eng->fwd_mode_name,
retry_enabled == 0 ? "" : " with retry",
- rx_mode.hw_strip_crc ? "enabled" : "disabled",
+ (ports[0].dev_conf.rxmode.offloads &
DEV_RX_OFFLOAD_CRC_STRIP) ?
+ "enabled" : "disabled",
There is a global config option in testpmd, for all ports. Previous log was print
based on that config option, but now you are printing the value of first port.
Not exactly (there are multiple wrong issues with this function). For example the next lines are:

if (cur_fwd_eng == &tx_only_engine || cur_fwd_eng == &flow_gen_engine)
printf(" packet len=%u - nb packet segments=%d\n",
(unsigned)tx_pkt_length, (int) tx_pkt_nb_segs);

struct rte_eth_rxconf *rx_conf = &ports[0].rx_conf;
struct rte_eth_txconf *tx_conf = &ports[0].tx_conf;

the last were added by commit f2c5125a686a ("app/testpmd: use default Rx/Tx port configuration").

As you can see port[0] is the one being used for the rest of the configuration print.
Post by Ferruh Yigit
I believe it is wrong to display only first port values, either log can be updated
to say testpmd default configs, or remove completely, or print for all ports,
what do you think?
IMO it is the best to print for all ports.
Post by Ferruh Yigit
<...>
@@ -897,34 +900,31 @@ launch_args_parse(int argc, char** argv)
}
#endif
if (!strcmp(lgopts[opt_idx].name, "disable-crc-
strip"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &=
~DEV_RX_OFFLOAD_CRC_STRIP;
if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
- rx_mode.enable_lro = 1;
- if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
- rx_mode.enable_scatter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
+ if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
{
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ }
Can drop "{}"
Yes.
Post by Ferruh Yigit
<...>
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
c3ab44849..e3a7c26b8 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1;
*/
struct rte_eth_rxmode rx_mode = {
.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame
length. */
- .split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled. */
- .hw_ip_checksum = 0, /**< IP checksum offload disabled. */
- .hw_vlan_filter = 1, /**< VLAN filtering enabled. */
- .hw_vlan_strip = 1, /**< VLAN strip enabled. */
- .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */
- .hw_strip_crc = 1, /**< CRC stripping by hardware enabled. */
- .hw_timestamp = 0, /**< HW timestamp enabled. */
+ .offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP |
+ DEV_RX_OFFLOAD_CRC_STRIP),
+ .ignore_offload_bitfield = 1, /**< Use rte_eth_rxq_conf offloads API
+*/
Is comment correct?
No I should remove it.
Post by Ferruh Yigit
Flag has two meaning I guess,
1) Ignore bitfield values for port based offload configuration.
It is only this meaning.
Post by Ferruh Yigit
2) For rxq, use rx_conf.offloads field.
testpmd is still using port based offload (rte_eth_rxmode) but "offloads"
variable instead of bitfields, right?
Right.

queue specific ones are copy
Ferruh Yigit
2017-12-06 22:57:31 UTC
Permalink
Post by Shahaf Shuler
Post by Ferruh Yigit
commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API") commit
cba7f53b717d ("ethdev: introduce Tx queue offloads API")
Convert the application to use the new API.
Hi Shahaf,
1- Convert rxmode bitfields usage to rxmode offloads usage.
2- Apply some config options to port config and add some port config checks.
3- Adding device advertised capability checks for some offloads.
Would you mind separate 2 and 3 to their own patches, with that 1 should be
straightforward and 2 & 3 will be easy to review.
See below comments. #2 on your list is actually needed for the conversion patch.
Please see below comment [1] for it.
Post by Shahaf Shuler
I can split the extra cap check if you fill it needs to be in a separate patch.
I find it hard to review this patch, splitting is to make easier to understand
the changes, there is no extra need.
Post by Shahaf Shuler
Post by Ferruh Yigit
And is this update tested with PMDs both support new offload method and
old offload method?
It was tested with mlx5 and mlx4 PMD after the conversion to the new APIs.
I put this series early so everyone can try, test and report if something is broken.
I will try to do more testing with the old mlx PMD.
BTW - we agreed that we set DD for all PMDs to move to the new API by 18.02. I still haven't see patches for that from the rest.>
Post by Ferruh Yigit
Thanks,
ferruh
<...>
} else if (!strcmp(res->name, "hw-vlan-extend")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_extend = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
Not related to this patch, but since you are touching these, what is the
difference between DEV_RX_OFFLOAD_VLAN_EXTEND and
DEV_RX_OFFLOAD_QINQ_STRIP ?
Good question, I could not figure it out either.
I guess those are identical. In the old API the hw_vlan_extend was the offload and the DEV_RX_OFFLOAD_QINQ_STRIP was the cap.
Now that we merged them we have duplication.
From one side, using DEV_RX_OFFLOAD_VLAN_EXTEND is more intuitive for application which previously used hw_vlan_extend to set the offload,
For the other side QINQ_STRIP is more explicit with respect to what the feature does, and it is the flag which is currently being used for PMDs.
So when we will change it, I guess I am in favor of the QINQ flag.
+1 to QINQ.
Post by Shahaf Shuler
Post by Ferruh Yigit
@@ -3434,7 +3439,14 @@ cmd_tx_vlan_set_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_result *res = parsed_result;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
rte_eth_rxmode bitfields to "offloads" conversion is mostly straightforward,
but is above kind of modifications part of this conversion or are you adding
missing checks?
It is part of the conversion and this is related to testpmd design.
Previously in the old API the tx offloads were set even after the port is started. For this specific example the vlan insert just changed a flag (TESTPMD_TX_OFFLOAD_INSERT_VLAN) on the application port struct to use PKT_TX_VLAN_PKT in the mbuf ol_flags. The application didn't update the PMD in anyway. In fact, it was possible to put txq_flag which says no vlan insertion and then to set vlan insertion through the CLI.
As you said, so I am a little concerned if missing something, because otherwise
how this was working previously?
Post by Shahaf Shuler
This was OK back then because all of the Tx offloads were set by default and we assumed users know what they are doing when setting the txq_flags.
Now all the tx offloads are disabled by default. Every Tx offload being used should update the PMD (as it may need to switch tx burst function). This is why the Tx offloads configuration must be done when the port is stopped, and be followed with reconfiguration of the device and the queues.
[1]
Not agree on this part. Indeed you are fixing a behavior of the testpmd, not
just converting to new method. Technically you can provide same old config with
new flags, like enable all tx offloads, so behavior should be same.

Later can fix testpmd in another patch, this gives a better separation.

And for example I remember Konstatin mentioned some Intel NICs can accept vlan
related configuration updates without stopping the forwarding, we can discuss
these kind of things in this fix patch.

Just suggesting removing straightforward bitfield to offloads bitwise changes
out of way, and focus on what logic is changing.
Post by Shahaf Shuler
Post by Ferruh Yigit
I would prefer making only conversion related changes in this patch, and
extra improvements in other patch.
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
Is this required for converting bitfield to offloads usage?
Yes, see above.
btw, why RTE_PORT_ALL, just providing a port_id also should be OK.
Post by Shahaf Shuler
Post by Ferruh Yigit
}
struct cmd_tx_vlan_set_qinq_result *res = parsed_result;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
Same for all occurrence of these updates.
<...>
@@ -3693,22 +3724,34 @@ cmd_csum_parsed(void *parsed_result,
if (!strcmp(res->proto, "ip")) {
mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+ csum_offloads |=
DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}
- if (hw)
+ if (hw) {
ports[res->port_id].tx_ol_flags |= mask;
- else
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ csum_offloads;
So you are updating port config as well as testpmd internal configuration,
again I guess this is not related to conversion to offloads usage.
It is. See above.
The port config will be used for the reconfiguration of the device and queues. This is a must for the Tx offloads .
Post by Ferruh Yigit
<...>
@@ -13017,6 +13093,13 @@ cmd_set_macsec_offload_on_parsed(
switch (ret) {
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_MACSEC_INSERT) == 0) {
+ printf("Warning: macsec insert enabled but not "
+ "supported by port %d\n", port_id);
+ }
This also adding another layer of check if device advertise requested
capability, this is an improvement independent from conversion, can you
please separate into its own patch?
Yes we can do it.
Post by Ferruh Yigit
<...>
@@ -606,8 +616,8 @@ port_offload_cap_display(portid_t port_id)
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
printf("VLAN insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_VLAN)
This is removing testpmd local config check, just to double check if all places
that updates this local config covered to update device config variable?
I hope so. If you find something I missed let me know :).
If you are not sure, and if you are not removing tx_ol_flags, what is the
benefit of replacing?

Whoever does the work removing tx_ol_flags can do replacing, this also ensures
all instances updated, no?
Post by Shahaf Shuler
Post by Ferruh Yigit
And do we still need testpmd tx_ol_flags after these changes?
Currently those flags are being used. One can prepare another patch to remove those and use the port config flags instead.
This is not related to the conversion and could be a nice cleanup.
Post by Ferruh Yigit
<...>
@@ -1658,7 +1679,8 @@ rxtx_config_display(void)
printf(" %s packet forwarding%s - CRC stripping %s - "
"packets/burst=%d\n", cur_fwd_eng->fwd_mode_name,
retry_enabled == 0 ? "" : " with retry",
- rx_mode.hw_strip_crc ? "enabled" : "disabled",
+ (ports[0].dev_conf.rxmode.offloads &
DEV_RX_OFFLOAD_CRC_STRIP) ?
+ "enabled" : "disabled",
There is a global config option in testpmd, for all ports. Previous log was print
based on that config option, but now you are printing the value of first port.
if (cur_fwd_eng == &tx_only_engine || cur_fwd_eng == &flow_gen_engine)
printf(" packet len=%u - nb packet segments=%d\n",
(unsigned)tx_pkt_length, (int) tx_pkt_nb_segs);
struct rte_eth_rxconf *rx_conf = &ports[0].rx_conf;
struct rte_eth_txconf *tx_conf = &ports[0].tx_conf;
the last were added by commit f2c5125a686a ("app/testpmd: use default Rx/Tx port configuration").
As you can see port[0] is the one being used for the rest of the configuration print.
Post by Ferruh Yigit
I believe it is wrong to display only first port values, either log can be updated
to say testpmd default configs, or remove completely, or print for all ports,
what do you think?
IMO it is the best to print for all ports.
+1, can this fix be part of this patchset although it is not directly related to
the offload conversion?
Post by Shahaf Shuler
Post by Ferruh Yigit
<...>
@@ -897,34 +900,31 @@ launch_args_parse(int argc, char** argv)
}
#endif
if (!strcmp(lgopts[opt_idx].name, "disable-crc-
strip"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &=
~DEV_RX_OFFLOAD_CRC_STRIP;
if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
- rx_mode.enable_lro = 1;
- if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
- rx_mode.enable_scatter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
+ if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
{
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ }
Can drop "{}"
Yes.
Post by Ferruh Yigit
<...>
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
c3ab44849..e3a7c26b8 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1;
*/
struct rte_eth_rxmode rx_mode = {
.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame
length. */
- .split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled. */
- .hw_ip_checksum = 0, /**< IP checksum offload disabled. */
- .hw_vlan_filter = 1, /**< VLAN filtering enabled. */
- .hw_vlan_strip = 1, /**< VLAN strip enabled. */
- .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */
- .hw_strip_crc = 1, /**< CRC stripping by hardware enabled. */
- .hw_timestamp = 0, /**< HW timestamp enabled. */
+ .offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP |
+ DEV_RX_OFFLOAD_CRC_STRIP),
+ .ignore_offload_bitfield = 1, /**< Use rte_eth_rxq_conf offloads API
+*/
Is comment correct?
No I should remove it.
Post by Ferruh Yigit
Flag has two meaning I guess,
1) Ignore bitfield values for port based offload configuration.
It is only this meaning.
Post by Ferruh Yigit
2) For rxq, use rx_conf.offloads field.
testpmd is still using port based offload (rte_eth_rxmode) but "offloads"
variable instead of bitfields, right?
Right.
queue specific ones are copy of port
Post by Ferruh Yigit
configs.
<...>
@@ -1495,6 +1490,10 @@ start_port(portid_t pid)
}
if (port->need_reconfig_queues > 0) {
port->need_reconfig_queues = 0;
+ /* Use rte_eth_txq_conf offloads API */
+ port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;
Also I just catch this part, during app start txq_flags set via PMD default
values (rxtx_port_config), if you overwrite this flag without converting to
offloads, for PMDs supporting old method you are loosing configuration.
Post by Shahaf Shuler
+ /* Apply Tx offloads configuration */
+ port->tx_conf.offloads = port->dev_conf.txmode.offloads;
/* setup tx queues */
for (qi = 0; qi < nb_txq; qi++) {
if ((numa_support) &&
@@ -1521,6 +1520,8 @@ start_port(portid_t pid)
port->need_reconfig_queues = 1;
return -1;
}
+ /* Apply Rx offloads configuration */
+ port->rx_conf.offloads = port->dev_conf.rxmode.offloads;
/* setup rx queues */
for (qi = 0; qi < nb_rxq; qi++) {
if ((numa_support) &&
Shahaf Shuler
2017-12-07 07:55:39 UTC
Permalink
Post by Ferruh Yigit
Post by Shahaf Shuler
Post by Ferruh Yigit
Post by Shahaf Shuler
commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
Convert the application to use the new API.
Hi Shahaf,
1- Convert rxmode bitfields usage to rxmode offloads usage.
2- Apply some config options to port config and add some port config
checks.
Post by Shahaf Shuler
Post by Ferruh Yigit
3- Adding device advertised capability checks for some offloads.
Would you mind separate 2 and 3 to their own patches, with that 1
should be straightforward and 2 & 3 will be easy to review.
See below comments. #2 on your list is actually needed for the conversion
patch.
Please see below comment [1] for it.
Post by Shahaf Shuler
I can split the extra cap check if you fill it needs to be in a separate patch.
I find it hard to review this patch, splitting is to make easier to understand the
changes, there is no extra need.
OK will have them splitted on v2.
Post by Ferruh Yigit
Post by Shahaf Shuler
Post by Ferruh Yigit
And is this update tested with PMDs both support new offload method
and old offload method?
It was tested with mlx5 and mlx4 PMD after the conversion to the new
APIs.
Post by Shahaf Shuler
I put this series early so everyone can try, test and report if something is
broken.
Post by Shahaf Shuler
I will try to do more testing with the old mlx PMD.
BTW - we agreed that we set DD for all PMDs to move to the new API by
18.02. I still haven't see patches for that from the rest.>
Post by Ferruh Yigit
Thanks,
ferruh
<...>
Post by Shahaf Shuler
} else if (!strcmp(res->name, "hw-vlan-extend")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_extend = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
Not related to this patch, but since you are touching these, what is
the difference between DEV_RX_OFFLOAD_VLAN_EXTEND and
DEV_RX_OFFLOAD_QINQ_STRIP ?
Good question, I could not figure it out either.
I guess those are identical. In the old API the hw_vlan_extend was the
offload and the DEV_RX_OFFLOAD_QINQ_STRIP was the cap.
Post by Shahaf Shuler
Now that we merged them we have duplication.
From one side, using DEV_RX_OFFLOAD_VLAN_EXTEND is more intuitive
for
Post by Shahaf Shuler
application which previously used hw_vlan_extend to set the offload, For
the other side QINQ_STRIP is more explicit with respect to what the feature
does, and it is the flag which is currently being used for PMDs.
Post by Shahaf Shuler
So when we will change it, I guess I am in favor of the QINQ flag.
+1 to QINQ.
Post by Shahaf Shuler
Post by Ferruh Yigit
Post by Shahaf Shuler
@@ -3434,7 +3439,14 @@ cmd_tx_vlan_set_parsed(void
*parsed_result,
Post by Shahaf Shuler
Post by Ferruh Yigit
{
Post by Shahaf Shuler
struct cmd_tx_vlan_set_result *res = parsed_result;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
rte_eth_rxmode bitfields to "offloads" conversion is mostly
straightforward, but is above kind of modifications part of this
conversion or are you adding missing checks?
It is part of the conversion and this is related to testpmd design.
Previously in the old API the tx offloads were set even after the port is
started. For this specific example the vlan insert just changed a flag
(TESTPMD_TX_OFFLOAD_INSERT_VLAN) on the application port struct to use
PKT_TX_VLAN_PKT in the mbuf ol_flags. The application didn't update the
PMD in anyway. In fact, it was possible to put txq_flag which says no vlan
insertion and then to set vlan insertion through the CLI.
As you said, so I am a little concerned if missing something, because
otherwise how this was working previously?
Again - because all of the tx offload where enabled by default. This means that the PMDs which supports those offload were using the tx/rx_burst functions which includes the functionally (unless the application disable those offloads using txq_flags). There was no need to futher update the PMD on the Tx offloads being used.

As for the conflicts between CLI commands and txq flags - small bug in PMD which wasn't discovered probably because no one did some strange configuration.
Post by Ferruh Yigit
Post by Shahaf Shuler
This was OK back then because all of the Tx offloads were set by default
and we assumed users know what they are doing when setting the
txq_flags.
Post by Shahaf Shuler
Now all the tx offloads are disabled by default. Every Tx offload being used
should update the PMD (as it may need to switch tx burst function). This is
why the Tx offloads configuration must be done when the port is stopped,
and be followed with reconfiguration of the device and the queues.
[1]
Not agree on this part. Indeed you are fixing a behavior of the testpmd, not
just converting to new method. Technically you can provide same old config
with new flags, like enable all tx offloads, so behavior should be same.
Later can fix testpmd in another patch, this gives a better separation.
And for example I remember Konstatin mentioned some Intel NICs can
accept vlan related configuration updates without stopping the forwarding,
we can discuss these kind of things in this fix patch.
The on the flight VLAN configuration was converted as well and supported. I will make it more explicit on v2 with a separate patch.
Post by Ferruh Yigit
Just suggesting removing straightforward bitfield to offloads bitwise changes
out of way, and focus on what logic is changing.
Post by Shahaf Shuler
Post by Ferruh Yigit
I would prefer making only conversion related changes in this patch,
and extra improvements in other patch.
Post by Shahaf Shuler
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
Is this required for converting bitfield to offloads usage?
Yes, see above.
btw, why RTE_PORT_ALL, just providing a port_id also should be OK.
Yeah, I will switch to port_id.
Post by Ferruh Yigit
Post by Shahaf Shuler
Post by Ferruh Yigit
Post by Shahaf Shuler
}
struct cmd_tx_vlan_set_qinq_result *res = parsed_result;
+ if (!all_ports_stopped()) {
+ printf("Please stop all ports first\n");
+ return;
+ }
Same for all occurrence of these updates.
<...>
Post by Shahaf Shuler
@@ -3693,22 +3724,34 @@ cmd_csum_parsed(void *parsed_result,
if (!strcmp(res->proto, "ip")) {
mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+ csum_offloads |=
DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
Post by Shahaf Shuler
}
- if (hw)
+ if (hw) {
ports[res->port_id].tx_ol_flags |= mask;
- else
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ csum_offloads;
So you are updating port config as well as testpmd internal
configuration, again I guess this is not related to conversion to offloads
usage.
Post by Shahaf Shuler
It is. See above.
The port config will be used for the reconfiguration of the device and
queues. This is a must for the Tx offloads .
Post by Shahaf Shuler
Post by Ferruh Yigit
<...>
Post by Shahaf Shuler
@@ -13017,6 +13093,13 @@ cmd_set_macsec_offload_on_parsed(
switch (ret) {
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_MACSEC_INSERT) == 0) {
+ printf("Warning: macsec insert enabled but not "
+ "supported by port %d\n", port_id);
+ }
This also adding another layer of check if device advertise requested
capability, this is an improvement independent from conversion, can
you please separate into its own patch?
Yes we can do it.
Post by Ferruh Yigit
<...>
Post by Shahaf Shuler
@@ -606,8 +616,8 @@ port_offload_cap_display(portid_t port_id)
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
printf("VLAN insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_VLAN)
This is removing testpmd local config check, just to double check if
all places that updates this local config covered to update device config
variable?
Post by Shahaf Shuler
I hope so. If you find something I missed let me know :).
If you are not sure, and if you are not removing tx_ol_flags, what is the
benefit of replacing?
Whoever does the work removing tx_ol_flags can do replacing, this also
ensures all instances updated, no?
Will provide another patch to remove the ol_flags.
Post by Ferruh Yigit
Post by Shahaf Shuler
Post by Ferruh Yigit
And do we still need testpmd tx_ol_flags after these changes?
Currently those flags are being used. One can prepare another patch to
remove those and use the port config flags instead.
Post by Shahaf Shuler
This is not related to the conversion and could be a nice cleanup.
Post by Ferruh Yigit
<...>
Post by Shahaf Shuler
@@ -1658,7 +1679,8 @@ rxtx_config_display(void)
printf(" %s packet forwarding%s - CRC stripping %s - "
"packets/burst=%d\n", cur_fwd_eng->fwd_mode_name,
retry_enabled == 0 ? "" : " with retry",
- rx_mode.hw_strip_crc ? "enabled" : "disabled",
+ (ports[0].dev_conf.rxmode.offloads &
DEV_RX_OFFLOAD_CRC_STRIP) ?
Post by Shahaf Shuler
+ "enabled" : "disabled",
There is a global config option in testpmd, for all ports. Previous
log was print based on that config option, but now you are printing the
value of first port.
Post by Shahaf Shuler
Not exactly (there are multiple wrong issues with this function). For
if (cur_fwd_eng == &tx_only_engine || cur_fwd_eng ==
&flow_gen_engine)
Post by Shahaf Shuler
printf(" packet len=%u - nb packet segments=%d\n",
(unsigned)tx_pkt_length, (int)
tx_pkt_nb_segs);
struct rte_eth_rxconf *rx_conf = &ports[0].rx_conf;
struct rte_eth_txconf *tx_conf = &ports[0].tx_conf;
the last were added by commit f2c5125a686a ("app/testpmd: use default
Rx/Tx port configuration").
Post by Shahaf Shuler
As you can see port[0] is the one being used for the rest of the
configuration print.
Post by Shahaf Shuler
Post by Ferruh Yigit
I believe it is wrong to display only first port values, either log
can be updated to say testpmd default configs, or remove completely,
or print for all ports, what do you think?
IMO it is the best to print for all ports.
+1, can this fix be part of this patchset although it is not directly
+related to
the offload conversion?
It can.
Post by Ferruh Yigit
Post by Shahaf Shuler
Post by Ferruh Yigit
<...>
Post by Shahaf Shuler
@@ -897,34 +900,31 @@ launch_args_parse(int argc, char** argv)
}
#endif
if (!strcmp(lgopts[opt_idx].name, "disable-crc-
strip"))
Post by Shahaf Shuler
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &=
~DEV_RX_OFFLOAD_CRC_STRIP;
Post by Shahaf Shuler
if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
- rx_mode.enable_lro = 1;
- if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
- rx_mode.enable_scatter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
+ if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
{
Post by Shahaf Shuler
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ }
Can drop "{}"
Yes.
Post by Ferruh Yigit
<...>
Post by Shahaf Shuler
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
c3ab44849..e3a7c26b8 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1;
*/
struct rte_eth_rxmode rx_mode = {
.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame
length. */
Post by Shahaf Shuler
- .split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled. */
- .hw_ip_checksum = 0, /**< IP checksum offload disabled. */
- .hw_vlan_filter = 1, /**< VLAN filtering enabled. */
- .hw_vlan_strip = 1, /**< VLAN strip enabled. */
- .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */
- .hw_strip_crc = 1, /**< CRC stripping by hardware enabled. */
- .hw_timestamp = 0, /**< HW timestamp enabled. */
+ .offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP |
+ DEV_RX_OFFLOAD_CRC_STRIP),
+ .ignore_offload_bitfield = 1, /**< Use rte_eth_rxq_conf offloads
+API */
Is comment correct?
No I should remove it.
Post by Ferruh Yigit
Flag has two meaning I guess,
1) Ignore bitfield values for port based offload configuration.
It is only this meaning.
Post by Ferruh Yigit
2) For rxq, use rx_conf.offloads field.
testpmd is still using port based offload (rte_eth_rxmode) but "offloads"
variable instead of bitfields, right?
Right.
queue specific ones are copy of port
Post by Ferruh Yigit
configs.
<...>
@@ -1495,6 +1490,10 @@ start_port(portid_t pid)
}
if (port->need_reconfig_queues > 0) {
port->need_reconfig_queues = 0;
+ /* Use rte_eth_txq_conf offloads API */
+ port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;
Also I just catch this part, during app start txq_flags set via PMD default
values (rxtx_port_config), if you overwrite this flag without converting to
offloads, for PMDs supporting old method you are loosing configuration.
Am disagree.
The txq_flags are to disable offloads. From application which uses the new API perspective they are all disabled. With the new offloads API, the application is the one to choose the offloads being used, not the PMD therefore there is no point with converting the PMD txq_flags.
If the underlying PMD is not supporting the new API, the offloads flags selected by the application will be converted into txq_flags. For example 0 will be converted to all of the TXQ_FLAGS.

It is true that before the changes we could still have some offloads enabled (like TSO) when we use the PMD default txq_flags. However I see it as an improvement and not downside. The new application is better because it don't have offloads enabled for nothing.
Post by Ferruh Yigit
Post by Shahaf Shuler
+ /* Apply Tx offloads configuration */
+ port->tx_conf.offloads = port-
dev_conf.txmode.offloads;
/* setup tx queues */
for (qi = 0; qi < nb_txq; qi++) {
if ((numa_support) &&
@@ -1521,6 +1520,8 @@ start_port(portid_t pid)
port->need_reconfig_queues = 1;
return -1;
}
+ /* Apply Rx offloads configuration */
+ port->rx_conf.offloads = port-
dev_conf.rxmode.offloads;
/* setup rx queues */
for (qi = 0; qi < nb_rxq; qi++) {
Shahaf Shuler
2017-11-23 12:08:01 UTC
Permalink
Since testpmd is now using the new Ethdev offloads API there is no
need for the txqflags configuration.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Nelio Laranjeiro <***@6wind.com>
---
app/test-pmd/cmdline.c | 69 ------------------------
app/test-pmd/config.c | 4 +-
app/test-pmd/parameters.c | 14 +----
app/test-pmd/testpmd.c | 8 ---
app/test-pmd/testpmd.h | 1 -
doc/guides/testpmd_app_ug/run_app.rst | 12 -----
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 11 ----
7 files changed, 2 insertions(+), 117 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index b0f2325c8..9e3f02ec5 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3092,74 +3092,6 @@ cmdline_parse_inst_t cmd_set_txsplit = {
},
};

-/* *** CONFIG TX QUEUE FLAGS *** */
-
-struct cmd_config_txqflags_result {
- cmdline_fixed_string_t port;
- cmdline_fixed_string_t config;
- cmdline_fixed_string_t all;
- cmdline_fixed_string_t what;
- int32_t hexvalue;
-};
-
-static void cmd_config_txqflags_parsed(void *parsed_result,
- __attribute__((unused)) struct cmdline *cl,
- __attribute__((unused)) void *data)
-{
- struct cmd_config_txqflags_result *res = parsed_result;
-
- if (!all_ports_stopped()) {
- printf("Please stop all ports first\n");
- return;
- }
-
- if (strcmp(res->what, "txqflags")) {
- printf("Unknown parameter\n");
- return;
- }
-
- if (res->hexvalue >= 0) {
- txq_flags = res->hexvalue;
- } else {
- printf("txqflags must be >= 0\n");
- return;
- }
-
- init_port_config();
-
- cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
-}
-
-cmdline_parse_token_string_t cmd_config_txqflags_port =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, port,
- "port");
-cmdline_parse_token_string_t cmd_config_txqflags_config =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, config,
- "config");
-cmdline_parse_token_string_t cmd_config_txqflags_all =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, all,
- "all");
-cmdline_parse_token_string_t cmd_config_txqflags_what =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, what,
- "txqflags");
-cmdline_parse_token_num_t cmd_config_txqflags_value =
- TOKEN_NUM_INITIALIZER(struct cmd_config_txqflags_result,
- hexvalue, INT32);
-
-cmdline_parse_inst_t cmd_config_txqflags = {
- .f = cmd_config_txqflags_parsed,
- .data = NULL,
- .help_str = "port config all txqflags <value>",
- .tokens = {
- (void *)&cmd_config_txqflags_port,
- (void *)&cmd_config_txqflags_config,
- (void *)&cmd_config_txqflags_all,
- (void *)&cmd_config_txqflags_what,
- (void *)&cmd_config_txqflags_value,
- NULL,
- },
-};
-
/* *** ADD/REMOVE ALL VLAN IDENTIFIERS TO/FROM A PORT VLAN RX FILTER *** */
struct cmd_rx_vlan_filter_all_result {
cmdline_fixed_string_t rx_vlan;
@@ -15729,7 +15661,6 @@ cmdline_parse_ctx_t main_ctx[] = {
(cmdline_parse_inst_t *)&cmd_config_rx_mode_flag,
(cmdline_parse_inst_t *)&cmd_config_rss,
(cmdline_parse_inst_t *)&cmd_config_rxtx_queue,
- (cmdline_parse_inst_t *)&cmd_config_txqflags,
(cmdline_parse_inst_t *)&cmd_config_rss_reta,
(cmdline_parse_inst_t *)&cmd_showport_reta,
(cmdline_parse_inst_t *)&cmd_config_burst,
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 9b6ffeca9..089e9f4cf 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -417,7 +417,6 @@ tx_queue_infos_display(portid_t port_id, uint16_t queue_id)
printf("\nTX writeback threshold: %hhu", qinfo.conf.tx_thresh.wthresh);
printf("\nTX RS threshold: %hu", qinfo.conf.tx_rs_thresh);
printf("\nTX free threshold: %hu", qinfo.conf.tx_free_thresh);
- printf("\nTX flags: %#x", qinfo.conf.txq_flags);
printf("\nTX deferred start: %s",
(qinfo.conf.tx_deferred_start != 0) ? "on" : "off");
printf("\nNumber of TXDs: %hu", qinfo.nb_desc);
@@ -1702,8 +1701,7 @@ rxtx_config_display(void)
printf(" TX threshold registers: pthresh=%d hthresh=%d wthresh=%d\n",
tx_conf->tx_thresh.pthresh, tx_conf->tx_thresh.hthresh,
tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ printf(" TX RS bit threshold=%d\n", tx_conf->tx_rs_thresh);
}

void
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 0ba73cad5..1a145c387 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -99,7 +99,7 @@ usage(char* progname)
"--rss-ip | --rss-udp | "
"--rxpt= | --rxht= | --rxwt= | --rxfreet= | "
"--txpt= | --txht= | --txwt= | --txfreet= | "
- "--txrst= | --txqflags= ]\n",
+ "--txrst= ]\n",
progname);
#ifdef RTE_LIBRTE_CMDLINE
printf(" --interactive: run in interactive mode.\n");
@@ -192,8 +192,6 @@ usage(char* progname)
"(0 <= N <= value of txd).\n");
printf(" --txrst=N: set the transmit RS bit threshold of TX rings to N "
"(0 <= N <= value of txd).\n");
- printf(" --txqflags=0xXXXXXXXX: hexadecimal bitmask of TX queue flags "
- "(0 <= N <= 0x7FFFFFFF).\n");
printf(" --tx-queue-stats-mapping=(port,queue,mapping)[,(port,queue,mapping]: "
"tx queues statistics counters mapping "
"(0 <= mapping <= %d).\n", RTE_ETHDEV_QUEUE_STAT_CNTRS - 1);
@@ -630,7 +628,6 @@ launch_args_parse(int argc, char** argv)
{ "txwt", 1, 0, 0 },
{ "txfreet", 1, 0, 0 },
{ "txrst", 1, 0, 0 },
- { "txqflags", 1, 0, 0 },
{ "rxpt", 1, 0, 0 },
{ "rxht", 1, 0, 0 },
{ "rxwt", 1, 0, 0 },
@@ -1004,15 +1001,6 @@ launch_args_parse(int argc, char** argv)
else
rte_exit(EXIT_FAILURE, "txrst must be >= 0\n");
}
- if (!strcmp(lgopts[opt_idx].name, "txqflags")) {
- char *end = NULL;
- n = strtoul(optarg, &end, 16);
- if (n >= 0)
- txq_flags = (int32_t)n;
- else
- rte_exit(EXIT_FAILURE,
- "txqflags must be >= 0\n");
- }
if (!strcmp(lgopts[opt_idx].name, "rxd")) {
n = atoi(optarg);
if (n > 0) {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index e3a7c26b8..a97edcadd 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -259,11 +259,6 @@ int16_t tx_free_thresh = RTE_PMD_PARAM_UNSET;
int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;

/*
- * Configurable value of TX queue flags.
- */
-int32_t txq_flags = RTE_PMD_PARAM_UNSET;
-
-/*
* Receive Side Scaling (RSS) configuration.
*/
uint64_t rss_hf = ETH_RSS_IP; /* RSS IP by default. */
@@ -2072,9 +2067,6 @@ rxtx_port_config(struct rte_port *port)

if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
port->tx_conf.tx_free_thresh = tx_free_thresh;
-
- if (txq_flags != RTE_PMD_PARAM_UNSET)
- port->tx_conf.txq_flags = txq_flags;
}

void
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 1639d27e7..6af70e02a 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -427,7 +427,6 @@ extern int16_t rx_free_thresh;
extern int8_t rx_drop_en;
extern int16_t tx_free_thresh;
extern int16_t tx_rs_thresh;
-extern int32_t txq_flags;

extern uint8_t dcb_config;
extern uint8_t dcb_test;
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index 4c0d2cede..cb94582b9 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -447,18 +447,6 @@ The commandline options are:
Set the transmit RS bit threshold of TX rings to N, where 0 <= N <= value of ``--txd``.
The default value is 0.

-* ``--txqflags=0xXXXXXXXX``
-
- Set the hexadecimal bitmask of TX queue flags, where 0 <= N <= 0x7FFFFFFF.
- The default value is 0.
-
- .. note::
-
- When using hardware offload functions such as vlan or checksum
- add ``txqflags=0`` to force the full-featured TX code path.
- In some PMDs this may already be the default.
-
-
* ``--rx-queue-stats-mapping=(port,queue,mapping)[,(port,queue,mapping)]``

Set the RX queues statistics counters mapping 0 <= mapping <= 15.
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 9789139af..8e73519a4 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -354,8 +354,6 @@ The available information categories are:
also modify the default hierarchy or specify the new hierarchy through CLI for
implementing QoS scheduler. Requires ``CONFIG_RTE_LIBRTE_PMD_SOFTNIC=y`` ``CONFIG_RTE_LIBRTE_SCHED=y``.

-Note: TX timestamping is only available in the "Full Featured" TX path. To force ``testpmd`` into this mode set ``--txqflags=0``.
-
Example::

testpmd> set fwd rxonly
@@ -1681,15 +1679,6 @@ RX scatter mode is off by default.

The ``on`` option is equivalent to the ``--enable-scatter`` command-line option.

-port config - TX queue flags
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Set a hexadecimal bitmap of TX queue flags for all ports::
-
- testpmd> port config all txqflags value
-
-This command is equivalent to the ``--txqflags`` command-line option.
-
port config - RX Checksum
~~~~~~~~~~~~~~~~~~~~~~~~~
--
2.12.0
Ferruh Yigit
2017-12-04 22:31:21 UTC
Permalink
Post by Shahaf Shuler
Since testpmd is now using the new Ethdev offloads API there is no
need for the txqflags configuration.
txqflag command-line option (--txqflags=0xXXXXXXXX) and command (port config all
txqflags value) are way to dynamically provide Tx offload configuration to testpmd.

Why you are removing them without providing equivalent feature with new offload
APIs?

Patch 3/4 & 4/5 adds new command-line options to enable some of recently
introduced Tx offloads in testpmd, why not add a generic way to update all Tx
offloads instead of those two specific offloads?

Also this patch removing ability to display current Tx offload configuration....
<...>
Shahaf Shuler
2017-12-05 06:48:12 UTC
Permalink
Post by Ferruh Yigit
Post by Shahaf Shuler
Since testpmd is now using the new Ethdev offloads API there is no
need for the txqflags configuration.
txqflag command-line option (--txqflags=0xXXXXXXXX) and command (port
config all txqflags value) are way to dynamically provide Tx offload
configuration to testpmd.
Why you are removing them without providing equivalent feature with new
offload APIs?
There is one, and this is why the new offloads API simplifies applications life.
The txq_flags were introduced so application can disable some of the Tx offloads from the time the Tx offloads were set by default.

Now the Tx offloads are all disabled by default. And there is an option to set each one of the using DEV_TX_OFFLOAD_* flags.
Look on the Rx side (there the Rx offloads were disabled by default in the old API). there is no rxq_flags.
Post by Ferruh Yigit
Patch 3/4 & 4/5 adds new command-line options to enable some of recently
introduced Tx offloads in testpmd, why not add a generic way to update all
Tx offloads instead of those two specific offloads?
Because those 2 new offloads were missing a way to set in testpmd.
The rest of the offloads can be set using the CLI commands exists today.

Am not sure we want every Tx offloads to be set from both CLI and command line arguments.
It wasn't before (for example there was no --disable-tso flags).
Post by Ferruh Yigit
Also this patch removing ability to display current Tx offload configuration....
Can you point where ?
Ferruh Yigit
2017-12-06 23:04:33 UTC
Permalink
Post by Shahaf Shuler
Post by Ferruh Yigit
Post by Shahaf Shuler
Since testpmd is now using the new Ethdev offloads API there is no
need for the txqflags configuration.
txqflag command-line option (--txqflags=0xXXXXXXXX) and command (port
config all txqflags value) are way to dynamically provide Tx offload
configuration to testpmd.
Why you are removing them without providing equivalent feature with new
offload APIs?
There is one, and this is why the new offloads API simplifies applications life.
The txq_flags were introduced so application can disable some of the Tx offloads from the time the Tx offloads were set by default.
Now the Tx offloads are all disabled by default. And there is an option to set each one of the using DEV_TX_OFFLOAD_* flags.
Look on the Rx side (there the Rx offloads were disabled by default in the old API). there is no rxq_flags.
I mean providing a testpmd command and command-line option.
Or am I missing it, after this update is there a way to update enabled Tx
offloads in testpmd via command and command-line?
Post by Shahaf Shuler
Post by Ferruh Yigit
Patch 3/4 & 4/5 adds new command-line options to enable some of recently
introduced Tx offloads in testpmd, why not add a generic way to update all
Tx offloads instead of those two specific offloads?
Because those 2 new offloads were missing a way to set in testpmd.
The rest of the offloads can be set using the CLI commands exists today.
Am not sure we want every Tx offloads to be set from both CLI and command line arguments.
It wasn't before (for example there was no --disable-tso flags).
I was thinking a generic command-line instead of introducing one for all,
overall single variable represents all offload values, why not set it at once,
as --txqflags you are removing in this patch.
Post by Shahaf Shuler
Post by Ferruh Yigit
Also this patch removing ability to display current Tx offload configuration....
Can you point where ?
I mean following:

- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ printf(" TX RS bit threshold=%d\n", tx_conf->tx_rs_thresh);

Why not an offloads replacement of this one?
Post by Shahaf Shuler
Post by Ferruh Yigit
<...>
Shahaf Shuler
2017-12-07 07:56:04 UTC
Permalink
Post by Shahaf Shuler
Post by Shahaf Shuler
Post by Ferruh Yigit
Post by Shahaf Shuler
Since testpmd is now using the new Ethdev offloads API there is no
need for the txqflags configuration.
txqflag command-line option (--txqflags=0xXXXXXXXX) and command
(port
Post by Shahaf Shuler
Post by Ferruh Yigit
config all txqflags value) are way to dynamically provide Tx offload
configuration to testpmd.
Why you are removing them without providing equivalent feature with
new offload APIs?
There is one, and this is why the new offloads API simplifies applications
life.
Post by Shahaf Shuler
The txq_flags were introduced so application can disable some of the Tx
offloads from the time the Tx offloads were set by default.
Post by Shahaf Shuler
Now the Tx offloads are all disabled by default. And there is an option to
set each one of the using DEV_TX_OFFLOAD_* flags.
Post by Shahaf Shuler
Look on the Rx side (there the Rx offloads were disabled by default in the
old API). there is no rxq_flags.
I mean providing a testpmd command and command-line option.
Or am I missing it, after this update is there a way to update enabled Tx
offloads in testpmd via command and command-line?
There is a way to update via CLI
For example when doing "tso set <mss> <port>" the DEV_TX_OFFLOAD_TSO will be set
When doing tx_vlan add <port> <vlan> the DEV_TX_OFFLOAD_VLAN_INSERT will be set
Same for every Tx offloads besides DEV_TX_OFFLOAD_MULTI_SEGS and DEV_TX_OFFLOAD_MBUF_FAST_FREE which I added on separate patches.

But to make it precise you didn’t had before (with the txq_flags) a way to disable TSO from the command line (the is no TXQ flag for that) nor the tunnel TSO.
Post by Shahaf Shuler
Post by Shahaf Shuler
Post by Ferruh Yigit
Patch 3/4 & 4/5 adds new command-line options to enable some of
recently introduced Tx offloads in testpmd, why not add a generic way
to update all Tx offloads instead of those two specific offloads?
Because those 2 new offloads were missing a way to set in testpmd.
The rest of the offloads can be set using the CLI commands exists today.
Am not sure we want every Tx offloads to be set from both CLI and
command line arguments.
Post by Shahaf Shuler
It wasn't before (for example there was no --disable-tso flags).
I was thinking a generic command-line instead of introducing one for all,
overall single variable represents all offload values, why not set it at once, as
--txqflags you are removing in this patch.
We can do it. yes.
Post by Shahaf Shuler
Post by Shahaf Shuler
Post by Ferruh Yigit
Also this patch removing ability to display current Tx offload
configuration....
Post by Shahaf Shuler
Can you point where ?
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ printf(" TX RS bit threshold=%d\n", tx_conf->tx_rs_thresh);
Why not an offloads replacement of this one?
Will be added.
Post by Shahaf Shuler
Post by Shahaf Shuler
Post by Ferruh Yigit
<...>
Maciej Czekaj
2017-12-12 12:45:27 UTC
Permalink
-- Oryginal message --
Post by Shahaf Shuler
Post by Shahaf Shuler
Post by Shahaf Shuler
Post by Ferruh Yigit
Post by Shahaf Shuler
Since testpmd is now using the new Ethdev offloads API there is no
need for the txqflags configuration.
txqflag command-line option (--txqflags=0xXXXXXXXX) and command
(port
Post by Shahaf Shuler
Post by Ferruh Yigit
config all txqflags value) are way to dynamically provide Tx offload
configuration to testpmd.
Why you are removing them without providing equivalent feature with
new offload APIs?
There is one, and this is why the new offloads API simplifies applications
life.
Post by Shahaf Shuler
The txq_flags were introduced so application can disable some of the Tx
offloads from the time the Tx offloads were set by default.
Post by Shahaf Shuler
Now the Tx offloads are all disabled by default. And there is an option to
set each one of the using DEV_TX_OFFLOAD_* flags.
Post by Shahaf Shuler
Look on the Rx side (there the Rx offloads were disabled by default in the
old API). there is no rxq_flags.
I mean providing a testpmd command and command-line option.
Or am I missing it, after this update is there a way to update enabled Tx
offloads in testpmd via command and command-line?
There is a way to update via CLI
For example when doing "tso set <mss> <port>" the DEV_TX_OFFLOAD_TSO will be set
When doing tx_vlan add <port> <vlan> the DEV_TX_OFFLOAD_VLAN_INSERT will be set
Same for every Tx offloads besides DEV_TX_OFFLOAD_MULTI_SEGS and DEV_TX_OFFLOAD_MBUF_FAST_FREE which I added on separate patches.
But to make it precise you didn’t had before (with the txq_flags) a way to disable TSO from the command line (the is no TXQ flag for that) nor the tunnel TSO.
Post by Shahaf Shuler
Post by Shahaf Shuler
Post by Ferruh Yigit
Patch 3/4 & 4/5 adds new command-line options to enable some of
recently introduced Tx offloads in testpmd, why not add a generic way
to update all Tx offloads instead of those two specific offloads?
Because those 2 new offloads were missing a way to set in testpmd.
The rest of the offloads can be set using the CLI commands exists today.
Am not sure we want every Tx offloads to be set from both CLI and
command line arguments.
Post by Shahaf Shuler
It wasn't before (for example there was no --disable-tso flags).
I was thinking a generic command-line instead of introducing one for all,
overall single variable represents all offload values, why not set it at once, as
--txqflags you are removing in this patch.
We can do it. yes.
+1 for Ferruh. --txqflags argument was very handy in testing features in
batch mode. Let us have something equivalent.
Post by Shahaf Shuler
Post by Shahaf Shuler
Post by Shahaf Shuler
Post by Ferruh Yigit
Also this patch removing ability to display current Tx offload
configuration....
Post by Shahaf Shuler
Can you point where ?
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ printf(" TX RS bit threshold=%d\n", tx_conf->tx_rs_thresh);
Why not an offloads replacement of this one?
Will be added.
Post by Shahaf Shuler
Post by Shahaf Shuler
Post by Ferruh Yigit
<...>
Shahaf Shuler
2017-12-13 07:25:10 UTC
Permalink
Post by Shahaf Shuler
We can do it. yes.
+1 for Ferruh. --txqflags argument was very handy in testing features in batch mode. Let us have something equivalent.
It is there. Checkout v2 of the series, an equivalent parameter was added: tx-offloads.


--Shahaf

From: Maciej Czekaj [mailto:***@caviumnetworks.com]
Sent: Tuesday, December 12, 2017 2:45 PM
To: Shahaf Shuler <***@mellanox.com>; Ferruh Yigit <***@intel.com>; ***@intel.com
Cc: ***@dpdk.org
Subject: Re: [dpdk-dev] [PATCH 2/5] app/testpmd: remove txqflags



-- Oryginal message --

Thursday, December 7, 2017 1:05 AM, Ferruh Yigit:

On 12/4/2017 10:48 PM, Shahaf Shuler wrote:

Tuesday, December 5, 2017 12:31 AM, Ferruh Yigit:

On 11/23/2017 4:08 AM, Shahaf Shuler wrote:

Since testpmd is now using the new Ethdev offloads API there is no

need for the txqflags configuration.



txqflag command-line option (--txqflags=0xXXXXXXXX) and command

(port

config all txqflags value) are way to dynamically provide Tx offload

configuration to testpmd.



Why you are removing them without providing equivalent feature with

new offload APIs?



There is one, and this is why the new offloads API simplifies applications

life.

The txq_flags were introduced so application can disable some of the Tx

offloads from the time the Tx offloads were set by default.



Now the Tx offloads are all disabled by default. And there is an option to

set each one of the using DEV_TX_OFFLOAD_* flags.

Look on the Rx side (there the Rx offloads were disabled by default in the

old API). there is no rxq_flags.



I mean providing a testpmd command and command-line option.

Or am I missing it, after this update is there a way to update enabled Tx

offloads in testpmd via command and command-line?



There is a way to update via CLI

For example when doing "tso set <mss> <port>" the DEV_TX_OFFLOAD_TSO will be set

When doing tx_vlan add <port> <vlan> the DEV_TX_OFFLOAD_VLAN_INSERT will be set

Same for every Tx offloads besides DEV_TX_OFFLOAD_MULTI_SEGS and DEV_TX_OFFLOAD_MBUF_FAST_FREE which I added on separate patches.



But to make it precise you didn’t had before (with the txq_flags) a way to disable TSO from the command line (the is no TXQ flag for that) nor the tunnel TSO.









Patch 3/4 & 4/5 adds new command-line options to enable some of

recently introduced Tx offloads in testpmd, why not add a generic way

to update all Tx offloads instead of those two specific offloads?



Because those 2 new offloads were missing a way to set in testpmd.

The rest of the offloads can be set using the CLI commands exists today.



Am not sure we want every Tx offloads to be set from both CLI and

command line arguments.

It wasn't before (for example there was no --disable-tso flags).



I was thinking a generic command-line instead of introducing one for all,

overall single variable represents all offload values, why not set it at once, as

--txqflags you are removing in this patch.



We can do it. yes.

+1 for Ferruh. --txqflags argument was very handy in testing features in batch mode. Let us have something equivalent.













Also this patch removing ability to display current Tx offload

configuration....



Can you point where ?



I mean following:



- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",

- tx_conf->tx_rs_thresh, tx_conf->txq_flags);

+ printf(" TX RS bit threshold=%d\n", tx_conf->tx_rs_thresh);



Why not an offloads replacement of this one?



Will be added.











Signed-off-by: Shahaf Shuler <***@mellanox.com><mailto:***@mellanox.com>

Acked-by: Nelio Laranjeiro <***@6wind.com><mailto
Shahaf Shuler
2017-11-23 12:08:02 UTC
Permalink
This patch enables multi segment send Tx offloads from the command line.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/parameters.c | 8 ++++++++
app/test-pmd/testpmd.c | 4 ++++
app/test-pmd/testpmd.h | 1 +
doc/guides/testpmd_app_ug/run_app.rst | 4 ++++
4 files changed, 17 insertions(+)

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 1a145c387..8a68a39ea 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -214,6 +214,8 @@ usage(char* progname)
"disable print of designated event or all of them.\n");
printf(" --flow-isolate-all: "
"requests flow API isolated mode on all ports at initialization time.\n");
+ printf(" --enable-multiseg: "
+ "enables multi segment send Tx offload on all ports.\n");
}

#ifdef RTE_LIBRTE_CMDLINE
@@ -566,6 +568,8 @@ launch_args_parse(int argc, char** argv)
enum { TX, RX };
/* Default Rx offloads for all ports. */
uint64_t rx_offloads = rx_mode.offloads;
+ /* Default Tx offloads for all ports. */
+ uint64_t tx_offloads = tx_mode.offloads;

static struct option lgopts[] = {
{ "help", 0, 0, 0 },
@@ -642,6 +646,7 @@ launch_args_parse(int argc, char** argv)
{ "no-rmv-interrupt", 0, 0, 0 },
{ "print-event", 1, 0, 0 },
{ "mask-event", 1, 0, 0 },
+ { "enable-multiseg", 0, 0, 0 },
{ 0, 0, 0, 0 },
};

@@ -1115,6 +1120,8 @@ launch_args_parse(int argc, char** argv)
rte_exit(EXIT_FAILURE,
"invalid mask-event argument\n");
}
+ if (!strcmp(lgopts[opt_idx].name, "enable-multiseg"))
+ tx_offloads |= DEV_TX_OFFLOAD_MULTI_SEGS;

break;
case 'h':
@@ -1131,4 +1138,5 @@ launch_args_parse(int argc, char** argv)

/* Set offload configuration from command line parameters. */
rx_mode.offloads = rx_offloads;
+ tx_mode.offloads = tx_offloads;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index a97edcadd..2550677c3 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -339,6 +339,8 @@ struct rte_eth_rxmode rx_mode = {
.ignore_offload_bitfield = 1, /**< Use rte_eth_rxq_conf offloads API */
};

+struct rte_eth_txmode tx_mode;
+
struct rte_fdir_conf fdir_conf = {
.mode = RTE_FDIR_MODE_NONE,
.pballoc = RTE_FDIR_PBALLOC_64K,
@@ -599,6 +601,8 @@ init_config(void)

RTE_ETH_FOREACH_DEV(pid) {
port = &ports[pid];
+ /* Apply default Tx configuration for all ports */
+ port->dev_conf.txmode = tx_mode;
rte_eth_dev_info_get(pid, &port->dev_info);

if (numa_support) {
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 6af70e02a..8e572704e 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -415,6 +415,7 @@ extern portid_t fwd_ports_ids[RTE_MAX_ETHPORTS];
extern struct rte_port *ports;

extern struct rte_eth_rxmode rx_mode;
+extern struct rte_eth_txmode tx_mode;
extern uint64_t rss_hf;

extern queueid_t nb_rxq;
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index cb94582b9..b21a1fe8a 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -497,3 +497,7 @@ The commandline options are:
configured flow rules only (see flow command).

Ports that do not support this mode are automatically discarded.
+
+* ``--enable-multiseg``
+
+ Enables multi segment send Tx offload on all ports.
--
2.12.0
Shahaf Shuler
2017-11-23 12:08:03 UTC
Permalink
This patch enables mbuf fast free Tx offloads from the command line.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/parameters.c | 5 +++++
doc/guides/testpmd_app_ug/run_app.rst | 4 ++++
2 files changed, 9 insertions(+)

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 8a68a39ea..cc18cb767 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -216,6 +216,8 @@ usage(char* progname)
"requests flow API isolated mode on all ports at initialization time.\n");
printf(" --enable-multiseg: "
"enables multi segment send Tx offload on all ports.\n");
+ printf(" --enable-fast-free: "
+ "enables mbuf fast free Tx offload on all ports.\n");
}

#ifdef RTE_LIBRTE_CMDLINE
@@ -647,6 +649,7 @@ launch_args_parse(int argc, char** argv)
{ "print-event", 1, 0, 0 },
{ "mask-event", 1, 0, 0 },
{ "enable-multiseg", 0, 0, 0 },
+ { "enable-fast-free", 0, 0, 0 },
{ 0, 0, 0, 0 },
};

@@ -1122,6 +1125,8 @@ launch_args_parse(int argc, char** argv)
}
if (!strcmp(lgopts[opt_idx].name, "enable-multiseg"))
tx_offloads |= DEV_TX_OFFLOAD_MULTI_SEGS;
+ if (!strcmp(lgopts[opt_idx].name, "enable-fast-free"))
+ tx_offloads |= DEV_TX_OFFLOAD_MBUF_FAST_FREE;

break;
case 'h':
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index b21a1fe8a..1311cce41 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -501,3 +501,7 @@ The commandline options are:
* ``--enable-multiseg``

Enables multi segment send Tx offload on all ports.
+
+* ``--enable-fast-free``
+
+ Enables mbuf fast free Tx offload on all ports.
--
2.12.0
Shahaf Shuler
2017-11-23 12:08:04 UTC
Permalink
In the current design it was possible for offload to be set even though
the device is not supporting it. A warning message was printed instead.

This is a wrong behaviour, as application should set only the offloads
reported by the capabilities of the device.

This patch adds verification for the offloads being set and make sure
the offload configuration passed to the device always match its
capabilities.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 132 ++++++++++++++++++++++++++++----------------
app/test-pmd/config.c | 22 ++++----
app/test-pmd/testpmd.c | 21 ++++++-
3 files changed, 115 insertions(+), 60 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 9e3f02ec5..2f099a8e6 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3639,6 +3639,7 @@ cmd_csum_parsed(void *parsed_result,
int hw = 0;
uint16_t mask = 0;
uint64_t csum_offloads = 0;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
printf("invalid port %d\n", res->port_id);
@@ -3649,26 +3650,58 @@ cmd_csum_parsed(void *parsed_result,
return;
}

+ rte_eth_dev_info_get(res->port_id, &dev_info);
if (!strcmp(res->mode, "set")) {

if (!strcmp(res->hwsw, "hw"))
hw = 1;

if (!strcmp(res->proto, "ip")) {
- mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
- csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_IPV4_CKSUM) {
+ mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
+ } else {
+ printf("IP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "udp")) {
- mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
- csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_UDP_CKSUM) {
+ mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+ } else {
+ printf("UDP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "tcp")) {
- mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
- csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_TCP_CKSUM) {
+ mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ } else {
+ printf("TCP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "sctp")) {
- mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
- csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_SCTP_CKSUM) {
+ mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
+ } else {
+ printf("SCTP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "outer-ip")) {
- mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
- csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
+ mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+ csum_offloads |=
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+ } else {
+ printf("Outer IP checksum offload is not "
+ "supported by port %u\n", res->port_id);
+ }
}

if (hw) {
@@ -3815,6 +3848,14 @@ cmd_tso_set_parsed(void *parsed_result,
if (!strcmp(res->mode, "set"))
ports[res->port_id].tso_segsz = res->tso_segsz;

+ rte_eth_dev_info_get(res->port_id, &dev_info);
+ if ((ports[res->port_id].tso_segsz != 0) &&
+ (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
+ printf("Error: TSO is not supported by port %d\n",
+ res->port_id);
+ return;
+ }
+
if (ports[res->port_id].tso_segsz == 0) {
ports[res->port_id].dev_conf.txmode.offloads &=
~DEV_TX_OFFLOAD_TCP_TSO;
@@ -3826,14 +3867,6 @@ cmd_tso_set_parsed(void *parsed_result,
ports[res->port_id].tso_segsz);
}

- /* display warnings if configuration is not supported by the NIC */
- rte_eth_dev_info_get(res->port_id, &dev_info);
- if ((ports[res->port_id].tso_segsz != 0) &&
- (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
- printf("Warning: TSO enabled but not "
- "supported by port %d\n", res->port_id);
- }
-
cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
}

@@ -3891,24 +3924,25 @@ struct cmd_tunnel_tso_set_result {
portid_t port_id;
};

-static void
+static struct rte_eth_dev_info
check_tunnel_tso_nic_support(portid_t port_id)
{
struct rte_eth_dev_info dev_info;

rte_eth_dev_info_get(port_id, &dev_info);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
- printf("Warning: TSO enabled but VXLAN TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: VXLAN TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO))
- printf("Warning: TSO enabled but GRE TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: GRE TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO))
- printf("Warning: TSO enabled but IPIP TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: IPIP TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO))
- printf("Warning: TSO enabled but GENEVE TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: GENEVE TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
+ return dev_info;
}

static void
@@ -3917,6 +3951,7 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_tunnel_tso_set_result *res = parsed_result;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
@@ -3928,6 +3963,7 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
if (!strcmp(res->mode, "set"))
ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;

+ dev_info = check_tunnel_tso_nic_support(res->port_id);
if (ports[res->port_id].tunnel_tso_segsz == 0) {
ports[res->port_id].dev_conf.txmode.offloads &=
~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
@@ -3936,11 +3972,13 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO for tunneled packets is disabled\n");
} else {
+ uint64_t tso_offloads = (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
+
ports[res->port_id].dev_conf.txmode.offloads |=
- (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
- DEV_TX_OFFLOAD_GRE_TNL_TSO |
- DEV_TX_OFFLOAD_IPIP_TNL_TSO |
- DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
+ (tso_offloads & dev_info.tx_offload_capa);
printf("TSO segment size for tunneled packets is %d\n",
ports[res->port_id].tunnel_tso_segsz);

@@ -3955,7 +3993,6 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
* is not necessary for IPv6 tunneled pkts because there's no
* checksum in IP header anymore.
*/
- check_tunnel_tso_nic_support(res->port_id);

if (!(ports[res->port_id].tx_ol_flags &
TESTPMD_TX_OFFLOAD_PARSE_TUNNEL))
@@ -13014,23 +13051,20 @@ cmd_set_macsec_offload_on_parsed(
printf("Please stop all ports first\n");
return;
}
-
- ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
- ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
#ifdef RTE_LIBRTE_IXGBE_PMD
- ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
+ ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
#endif
+ }
RTE_SET_USED(en);
RTE_SET_USED(rp);

switch (ret) {
case 0:
- rte_eth_dev_info_get(port_id, &dev_info);
- if ((dev_info.tx_offload_capa &
- DEV_TX_OFFLOAD_MACSEC_INSERT) == 0) {
- printf("Warning: macsec insert enabled but not "
- "supported by port %d\n", port_id);
- }
+ ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_MACSEC_INSERT;
cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
break;
case -ENODEV:
@@ -13102,6 +13136,7 @@ cmd_set_macsec_offload_off_parsed(
{
struct cmd_macsec_offload_off_result *res = parsed_result;
int ret = -ENOTSUP;
+ struct rte_eth_dev_info dev_info;
portid_t port_id = res->port_id;

if (port_id_is_invalid(port_id, ENABLED_WARN))
@@ -13110,16 +13145,17 @@ cmd_set_macsec_offload_off_parsed(
printf("Please stop all ports first\n");
return;
}
-
- ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
- ports[port_id].dev_conf.txmode.offloads &=
- ~DEV_TX_OFFLOAD_MACSEC_INSERT;
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
#ifdef RTE_LIBRTE_IXGBE_PMD
- ret = rte_pmd_ixgbe_macsec_disable(port_id);
+ ret = rte_pmd_ixgbe_macsec_disable(port_id);
#endif
-
+ }
switch (ret) {
case 0:
+ ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_MACSEC_INSERT;
cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
break;
case -ENODEV:
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 089e9f4cf..a20df307b 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2790,16 +2790,17 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)
printf("Error, as QinQ has been enabled.\n");
return;
}
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) == 0) {
+ printf("Error: vlan insert is not supported by port %d\n",
+ port_id);
+ return;
+ }

tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
- rte_eth_dev_info_get(port_id, &dev_info);
- if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) == 0) {
- printf("Warning: vlan insert enabled but not "
- "supported by port %d\n", port_id);
- }
}

void
@@ -2820,17 +2821,18 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
printf("Error, as QinQ hasn't been enabled.\n");
return;
}
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) {
+ printf("Error: qinq insert not supported by port %d\n",
+ port_id);
+ return;
+ }

tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
ports[port_id].tx_vlan_id_outer = vlan_id_outer;
- rte_eth_dev_info_get(port_id, &dev_info);
- if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) {
- printf("Warning: qinq insert enabled but not "
- "supported by port %d\n", port_id);
- }
}

void
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 2550677c3..2b8142162 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -601,10 +601,18 @@ init_config(void)

RTE_ETH_FOREACH_DEV(pid) {
port = &ports[pid];
+ rte_eth_dev_info_get(pid, &port->dev_info);
/* Apply default Tx configuration for all ports */
port->dev_conf.txmode = tx_mode;
- rte_eth_dev_info_get(pid, &port->dev_info);
-
+ if ((port->dev_info.tx_offload_capa & tx_mode.offloads) !=
+ tx_mode.offloads) {
+ printf("Some Tx offloads are not supported "
+ "by port %d: requested 0x%lx supported 0x%lx\n",
+ pid, tx_mode.offloads,
+ port->dev_info.tx_offload_capa);
+ port->dev_conf.txmode.offloads &=
+ port->dev_info.tx_offload_capa;
+ }
if (numa_support) {
if (port_numa[pid] != NUMA_NO_CONFIG)
port_per_socket[port_numa[pid]]++;
@@ -2082,6 +2090,15 @@ init_port_config(void)
RTE_ETH_FOREACH_DEV(pid) {
port = &ports[pid];
port->dev_conf.rxmode = rx_mode;
+ if ((port->dev_info.rx_offload_capa & rx_mode.offloads) !=
+ rx_mode.offloads) {
+ printf("Some Rx offloads are not supported "
+ "by port %d: requested 0x%lx supported 0x%lx\n",
+ pid, rx_mode.offloads,
+ port->dev_info.rx_offload_capa);
+ port->dev_conf.rxmode.offloads &=
+ port->dev_info.rx_offload_capa;
+ }
port->dev_conf.fdir_conf = fdir_conf;
if (nb_rxq > 1) {
port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
--
2.12.0
Shahaf Shuler
2017-12-12 12:52:44 UTC
Permalink
This series is to convert testpmd application to the new offloads API [1].

on v2:
- Splited the patchset to multiple patches to help with the review.
- Removed wrong comments.
- Removed redundent parenthesis.
- Fixed port print parameters.
- Introduced a new method to check if single port is stopped.
- Cleanup for internal Tx offloads flags.

[1] http://dpdk.org/ml/archives/dev/2017-October/077329.html

Shahaf Shuler (10):
app/testpmd: fix port configuration print
app/testpmd: convert to new Ethdev Rx offloads API
app/testpmd: support check of single port stop
app/testpmd: convert to new Ethdev Tx offloads API
app/testpmd: fix flowgen forwarding ol flags
app/testpmd: cleanup internal Tx offloads flags field
app/testpmd: add command line option for Tx offloads
app/testpmd: remove txqflags
app/testpmd: enforce offloads caps
app/testpmd: fix on the flight VLAN configuration

app/test-pmd/cmdline.c | 501 +++++++++++++----------
app/test-pmd/config.c | 177 +++++---
app/test-pmd/csumonly.c | 40 +-
app/test-pmd/flowgen.c | 12 +-
app/test-pmd/macfwd.c | 8 +-
app/test-pmd/macswap.c | 8 +-
app/test-pmd/parameters.c | 59 +--
app/test-pmd/testpmd.c | 77 ++--
app/test-pmd/testpmd.h | 26 +-
app/test-pmd/txonly.c | 8 +-
doc/guides/testpmd_app_ug/run_app.rst | 17 +-
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 11 -
12 files changed, 541 insertions(+), 403 deletions(-)
--
1.8.3.1
Shahaf Shuler
2017-12-12 12:52:45 UTC
Permalink
The print of the port configuration was only according to configuration
of the first port.

Fixes: f2c5125a686a ("app/testpmd: use default Rx/Tx port configuration")
Cc: ***@intel.com
Cc: ***@dpdk.org

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/config.c | 48 +++++++++++++++++++++++++++++-----------------
1 file changed, 30 insertions(+), 18 deletions(-)

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index cd2ac11..8a2d30c 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1655,33 +1655,45 @@ struct igb_ring_desc_16_bytes {
void
rxtx_config_display(void)
{
- printf(" %s packet forwarding%s - CRC stripping %s - "
- "packets/burst=%d\n", cur_fwd_eng->fwd_mode_name,
+ portid_t pid;
+
+ printf(" %s packet forwarding%s packets/burst=%d\n",
+ cur_fwd_eng->fwd_mode_name,
retry_enabled == 0 ? "" : " with retry",
- rx_mode.hw_strip_crc ? "enabled" : "disabled",
nb_pkt_per_burst);

if (cur_fwd_eng == &tx_only_engine || cur_fwd_eng == &flow_gen_engine)
printf(" packet len=%u - nb packet segments=%d\n",
(unsigned)tx_pkt_length, (int) tx_pkt_nb_segs);

- struct rte_eth_rxconf *rx_conf = &ports[0].rx_conf;
- struct rte_eth_txconf *tx_conf = &ports[0].tx_conf;
-
printf(" nb forwarding cores=%d - nb forwarding ports=%d\n",
nb_fwd_lcores, nb_fwd_ports);
- printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n",
- nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
- printf(" RX threshold registers: pthresh=%d hthresh=%d wthresh=%d\n",
- rx_conf->rx_thresh.pthresh, rx_conf->rx_thresh.hthresh,
- rx_conf->rx_thresh.wthresh);
- printf(" TX queues=%d - TX desc=%d - TX free threshold=%d\n",
- nb_txq, nb_txd, tx_conf->tx_free_thresh);
- printf(" TX threshold registers: pthresh=%d hthresh=%d wthresh=%d\n",
- tx_conf->tx_thresh.pthresh, tx_conf->tx_thresh.hthresh,
- tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+
+ RTE_ETH_FOREACH_DEV(pid) {
+ struct rte_eth_rxconf *rx_conf = &ports[pid].rx_conf;
+ struct rte_eth_txconf *tx_conf = &ports[pid].tx_conf;
+
+ printf(" port %d:\n", (unsigned int)pid);
+ printf(" CRC stripping %s\n",
+ ports[pid].dev_conf.rxmode.hw_strip_crc ?
+ "enabled" : "disabled");
+ printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n",
+ nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
+ printf(" RX threshold registers: pthresh=%d hthresh=%d "
+ " wthresh=%d\n",
+ rx_conf->rx_thresh.pthresh,
+ rx_conf->rx_thresh.hthresh,
+ rx_conf->rx_thresh.wthresh);
+ printf(" TX queues=%d - TX desc=%d - TX free threshold=%d\n",
+ nb_txq, nb_txd, tx_conf->tx_free_thresh);
+ printf(" TX threshold registers: pthresh=%d hthresh=%d "
+ " wthresh=%d\n",
+ tx_conf->tx_thresh.pthresh,
+ tx_conf->tx_thresh.hthresh,
+ tx_conf->tx_thresh.wthresh);
+ printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
+ tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ }
}

void
--
1.8.3.1
Shahaf Shuler
2017-12-12 12:52:46 UTC
Permalink
Ethdev Rx offloads API has changed since:

commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")

Convert the application to use the new API. The is no functionality
changes rather simple conversion of the flags.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 51 +++++++++++++++++++++++-------------------
app/test-pmd/config.c | 36 +++++++++++++++++++----------
app/test-pmd/parameters.c | 32 +++++++++++++-------------
app/test-pmd/testpmd.c | 19 +++++++---------
4 files changed, 77 insertions(+), 61 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d963..d8c73a9 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1577,6 +1577,7 @@ struct cmd_config_max_pkt_len_result {
__attribute__((unused)) void *data)
{
struct cmd_config_max_pkt_len_result *res = parsed_result;
+ uint64_t rx_offloads = rx_mode.offloads;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@@ -1594,14 +1595,16 @@ struct cmd_config_max_pkt_len_result {

rx_mode.max_rx_pkt_len = res->value;
if (res->value > ETHER_MAX_LEN)
- rx_mode.jumbo_frame = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
else
- rx_mode.jumbo_frame = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
} else {
printf("Unknown parameter\n");
return;
}

+ rx_mode.offloads = rx_offloads;
+
init_port_config();

cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
@@ -1703,6 +1706,7 @@ struct cmd_config_rx_mode_flag {
__attribute__((unused)) void *data)
{
struct cmd_config_rx_mode_flag *res = parsed_result;
+ uint64_t rx_offloads = rx_mode.offloads;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@@ -1711,48 +1715,48 @@ struct cmd_config_rx_mode_flag {

if (!strcmp(res->name, "crc-strip")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_strip_crc = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "scatter")) {
- if (!strcmp(res->value, "on"))
- rx_mode.enable_scatter = 1;
- else if (!strcmp(res->value, "off"))
- rx_mode.enable_scatter = 0;
- else {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ } else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "rx-cksum")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_ip_checksum = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_ip_checksum = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "rx-timestamp")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_timestamp = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_timestamp = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan")) {
if (!strcmp(res->value, "on")) {
- rx_mode.hw_vlan_filter = 1;
- rx_mode.hw_vlan_strip = 1;
+ rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
}
else if (!strcmp(res->value, "off")) {
- rx_mode.hw_vlan_filter = 0;
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
}
else {
printf("Unknown parameter\n");
@@ -1760,27 +1764,27 @@ struct cmd_config_rx_mode_flag {
}
} else if (!strcmp(res->name, "hw-vlan-filter")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_filter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_filter = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan-strip")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_strip = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan-extend")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_extend = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_extend = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
else {
printf("Unknown parameter\n");
return;
@@ -1798,6 +1802,7 @@ struct cmd_config_rx_mode_flag {
printf("Unknown parameter\n");
return;
}
+ rx_mode.offloads = rx_offloads;

init_port_config();

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 8a2d30c..2fdc051 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -540,14 +540,12 @@ struct rss_type_info {
void
port_offload_cap_display(portid_t port_id)
{
- struct rte_eth_dev *dev;
struct rte_eth_dev_info dev_info;
static const char *info_border = "************";

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

- dev = &rte_eth_devices[port_id];
rte_eth_dev_info_get(port_id, &dev_info);

printf("\n%s Port %d supported offload features: %s\n",
@@ -555,7 +553,8 @@ struct rss_type_info {

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_VLAN_STRIP) {
printf("VLAN stripped: ");
- if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_VLAN_STRIP)
printf("on\n");
else
printf("off\n");
@@ -563,7 +562,8 @@ struct rss_type_info {

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_QINQ_STRIP) {
printf("Double VLANs stripped: ");
- if (dev->data->dev_conf.rxmode.hw_vlan_extend)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_VLAN_EXTEND)
printf("on\n");
else
printf("off\n");
@@ -571,7 +571,8 @@ struct rss_type_info {

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
printf("RX IPv4 checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -579,7 +580,8 @@ struct rss_type_info {

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM) {
printf("RX UDP checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_UDP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -587,18 +589,26 @@ struct rss_type_info {

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
printf("RX TCP checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TCP_CKSUM)
printf("on\n");
else
printf("off\n");
}

- if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
- printf("RX Outer IPv4 checksum: on");
+ if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) {
+ printf("RX Outer IPv4 checksum: ");
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
+ printf("on\n");
+ else
+ printf("off\n");
+ }

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO) {
printf("Large receive offload: ");
- if (dev->data->dev_conf.rxmode.enable_lro)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TCP_LRO)
printf("on\n");
else
printf("off\n");
@@ -615,7 +625,8 @@ struct rss_type_info {

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TIMESTAMP) {
printf("HW timestamp: ");
- if (dev->data->dev_conf.rxmode.hw_timestamp)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TIMESTAMP)
printf("on\n");
else
printf("off\n");
@@ -1675,7 +1686,8 @@ struct igb_ring_desc_16_bytes {

printf(" port %d:\n", (unsigned int)pid);
printf(" CRC stripping %s\n",
- ports[pid].dev_conf.rxmode.hw_strip_crc ?
+ (ports[pid].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_CRC_STRIP) ?
"enabled" : "disabled");
printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n",
nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 84e7a63..263651c 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -566,6 +566,8 @@
char **argvopt;
int opt_idx;
enum { TX, RX };
+ /* Default Rx offloads for all ports. */
+ uint64_t rx_offloads = rx_mode.offloads;

static struct option lgopts[] = {
{ "help", 0, 0, 0 },
@@ -804,7 +806,8 @@
if (n >= ETHER_MIN_LEN) {
rx_mode.max_rx_pkt_len = (uint32_t) n;
if (n > ETHER_MAX_LEN)
- rx_mode.jumbo_frame = 1;
+ rx_offloads |=
+ DEV_RX_OFFLOAD_JUMBO_FRAME;
} else
rte_exit(EXIT_FAILURE,
"Invalid max-pkt-len=%d - should be > %d\n",
@@ -897,34 +900,30 @@
}
#endif
if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
- rx_mode.enable_lro = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
- rx_mode.enable_scatter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum"))
- rx_mode.hw_ip_checksum = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
if (!strcmp(lgopts[opt_idx].name,
"enable-rx-timestamp"))
- rx_mode.hw_timestamp = 1;
-
- if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) {
- rx_mode.hw_vlan_filter = 0;
- rx_mode.hw_vlan_strip = 0;
- rx_mode.hw_vlan_extend = 0;
- }
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
+ if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-filter"))
- rx_mode.hw_vlan_filter = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-strip"))
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-extend"))
- rx_mode.hw_vlan_extend = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;

if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))
rx_drop_en = 1;
@@ -1140,4 +1139,7 @@
break;
}
}
+
+ /* Set offload configuration from command line parameters. */
+ rx_mode.offloads = rx_offloads;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index c3ab448..6785b09 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -338,15 +338,10 @@ struct fwd_engine * fwd_engines[] = {
*/
struct rte_eth_rxmode rx_mode = {
.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */
- .split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled. */
- .hw_ip_checksum = 0, /**< IP checksum offload disabled. */
- .hw_vlan_filter = 1, /**< VLAN filtering enabled. */
- .hw_vlan_strip = 1, /**< VLAN strip enabled. */
- .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */
- .hw_strip_crc = 1, /**< CRC stripping by hardware enabled. */
- .hw_timestamp = 0, /**< HW timestamp enabled. */
+ .offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP |
+ DEV_RX_OFFLOAD_CRC_STRIP),
+ .ignore_offload_bitfield = 1,
};

struct rte_fdir_conf fdir_conf = {
@@ -1521,6 +1516,8 @@ static int eth_event_callback(portid_t port_id,
port->need_reconfig_queues = 1;
return -1;
}
+ /* Apply Rx offloads configuration */
+ port->rx_conf.offloads = port->dev_conf.rxmode.offloads;
/* setup rx queues */
for (qi = 0; qi < nb_rxq; qi++) {
if ((numa_support) &&
@@ -2252,7 +2249,7 @@ uint8_t port_is_bonding_slave(portid_t slave_pid)
retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
if (retval < 0)
return retval;
- port_conf.rxmode.hw_vlan_filter = 1;
+ port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;

/**
* Write the configuration into the device.
@@ -2301,7 +2298,7 @@ uint8_t port_is_bonding_slave(portid_t slave_pid)

rxtx_port_config(rte_port);
/* VLAN filter */
- rte_port->dev_conf.rxmode.hw_vlan_filter = 1;
+ rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
for (i = 0; i < RTE_DIM(vlan_tags); i++)
rx_vft_set(pid, vlan_tags[i], 1);
--
1.8.3.1
Shahaf Shuler
2017-12-12 12:52:47 UTC
Permalink
This patch adds supports for checking if a single port is stopped.
currently there is a function to check only for all ports.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/testpmd.c | 16 ++++++++++++----
app/test-pmd/testpmd.h | 1 +
2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 6785b09..77154ef 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1394,15 +1394,23 @@ static int eth_event_callback(portid_t port_id,
}

int
+port_is_stopped(portid_t port_id)
+{
+ struct rte_port *port = &ports[port_id];
+
+ if ((port->port_status != RTE_PORT_STOPPED) &&
+ (port->slave_flag == 0))
+ return 0;
+ return 1;
+}
+
+int
all_ports_stopped(void)
{
portid_t pi;
- struct rte_port *port;

RTE_ETH_FOREACH_DEV(pi) {
- port = &ports[pi];
- if ((port->port_status != RTE_PORT_STOPPED) &&
- (port->slave_flag == 0))
+ if (!port_is_stopped(pi))
return 0;
}

diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 1639d27..ab74d39 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -682,6 +682,7 @@ int init_port_dcb_config(portid_t pid, enum dcb_mode_enable dcb_mode,
void attach_port(char *identifier);
void detach_port(portid_t port_id);
int all_ports_stopped(void);
+int port_is_stopped(portid_t port_id);
int port_is_started(portid_t port_id);
void pmd_test_exit(void);
void fdir_get_infos(portid_t port_id);
--
1.8.3.1
Shahaf Shuler
2017-12-12 12:52:48 UTC
Permalink
Ethdev Tx offloads API has changed since:

commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")

Convert the application to use the new API.

This patch mandates the port to be stopped when configure the Tx
offloads. This is because the PMD must be aware to the offloads changes
on the device and queue configuration.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 90 ++++++++++++++++++++++++++++++++++++++++++---
app/test-pmd/config.c | 55 ++++++++++++++++++---------
app/test-pmd/testpmd.c | 3 ++
3 files changed, 124 insertions(+), 24 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index d8c73a9..5812583 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3439,7 +3439,14 @@ struct cmd_tx_vlan_set_result {
{
struct cmd_tx_vlan_set_result *res = parsed_result;

+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =
@@ -3486,7 +3493,14 @@ struct cmd_tx_vlan_set_qinq_result {
{
struct cmd_tx_vlan_set_qinq_result *res = parsed_result;

+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan =
@@ -3592,7 +3606,14 @@ struct cmd_tx_vlan_reset_result {
{
struct cmd_tx_vlan_reset_result *res = parsed_result;

+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_reset(res->port_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan =
@@ -3685,11 +3706,16 @@ struct cmd_csum_result {
struct cmd_csum_result *res = parsed_result;
int hw = 0;
uint16_t mask = 0;
+ uint64_t csum_offloads = 0;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
printf("invalid port %d\n", res->port_id);
return;
}
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }

if (!strcmp(res->mode, "set")) {

@@ -3698,22 +3724,34 @@ struct cmd_csum_result {

if (!strcmp(res->proto, "ip")) {
mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}

- if (hw)
+ if (hw) {
ports[res->port_id].tx_ol_flags |= mask;
- else
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ csum_offloads;
+ } else {
ports[res->port_id].tx_ol_flags &= (~mask);
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ (~csum_offloads);
+ }
}
csum_show(res->port_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_csum_csum =
@@ -3837,15 +3875,24 @@ struct cmd_tso_set_result {

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }

if (!strcmp(res->mode, "set"))
ports[res->port_id].tso_segsz = res->tso_segsz;

- if (ports[res->port_id].tso_segsz == 0)
+ if (ports[res->port_id].tso_segsz == 0) {
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_TCP_TSO;
printf("TSO for non-tunneled packets is disabled\n");
- else
+ } else {
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_TCP_TSO;
printf("TSO segment size for non-tunneled packets is %d\n",
ports[res->port_id].tso_segsz);
+ }

/* display warnings if configuration is not supported by the NIC */
rte_eth_dev_info_get(res->port_id, &dev_info);
@@ -3854,6 +3901,8 @@ struct cmd_tso_set_result {
printf("Warning: TSO enabled but not "
"supported by port %d\n", res->port_id);
}
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tso_set_tso =
@@ -3939,13 +3988,27 @@ struct cmd_tunnel_tso_set_result {

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }

if (!strcmp(res->mode, "set"))
ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;

- if (ports[res->port_id].tunnel_tso_segsz == 0)
+ if (ports[res->port_id].tunnel_tso_segsz == 0) {
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ ~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO for tunneled packets is disabled\n");
- else {
+ } else {
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO segment size for tunneled packets is %d\n",
ports[res->port_id].tunnel_tso_segsz);

@@ -3971,6 +4034,8 @@ struct cmd_tunnel_tso_set_result {
printf("Warning: csum set outer-ip must be set to hw "
"if outer L3 is IPv4; not necessary for IPv6\n");
}
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =
@@ -13012,8 +13077,13 @@ struct cmd_macsec_offload_on_result {

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(port_id)) {
+ printf("Please stop port %d first\n", port_id);
+ return;
+ }

ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
#endif
@@ -13022,6 +13092,7 @@ struct cmd_macsec_offload_on_result {

switch (ret) {
case 0:
+ cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
printf("invalid port_id %d\n", port_id);
@@ -13096,14 +13167,21 @@ struct cmd_macsec_offload_off_result {

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(port_id)) {
+ printf("Please stop port %d first\n", port_id);
+ return;
+ }

ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_disable(port_id);
#endif

switch (ret) {
case 0:
+ cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
printf("invalid port_id %d\n", port_id);
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 2fdc051..ee7d083 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -616,8 +616,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
printf("VLAN insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_VLAN_INSERT)
printf("on\n");
else
printf("off\n");
@@ -634,8 +634,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) {
printf("Double VLANs insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_QINQ_INSERT)
printf("on\n");
else
printf("off\n");
@@ -643,7 +643,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
printf("TX IPv4 checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -651,7 +652,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {
printf("TX UDP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_UDP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -659,7 +661,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
printf("TX TCP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_TCP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -667,7 +670,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) {
printf("TX SCTP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_SCTP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -675,8 +679,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
printf("TX Outer IPv4 checksum: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -684,7 +688,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) {
printf("TX TCP segmentation: ");
- if (ports[port_id].tso_segsz != 0)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_TCP_TSO)
printf("on\n");
else
printf("off\n");
@@ -692,7 +697,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TSO) {
printf("TX UDP segmentation: ");
- if (ports[port_id].tso_segsz != 0)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_UDP_TSO)
printf("on\n");
else
printf("off\n");
@@ -700,7 +706,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO) {
printf("TSO for VXLAN tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_VXLAN_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -708,7 +715,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO) {
printf("TSO for GRE tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_GRE_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -716,7 +724,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO) {
printf("TSO for IPIP tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -724,7 +733,8 @@ struct rss_type_info {

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO) {
printf("TSO for GENEVE tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -1703,8 +1713,10 @@ struct igb_ring_desc_16_bytes {
tx_conf->tx_thresh.pthresh,
tx_conf->tx_thresh.hthresh,
tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""
+ " - TXQ offloads=0x%"PRIx64"\n",
+ tx_conf->tx_rs_thresh, tx_conf->txq_flags,
+ tx_conf->offloads);
}
}

@@ -2782,6 +2794,7 @@ struct igb_ring_desc_16_bytes {
tx_vlan_set(portid_t port_id, uint16_t vlan_id)
{
int vlan_offload;
+
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
if (vlan_id_is_invalid(vlan_id))
@@ -2795,6 +2808,7 @@ struct igb_ring_desc_16_bytes {

tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
}

@@ -2802,6 +2816,7 @@ struct igb_ring_desc_16_bytes {
tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
{
int vlan_offload;
+
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
if (vlan_id_is_invalid(vlan_id))
@@ -2817,6 +2832,7 @@ struct igb_ring_desc_16_bytes {

tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
ports[port_id].tx_vlan_id_outer = vlan_id_outer;
}
@@ -2828,6 +2844,9 @@ struct igb_ring_desc_16_bytes {
return;
ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
TESTPMD_TX_OFFLOAD_INSERT_QINQ);
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~(DEV_TX_OFFLOAD_VLAN_INSERT |
+ DEV_TX_OFFLOAD_QINQ_INSERT);
ports[port_id].tx_vlan_id = 0;
ports[port_id].tx_vlan_id_outer = 0;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 77154ef..0087438 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1498,6 +1498,9 @@ static int eth_event_callback(portid_t port_id,
}
if (port->need_reconfig_queues > 0) {
port->need_reconfig_queues = 0;
+ port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;
+ /* Apply Tx offloads configuration */
+ port->tx_conf.offloads = port->dev_conf.txmode.offloads;
/* setup tx queues */
for (qi = 0; qi < nb_txq; qi++) {
if ((numa_support) &&
--
1.8.3.1
Maciej Czekaj
2018-01-05 18:11:05 UTC
Permalink
-- Oryginal message --
Post by Shahaf Shuler
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
Convert the application to use the new API.
This patch mandates the port to be stopped when configure the Tx
offloads. This is because the PMD must be aware to the offloads changes
on the device and queue configuration.
---
app/test-pmd/cmdline.c | 90 ++++++++++++++++++++++++++++++++++++++++++---
app/test-pmd/config.c | 55 ++++++++++++++++++---------
app/test-pmd/testpmd.c | 3 ++
3 files changed, 124 insertions(+), 24 deletions(-)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index d8c73a9..5812583 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3439,7 +3439,14 @@ struct cmd_tx_vlan_set_result {
{
struct cmd_tx_vlan_set_result *res = parsed_result;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}
cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =
@@ -3486,7 +3493,14 @@ struct cmd_tx_vlan_set_qinq_result {
{
struct cmd_tx_vlan_set_qinq_result *res = parsed_result;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}
cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan =
@@ -3592,7 +3606,14 @@ struct cmd_tx_vlan_reset_result {
{
struct cmd_tx_vlan_reset_result *res = parsed_result;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_reset(res->port_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}
cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan =
@@ -3685,11 +3706,16 @@ struct cmd_csum_result {
struct cmd_csum_result *res = parsed_result;
int hw = 0;
uint16_t mask = 0;
+ uint64_t csum_offloads = 0;
if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
printf("invalid port %d\n", res->port_id);
return;
}
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
if (!strcmp(res->mode, "set")) {
@@ -3698,22 +3724,34 @@ struct cmd_csum_result {
if (!strcmp(res->proto, "ip")) {
mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}
- if (hw)
+ if (hw) {
ports[res->port_id].tx_ol_flags |= mask;
- else
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ csum_offloads;
+ } else {
ports[res->port_id].tx_ol_flags &= (~mask);
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ (~csum_offloads);
+ }
}
csum_show(res->port_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}
cmdline_parse_token_string_t cmd_csum_csum =
@@ -3837,15 +3875,24 @@ struct cmd_tso_set_result {
if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
if (!strcmp(res->mode, "set"))
ports[res->port_id].tso_segsz = res->tso_segsz;
- if (ports[res->port_id].tso_segsz == 0)
+ if (ports[res->port_id].tso_segsz == 0) {
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_TCP_TSO;
printf("TSO for non-tunneled packets is disabled\n");
- else
+ } else {
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_TCP_TSO;
printf("TSO segment size for non-tunneled packets is %d\n",
ports[res->port_id].tso_segsz);
+ }
/* display warnings if configuration is not supported by the NIC */
rte_eth_dev_info_get(res->port_id, &dev_info);
@@ -3854,6 +3901,8 @@ struct cmd_tso_set_result {
printf("Warning: TSO enabled but not "
"supported by port %d\n", res->port_id);
}
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}
cmdline_parse_token_string_t cmd_tso_set_tso =
@@ -3939,13 +3988,27 @@ struct cmd_tunnel_tso_set_result {
if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
if (!strcmp(res->mode, "set"))
ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;
- if (ports[res->port_id].tunnel_tso_segsz == 0)
+ if (ports[res->port_id].tunnel_tso_segsz == 0) {
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ ~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO for tunneled packets is disabled\n");
- else {
+ } else {
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO segment size for tunneled packets is %d\n",
ports[res->port_id].tunnel_tso_segsz);
@@ -3971,6 +4034,8 @@ struct cmd_tunnel_tso_set_result {
printf("Warning: csum set outer-ip must be set to hw "
"if outer L3 is IPv4; not necessary for IPv6\n");
}
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}
cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =
@@ -13012,8 +13077,13 @@ struct cmd_macsec_offload_on_result {
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(port_id)) {
+ printf("Please stop port %d first\n", port_id);
+ return;
+ }
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
#endif
@@ -13022,6 +13092,7 @@ struct cmd_macsec_offload_on_result {
switch (ret) {
+ cmd_reconfig_device_queue(port_id, 1, 1);
break;
printf("invalid port_id %d\n", port_id);
@@ -13096,14 +13167,21 @@ struct cmd_macsec_offload_off_result {
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(port_id)) {
+ printf("Please stop port %d first\n", port_id);
+ return;
+ }
ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_disable(port_id);
#endif
switch (ret) {
+ cmd_reconfig_device_queue(port_id, 1, 1);
break;
printf("invalid port_id %d\n", port_id);
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 2fdc051..ee7d083 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -616,8 +616,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
printf("VLAN insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_VLAN_INSERT)
printf("on\n");
else
printf("off\n");
@@ -634,8 +634,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) {
printf("Double VLANs insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_QINQ_INSERT)
printf("on\n");
else
printf("off\n");
@@ -643,7 +643,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
printf("TX IPv4 checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -651,7 +652,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {
printf("TX UDP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_UDP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -659,7 +661,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
printf("TX TCP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_TCP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -667,7 +670,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) {
printf("TX SCTP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_SCTP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -675,8 +679,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
printf("TX Outer IPv4 checksum: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -684,7 +688,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) {
printf("TX TCP segmentation: ");
- if (ports[port_id].tso_segsz != 0)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_TCP_TSO)
printf("on\n");
else
printf("off\n");
@@ -692,7 +697,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TSO) {
printf("TX UDP segmentation: ");
- if (ports[port_id].tso_segsz != 0)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_UDP_TSO)
printf("on\n");
else
printf("off\n");
@@ -700,7 +706,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO) {
printf("TSO for VXLAN tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_VXLAN_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -708,7 +715,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO) {
printf("TSO for GRE tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_GRE_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -716,7 +724,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO) {
printf("TSO for IPIP tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -724,7 +733,8 @@ struct rss_type_info {
if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO) {
printf("TSO for GENEVE tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -1703,8 +1713,10 @@ struct igb_ring_desc_16_bytes {
tx_conf->tx_thresh.pthresh,
tx_conf->tx_thresh.hthresh,
tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""
+ " - TXQ offloads=0x%"PRIx64"\n",
+ tx_conf->tx_rs_thresh, tx_conf->txq_flags,
+ tx_conf->offloads);
}
}
@@ -2782,6 +2794,7 @@ struct igb_ring_desc_16_bytes {
tx_vlan_set(portid_t port_id, uint16_t vlan_id)
{
int vlan_offload;
+
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
if (vlan_id_is_invalid(vlan_id))
@@ -2795,6 +2808,7 @@ struct igb_ring_desc_16_bytes {
tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
}
@@ -2802,6 +2816,7 @@ struct igb_ring_desc_16_bytes {
tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
{
int vlan_offload;
+
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
if (vlan_id_is_invalid(vlan_id))
@@ -2817,6 +2832,7 @@ struct igb_ring_desc_16_bytes {
tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
ports[port_id].tx_vlan_id_outer = vlan_id_outer;
}
@@ -2828,6 +2844,9 @@ struct igb_ring_desc_16_bytes {
return;
ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
TESTPMD_TX_OFFLOAD_INSERT_QINQ);
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~(DEV_TX_OFFLOAD_VLAN_INSERT |
+ DEV_TX_OFFLOAD_QINQ_INSERT);
ports[port_id].tx_vlan_id = 0;
ports[port_id].tx_vlan_id_outer = 0;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 77154ef..0087438 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1498,6 +1498,9 @@ static int eth_event_callback(portid_t port_id,
}
if (port->need_reconfig_queues > 0) {
port->need_reconfig_queues = 0;
+ port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;
+ /* Apply Tx offloads configuration */
+ port->tx_conf.offloads = port->dev_conf.txmode.offloads;
FAST_FREE flag got lost during conversion.

Per-queue configuration flags are initialized with PMD-specific default
values in rxtx_port_config:

rxtx_port_config(struct rte_port *port)
{
    port->rx_conf = port->dev_info.default_rxconf;
    port->tx_conf = port->dev_info.default_txconf;
...

but port->dev_conf.txmode is taken from global variable txmode, not from
PMD. See in init_config():

        /* Apply default Tx configuration for all ports */
        port->dev_conf.txmode = tx_mode;
        port->dev_conf.rxmode = rx_mode;

So the configuration will not be consistent, i.e. different flags in
tx_queue_setup() and different in dev_configure().

If the intention is to keep defaults from PMD, let's fix this...
If not, please apply FAST_FREE flag  as in example patch v3, e.g:

+        rte_eth_dev_info_get(portid, &dev_info);
+        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+            local_port_conf.txmode.offloads |=
+                DEV_TX_OFFLOAD_MBUF_FAST_FREE;
Post by Shahaf Shuler
/* setup tx queues */
for (qi = 0; qi < nb_txq; qi++) {
if ((numa_support) &&
Shahaf Shuler
2018-01-07 15:24:24 UTC
Permalink
Post by Maciej Czekaj
If the intention is to keep defaults from PMD, let's fix this...
+ rte_eth_dev_info_get(portid, &dev_info);
+ if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+ local_port_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_MBUF_FAST_FREE;
Will take care on next version

--Shahaf

From: Maciej Czekaj [mailto:***@caviumnetworks.com]
Sent: Friday, January 5, 2018 8:11 PM
To: Shahaf Shuler <***@mellanox.com>; ***@intel.com; ***@intel.com
Cc: ***@dpdk.org
Subject: Re: [dpdk-dev] [PATCH v2 04/10] app/testpmd: convert to new Ethdev Tx offloads API



-- Oryginal message --

Ethdev Tx offloads API has changed since:



commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")



Convert the application to use the new API.



This patch mandates the port to be stopped when configure the Tx

offloads. This is because the PMD must be aware to the offloads changes

on the device and queue configuration.



Signed-off-by: Shahaf Shuler <***@mellanox.com><mailto:***@mellanox.com>

---

app/test-pmd/cmdline.c | 90 ++++++++++++++++++++++++++++++++++++++++++---

app/test-pmd/config.c | 55 ++++++++++++++++++---------

app/test-pmd/testpmd.c | 3 ++

3 files changed, 124 insertions(+), 24 deletions(-)



diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c

index d8c73a9..5812583 100644

--- a/app/test-pmd/cmdline.c

+++ b/app/test-pmd/cmdline.c

@@ -3439,7 +3439,14 @@ struct cmd_tx_vlan_set_result {

{

struct cmd_tx_vlan_set_result *res = parsed_result;



+ if (!port_is_stopped(res->port_id)) {

+ printf("Please stop port %d first\n", res->port_id);

+ return;

+ }

+

tx_vlan_set(res->port_id, res->vlan_id);

+

+ cmd_reconfig_device_queue(res->port_id, 1, 1);

}



cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =

@@ -3486,7 +3493,14 @@ struct cmd_tx_vlan_set_qinq_result {

{

struct cmd_tx_vlan_set_qinq_result *res = parsed_result;



+ if (!port_is_stopped(res->port_id)) {

+ printf("Please stop port %d first\n", res->port_id);

+ return;

+ }

+

tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer);

+

+ cmd_reconfig_device_queue(res->port_id, 1, 1);

}



cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan =

@@ -3592,7 +3606,14 @@ struct cmd_tx_vlan_reset_result {

{

struct cmd_tx_vlan_reset_result *res = parsed_result;



+ if (!port_is_stopped(res->port_id)) {

+ printf("Please stop port %d first\n", res->port_id);

+ return;

+ }

+

tx_vlan_reset(res->port_id);

+

+ cmd_reconfig_device_queue(res->port_id, 1, 1);

}



cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan =

@@ -3685,11 +3706,16 @@ struct cmd_csum_result {

struct cmd_csum_result *res = parsed_result;

int hw = 0;

uint16_t mask = 0;

+ uint64_t csum_offloads = 0;



if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {

printf("invalid port %d\n", res->port_id);

return;

}

+ if (!port_is_stopped(res->port_id)) {

+ printf("Please stop port %d first\n", res->port_id);

+ return;

+ }



if (!strcmp(res->mode, "set")) {



@@ -3698,22 +3724,34 @@ struct cmd_csum_result {



if (!strcmp(res->proto, "ip")) {

mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;

+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;

} else if (!strcmp(res->proto, "udp")) {

mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;

+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;

} else if (!strcmp(res->proto, "tcp")) {

mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;

+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;

} else if (!strcmp(res->proto, "sctp")) {

mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;

+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;

} else if (!strcmp(res->proto, "outer-ip")) {

mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;

+ csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;

}



- if (hw)

+ if (hw) {

ports[res->port_id].tx_ol_flags |= mask;

- else

+ ports[res->port_id].dev_conf.txmode.offloads |=

+ csum_offloads;

+ } else {

ports[res->port_id].tx_ol_flags &= (~mask);

+ ports[res->port_id].dev_conf.txmode.offloads &=

+ (~csum_offloads);

+ }

}

csum_show(res->port_id);

+

+ cmd_reconfig_device_queue(res->port_id, 1, 1);

}



cmdline_parse_token_string_t cmd_csum_csum =

@@ -3837,15 +3875,24 @@ struct cmd_tso_set_result {



if (port_id_is_invalid(res->port_id, ENABLED_WARN))

return;

+ if (!port_is_stopped(res->port_id)) {

+ printf("Please stop port %d first\n", res->port_id);

+ return;

+ }



if (!strcmp(res->mode, "set"))

ports[res->port_id].tso_segsz = res->tso_segsz;



- if (ports[res->port_id].tso_segsz == 0)

+ if (ports[res->port_id].tso_segsz == 0) {

+ ports[res->port_id].dev_conf.txmode.offloads &=

+ ~DEV_TX_OFFLOAD_TCP_TSO;

printf("TSO for non-tunneled packets is disabled\n");

- else

+ } else {

+ ports[res->port_id].dev_conf.txmode.offloads |=

+ DEV_TX_OFFLOAD_TCP_TSO;

printf("TSO segment size for non-tunneled packets is %d\n",

ports[res->port_id].tso_segsz);

+ }



/* display warnings if configuration is not supported by the NIC */

rte_eth_dev_info_get(res->port_id, &dev_info);

@@ -3854,6 +3901,8 @@ struct cmd_tso_set_result {

printf("Warning: TSO enabled but not "

"supported by port %d\n", res->port_id);

}

+

+ cmd_reconfig_device_queue(res->port_id, 1, 1);

}



cmdline_parse_token_string_t cmd_tso_set_tso =

@@ -3939,13 +3988,27 @@ struct cmd_tunnel_tso_set_result {



if (port_id_is_invalid(res->port_id, ENABLED_WARN))

return;

+ if (!port_is_stopped(res->port_id)) {

+ printf("Please stop port %d first\n", res->port_id);

+ return;

+ }



if (!strcmp(res->mode, "set"))

ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;



- if (ports[res->port_id].tunnel_tso_segsz == 0)

+ if (ports[res->port_id].tunnel_tso_segsz == 0) {

+ ports[res->port_id].dev_conf.txmode.offloads &=

+ ~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |

+ DEV_TX_OFFLOAD_GRE_TNL_TSO |

+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |

+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);

printf("TSO for tunneled packets is disabled\n");

- else {

+ } else {

+ ports[res->port_id].dev_conf.txmode.offloads |=

+ (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |

+ DEV_TX_OFFLOAD_GRE_TNL_TSO |

+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |

+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);

printf("TSO segment size for tunneled packets is %d\n",

ports[res->port_id].tunnel_tso_segsz);



@@ -3971,6 +4034,8 @@ struct cmd_tunnel_tso_set_result {

printf("Warning: csum set outer-ip must be set to hw "

"if outer L3 is IPv4; not necessary for IPv6\n");

}

+

+ cmd_reconfig_device_queue(res->port_id, 1, 1);

}



cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =

@@ -13012,8 +13077,13 @@ struct cmd_macsec_offload_on_result {



if (port_id_is_invalid(port_id, ENABLED_WARN))

return;

+ if (!port_is_stopped(port_id)) {

+ printf("Please stop port %d first\n", port_id);

+ return;

+ }



ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;

+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;

#ifdef RTE_LIBRTE_IXGBE_PMD

ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);

#endif

@@ -13022,6 +13092,7 @@ struct cmd_macsec_offload_on_result {



switch (ret) {

case 0:

+ cmd_reconfig_device_queue(port_id, 1, 1);

break;

case -ENODEV:

printf("invalid port_id %d\n", port_id);

@@ -13096,14 +13167,21 @@ struct cmd_macsec_offload_off_result {



if (port_id_is_invalid(port_id, ENABLED_WARN))

return;

+ if (!port_is_stopped(port_id)) {

+ printf("Please stop port %d first\n", port_id);

+ return;

+ }



ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;

+ ports[port_id].dev_conf.txmode.offloads &=

+ ~DEV_TX_OFFLOAD_MACSEC_INSERT;

#ifdef RTE_LIBRTE_IXGBE_PMD

ret = rte_pmd_ixgbe_macsec_disable(port_id);

#endif



switch (ret) {

case 0:

+ cmd_reconfig_device_queue(port_id, 1, 1);

break;

case -ENODEV:

printf("invalid port_id %d\n", port_id);

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c

index 2fdc051..ee7d083 100644

--- a/app/test-pmd/config.c

+++ b/app/test-pmd/config.c

@@ -616,8 +616,8 @@ struct rss_type_info {



if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {

printf("VLAN insert: ");

- if (ports[port_id].tx_ol_flags &

- TESTPMD_TX_OFFLOAD_INSERT_VLAN)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_VLAN_INSERT)

printf("on\n");

else

printf("off\n");<mailto:);@@-634,8+634,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_QINQ_INSERT)%7bprintf(>

@@ -634,8 +634,8 @@ struct rss_type_info {<mailto:);@@-634,8+634,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_QINQ_INSERT)%7bprintf(>

<mailto:);@@-634,8+634,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_QINQ_INSERT)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) {<mailto:);@@-634,8+634,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_QINQ_INSERT)%7bprintf(>

printf("<mailto:);@@-634,8+634,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_QINQ_INSERT)%7bprintf(>Double VLANs insert: ");

- if (ports[port_id].tx_ol_flags &

- TESTPMD_TX_OFFLOAD_INSERT_QINQ)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_QINQ_INSERT)

printf("on\n");

else

printf("off\n");<mailto:);@@-643,7+643,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPV4_CKSUM)%7bprintf(>

@@ -643,7 +643,8 @@ struct rss_type_info {<mailto:);@@-643,7+643,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPV4_CKSUM)%7bprintf(>

<mailto:);@@-643,7+643,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPV4_CKSUM)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {<mailto:);@@-643,7+643,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPV4_CKSUM)%7bprintf(>

printf("<mailto:);@@-643,7+643,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPV4_CKSUM)%7bprintf(>TX IPv4 checksum: ");

- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_IPV4_CKSUM)

printf("on\n");

else

printf("off\n");<mailto:);@@-651,7+652,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_CKSUM)%7bprintf(>

@@ -651,7 +652,8 @@ struct rss_type_info {<mailto:);@@-651,7+652,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_CKSUM)%7bprintf(>

<mailto:);@@-651,7+652,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_CKSUM)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {<mailto:);@@-651,7+652,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_CKSUM)%7bprintf(>

printf("<mailto:);@@-651,7+652,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_CKSUM)%7bprintf(>TX UDP checksum: ");

- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_UDP_CKSUM)

printf("on\n");

else

printf("off\n");<mailto:);@@-659,7+661,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_CKSUM)%7bprintf(>

@@ -659,7 +661,8 @@ struct rss_type_info {<mailto:);@@-659,7+661,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_CKSUM)%7bprintf(>

<mailto:);@@-659,7+661,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_CKSUM)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {<mailto:);@@-659,7+661,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_CKSUM)%7bprintf(>

printf("<mailto:);@@-659,7+661,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_CKSUM)%7bprintf(>TX TCP checksum: ");

- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_TCP_CKSUM)

printf("on\n");

else

printf("off\n");<mailto:);@@-667,7+670,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_SCTP_CKSUM)%7bprintf(>

@@ -667,7 +670,8 @@ struct rss_type_info {<mailto:);@@-667,7+670,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_SCTP_CKSUM)%7bprintf(>

<mailto:);@@-667,7+670,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_SCTP_CKSUM)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) {<mailto:);@@-667,7+670,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_SCTP_CKSUM)%7bprintf(>

printf("<mailto:);@@-667,7+670,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_SCTP_CKSUM)%7bprintf(>TX SCTP checksum: ");

- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_SCTP_CKSUM)

printf("on\n");

else

printf("off\n");<mailto:);@@-675,8+679,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)%7bprintf(>

@@ -675,8 +679,8 @@ struct rss_type_info {<mailto:);@@-675,8+679,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)%7bprintf(>

<mailto:);@@-675,8+679,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {<mailto:);@@-675,8+679,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)%7bprintf(>

printf("<mailto:);@@-675,8+679,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)%7bprintf(>TX Outer IPv4 checksum: ");

- if (ports[port_id].tx_ol_flags &

- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)

printf("on\n");

else

printf("off\n");<mailto:);@@-684,7+688,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_TSO)%7bprintf(>

@@ -684,7 +688,8 @@ struct rss_type_info {<mailto:);@@-684,7+688,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_TSO)%7bprintf(>

<mailto:);@@-684,7+688,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_TSO)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) {<mailto:);@@-684,7+688,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_TSO)%7bprintf(>

printf("<mailto:);@@-684,7+688,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_TCP_TSO)%7bprintf(>TX TCP segmentation: ");

- if (ports[port_id].tso_segsz != 0)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_TCP_TSO)

printf("on\n");

else

printf("off\n");<mailto:);@@-692,7+697,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_TSO)%7bprintf(>

@@ -692,7 +697,8 @@ struct rss_type_info {<mailto:);@@-692,7+697,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_TSO)%7bprintf(>

<mailto:);@@-692,7+697,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_TSO)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TSO) {<mailto:);@@-692,7+697,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_TSO)%7bprintf(>

printf("<mailto:);@@-692,7+697,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_UDP_TSO)%7bprintf(>TX UDP segmentation: ");

- if (ports[port_id].tso_segsz != 0)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_UDP_TSO)

printf("on\n");

else

printf("off\n");<mailto:);@@-700,7+706,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_VXLAN_TNL_TSO)%7bprintf(>

@@ -700,7 +706,8 @@ struct rss_type_info {<mailto:);@@-700,7+706,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_VXLAN_TNL_TSO)%7bprintf(>

<mailto:);@@-700,7+706,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_VXLAN_TNL_TSO)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO) {<mailto:);@@-700,7+706,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_VXLAN_TNL_TSO)%7bprintf(>

printf("<mailto:);@@-700,7+706,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_VXLAN_TNL_TSO)%7bprintf(>TSO for VXLAN tunnel packet: ");

- if (ports[port_id].tunnel_tso_segsz)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_VXLAN_TNL_TSO)

printf("on\n");

else

printf("off\n");<mailto:);@@-708,7+715,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GRE_TNL_TSO)%7bprintf(>

@@ -708,7 +715,8 @@ struct rss_type_info {<mailto:);@@-708,7+715,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GRE_TNL_TSO)%7bprintf(>

<mailto:);@@-708,7+715,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GRE_TNL_TSO)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO) {<mailto:);@@-708,7+715,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GRE_TNL_TSO)%7bprintf(>

printf("<mailto:);@@-708,7+715,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GRE_TNL_TSO)%7bprintf(>TSO for GRE tunnel packet: ");

- if (ports[port_id].tunnel_tso_segsz)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_GRE_TNL_TSO)

printf("on\n");

else

printf("off\n");<mailto:);@@-716,7+724,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPIP_TNL_TSO)%7bprintf(>

@@ -716,7 +724,8 @@ struct rss_type_info {<mailto:);@@-716,7+724,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPIP_TNL_TSO)%7bprintf(>

<mailto:);@@-716,7+724,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPIP_TNL_TSO)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO) {<mailto:);@@-716,7+724,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPIP_TNL_TSO)%7bprintf(>

printf("<mailto:);@@-716,7+724,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_IPIP_TNL_TSO)%7bprintf(>TSO for IPIP tunnel packet: ");

- if (ports[port_id].tunnel_tso_segsz)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_IPIP_TNL_TSO)

printf("on\n");

else

printf("off\n");<mailto:);@@-724,7+733,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GENEVE_TNL_TSO)%7bprintf(>

@@ -724,7 +733,8 @@ struct rss_type_info {<mailto:);@@-724,7+733,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GENEVE_TNL_TSO)%7bprintf(>

<mailto:);@@-724,7+733,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GENEVE_TNL_TSO)%7bprintf(>

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO) {<mailto:);@@-724,7+733,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GENEVE_TNL_TSO)%7bprintf(>

printf("<mailto:);@@-724,7+733,8@@structrss_type_info%7bif(dev_info.tx_offload_capa&DEV_TX_OFFLOAD_GENEVE_TNL_TSO)%7bprintf(>TSO for GENEVE tunnel packet: ");

- if (ports[port_id].tunnel_tso_segsz)

+ if (ports[port_id].dev_conf.txmode.offloads &

+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO)

printf("on\n");

else

printf("off\n");

@@ -1703,8 +1713,10 @@ struct igb_ring_desc_16_bytes {

tx_conf->tx_thresh.pthresh,

tx_conf->tx_thresh.hthresh,

tx_conf->tx_thresh.wthresh);

- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",

- tx_conf->tx_rs_thresh, tx_conf->txq_flags);

+ printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""

+ " - TXQ offloads=0x%"PRIx64"\n",

+ tx_conf->tx_rs_thresh, tx_conf->txq_flags,

+ tx_conf->offloads);

}

}



@@ -2782,6 +2794,7 @@ struct igb_ring_desc_16_bytes {

tx_vlan_set(portid_t port_id, uint16_t vlan_id)

{

int vlan_offload;

+

if (port_id_is_invalid(port_id, ENABLED_WARN))

return;

if (vlan_id_is_invalid(vlan_id))

@@ -2795,6 +2808,7 @@ struct igb_ring_desc_16_bytes {



tx_vlan_reset(port_id);

ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;

+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;

ports[port_id].tx_vlan_id = vlan_id;

}



@@ -2802,6 +2816,7 @@ struct igb_ring_desc_16_bytes {

tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)

{

int vlan_offload;

+

if (port_id_is_invalid(port_id, ENABLED_WARN))

return;

if (vlan_id_is_invalid(vlan_id))

@@ -2817,6 +2832,7 @@ struct igb_ring_desc_16_bytes {



tx_vlan_reset(port_id);

ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;

+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;

ports[port_id].tx_vlan_id = vlan_id;

ports[port_id].tx_vlan_id_outer = vlan_id_outer;

}

@@ -2828,6 +2844,9 @@ struct igb_ring_desc_16_bytes {

return;

ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |

TESTPMD_TX_OFFLOAD_INSERT_QINQ);

+ ports[port_id].dev_conf.txmode.offloads &=

+ ~(DEV_TX_OFFLOAD_VLAN_INSERT |

+ DEV_TX_OFFLOAD_QINQ_INSERT);

ports[port_id].tx_vlan_id = 0;

ports[port_id].tx_vlan_id_outer = 0;

}

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c

index 77154ef..0087438 100644

--- a/app/test-pmd/testpmd.c

+++ b/app/test-pmd/testpmd.c

@@ -1498,6 +1498,9 @@ static int eth_event_callback(portid_t port_id,

}

if (port->need_reconfig_queues > 0) {

port->need_reconfig_queues = 0;

+ port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;

+ /* Apply Tx offloads configuration */

+ port->tx_conf.offloads = port->dev_conf.txmode.offloads;

FAST_FREE flag got lost during conversion.

Per-queue configuration flags are initialized with PMD-specific default values in rxtx_port_config:

rxtx_port_config(struct rte_port *port)
{
port->rx_conf = port->dev_info.default_rxconf;
port->tx_conf = port->dev_info.default_txconf;
...

but port->dev_conf.txmode is taken from global variable txmode, not from PMD. See in init_config():

/* Apply default Tx configuration for all ports */
port->dev_conf.txmode = tx_mode;
port->dev_conf.rxmode = rx_mode;

So the configuration will not be consistent, i.e. different flags in tx_queue_setup() and different in dev_configure().

If the intention is to keep defaults from PMD, let's fix this...
If not, please apply FAST_FREE flag as in example patch v3, e.g:

+ rte_eth_dev_info_get(portid, &dev_info);
+ if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+ local_port_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_MBUF_FAST_FREE;





/* setup tx queues */

for (qi = 0; qi < nb_txq; qi++) {

i
Shahaf Shuler
2017-12-12 12:52:49 UTC
Permalink
The mbuf ol_flags were taken directly from testpmd internal enumeration
leading to incorrect values.

addressing only insertion offload flags as the checksum flags by
the application design are only with csum forwarding.

Fixes: e9e23a617eb8 ("app/testpmd: add flowgen forwarding engine")
Cc: ***@tilera.com
Cc: ***@dpdk.org

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/flowgen.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/app/test-pmd/flowgen.c b/app/test-pmd/flowgen.c
index acf9af9..46478fc 100644
--- a/app/test-pmd/flowgen.c
+++ b/app/test-pmd/flowgen.c
@@ -123,7 +123,7 @@
struct ipv4_hdr *ip_hdr;
struct udp_hdr *udp_hdr;
uint16_t vlan_tci, vlan_tci_outer;
- uint16_t ol_flags;
+ uint64_t ol_flags;
uint16_t nb_rx;
uint16_t nb_tx;
uint16_t nb_pkt;
@@ -151,7 +151,13 @@
mbp = current_fwd_lcore()->mbp;
vlan_tci = ports[fs->tx_port].tx_vlan_id;
vlan_tci_outer = ports[fs->tx_port].tx_vlan_id_outer;
- ol_flags = ports[fs->tx_port].tx_ol_flags;
+
+ if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ ol_flags = PKT_TX_VLAN_PKT;
+ if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ ol_flags |= PKT_TX_QINQ_PKT;
+ if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ ol_flags |= PKT_TX_MACSEC;

for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {
pkt = rte_mbuf_raw_alloc(mbp);
--
1.8.3.1
Lu, Wenzhuo
2018-01-09 05:32:25 UTC
Permalink
Hi,
-----Original Message-----
Sent: Tuesday, December 12, 2017 8:53 PM
Subject: [dpdk-dev] [PATCH v2 05/10] app/testpmd: fix flowgen forwarding ol
flags
The mbuf ol_flags were taken directly from testpmd internal enumeration
leading to incorrect values.
addressing only insertion offload flags as the checksum flags by the
application design are only with csum forwarding.
Fixes: e9e23a617eb8 ("app/testpmd: add flowgen forwarding engine")
Acked-by: Wenzhuo Lu <***@intel.com>
Shahaf Shuler
2017-12-12 12:52:51 UTC
Permalink
This patch adds command line option to set hex value for the ports Tx
offloads flags.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/parameters.c | 17 +++++++++++++++--
app/test-pmd/testpmd.c | 4 ++++
app/test-pmd/testpmd.h | 2 ++
doc/guides/testpmd_app_ug/run_app.rst | 5 +++++
4 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 263651c..5888942 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -99,7 +99,7 @@
"--rss-ip | --rss-udp | "
"--rxpt= | --rxht= | --rxwt= | --rxfreet= | "
"--txpt= | --txht= | --txwt= | --txfreet= | "
- "--txrst= | --txqflags= ]\n",
+ "--txrst= | --txqflags= | --tx-offloads ]\n",
progname);
#ifdef RTE_LIBRTE_CMDLINE
printf(" --interactive: run in interactive mode.\n");
@@ -216,6 +216,7 @@
"disable print of designated event or all of them.\n");
printf(" --flow-isolate-all: "
"requests flow API isolated mode on all ports at initialization time.\n");
+ printf(" --tx-offloads=0xXXXXXXXX: hexadecimal bitmask of TX queue offloads\n");
}

#ifdef RTE_LIBRTE_CMDLINE
@@ -566,8 +567,9 @@
char **argvopt;
int opt_idx;
enum { TX, RX };
- /* Default Rx offloads for all ports. */
+ /* Default offloads for all ports. */
uint64_t rx_offloads = rx_mode.offloads;
+ uint64_t tx_offloads = tx_mode.offloads;

static struct option lgopts[] = {
{ "help", 0, 0, 0 },
@@ -645,6 +647,7 @@
{ "no-rmv-interrupt", 0, 0, 0 },
{ "print-event", 1, 0, 0 },
{ "mask-event", 1, 0, 0 },
+ { "tx-offloads", 1, 0, 0 },
{ 0, 0, 0, 0 },
};

@@ -1116,6 +1119,15 @@
rmv_interrupt = 0;
if (!strcmp(lgopts[opt_idx].name, "flow-isolate-all"))
flow_isolate_all = 1;
+ if (!strcmp(lgopts[opt_idx].name, "tx-offloads")) {
+ char *end = NULL;
+ n = strtoull(optarg, &end, 16);
+ if (n >= 0)
+ tx_offloads = (uint64_t)n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "tx-offloads must be >= 0\n");
+ }
if (!strcmp(lgopts[opt_idx].name, "print-event"))
if (parse_event_printing_config(optarg, 1)) {
rte_exit(EXIT_FAILURE,
@@ -1142,4 +1154,5 @@

/* Set offload configuration from command line parameters. */
rx_mode.offloads = rx_offloads;
+ tx_mode.offloads = tx_offloads;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 0087438..8065481 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -344,6 +344,8 @@ struct rte_eth_rxmode rx_mode = {
.ignore_offload_bitfield = 1,
};

+struct rte_eth_txmode tx_mode;
+
struct rte_fdir_conf fdir_conf = {
.mode = RTE_FDIR_MODE_NONE,
.pballoc = RTE_FDIR_PBALLOC_64K,
@@ -604,6 +606,8 @@ static int eth_event_callback(portid_t port_id,

RTE_ETH_FOREACH_DEV(pid) {
port = &ports[pid];
+ /* Apply default Tx configuration for all ports */
+ port->dev_conf.txmode = tx_mode;
rte_eth_dev_info_get(pid, &port->dev_info);

if (numa_support) {
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index c6baa10..3e63edf 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -395,6 +395,8 @@ struct queue_stats_mappings {
extern struct rte_port *ports;

extern struct rte_eth_rxmode rx_mode;
+extern struct rte_eth_txmode tx_mode;
+
extern uint64_t rss_hf;

extern queueid_t nb_rxq;
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index 4c0d2ce..fface6f 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -509,3 +509,8 @@ The commandline options are:
configured flow rules only (see flow command).

Ports that do not support this mode are automatically discarded.
+
+* ``--tx-offloads=0xXXXXXXXX``
+
+ Set the hexadecimal bitmask of TX queue offloads.
+ The default value is 0.
--
1.8.3.1
Shahaf Shuler
2017-12-12 12:52:50 UTC
Permalink
The tx_ol_flags field was used in order to control the different
Tx offloads set. After the conversion to the new Ethdev Tx offloads API
it is not needed anymore as the offloads configuration is stored in
ethdev structs.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 49 ++++++++++++++++----------------------------
app/test-pmd/config.c | 4 ----
app/test-pmd/csumonly.c | 40 ++++++++++++++++++------------------
app/test-pmd/flowgen.c | 8 +++++---
app/test-pmd/macfwd.c | 8 +++++---
app/test-pmd/macswap.c | 8 +++++---
app/test-pmd/testpmd.h | 22 +-------------------
app/test-pmd/txonly.c | 8 +++++---
8 files changed, 59 insertions(+), 88 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 5812583..8584821 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3653,45 +3653,45 @@ struct cmd_csum_result {
csum_show(int port_id)
{
struct rte_eth_dev_info dev_info;
- uint16_t ol_flags;
+ uint64_t tx_offloads;

- ol_flags = ports[port_id].tx_ol_flags;
+ tx_offloads = ports[port_id].dev_conf.txmode.offloads;
printf("Parse tunnel is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_PARSE_TUNNEL) ? "on" : "off");
+ (ports[port_id].parse_tunnel) ? "on" : "off");
printf("IP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) ? "hw" : "sw");
printf("UDP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw");
printf("TCP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw");
printf("SCTP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw");
printf("Outer-Ip checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ? "hw" : "sw");

/* display warnings if configuration is not supported by the NIC */
rte_eth_dev_info_get(port_id, &dev_info);
- if ((ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
printf("Warning: hardware IP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) == 0) {
printf("Warning: hardware UDP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) == 0) {
printf("Warning: hardware TCP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) == 0) {
printf("Warning: hardware SCTP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) == 0) {
printf("Warning: hardware outer IP checksum enabled but not "
"supported by port %d\n", port_id);
@@ -3705,7 +3705,6 @@ struct cmd_csum_result {
{
struct cmd_csum_result *res = parsed_result;
int hw = 0;
- uint16_t mask = 0;
uint64_t csum_offloads = 0;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
@@ -3723,28 +3722,21 @@ struct cmd_csum_result {
hw = 1;

if (!strcmp(res->proto, "ip")) {
- mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
- mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
- mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
- mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
- mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}

if (hw) {
- ports[res->port_id].tx_ol_flags |= mask;
ports[res->port_id].dev_conf.txmode.offloads |=
csum_offloads;
} else {
- ports[res->port_id].tx_ol_flags &= (~mask);
ports[res->port_id].dev_conf.txmode.offloads &=
(~csum_offloads);
}
@@ -3821,11 +3813,9 @@ struct cmd_csum_tunnel_result {
return;

if (!strcmp(res->onoff, "on"))
- ports[res->port_id].tx_ol_flags |=
- TESTPMD_TX_OFFLOAD_PARSE_TUNNEL;
+ ports[res->port_id].parse_tunnel = 1;
else
- ports[res->port_id].tx_ol_flags &=
- (~TESTPMD_TX_OFFLOAD_PARSE_TUNNEL);
+ ports[res->port_id].parse_tunnel = 0;

csum_show(res->port_id);
}
@@ -4025,12 +4015,11 @@ struct cmd_tunnel_tso_set_result {
*/
check_tunnel_tso_nic_support(res->port_id);

- if (!(ports[res->port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_PARSE_TUNNEL))
+ if (!ports[res->port_id].parse_tunnel)
printf("Warning: csum parse_tunnel must be set "
"so that tunneled packets are recognized\n");
- if (!(ports[res->port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM))
+ if (!(ports[res->port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM))
printf("Warning: csum set outer-ip must be set to hw "
"if outer L3 is IPv4; not necessary for IPv6\n");
}
@@ -13082,7 +13071,6 @@ struct cmd_macsec_offload_on_result {
return;
}

- ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
@@ -13172,7 +13160,6 @@ struct cmd_macsec_offload_off_result {
return;
}

- ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
ports[port_id].dev_conf.txmode.offloads &=
~DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index ee7d083..57d73aa 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2807,7 +2807,6 @@ struct igb_ring_desc_16_bytes {
}

tx_vlan_reset(port_id);
- ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
}
@@ -2831,7 +2830,6 @@ struct igb_ring_desc_16_bytes {
}

tx_vlan_reset(port_id);
- ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
ports[port_id].tx_vlan_id_outer = vlan_id_outer;
@@ -2842,8 +2840,6 @@ struct igb_ring_desc_16_bytes {
{
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
- ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
- TESTPMD_TX_OFFLOAD_INSERT_QINQ);
ports[port_id].dev_conf.txmode.offloads &=
~(DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT);
diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
index aa29f5f..dbd2f98 100644
--- a/app/test-pmd/csumonly.c
+++ b/app/test-pmd/csumonly.c
@@ -316,7 +316,7 @@ struct simple_gre_hdr {
* depending on the testpmd command line configuration */
static uint64_t
process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
- uint16_t testpmd_ol_flags)
+ uint64_t tx_offloads)
{
struct ipv4_hdr *ipv4_hdr = l3_hdr;
struct udp_hdr *udp_hdr;
@@ -347,7 +347,7 @@ struct simple_gre_hdr {
if (info->l4_proto == IPPROTO_TCP && tso_segsz) {
ol_flags |= PKT_TX_IP_CKSUM;
} else {
- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
+ if (tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM)
ol_flags |= PKT_TX_IP_CKSUM;
else
ipv4_hdr->hdr_checksum =
@@ -363,7 +363,7 @@ struct simple_gre_hdr {
/* do not recalculate udp cksum if it was 0 */
if (udp_hdr->dgram_cksum != 0) {
udp_hdr->dgram_cksum = 0;
- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
+ if (tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM)
ol_flags |= PKT_TX_UDP_CKSUM;
else {
udp_hdr->dgram_cksum =
@@ -376,7 +376,7 @@ struct simple_gre_hdr {
tcp_hdr->cksum = 0;
if (tso_segsz)
ol_flags |= PKT_TX_TCP_SEG;
- else if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
+ else if (tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM)
ol_flags |= PKT_TX_TCP_CKSUM;
else {
tcp_hdr->cksum =
@@ -390,7 +390,7 @@ struct simple_gre_hdr {
sctp_hdr->cksum = 0;
/* sctp payload must be a multiple of 4 to be
* offloaded */
- if ((testpmd_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
((ipv4_hdr->total_length & 0x3) == 0)) {
ol_flags |= PKT_TX_SCTP_CKSUM;
} else {
@@ -405,7 +405,7 @@ struct simple_gre_hdr {
/* Calculate the checksum of outer header */
static uint64_t
process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info,
- uint16_t testpmd_ol_flags, int tso_enabled)
+ uint64_t tx_offloads, int tso_enabled)
{
struct ipv4_hdr *ipv4_hdr = outer_l3_hdr;
struct ipv6_hdr *ipv6_hdr = outer_l3_hdr;
@@ -416,7 +416,7 @@ struct simple_gre_hdr {
ipv4_hdr->hdr_checksum = 0;
ol_flags |= PKT_TX_OUTER_IPV4;

- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
+ if (tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
ol_flags |= PKT_TX_OUTER_IP_CKSUM;
else
ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr);
@@ -646,7 +646,7 @@ struct simple_gre_hdr {
uint16_t nb_prep;
uint16_t i;
uint64_t rx_ol_flags, tx_ol_flags;
- uint16_t testpmd_ol_flags;
+ uint64_t tx_offloads;
uint32_t retry;
uint32_t rx_bad_ip_csum;
uint32_t rx_bad_l4_csum;
@@ -678,7 +678,7 @@ struct simple_gre_hdr {
gro_enable = gro_ports[fs->rx_port].enable;

txp = &ports[fs->tx_port];
- testpmd_ol_flags = txp->tx_ol_flags;
+ tx_offloads = txp->dev_conf.txmode.offloads;
memset(&info, 0, sizeof(info));
info.tso_segsz = txp->tso_segsz;
info.tunnel_tso_segsz = txp->tunnel_tso_segsz;
@@ -714,7 +714,7 @@ struct simple_gre_hdr {
l3_hdr = (char *)eth_hdr + info.l2_len;

/* check if it's a supported tunnel */
- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_PARSE_TUNNEL) {
+ if (txp->parse_tunnel) {
if (info.l4_proto == IPPROTO_UDP) {
struct udp_hdr *udp_hdr;

@@ -754,14 +754,14 @@ struct simple_gre_hdr {

/* process checksums of inner headers first */
tx_ol_flags |= process_inner_cksums(l3_hdr, &info,
- testpmd_ol_flags);
+ tx_offloads);

/* Then process outer headers if any. Note that the software
* checksum will be wrong if one of the inner checksums is
* processed in hardware. */
if (info.is_tunnel == 1) {
tx_ol_flags |= process_outer_cksums(outer_l3_hdr, &info,
- testpmd_ol_flags,
+ tx_offloads,
!!(tx_ol_flags & PKT_TX_TCP_SEG));
}

@@ -769,8 +769,8 @@ struct simple_gre_hdr {

if (info.is_tunnel == 1) {
if (info.tunnel_tso_segsz ||
- (testpmd_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ||
+ (tx_offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
(tx_ol_flags & PKT_TX_OUTER_IPV6)) {
m->outer_l2_len = info.outer_l2_len;
m->outer_l3_len = info.outer_l3_len;
@@ -832,17 +832,17 @@ struct simple_gre_hdr {
rte_be_to_cpu_16(info.outer_ethertype),
info.outer_l3_len);
/* dump tx packet info */
- if ((testpmd_ol_flags & (TESTPMD_TX_OFFLOAD_IP_CKSUM |
- TESTPMD_TX_OFFLOAD_UDP_CKSUM |
- TESTPMD_TX_OFFLOAD_TCP_CKSUM |
- TESTPMD_TX_OFFLOAD_SCTP_CKSUM)) ||
+ if ((tx_offloads & (DEV_TX_OFFLOAD_IPV4_CKSUM |
+ DEV_TX_OFFLOAD_UDP_CKSUM |
+ DEV_TX_OFFLOAD_TCP_CKSUM |
+ DEV_TX_OFFLOAD_SCTP_CKSUM)) ||
info.tso_segsz != 0)
printf("tx: m->l2_len=%d m->l3_len=%d "
"m->l4_len=%d\n",
m->l2_len, m->l3_len, m->l4_len);
if (info.is_tunnel == 1) {
- if ((testpmd_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ||
+ if ((tx_offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
(tx_ol_flags & PKT_TX_OUTER_IPV6))
printf("tx: m->outer_l2_len=%d "
"m->outer_l3_len=%d\n",
diff --git a/app/test-pmd/flowgen.c b/app/test-pmd/flowgen.c
index 46478fc..0531b5d 100644
--- a/app/test-pmd/flowgen.c
+++ b/app/test-pmd/flowgen.c
@@ -129,6 +129,7 @@
uint16_t nb_pkt;
uint16_t i;
uint32_t retry;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -152,11 +153,12 @@
vlan_tci = ports[fs->tx_port].tx_vlan_id;
vlan_tci_outer = ports[fs->tx_port].tx_vlan_id_outer;

- if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ tx_offloads = ports[fs->tx_port].dev_conf.txmode.offloads;
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;

for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {
diff --git a/app/test-pmd/macfwd.c b/app/test-pmd/macfwd.c
index f4a4bf2..56ee3cc 100644
--- a/app/test-pmd/macfwd.c
+++ b/app/test-pmd/macfwd.c
@@ -84,6 +84,7 @@
uint16_t nb_tx;
uint16_t i;
uint64_t ol_flags = 0;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -107,11 +108,12 @@
#endif
fs->rx_packets += nb_rx;
txp = &ports[fs->tx_port];
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ tx_offloads = txp->dev_conf.txmode.offloads;
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;
for (i = 0; i < nb_rx; i++) {
if (likely(i < nb_rx - 1))
diff --git a/app/test-pmd/macswap.c b/app/test-pmd/macswap.c
index 721865c..e2cc481 100644
--- a/app/test-pmd/macswap.c
+++ b/app/test-pmd/macswap.c
@@ -84,6 +84,7 @@
uint16_t i;
uint32_t retry;
uint64_t ol_flags = 0;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -107,11 +108,12 @@
#endif
fs->rx_packets += nb_rx;
txp = &ports[fs->tx_port];
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ tx_offloads = txp->dev_conf.txmode.offloads;
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;
for (i = 0; i < nb_rx; i++) {
if (likely(i < nb_rx - 1))
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index ab74d39..c6baa10 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -138,26 +138,6 @@ struct fwd_stream {
#endif
};

-/** Offload IP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_IP_CKSUM 0x0001
-/** Offload UDP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_UDP_CKSUM 0x0002
-/** Offload TCP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_TCP_CKSUM 0x0004
-/** Offload SCTP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_SCTP_CKSUM 0x0008
-/** Offload outer IP checksum in csum forward engine for recognized tunnels */
-#define TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM 0x0010
-/** Parse tunnel in csum forward engine. If set, dissect tunnel headers
- * of rx packets. If not set, treat inner headers as payload. */
-#define TESTPMD_TX_OFFLOAD_PARSE_TUNNEL 0x0020
-/** Insert VLAN header in forward engine */
-#define TESTPMD_TX_OFFLOAD_INSERT_VLAN 0x0040
-/** Insert double VLAN header in forward engine */
-#define TESTPMD_TX_OFFLOAD_INSERT_QINQ 0x0080
-/** Offload MACsec in forward engine */
-#define TESTPMD_TX_OFFLOAD_MACSEC 0x0100
-
/** Descriptor for a single flow. */
struct port_flow {
size_t size; /**< Allocated space including data[]. */
@@ -215,7 +195,7 @@ struct rte_port {
struct fwd_stream *rx_stream; /**< Port RX stream, if unique */
struct fwd_stream *tx_stream; /**< Port TX stream, if unique */
unsigned int socket_id; /**< For NUMA support */
- uint16_t tx_ol_flags;/**< TX Offload Flags (TESTPMD_TX_OFFLOAD...). */
+ uint16_t parse_tunnel:1; /**< Parse internal headers */
uint16_t tso_segsz; /**< Segmentation offload MSS for non-tunneled packets. */
uint16_t tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
uint16_t tx_vlan_id;/**< The tag ID */
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 309c738..418901c 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -193,6 +193,7 @@
uint32_t retry;
uint64_t ol_flags = 0;
uint8_t i;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -206,13 +207,14 @@

mbp = current_fwd_lcore()->mbp;
txp = &ports[fs->tx_port];
+ tx_offloads = txp->dev_conf.txmode.offloads;
vlan_tci = txp->tx_vlan_id;
vlan_tci_outer = txp->tx_vlan_id_outer;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;
for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {
pkt = rte_mbuf_raw_alloc(mbp);
--
1.8.3.1
Shahaf Shuler
2017-12-12 12:52:52 UTC
Permalink
Since testpmd is now using the new Ethdev offloads API and there is
a way configure each of the tx offloads from CLI or command line,
there is no need for the txqflags configuration anymore.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Nelio Laranjeiro <***@6wind.com>
---
app/test-pmd/cmdline.c | 69 ------------------------
app/test-pmd/config.c | 7 +--
app/test-pmd/parameters.c | 14 +----
app/test-pmd/testpmd.c | 8 ---
app/test-pmd/testpmd.h | 1 -
doc/guides/testpmd_app_ug/run_app.rst | 12 -----
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 11 ----
7 files changed, 3 insertions(+), 119 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 8584821..b4ef1d0 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3092,74 +3092,6 @@ struct cmd_set_txsplit_result {
},
};

-/* *** CONFIG TX QUEUE FLAGS *** */
-
-struct cmd_config_txqflags_result {
- cmdline_fixed_string_t port;
- cmdline_fixed_string_t config;
- cmdline_fixed_string_t all;
- cmdline_fixed_string_t what;
- int32_t hexvalue;
-};
-
-static void cmd_config_txqflags_parsed(void *parsed_result,
- __attribute__((unused)) struct cmdline *cl,
- __attribute__((unused)) void *data)
-{
- struct cmd_config_txqflags_result *res = parsed_result;
-
- if (!all_ports_stopped()) {
- printf("Please stop all ports first\n");
- return;
- }
-
- if (strcmp(res->what, "txqflags")) {
- printf("Unknown parameter\n");
- return;
- }
-
- if (res->hexvalue >= 0) {
- txq_flags = res->hexvalue;
- } else {
- printf("txqflags must be >= 0\n");
- return;
- }
-
- init_port_config();
-
- cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
-}
-
-cmdline_parse_token_string_t cmd_config_txqflags_port =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, port,
- "port");
-cmdline_parse_token_string_t cmd_config_txqflags_config =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, config,
- "config");
-cmdline_parse_token_string_t cmd_config_txqflags_all =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, all,
- "all");
-cmdline_parse_token_string_t cmd_config_txqflags_what =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, what,
- "txqflags");
-cmdline_parse_token_num_t cmd_config_txqflags_value =
- TOKEN_NUM_INITIALIZER(struct cmd_config_txqflags_result,
- hexvalue, INT32);
-
-cmdline_parse_inst_t cmd_config_txqflags = {
- .f = cmd_config_txqflags_parsed,
- .data = NULL,
- .help_str = "port config all txqflags <value>",
- .tokens = {
- (void *)&cmd_config_txqflags_port,
- (void *)&cmd_config_txqflags_config,
- (void *)&cmd_config_txqflags_all,
- (void *)&cmd_config_txqflags_what,
- (void *)&cmd_config_txqflags_value,
- NULL,
- },
-};
-
/* *** ADD/REMOVE ALL VLAN IDENTIFIERS TO/FROM A PORT VLAN RX FILTER *** */
struct cmd_rx_vlan_filter_all_result {
cmdline_fixed_string_t rx_vlan;
@@ -15709,7 +15641,6 @@ struct cmd_cmdfile_result {
(cmdline_parse_inst_t *)&cmd_config_rx_mode_flag,
(cmdline_parse_inst_t *)&cmd_config_rss,
(cmdline_parse_inst_t *)&cmd_config_rxtx_queue,
- (cmdline_parse_inst_t *)&cmd_config_txqflags,
(cmdline_parse_inst_t *)&cmd_config_rss_reta,
(cmdline_parse_inst_t *)&cmd_showport_reta,
(cmdline_parse_inst_t *)&cmd_config_burst,
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 57d73aa..41855ab 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -417,7 +417,6 @@ struct rss_type_info {
printf("\nTX writeback threshold: %hhu", qinfo.conf.tx_thresh.wthresh);
printf("\nTX RS threshold: %hu", qinfo.conf.tx_rs_thresh);
printf("\nTX free threshold: %hu", qinfo.conf.tx_free_thresh);
- printf("\nTX flags: %#x", qinfo.conf.txq_flags);
printf("\nTX deferred start: %s",
(qinfo.conf.tx_deferred_start != 0) ? "on" : "off");
printf("\nNumber of TXDs: %hu", qinfo.nb_desc);
@@ -1713,10 +1712,8 @@ struct igb_ring_desc_16_bytes {
tx_conf->tx_thresh.pthresh,
tx_conf->tx_thresh.hthresh,
tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""
- " - TXQ offloads=0x%"PRIx64"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags,
- tx_conf->offloads);
+ printf(" TX RS bit threshold=%d - TXQ offloads=0x%"PRIx64"\n",
+ tx_conf->tx_rs_thresh, tx_conf->offloads);
}
}

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 5888942..fa547df 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -99,7 +99,7 @@
"--rss-ip | --rss-udp | "
"--rxpt= | --rxht= | --rxwt= | --rxfreet= | "
"--txpt= | --txht= | --txwt= | --txfreet= | "
- "--txrst= | --txqflags= | --tx-offloads ]\n",
+ "--txrst= | --tx-offloads ]\n",
progname);
#ifdef RTE_LIBRTE_CMDLINE
printf(" --interactive: run in interactive mode.\n");
@@ -192,8 +192,6 @@
"(0 <= N <= value of txd).\n");
printf(" --txrst=N: set the transmit RS bit threshold of TX rings to N "
"(0 <= N <= value of txd).\n");
- printf(" --txqflags=0xXXXXXXXX: hexadecimal bitmask of TX queue flags "
- "(0 <= N <= 0x7FFFFFFF).\n");
printf(" --tx-queue-stats-mapping=(port,queue,mapping)[,(port,queue,mapping]: "
"tx queues statistics counters mapping "
"(0 <= mapping <= %d).\n", RTE_ETHDEV_QUEUE_STAT_CNTRS - 1);
@@ -632,7 +630,6 @@
{ "txwt", 1, 0, 0 },
{ "txfreet", 1, 0, 0 },
{ "txrst", 1, 0, 0 },
- { "txqflags", 1, 0, 0 },
{ "rxpt", 1, 0, 0 },
{ "rxht", 1, 0, 0 },
{ "rxwt", 1, 0, 0 },
@@ -1006,15 +1003,6 @@
else
rte_exit(EXIT_FAILURE, "txrst must be >= 0\n");
}
- if (!strcmp(lgopts[opt_idx].name, "txqflags")) {
- char *end = NULL;
- n = strtoul(optarg, &end, 16);
- if (n >= 0)
- txq_flags = (int32_t)n;
- else
- rte_exit(EXIT_FAILURE,
- "txqflags must be >= 0\n");
- }
if (!strcmp(lgopts[opt_idx].name, "rxd")) {
n = atoi(optarg);
if (n > 0) {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 8065481..91dcb31 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -259,11 +259,6 @@ struct fwd_engine * fwd_engines[] = {
int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;

/*
- * Configurable value of TX queue flags.
- */
-int32_t txq_flags = RTE_PMD_PARAM_UNSET;
-
-/*
* Receive Side Scaling (RSS) configuration.
*/
uint64_t rss_hf = ETH_RSS_IP; /* RSS IP by default. */
@@ -2084,9 +2079,6 @@ struct pmd_test_command {

if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
port->tx_conf.tx_free_thresh = tx_free_thresh;
-
- if (txq_flags != RTE_PMD_PARAM_UNSET)
- port->tx_conf.txq_flags = txq_flags;
}

void
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 3e63edf..c9af41c 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -409,7 +409,6 @@ struct queue_stats_mappings {
extern int8_t rx_drop_en;
extern int16_t tx_free_thresh;
extern int16_t tx_rs_thresh;
-extern int32_t txq_flags;

extern uint8_t dcb_config;
extern uint8_t dcb_test;
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index fface6f..be9a2cd 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -447,18 +447,6 @@ The commandline options are:
Set the transmit RS bit threshold of TX rings to N, where 0 <= N <= value of ``--txd``.
The default value is 0.

-* ``--txqflags=0xXXXXXXXX``
-
- Set the hexadecimal bitmask of TX queue flags, where 0 <= N <= 0x7FFFFFFF.
- The default value is 0.
-
- .. note::
-
- When using hardware offload functions such as vlan or checksum
- add ``txqflags=0`` to force the full-featured TX code path.
- In some PMDs this may already be the default.
-
-
* ``--rx-queue-stats-mapping=(port,queue,mapping)[,(port,queue,mapping)]``

Set the RX queues statistics counters mapping 0 <= mapping <= 15.
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 9789139..8e73519 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -354,8 +354,6 @@ The available information categories are:
also modify the default hierarchy or specify the new hierarchy through CLI for
implementing QoS scheduler. Requires ``CONFIG_RTE_LIBRTE_PMD_SOFTNIC=y`` ``CONFIG_RTE_LIBRTE_SCHED=y``.

-Note: TX timestamping is only available in the "Full Featured" TX path. To force ``testpmd`` into this mode set ``--txqflags=0``.
-
Example::

testpmd> set fwd rxonly
@@ -1681,15 +1679,6 @@ RX scatter mode is off by default.

The ``on`` option is equivalent to the ``--enable-scatter`` command-line option.

-port config - TX queue flags
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Set a hexadecimal bitmap of TX queue flags for all ports::
-
- testpmd> port config all txqflags value
-
-This command is equivalent to the ``--txqflags`` command-line option.
-
port config - RX Checksum
~~~~~~~~~~~~~~~~~~~~~~~~~
--
1.8.3.1
Shahaf Shuler
2017-12-12 12:52:53 UTC
Permalink
In the current design it was possible for offload to be set even though
the device is not supporting it. A warning message was printed instead.

This is a wrong behaviour, as application should set only the offloads
reported by the capabilities of the device.

This patch adds verification for the offloads being set and make sure
the offload configuration passed to the device always match its
capabilities.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 103 +++++++++++++++++++++++++++++++++-----------
app/test-pmd/config.c | 14 ++++++
app/test-pmd/testpmd.c | 25 +++++++++++
3 files changed, 117 insertions(+), 25 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index b4ef1d0..d1b8dab 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3638,6 +3638,7 @@ struct cmd_csum_result {
struct cmd_csum_result *res = parsed_result;
int hw = 0;
uint64_t csum_offloads = 0;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
printf("invalid port %d\n", res->port_id);
@@ -3648,21 +3649,53 @@ struct cmd_csum_result {
return;
}

+ rte_eth_dev_info_get(res->port_id, &dev_info);
if (!strcmp(res->mode, "set")) {

if (!strcmp(res->hwsw, "hw"))
hw = 1;

if (!strcmp(res->proto, "ip")) {
- csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_IPV4_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
+ } else {
+ printf("IP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "udp")) {
- csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_UDP_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+ } else {
+ printf("UDP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "tcp")) {
- csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_TCP_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ } else {
+ printf("TCP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "sctp")) {
- csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_SCTP_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
+ } else {
+ printf("SCTP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "outer-ip")) {
- csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
+ csum_offloads |=
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+ } else {
+ printf("Outer IP checksum offload is not "
+ "supported by port %u\n", res->port_id);
+ }
}

if (hw) {
@@ -3805,6 +3838,14 @@ struct cmd_tso_set_result {
if (!strcmp(res->mode, "set"))
ports[res->port_id].tso_segsz = res->tso_segsz;

+ rte_eth_dev_info_get(res->port_id, &dev_info);
+ if ((ports[res->port_id].tso_segsz != 0) &&
+ (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
+ printf("Error: TSO is not supported by port %d\n",
+ res->port_id);
+ return;
+ }
+
if (ports[res->port_id].tso_segsz == 0) {
ports[res->port_id].dev_conf.txmode.offloads &=
~DEV_TX_OFFLOAD_TCP_TSO;
@@ -3881,24 +3922,25 @@ struct cmd_tunnel_tso_set_result {
portid_t port_id;
};

-static void
+static struct rte_eth_dev_info
check_tunnel_tso_nic_support(portid_t port_id)
{
struct rte_eth_dev_info dev_info;

rte_eth_dev_info_get(port_id, &dev_info);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
- printf("Warning: TSO enabled but VXLAN TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: VXLAN TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO))
- printf("Warning: TSO enabled but GRE TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: GRE TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO))
- printf("Warning: TSO enabled but IPIP TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: IPIP TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO))
- printf("Warning: TSO enabled but GENEVE TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: GENEVE TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
+ return dev_info;
}

static void
@@ -3907,6 +3949,7 @@ struct cmd_tunnel_tso_set_result {
__attribute__((unused)) void *data)
{
struct cmd_tunnel_tso_set_result *res = parsed_result;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
@@ -3918,6 +3961,7 @@ struct cmd_tunnel_tso_set_result {
if (!strcmp(res->mode, "set"))
ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;

+ dev_info = check_tunnel_tso_nic_support(res->port_id);
if (ports[res->port_id].tunnel_tso_segsz == 0) {
ports[res->port_id].dev_conf.txmode.offloads &=
~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
@@ -3926,11 +3970,13 @@ struct cmd_tunnel_tso_set_result {
DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO for tunneled packets is disabled\n");
} else {
+ uint64_t tso_offloads = (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
+
ports[res->port_id].dev_conf.txmode.offloads |=
- (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
- DEV_TX_OFFLOAD_GRE_TNL_TSO |
- DEV_TX_OFFLOAD_IPIP_TNL_TSO |
- DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
+ (tso_offloads & dev_info.tx_offload_capa);
printf("TSO segment size for tunneled packets is %d\n",
ports[res->port_id].tunnel_tso_segsz);

@@ -3945,7 +3991,6 @@ struct cmd_tunnel_tso_set_result {
* is not necessary for IPv6 tunneled pkts because there's no
* checksum in IP header anymore.
*/
- check_tunnel_tso_nic_support(res->port_id);

if (!ports[res->port_id].parse_tunnel)
printf("Warning: csum parse_tunnel must be set "
@@ -12995,6 +13040,7 @@ struct cmd_macsec_offload_on_result {
portid_t port_id = res->port_id;
int en = (strcmp(res->en_on_off, "on") == 0) ? 1 : 0;
int rp = (strcmp(res->rp_on_off, "on") == 0) ? 1 : 0;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
@@ -13003,15 +13049,19 @@ struct cmd_macsec_offload_on_result {
return;
}

- ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
#ifdef RTE_LIBRTE_IXGBE_PMD
- ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
+ ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
#endif
+ }
RTE_SET_USED(en);
RTE_SET_USED(rp);

switch (ret) {
case 0:
+ ports[port_id].dev_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_MACSEC_INSERT;
cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
@@ -13083,6 +13133,7 @@ struct cmd_macsec_offload_off_result {
{
struct cmd_macsec_offload_off_result *res = parsed_result;
int ret = -ENOTSUP;
+ struct rte_eth_dev_info dev_info;
portid_t port_id = res->port_id;

if (port_id_is_invalid(port_id, ENABLED_WARN))
@@ -13092,14 +13143,16 @@ struct cmd_macsec_offload_off_result {
return;
}

- ports[port_id].dev_conf.txmode.offloads &=
- ~DEV_TX_OFFLOAD_MACSEC_INSERT;
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
#ifdef RTE_LIBRTE_IXGBE_PMD
- ret = rte_pmd_ixgbe_macsec_disable(port_id);
+ ret = rte_pmd_ixgbe_macsec_disable(port_id);
#endif
-
+ }
switch (ret) {
case 0:
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_MACSEC_INSERT;
cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 41855ab..33848d8 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2791,6 +2791,7 @@ struct igb_ring_desc_16_bytes {
tx_vlan_set(portid_t port_id, uint16_t vlan_id)
{
int vlan_offload;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
@@ -2802,6 +2803,12 @@ struct igb_ring_desc_16_bytes {
printf("Error, as QinQ has been enabled.\n");
return;
}
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) == 0) {
+ printf("Error: vlan insert is not supported by port %d\n",
+ port_id);
+ return;
+ }

tx_vlan_reset(port_id);
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
@@ -2812,6 +2819,7 @@ struct igb_ring_desc_16_bytes {
tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
{
int vlan_offload;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
@@ -2825,6 +2833,12 @@ struct igb_ring_desc_16_bytes {
printf("Error, as QinQ hasn't been enabled.\n");
return;
}
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) {
+ printf("Error: qinq insert not supported by port %d\n",
+ port_id);
+ return;
+ }

tx_vlan_reset(port_id);
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 91dcb31..3758410 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1440,6 +1440,28 @@ static int eth_event_callback(portid_t port_id,
return 1;
}

+static void
+check_port_offloads_conf(portid_t pi, struct rte_eth_conf *port_conf)
+{
+ struct rte_eth_dev_info dev_info;
+
+ rte_eth_dev_info_get(pi, &dev_info);
+ if ((dev_info.tx_offload_capa & port_conf->txmode.offloads) !=
+ port_conf->txmode.offloads) {
+ printf("Some Tx offloads are not supported "
+ "by port %d: requested 0x%lx supported 0x%lx\n",
+ pi, port_conf->txmode.offloads,
+ dev_info.tx_offload_capa);
+ }
+ if ((dev_info.rx_offload_capa & port_conf->rxmode.offloads) !=
+ port_conf->rxmode.offloads) {
+ printf("Some Rx offloads are not supported "
+ "by port %d: requested 0x%lx supported 0x%lx\n",
+ pi, port_conf->rxmode.offloads,
+ dev_info.rx_offload_capa);
+ }
+}
+
int
start_port(portid_t pid)
{
@@ -1481,6 +1503,8 @@ static int eth_event_callback(portid_t port_id,

printf("Configuring Port %d (socket %u)\n", pi,
port->socket_id);
+ /* Check for unsupported offloads */
+ check_port_offloads_conf(pi, &port->dev_conf);
/* configure port */
diag = rte_eth_dev_configure(pi, nb_rxq, nb_txq,
&(port->dev_conf));
@@ -2263,6 +2287,7 @@ uint8_t port_is_bonding_slave(portid_t slave_pid)
* Set the numbers of RX & TX queues to 0, so
* the RX & TX queues will not be setup.
*/
+ check_port_offloads_conf(pid, &port_conf);
rte_eth_dev_configure(pid, 0, 0, &port_conf);

rte_eth_dev_info_get(pid, &rte_port->dev_info);
--
1.8.3.1
Shahaf Shuler
2017-12-12 12:52:54 UTC
Permalink
On ethdev there is an API to configure VLAN offloads after the port
was started and without reconfiguration of the port or queues.

In the current design of the application, when the Rx offloads are
changed (through "port config all" CLI command) the port configuration
is overwritten, therefore the configuration made for the VLAN is lost.

This patch is to address the issue by a configuration of each port Rx
offloads separately instead of using the global Rx config.

Fixes: 6dbb2b336586 ("app/testpmd: convert to new Ethdev Rx offloads API")

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 217 +++++++++++++++++++++++---------------------
app/test-pmd/config.c | 27 ++++--
app/test-pmd/testpmd.c | 2 +-
3 files changed, 135 insertions(+), 111 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index d1b8dab..00a229a 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1577,34 +1577,38 @@ struct cmd_config_max_pkt_len_result {
__attribute__((unused)) void *data)
{
struct cmd_config_max_pkt_len_result *res = parsed_result;
- uint64_t rx_offloads = rx_mode.offloads;
+ portid_t pid;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
return;
}

- if (!strcmp(res->name, "max-pkt-len")) {
- if (res->value < ETHER_MIN_LEN) {
- printf("max-pkt-len can not be less than %d\n",
- ETHER_MIN_LEN);
+ RTE_ETH_FOREACH_DEV(pid) {
+ struct rte_port *port = &ports[pid];
+ uint64_t rx_offloads = port->dev_conf.rxmode.offloads;
+
+ if (!strcmp(res->name, "max-pkt-len")) {
+ if (res->value < ETHER_MIN_LEN) {
+ printf("max-pkt-len can not be less than %d\n",
+ ETHER_MIN_LEN);
+ return;
+ }
+ if (res->value == port->dev_conf.rxmode.max_rx_pkt_len)
+ return;
+
+ port->dev_conf.rxmode.max_rx_pkt_len = res->value;
+ if (res->value > ETHER_MAX_LEN)
+ rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+ else
+ rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
+ port->dev_conf.rxmode.offloads = rx_offloads;
+ } else {
+ printf("Unknown parameter\n");
return;
}
- if (res->value == rx_mode.max_rx_pkt_len)
- return;
-
- rx_mode.max_rx_pkt_len = res->value;
- if (res->value > ETHER_MAX_LEN)
- rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
- else
- rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
- } else {
- printf("Unknown parameter\n");
- return;
}

- rx_mode.offloads = rx_offloads;
-
init_port_config();

cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
@@ -1706,103 +1710,108 @@ struct cmd_config_rx_mode_flag {
__attribute__((unused)) void *data)
{
struct cmd_config_rx_mode_flag *res = parsed_result;
- uint64_t rx_offloads = rx_mode.offloads;
+ portid_t pid;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
return;
}

- if (!strcmp(res->name, "crc-strip")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "scatter")) {
- if (!strcmp(res->value, "on")) {
- rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
- } else if (!strcmp(res->value, "off")) {
- rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ RTE_ETH_FOREACH_DEV(pid) {
+ struct rte_port *port;
+ uint64_t rx_offloads;
+
+ port = &ports[pid];
+ rx_offloads = port->dev_conf.rxmode.offloads;
+ if (!strcmp(res->name, "crc-strip")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "scatter")) {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ } else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "rx-cksum")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "rx-timestamp")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan")) {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
+ } else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-filter")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-strip")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-extend")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "drop-en")) {
+ if (!strcmp(res->value, "on"))
+ rx_drop_en = 1;
+ else if (!strcmp(res->value, "off"))
+ rx_drop_en = 0;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
} else {
printf("Unknown parameter\n");
return;
}
- } else if (!strcmp(res->name, "rx-cksum")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "rx-timestamp")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan")) {
- if (!strcmp(res->value, "on")) {
- rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
- DEV_RX_OFFLOAD_VLAN_STRIP);
- }
- else if (!strcmp(res->value, "off")) {
- rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
- DEV_RX_OFFLOAD_VLAN_STRIP);
- }
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan-filter")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan-strip")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan-extend")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "drop-en")) {
- if (!strcmp(res->value, "on"))
- rx_drop_en = 1;
- else if (!strcmp(res->value, "off"))
- rx_drop_en = 0;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else {
- printf("Unknown parameter\n");
- return;
+ port->dev_conf.rxmode.offloads = rx_offloads;
}
- rx_mode.offloads = rx_offloads;

init_port_config();

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 33848d8..3bb99ff 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2664,21 +2664,26 @@ struct igb_ring_desc_16_bytes {
{
int diag;
int vlan_offload;
+ uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

vlan_offload = rte_eth_dev_get_vlan_offload(port_id);

- if (on)
+ if (on) {
vlan_offload |= ETH_VLAN_EXTEND_OFFLOAD;
- else
+ port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
+ } else {
vlan_offload &= ~ETH_VLAN_EXTEND_OFFLOAD;
+ port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
+ }

diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
if (diag < 0)
printf("rx_vlan_extend_set(port_pi=%d, on=%d) failed "
"diag=%d\n", port_id, on, diag);
+ ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
}

void
@@ -2686,21 +2691,26 @@ struct igb_ring_desc_16_bytes {
{
int diag;
int vlan_offload;
+ uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

vlan_offload = rte_eth_dev_get_vlan_offload(port_id);

- if (on)
+ if (on) {
vlan_offload |= ETH_VLAN_STRIP_OFFLOAD;
- else
+ port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+ } else {
vlan_offload &= ~ETH_VLAN_STRIP_OFFLOAD;
+ port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+ }

diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
if (diag < 0)
printf("rx_vlan_strip_set(port_pi=%d, on=%d) failed "
"diag=%d\n", port_id, on, diag);
+ ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
}

void
@@ -2722,21 +2732,26 @@ struct igb_ring_desc_16_bytes {
{
int diag;
int vlan_offload;
+ uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

vlan_offload = rte_eth_dev_get_vlan_offload(port_id);

- if (on)
+ if (on) {
vlan_offload |= ETH_VLAN_FILTER_OFFLOAD;
- else
+ port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
+ } else {
vlan_offload &= ~ETH_VLAN_FILTER_OFFLOAD;
+ port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
+ }

diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
if (diag < 0)
printf("rx_vlan_filter_set(port_pi=%d, on=%d) failed "
"diag=%d\n", port_id, on, diag);
+ ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
}

int
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 3758410..48021bf 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -603,6 +603,7 @@ static int eth_event_callback(portid_t port_id,
port = &ports[pid];
/* Apply default Tx configuration for all ports */
port->dev_conf.txmode = tx_mode;
+ port->dev_conf.rxmode = rx_mode;
rte_eth_dev_info_get(pid, &port->dev_info);

if (numa_support) {
@@ -2113,7 +2114,6 @@ struct pmd_test_command {

RTE_ETH_FOREACH_DEV(pid) {
port = &ports[pid];
- port->dev_conf.rxmode = rx_mode;
port->dev_conf.fdir_conf = fdir_conf;
if (nb_rxq > 1) {
port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
--
1.8.3.1
Shahaf Shuler
2017-12-26 09:44:14 UTC
Permalink
This series is to convert testpmd application to the new offloads API [1].

on v3:
- Remove warn prints on bad offloads configuration from application.

on v2:
- Splited the patchset to multiple patches to help with the review.
- Removed wrong comments.
- Removed redundent parenthesis.
- Fixed port print parameters.
- Introduced a new method to check if single port is stopped.
- Cleanup for internal Tx offloads flags.

[1] http://dpdk.org/ml/archives/dev/2017-October/077329.html

Shahaf Shuler (10):
app/testpmd: fix port configuration print
app/testpmd: convert to new Ethdev Rx offloads API
app/testpmd: support check of single port stop
app/testpmd: convert to new Ethdev Tx offloads API
app/testpmd: fix flowgen forwarding ol flags
app/testpmd: cleanup internal Tx offloads flags field
app/testpmd: add command line option for Tx offloads
app/testpmd: remove txqflags
app/testpmd: enforce offloads caps
app/testpmd: fix on the flight VLAN configuration

app/test-pmd/cmdline.c | 501 +++++++++++++----------
app/test-pmd/config.c | 177 +++++---
app/test-pmd/csumonly.c | 40 +-
app/test-pmd/flowgen.c | 12 +-
app/test-pmd/macfwd.c | 8 +-
app/test-pmd/macswap.c | 8 +-
app/test-pmd/parameters.c | 59 +--
app/test-pmd/testpmd.c | 52 +--
app/test-pmd/testpmd.h | 26 +-
app/test-pmd/txonly.c | 8 +-
doc/guides/testpmd_app_ug/run_app.rst | 17 +-
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 11 -
12 files changed, 516 insertions(+), 403 deletions(-)
--
2.12.0
Shahaf Shuler
2017-12-26 09:44:15 UTC
Permalink
The print of the port configuration was only according to configuration
of the first port.

Fixes: f2c5125a686a ("app/testpmd: use default Rx/Tx port configuration")
Cc: ***@intel.com
Cc: ***@dpdk.org

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/config.c | 48 +++++++++++++++++++++++++++++-----------------
1 file changed, 30 insertions(+), 18 deletions(-)

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 86ca3aaef..387fefbaa 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1656,33 +1656,45 @@ fwd_lcores_config_display(void)
void
rxtx_config_display(void)
{
- printf(" %s packet forwarding%s - CRC stripping %s - "
- "packets/burst=%d\n", cur_fwd_eng->fwd_mode_name,
+ portid_t pid;
+
+ printf(" %s packet forwarding%s packets/burst=%d\n",
+ cur_fwd_eng->fwd_mode_name,
retry_enabled == 0 ? "" : " with retry",
- rx_mode.hw_strip_crc ? "enabled" : "disabled",
nb_pkt_per_burst);

if (cur_fwd_eng == &tx_only_engine || cur_fwd_eng == &flow_gen_engine)
printf(" packet len=%u - nb packet segments=%d\n",
(unsigned)tx_pkt_length, (int) tx_pkt_nb_segs);

- struct rte_eth_rxconf *rx_conf = &ports[0].rx_conf;
- struct rte_eth_txconf *tx_conf = &ports[0].tx_conf;
-
printf(" nb forwarding cores=%d - nb forwarding ports=%d\n",
nb_fwd_lcores, nb_fwd_ports);
- printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n",
- nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
- printf(" RX threshold registers: pthresh=%d hthresh=%d wthresh=%d\n",
- rx_conf->rx_thresh.pthresh, rx_conf->rx_thresh.hthresh,
- rx_conf->rx_thresh.wthresh);
- printf(" TX queues=%d - TX desc=%d - TX free threshold=%d\n",
- nb_txq, nb_txd, tx_conf->tx_free_thresh);
- printf(" TX threshold registers: pthresh=%d hthresh=%d wthresh=%d\n",
- tx_conf->tx_thresh.pthresh, tx_conf->tx_thresh.hthresh,
- tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+
+ RTE_ETH_FOREACH_DEV(pid) {
+ struct rte_eth_rxconf *rx_conf = &ports[pid].rx_conf;
+ struct rte_eth_txconf *tx_conf = &ports[pid].tx_conf;
+
+ printf(" port %d:\n", (unsigned int)pid);
+ printf(" CRC stripping %s\n",
+ ports[pid].dev_conf.rxmode.hw_strip_crc ?
+ "enabled" : "disabled");
+ printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n",
+ nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
+ printf(" RX threshold registers: pthresh=%d hthresh=%d "
+ " wthresh=%d\n",
+ rx_conf->rx_thresh.pthresh,
+ rx_conf->rx_thresh.hthresh,
+ rx_conf->rx_thresh.wthresh);
+ printf(" TX queues=%d - TX desc=%d - TX free threshold=%d\n",
+ nb_txq, nb_txd, tx_conf->tx_free_thresh);
+ printf(" TX threshold registers: pthresh=%d hthresh=%d "
+ " wthresh=%d\n",
+ tx_conf->tx_thresh.pthresh,
+ tx_conf->tx_thresh.hthresh,
+ tx_conf->tx_thresh.wthresh);
+ printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
+ tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ }
}

void
--
2.12.0
Lu, Wenzhuo
2018-01-05 03:33:53 UTC
Permalink
Hi,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 01/10] app/testpmd: fix port configuration
print
The print of the port configuration was only according to configuration of
the first port.
Fixes: f2c5125a686a ("app/testpmd: use default Rx/Tx port configuration")
Acked-by: Wenzhuo Lu <***@intel.com>
Shahaf Shuler
2017-12-26 09:44:16 UTC
Permalink
Ethdev Rx offloads API has changed since:

commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")

Convert the application to use the new API. The is no functionality
changes rather simple conversion of the flags.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 51 +++++++++++++++++++++++-------------------
app/test-pmd/config.c | 36 +++++++++++++++++++----------
app/test-pmd/parameters.c | 32 +++++++++++++-------------
app/test-pmd/testpmd.c | 19 +++++++---------
4 files changed, 77 insertions(+), 61 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d96301..d8c73a9b1 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1577,6 +1577,7 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_max_pkt_len_result *res = parsed_result;
+ uint64_t rx_offloads = rx_mode.offloads;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@@ -1594,14 +1595,16 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,

rx_mode.max_rx_pkt_len = res->value;
if (res->value > ETHER_MAX_LEN)
- rx_mode.jumbo_frame = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
else
- rx_mode.jumbo_frame = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
} else {
printf("Unknown parameter\n");
return;
}

+ rx_mode.offloads = rx_offloads;
+
init_port_config();

cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
@@ -1703,6 +1706,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_rx_mode_flag *res = parsed_result;
+ uint64_t rx_offloads = rx_mode.offloads;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@@ -1711,48 +1715,48 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,

if (!strcmp(res->name, "crc-strip")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_strip_crc = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "scatter")) {
- if (!strcmp(res->value, "on"))
- rx_mode.enable_scatter = 1;
- else if (!strcmp(res->value, "off"))
- rx_mode.enable_scatter = 0;
- else {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ } else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "rx-cksum")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_ip_checksum = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_ip_checksum = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "rx-timestamp")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_timestamp = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_timestamp = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan")) {
if (!strcmp(res->value, "on")) {
- rx_mode.hw_vlan_filter = 1;
- rx_mode.hw_vlan_strip = 1;
+ rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
}
else if (!strcmp(res->value, "off")) {
- rx_mode.hw_vlan_filter = 0;
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
}
else {
printf("Unknown parameter\n");
@@ -1760,27 +1764,27 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
}
} else if (!strcmp(res->name, "hw-vlan-filter")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_filter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_filter = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan-strip")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_strip = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan-extend")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_extend = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_extend = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
else {
printf("Unknown parameter\n");
return;
@@ -1798,6 +1802,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
printf("Unknown parameter\n");
return;
}
+ rx_mode.offloads = rx_offloads;

init_port_config();

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 387fefbaa..3bc99be76 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -540,14 +540,12 @@ port_infos_display(portid_t port_id)
void
port_offload_cap_display(portid_t port_id)
{
- struct rte_eth_dev *dev;
struct rte_eth_dev_info dev_info;
static const char *info_border = "************";

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

- dev = &rte_eth_devices[port_id];
rte_eth_dev_info_get(port_id, &dev_info);

printf("\n%s Port %d supported offload features: %s\n",
@@ -555,7 +553,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_VLAN_STRIP) {
printf("VLAN stripped: ");
- if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_VLAN_STRIP)
printf("on\n");
else
printf("off\n");
@@ -563,7 +562,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_QINQ_STRIP) {
printf("Double VLANs stripped: ");
- if (dev->data->dev_conf.rxmode.hw_vlan_extend)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_VLAN_EXTEND)
printf("on\n");
else
printf("off\n");
@@ -571,7 +571,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
printf("RX IPv4 checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -579,7 +580,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM) {
printf("RX UDP checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_UDP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -587,18 +589,26 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
printf("RX TCP checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TCP_CKSUM)
printf("on\n");
else
printf("off\n");
}

- if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
- printf("RX Outer IPv4 checksum: on");
+ if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) {
+ printf("RX Outer IPv4 checksum: ");
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
+ printf("on\n");
+ else
+ printf("off\n");
+ }

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO) {
printf("Large receive offload: ");
- if (dev->data->dev_conf.rxmode.enable_lro)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TCP_LRO)
printf("on\n");
else
printf("off\n");
@@ -615,7 +625,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TIMESTAMP) {
printf("HW timestamp: ");
- if (dev->data->dev_conf.rxmode.hw_timestamp)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TIMESTAMP)
printf("on\n");
else
printf("off\n");
@@ -1676,7 +1687,8 @@ rxtx_config_display(void)

printf(" port %d:\n", (unsigned int)pid);
printf(" CRC stripping %s\n",
- ports[pid].dev_conf.rxmode.hw_strip_crc ?
+ (ports[pid].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_CRC_STRIP) ?
"enabled" : "disabled");
printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n",
nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 84e7a63ef..263651cba 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -566,6 +566,8 @@ launch_args_parse(int argc, char** argv)
char **argvopt;
int opt_idx;
enum { TX, RX };
+ /* Default Rx offloads for all ports. */
+ uint64_t rx_offloads = rx_mode.offloads;

static struct option lgopts[] = {
{ "help", 0, 0, 0 },
@@ -804,7 +806,8 @@ launch_args_parse(int argc, char** argv)
if (n >= ETHER_MIN_LEN) {
rx_mode.max_rx_pkt_len = (uint32_t) n;
if (n > ETHER_MAX_LEN)
- rx_mode.jumbo_frame = 1;
+ rx_offloads |=
+ DEV_RX_OFFLOAD_JUMBO_FRAME;
} else
rte_exit(EXIT_FAILURE,
"Invalid max-pkt-len=%d - should be > %d\n",
@@ -897,34 +900,30 @@ launch_args_parse(int argc, char** argv)
}
#endif
if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
- rx_mode.enable_lro = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
- rx_mode.enable_scatter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum"))
- rx_mode.hw_ip_checksum = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
if (!strcmp(lgopts[opt_idx].name,
"enable-rx-timestamp"))
- rx_mode.hw_timestamp = 1;
-
- if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) {
- rx_mode.hw_vlan_filter = 0;
- rx_mode.hw_vlan_strip = 0;
- rx_mode.hw_vlan_extend = 0;
- }
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
+ if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-filter"))
- rx_mode.hw_vlan_filter = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-strip"))
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-extend"))
- rx_mode.hw_vlan_extend = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;

if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))
rx_drop_en = 1;
@@ -1140,4 +1139,7 @@ launch_args_parse(int argc, char** argv)
break;
}
}
+
+ /* Set offload configuration from command line parameters. */
+ rx_mode.offloads = rx_offloads;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index c3ab44849..6785b095f 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1;
*/
struct rte_eth_rxmode rx_mode = {
.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */
- .split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled. */
- .hw_ip_checksum = 0, /**< IP checksum offload disabled. */
- .hw_vlan_filter = 1, /**< VLAN filtering enabled. */
- .hw_vlan_strip = 1, /**< VLAN strip enabled. */
- .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */
- .hw_strip_crc = 1, /**< CRC stripping by hardware enabled. */
- .hw_timestamp = 0, /**< HW timestamp enabled. */
+ .offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP |
+ DEV_RX_OFFLOAD_CRC_STRIP),
+ .ignore_offload_bitfield = 1,
};

struct rte_fdir_conf fdir_conf = {
@@ -1521,6 +1516,8 @@ start_port(portid_t pid)
port->need_reconfig_queues = 1;
return -1;
}
+ /* Apply Rx offloads configuration */
+ port->rx_conf.offloads = port->dev_conf.rxmode.offloads;
/* setup rx queues */
for (qi = 0; qi < nb_rxq; qi++) {
if ((numa_support) &&
@@ -2252,7 +2249,7 @@ init_port_dcb_config(portid_t pid,
retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
if (retval < 0)
return retval;
- port_conf.rxmode.hw_vlan_filter = 1;
+ port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;

/**
* Write the configuration into the device.
@@ -2301,7 +2298,7 @@ init_port_dcb_config(portid_t pid,

rxtx_port_config(rte_port);
/* VLAN filter */
- rte_port->dev_conf.rxmode.hw_vlan_filter = 1;
+ rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
for (i = 0; i < RTE_DIM(vlan_tags); i++)
rx_vft_set(pid, vlan_tags[i], 1);
--
2.12.0
Lu, Wenzhuo
2018-01-09 03:05:41 UTC
Permalink
Hi,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 02/10] app/testpmd: convert to new Ethdev
Rx offloads API
commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
Convert the application to use the new API. The is no functionality changes
rather simple conversion of the flags.
Acked-by: Wenzhuo Lu <***@intel.com>
Patil, Harish
2018-01-19 19:30:05 UTC
Permalink
-----Original Message-----
From: dev <dev-***@dpdk.org> on behalf of Shahaf Shuler
<***@mellanox.com>
Date: Tuesday, December 26, 2017 at 1:44 AM
To: "***@intel.com" <***@intel.com>,
"***@intel.com" <***@intel.com>
Cc: "***@dpdk.org" <***@dpdk.org>
Subject: [dpdk-dev] [PATCH v3 02/10] app/testpmd: convert to new Ethdev
Rx offloads API
Post by Shahaf Shuler
commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
Convert the application to use the new API. The is no functionality
changes rather simple conversion of the flags.
---
app/test-pmd/cmdline.c | 51 +++++++++++++++++++++++-------------------
app/test-pmd/config.c | 36 +++++++++++++++++++----------
app/test-pmd/parameters.c | 32 +++++++++++++-------------
app/test-pmd/testpmd.c | 19 +++++++---------
4 files changed, 77 insertions(+), 61 deletions(-)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d96301..d8c73a9b1 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1577,6 +1577,7 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_max_pkt_len_result *res = parsed_result;
+ uint64_t rx_offloads = rx_mode.offloads;
if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@@ -1594,14 +1595,16 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
rx_mode.max_rx_pkt_len = res->value;
if (res->value > ETHER_MAX_LEN)
- rx_mode.jumbo_frame = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
else
- rx_mode.jumbo_frame = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
} else {
printf("Unknown parameter\n");
return;
}
+ rx_mode.offloads = rx_offloads;
+
init_port_config();
cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
@@ -1703,6 +1706,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_rx_mode_flag *res = parsed_result;
+ uint64_t rx_offloads = rx_mode.offloads;
if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@@ -1711,48 +1715,48 @@ cmd_config_rx_mode_flag_parsed(void
*parsed_result,
if (!strcmp(res->name, "crc-strip")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_strip_crc = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "scatter")) {
- if (!strcmp(res->value, "on"))
- rx_mode.enable_scatter = 1;
- else if (!strcmp(res->value, "off"))
- rx_mode.enable_scatter = 0;
- else {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ } else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "rx-cksum")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_ip_checksum = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_ip_checksum = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "rx-timestamp")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_timestamp = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_timestamp = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan")) {
if (!strcmp(res->value, "on")) {
- rx_mode.hw_vlan_filter = 1;
- rx_mode.hw_vlan_strip = 1;
+ rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
}
else if (!strcmp(res->value, "off")) {
- rx_mode.hw_vlan_filter = 0;
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
}
else {
printf("Unknown parameter\n");
@@ -1760,27 +1764,27 @@ cmd_config_rx_mode_flag_parsed(void
*parsed_result,
}
} else if (!strcmp(res->name, "hw-vlan-filter")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_filter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_filter = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan-strip")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_strip = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan-extend")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_extend = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_extend = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
else {
printf("Unknown parameter\n");
return;
@@ -1798,6 +1802,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
printf("Unknown parameter\n");
return;
}
+ rx_mode.offloads = rx_offloads;
init_port_config();
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 387fefbaa..3bc99be76 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -540,14 +540,12 @@ port_infos_display(portid_t port_id)
void
port_offload_cap_display(portid_t port_id)
{
- struct rte_eth_dev *dev;
struct rte_eth_dev_info dev_info;
static const char *info_border = "************";
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
- dev = &rte_eth_devices[port_id];
rte_eth_dev_info_get(port_id, &dev_info);
printf("\n%s Port %d supported offload features: %s\n",
@@ -555,7 +553,8 @@ port_offload_cap_display(portid_t port_id)
if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_VLAN_STRIP) {
printf("VLAN stripped: ");
- if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_VLAN_STRIP)
printf("on\n");
else
printf("off\n");
@@ -563,7 +562,8 @@ port_offload_cap_display(portid_t port_id)
if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_QINQ_STRIP) {
printf("Double VLANs stripped: ");
- if (dev->data->dev_conf.rxmode.hw_vlan_extend)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_VLAN_EXTEND)
printf("on\n");
else
printf("off\n");
@@ -571,7 +571,8 @@ port_offload_cap_display(portid_t port_id)
if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
printf("RX IPv4 checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -579,7 +580,8 @@ port_offload_cap_display(portid_t port_id)
if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM) {
printf("RX UDP checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_UDP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -587,18 +589,26 @@ port_offload_cap_display(portid_t port_id)
if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
printf("RX TCP checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TCP_CKSUM)
printf("on\n");
else
printf("off\n");
}
- if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
- printf("RX Outer IPv4 checksum: on");
+ if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) {
+ printf("RX Outer IPv4 checksum: ");
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
+ printf("on\n");
+ else
+ printf("off\n");
+ }
if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO) {
printf("Large receive offload: ");
- if (dev->data->dev_conf.rxmode.enable_lro)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TCP_LRO)
printf("on\n");
else
printf("off\n");
@@ -615,7 +625,8 @@ port_offload_cap_display(portid_t port_id)
if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TIMESTAMP) {
printf("HW timestamp: ");
- if (dev->data->dev_conf.rxmode.hw_timestamp)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TIMESTAMP)
printf("on\n");
else
printf("off\n");
@@ -1676,7 +1687,8 @@ rxtx_config_display(void)
printf(" port %d:\n", (unsigned int)pid);
printf(" CRC stripping %s\n",
- ports[pid].dev_conf.rxmode.hw_strip_crc ?
+ (ports[pid].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_CRC_STRIP) ?
"enabled" : "disabled");
printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n",
nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 84e7a63ef..263651cba 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -566,6 +566,8 @@ launch_args_parse(int argc, char** argv)
char **argvopt;
int opt_idx;
enum { TX, RX };
+ /* Default Rx offloads for all ports. */
+ uint64_t rx_offloads = rx_mode.offloads;
static struct option lgopts[] = {
{ "help", 0, 0, 0 },
@@ -804,7 +806,8 @@ launch_args_parse(int argc, char** argv)
if (n >= ETHER_MIN_LEN) {
rx_mode.max_rx_pkt_len = (uint32_t) n;
if (n > ETHER_MAX_LEN)
- rx_mode.jumbo_frame = 1;
+ rx_offloads |=
+ DEV_RX_OFFLOAD_JUMBO_FRAME;
} else
rte_exit(EXIT_FAILURE,
"Invalid max-pkt-len=%d - should be > %d\n",
@@ -897,34 +900,30 @@ launch_args_parse(int argc, char** argv)
}
#endif
if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
- rx_mode.enable_lro = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
- rx_mode.enable_scatter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum"))
- rx_mode.hw_ip_checksum = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
if (!strcmp(lgopts[opt_idx].name,
"enable-rx-timestamp"))
- rx_mode.hw_timestamp = 1;
-
- if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) {
- rx_mode.hw_vlan_filter = 0;
- rx_mode.hw_vlan_strip = 0;
- rx_mode.hw_vlan_extend = 0;
- }
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
+ if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN;
if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-filter"))
- rx_mode.hw_vlan_filter = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-strip"))
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-extend"))
- rx_mode.hw_vlan_extend = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))
rx_drop_en = 1;
@@ -1140,4 +1139,7 @@ launch_args_parse(int argc, char** argv)
break;
}
}
+
+ /* Set offload configuration from command line parameters. */
+ rx_mode.offloads = rx_offloads;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index c3ab44849..6785b095f 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1;
*/
struct rte_eth_rxmode rx_mode = {
.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */
- .split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled. */
- .hw_ip_checksum = 0, /**< IP checksum offload disabled. */
- .hw_vlan_filter = 1, /**< VLAN filtering enabled. */
- .hw_vlan_strip = 1, /**< VLAN strip enabled. */
- .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */
- .hw_strip_crc = 1, /**< CRC stripping by hardware enabled. */
- .hw_timestamp = 0, /**< HW timestamp enabled. */
+ .offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP |
+ DEV_RX_OFFLOAD_CRC_STRIP),
+ .ignore_offload_bitfield = 1,
};
struct rte_fdir_conf fdir_conf = {
@@ -1521,6 +1516,8 @@ start_port(portid_t pid)
port->need_reconfig_queues = 1;
return -1;
}
+ /* Apply Rx offloads configuration */
+ port->rx_conf.offloads = port->dev_conf.rxmode.offloads;
/* setup rx queues */
for (qi = 0; qi < nb_rxq; qi++) {
if ((numa_support) &&
@@ -2252,7 +2249,7 @@ init_port_dcb_config(portid_t pid,
retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
if (retval < 0)
return retval;
- port_conf.rxmode.hw_vlan_filter = 1;
+ port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
/**
* Write the configuration into the device.
@@ -2301,7 +2298,7 @@ init_port_dcb_config(portid_t pid,
rxtx_port_config(rte_port);
/* VLAN filter */
- rte_port->dev_conf.rxmode.hw_vlan_filter = 1;
+ rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
for (i = 0; i < RTE_DIM(vlan_tags); i++)
rx_vft_set(pid, vlan_tags[i], 1);
--
2.12.0
Hi Shahaf,
This testpmd change is causing some issues for qede PMD.
In this patch, rte_eth_dev_configure() and RX/TX queue setup functions are
called for the second time after applying TX offloads but without calling
rte_eth_dev_close() before.
Also there is no way in the driver to detect that this is a port
reconfiguration condition in which case it needs to do certain resources
deallocation/cleanup based on prior configuration.
Ideally, we don’t want to maintain port states in driver internally. So is
there any suggestions her
Shahaf Shuler
2018-01-20 19:29:27 UTC
Permalink
Hi Harish,
Post by Ferruh Yigit
Hi Shahaf,
This testpmd change is causing some issues for qede PMD.
In this patch, rte_eth_dev_configure() and RX/TX queue setup functions are
called for the second time after applying TX offloads but without calling
rte_eth_dev_close() before.
This issue is not related to the patch, rather to how DPDK and ethdev layer is defined.
In DPDK, after device probe the device is considered usable from ethdev. Then from ethdev the device can be configured (both port and queues) as long as it is not started yet.
The move between device start, stop, port config and queue config can happen multiple times without the need to move through device close.
In fact, the only way to make the device usable again after close is by another probe.
Post by Ferruh Yigit
Also there is no way in the driver to detect that this is a port
reconfiguration condition in which case it needs to do certain resources
deallocation/cleanup based on prior configuration.
Am not sure I understand.
You mean it is impossible from your side to detect port configuration in your PMD? Other PMDs do that.
Post by Ferruh Yigit
Ideally, we don’t want to maintain port states in driver internally. So is
there any suggestions here?
Generally, I think this is a big issue in qede PMD. It is not following the rules of ethdev.
I guess that with this misfunctionality you will have bugs also with real applications.

As a temporary walk around you can configure the Tx offload you want through --tx-offloads command line parameter and avoid enablement using the CLI.
This way the port and queues will be reconfigured only once.
Post by Ferruh Yigit
Thanks,
Harish
Shahaf Shuler
2017-12-26 09:44:17 UTC
Permalink
This patch adds supports for checking if a single port is stopped.
currently there is a function to check only for all ports.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/testpmd.c | 16 ++++++++++++----
app/test-pmd/testpmd.h | 1 +
2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 6785b095f..77154ef3b 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1394,15 +1394,23 @@ all_ports_started(void)
}

int
+port_is_stopped(portid_t port_id)
+{
+ struct rte_port *port = &ports[port_id];
+
+ if ((port->port_status != RTE_PORT_STOPPED) &&
+ (port->slave_flag == 0))
+ return 0;
+ return 1;
+}
+
+int
all_ports_stopped(void)
{
portid_t pi;
- struct rte_port *port;

RTE_ETH_FOREACH_DEV(pi) {
- port = &ports[pi];
- if ((port->port_status != RTE_PORT_STOPPED) &&
- (port->slave_flag == 0))
+ if (!port_is_stopped(pi))
return 0;
}

diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 1639d27e7..ab74d39ce 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -682,6 +682,7 @@ void reset_port(portid_t pid);
void attach_port(char *identifier);
void detach_port(portid_t port_id);
int all_ports_stopped(void);
+int port_is_stopped(portid_t port_id);
int port_is_started(portid_t port_id);
void pmd_test_exit(void);
void fdir_get_infos(portid_t port_id);
--
2.12.0
Lu, Wenzhuo
2018-01-09 03:20:58 UTC
Permalink
Hi,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 03/10] app/testpmd: support check of single
port stop
This patch adds supports for checking if a single port is stopped.
currently there is a function to check only for all ports.
Acked-by: Wenzhuo Lu <***@intel.com>
Shahaf Shuler
2017-12-26 09:44:18 UTC
Permalink
Ethdev Tx offloads API has changed since:

commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")

Convert the application to use the new API.

This patch mandates the port to be stopped when configure the Tx
offloads. This is because the PMD must be aware to the offloads changes
on the device and queue configuration.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 90 ++++++++++++++++++++++++++++++++++++++++++---
app/test-pmd/config.c | 55 ++++++++++++++++++---------
app/test-pmd/testpmd.c | 3 ++
3 files changed, 124 insertions(+), 24 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index d8c73a9b1..58125839a 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3439,7 +3439,14 @@ cmd_tx_vlan_set_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_result *res = parsed_result;

+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =
@@ -3486,7 +3493,14 @@ cmd_tx_vlan_set_qinq_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_qinq_result *res = parsed_result;

+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan =
@@ -3592,7 +3606,14 @@ cmd_tx_vlan_reset_parsed(void *parsed_result,
{
struct cmd_tx_vlan_reset_result *res = parsed_result;

+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_reset(res->port_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan =
@@ -3685,11 +3706,16 @@ cmd_csum_parsed(void *parsed_result,
struct cmd_csum_result *res = parsed_result;
int hw = 0;
uint16_t mask = 0;
+ uint64_t csum_offloads = 0;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
printf("invalid port %d\n", res->port_id);
return;
}
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }

if (!strcmp(res->mode, "set")) {

@@ -3698,22 +3724,34 @@ cmd_csum_parsed(void *parsed_result,

if (!strcmp(res->proto, "ip")) {
mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}

- if (hw)
+ if (hw) {
ports[res->port_id].tx_ol_flags |= mask;
- else
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ csum_offloads;
+ } else {
ports[res->port_id].tx_ol_flags &= (~mask);
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ (~csum_offloads);
+ }
}
csum_show(res->port_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_csum_csum =
@@ -3837,15 +3875,24 @@ cmd_tso_set_parsed(void *parsed_result,

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }

if (!strcmp(res->mode, "set"))
ports[res->port_id].tso_segsz = res->tso_segsz;

- if (ports[res->port_id].tso_segsz == 0)
+ if (ports[res->port_id].tso_segsz == 0) {
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_TCP_TSO;
printf("TSO for non-tunneled packets is disabled\n");
- else
+ } else {
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_TCP_TSO;
printf("TSO segment size for non-tunneled packets is %d\n",
ports[res->port_id].tso_segsz);
+ }

/* display warnings if configuration is not supported by the NIC */
rte_eth_dev_info_get(res->port_id, &dev_info);
@@ -3854,6 +3901,8 @@ cmd_tso_set_parsed(void *parsed_result,
printf("Warning: TSO enabled but not "
"supported by port %d\n", res->port_id);
}
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tso_set_tso =
@@ -3939,13 +3988,27 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }

if (!strcmp(res->mode, "set"))
ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;

- if (ports[res->port_id].tunnel_tso_segsz == 0)
+ if (ports[res->port_id].tunnel_tso_segsz == 0) {
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ ~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO for tunneled packets is disabled\n");
- else {
+ } else {
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO segment size for tunneled packets is %d\n",
ports[res->port_id].tunnel_tso_segsz);

@@ -3971,6 +4034,8 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
printf("Warning: csum set outer-ip must be set to hw "
"if outer L3 is IPv4; not necessary for IPv6\n");
}
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =
@@ -13012,8 +13077,13 @@ cmd_set_macsec_offload_on_parsed(

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(port_id)) {
+ printf("Please stop port %d first\n", port_id);
+ return;
+ }

ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
#endif
@@ -13022,6 +13092,7 @@ cmd_set_macsec_offload_on_parsed(

switch (ret) {
case 0:
+ cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
printf("invalid port_id %d\n", port_id);
@@ -13096,14 +13167,21 @@ cmd_set_macsec_offload_off_parsed(

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(port_id)) {
+ printf("Please stop port %d first\n", port_id);
+ return;
+ }

ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_disable(port_id);
#endif

switch (ret) {
case 0:
+ cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
printf("invalid port_id %d\n", port_id);
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 3bc99be76..d0056fa69 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -616,8 +616,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
printf("VLAN insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_VLAN_INSERT)
printf("on\n");
else
printf("off\n");
@@ -634,8 +634,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) {
printf("Double VLANs insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_QINQ_INSERT)
printf("on\n");
else
printf("off\n");
@@ -643,7 +643,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
printf("TX IPv4 checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -651,7 +652,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {
printf("TX UDP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_UDP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -659,7 +661,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
printf("TX TCP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_TCP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -667,7 +670,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) {
printf("TX SCTP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_SCTP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -675,8 +679,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
printf("TX Outer IPv4 checksum: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -684,7 +688,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) {
printf("TX TCP segmentation: ");
- if (ports[port_id].tso_segsz != 0)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_TCP_TSO)
printf("on\n");
else
printf("off\n");
@@ -692,7 +697,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TSO) {
printf("TX UDP segmentation: ");
- if (ports[port_id].tso_segsz != 0)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_UDP_TSO)
printf("on\n");
else
printf("off\n");
@@ -700,7 +706,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO) {
printf("TSO for VXLAN tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_VXLAN_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -708,7 +715,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO) {
printf("TSO for GRE tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_GRE_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -716,7 +724,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO) {
printf("TSO for IPIP tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -724,7 +733,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO) {
printf("TSO for GENEVE tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -1704,8 +1714,10 @@ rxtx_config_display(void)
tx_conf->tx_thresh.pthresh,
tx_conf->tx_thresh.hthresh,
tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""
+ " - TXQ offloads=0x%"PRIx64"\n",
+ tx_conf->tx_rs_thresh, tx_conf->txq_flags,
+ tx_conf->offloads);
}
}

@@ -2783,6 +2795,7 @@ void
tx_vlan_set(portid_t port_id, uint16_t vlan_id)
{
int vlan_offload;
+
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
if (vlan_id_is_invalid(vlan_id))
@@ -2796,6 +2809,7 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)

tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
}

@@ -2803,6 +2817,7 @@ void
tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
{
int vlan_offload;
+
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
if (vlan_id_is_invalid(vlan_id))
@@ -2818,6 +2833,7 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)

tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
ports[port_id].tx_vlan_id_outer = vlan_id_outer;
}
@@ -2829,6 +2845,9 @@ tx_vlan_reset(portid_t port_id)
return;
ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
TESTPMD_TX_OFFLOAD_INSERT_QINQ);
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~(DEV_TX_OFFLOAD_VLAN_INSERT |
+ DEV_TX_OFFLOAD_QINQ_INSERT);
ports[port_id].tx_vlan_id = 0;
ports[port_id].tx_vlan_id_outer = 0;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 77154ef3b..0087438bc 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1498,6 +1498,9 @@ start_port(portid_t pid)
}
if (port->need_reconfig_queues > 0) {
port->need_reconfig_queues = 0;
+ port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;
+ /* Apply Tx offloads configuration */
+ port->tx_conf.offloads = port->dev_conf.txmode.offloads;
/* setup tx queues */
for (qi = 0; qi < nb_txq; qi++) {
if ((numa_support) &&
--
2.12.0
Lu, Wenzhuo
2018-01-09 05:27:41 UTC
Permalink
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 04/10] app/testpmd: convert to new Ethdev
Tx offloads API
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
Convert the application to use the new API.
This patch mandates the port to be stopped when configure the Tx offloads.
This is because the PMD must be aware to the offloads changes on the
device and queue configuration.
---
app/test-pmd/cmdline.c | 90
++++++++++++++++++++++++++++++++++++++++++---
app/test-pmd/config.c | 55 ++++++++++++++++++--------- app/test-
pmd/testpmd.c | 3 ++
3 files changed, 124 insertions(+), 24 deletions(-)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
d8c73a9b1..58125839a 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3439,7 +3439,14 @@ cmd_tx_vlan_set_parsed(void *parsed_result, {
struct cmd_tx_vlan_set_result *res = parsed_result;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}
I do have some concern about this behavior change, 'port_is_stopped' and ' cmd_reconfig_device_queue '.
1, seems this behavior change is not necessary for using the new offload API. Maybe splitting this patch to 2 is better.
2, some NICs doesn't need to be stopped or re-configured to make vlan functions enabled. That's why the original code doesn't have this restriction. Maybe figuring out a way to do the restriction in the driver layer is better.
Shahaf Shuler
2018-01-09 06:47:48 UTC
Permalink
Hi,
Post by Ferruh Yigit
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 04/10] app/testpmd: convert to new
Ethdev Tx offloads API
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
Convert the application to use the new API.
This patch mandates the port to be stopped when configure the Tx
offloads.
This is because the PMD must be aware to the offloads changes on the
device and queue configuration.
---
app/test-pmd/cmdline.c | 90
++++++++++++++++++++++++++++++++++++++++++---
app/test-pmd/config.c | 55 ++++++++++++++++++--------- app/test-
pmd/testpmd.c | 3 ++
3 files changed, 124 insertions(+), 24 deletions(-)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
d8c73a9b1..58125839a 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3439,7 +3439,14 @@ cmd_tx_vlan_set_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_result *res = parsed_result;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}
I do have some concern about this behavior change, 'port_is_stopped' and '
cmd_reconfig_device_queue '.
1, seems this behavior change is not necessary for using the new offload API.
Maybe splitting this patch to 2 is better.
It is related. Because as part of the offloads API the Tx offloads configuration is set on the rte_eth_dev_configure. To configure a device it must be stopped in advance.

Also, per my understanding, the only API which allows offloads configuration on the flight are the Rx VLAN offloads.
As you can see, this API is respected and no need to check the port status in it
Post by Ferruh Yigit
2, some NICs doesn't need to be stopped or re-configured to make vlan
functions enabled.
Only for the Rx vlan. The Tx vlan insert is not configured on the flight.

That's why the original code doesn't have this restriction.
Post by Ferruh Yigit
Maybe figuring out a way to do the restriction in the driver layer is better.
The original code doesn't have such restriction because testpmd wasn't configuring Tx offloads at all. It used it's own Tx offloads enum (which I removed on later patches) to indicate which offloads is set. From the device perspective all the Tx offloads should be set.
It did had a way to configure offloads with txqflags parameter, but this required queues reconfigurations.
Lu, Wenzhuo
2018-01-09 07:13:56 UTC
Permalink
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, January 9, 2018 2:48 PM
Subject: RE: [dpdk-dev] [PATCH v3 04/10] app/testpmd: convert to new
Ethdev Tx offloads API
Hi,
Post by Ferruh Yigit
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 04/10] app/testpmd: convert to new
Ethdev Tx offloads API
commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
Convert the application to use the new API.
This patch mandates the port to be stopped when configure the Tx
offloads.
This is because the PMD must be aware to the offloads changes on the
device and queue configuration.
---
app/test-pmd/cmdline.c | 90
++++++++++++++++++++++++++++++++++++++++++---
app/test-pmd/config.c | 55 ++++++++++++++++++--------- app/test-
pmd/testpmd.c | 3 ++
3 files changed, 124 insertions(+), 24 deletions(-)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
d8c73a9b1..58125839a 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3439,7 +3439,14 @@ cmd_tx_vlan_set_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_result *res = parsed_result;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}
I do have some concern about this behavior change, 'port_is_stopped' and
'
Post by Ferruh Yigit
cmd_reconfig_device_queue '.
1, seems this behavior change is not necessary for using the new offload
API.
Post by Ferruh Yigit
Maybe splitting this patch to 2 is better.
It is related. Because as part of the offloads API the Tx offloads configuration
is set on the rte_eth_dev_configure. To configure a device it must be
stopped in advance.
Also, per my understanding, the only API which allows offloads configuration
on the flight are the Rx VLAN offloads.
As you can see, this API is respected and no need to check the port status in it
Post by Ferruh Yigit
2, some NICs doesn't need to be stopped or re-configured to make vlan
functions enabled.
Only for the Rx vlan. The Tx vlan insert is not configured on the flight.
That's why the original code doesn't have this restriction.
Post by Ferruh Yigit
Maybe figuring out a way to do the restriction in the driver layer is better.
The original code doesn't have such restriction because testpmd wasn't
configuring Tx offloads at all. It used it's own Tx offloads enum (which I
removed on later patches) to indicate which offloads is set. From the device
perspective all the Tx offloads should be set.
It did had a way to configure offloads with txqflags parameter, but this
required queues reconfigurations.
' cmd_tx_vlan_set_parsed' is the function which configures TX vlan insertion. This patch adds the restriction in it.
For example, on ixgbe it does support on the fly configuration. APP doesn't need to stop the device or reconfigure the queues.
Shahaf Shuler
2018-01-09 10:02:22 UTC
Permalink
Post by Lu, Wenzhuo
Post by Shahaf Shuler
The original code doesn't have such restriction because testpmd wasn't
configuring Tx offloads at all. It used it's own Tx offloads enum
(which I removed on later patches) to indicate which offloads is set.
From the device perspective all the Tx offloads should be set.
It did had a way to configure offloads with txqflags parameter, but
this required queues reconfigurations.
' cmd_tx_vlan_set_parsed' is the function which configures TX vlan insertion.
This patch adds the restriction in it.
For example, on ixgbe it does support on the fly configuration. APP doesn't
need to stop the device or reconfigure the queues.
What is mean is that in the old offloads API, all the Tx offloads were enabled by default, besides the ones which were masked with txqflags.
This is why testpmd didn't have any limitation on changing the Tx offloads. All of them were enabled, it just needed to choose with which one to use.

Now, with the new offloads API, the Tx offloads are disabled by default, and enabled per application need on device and queue configuration.
In order to call device/queue configuration the port must be stopped. This is requirement from ethdev API.

Now, there is an API in ethdev to configure Rx VLAN offloads on the flight for supported devices.
If there are devices which supports it also in the Tx side, and you see a good use case for that, then need to think of new API in ethdev to configure Tx VLAN offloads on the flight.

However, the plain conversion of testpmd from the old to the new API requires the port to be stopped for all of the Tx offloads.
Lu, Wenzhuo
2018-01-09 11:37:07 UTC
Permalink
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, January 9, 2018 6:02 PM
Subject: RE: [dpdk-dev] [PATCH v3 04/10] app/testpmd: convert to new
Ethdev Tx offloads API
Post by Lu, Wenzhuo
Post by Shahaf Shuler
The original code doesn't have such restriction because testpmd
wasn't configuring Tx offloads at all. It used it's own Tx offloads
enum (which I removed on later patches) to indicate which offloads is set.
From the device perspective all the Tx offloads should be set.
It did had a way to configure offloads with txqflags parameter, but
this required queues reconfigurations.
' cmd_tx_vlan_set_parsed' is the function which configures TX vlan
insertion.
Post by Lu, Wenzhuo
This patch adds the restriction in it.
For example, on ixgbe it does support on the fly configuration. APP
doesn't need to stop the device or reconfigure the queues.
What is mean is that in the old offloads API, all the Tx offloads were enabled
by default, besides the ones which were masked with txqflags.
This is why testpmd didn't have any limitation on changing the Tx offloads.
All of them were enabled, it just needed to choose with which one to use.
Now, with the new offloads API, the Tx offloads are disabled by default, and
enabled per application need on device and queue configuration.
In order to call device/queue configuration the port must be stopped. This is
requirement from ethdev API.
Now, there is an API in ethdev to configure Rx VLAN offloads on the flight for
supported devices.
If there are devices which supports it also in the Tx side, and you see a good
use case for that, then need to think of new API in ethdev to configure Tx
VLAN offloads on the flight.
However, the plain conversion of testpmd from the old to the new API
requires the port to be stopped for all of the Tx offloads.
Let's just talk about TX vlan insertion. Actually there's no ethdev API for it. And no configuration for it. Because vlan insertion is simple, it only need to add a vlan tag when transmitting packets.
You can see it's per packet thing. APP can set the ol_flags and vlan_tci in the mbuf of every packet to enable this function for the packet or not. I think it does be a on the fly function on any NIC.
Ananyev, Konstantin
2018-01-09 12:14:39 UTC
Permalink
-----Original Message-----
Sent: Tuesday, January 9, 2018 11:37 AM
Subject: Re: [dpdk-dev] [PATCH v3 04/10] app/testpmd: convert to new Ethdev Tx offloads API
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, January 9, 2018 6:02 PM
Subject: RE: [dpdk-dev] [PATCH v3 04/10] app/testpmd: convert to new
Ethdev Tx offloads API
Post by Lu, Wenzhuo
Post by Shahaf Shuler
The original code doesn't have such restriction because testpmd
wasn't configuring Tx offloads at all. It used it's own Tx offloads
enum (which I removed on later patches) to indicate which offloads is set.
From the device perspective all the Tx offloads should be set.
It did had a way to configure offloads with txqflags parameter, but
this required queues reconfigurations.
' cmd_tx_vlan_set_parsed' is the function which configures TX vlan
insertion.
Post by Lu, Wenzhuo
This patch adds the restriction in it.
For example, on ixgbe it does support on the fly configuration. APP
doesn't need to stop the device or reconfigure the queues.
What is mean is that in the old offloads API, all the Tx offloads were enabled
by default, besides the ones which were masked with txqflags.
This is why testpmd didn't have any limitation on changing the Tx offloads.
All of them were enabled, it just needed to choose with which one to use.
Now, with the new offloads API, the Tx offloads are disabled by default, and
enabled per application need on device and queue configuration.
In order to call device/queue configuration the port must be stopped. This is
requirement from ethdev API.
Now, there is an API in ethdev to configure Rx VLAN offloads on the flight for
supported devices.
If there are devices which supports it also in the Tx side, and you see a good
use case for that, then need to think of new API in ethdev to configure Tx
VLAN offloads on the flight.
However, the plain conversion of testpmd from the old to the new API
requires the port to be stopped for all of the Tx offloads.
Let's just talk about TX vlan insertion. Actually there's no ethdev API for it. And no configuration for it. Because vlan insertion is simple, it
only need to add a vlan tag when transmitting packets.
You still need an appropriate TX function be selected, otherwise mbuf->vlan_tci will be just ignored.
So you still has to specify at queue_setup flag that you would like to have VLAN insertion offload enabled.
Konstantin
You can see it's per packet thing. APP can set the ol_flags and vlan_tci in the mbuf of every packet to enable this function for the packet or
not. I think it does be a on the fly function on any NIC.
Lu, Wenzhuo
2018-01-10 00:37:58 UTC
Permalink
Hi Konstantin,
-----Original Message-----
From: Ananyev, Konstantin
Sent: Tuesday, January 9, 2018 8:15 PM
Subject: RE: [dpdk-dev] [PATCH v3 04/10] app/testpmd: convert to new
Ethdev Tx offloads API
-----Original Message-----
Sent: Tuesday, January 9, 2018 11:37 AM
Subject: Re: [dpdk-dev] [PATCH v3 04/10] app/testpmd: convert to new
Ethdev Tx offloads API
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, January 9, 2018 6:02 PM
Subject: RE: [dpdk-dev] [PATCH v3 04/10] app/testpmd: convert to new
Ethdev Tx offloads API
Post by Lu, Wenzhuo
Post by Shahaf Shuler
The original code doesn't have such restriction because testpmd
wasn't configuring Tx offloads at all. It used it's own Tx
offloads enum (which I removed on later patches) to indicate which
offloads is set.
Post by Lu, Wenzhuo
Post by Shahaf Shuler
From the device perspective all the Tx offloads should be set.
It did had a way to configure offloads with txqflags parameter,
but this required queues reconfigurations.
' cmd_tx_vlan_set_parsed' is the function which configures TX vlan
insertion.
Post by Lu, Wenzhuo
This patch adds the restriction in it.
For example, on ixgbe it does support on the fly configuration.
APP doesn't need to stop the device or reconfigure the queues.
What is mean is that in the old offloads API, all the Tx offloads
were enabled by default, besides the ones which were masked with
txqflags.
This is why testpmd didn't have any limitation on changing the Tx
offloads.
All of them were enabled, it just needed to choose with which one to use.
Now, with the new offloads API, the Tx offloads are disabled by
default, and enabled per application need on device and queue
configuration.
In order to call device/queue configuration the port must be
stopped. This is requirement from ethdev API.
Now, there is an API in ethdev to configure Rx VLAN offloads on the
flight for supported devices.
If there are devices which supports it also in the Tx side, and you
see a good use case for that, then need to think of new API in
ethdev to configure Tx VLAN offloads on the flight.
However, the plain conversion of testpmd from the old to the new API
requires the port to be stopped for all of the Tx offloads.
Let's just talk about TX vlan insertion. Actually there's no ethdev
API for it. And no configuration for it. Because vlan insertion is simple, it
only need to add a vlan tag when transmitting packets.
You still need an appropriate TX function be selected, otherwise mbuf-
vlan_tci will be just ignored.
So you still has to specify at queue_setup flag that you would like to have
VLAN insertion offload enabled.
Konstantin
O, it's a good point. I didn't consider the TX path selection.
You can see it's per packet thing. APP can set the ol_flags and
vlan_tci in the mbuf of every packet to enable this function for the packet
or not. I think it does be a on the fly function on any NIC.
Shahaf Shuler
2017-12-26 09:44:19 UTC
Permalink
The mbuf ol_flags were taken directly from testpmd internal enumeration
leading to incorrect values.

addressing only insertion offload flags as the checksum flags by
the application design are only with csum forwarding.

Fixes: e9e23a617eb8 ("app/testpmd: add flowgen forwarding engine")
Cc: ***@tilera.com
Cc: ***@dpdk.org

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/flowgen.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/app/test-pmd/flowgen.c b/app/test-pmd/flowgen.c
index acf9af941..46478fc3a 100644
--- a/app/test-pmd/flowgen.c
+++ b/app/test-pmd/flowgen.c
@@ -123,7 +123,7 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
struct ipv4_hdr *ip_hdr;
struct udp_hdr *udp_hdr;
uint16_t vlan_tci, vlan_tci_outer;
- uint16_t ol_flags;
+ uint64_t ol_flags;
uint16_t nb_rx;
uint16_t nb_tx;
uint16_t nb_pkt;
@@ -151,7 +151,13 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
mbp = current_fwd_lcore()->mbp;
vlan_tci = ports[fs->tx_port].tx_vlan_id;
vlan_tci_outer = ports[fs->tx_port].tx_vlan_id_outer;
- ol_flags = ports[fs->tx_port].tx_ol_flags;
+
+ if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ ol_flags = PKT_TX_VLAN_PKT;
+ if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ ol_flags |= PKT_TX_QINQ_PKT;
+ if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ ol_flags |= PKT_TX_MACSEC;

for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {
pkt = rte_mbuf_raw_alloc(mbp);
--
2.12.0
Lu, Wenzhuo
2018-01-09 05:35:07 UTC
Permalink
Hi,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 05/10] app/testpmd: fix flowgen forwarding ol
flags
The mbuf ol_flags were taken directly from testpmd internal enumeration
leading to incorrect values.
addressing only insertion offload flags as the checksum flags by the
application design are only with csum forwarding.
Fixes: e9e23a617eb8 ("app/testpmd: add flowgen forwarding engine")
Acked-by: Wenzhuo Lu <***@intel.com>
Shahaf Shuler
2017-12-26 09:44:20 UTC
Permalink
The tx_ol_flags field was used in order to control the different
Tx offloads set. After the conversion to the new Ethdev Tx offloads API
it is not needed anymore as the offloads configuration is stored in
ethdev structs.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 49 ++++++++++++++++----------------------------
app/test-pmd/config.c | 4 ----
app/test-pmd/csumonly.c | 40 ++++++++++++++++++------------------
app/test-pmd/flowgen.c | 8 +++++---
app/test-pmd/macfwd.c | 8 +++++---
app/test-pmd/macswap.c | 8 +++++---
app/test-pmd/testpmd.h | 22 +-------------------
app/test-pmd/txonly.c | 8 +++++---
8 files changed, 59 insertions(+), 88 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 58125839a..858482174 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3653,45 +3653,45 @@ static void
csum_show(int port_id)
{
struct rte_eth_dev_info dev_info;
- uint16_t ol_flags;
+ uint64_t tx_offloads;

- ol_flags = ports[port_id].tx_ol_flags;
+ tx_offloads = ports[port_id].dev_conf.txmode.offloads;
printf("Parse tunnel is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_PARSE_TUNNEL) ? "on" : "off");
+ (ports[port_id].parse_tunnel) ? "on" : "off");
printf("IP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) ? "hw" : "sw");
printf("UDP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw");
printf("TCP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw");
printf("SCTP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw");
printf("Outer-Ip checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ? "hw" : "sw");

/* display warnings if configuration is not supported by the NIC */
rte_eth_dev_info_get(port_id, &dev_info);
- if ((ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
printf("Warning: hardware IP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) == 0) {
printf("Warning: hardware UDP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) == 0) {
printf("Warning: hardware TCP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) == 0) {
printf("Warning: hardware SCTP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) == 0) {
printf("Warning: hardware outer IP checksum enabled but not "
"supported by port %d\n", port_id);
@@ -3705,7 +3705,6 @@ cmd_csum_parsed(void *parsed_result,
{
struct cmd_csum_result *res = parsed_result;
int hw = 0;
- uint16_t mask = 0;
uint64_t csum_offloads = 0;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
@@ -3723,28 +3722,21 @@ cmd_csum_parsed(void *parsed_result,
hw = 1;

if (!strcmp(res->proto, "ip")) {
- mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
- mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
- mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
- mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
- mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}

if (hw) {
- ports[res->port_id].tx_ol_flags |= mask;
ports[res->port_id].dev_conf.txmode.offloads |=
csum_offloads;
} else {
- ports[res->port_id].tx_ol_flags &= (~mask);
ports[res->port_id].dev_conf.txmode.offloads &=
(~csum_offloads);
}
@@ -3821,11 +3813,9 @@ cmd_csum_tunnel_parsed(void *parsed_result,
return;

if (!strcmp(res->onoff, "on"))
- ports[res->port_id].tx_ol_flags |=
- TESTPMD_TX_OFFLOAD_PARSE_TUNNEL;
+ ports[res->port_id].parse_tunnel = 1;
else
- ports[res->port_id].tx_ol_flags &=
- (~TESTPMD_TX_OFFLOAD_PARSE_TUNNEL);
+ ports[res->port_id].parse_tunnel = 0;

csum_show(res->port_id);
}
@@ -4025,12 +4015,11 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
*/
check_tunnel_tso_nic_support(res->port_id);

- if (!(ports[res->port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_PARSE_TUNNEL))
+ if (!ports[res->port_id].parse_tunnel)
printf("Warning: csum parse_tunnel must be set "
"so that tunneled packets are recognized\n");
- if (!(ports[res->port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM))
+ if (!(ports[res->port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM))
printf("Warning: csum set outer-ip must be set to hw "
"if outer L3 is IPv4; not necessary for IPv6\n");
}
@@ -13082,7 +13071,6 @@ cmd_set_macsec_offload_on_parsed(
return;
}

- ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
@@ -13172,7 +13160,6 @@ cmd_set_macsec_offload_off_parsed(
return;
}

- ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
ports[port_id].dev_conf.txmode.offloads &=
~DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index d0056fa69..29115e255 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2808,7 +2808,6 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)
}

tx_vlan_reset(port_id);
- ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
}
@@ -2832,7 +2831,6 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
}

tx_vlan_reset(port_id);
- ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
ports[port_id].tx_vlan_id_outer = vlan_id_outer;
@@ -2843,8 +2841,6 @@ tx_vlan_reset(portid_t port_id)
{
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
- ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
- TESTPMD_TX_OFFLOAD_INSERT_QINQ);
ports[port_id].dev_conf.txmode.offloads &=
~(DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT);
diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
index aa29f5fc1..dbd2f9842 100644
--- a/app/test-pmd/csumonly.c
+++ b/app/test-pmd/csumonly.c
@@ -316,7 +316,7 @@ parse_encap_ip(void *encap_ip, struct testpmd_offload_info *info)
* depending on the testpmd command line configuration */
static uint64_t
process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
- uint16_t testpmd_ol_flags)
+ uint64_t tx_offloads)
{
struct ipv4_hdr *ipv4_hdr = l3_hdr;
struct udp_hdr *udp_hdr;
@@ -347,7 +347,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
if (info->l4_proto == IPPROTO_TCP && tso_segsz) {
ol_flags |= PKT_TX_IP_CKSUM;
} else {
- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
+ if (tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM)
ol_flags |= PKT_TX_IP_CKSUM;
else
ipv4_hdr->hdr_checksum =
@@ -363,7 +363,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
/* do not recalculate udp cksum if it was 0 */
if (udp_hdr->dgram_cksum != 0) {
udp_hdr->dgram_cksum = 0;
- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
+ if (tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM)
ol_flags |= PKT_TX_UDP_CKSUM;
else {
udp_hdr->dgram_cksum =
@@ -376,7 +376,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
tcp_hdr->cksum = 0;
if (tso_segsz)
ol_flags |= PKT_TX_TCP_SEG;
- else if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
+ else if (tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM)
ol_flags |= PKT_TX_TCP_CKSUM;
else {
tcp_hdr->cksum =
@@ -390,7 +390,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
sctp_hdr->cksum = 0;
/* sctp payload must be a multiple of 4 to be
* offloaded */
- if ((testpmd_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
((ipv4_hdr->total_length & 0x3) == 0)) {
ol_flags |= PKT_TX_SCTP_CKSUM;
} else {
@@ -405,7 +405,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
/* Calculate the checksum of outer header */
static uint64_t
process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info,
- uint16_t testpmd_ol_flags, int tso_enabled)
+ uint64_t tx_offloads, int tso_enabled)
{
struct ipv4_hdr *ipv4_hdr = outer_l3_hdr;
struct ipv6_hdr *ipv6_hdr = outer_l3_hdr;
@@ -416,7 +416,7 @@ process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info,
ipv4_hdr->hdr_checksum = 0;
ol_flags |= PKT_TX_OUTER_IPV4;

- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
+ if (tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
ol_flags |= PKT_TX_OUTER_IP_CKSUM;
else
ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr);
@@ -646,7 +646,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
uint16_t nb_prep;
uint16_t i;
uint64_t rx_ol_flags, tx_ol_flags;
- uint16_t testpmd_ol_flags;
+ uint64_t tx_offloads;
uint32_t retry;
uint32_t rx_bad_ip_csum;
uint32_t rx_bad_l4_csum;
@@ -678,7 +678,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
gro_enable = gro_ports[fs->rx_port].enable;

txp = &ports[fs->tx_port];
- testpmd_ol_flags = txp->tx_ol_flags;
+ tx_offloads = txp->dev_conf.txmode.offloads;
memset(&info, 0, sizeof(info));
info.tso_segsz = txp->tso_segsz;
info.tunnel_tso_segsz = txp->tunnel_tso_segsz;
@@ -714,7 +714,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
l3_hdr = (char *)eth_hdr + info.l2_len;

/* check if it's a supported tunnel */
- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_PARSE_TUNNEL) {
+ if (txp->parse_tunnel) {
if (info.l4_proto == IPPROTO_UDP) {
struct udp_hdr *udp_hdr;

@@ -754,14 +754,14 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)

/* process checksums of inner headers first */
tx_ol_flags |= process_inner_cksums(l3_hdr, &info,
- testpmd_ol_flags);
+ tx_offloads);

/* Then process outer headers if any. Note that the software
* checksum will be wrong if one of the inner checksums is
* processed in hardware. */
if (info.is_tunnel == 1) {
tx_ol_flags |= process_outer_cksums(outer_l3_hdr, &info,
- testpmd_ol_flags,
+ tx_offloads,
!!(tx_ol_flags & PKT_TX_TCP_SEG));
}

@@ -769,8 +769,8 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)

if (info.is_tunnel == 1) {
if (info.tunnel_tso_segsz ||
- (testpmd_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ||
+ (tx_offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
(tx_ol_flags & PKT_TX_OUTER_IPV6)) {
m->outer_l2_len = info.outer_l2_len;
m->outer_l3_len = info.outer_l3_len;
@@ -832,17 +832,17 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
rte_be_to_cpu_16(info.outer_ethertype),
info.outer_l3_len);
/* dump tx packet info */
- if ((testpmd_ol_flags & (TESTPMD_TX_OFFLOAD_IP_CKSUM |
- TESTPMD_TX_OFFLOAD_UDP_CKSUM |
- TESTPMD_TX_OFFLOAD_TCP_CKSUM |
- TESTPMD_TX_OFFLOAD_SCTP_CKSUM)) ||
+ if ((tx_offloads & (DEV_TX_OFFLOAD_IPV4_CKSUM |
+ DEV_TX_OFFLOAD_UDP_CKSUM |
+ DEV_TX_OFFLOAD_TCP_CKSUM |
+ DEV_TX_OFFLOAD_SCTP_CKSUM)) ||
info.tso_segsz != 0)
printf("tx: m->l2_len=%d m->l3_len=%d "
"m->l4_len=%d\n",
m->l2_len, m->l3_len, m->l4_len);
if (info.is_tunnel == 1) {
- if ((testpmd_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ||
+ if ((tx_offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
(tx_ol_flags & PKT_TX_OUTER_IPV6))
printf("tx: m->outer_l2_len=%d "
"m->outer_l3_len=%d\n",
diff --git a/app/test-pmd/flowgen.c b/app/test-pmd/flowgen.c
index 46478fc3a..0531b5d27 100644
--- a/app/test-pmd/flowgen.c
+++ b/app/test-pmd/flowgen.c
@@ -129,6 +129,7 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
uint16_t nb_pkt;
uint16_t i;
uint32_t retry;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -152,11 +153,12 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
vlan_tci = ports[fs->tx_port].tx_vlan_id;
vlan_tci_outer = ports[fs->tx_port].tx_vlan_id_outer;

- if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ tx_offloads = ports[fs->tx_port].dev_conf.txmode.offloads;
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;

for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {
diff --git a/app/test-pmd/macfwd.c b/app/test-pmd/macfwd.c
index f4a4bf29a..56ee3cc0b 100644
--- a/app/test-pmd/macfwd.c
+++ b/app/test-pmd/macfwd.c
@@ -84,6 +84,7 @@ pkt_burst_mac_forward(struct fwd_stream *fs)
uint16_t nb_tx;
uint16_t i;
uint64_t ol_flags = 0;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -107,11 +108,12 @@ pkt_burst_mac_forward(struct fwd_stream *fs)
#endif
fs->rx_packets += nb_rx;
txp = &ports[fs->tx_port];
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ tx_offloads = txp->dev_conf.txmode.offloads;
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;
for (i = 0; i < nb_rx; i++) {
if (likely(i < nb_rx - 1))
diff --git a/app/test-pmd/macswap.c b/app/test-pmd/macswap.c
index 721865c96..e2cc4812c 100644
--- a/app/test-pmd/macswap.c
+++ b/app/test-pmd/macswap.c
@@ -84,6 +84,7 @@ pkt_burst_mac_swap(struct fwd_stream *fs)
uint16_t i;
uint32_t retry;
uint64_t ol_flags = 0;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -107,11 +108,12 @@ pkt_burst_mac_swap(struct fwd_stream *fs)
#endif
fs->rx_packets += nb_rx;
txp = &ports[fs->tx_port];
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ tx_offloads = txp->dev_conf.txmode.offloads;
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;
for (i = 0; i < nb_rx; i++) {
if (likely(i < nb_rx - 1))
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index ab74d39ce..c6baa1066 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -138,26 +138,6 @@ struct fwd_stream {
#endif
};

-/** Offload IP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_IP_CKSUM 0x0001
-/** Offload UDP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_UDP_CKSUM 0x0002
-/** Offload TCP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_TCP_CKSUM 0x0004
-/** Offload SCTP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_SCTP_CKSUM 0x0008
-/** Offload outer IP checksum in csum forward engine for recognized tunnels */
-#define TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM 0x0010
-/** Parse tunnel in csum forward engine. If set, dissect tunnel headers
- * of rx packets. If not set, treat inner headers as payload. */
-#define TESTPMD_TX_OFFLOAD_PARSE_TUNNEL 0x0020
-/** Insert VLAN header in forward engine */
-#define TESTPMD_TX_OFFLOAD_INSERT_VLAN 0x0040
-/** Insert double VLAN header in forward engine */
-#define TESTPMD_TX_OFFLOAD_INSERT_QINQ 0x0080
-/** Offload MACsec in forward engine */
-#define TESTPMD_TX_OFFLOAD_MACSEC 0x0100
-
/** Descriptor for a single flow. */
struct port_flow {
size_t size; /**< Allocated space including data[]. */
@@ -215,7 +195,7 @@ struct rte_port {
struct fwd_stream *rx_stream; /**< Port RX stream, if unique */
struct fwd_stream *tx_stream; /**< Port TX stream, if unique */
unsigned int socket_id; /**< For NUMA support */
- uint16_t tx_ol_flags;/**< TX Offload Flags (TESTPMD_TX_OFFLOAD...). */
+ uint16_t parse_tunnel:1; /**< Parse internal headers */
uint16_t tso_segsz; /**< Segmentation offload MSS for non-tunneled packets. */
uint16_t tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
uint16_t tx_vlan_id;/**< The tag ID */
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 4ce4d61cc..5b5e4dff8 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -194,6 +194,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
uint32_t retry;
uint64_t ol_flags = 0;
uint8_t i;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -207,13 +208,14 @@ pkt_burst_transmit(struct fwd_stream *fs)

mbp = current_fwd_lcore()->mbp;
txp = &ports[fs->tx_port];
+ tx_offloads = txp->dev_conf.txmode.offloads;
vlan_tci = txp->tx_vlan_id;
vlan_tci_outer = txp->tx_vlan_id_outer;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;
for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {
pkt = rte_mbuf_raw_alloc(mbp);
--
2.12.0
Lu, Wenzhuo
2018-01-09 06:30:01 UTC
Permalink
Hi,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 06/10] app/testpmd: cleanup internal Tx
offloads flags field
The tx_ol_flags field was used in order to control the different Tx offloads
set. After the conversion to the new Ethdev Tx offloads API it is not needed
anymore as the offloads configuration is stored in ethdev structs.
---
app/test-pmd/cmdline.c | 49 ++++++++++++++++----------------------------
app/test-pmd/config.c | 4 ----
app/test-pmd/csumonly.c | 40 ++++++++++++++++++------------------
app/test-pmd/flowgen.c | 8 +++++---
app/test-pmd/macfwd.c | 8 +++++---
app/test-pmd/macswap.c | 8 +++++---
app/test-pmd/testpmd.h | 22 +-------------------
app/test-pmd/txonly.c | 8 +++++---
8 files changed, 59 insertions(+), 88 deletions(-)
struct fwd_stream *rx_stream; /**< Port RX stream, if unique */
struct fwd_stream *tx_stream; /**< Port TX stream, if unique */
unsigned int socket_id; /**< For NUMA support */
- uint16_t tx_ol_flags;/**< TX Offload Flags
(TESTPMD_TX_OFFLOAD...). */
+ uint16_t parse_tunnel:1; /**< Parse internal headers
This flag looks a little incongruous here, but anyway we have to have it.

Acked-by: Wenzhuo Lu <***@intel.com>
Shahaf Shuler
2017-12-26 09:44:21 UTC
Permalink
This patch adds command line option to set hex value for the ports Tx
offloads flags.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/parameters.c | 17 +++++++++++++++--
app/test-pmd/testpmd.c | 4 ++++
app/test-pmd/testpmd.h | 2 ++
doc/guides/testpmd_app_ug/run_app.rst | 5 +++++
4 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 263651cba..58889420f 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -99,7 +99,7 @@ usage(char* progname)
"--rss-ip | --rss-udp | "
"--rxpt= | --rxht= | --rxwt= | --rxfreet= | "
"--txpt= | --txht= | --txwt= | --txfreet= | "
- "--txrst= | --txqflags= ]\n",
+ "--txrst= | --txqflags= | --tx-offloads ]\n",
progname);
#ifdef RTE_LIBRTE_CMDLINE
printf(" --interactive: run in interactive mode.\n");
@@ -216,6 +216,7 @@ usage(char* progname)
"disable print of designated event or all of them.\n");
printf(" --flow-isolate-all: "
"requests flow API isolated mode on all ports at initialization time.\n");
+ printf(" --tx-offloads=0xXXXXXXXX: hexadecimal bitmask of TX queue offloads\n");
}

#ifdef RTE_LIBRTE_CMDLINE
@@ -566,8 +567,9 @@ launch_args_parse(int argc, char** argv)
char **argvopt;
int opt_idx;
enum { TX, RX };
- /* Default Rx offloads for all ports. */
+ /* Default offloads for all ports. */
uint64_t rx_offloads = rx_mode.offloads;
+ uint64_t tx_offloads = tx_mode.offloads;

static struct option lgopts[] = {
{ "help", 0, 0, 0 },
@@ -645,6 +647,7 @@ launch_args_parse(int argc, char** argv)
{ "no-rmv-interrupt", 0, 0, 0 },
{ "print-event", 1, 0, 0 },
{ "mask-event", 1, 0, 0 },
+ { "tx-offloads", 1, 0, 0 },
{ 0, 0, 0, 0 },
};

@@ -1116,6 +1119,15 @@ launch_args_parse(int argc, char** argv)
rmv_interrupt = 0;
if (!strcmp(lgopts[opt_idx].name, "flow-isolate-all"))
flow_isolate_all = 1;
+ if (!strcmp(lgopts[opt_idx].name, "tx-offloads")) {
+ char *end = NULL;
+ n = strtoull(optarg, &end, 16);
+ if (n >= 0)
+ tx_offloads = (uint64_t)n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "tx-offloads must be >= 0\n");
+ }
if (!strcmp(lgopts[opt_idx].name, "print-event"))
if (parse_event_printing_config(optarg, 1)) {
rte_exit(EXIT_FAILURE,
@@ -1142,4 +1154,5 @@ launch_args_parse(int argc, char** argv)

/* Set offload configuration from command line parameters. */
rx_mode.offloads = rx_offloads;
+ tx_mode.offloads = tx_offloads;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 0087438bc..806548196 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -344,6 +344,8 @@ struct rte_eth_rxmode rx_mode = {
.ignore_offload_bitfield = 1,
};

+struct rte_eth_txmode tx_mode;
+
struct rte_fdir_conf fdir_conf = {
.mode = RTE_FDIR_MODE_NONE,
.pballoc = RTE_FDIR_PBALLOC_64K,
@@ -604,6 +606,8 @@ init_config(void)

RTE_ETH_FOREACH_DEV(pid) {
port = &ports[pid];
+ /* Apply default Tx configuration for all ports */
+ port->dev_conf.txmode = tx_mode;
rte_eth_dev_info_get(pid, &port->dev_info);

if (numa_support) {
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index c6baa1066..3e63edfa1 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -395,6 +395,8 @@ extern portid_t fwd_ports_ids[RTE_MAX_ETHPORTS];
extern struct rte_port *ports;

extern struct rte_eth_rxmode rx_mode;
+extern struct rte_eth_txmode tx_mode;
+
extern uint64_t rss_hf;

extern queueid_t nb_rxq;
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index 4c0d2cede..fface6f58 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -509,3 +509,8 @@ The commandline options are:
configured flow rules only (see flow command).

Ports that do not support this mode are automatically discarded.
+
+* ``--tx-offloads=0xXXXXXXXX``
+
+ Set the hexadecimal bitmask of TX queue offloads.
+ The default value is 0.
--
2.12.0
Shahaf Shuler
2017-12-26 09:44:22 UTC
Permalink
Since testpmd is now using the new Ethdev offloads API and there is
a way configure each of the tx offloads from CLI or command line,
there is no need for the txqflags configuration anymore.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Nelio Laranjeiro <***@6wind.com>
---
app/test-pmd/cmdline.c | 69 ------------------------
app/test-pmd/config.c | 7 +--
app/test-pmd/parameters.c | 14 +----
app/test-pmd/testpmd.c | 8 ---
app/test-pmd/testpmd.h | 1 -
doc/guides/testpmd_app_ug/run_app.rst | 12 -----
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 11 ----
7 files changed, 3 insertions(+), 119 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 858482174..b4ef1d0eb 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3092,74 +3092,6 @@ cmdline_parse_inst_t cmd_set_txsplit = {
},
};

-/* *** CONFIG TX QUEUE FLAGS *** */
-
-struct cmd_config_txqflags_result {
- cmdline_fixed_string_t port;
- cmdline_fixed_string_t config;
- cmdline_fixed_string_t all;
- cmdline_fixed_string_t what;
- int32_t hexvalue;
-};
-
-static void cmd_config_txqflags_parsed(void *parsed_result,
- __attribute__((unused)) struct cmdline *cl,
- __attribute__((unused)) void *data)
-{
- struct cmd_config_txqflags_result *res = parsed_result;
-
- if (!all_ports_stopped()) {
- printf("Please stop all ports first\n");
- return;
- }
-
- if (strcmp(res->what, "txqflags")) {
- printf("Unknown parameter\n");
- return;
- }
-
- if (res->hexvalue >= 0) {
- txq_flags = res->hexvalue;
- } else {
- printf("txqflags must be >= 0\n");
- return;
- }
-
- init_port_config();
-
- cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
-}
-
-cmdline_parse_token_string_t cmd_config_txqflags_port =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, port,
- "port");
-cmdline_parse_token_string_t cmd_config_txqflags_config =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, config,
- "config");
-cmdline_parse_token_string_t cmd_config_txqflags_all =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, all,
- "all");
-cmdline_parse_token_string_t cmd_config_txqflags_what =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, what,
- "txqflags");
-cmdline_parse_token_num_t cmd_config_txqflags_value =
- TOKEN_NUM_INITIALIZER(struct cmd_config_txqflags_result,
- hexvalue, INT32);
-
-cmdline_parse_inst_t cmd_config_txqflags = {
- .f = cmd_config_txqflags_parsed,
- .data = NULL,
- .help_str = "port config all txqflags <value>",
- .tokens = {
- (void *)&cmd_config_txqflags_port,
- (void *)&cmd_config_txqflags_config,
- (void *)&cmd_config_txqflags_all,
- (void *)&cmd_config_txqflags_what,
- (void *)&cmd_config_txqflags_value,
- NULL,
- },
-};
-
/* *** ADD/REMOVE ALL VLAN IDENTIFIERS TO/FROM A PORT VLAN RX FILTER *** */
struct cmd_rx_vlan_filter_all_result {
cmdline_fixed_string_t rx_vlan;
@@ -15709,7 +15641,6 @@ cmdline_parse_ctx_t main_ctx[] = {
(cmdline_parse_inst_t *)&cmd_config_rx_mode_flag,
(cmdline_parse_inst_t *)&cmd_config_rss,
(cmdline_parse_inst_t *)&cmd_config_rxtx_queue,
- (cmdline_parse_inst_t *)&cmd_config_txqflags,
(cmdline_parse_inst_t *)&cmd_config_rss_reta,
(cmdline_parse_inst_t *)&cmd_showport_reta,
(cmdline_parse_inst_t *)&cmd_config_burst,
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 29115e255..faccb84ca 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -417,7 +417,6 @@ tx_queue_infos_display(portid_t port_id, uint16_t queue_id)
printf("\nTX writeback threshold: %hhu", qinfo.conf.tx_thresh.wthresh);
printf("\nTX RS threshold: %hu", qinfo.conf.tx_rs_thresh);
printf("\nTX free threshold: %hu", qinfo.conf.tx_free_thresh);
- printf("\nTX flags: %#x", qinfo.conf.txq_flags);
printf("\nTX deferred start: %s",
(qinfo.conf.tx_deferred_start != 0) ? "on" : "off");
printf("\nNumber of TXDs: %hu", qinfo.nb_desc);
@@ -1714,10 +1713,8 @@ rxtx_config_display(void)
tx_conf->tx_thresh.pthresh,
tx_conf->tx_thresh.hthresh,
tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""
- " - TXQ offloads=0x%"PRIx64"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags,
- tx_conf->offloads);
+ printf(" TX RS bit threshold=%d - TXQ offloads=0x%"PRIx64"\n",
+ tx_conf->tx_rs_thresh, tx_conf->offloads);
}
}

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 58889420f..fa547df66 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -99,7 +99,7 @@ usage(char* progname)
"--rss-ip | --rss-udp | "
"--rxpt= | --rxht= | --rxwt= | --rxfreet= | "
"--txpt= | --txht= | --txwt= | --txfreet= | "
- "--txrst= | --txqflags= | --tx-offloads ]\n",
+ "--txrst= | --tx-offloads ]\n",
progname);
#ifdef RTE_LIBRTE_CMDLINE
printf(" --interactive: run in interactive mode.\n");
@@ -192,8 +192,6 @@ usage(char* progname)
"(0 <= N <= value of txd).\n");
printf(" --txrst=N: set the transmit RS bit threshold of TX rings to N "
"(0 <= N <= value of txd).\n");
- printf(" --txqflags=0xXXXXXXXX: hexadecimal bitmask of TX queue flags "
- "(0 <= N <= 0x7FFFFFFF).\n");
printf(" --tx-queue-stats-mapping=(port,queue,mapping)[,(port,queue,mapping]: "
"tx queues statistics counters mapping "
"(0 <= mapping <= %d).\n", RTE_ETHDEV_QUEUE_STAT_CNTRS - 1);
@@ -632,7 +630,6 @@ launch_args_parse(int argc, char** argv)
{ "txwt", 1, 0, 0 },
{ "txfreet", 1, 0, 0 },
{ "txrst", 1, 0, 0 },
- { "txqflags", 1, 0, 0 },
{ "rxpt", 1, 0, 0 },
{ "rxht", 1, 0, 0 },
{ "rxwt", 1, 0, 0 },
@@ -1006,15 +1003,6 @@ launch_args_parse(int argc, char** argv)
else
rte_exit(EXIT_FAILURE, "txrst must be >= 0\n");
}
- if (!strcmp(lgopts[opt_idx].name, "txqflags")) {
- char *end = NULL;
- n = strtoul(optarg, &end, 16);
- if (n >= 0)
- txq_flags = (int32_t)n;
- else
- rte_exit(EXIT_FAILURE,
- "txqflags must be >= 0\n");
- }
if (!strcmp(lgopts[opt_idx].name, "rxd")) {
n = atoi(optarg);
if (n > 0) {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 806548196..91dcb31c0 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -259,11 +259,6 @@ int16_t tx_free_thresh = RTE_PMD_PARAM_UNSET;
int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;

/*
- * Configurable value of TX queue flags.
- */
-int32_t txq_flags = RTE_PMD_PARAM_UNSET;
-
-/*
* Receive Side Scaling (RSS) configuration.
*/
uint64_t rss_hf = ETH_RSS_IP; /* RSS IP by default. */
@@ -2084,9 +2079,6 @@ rxtx_port_config(struct rte_port *port)

if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
port->tx_conf.tx_free_thresh = tx_free_thresh;
-
- if (txq_flags != RTE_PMD_PARAM_UNSET)
- port->tx_conf.txq_flags = txq_flags;
}

void
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 3e63edfa1..c9af41cfa 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -409,7 +409,6 @@ extern int16_t rx_free_thresh;
extern int8_t rx_drop_en;
extern int16_t tx_free_thresh;
extern int16_t tx_rs_thresh;
-extern int32_t txq_flags;

extern uint8_t dcb_config;
extern uint8_t dcb_test;
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index fface6f58..be9a2cdd1 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -447,18 +447,6 @@ The commandline options are:
Set the transmit RS bit threshold of TX rings to N, where 0 <= N <= value of ``--txd``.
The default value is 0.

-* ``--txqflags=0xXXXXXXXX``
-
- Set the hexadecimal bitmask of TX queue flags, where 0 <= N <= 0x7FFFFFFF.
- The default value is 0.
-
- .. note::
-
- When using hardware offload functions such as vlan or checksum
- add ``txqflags=0`` to force the full-featured TX code path.
- In some PMDs this may already be the default.
-
-
* ``--rx-queue-stats-mapping=(port,queue,mapping)[,(port,queue,mapping)]``

Set the RX queues statistics counters mapping 0 <= mapping <= 15.
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 2b00be81c..7d3a7ae93 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -354,8 +354,6 @@ The available information categories are:
also modify the default hierarchy or specify the new hierarchy through CLI for
implementing QoS scheduler. Requires ``CONFIG_RTE_LIBRTE_PMD_SOFTNIC=y`` ``CONFIG_RTE_LIBRTE_SCHED=y``.

-Note: TX timestamping is only available in the "Full Featured" TX path. To force ``testpmd`` into this mode set ``--txqflags=0``.
-
Example::

testpmd> set fwd rxonly
@@ -1681,15 +1679,6 @@ RX scatter mode is off by default.

The ``on`` option is equivalent to the ``--enable-scatter`` command-line option.

-port config - TX queue flags
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Set a hexadecimal bitmap of TX queue flags for all ports::
-
- testpmd> port config all txqflags value
-
-This command is equivalent to the ``--txqflags`` command-line option.
-
port config - RX Checksum
~~~~~~~~~~~~~~~~~~~~~~~~~
--
2.12.0
Lu, Wenzhuo
2018-01-09 07:17:24 UTC
Permalink
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 08/10] app/testpmd: remove txqflags
Since testpmd is now using the new Ethdev offloads API and there is a way
configure each of the tx offloads from CLI or command line, there is no need
for the txqflags configuration anymore.
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
806548196..91dcb31c0 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -259,11 +259,6 @@ int16_t tx_free_thresh = RTE_PMD_PARAM_UNSET;
int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;
/*
- * Configurable value of TX queue flags.
- */
-int32_t txq_flags = RTE_PMD_PARAM_UNSET;
-
-/*
* Receive Side Scaling (RSS) configuration.
*/
@@ rxtx_port_config(struct rte_port *port)
if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
port->tx_conf.tx_free_thresh = tx_free_thresh;
-
- if (txq_flags != RTE_PMD_PARAM_UNSET)
- port->tx_conf.txq_flags = txq_flags;
I think we have some problem if just remove this code. Because port->tx_conf.txq_flags is used by many NICs. If txqflags is removed, all these NICs have to use the default value and have no chance to change it. I think it's a good idea to use tx-offloads to replace txqflags, but we may need to clear the drivers' code first.
Shahaf Shuler
2018-01-09 10:07:35 UTC
Permalink
Tuesday, January 9, 2018 9:17 AM, Lu, Wenzhuo:

--Shahaf
-----Original Message-----
Sent: Tuesday, January 9, 2018 9:17 AM
Subject: RE: [dpdk-dev] [PATCH v3 08/10] app/testpmd: remove txqflags
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 08/10] app/testpmd: remove txqflags
Since testpmd is now using the new Ethdev offloads API and there is a
way configure each of the tx offloads from CLI or command line, there
is no need for the txqflags configuration anymore.
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
806548196..91dcb31c0 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -259,11 +259,6 @@ int16_t tx_free_thresh =
RTE_PMD_PARAM_UNSET;
int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;
/*
- * Configurable value of TX queue flags.
- */
-int32_t txq_flags = RTE_PMD_PARAM_UNSET;
-
-/*
* Receive Side Scaling (RSS) configuration.
*/
if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
port->tx_conf.tx_free_thresh = tx_free_thresh;
-
- if (txq_flags != RTE_PMD_PARAM_UNSET)
- port->tx_conf.txq_flags = txq_flags;
I think we have some problem if just remove this code. Because port-
tx_conf.txq_flags is used by many NICs. If txqflags is removed, all these
NICs have to use the default value and have no chance to change it. I think
it's a good idea to use tx-offloads to replace txqflags, but we may need to
clear the drivers' code first.
There is an internal function in ethdev which do translation from the Tx offloads to the txqflags. Checkout ``rte_eth_convert_txq_offloads``.
This is specifically to support PMDs which still use the old offloads API.

So in fact application needs only to specify the Tx offloads on the tx_conf and those will be converted to txqflags. The PMD see no difference.
Lu, Wenzhuo
2018-01-09 11:51:05 UTC
Permalink
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, January 9, 2018 6:08 PM
Subject: RE: [dpdk-dev] [PATCH v3 08/10] app/testpmd: remove txqflags
--Shahaf
-----Original Message-----
Sent: Tuesday, January 9, 2018 9:17 AM
Subject: RE: [dpdk-dev] [PATCH v3 08/10] app/testpmd: remove txqflags
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 08/10] app/testpmd: remove txqflags
Since testpmd is now using the new Ethdev offloads API and there is
a way configure each of the tx offloads from CLI or command line,
there is no need for the txqflags configuration anymore.
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
806548196..91dcb31c0 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -259,11 +259,6 @@ int16_t tx_free_thresh =
RTE_PMD_PARAM_UNSET;
int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;
/*
- * Configurable value of TX queue flags.
- */
-int32_t txq_flags = RTE_PMD_PARAM_UNSET;
-
-/*
* Receive Side Scaling (RSS) configuration.
*/
if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
port->tx_conf.tx_free_thresh = tx_free_thresh;
-
- if (txq_flags != RTE_PMD_PARAM_UNSET)
- port->tx_conf.txq_flags = txq_flags;
I think we have some problem if just remove this code. Because port-
tx_conf.txq_flags is used by many NICs. If txqflags is removed, all these
NICs have to use the default value and have no chance to change it. I
think it's a good idea to use tx-offloads to replace txqflags, but we
may need to clear the drivers' code first.
There is an internal function in ethdev which do translation from the Tx
offloads to the txqflags. Checkout ``rte_eth_convert_txq_offloads``.
This is specifically to support PMDs which still use the old offloads API.
So in fact application needs only to specify the Tx offloads on the tx_conf
and those will be converted to txqflags. The PMD see no difference.
Yes, you're right, the convert code is already merged.

Acked-by: Wenzhuo Lu <***@intel.com>
Shahaf Shuler
2017-12-26 09:44:23 UTC
Permalink
In the current design it was possible for offload to be set even though
the device is not supporting it. A warning message was printed instead.

This is a wrong behaviour, as application should set only the offloads
reported by the capabilities of the device.

This patch adds verification for the offloads being set and make sure
the offload configuration passed to the device always match its
capabilities.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 103 +++++++++++++++++++++++++++++++++-----------
app/test-pmd/config.c | 14 ++++++
2 files changed, 92 insertions(+), 25 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index b4ef1d0eb..d1b8dab6e 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3638,6 +3638,7 @@ cmd_csum_parsed(void *parsed_result,
struct cmd_csum_result *res = parsed_result;
int hw = 0;
uint64_t csum_offloads = 0;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
printf("invalid port %d\n", res->port_id);
@@ -3648,21 +3649,53 @@ cmd_csum_parsed(void *parsed_result,
return;
}

+ rte_eth_dev_info_get(res->port_id, &dev_info);
if (!strcmp(res->mode, "set")) {

if (!strcmp(res->hwsw, "hw"))
hw = 1;

if (!strcmp(res->proto, "ip")) {
- csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_IPV4_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
+ } else {
+ printf("IP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "udp")) {
- csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_UDP_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+ } else {
+ printf("UDP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "tcp")) {
- csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_TCP_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ } else {
+ printf("TCP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "sctp")) {
- csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_SCTP_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
+ } else {
+ printf("SCTP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "outer-ip")) {
- csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
+ csum_offloads |=
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+ } else {
+ printf("Outer IP checksum offload is not "
+ "supported by port %u\n", res->port_id);
+ }
}

if (hw) {
@@ -3805,6 +3838,14 @@ cmd_tso_set_parsed(void *parsed_result,
if (!strcmp(res->mode, "set"))
ports[res->port_id].tso_segsz = res->tso_segsz;

+ rte_eth_dev_info_get(res->port_id, &dev_info);
+ if ((ports[res->port_id].tso_segsz != 0) &&
+ (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
+ printf("Error: TSO is not supported by port %d\n",
+ res->port_id);
+ return;
+ }
+
if (ports[res->port_id].tso_segsz == 0) {
ports[res->port_id].dev_conf.txmode.offloads &=
~DEV_TX_OFFLOAD_TCP_TSO;
@@ -3881,24 +3922,25 @@ struct cmd_tunnel_tso_set_result {
portid_t port_id;
};

-static void
+static struct rte_eth_dev_info
check_tunnel_tso_nic_support(portid_t port_id)
{
struct rte_eth_dev_info dev_info;

rte_eth_dev_info_get(port_id, &dev_info);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
- printf("Warning: TSO enabled but VXLAN TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: VXLAN TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO))
- printf("Warning: TSO enabled but GRE TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: GRE TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO))
- printf("Warning: TSO enabled but IPIP TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: IPIP TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO))
- printf("Warning: TSO enabled but GENEVE TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: GENEVE TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
+ return dev_info;
}

static void
@@ -3907,6 +3949,7 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_tunnel_tso_set_result *res = parsed_result;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
@@ -3918,6 +3961,7 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
if (!strcmp(res->mode, "set"))
ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;

+ dev_info = check_tunnel_tso_nic_support(res->port_id);
if (ports[res->port_id].tunnel_tso_segsz == 0) {
ports[res->port_id].dev_conf.txmode.offloads &=
~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
@@ -3926,11 +3970,13 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO for tunneled packets is disabled\n");
} else {
+ uint64_t tso_offloads = (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
+
ports[res->port_id].dev_conf.txmode.offloads |=
- (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
- DEV_TX_OFFLOAD_GRE_TNL_TSO |
- DEV_TX_OFFLOAD_IPIP_TNL_TSO |
- DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
+ (tso_offloads & dev_info.tx_offload_capa);
printf("TSO segment size for tunneled packets is %d\n",
ports[res->port_id].tunnel_tso_segsz);

@@ -3945,7 +3991,6 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
* is not necessary for IPv6 tunneled pkts because there's no
* checksum in IP header anymore.
*/
- check_tunnel_tso_nic_support(res->port_id);

if (!ports[res->port_id].parse_tunnel)
printf("Warning: csum parse_tunnel must be set "
@@ -12995,6 +13040,7 @@ cmd_set_macsec_offload_on_parsed(
portid_t port_id = res->port_id;
int en = (strcmp(res->en_on_off, "on") == 0) ? 1 : 0;
int rp = (strcmp(res->rp_on_off, "on") == 0) ? 1 : 0;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
@@ -13003,15 +13049,19 @@ cmd_set_macsec_offload_on_parsed(
return;
}

- ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
#ifdef RTE_LIBRTE_IXGBE_PMD
- ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
+ ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
#endif
+ }
RTE_SET_USED(en);
RTE_SET_USED(rp);

switch (ret) {
case 0:
+ ports[port_id].dev_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_MACSEC_INSERT;
cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
@@ -13083,6 +13133,7 @@ cmd_set_macsec_offload_off_parsed(
{
struct cmd_macsec_offload_off_result *res = parsed_result;
int ret = -ENOTSUP;
+ struct rte_eth_dev_info dev_info;
portid_t port_id = res->port_id;

if (port_id_is_invalid(port_id, ENABLED_WARN))
@@ -13092,14 +13143,16 @@ cmd_set_macsec_offload_off_parsed(
return;
}

- ports[port_id].dev_conf.txmode.offloads &=
- ~DEV_TX_OFFLOAD_MACSEC_INSERT;
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
#ifdef RTE_LIBRTE_IXGBE_PMD
- ret = rte_pmd_ixgbe_macsec_disable(port_id);
+ ret = rte_pmd_ixgbe_macsec_disable(port_id);
#endif
-
+ }
switch (ret) {
case 0:
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_MACSEC_INSERT;
cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index faccb84ca..d32a4672b 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2792,6 +2792,7 @@ void
tx_vlan_set(portid_t port_id, uint16_t vlan_id)
{
int vlan_offload;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
@@ -2803,6 +2804,12 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)
printf("Error, as QinQ has been enabled.\n");
return;
}
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) == 0) {
+ printf("Error: vlan insert is not supported by port %d\n",
+ port_id);
+ return;
+ }

tx_vlan_reset(port_id);
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
@@ -2813,6 +2820,7 @@ void
tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
{
int vlan_offload;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
@@ -2826,6 +2834,12 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
printf("Error, as QinQ hasn't been enabled.\n");
return;
}
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) {
+ printf("Error: qinq insert not supported by port %d\n",
+ port_id);
+ return;
+ }

tx_vlan_reset(port_id);
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
--
2.12.0
Lu, Wenzhuo
2018-01-09 07:48:16 UTC
Permalink
Hi,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 09/10] app/testpmd: enforce offloads caps
In the current design it was possible for offload to be set even though the
device is not supporting it. A warning message was printed instead.
This is a wrong behaviour, as application should set only the offloads
reported by the capabilities of the device.
This patch adds verification for the offloads being set and make sure the
offload configuration passed to the device always match its capabilities.
Acked-by: Wenzhuo Lu <***@intel.com>
Shahaf Shuler
2017-12-26 09:44:24 UTC
Permalink
On ethdev there is an API to configure VLAN offloads after the port
was started and without reconfiguration of the port or queues.

In the current design of the application, when the Rx offloads are
changed (through "port config all" CLI command) the port configuration
is overwritten, therefore the configuration made for the VLAN is lost.

This patch is to address the issue by a configuration of each port Rx
offloads separately instead of using the global Rx config.

Fixes: 6dbb2b336586 ("app/testpmd: convert to new Ethdev Rx offloads API")

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 217 +++++++++++++++++++++++---------------------
app/test-pmd/config.c | 27 ++++--
app/test-pmd/testpmd.c | 2 +-
3 files changed, 135 insertions(+), 111 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index d1b8dab6e..00a229a41 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1577,34 +1577,38 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_max_pkt_len_result *res = parsed_result;
- uint64_t rx_offloads = rx_mode.offloads;
+ portid_t pid;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
return;
}

- if (!strcmp(res->name, "max-pkt-len")) {
- if (res->value < ETHER_MIN_LEN) {
- printf("max-pkt-len can not be less than %d\n",
- ETHER_MIN_LEN);
+ RTE_ETH_FOREACH_DEV(pid) {
+ struct rte_port *port = &ports[pid];
+ uint64_t rx_offloads = port->dev_conf.rxmode.offloads;
+
+ if (!strcmp(res->name, "max-pkt-len")) {
+ if (res->value < ETHER_MIN_LEN) {
+ printf("max-pkt-len can not be less than %d\n",
+ ETHER_MIN_LEN);
+ return;
+ }
+ if (res->value == port->dev_conf.rxmode.max_rx_pkt_len)
+ return;
+
+ port->dev_conf.rxmode.max_rx_pkt_len = res->value;
+ if (res->value > ETHER_MAX_LEN)
+ rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+ else
+ rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
+ port->dev_conf.rxmode.offloads = rx_offloads;
+ } else {
+ printf("Unknown parameter\n");
return;
}
- if (res->value == rx_mode.max_rx_pkt_len)
- return;
-
- rx_mode.max_rx_pkt_len = res->value;
- if (res->value > ETHER_MAX_LEN)
- rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
- else
- rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
- } else {
- printf("Unknown parameter\n");
- return;
}

- rx_mode.offloads = rx_offloads;
-
init_port_config();

cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
@@ -1706,103 +1710,108 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_rx_mode_flag *res = parsed_result;
- uint64_t rx_offloads = rx_mode.offloads;
+ portid_t pid;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
return;
}

- if (!strcmp(res->name, "crc-strip")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "scatter")) {
- if (!strcmp(res->value, "on")) {
- rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
- } else if (!strcmp(res->value, "off")) {
- rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ RTE_ETH_FOREACH_DEV(pid) {
+ struct rte_port *port;
+ uint64_t rx_offloads;
+
+ port = &ports[pid];
+ rx_offloads = port->dev_conf.rxmode.offloads;
+ if (!strcmp(res->name, "crc-strip")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "scatter")) {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ } else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "rx-cksum")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "rx-timestamp")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan")) {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
+ } else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-filter")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-strip")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-extend")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "drop-en")) {
+ if (!strcmp(res->value, "on"))
+ rx_drop_en = 1;
+ else if (!strcmp(res->value, "off"))
+ rx_drop_en = 0;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
} else {
printf("Unknown parameter\n");
return;
}
- } else if (!strcmp(res->name, "rx-cksum")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "rx-timestamp")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan")) {
- if (!strcmp(res->value, "on")) {
- rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
- DEV_RX_OFFLOAD_VLAN_STRIP);
- }
- else if (!strcmp(res->value, "off")) {
- rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
- DEV_RX_OFFLOAD_VLAN_STRIP);
- }
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan-filter")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan-strip")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan-extend")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "drop-en")) {
- if (!strcmp(res->value, "on"))
- rx_drop_en = 1;
- else if (!strcmp(res->value, "off"))
- rx_drop_en = 0;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else {
- printf("Unknown parameter\n");
- return;
+ port->dev_conf.rxmode.offloads = rx_offloads;
}
- rx_mode.offloads = rx_offloads;

init_port_config();

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index d32a4672b..da968cb64 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2665,21 +2665,26 @@ vlan_extend_set(portid_t port_id, int on)
{
int diag;
int vlan_offload;
+ uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

vlan_offload = rte_eth_dev_get_vlan_offload(port_id);

- if (on)
+ if (on) {
vlan_offload |= ETH_VLAN_EXTEND_OFFLOAD;
- else
+ port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
+ } else {
vlan_offload &= ~ETH_VLAN_EXTEND_OFFLOAD;
+ port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
+ }

diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
if (diag < 0)
printf("rx_vlan_extend_set(port_pi=%d, on=%d) failed "
"diag=%d\n", port_id, on, diag);
+ ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
}

void
@@ -2687,21 +2692,26 @@ rx_vlan_strip_set(portid_t port_id, int on)
{
int diag;
int vlan_offload;
+ uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

vlan_offload = rte_eth_dev_get_vlan_offload(port_id);

- if (on)
+ if (on) {
vlan_offload |= ETH_VLAN_STRIP_OFFLOAD;
- else
+ port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+ } else {
vlan_offload &= ~ETH_VLAN_STRIP_OFFLOAD;
+ port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+ }

diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
if (diag < 0)
printf("rx_vlan_strip_set(port_pi=%d, on=%d) failed "
"diag=%d\n", port_id, on, diag);
+ ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
}

void
@@ -2723,21 +2733,26 @@ rx_vlan_filter_set(portid_t port_id, int on)
{
int diag;
int vlan_offload;
+ uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

vlan_offload = rte_eth_dev_get_vlan_offload(port_id);

- if (on)
+ if (on) {
vlan_offload |= ETH_VLAN_FILTER_OFFLOAD;
- else
+ port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
+ } else {
vlan_offload &= ~ETH_VLAN_FILTER_OFFLOAD;
+ port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
+ }

diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
if (diag < 0)
printf("rx_vlan_filter_set(port_pi=%d, on=%d) failed "
"diag=%d\n", port_id, on, diag);
+ ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
}

int
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 91dcb31c0..c1fb387fb 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -603,6 +603,7 @@ init_config(void)
port = &ports[pid];
/* Apply default Tx configuration for all ports */
port->dev_conf.txmode = tx_mode;
+ port->dev_conf.rxmode = rx_mode;
rte_eth_dev_info_get(pid, &port->dev_info);

if (numa_support) {
@@ -2089,7 +2090,6 @@ init_port_config(void)

RTE_ETH_FOREACH_DEV(pid) {
port = &ports[pid];
- port->dev_conf.rxmode = rx_mode;
port->dev_conf.fdir_conf = fdir_conf;
if (nb_rxq > 1) {
port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
--
2.12.0
Lu, Wenzhuo
2018-01-09 08:05:58 UTC
Permalink
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, December 26, 2017 5:44 PM
Subject: [dpdk-dev] [PATCH v3 10/10] app/testpmd: fix on the flight VLAN
configuration
On ethdev there is an API to configure VLAN offloads after the port was
started and without reconfiguration of the port or queues.
In the current design of the application, when the Rx offloads are changed
(through "port config all" CLI command) the port configuration is overwritten,
therefore the configuration made for the VLAN is lost.
This patch is to address the issue by a configuration of each port Rx offloads
separately instead of using the global Rx config.
Fixes: 6dbb2b336586 ("app/testpmd: convert to new Ethdev Rx offloads API")
This patch is not applied yet. The number 6dbb2b336586 could be meaningless. If the previous patch need to be fixed, may I suggest just merge this one to that? Or this patch fixes some older issues actually?
Shahaf Shuler
2018-01-09 10:03:43 UTC
Permalink
Post by Lu, Wenzhuo
Subject: [dpdk-dev] [PATCH v3 10/10] app/testpmd: fix on the flight
VLAN configuration
On ethdev there is an API to configure VLAN offloads after the port
was started and without reconfiguration of the port or queues.
In the current design of the application, when the Rx offloads are
changed (through "port config all" CLI command) the port configuration
is overwritten, therefore the configuration made for the VLAN is lost.
This patch is to address the issue by a configuration of each port Rx
offloads separately instead of using the global Rx config.
Fixes: 6dbb2b336586 ("app/testpmd: convert to new Ethdev Rx offloads API")
This patch is not applied yet. The number 6dbb2b336586 could be
meaningless. If the previous patch need to be fixed, may I suggest just
merge this one to that? Or this patch fixes some older issues actually?
Well, this was done per Ferruh's request to better split the patches.

I can merge it with the Rx one, agreed?
Lu, Wenzhuo
2018-01-09 11:44:44 UTC
Permalink
Hi Shahaf,
-----Original Message-----
Sent: Tuesday, January 9, 2018 6:04 PM
Subject: RE: [dpdk-dev] [PATCH v3 10/10] app/testpmd: fix on the flight
VLAN configuration
Post by Lu, Wenzhuo
Subject: [dpdk-dev] [PATCH v3 10/10] app/testpmd: fix on the flight
VLAN configuration
On ethdev there is an API to configure VLAN offloads after the port
was started and without reconfiguration of the port or queues.
In the current design of the application, when the Rx offloads are
changed (through "port config all" CLI command) the port
configuration is overwritten, therefore the configuration made for the
VLAN is lost.
Post by Lu, Wenzhuo
This patch is to address the issue by a configuration of each port
Rx offloads separately instead of using the global Rx config.
Fixes: 6dbb2b336586 ("app/testpmd: convert to new Ethdev Rx offloads API")
This patch is not applied yet. The number 6dbb2b336586 could be
meaningless. If the previous patch need to be fixed, may I suggest
just merge this one to that? Or this patch fixes some older issues actually?
Well, this was done per Ferruh's request to better split the patches.
I can merge it with the Rx one, agreed?
I think this patch fixes the bug in the old code. This bug is not introduced by "app/testpmd: convert to new Ethdev Rx offloads API". You set this fixes tag only because the code is changed so much by "app/testpmd: convert to new Ethdev Rx offloads API". It's helpful to create an individual patch. To my opinion, just remove the fixes tag is enough.
Shahaf Shuler
2018-01-10 09:09:08 UTC
Permalink
This series is to convert testpmd application to the new offloads API [1].

on v4:
- Enable FAST_FREE Tx offload by default if device supports.
- Fix commit log for the VLAN configuration patch.

on v3:
- Remove warn prints on bad offloads configuration from application.

on v2:
- Splited the patchset to multiple patches to help with the review.
- Removed wrong comments.
- Removed redundent parenthesis.
- Fixed port print parameters.
- Introduced a new method to check if single port is stopped.
- Cleanup for internal Tx offloads flags.

[1] http://dpdk.org/ml/archives/dev/2017-October/077329.html

Shahaf Shuler (11):
app/testpmd: fix port configuration print
app/testpmd: convert to new Ethdev Rx offloads API
app/testpmd: support check of single port stop
app/testpmd: convert to new Ethdev Tx offloads API
app/testpmd: fix flowgen forwarding ol flags
app/testpmd: cleanup internal Tx offloads flags field
app/testpmd: add command line option for Tx offloads
app/testpmd: remove txqflags
app/testpmd: enforce offloads caps
app/testpmd: adjust on the flight VLAN configuration
app/testpmd: enable fast free Tx offload by default

app/test-pmd/cmdline.c | 501 +++++++++++++----------
app/test-pmd/config.c | 177 +++++---
app/test-pmd/csumonly.c | 40 +-
app/test-pmd/flowgen.c | 12 +-
app/test-pmd/macfwd.c | 8 +-
app/test-pmd/macswap.c | 8 +-
app/test-pmd/parameters.c | 59 +--
app/test-pmd/testpmd.c | 58 +--
app/test-pmd/testpmd.h | 26 +-
app/test-pmd/txonly.c | 8 +-
doc/guides/testpmd_app_ug/run_app.rst | 17 +-
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 11 -
12 files changed, 522 insertions(+), 403 deletions(-)
--
2.12.0
Shahaf Shuler
2018-01-10 09:09:09 UTC
Permalink
The print of the port configuration was only according to configuration
of the first port.

Fixes: f2c5125a686a ("app/testpmd: use default Rx/Tx port configuration")
Cc: ***@intel.com
Cc: ***@dpdk.org

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Wenzhuo Lu <***@intel.com>
---
app/test-pmd/config.c | 48 +++++++++++++++++++++++++++++-----------------
1 file changed, 30 insertions(+), 18 deletions(-)

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 86ca3aaef..387fefbaa 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1656,33 +1656,45 @@ fwd_lcores_config_display(void)
void
rxtx_config_display(void)
{
- printf(" %s packet forwarding%s - CRC stripping %s - "
- "packets/burst=%d\n", cur_fwd_eng->fwd_mode_name,
+ portid_t pid;
+
+ printf(" %s packet forwarding%s packets/burst=%d\n",
+ cur_fwd_eng->fwd_mode_name,
retry_enabled == 0 ? "" : " with retry",
- rx_mode.hw_strip_crc ? "enabled" : "disabled",
nb_pkt_per_burst);

if (cur_fwd_eng == &tx_only_engine || cur_fwd_eng == &flow_gen_engine)
printf(" packet len=%u - nb packet segments=%d\n",
(unsigned)tx_pkt_length, (int) tx_pkt_nb_segs);

- struct rte_eth_rxconf *rx_conf = &ports[0].rx_conf;
- struct rte_eth_txconf *tx_conf = &ports[0].tx_conf;
-
printf(" nb forwarding cores=%d - nb forwarding ports=%d\n",
nb_fwd_lcores, nb_fwd_ports);
- printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n",
- nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
- printf(" RX threshold registers: pthresh=%d hthresh=%d wthresh=%d\n",
- rx_conf->rx_thresh.pthresh, rx_conf->rx_thresh.hthresh,
- rx_conf->rx_thresh.wthresh);
- printf(" TX queues=%d - TX desc=%d - TX free threshold=%d\n",
- nb_txq, nb_txd, tx_conf->tx_free_thresh);
- printf(" TX threshold registers: pthresh=%d hthresh=%d wthresh=%d\n",
- tx_conf->tx_thresh.pthresh, tx_conf->tx_thresh.hthresh,
- tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+
+ RTE_ETH_FOREACH_DEV(pid) {
+ struct rte_eth_rxconf *rx_conf = &ports[pid].rx_conf;
+ struct rte_eth_txconf *tx_conf = &ports[pid].tx_conf;
+
+ printf(" port %d:\n", (unsigned int)pid);
+ printf(" CRC stripping %s\n",
+ ports[pid].dev_conf.rxmode.hw_strip_crc ?
+ "enabled" : "disabled");
+ printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n",
+ nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
+ printf(" RX threshold registers: pthresh=%d hthresh=%d "
+ " wthresh=%d\n",
+ rx_conf->rx_thresh.pthresh,
+ rx_conf->rx_thresh.hthresh,
+ rx_conf->rx_thresh.wthresh);
+ printf(" TX queues=%d - TX desc=%d - TX free threshold=%d\n",
+ nb_txq, nb_txd, tx_conf->tx_free_thresh);
+ printf(" TX threshold registers: pthresh=%d hthresh=%d "
+ " wthresh=%d\n",
+ tx_conf->tx_thresh.pthresh,
+ tx_conf->tx_thresh.hthresh,
+ tx_conf->tx_thresh.wthresh);
+ printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
+ tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ }
}

void
--
2.12.0
Shahaf Shuler
2018-01-10 09:09:10 UTC
Permalink
Ethdev Rx offloads API has changed since:

commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")

Convert the application to use the new API. The is no functionality
changes rather simple conversion of the flags.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Wenzhuo Lu <***@intel.com>
---
app/test-pmd/cmdline.c | 51 +++++++++++++++++++++++-------------------
app/test-pmd/config.c | 36 +++++++++++++++++++----------
app/test-pmd/parameters.c | 32 +++++++++++++-------------
app/test-pmd/testpmd.c | 19 +++++++---------
4 files changed, 77 insertions(+), 61 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d96301..d8c73a9b1 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1577,6 +1577,7 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_max_pkt_len_result *res = parsed_result;
+ uint64_t rx_offloads = rx_mode.offloads;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@@ -1594,14 +1595,16 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,

rx_mode.max_rx_pkt_len = res->value;
if (res->value > ETHER_MAX_LEN)
- rx_mode.jumbo_frame = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
else
- rx_mode.jumbo_frame = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
} else {
printf("Unknown parameter\n");
return;
}

+ rx_mode.offloads = rx_offloads;
+
init_port_config();

cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
@@ -1703,6 +1706,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_rx_mode_flag *res = parsed_result;
+ uint64_t rx_offloads = rx_mode.offloads;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@@ -1711,48 +1715,48 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,

if (!strcmp(res->name, "crc-strip")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_strip_crc = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "scatter")) {
- if (!strcmp(res->value, "on"))
- rx_mode.enable_scatter = 1;
- else if (!strcmp(res->value, "off"))
- rx_mode.enable_scatter = 0;
- else {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ } else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "rx-cksum")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_ip_checksum = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_ip_checksum = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "rx-timestamp")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_timestamp = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_timestamp = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan")) {
if (!strcmp(res->value, "on")) {
- rx_mode.hw_vlan_filter = 1;
- rx_mode.hw_vlan_strip = 1;
+ rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
}
else if (!strcmp(res->value, "off")) {
- rx_mode.hw_vlan_filter = 0;
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
}
else {
printf("Unknown parameter\n");
@@ -1760,27 +1764,27 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
}
} else if (!strcmp(res->name, "hw-vlan-filter")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_filter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_filter = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan-strip")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_strip = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
else {
printf("Unknown parameter\n");
return;
}
} else if (!strcmp(res->name, "hw-vlan-extend")) {
if (!strcmp(res->value, "on"))
- rx_mode.hw_vlan_extend = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
else if (!strcmp(res->value, "off"))
- rx_mode.hw_vlan_extend = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
else {
printf("Unknown parameter\n");
return;
@@ -1798,6 +1802,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
printf("Unknown parameter\n");
return;
}
+ rx_mode.offloads = rx_offloads;

init_port_config();

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 387fefbaa..3bc99be76 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -540,14 +540,12 @@ port_infos_display(portid_t port_id)
void
port_offload_cap_display(portid_t port_id)
{
- struct rte_eth_dev *dev;
struct rte_eth_dev_info dev_info;
static const char *info_border = "************";

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

- dev = &rte_eth_devices[port_id];
rte_eth_dev_info_get(port_id, &dev_info);

printf("\n%s Port %d supported offload features: %s\n",
@@ -555,7 +553,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_VLAN_STRIP) {
printf("VLAN stripped: ");
- if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_VLAN_STRIP)
printf("on\n");
else
printf("off\n");
@@ -563,7 +562,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_QINQ_STRIP) {
printf("Double VLANs stripped: ");
- if (dev->data->dev_conf.rxmode.hw_vlan_extend)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_VLAN_EXTEND)
printf("on\n");
else
printf("off\n");
@@ -571,7 +571,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
printf("RX IPv4 checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -579,7 +580,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM) {
printf("RX UDP checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_UDP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -587,18 +589,26 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
printf("RX TCP checksum: ");
- if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TCP_CKSUM)
printf("on\n");
else
printf("off\n");
}

- if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
- printf("RX Outer IPv4 checksum: on");
+ if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) {
+ printf("RX Outer IPv4 checksum: ");
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
+ printf("on\n");
+ else
+ printf("off\n");
+ }

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO) {
printf("Large receive offload: ");
- if (dev->data->dev_conf.rxmode.enable_lro)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TCP_LRO)
printf("on\n");
else
printf("off\n");
@@ -615,7 +625,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TIMESTAMP) {
printf("HW timestamp: ");
- if (dev->data->dev_conf.rxmode.hw_timestamp)
+ if (ports[port_id].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_TIMESTAMP)
printf("on\n");
else
printf("off\n");
@@ -1676,7 +1687,8 @@ rxtx_config_display(void)

printf(" port %d:\n", (unsigned int)pid);
printf(" CRC stripping %s\n",
- ports[pid].dev_conf.rxmode.hw_strip_crc ?
+ (ports[pid].dev_conf.rxmode.offloads &
+ DEV_RX_OFFLOAD_CRC_STRIP) ?
"enabled" : "disabled");
printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n",
nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 84e7a63ef..263651cba 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -566,6 +566,8 @@ launch_args_parse(int argc, char** argv)
char **argvopt;
int opt_idx;
enum { TX, RX };
+ /* Default Rx offloads for all ports. */
+ uint64_t rx_offloads = rx_mode.offloads;

static struct option lgopts[] = {
{ "help", 0, 0, 0 },
@@ -804,7 +806,8 @@ launch_args_parse(int argc, char** argv)
if (n >= ETHER_MIN_LEN) {
rx_mode.max_rx_pkt_len = (uint32_t) n;
if (n > ETHER_MAX_LEN)
- rx_mode.jumbo_frame = 1;
+ rx_offloads |=
+ DEV_RX_OFFLOAD_JUMBO_FRAME;
} else
rte_exit(EXIT_FAILURE,
"Invalid max-pkt-len=%d - should be > %d\n",
@@ -897,34 +900,30 @@ launch_args_parse(int argc, char** argv)
}
#endif
if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
- rx_mode.hw_strip_crc = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
- rx_mode.enable_lro = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
- rx_mode.enable_scatter = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum"))
- rx_mode.hw_ip_checksum = 1;
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
if (!strcmp(lgopts[opt_idx].name,
"enable-rx-timestamp"))
- rx_mode.hw_timestamp = 1;
-
- if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) {
- rx_mode.hw_vlan_filter = 0;
- rx_mode.hw_vlan_strip = 0;
- rx_mode.hw_vlan_extend = 0;
- }
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
+ if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-filter"))
- rx_mode.hw_vlan_filter = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-strip"))
- rx_mode.hw_vlan_strip = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;

if (!strcmp(lgopts[opt_idx].name,
"disable-hw-vlan-extend"))
- rx_mode.hw_vlan_extend = 0;
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;

if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))
rx_drop_en = 1;
@@ -1140,4 +1139,7 @@ launch_args_parse(int argc, char** argv)
break;
}
}
+
+ /* Set offload configuration from command line parameters. */
+ rx_mode.offloads = rx_offloads;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index c3ab44849..6785b095f 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1;
*/
struct rte_eth_rxmode rx_mode = {
.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */
- .split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled. */
- .hw_ip_checksum = 0, /**< IP checksum offload disabled. */
- .hw_vlan_filter = 1, /**< VLAN filtering enabled. */
- .hw_vlan_strip = 1, /**< VLAN strip enabled. */
- .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */
- .hw_strip_crc = 1, /**< CRC stripping by hardware enabled. */
- .hw_timestamp = 0, /**< HW timestamp enabled. */
+ .offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP |
+ DEV_RX_OFFLOAD_CRC_STRIP),
+ .ignore_offload_bitfield = 1,
};

struct rte_fdir_conf fdir_conf = {
@@ -1521,6 +1516,8 @@ start_port(portid_t pid)
port->need_reconfig_queues = 1;
return -1;
}
+ /* Apply Rx offloads configuration */
+ port->rx_conf.offloads = port->dev_conf.rxmode.offloads;
/* setup rx queues */
for (qi = 0; qi < nb_rxq; qi++) {
if ((numa_support) &&
@@ -2252,7 +2249,7 @@ init_port_dcb_config(portid_t pid,
retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
if (retval < 0)
return retval;
- port_conf.rxmode.hw_vlan_filter = 1;
+ port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;

/**
* Write the configuration into the device.
@@ -2301,7 +2298,7 @@ init_port_dcb_config(portid_t pid,

rxtx_port_config(rte_port);
/* VLAN filter */
- rte_port->dev_conf.rxmode.hw_vlan_filter = 1;
+ rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
for (i = 0; i < RTE_DIM(vlan_tags); i++)
rx_vft_set(pid, vlan_tags[i], 1);
--
2.12.0
Shahaf Shuler
2018-01-10 09:09:11 UTC
Permalink
This patch adds supports for checking if a single port is stopped.
currently there is a function to check only for all ports.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Wenzhuo Lu <***@intel.com>
---
app/test-pmd/testpmd.c | 16 ++++++++++++----
app/test-pmd/testpmd.h | 1 +
2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 6785b095f..77154ef3b 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1394,15 +1394,23 @@ all_ports_started(void)
}

int
+port_is_stopped(portid_t port_id)
+{
+ struct rte_port *port = &ports[port_id];
+
+ if ((port->port_status != RTE_PORT_STOPPED) &&
+ (port->slave_flag == 0))
+ return 0;
+ return 1;
+}
+
+int
all_ports_stopped(void)
{
portid_t pi;
- struct rte_port *port;

RTE_ETH_FOREACH_DEV(pi) {
- port = &ports[pi];
- if ((port->port_status != RTE_PORT_STOPPED) &&
- (port->slave_flag == 0))
+ if (!port_is_stopped(pi))
return 0;
}

diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 1639d27e7..ab74d39ce 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -682,6 +682,7 @@ void reset_port(portid_t pid);
void attach_port(char *identifier);
void detach_port(portid_t port_id);
int all_ports_stopped(void);
+int port_is_stopped(portid_t port_id);
int port_is_started(portid_t port_id);
void pmd_test_exit(void);
void fdir_get_infos(portid_t port_id);
--
2.12.0
Shahaf Shuler
2018-01-10 09:09:12 UTC
Permalink
Ethdev Tx offloads API has changed since:

commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")

Convert the application to use the new API.

This patch mandates the port to be stopped when configure the Tx
offloads. This is because the PMD must be aware to the offloads changes
on the device and queue configuration.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Wenzhuo Lu <***@intel.com>
---
app/test-pmd/cmdline.c | 90 ++++++++++++++++++++++++++++++++++++++++++---
app/test-pmd/config.c | 55 ++++++++++++++++++---------
app/test-pmd/testpmd.c | 3 ++
3 files changed, 124 insertions(+), 24 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index d8c73a9b1..58125839a 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3439,7 +3439,14 @@ cmd_tx_vlan_set_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_result *res = parsed_result;

+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_set(res->port_id, res->vlan_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =
@@ -3486,7 +3493,14 @@ cmd_tx_vlan_set_qinq_parsed(void *parsed_result,
{
struct cmd_tx_vlan_set_qinq_result *res = parsed_result;

+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan =
@@ -3592,7 +3606,14 @@ cmd_tx_vlan_reset_parsed(void *parsed_result,
{
struct cmd_tx_vlan_reset_result *res = parsed_result;

+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }
+
tx_vlan_reset(res->port_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan =
@@ -3685,11 +3706,16 @@ cmd_csum_parsed(void *parsed_result,
struct cmd_csum_result *res = parsed_result;
int hw = 0;
uint16_t mask = 0;
+ uint64_t csum_offloads = 0;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
printf("invalid port %d\n", res->port_id);
return;
}
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }

if (!strcmp(res->mode, "set")) {

@@ -3698,22 +3724,34 @@ cmd_csum_parsed(void *parsed_result,

if (!strcmp(res->proto, "ip")) {
mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
+ csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}

- if (hw)
+ if (hw) {
ports[res->port_id].tx_ol_flags |= mask;
- else
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ csum_offloads;
+ } else {
ports[res->port_id].tx_ol_flags &= (~mask);
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ (~csum_offloads);
+ }
}
csum_show(res->port_id);
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_csum_csum =
@@ -3837,15 +3875,24 @@ cmd_tso_set_parsed(void *parsed_result,

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }

if (!strcmp(res->mode, "set"))
ports[res->port_id].tso_segsz = res->tso_segsz;

- if (ports[res->port_id].tso_segsz == 0)
+ if (ports[res->port_id].tso_segsz == 0) {
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_TCP_TSO;
printf("TSO for non-tunneled packets is disabled\n");
- else
+ } else {
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_TCP_TSO;
printf("TSO segment size for non-tunneled packets is %d\n",
ports[res->port_id].tso_segsz);
+ }

/* display warnings if configuration is not supported by the NIC */
rte_eth_dev_info_get(res->port_id, &dev_info);
@@ -3854,6 +3901,8 @@ cmd_tso_set_parsed(void *parsed_result,
printf("Warning: TSO enabled but not "
"supported by port %d\n", res->port_id);
}
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tso_set_tso =
@@ -3939,13 +3988,27 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(res->port_id)) {
+ printf("Please stop port %d first\n", res->port_id);
+ return;
+ }

if (!strcmp(res->mode, "set"))
ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;

- if (ports[res->port_id].tunnel_tso_segsz == 0)
+ if (ports[res->port_id].tunnel_tso_segsz == 0) {
+ ports[res->port_id].dev_conf.txmode.offloads &=
+ ~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO for tunneled packets is disabled\n");
- else {
+ } else {
+ ports[res->port_id].dev_conf.txmode.offloads |=
+ (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO segment size for tunneled packets is %d\n",
ports[res->port_id].tunnel_tso_segsz);

@@ -3971,6 +4034,8 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
printf("Warning: csum set outer-ip must be set to hw "
"if outer L3 is IPv4; not necessary for IPv6\n");
}
+
+ cmd_reconfig_device_queue(res->port_id, 1, 1);
}

cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =
@@ -13012,8 +13077,13 @@ cmd_set_macsec_offload_on_parsed(

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(port_id)) {
+ printf("Please stop port %d first\n", port_id);
+ return;
+ }

ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
#endif
@@ -13022,6 +13092,7 @@ cmd_set_macsec_offload_on_parsed(

switch (ret) {
case 0:
+ cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
printf("invalid port_id %d\n", port_id);
@@ -13096,14 +13167,21 @@ cmd_set_macsec_offload_off_parsed(

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
+ if (!port_is_stopped(port_id)) {
+ printf("Please stop port %d first\n", port_id);
+ return;
+ }

ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_disable(port_id);
#endif

switch (ret) {
case 0:
+ cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
printf("invalid port_id %d\n", port_id);
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 3bc99be76..d0056fa69 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -616,8 +616,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
printf("VLAN insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_VLAN_INSERT)
printf("on\n");
else
printf("off\n");
@@ -634,8 +634,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) {
printf("Double VLANs insert: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_QINQ_INSERT)
printf("on\n");
else
printf("off\n");
@@ -643,7 +643,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
printf("TX IPv4 checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -651,7 +652,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {
printf("TX UDP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_UDP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -659,7 +661,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
printf("TX TCP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_TCP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -667,7 +670,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) {
printf("TX SCTP checksum: ");
- if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_SCTP_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -675,8 +679,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
printf("TX Outer IPv4 checksum: ");
- if (ports[port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
printf("on\n");
else
printf("off\n");
@@ -684,7 +688,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) {
printf("TX TCP segmentation: ");
- if (ports[port_id].tso_segsz != 0)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_TCP_TSO)
printf("on\n");
else
printf("off\n");
@@ -692,7 +697,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TSO) {
printf("TX UDP segmentation: ");
- if (ports[port_id].tso_segsz != 0)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_UDP_TSO)
printf("on\n");
else
printf("off\n");
@@ -700,7 +706,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO) {
printf("TSO for VXLAN tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_VXLAN_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -708,7 +715,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO) {
printf("TSO for GRE tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_GRE_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -716,7 +724,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO) {
printf("TSO for IPIP tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -724,7 +733,8 @@ port_offload_cap_display(portid_t port_id)

if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO) {
printf("TSO for GENEVE tunnel packet: ");
- if (ports[port_id].tunnel_tso_segsz)
+ if (ports[port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO)
printf("on\n");
else
printf("off\n");
@@ -1704,8 +1714,10 @@ rxtx_config_display(void)
tx_conf->tx_thresh.pthresh,
tx_conf->tx_thresh.hthresh,
tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+ printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""
+ " - TXQ offloads=0x%"PRIx64"\n",
+ tx_conf->tx_rs_thresh, tx_conf->txq_flags,
+ tx_conf->offloads);
}
}

@@ -2783,6 +2795,7 @@ void
tx_vlan_set(portid_t port_id, uint16_t vlan_id)
{
int vlan_offload;
+
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
if (vlan_id_is_invalid(vlan_id))
@@ -2796,6 +2809,7 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)

tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
}

@@ -2803,6 +2817,7 @@ void
tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
{
int vlan_offload;
+
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
if (vlan_id_is_invalid(vlan_id))
@@ -2818,6 +2833,7 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)

tx_vlan_reset(port_id);
ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
+ ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
ports[port_id].tx_vlan_id_outer = vlan_id_outer;
}
@@ -2829,6 +2845,9 @@ tx_vlan_reset(portid_t port_id)
return;
ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
TESTPMD_TX_OFFLOAD_INSERT_QINQ);
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~(DEV_TX_OFFLOAD_VLAN_INSERT |
+ DEV_TX_OFFLOAD_QINQ_INSERT);
ports[port_id].tx_vlan_id = 0;
ports[port_id].tx_vlan_id_outer = 0;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 77154ef3b..0087438bc 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1498,6 +1498,9 @@ start_port(portid_t pid)
}
if (port->need_reconfig_queues > 0) {
port->need_reconfig_queues = 0;
+ port->tx_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE;
+ /* Apply Tx offloads configuration */
+ port->tx_conf.offloads = port->dev_conf.txmode.offloads;
/* setup tx queues */
for (qi = 0; qi < nb_txq; qi++) {
if ((numa_support) &&
--
2.12.0
Shahaf Shuler
2018-01-10 09:09:13 UTC
Permalink
The mbuf ol_flags were taken directly from testpmd internal enumeration
leading to incorrect values.

addressing only insertion offload flags as the checksum flags by
the application design are only with csum forwarding.

Fixes: e9e23a617eb8 ("app/testpmd: add flowgen forwarding engine")
Cc: ***@tilera.com
Cc: ***@dpdk.org

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Wenzhuo Lu <***@intel.com>
---
app/test-pmd/flowgen.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/app/test-pmd/flowgen.c b/app/test-pmd/flowgen.c
index acf9af941..46478fc3a 100644
--- a/app/test-pmd/flowgen.c
+++ b/app/test-pmd/flowgen.c
@@ -123,7 +123,7 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
struct ipv4_hdr *ip_hdr;
struct udp_hdr *udp_hdr;
uint16_t vlan_tci, vlan_tci_outer;
- uint16_t ol_flags;
+ uint64_t ol_flags;
uint16_t nb_rx;
uint16_t nb_tx;
uint16_t nb_pkt;
@@ -151,7 +151,13 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
mbp = current_fwd_lcore()->mbp;
vlan_tci = ports[fs->tx_port].tx_vlan_id;
vlan_tci_outer = ports[fs->tx_port].tx_vlan_id_outer;
- ol_flags = ports[fs->tx_port].tx_ol_flags;
+
+ if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ ol_flags = PKT_TX_VLAN_PKT;
+ if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ ol_flags |= PKT_TX_QINQ_PKT;
+ if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ ol_flags |= PKT_TX_MACSEC;

for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {
pkt = rte_mbuf_raw_alloc(mbp);
--
2.12.0
Shahaf Shuler
2018-01-10 09:09:14 UTC
Permalink
The tx_ol_flags field was used in order to control the different
Tx offloads set. After the conversion to the new Ethdev Tx offloads API
it is not needed anymore as the offloads configuration is stored in
ethdev structs.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Wenzhuo Lu <***@intel.com>
---
app/test-pmd/cmdline.c | 49 ++++++++++++++++----------------------------
app/test-pmd/config.c | 4 ----
app/test-pmd/csumonly.c | 40 ++++++++++++++++++------------------
app/test-pmd/flowgen.c | 8 +++++---
app/test-pmd/macfwd.c | 8 +++++---
app/test-pmd/macswap.c | 8 +++++---
app/test-pmd/testpmd.h | 22 +-------------------
app/test-pmd/txonly.c | 8 +++++---
8 files changed, 59 insertions(+), 88 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 58125839a..858482174 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3653,45 +3653,45 @@ static void
csum_show(int port_id)
{
struct rte_eth_dev_info dev_info;
- uint16_t ol_flags;
+ uint64_t tx_offloads;

- ol_flags = ports[port_id].tx_ol_flags;
+ tx_offloads = ports[port_id].dev_conf.txmode.offloads;
printf("Parse tunnel is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_PARSE_TUNNEL) ? "on" : "off");
+ (ports[port_id].parse_tunnel) ? "on" : "off");
printf("IP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) ? "hw" : "sw");
printf("UDP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw");
printf("TCP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw");
printf("SCTP checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw");
printf("Outer-Ip checksum offload is %s\n",
- (ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ? "hw" : "sw");
+ (tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ? "hw" : "sw");

/* display warnings if configuration is not supported by the NIC */
rte_eth_dev_info_get(port_id, &dev_info);
- if ((ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
printf("Warning: hardware IP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) == 0) {
printf("Warning: hardware UDP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) == 0) {
printf("Warning: hardware TCP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) == 0) {
printf("Warning: hardware SCTP checksum enabled but not "
"supported by port %d\n", port_id);
}
- if ((ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) &&
(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) == 0) {
printf("Warning: hardware outer IP checksum enabled but not "
"supported by port %d\n", port_id);
@@ -3705,7 +3705,6 @@ cmd_csum_parsed(void *parsed_result,
{
struct cmd_csum_result *res = parsed_result;
int hw = 0;
- uint16_t mask = 0;
uint64_t csum_offloads = 0;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
@@ -3723,28 +3722,21 @@ cmd_csum_parsed(void *parsed_result,
hw = 1;

if (!strcmp(res->proto, "ip")) {
- mask = TESTPMD_TX_OFFLOAD_IP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
} else if (!strcmp(res->proto, "udp")) {
- mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
} else if (!strcmp(res->proto, "tcp")) {
- mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
} else if (!strcmp(res->proto, "sctp")) {
- mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
} else if (!strcmp(res->proto, "outer-ip")) {
- mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM;
csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
}

if (hw) {
- ports[res->port_id].tx_ol_flags |= mask;
ports[res->port_id].dev_conf.txmode.offloads |=
csum_offloads;
} else {
- ports[res->port_id].tx_ol_flags &= (~mask);
ports[res->port_id].dev_conf.txmode.offloads &=
(~csum_offloads);
}
@@ -3821,11 +3813,9 @@ cmd_csum_tunnel_parsed(void *parsed_result,
return;

if (!strcmp(res->onoff, "on"))
- ports[res->port_id].tx_ol_flags |=
- TESTPMD_TX_OFFLOAD_PARSE_TUNNEL;
+ ports[res->port_id].parse_tunnel = 1;
else
- ports[res->port_id].tx_ol_flags &=
- (~TESTPMD_TX_OFFLOAD_PARSE_TUNNEL);
+ ports[res->port_id].parse_tunnel = 0;

csum_show(res->port_id);
}
@@ -4025,12 +4015,11 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
*/
check_tunnel_tso_nic_support(res->port_id);

- if (!(ports[res->port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_PARSE_TUNNEL))
+ if (!ports[res->port_id].parse_tunnel)
printf("Warning: csum parse_tunnel must be set "
"so that tunneled packets are recognized\n");
- if (!(ports[res->port_id].tx_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM))
+ if (!(ports[res->port_id].dev_conf.txmode.offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM))
printf("Warning: csum set outer-ip must be set to hw "
"if outer L3 is IPv4; not necessary for IPv6\n");
}
@@ -13082,7 +13071,6 @@ cmd_set_macsec_offload_on_parsed(
return;
}

- ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
@@ -13172,7 +13160,6 @@ cmd_set_macsec_offload_off_parsed(
return;
}

- ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
ports[port_id].dev_conf.txmode.offloads &=
~DEV_TX_OFFLOAD_MACSEC_INSERT;
#ifdef RTE_LIBRTE_IXGBE_PMD
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index d0056fa69..29115e255 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2808,7 +2808,6 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)
}

tx_vlan_reset(port_id);
- ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
}
@@ -2832,7 +2831,6 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
}

tx_vlan_reset(port_id);
- ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
ports[port_id].tx_vlan_id = vlan_id;
ports[port_id].tx_vlan_id_outer = vlan_id_outer;
@@ -2843,8 +2841,6 @@ tx_vlan_reset(portid_t port_id)
{
if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
- ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
- TESTPMD_TX_OFFLOAD_INSERT_QINQ);
ports[port_id].dev_conf.txmode.offloads &=
~(DEV_TX_OFFLOAD_VLAN_INSERT |
DEV_TX_OFFLOAD_QINQ_INSERT);
diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
index aa29f5fc1..dbd2f9842 100644
--- a/app/test-pmd/csumonly.c
+++ b/app/test-pmd/csumonly.c
@@ -316,7 +316,7 @@ parse_encap_ip(void *encap_ip, struct testpmd_offload_info *info)
* depending on the testpmd command line configuration */
static uint64_t
process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
- uint16_t testpmd_ol_flags)
+ uint64_t tx_offloads)
{
struct ipv4_hdr *ipv4_hdr = l3_hdr;
struct udp_hdr *udp_hdr;
@@ -347,7 +347,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
if (info->l4_proto == IPPROTO_TCP && tso_segsz) {
ol_flags |= PKT_TX_IP_CKSUM;
} else {
- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
+ if (tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM)
ol_flags |= PKT_TX_IP_CKSUM;
else
ipv4_hdr->hdr_checksum =
@@ -363,7 +363,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
/* do not recalculate udp cksum if it was 0 */
if (udp_hdr->dgram_cksum != 0) {
udp_hdr->dgram_cksum = 0;
- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
+ if (tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM)
ol_flags |= PKT_TX_UDP_CKSUM;
else {
udp_hdr->dgram_cksum =
@@ -376,7 +376,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
tcp_hdr->cksum = 0;
if (tso_segsz)
ol_flags |= PKT_TX_TCP_SEG;
- else if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
+ else if (tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM)
ol_flags |= PKT_TX_TCP_CKSUM;
else {
tcp_hdr->cksum =
@@ -390,7 +390,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
sctp_hdr->cksum = 0;
/* sctp payload must be a multiple of 4 to be
* offloaded */
- if ((testpmd_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) &&
+ if ((tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
((ipv4_hdr->total_length & 0x3) == 0)) {
ol_flags |= PKT_TX_SCTP_CKSUM;
} else {
@@ -405,7 +405,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
/* Calculate the checksum of outer header */
static uint64_t
process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info,
- uint16_t testpmd_ol_flags, int tso_enabled)
+ uint64_t tx_offloads, int tso_enabled)
{
struct ipv4_hdr *ipv4_hdr = outer_l3_hdr;
struct ipv6_hdr *ipv6_hdr = outer_l3_hdr;
@@ -416,7 +416,7 @@ process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info,
ipv4_hdr->hdr_checksum = 0;
ol_flags |= PKT_TX_OUTER_IPV4;

- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
+ if (tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
ol_flags |= PKT_TX_OUTER_IP_CKSUM;
else
ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr);
@@ -646,7 +646,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
uint16_t nb_prep;
uint16_t i;
uint64_t rx_ol_flags, tx_ol_flags;
- uint16_t testpmd_ol_flags;
+ uint64_t tx_offloads;
uint32_t retry;
uint32_t rx_bad_ip_csum;
uint32_t rx_bad_l4_csum;
@@ -678,7 +678,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
gro_enable = gro_ports[fs->rx_port].enable;

txp = &ports[fs->tx_port];
- testpmd_ol_flags = txp->tx_ol_flags;
+ tx_offloads = txp->dev_conf.txmode.offloads;
memset(&info, 0, sizeof(info));
info.tso_segsz = txp->tso_segsz;
info.tunnel_tso_segsz = txp->tunnel_tso_segsz;
@@ -714,7 +714,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
l3_hdr = (char *)eth_hdr + info.l2_len;

/* check if it's a supported tunnel */
- if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_PARSE_TUNNEL) {
+ if (txp->parse_tunnel) {
if (info.l4_proto == IPPROTO_UDP) {
struct udp_hdr *udp_hdr;

@@ -754,14 +754,14 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)

/* process checksums of inner headers first */
tx_ol_flags |= process_inner_cksums(l3_hdr, &info,
- testpmd_ol_flags);
+ tx_offloads);

/* Then process outer headers if any. Note that the software
* checksum will be wrong if one of the inner checksums is
* processed in hardware. */
if (info.is_tunnel == 1) {
tx_ol_flags |= process_outer_cksums(outer_l3_hdr, &info,
- testpmd_ol_flags,
+ tx_offloads,
!!(tx_ol_flags & PKT_TX_TCP_SEG));
}

@@ -769,8 +769,8 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)

if (info.is_tunnel == 1) {
if (info.tunnel_tso_segsz ||
- (testpmd_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ||
+ (tx_offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
(tx_ol_flags & PKT_TX_OUTER_IPV6)) {
m->outer_l2_len = info.outer_l2_len;
m->outer_l3_len = info.outer_l3_len;
@@ -832,17 +832,17 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
rte_be_to_cpu_16(info.outer_ethertype),
info.outer_l3_len);
/* dump tx packet info */
- if ((testpmd_ol_flags & (TESTPMD_TX_OFFLOAD_IP_CKSUM |
- TESTPMD_TX_OFFLOAD_UDP_CKSUM |
- TESTPMD_TX_OFFLOAD_TCP_CKSUM |
- TESTPMD_TX_OFFLOAD_SCTP_CKSUM)) ||
+ if ((tx_offloads & (DEV_TX_OFFLOAD_IPV4_CKSUM |
+ DEV_TX_OFFLOAD_UDP_CKSUM |
+ DEV_TX_OFFLOAD_TCP_CKSUM |
+ DEV_TX_OFFLOAD_SCTP_CKSUM)) ||
info.tso_segsz != 0)
printf("tx: m->l2_len=%d m->l3_len=%d "
"m->l4_len=%d\n",
m->l2_len, m->l3_len, m->l4_len);
if (info.is_tunnel == 1) {
- if ((testpmd_ol_flags &
- TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ||
+ if ((tx_offloads &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
(tx_ol_flags & PKT_TX_OUTER_IPV6))
printf("tx: m->outer_l2_len=%d "
"m->outer_l3_len=%d\n",
diff --git a/app/test-pmd/flowgen.c b/app/test-pmd/flowgen.c
index 46478fc3a..0531b5d27 100644
--- a/app/test-pmd/flowgen.c
+++ b/app/test-pmd/flowgen.c
@@ -129,6 +129,7 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
uint16_t nb_pkt;
uint16_t i;
uint32_t retry;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -152,11 +153,12 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
vlan_tci = ports[fs->tx_port].tx_vlan_id;
vlan_tci_outer = ports[fs->tx_port].tx_vlan_id_outer;

- if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ tx_offloads = ports[fs->tx_port].dev_conf.txmode.offloads;
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (ports[fs->tx_port].tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;

for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {
diff --git a/app/test-pmd/macfwd.c b/app/test-pmd/macfwd.c
index f4a4bf29a..56ee3cc0b 100644
--- a/app/test-pmd/macfwd.c
+++ b/app/test-pmd/macfwd.c
@@ -84,6 +84,7 @@ pkt_burst_mac_forward(struct fwd_stream *fs)
uint16_t nb_tx;
uint16_t i;
uint64_t ol_flags = 0;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -107,11 +108,12 @@ pkt_burst_mac_forward(struct fwd_stream *fs)
#endif
fs->rx_packets += nb_rx;
txp = &ports[fs->tx_port];
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ tx_offloads = txp->dev_conf.txmode.offloads;
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;
for (i = 0; i < nb_rx; i++) {
if (likely(i < nb_rx - 1))
diff --git a/app/test-pmd/macswap.c b/app/test-pmd/macswap.c
index 721865c96..e2cc4812c 100644
--- a/app/test-pmd/macswap.c
+++ b/app/test-pmd/macswap.c
@@ -84,6 +84,7 @@ pkt_burst_mac_swap(struct fwd_stream *fs)
uint16_t i;
uint32_t retry;
uint64_t ol_flags = 0;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -107,11 +108,12 @@ pkt_burst_mac_swap(struct fwd_stream *fs)
#endif
fs->rx_packets += nb_rx;
txp = &ports[fs->tx_port];
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ tx_offloads = txp->dev_conf.txmode.offloads;
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;
for (i = 0; i < nb_rx; i++) {
if (likely(i < nb_rx - 1))
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index ab74d39ce..c6baa1066 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -138,26 +138,6 @@ struct fwd_stream {
#endif
};

-/** Offload IP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_IP_CKSUM 0x0001
-/** Offload UDP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_UDP_CKSUM 0x0002
-/** Offload TCP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_TCP_CKSUM 0x0004
-/** Offload SCTP checksum in csum forward engine */
-#define TESTPMD_TX_OFFLOAD_SCTP_CKSUM 0x0008
-/** Offload outer IP checksum in csum forward engine for recognized tunnels */
-#define TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM 0x0010
-/** Parse tunnel in csum forward engine. If set, dissect tunnel headers
- * of rx packets. If not set, treat inner headers as payload. */
-#define TESTPMD_TX_OFFLOAD_PARSE_TUNNEL 0x0020
-/** Insert VLAN header in forward engine */
-#define TESTPMD_TX_OFFLOAD_INSERT_VLAN 0x0040
-/** Insert double VLAN header in forward engine */
-#define TESTPMD_TX_OFFLOAD_INSERT_QINQ 0x0080
-/** Offload MACsec in forward engine */
-#define TESTPMD_TX_OFFLOAD_MACSEC 0x0100
-
/** Descriptor for a single flow. */
struct port_flow {
size_t size; /**< Allocated space including data[]. */
@@ -215,7 +195,7 @@ struct rte_port {
struct fwd_stream *rx_stream; /**< Port RX stream, if unique */
struct fwd_stream *tx_stream; /**< Port TX stream, if unique */
unsigned int socket_id; /**< For NUMA support */
- uint16_t tx_ol_flags;/**< TX Offload Flags (TESTPMD_TX_OFFLOAD...). */
+ uint16_t parse_tunnel:1; /**< Parse internal headers */
uint16_t tso_segsz; /**< Segmentation offload MSS for non-tunneled packets. */
uint16_t tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
uint16_t tx_vlan_id;/**< The tag ID */
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 309c73893..418901c0c 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -193,6 +193,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
uint32_t retry;
uint64_t ol_flags = 0;
uint8_t i;
+ uint64_t tx_offloads;
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
uint64_t start_tsc;
uint64_t end_tsc;
@@ -206,13 +207,14 @@ pkt_burst_transmit(struct fwd_stream *fs)

mbp = current_fwd_lcore()->mbp;
txp = &ports[fs->tx_port];
+ tx_offloads = txp->dev_conf.txmode.offloads;
vlan_tci = txp->tx_vlan_id;
vlan_tci_outer = txp->tx_vlan_id_outer;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+ if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
ol_flags = PKT_TX_VLAN_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+ if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
ol_flags |= PKT_TX_QINQ_PKT;
- if (txp->tx_ol_flags & TESTPMD_TX_OFFLOAD_MACSEC)
+ if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
ol_flags |= PKT_TX_MACSEC;
for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {
pkt = rte_mbuf_raw_alloc(mbp);
--
2.12.0
Shahaf Shuler
2018-01-10 09:09:15 UTC
Permalink
This patch adds command line option to set hex value for the ports Tx
offloads flags.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/parameters.c | 17 +++++++++++++++--
app/test-pmd/testpmd.c | 4 ++++
app/test-pmd/testpmd.h | 2 ++
doc/guides/testpmd_app_ug/run_app.rst | 5 +++++
4 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 263651cba..58889420f 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -99,7 +99,7 @@ usage(char* progname)
"--rss-ip | --rss-udp | "
"--rxpt= | --rxht= | --rxwt= | --rxfreet= | "
"--txpt= | --txht= | --txwt= | --txfreet= | "
- "--txrst= | --txqflags= ]\n",
+ "--txrst= | --txqflags= | --tx-offloads ]\n",
progname);
#ifdef RTE_LIBRTE_CMDLINE
printf(" --interactive: run in interactive mode.\n");
@@ -216,6 +216,7 @@ usage(char* progname)
"disable print of designated event or all of them.\n");
printf(" --flow-isolate-all: "
"requests flow API isolated mode on all ports at initialization time.\n");
+ printf(" --tx-offloads=0xXXXXXXXX: hexadecimal bitmask of TX queue offloads\n");
}

#ifdef RTE_LIBRTE_CMDLINE
@@ -566,8 +567,9 @@ launch_args_parse(int argc, char** argv)
char **argvopt;
int opt_idx;
enum { TX, RX };
- /* Default Rx offloads for all ports. */
+ /* Default offloads for all ports. */
uint64_t rx_offloads = rx_mode.offloads;
+ uint64_t tx_offloads = tx_mode.offloads;

static struct option lgopts[] = {
{ "help", 0, 0, 0 },
@@ -645,6 +647,7 @@ launch_args_parse(int argc, char** argv)
{ "no-rmv-interrupt", 0, 0, 0 },
{ "print-event", 1, 0, 0 },
{ "mask-event", 1, 0, 0 },
+ { "tx-offloads", 1, 0, 0 },
{ 0, 0, 0, 0 },
};

@@ -1116,6 +1119,15 @@ launch_args_parse(int argc, char** argv)
rmv_interrupt = 0;
if (!strcmp(lgopts[opt_idx].name, "flow-isolate-all"))
flow_isolate_all = 1;
+ if (!strcmp(lgopts[opt_idx].name, "tx-offloads")) {
+ char *end = NULL;
+ n = strtoull(optarg, &end, 16);
+ if (n >= 0)
+ tx_offloads = (uint64_t)n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "tx-offloads must be >= 0\n");
+ }
if (!strcmp(lgopts[opt_idx].name, "print-event"))
if (parse_event_printing_config(optarg, 1)) {
rte_exit(EXIT_FAILURE,
@@ -1142,4 +1154,5 @@ launch_args_parse(int argc, char** argv)

/* Set offload configuration from command line parameters. */
rx_mode.offloads = rx_offloads;
+ tx_mode.offloads = tx_offloads;
}
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 0087438bc..806548196 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -344,6 +344,8 @@ struct rte_eth_rxmode rx_mode = {
.ignore_offload_bitfield = 1,
};

+struct rte_eth_txmode tx_mode;
+
struct rte_fdir_conf fdir_conf = {
.mode = RTE_FDIR_MODE_NONE,
.pballoc = RTE_FDIR_PBALLOC_64K,
@@ -604,6 +606,8 @@ init_config(void)

RTE_ETH_FOREACH_DEV(pid) {
port = &ports[pid];
+ /* Apply default Tx configuration for all ports */
+ port->dev_conf.txmode = tx_mode;
rte_eth_dev_info_get(pid, &port->dev_info);

if (numa_support) {
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index c6baa1066..3e63edfa1 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -395,6 +395,8 @@ extern portid_t fwd_ports_ids[RTE_MAX_ETHPORTS];
extern struct rte_port *ports;

extern struct rte_eth_rxmode rx_mode;
+extern struct rte_eth_txmode tx_mode;
+
extern uint64_t rss_hf;

extern queueid_t nb_rxq;
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index 4c0d2cede..fface6f58 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -509,3 +509,8 @@ The commandline options are:
configured flow rules only (see flow command).

Ports that do not support this mode are automatically discarded.
+
+* ``--tx-offloads=0xXXXXXXXX``
+
+ Set the hexadecimal bitmask of TX queue offloads.
+ The default value is 0.
--
2.12.0
Lu, Wenzhuo
2018-01-15 03:06:38 UTC
Permalink
Hi,
-----Original Message-----
Sent: Wednesday, January 10, 2018 5:09 PM
Subject: [dpdk-dev] [PATCH v4 07/11] app/testpmd: add command line
option for Tx offloads
This patch adds command line option to set hex value for the ports Tx
offloads flags.
Acked-by: Wenzhuo Lu <***@intel.com>
Shahaf Shuler
2018-01-10 09:09:16 UTC
Permalink
Since testpmd is now using the new Ethdev offloads API and there is
a way configure each of the tx offloads from CLI or command line,
there is no need for the txqflags configuration anymore.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Nelio Laranjeiro <***@6wind.com>
Acked-by: Wenzhuo Lu <***@intel.com>
---
app/test-pmd/cmdline.c | 69 ------------------------
app/test-pmd/config.c | 7 +--
app/test-pmd/parameters.c | 14 +----
app/test-pmd/testpmd.c | 8 ---
app/test-pmd/testpmd.h | 1 -
doc/guides/testpmd_app_ug/run_app.rst | 12 -----
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 11 ----
7 files changed, 3 insertions(+), 119 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 858482174..b4ef1d0eb 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3092,74 +3092,6 @@ cmdline_parse_inst_t cmd_set_txsplit = {
},
};

-/* *** CONFIG TX QUEUE FLAGS *** */
-
-struct cmd_config_txqflags_result {
- cmdline_fixed_string_t port;
- cmdline_fixed_string_t config;
- cmdline_fixed_string_t all;
- cmdline_fixed_string_t what;
- int32_t hexvalue;
-};
-
-static void cmd_config_txqflags_parsed(void *parsed_result,
- __attribute__((unused)) struct cmdline *cl,
- __attribute__((unused)) void *data)
-{
- struct cmd_config_txqflags_result *res = parsed_result;
-
- if (!all_ports_stopped()) {
- printf("Please stop all ports first\n");
- return;
- }
-
- if (strcmp(res->what, "txqflags")) {
- printf("Unknown parameter\n");
- return;
- }
-
- if (res->hexvalue >= 0) {
- txq_flags = res->hexvalue;
- } else {
- printf("txqflags must be >= 0\n");
- return;
- }
-
- init_port_config();
-
- cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
-}
-
-cmdline_parse_token_string_t cmd_config_txqflags_port =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, port,
- "port");
-cmdline_parse_token_string_t cmd_config_txqflags_config =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, config,
- "config");
-cmdline_parse_token_string_t cmd_config_txqflags_all =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, all,
- "all");
-cmdline_parse_token_string_t cmd_config_txqflags_what =
- TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, what,
- "txqflags");
-cmdline_parse_token_num_t cmd_config_txqflags_value =
- TOKEN_NUM_INITIALIZER(struct cmd_config_txqflags_result,
- hexvalue, INT32);
-
-cmdline_parse_inst_t cmd_config_txqflags = {
- .f = cmd_config_txqflags_parsed,
- .data = NULL,
- .help_str = "port config all txqflags <value>",
- .tokens = {
- (void *)&cmd_config_txqflags_port,
- (void *)&cmd_config_txqflags_config,
- (void *)&cmd_config_txqflags_all,
- (void *)&cmd_config_txqflags_what,
- (void *)&cmd_config_txqflags_value,
- NULL,
- },
-};
-
/* *** ADD/REMOVE ALL VLAN IDENTIFIERS TO/FROM A PORT VLAN RX FILTER *** */
struct cmd_rx_vlan_filter_all_result {
cmdline_fixed_string_t rx_vlan;
@@ -15709,7 +15641,6 @@ cmdline_parse_ctx_t main_ctx[] = {
(cmdline_parse_inst_t *)&cmd_config_rx_mode_flag,
(cmdline_parse_inst_t *)&cmd_config_rss,
(cmdline_parse_inst_t *)&cmd_config_rxtx_queue,
- (cmdline_parse_inst_t *)&cmd_config_txqflags,
(cmdline_parse_inst_t *)&cmd_config_rss_reta,
(cmdline_parse_inst_t *)&cmd_showport_reta,
(cmdline_parse_inst_t *)&cmd_config_burst,
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 29115e255..faccb84ca 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -417,7 +417,6 @@ tx_queue_infos_display(portid_t port_id, uint16_t queue_id)
printf("\nTX writeback threshold: %hhu", qinfo.conf.tx_thresh.wthresh);
printf("\nTX RS threshold: %hu", qinfo.conf.tx_rs_thresh);
printf("\nTX free threshold: %hu", qinfo.conf.tx_free_thresh);
- printf("\nTX flags: %#x", qinfo.conf.txq_flags);
printf("\nTX deferred start: %s",
(qinfo.conf.tx_deferred_start != 0) ? "on" : "off");
printf("\nNumber of TXDs: %hu", qinfo.nb_desc);
@@ -1714,10 +1713,8 @@ rxtx_config_display(void)
tx_conf->tx_thresh.pthresh,
tx_conf->tx_thresh.hthresh,
tx_conf->tx_thresh.wthresh);
- printf(" TX RS bit threshold=%d - TXQ flags=0x%"PRIx32""
- " - TXQ offloads=0x%"PRIx64"\n",
- tx_conf->tx_rs_thresh, tx_conf->txq_flags,
- tx_conf->offloads);
+ printf(" TX RS bit threshold=%d - TXQ offloads=0x%"PRIx64"\n",
+ tx_conf->tx_rs_thresh, tx_conf->offloads);
}
}

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 58889420f..fa547df66 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -99,7 +99,7 @@ usage(char* progname)
"--rss-ip | --rss-udp | "
"--rxpt= | --rxht= | --rxwt= | --rxfreet= | "
"--txpt= | --txht= | --txwt= | --txfreet= | "
- "--txrst= | --txqflags= | --tx-offloads ]\n",
+ "--txrst= | --tx-offloads ]\n",
progname);
#ifdef RTE_LIBRTE_CMDLINE
printf(" --interactive: run in interactive mode.\n");
@@ -192,8 +192,6 @@ usage(char* progname)
"(0 <= N <= value of txd).\n");
printf(" --txrst=N: set the transmit RS bit threshold of TX rings to N "
"(0 <= N <= value of txd).\n");
- printf(" --txqflags=0xXXXXXXXX: hexadecimal bitmask of TX queue flags "
- "(0 <= N <= 0x7FFFFFFF).\n");
printf(" --tx-queue-stats-mapping=(port,queue,mapping)[,(port,queue,mapping]: "
"tx queues statistics counters mapping "
"(0 <= mapping <= %d).\n", RTE_ETHDEV_QUEUE_STAT_CNTRS - 1);
@@ -632,7 +630,6 @@ launch_args_parse(int argc, char** argv)
{ "txwt", 1, 0, 0 },
{ "txfreet", 1, 0, 0 },
{ "txrst", 1, 0, 0 },
- { "txqflags", 1, 0, 0 },
{ "rxpt", 1, 0, 0 },
{ "rxht", 1, 0, 0 },
{ "rxwt", 1, 0, 0 },
@@ -1006,15 +1003,6 @@ launch_args_parse(int argc, char** argv)
else
rte_exit(EXIT_FAILURE, "txrst must be >= 0\n");
}
- if (!strcmp(lgopts[opt_idx].name, "txqflags")) {
- char *end = NULL;
- n = strtoul(optarg, &end, 16);
- if (n >= 0)
- txq_flags = (int32_t)n;
- else
- rte_exit(EXIT_FAILURE,
- "txqflags must be >= 0\n");
- }
if (!strcmp(lgopts[opt_idx].name, "rxd")) {
n = atoi(optarg);
if (n > 0) {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 806548196..91dcb31c0 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -259,11 +259,6 @@ int16_t tx_free_thresh = RTE_PMD_PARAM_UNSET;
int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;

/*
- * Configurable value of TX queue flags.
- */
-int32_t txq_flags = RTE_PMD_PARAM_UNSET;
-
-/*
* Receive Side Scaling (RSS) configuration.
*/
uint64_t rss_hf = ETH_RSS_IP; /* RSS IP by default. */
@@ -2084,9 +2079,6 @@ rxtx_port_config(struct rte_port *port)

if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
port->tx_conf.tx_free_thresh = tx_free_thresh;
-
- if (txq_flags != RTE_PMD_PARAM_UNSET)
- port->tx_conf.txq_flags = txq_flags;
}

void
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 3e63edfa1..c9af41cfa 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -409,7 +409,6 @@ extern int16_t rx_free_thresh;
extern int8_t rx_drop_en;
extern int16_t tx_free_thresh;
extern int16_t tx_rs_thresh;
-extern int32_t txq_flags;

extern uint8_t dcb_config;
extern uint8_t dcb_test;
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index fface6f58..be9a2cdd1 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -447,18 +447,6 @@ The commandline options are:
Set the transmit RS bit threshold of TX rings to N, where 0 <= N <= value of ``--txd``.
The default value is 0.

-* ``--txqflags=0xXXXXXXXX``
-
- Set the hexadecimal bitmask of TX queue flags, where 0 <= N <= 0x7FFFFFFF.
- The default value is 0.
-
- .. note::
-
- When using hardware offload functions such as vlan or checksum
- add ``txqflags=0`` to force the full-featured TX code path.
- In some PMDs this may already be the default.
-
-
* ``--rx-queue-stats-mapping=(port,queue,mapping)[,(port,queue,mapping)]``

Set the RX queues statistics counters mapping 0 <= mapping <= 15.
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 2b00be81c..7d3a7ae93 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -354,8 +354,6 @@ The available information categories are:
also modify the default hierarchy or specify the new hierarchy through CLI for
implementing QoS scheduler. Requires ``CONFIG_RTE_LIBRTE_PMD_SOFTNIC=y`` ``CONFIG_RTE_LIBRTE_SCHED=y``.

-Note: TX timestamping is only available in the "Full Featured" TX path. To force ``testpmd`` into this mode set ``--txqflags=0``.
-
Example::

testpmd> set fwd rxonly
@@ -1681,15 +1679,6 @@ RX scatter mode is off by default.

The ``on`` option is equivalent to the ``--enable-scatter`` command-line option.

-port config - TX queue flags
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Set a hexadecimal bitmap of TX queue flags for all ports::
-
- testpmd> port config all txqflags value
-
-This command is equivalent to the ``--txqflags`` command-line option.
-
port config - RX Checksum
~~~~~~~~~~~~~~~~~~~~~~~~~
--
2.12.0
Shahaf Shuler
2018-01-10 09:09:17 UTC
Permalink
In the current design it was possible for offload to be set even though
the device is not supporting it. A warning message was printed instead.

This is a wrong behaviour, as application should set only the offloads
reported by the capabilities of the device.

This patch adds verification for the offloads being set and make sure
the offload configuration passed to the device always match its
capabilities.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
Acked-by: Wenzhuo Lu <***@intel.com>
---
app/test-pmd/cmdline.c | 103 +++++++++++++++++++++++++++++++++-----------
app/test-pmd/config.c | 14 ++++++
2 files changed, 92 insertions(+), 25 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index b4ef1d0eb..d1b8dab6e 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -3638,6 +3638,7 @@ cmd_csum_parsed(void *parsed_result,
struct cmd_csum_result *res = parsed_result;
int hw = 0;
uint64_t csum_offloads = 0;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
printf("invalid port %d\n", res->port_id);
@@ -3648,21 +3649,53 @@ cmd_csum_parsed(void *parsed_result,
return;
}

+ rte_eth_dev_info_get(res->port_id, &dev_info);
if (!strcmp(res->mode, "set")) {

if (!strcmp(res->hwsw, "hw"))
hw = 1;

if (!strcmp(res->proto, "ip")) {
- csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_IPV4_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
+ } else {
+ printf("IP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "udp")) {
- csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_UDP_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+ } else {
+ printf("UDP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "tcp")) {
- csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_TCP_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ } else {
+ printf("TCP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "sctp")) {
- csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_SCTP_CKSUM) {
+ csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
+ } else {
+ printf("SCTP checksum offload is not supported "
+ "by port %u\n", res->port_id);
+ }
} else if (!strcmp(res->proto, "outer-ip")) {
- csum_offloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+ if (dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
+ csum_offloads |=
+ DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+ } else {
+ printf("Outer IP checksum offload is not "
+ "supported by port %u\n", res->port_id);
+ }
}

if (hw) {
@@ -3805,6 +3838,14 @@ cmd_tso_set_parsed(void *parsed_result,
if (!strcmp(res->mode, "set"))
ports[res->port_id].tso_segsz = res->tso_segsz;

+ rte_eth_dev_info_get(res->port_id, &dev_info);
+ if ((ports[res->port_id].tso_segsz != 0) &&
+ (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
+ printf("Error: TSO is not supported by port %d\n",
+ res->port_id);
+ return;
+ }
+
if (ports[res->port_id].tso_segsz == 0) {
ports[res->port_id].dev_conf.txmode.offloads &=
~DEV_TX_OFFLOAD_TCP_TSO;
@@ -3881,24 +3922,25 @@ struct cmd_tunnel_tso_set_result {
portid_t port_id;
};

-static void
+static struct rte_eth_dev_info
check_tunnel_tso_nic_support(portid_t port_id)
{
struct rte_eth_dev_info dev_info;

rte_eth_dev_info_get(port_id, &dev_info);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
- printf("Warning: TSO enabled but VXLAN TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: VXLAN TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO))
- printf("Warning: TSO enabled but GRE TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: GRE TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO))
- printf("Warning: TSO enabled but IPIP TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: IPIP TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO))
- printf("Warning: TSO enabled but GENEVE TUNNEL TSO not "
- "supported by port %d\n", port_id);
+ printf("Warning: GENEVE TUNNEL TSO not supported therefore "
+ "not enabled for port %d\n", port_id);
+ return dev_info;
}

static void
@@ -3907,6 +3949,7 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_tunnel_tso_set_result *res = parsed_result;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(res->port_id, ENABLED_WARN))
return;
@@ -3918,6 +3961,7 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
if (!strcmp(res->mode, "set"))
ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;

+ dev_info = check_tunnel_tso_nic_support(res->port_id);
if (ports[res->port_id].tunnel_tso_segsz == 0) {
ports[res->port_id].dev_conf.txmode.offloads &=
~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
@@ -3926,11 +3970,13 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
printf("TSO for tunneled packets is disabled\n");
} else {
+ uint64_t tso_offloads = (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+ DEV_TX_OFFLOAD_GRE_TNL_TSO |
+ DEV_TX_OFFLOAD_IPIP_TNL_TSO |
+ DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
+
ports[res->port_id].dev_conf.txmode.offloads |=
- (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
- DEV_TX_OFFLOAD_GRE_TNL_TSO |
- DEV_TX_OFFLOAD_IPIP_TNL_TSO |
- DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
+ (tso_offloads & dev_info.tx_offload_capa);
printf("TSO segment size for tunneled packets is %d\n",
ports[res->port_id].tunnel_tso_segsz);

@@ -3945,7 +3991,6 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
* is not necessary for IPv6 tunneled pkts because there's no
* checksum in IP header anymore.
*/
- check_tunnel_tso_nic_support(res->port_id);

if (!ports[res->port_id].parse_tunnel)
printf("Warning: csum parse_tunnel must be set "
@@ -12995,6 +13040,7 @@ cmd_set_macsec_offload_on_parsed(
portid_t port_id = res->port_id;
int en = (strcmp(res->en_on_off, "on") == 0) ? 1 : 0;
int rp = (strcmp(res->rp_on_off, "on") == 0) ? 1 : 0;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
@@ -13003,15 +13049,19 @@ cmd_set_macsec_offload_on_parsed(
return;
}

- ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_MACSEC_INSERT;
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
#ifdef RTE_LIBRTE_IXGBE_PMD
- ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
+ ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
#endif
+ }
RTE_SET_USED(en);
RTE_SET_USED(rp);

switch (ret) {
case 0:
+ ports[port_id].dev_conf.txmode.offloads |=
+ DEV_TX_OFFLOAD_MACSEC_INSERT;
cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
@@ -13083,6 +13133,7 @@ cmd_set_macsec_offload_off_parsed(
{
struct cmd_macsec_offload_off_result *res = parsed_result;
int ret = -ENOTSUP;
+ struct rte_eth_dev_info dev_info;
portid_t port_id = res->port_id;

if (port_id_is_invalid(port_id, ENABLED_WARN))
@@ -13092,14 +13143,16 @@ cmd_set_macsec_offload_off_parsed(
return;
}

- ports[port_id].dev_conf.txmode.offloads &=
- ~DEV_TX_OFFLOAD_MACSEC_INSERT;
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
#ifdef RTE_LIBRTE_IXGBE_PMD
- ret = rte_pmd_ixgbe_macsec_disable(port_id);
+ ret = rte_pmd_ixgbe_macsec_disable(port_id);
#endif
-
+ }
switch (ret) {
case 0:
+ ports[port_id].dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_MACSEC_INSERT;
cmd_reconfig_device_queue(port_id, 1, 1);
break;
case -ENODEV:
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index faccb84ca..d32a4672b 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2792,6 +2792,7 @@ void
tx_vlan_set(portid_t port_id, uint16_t vlan_id)
{
int vlan_offload;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
@@ -2803,6 +2804,12 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)
printf("Error, as QinQ has been enabled.\n");
return;
}
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) == 0) {
+ printf("Error: vlan insert is not supported by port %d\n",
+ port_id);
+ return;
+ }

tx_vlan_reset(port_id);
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
@@ -2813,6 +2820,7 @@ void
tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
{
int vlan_offload;
+ struct rte_eth_dev_info dev_info;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;
@@ -2826,6 +2834,12 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
printf("Error, as QinQ hasn't been enabled.\n");
return;
}
+ rte_eth_dev_info_get(port_id, &dev_info);
+ if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) {
+ printf("Error: qinq insert not supported by port %d\n",
+ port_id);
+ return;
+ }

tx_vlan_reset(port_id);
ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
--
2.12.0
Shahaf Shuler
2018-01-10 09:09:18 UTC
Permalink
On ethdev there is an API to configure VLAN offloads after the port
was started and without reconfiguration of the port or queues.

In the current design of the application, when the Rx offloads are
changed (through "port config all" CLI command) the port configuration
is overwritten, therefore the configuration made for the VLAN is lost.

This patch is to address the issue by a configuration of each port Rx
offloads separately instead of using the global Rx config. Such
adjustment is required due to the conversion of the application to the
new offloads API.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/cmdline.c | 217 +++++++++++++++++++++++---------------------
app/test-pmd/config.c | 27 ++++--
app/test-pmd/testpmd.c | 2 +-
3 files changed, 135 insertions(+), 111 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index d1b8dab6e..00a229a41 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1577,34 +1577,38 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_max_pkt_len_result *res = parsed_result;
- uint64_t rx_offloads = rx_mode.offloads;
+ portid_t pid;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
return;
}

- if (!strcmp(res->name, "max-pkt-len")) {
- if (res->value < ETHER_MIN_LEN) {
- printf("max-pkt-len can not be less than %d\n",
- ETHER_MIN_LEN);
+ RTE_ETH_FOREACH_DEV(pid) {
+ struct rte_port *port = &ports[pid];
+ uint64_t rx_offloads = port->dev_conf.rxmode.offloads;
+
+ if (!strcmp(res->name, "max-pkt-len")) {
+ if (res->value < ETHER_MIN_LEN) {
+ printf("max-pkt-len can not be less than %d\n",
+ ETHER_MIN_LEN);
+ return;
+ }
+ if (res->value == port->dev_conf.rxmode.max_rx_pkt_len)
+ return;
+
+ port->dev_conf.rxmode.max_rx_pkt_len = res->value;
+ if (res->value > ETHER_MAX_LEN)
+ rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+ else
+ rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
+ port->dev_conf.rxmode.offloads = rx_offloads;
+ } else {
+ printf("Unknown parameter\n");
return;
}
- if (res->value == rx_mode.max_rx_pkt_len)
- return;
-
- rx_mode.max_rx_pkt_len = res->value;
- if (res->value > ETHER_MAX_LEN)
- rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
- else
- rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
- } else {
- printf("Unknown parameter\n");
- return;
}

- rx_mode.offloads = rx_offloads;
-
init_port_config();

cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
@@ -1706,103 +1710,108 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_rx_mode_flag *res = parsed_result;
- uint64_t rx_offloads = rx_mode.offloads;
+ portid_t pid;

if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
return;
}

- if (!strcmp(res->name, "crc-strip")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "scatter")) {
- if (!strcmp(res->value, "on")) {
- rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
- } else if (!strcmp(res->value, "off")) {
- rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ RTE_ETH_FOREACH_DEV(pid) {
+ struct rte_port *port;
+ uint64_t rx_offloads;
+
+ port = &ports[pid];
+ rx_offloads = port->dev_conf.rxmode.offloads;
+ if (!strcmp(res->name, "crc-strip")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "scatter")) {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
+ } else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "rx-cksum")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "rx-timestamp")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan")) {
+ if (!strcmp(res->value, "on")) {
+ rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
+ } else if (!strcmp(res->value, "off")) {
+ rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
+ DEV_RX_OFFLOAD_VLAN_STRIP);
+ } else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-filter")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-strip")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "hw-vlan-extend")) {
+ if (!strcmp(res->value, "on"))
+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
+ else if (!strcmp(res->value, "off"))
+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
+ } else if (!strcmp(res->name, "drop-en")) {
+ if (!strcmp(res->value, "on"))
+ rx_drop_en = 1;
+ else if (!strcmp(res->value, "off"))
+ rx_drop_en = 0;
+ else {
+ printf("Unknown parameter\n");
+ return;
+ }
} else {
printf("Unknown parameter\n");
return;
}
- } else if (!strcmp(res->name, "rx-cksum")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "rx-timestamp")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan")) {
- if (!strcmp(res->value, "on")) {
- rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
- DEV_RX_OFFLOAD_VLAN_STRIP);
- }
- else if (!strcmp(res->value, "off")) {
- rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
- DEV_RX_OFFLOAD_VLAN_STRIP);
- }
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan-filter")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan-strip")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "hw-vlan-extend")) {
- if (!strcmp(res->value, "on"))
- rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
- else if (!strcmp(res->value, "off"))
- rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else if (!strcmp(res->name, "drop-en")) {
- if (!strcmp(res->value, "on"))
- rx_drop_en = 1;
- else if (!strcmp(res->value, "off"))
- rx_drop_en = 0;
- else {
- printf("Unknown parameter\n");
- return;
- }
- } else {
- printf("Unknown parameter\n");
- return;
+ port->dev_conf.rxmode.offloads = rx_offloads;
}
- rx_mode.offloads = rx_offloads;

init_port_config();

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index d32a4672b..da968cb64 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2665,21 +2665,26 @@ vlan_extend_set(portid_t port_id, int on)
{
int diag;
int vlan_offload;
+ uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

vlan_offload = rte_eth_dev_get_vlan_offload(port_id);

- if (on)
+ if (on) {
vlan_offload |= ETH_VLAN_EXTEND_OFFLOAD;
- else
+ port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
+ } else {
vlan_offload &= ~ETH_VLAN_EXTEND_OFFLOAD;
+ port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
+ }

diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
if (diag < 0)
printf("rx_vlan_extend_set(port_pi=%d, on=%d) failed "
"diag=%d\n", port_id, on, diag);
+ ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
}

void
@@ -2687,21 +2692,26 @@ rx_vlan_strip_set(portid_t port_id, int on)
{
int diag;
int vlan_offload;
+ uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

vlan_offload = rte_eth_dev_get_vlan_offload(port_id);

- if (on)
+ if (on) {
vlan_offload |= ETH_VLAN_STRIP_OFFLOAD;
- else
+ port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+ } else {
vlan_offload &= ~ETH_VLAN_STRIP_OFFLOAD;
+ port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+ }

diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
if (diag < 0)
printf("rx_vlan_strip_set(port_pi=%d, on=%d) failed "
"diag=%d\n", port_id, on, diag);
+ ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
}

void
@@ -2723,21 +2733,26 @@ rx_vlan_filter_set(portid_t port_id, int on)
{
int diag;
int vlan_offload;
+ uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;

if (port_id_is_invalid(port_id, ENABLED_WARN))
return;

vlan_offload = rte_eth_dev_get_vlan_offload(port_id);

- if (on)
+ if (on) {
vlan_offload |= ETH_VLAN_FILTER_OFFLOAD;
- else
+ port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
+ } else {
vlan_offload &= ~ETH_VLAN_FILTER_OFFLOAD;
+ port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
+ }

diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
if (diag < 0)
printf("rx_vlan_filter_set(port_pi=%d, on=%d) failed "
"diag=%d\n", port_id, on, diag);
+ ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
}

int
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 91dcb31c0..c1fb387fb 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -603,6 +603,7 @@ init_config(void)
port = &ports[pid];
/* Apply default Tx configuration for all ports */
port->dev_conf.txmode = tx_mode;
+ port->dev_conf.rxmode = rx_mode;
rte_eth_dev_info_get(pid, &port->dev_info);

if (numa_support) {
@@ -2089,7 +2090,6 @@ init_port_config(void)

RTE_ETH_FOREACH_DEV(pid) {
port = &ports[pid];
- port->dev_conf.rxmode = rx_mode;
port->dev_conf.fdir_conf = fdir_conf;
if (nb_rxq > 1) {
port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
--
2.12.0
Lu, Wenzhuo
2018-01-15 03:30:15 UTC
Permalink
Hi,
-----Original Message-----
Sent: Wednesday, January 10, 2018 5:09 PM
Subject: [dpdk-dev] [PATCH v4 10/11] app/testpmd: adjust on the flight VLAN
configuration
On ethdev there is an API to configure VLAN offloads after the port was
started and without reconfiguration of the port or queues.
In the current design of the application, when the Rx offloads are changed
(through "port config all" CLI command) the port configuration is overwritten,
therefore the configuration made for the VLAN is lost.
This patch is to address the issue by a configuration of each port Rx offloads
separately instead of using the global Rx config. Such adjustment is required
due to the conversion of the application to the new offloads API.
Acked-by: Wenzhuo Lu <***@intel.com>
Shahaf Shuler
2018-01-10 09:09:19 UTC
Permalink
Enable the DEV_TX_OFFLOAD_MBUF_FAST_FREE in case the underlying device
supports.

This is to preserve the previous offloads configuration made according
to the PMD defaults.

Signed-off-by: Shahaf Shuler <***@mellanox.com>
---
app/test-pmd/testpmd.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index c1fb387fb..d6f69f5fa 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -339,7 +339,9 @@ struct rte_eth_rxmode rx_mode = {
.ignore_offload_bitfield = 1,
};

-struct rte_eth_txmode tx_mode;
+struct rte_eth_txmode tx_mode = {
+ .offloads = DEV_TX_OFFLOAD_MBUF_FAST_FREE,
+};

struct rte_fdir_conf fdir_conf = {
.mode = RTE_FDIR_MODE_NONE,
@@ -605,6 +607,10 @@ init_config(void)
port->dev_conf.txmode = tx_mode;
port->dev_conf.rxmode = rx_mode;
rte_eth_dev_info_get(pid, &port->dev_info);
+ if (!(port->dev_info.tx_offload_capa &
+ DEV_TX_OFFLOAD_MBUF_FAST_FREE))
+ port->dev_conf.txmode.offloads &=
+ ~DEV_TX_OFFLOAD_MBUF_FAST_FREE;

if (numa_support) {
if (port_numa[pid] != NUMA_NO_CONFIG)
--
2.12.0
Lu, Wenzhuo
2018-01-15 03:33:14 UTC
Permalink
Hi,
-----Original Message-----
Sent: Wednesday, January 10, 2018 5:09 PM
Subject: [dpdk-dev] [PATCH v4 11/11] app/testpmd: enable fast free Tx
offload by default
Enable the DEV_TX_OFFLOAD_MBUF_FAST_FREE in case the underlying
device supports.
This is to preserve the previous offloads configuration made according to the
PMD defaults.
Acked-by: Wenzhuo Lu <***@intel.com>
Thomas Monjalon
2018-01-15 10:00:30 UTC
Permalink
Post by Shahaf Shuler
app/testpmd: fix port configuration print
app/testpmd: convert to new Ethdev Rx offloads API
app/testpmd: support check of single port stop
app/testpmd: convert to new Ethdev Tx offloads API
app/testpmd: fix flowgen forwarding ol flags
app/testpmd: cleanup internal Tx offloads flags field
app/testpmd: add command line option for Tx offloads
app/testpmd: remove txqflags
app/testpmd: enforce offloads caps
app/testpmd: adjust on the flight VLAN configuration
app/testpmd: enable fast free Tx offload by default
Applied, thanks
Continue reading on narkive:
Loading...