are as follows: - app/testpmd: revert MAC update in checksum forwarding - net/bonding: fix bond4 drop valid MAC packets - net/bonding: fix slave device Rx/Tx offload configuration - app/testpmd: fix MAC header in csum forward engine - app/testpmd: update bond port configurations when add slave - app/testpmd: fix GENEVE parsing in checksum mode - net: add UDP/TCP checksum in mbuf segments - app/testpmd: add SW L4 checksum in multi-segments - app/testpmd: fix L4 checksum in multi-segments - net/bonding: fix mbuf fast free handling (cherry picked from commit e33f71a88757d130f19712e0efd64ab7623510fb)
111 lines
4.0 KiB
Diff
111 lines
4.0 KiB
Diff
From 97b384c9ecb993ea111bd7648a0aac9127917d22 Mon Sep 17 00:00:00 2001
|
|
From: Huisong Li <lihuisong@huawei.com>
|
|
Date: Tue, 15 Nov 2022 12:06:10 +0800
|
|
Subject: app/testpmd: update bond port configurations when add slave
|
|
|
|
[ upstream commit 76376bd9cd491fb0ca9c0b78346cee0ca7c4a351 ]
|
|
|
|
Some capabilities (like, rx_offload_capa and tx_offload_capa) of bonding
|
|
device in dev_info is zero when no slave is added. And its capability will
|
|
be updated when add a new slave device.
|
|
|
|
The capability to update dynamically may introduce some problems if not
|
|
handled properly. For example, the reconfig() is called to initialize
|
|
bonding port configurations when create a bonding device. The global
|
|
tx_mode is assigned to dev_conf.txmode. The DEV_TX_OFFLOAD_MBUF_FAST_FREE
|
|
which is the default value of global tx_mode.offloads in testpmd is removed
|
|
from bonding device configuration because of zero rx_offload_capa.
|
|
As a result, this offload isn't set to bonding device.
|
|
|
|
Generally, port configurations of bonding device must be within the
|
|
intersection of the capability of all slave devices. If use original port
|
|
configurations, the removed capabilities because of adding a new slave may
|
|
cause failure when re-initialize bonding device.
|
|
|
|
So port configurations of bonding device need to be updated because of the
|
|
added and removed capabilities. In addition, this also helps to ensure
|
|
consistency between testpmd and bonding device.
|
|
|
|
Signed-off-by: Huisong Li <lihuisong@huawei.com>
|
|
Reviewed-by: Min Hu (Connor) <humin29@huawei.com>
|
|
---
|
|
app/test-pmd/testpmd.c | 40 ++++++++++++++++++++++++++++++++++++++++
|
|
app/test-pmd/testpmd.h | 3 ++-
|
|
2 files changed, 42 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
|
|
index ff9eabbcb7..32098d4701 100644
|
|
--- a/app/test-pmd/testpmd.c
|
|
+++ b/app/test-pmd/testpmd.c
|
|
@@ -2778,6 +2778,41 @@ fill_xstats_display_info(void)
|
|
fill_xstats_display_info_for_port(pi);
|
|
}
|
|
|
|
+/*
|
|
+ * Some capabilities (like, rx_offload_capa and tx_offload_capa) of bonding
|
|
+ * device in dev_info is zero when no slave is added. And its capability
|
|
+ * will be updated when add a new slave device. So adding a slave device need
|
|
+ * to update the port configurations of bonding device.
|
|
+ */
|
|
+static void
|
|
+update_bonding_port_dev_conf(portid_t bond_pid)
|
|
+{
|
|
+#ifdef RTE_NET_BOND
|
|
+ struct rte_port *port = &ports[bond_pid];
|
|
+ uint16_t i;
|
|
+ int ret;
|
|
+
|
|
+ ret = eth_dev_info_get_print_err(bond_pid, &port->dev_info);
|
|
+ if (ret != 0) {
|
|
+ fprintf(stderr, "Failed to get dev info for port = %u\n",
|
|
+ bond_pid);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (port->dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE)
|
|
+ port->dev_conf.txmode.offloads |=
|
|
+ RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;
|
|
+ /* Apply Tx offloads configuration */
|
|
+ for (i = 0; i < port->dev_info.max_tx_queues; i++)
|
|
+ port->tx_conf[i].offloads = port->dev_conf.txmode.offloads;
|
|
+
|
|
+ port->dev_conf.rx_adv_conf.rss_conf.rss_hf &=
|
|
+ port->dev_info.flow_type_rss_offloads;
|
|
+#else
|
|
+ RTE_SET_USED(bond_pid);
|
|
+#endif
|
|
+}
|
|
+
|
|
int
|
|
start_port(portid_t pid)
|
|
{
|
|
@@ -2842,6 +2877,11 @@ start_port(portid_t pid)
|
|
return -1;
|
|
}
|
|
|
|
+ if (port->bond_flag == 1 && port->update_conf == 1) {
|
|
+ update_bonding_port_dev_conf(pi);
|
|
+ port->update_conf = 0;
|
|
+ }
|
|
+
|
|
/* configure port */
|
|
diag = eth_dev_configure_mp(pi, nb_rxq + nb_hairpinq,
|
|
nb_txq + nb_hairpinq,
|
|
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
|
|
index 442f97ce3d..480dc3fa34 100644
|
|
--- a/app/test-pmd/testpmd.h
|
|
+++ b/app/test-pmd/testpmd.h
|
|
@@ -248,7 +248,8 @@ struct rte_port {
|
|
uint32_t mc_addr_nb; /**< nb. of addr. in mc_addr_pool */
|
|
uint8_t slave_flag : 1, /**< bonding slave port */
|
|
bond_flag : 1, /**< port is bond device */
|
|
- fwd_mac_swap : 1; /**< swap packet MAC before forward */
|
|
+ fwd_mac_swap : 1, /**< swap packet MAC before forward */
|
|
+ update_conf : 1; /**< need to update bonding device configuration */
|
|
struct port_flow *flow_list; /**< Associated flows. */
|
|
struct port_indirect_action *actions_list;
|
|
/**< Associated indirect actions. */
|
|
--
|
|
2.23.0
|
|
|