If it's a DPDK net_bonding, it may cause
offload-related configurations to take effect,
leading to offload failure.

/usr/share/openvswitch/scripts/ovs-ctl restart --no-ovs-vswitchd \
--system-id=test
ovs-vsctl --no-wait set open . external-ids:ovn-bridge-datapath-type\
=netdev
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=\
"4096,4096"
ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=\
0xff0000
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-extra=\
"-a 0000:ca:00.0  -a 0000:ca:00.1 --vdev net_bonding2494589023,\
mode=4,member=0000:ca:00.0,member=0000:ca:00.1,xmit_policy=l34,\
lacp_rate=fast"
ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer \
-vsyslog:err -vfile:info --mlockall --no-chdir \
--log-file=/var/log/openvswitch/ovs-vswitchd.log \
--pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
ovs-vsctl  add-br br-tun -- set bridge br-tun datapath_type=netdev
ovs-vsctl --may-exist add-port br-tun dpdk_tun_port -- set Interface \
dpdk_tun_port type=dpdk options:dpdk-devargs="net_bonding2494589023"

{bus_info="bus_name=vdev", driver_name=net_bonding,
 if_descr="DPDK 23.11.0 net_bonding", if_type="6",link_speed="20Gbps",
 max_hash_mac_addrs="0", max_mac_addrs="16", max_rx_pktlen="1618",
 max_rx_queues="1023", max_tx_queues="1023", max_vfs="0",
 max_vmdq_pools="0", min_rx_bufsize="0", n_rxq="4", n_txq="9",
 numa_id="0", port_no="2", rx-steering=rss, rx_csum_offload="false",
 tx_geneve_tso_offload="false", tx_ip_csum_offload="false",
 tx_out_ip_csum_offload="false", tx_out_udp_csum_offload="false",
 tx_sctp_csum_offload="false", tx_tcp_csum_offload="false",
 tx_tcp_seg_offload="false", tx_udp_csum_offload="false",
 tx_vxlan_tso_offload="false"}

Fixes: 5d11c47d3ebe ("userspace: Enable IP checksum offloading by default.")

Signed-off-by: Jun Wang <junwan...@cestc.cn>
---
 lib/netdev-dpdk.c | 75 +++++++++++++++++++++++++++++++++----------------------
 1 file changed, 45 insertions(+), 30 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 2111f77..191c83d 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -1294,15 +1294,10 @@ dpdk_eth_dev_init_rx_metadata(struct netdev_dpdk *dev)
     dev->rx_metadata_delivery_configured = true;
 }
 
-static int
-dpdk_eth_dev_init(struct netdev_dpdk *dev)
-    OVS_REQUIRES(dev->mutex)
+static void
+dpdk_eth_offload_config(struct netdev_dpdk *dev,
+                               struct rte_eth_dev_info *info)
 {
-    struct rte_pktmbuf_pool_private *mbp_priv;
-    struct rte_eth_dev_info info;
-    struct rte_ether_addr eth_addr;
-    int diag;
-    int n_rxq, n_txq;
     uint32_t rx_chksm_offload_capa = RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
                                      RTE_ETH_RX_OFFLOAD_TCP_CKSUM |
                                      RTE_ETH_RX_OFFLOAD_IPV4_CKSUM;
@@ -1319,16 +1314,14 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
         dpdk_eth_dev_init_rx_metadata(dev);
     }
 
-    rte_eth_dev_info_get(dev->port_id, &info);
-
-    if (strstr(info.driver_name, "vf") != NULL) {
+    if (strstr(info->driver_name, "vf") != NULL) {
         VLOG_INFO("Virtual function detected, HW_CRC_STRIP will be enabled");
         dev->hw_ol_features |= NETDEV_RX_HW_CRC_STRIP;
     } else {
         dev->hw_ol_features &= ~NETDEV_RX_HW_CRC_STRIP;
     }
 
-    if ((info.rx_offload_capa & rx_chksm_offload_capa) !=
+    if ((info->rx_offload_capa & rx_chksm_offload_capa) !=
             rx_chksm_offload_capa) {
         VLOG_WARN("Rx checksum offload is not supported on port "
                   DPDK_PORT_ID_FMT, dev->port_id);
@@ -1337,66 +1330,66 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
         dev->hw_ol_features |= NETDEV_RX_CHECKSUM_OFFLOAD;
     }
 
-    if (info.rx_offload_capa & RTE_ETH_RX_OFFLOAD_SCATTER) {
+    if (info->rx_offload_capa & RTE_ETH_RX_OFFLOAD_SCATTER) {
         dev->hw_ol_features |= NETDEV_RX_HW_SCATTER;
     } else {
         /* Do not warn on lack of scatter support */
         dev->hw_ol_features &= ~NETDEV_RX_HW_SCATTER;
     }
 
-    if (!strcmp(info.driver_name, "net_tap")) {
+    if (!strcmp(info->driver_name, "net_tap")) {
         /* FIXME: L4 checksum offloading is broken in DPDK net/tap driver.
          * This workaround can be removed once the fix makes it to a DPDK
          * LTS release used by OVS. */
         VLOG_INFO("%s: disabled Tx L4 checksum offloads for a net/tap port.",
                   netdev_get_name(&dev->up));
-        info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_UDP_CKSUM;
-        info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
+        info->tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_UDP_CKSUM;
+        info->tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
     }
 
-    if (!strcmp(info.driver_name, "net_ice")
-        || !strcmp(info.driver_name, "net_i40e")) {
+    if (!strcmp(info->driver_name, "net_ice")
+        || !strcmp(info->driver_name, "net_i40e")) {
         /* FIXME: Driver advertises the capability but doesn't seem
          * to actually support it correctly.  Can remove this once
          * the driver is fixed on DPDK side. */
         VLOG_INFO("%s: disabled Tx outer udp checksum offloads for a "
                   "net/ice or net/i40e port.", netdev_get_name(&dev->up));
-        info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM;
-        info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO;
-        info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO;
+        info->tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM;
+        info->tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO;
+        info->tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO;
     }
 
-    if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM) {
+    if (info->tx_offload_capa & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM) {
         dev->hw_ol_features |= NETDEV_TX_IPV4_CKSUM_OFFLOAD;
     } else {
         dev->hw_ol_features &= ~NETDEV_TX_IPV4_CKSUM_OFFLOAD;
     }
 
-    if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) {
+    if (info->tx_offload_capa & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) {
         dev->hw_ol_features |= NETDEV_TX_TCP_CKSUM_OFFLOAD;
     } else {
         dev->hw_ol_features &= ~NETDEV_TX_TCP_CKSUM_OFFLOAD;
     }
 
-    if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) {
+    if (info->tx_offload_capa & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) {
         dev->hw_ol_features |= NETDEV_TX_UDP_CKSUM_OFFLOAD;
     } else {
         dev->hw_ol_features &= ~NETDEV_TX_UDP_CKSUM_OFFLOAD;
     }
 
-    if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_SCTP_CKSUM) {
+    if (info->tx_offload_capa & RTE_ETH_TX_OFFLOAD_SCTP_CKSUM) {
         dev->hw_ol_features |= NETDEV_TX_SCTP_CKSUM_OFFLOAD;
     } else {
         dev->hw_ol_features &= ~NETDEV_TX_SCTP_CKSUM_OFFLOAD;
     }
 
-    if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
+    if (info->tx_offload_capa & RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
         dev->hw_ol_features |= NETDEV_TX_OUTER_IP_CKSUM_OFFLOAD;
     } else {
         dev->hw_ol_features &= ~NETDEV_TX_OUTER_IP_CKSUM_OFFLOAD;
     }
 
-    if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM) {
+    if (info->tx_offload_capa & RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM) {
         dev->hw_ol_features |= NETDEV_TX_OUTER_UDP_CKSUM_OFFLOAD;
     } else {
         dev->hw_ol_features &= ~NETDEV_TX_OUTER_UDP_CKSUM_OFFLOAD;
@@ -1404,21 +1397,21 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
 
     dev->hw_ol_features &= ~NETDEV_TX_TSO_OFFLOAD;
     if (userspace_tso_enabled()) {
-        if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_TCP_TSO) {
+        if (info->tx_offload_capa & RTE_ETH_TX_OFFLOAD_TCP_TSO) {
             dev->hw_ol_features |= NETDEV_TX_TSO_OFFLOAD;
         } else {
             VLOG_WARN("%s: Tx TSO offload is not supported.",
                       netdev_get_name(&dev->up));
         }
 
-        if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO) {
+        if (info->tx_offload_capa & RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO) {
             dev->hw_ol_features |= NETDEV_TX_VXLAN_TNL_TSO_OFFLOAD;
         } else {
             VLOG_WARN("%s: Tx Vxlan tunnel TSO offload is not supported.",
                       netdev_get_name(&dev->up));
         }
 
-        if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO) {
+        if (info->tx_offload_capa & RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO) {
             dev->hw_ol_features |= NETDEV_TX_GENEVE_TNL_TSO_OFFLOAD;
         } else {
             VLOG_WARN("%s: Tx Geneve tunnel TSO offload is not supported.",
@@ -1426,6 +1419,21 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
         }
     }
 
+}
+
+static int
+dpdk_eth_dev_init(struct netdev_dpdk *dev)
+    OVS_REQUIRES(dev->mutex)
+{
+    struct rte_pktmbuf_pool_private *mbp_priv;
+    struct rte_eth_dev_info info;
+    struct rte_ether_addr eth_addr;
+    int diag;
+    int n_rxq, n_txq;
+
+    rte_eth_dev_info_get(dev->port_id, &info);
+    dpdk_eth_offload_config(dev, &info);
+
     n_rxq = MIN(info.max_rx_queues, dev->up.n_rxq);
     n_txq = MIN(info.max_tx_queues, dev->up.n_txq);
 
@@ -1439,6 +1447,13 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
         return -diag;
     }
 
+    rte_eth_dev_info_get(dev->port_id, &info);
+    if (!strcmp(info.driver_name, "net_bonding")) {
+        dpdk_eth_offload_config(dev, &info);
+        VLOG_INFO("%s: configure offloads for a dpdk net_bonding port.",
+                   netdev_get_name(&dev->up));
+    }
+
     diag = rte_eth_dev_start(dev->port_id);
     if (diag) {
         VLOG_ERR("Interface %s start error: %s", dev->up.name,
-- 
1.8.3.1



_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to