diff options
author | Mohsin Kazmi <sykazmi@cisco.com> | 2021-06-17 17:20:02 +0000 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2021-09-16 10:42:59 +0000 |
commit | 64dd1720e5fd6f0cd9b029a5bc312e7264ac7d24 (patch) | |
tree | 38d83830715d9ec702edd58b61c8fecdf26fc96f /src/plugins/dpdk/device/init.c | |
parent | 82f9444dbe7fc3719d43dad313df15f686e3b68c (diff) |
dpdk: add support for outer udp and ipv4 checksums
Type: improvement
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
Change-Id: I10141033030342881298d70742fa5bdea402b4c9
Diffstat (limited to 'src/plugins/dpdk/device/init.c')
-rw-r--r-- | src/plugins/dpdk/device/init.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/src/plugins/dpdk/device/init.c b/src/plugins/dpdk/device/init.c index f7c1cc106ba..18124c32ff0 100644 --- a/src/plugins/dpdk/device/init.c +++ b/src/plugins/dpdk/device/init.c @@ -370,6 +370,18 @@ dpdk_lib_init (dpdk_main_t * dm) xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_UDP_CKSUM; if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM) xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_TCP_CKSUM; + if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) + xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM; + + if (dm->conf->enable_outer_checksum_offload) + { + if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) + xd->port_conf.txmode.offloads |= + DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM; + if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) + xd->port_conf.txmode.offloads |= + DEV_TX_OFFLOAD_OUTER_UDP_CKSUM; + } } if (dm->conf->enable_lro) @@ -480,9 +492,8 @@ dpdk_lib_init (dpdk_main_t * dm) { xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM; xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM; - xd->flags |= - DPDK_DEVICE_FLAG_TX_OFFLOAD | - DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM; + xd->flags |= DPDK_DEVICE_FLAG_TX_OFFLOAD | + DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM; } xd->port_conf.intr_conf.rxq = 1; @@ -816,6 +827,11 @@ dpdk_lib_init (dpdk_main_t * dm) hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_CKSUM | VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM; + if (dm->conf->enable_outer_checksum_offload) + { + hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_OUTER_CKSUM | + VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_OUTER_CKSUM; + } } if (devconf->tso == DPDK_DEVICE_TSO_ON && hi != NULL) { @@ -823,10 +839,16 @@ dpdk_lib_init (dpdk_main_t * dm) if ((dm->conf->enable_tcp_udp_checksum) && (hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM)) { - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_UDP_GSO; - xd->port_conf.txmode.offloads |= - DEV_TX_OFFLOAD_TCP_TSO | DEV_TX_OFFLOAD_UDP_TSO; + hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO; + xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_TSO; + + if (dm->conf->enable_outer_checksum_offload && + (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO)) + { + xd->port_conf.txmode.offloads |= + DEV_TX_OFFLOAD_VXLAN_TNL_TSO; + hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_VXLAN_TNL_GSO; + } } else clib_warning ("%s: TCP/UDP checksum offload must be enabled", @@ -1391,8 +1413,11 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input) conf->enable_telemetry = 1; else if (unformat (input, "enable-tcp-udp-checksum")) - conf->enable_tcp_udp_checksum = 1; - + { + conf->enable_tcp_udp_checksum = 1; + if (unformat (input, "enable-outer-checksum-offload")) + conf->enable_outer_checksum_offload = 1; + } else if (unformat (input, "no-tx-checksum-offload")) conf->no_tx_checksum_offload = 1; |