From a4a49e91674e01011945b016327b79e44ab9489e Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Sun, 1 Dec 2024 11:21:05 -0700 Subject: [PATCH] catchup --- .cargo/config.toml | 2 +- Cargo.toml | 3 - .../mdbook/src/dataplane/development-plan.md | 20 +- design-docs/src/mdbook/src/links.md | 1 + dpdk-sys/Cargo.toml | 3 + dpdk-sys/build.rs | 1 - dpdk/src/dev.rs | 346 +++++++++--------- dpdk/src/queue/rx.rs | 11 +- dpdk/src/queue/tx.rs | 1 - net/src/lib.rs | 14 +- scratch/src/main.rs | 8 +- scripts/dpdk-sys.env | 3 +- 12 files changed, 222 insertions(+), 191 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 95460b58..50b226a3 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -11,7 +11,7 @@ just = ["just", "cargo"] sterile = ["just", "sterile", "cargo"] [target.x86_64-unknown-linux-gnu] -runner = "sudo -E" +runner = "/usr/bin/sudo -E" [target.x86_64-unknown-linux-musl] runner = "sudo -E" diff --git a/Cargo.toml b/Cargo.toml index e72f15d7..fc631ad3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,15 +13,12 @@ resolver = "2" bindgen = { version = "0.70.1" } bolero = { version = "=0.10.1" } # TODO: update as soon as resolution bug with 0.11 or better is fixed -cc = { version = "1.1.37" } criterion = { version = "0.5.1", default-features = true } doxygen-rs = { version = "0.4.0" } etherparse = { version = "0.16.0", default-features = false, features = [] } -libc = { version = "0.2.161" } rand = { version = "0.8.5", default-features = false, features = [] } rstest = { version = "0.23.0", default-features = false, features = [] } serde = { version = "1.0.213", default-features = false, features = ["derive", "alloc", "rc"] } -syscalls = { version = "0.6.18" } thiserror = { version = "2.0.2", default-features = false } tracing = { version = "0.1.40", default-features = false, features = ["attributes"] } tracing-subscriber = { version = "0.3.18" } diff --git a/design-docs/src/mdbook/src/dataplane/development-plan.md b/design-docs/src/mdbook/src/dataplane/development-plan.md index ce0a3dea..25c875fe 100644 --- a/design-docs/src/mdbook/src/dataplane/development-plan.md +++ b/design-docs/src/mdbook/src/dataplane/development-plan.md @@ -126,12 +126,13 @@ digraph g { } @enddot ``` +
> Graph of the engineering development plan. > Each node on the graph represents a task or required function. > No task can be _completed_ without all the other tasks which point to it. -> +> > * Tasks shown in orange are points of higher uncertainty and risk. > * Tasks shown in pink are points of expected higher difficulty. > * Tasks shown in gray are already completed. @@ -144,3 +145,20 @@ digraph g { > [!WARNING] > Tasks of high expected difficulty are different from tasks which we expect will be very time-consuming. + +## Near-term stuff + +1. [DPDK] rust framework + 1. flow offload framework + 2. device configuration framework + 3. memory management framework + 4. mbuf framework (packet management) +2. [etherparse] packet parse tooling + 1. integration with mbuf framework + 2. enums (algebraic) +3. build out [smoltcp] test fixture integration + 1. this is exclusively for testing! + 2. will likely need minor [etherparse] integration + 3. should _NOT_ be integrated by +4. + diff --git a/design-docs/src/mdbook/src/links.md b/design-docs/src/mdbook/src/links.md index 7a3a1332..076cb541 100644 --- a/design-docs/src/mdbook/src/links.md +++ b/design-docs/src/mdbook/src/links.md @@ -44,6 +44,7 @@ [distributed SQL]: https://en.wikipedia.org/wiki/Distributed_SQL [dpdk]: https://www.dpdk.org/ [etcd]: https://github.com/coreos/etcd +[etherparse]: https://github.com/JulianSchmid/etherparse [frr]: https://frrouting.org/ [graphana]: https://grafana.com/ [kernel]: https://en.wikipedia.org/wiki/Linux_kernel diff --git a/dpdk-sys/Cargo.toml b/dpdk-sys/Cargo.toml index db912aa9..a543a55e 100644 --- a/dpdk-sys/Cargo.toml +++ b/dpdk-sys/Cargo.toml @@ -5,6 +5,9 @@ edition = "2021" description = "Low-level bindings to the Data Plane Development Kit (DPDK)" publish = false +[lib] +crate-type = ["rlib"] + [build-dependencies] bindgen = { workspace = true, features = ["runtime"] } doxygen-rs = { workspace = true } diff --git a/dpdk-sys/build.rs b/dpdk-sys/build.rs index d3ff1b73..1e794cbf 100644 --- a/dpdk-sys/build.rs +++ b/dpdk-sys/build.rs @@ -104,7 +104,6 @@ fn main() { "mlx5", "nl-route-3", "nl-3", - "numa", ]; diff --git a/dpdk/src/dev.rs b/dpdk/src/dev.rs index 90158bf3..a28ca2f3 100644 --- a/dpdk/src/dev.rs +++ b/dpdk/src/dev.rs @@ -3,6 +3,8 @@ //! Ethernet device management. +use bitflags::*; + use alloc::format; use alloc::vec::Vec; use core::ffi::{c_uint, CStr}; @@ -214,7 +216,8 @@ pub struct DevConfig { /// Setting it to `None` should disable all offloads, but instead we default to enabling all /// supported. /// Rework this bad idea. - pub tx_offloads: Option, + pub tx_offloads: Option<()>, + // pub tx_offloads: Option, } #[derive(Debug)] @@ -227,13 +230,10 @@ pub enum DevConfigError { impl DevConfig { /// Apply the configuration to the device. pub fn apply(&self, dev: DevInfo) -> Result { - const ANY_SUPPORTED: u64 = u64::MAX; let eth_conf = rte_eth_conf { txmode: rte_eth_txmode { offloads: { - let requested = self - .tx_offloads - .map_or(TxOffload(ANY_SUPPORTED), TxOffload::from); + let requested = TxOffload::ALL_KNOWN; let supported = dev.tx_offload_caps(); (requested & supported).0 }, @@ -314,74 +314,74 @@ impl From for RxOffload { } } -/// Verbose configuration for transmit offloads. -/// -/// This struct is mostly for coherent reporting on network cards. -/// -/// TODO: fill in remaining offload types from `rte_ethdev.h` -#[non_exhaustive] -#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct TxOffloadConfig { - /// GENEVE tunnel segmentation offload. - pub geneve_tnl_tso: bool, - /// GRE tunnel segmentation offload. - pub gre_tnl_tso: bool, - /// IPIP tunnel segmentation offload. - pub ipip_tnl_tso: bool, - /// IPv4 checksum calculation. - pub ipv4_cksum: bool, - /// MACsec insertion. - pub macsec_insert: bool, - /// Outer IPv4 checksum calculation. - pub outer_ipv4_cksum: bool, - /// QinQ (double VLAN) insertion. - pub qinq_insert: bool, - /// SCTP checksum calculation. - pub sctp_cksum: bool, - /// TCP checksum calculation. - pub tcp_cksum: bool, - /// TCP segmentation offload. - pub tcp_tso: bool, - /// UDP checksum calculation. - pub udp_cksum: bool, - /// UDP segmentation offload. - pub udp_tso: bool, - /// VLAN tag insertion. - pub vlan_insert: bool, - /// VXLAN tunnel segmentation offload. - pub vxlan_tnl_tso: bool, - /// Any flags that are not known to map to a valid offload. - pub unknown: u64, -} - -impl Default for TxOffloadConfig { - /// Defaults to enabling all known offloads - fn default() -> Self { - TxOffloadConfig { - geneve_tnl_tso: true, - gre_tnl_tso: true, - ipip_tnl_tso: true, - ipv4_cksum: true, - macsec_insert: true, - outer_ipv4_cksum: true, - qinq_insert: true, - sctp_cksum: true, - tcp_cksum: true, - tcp_tso: true, - udp_cksum: true, - udp_tso: true, - vlan_insert: true, - vxlan_tnl_tso: true, - unknown: 0, - } - } -} - -impl Display for TxOffloadConfig { - fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { - write!(f, "{self:?}") - } -} +// /// Verbose configuration for transmit offloads. +// /// +// /// This struct is mostly for coherent reporting on network cards. +// /// +// /// TODO: fill in remaining offload types from `rte_ethdev.h` +// #[non_exhaustive] +// #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +// pub struct TxOffloadConfig { +// /// GENEVE tunnel segmentation offload. +// pub geneve_tnl_tso: bool, +// /// GRE tunnel segmentation offload. +// pub gre_tnl_tso: bool, +// /// IPIP tunnel segmentation offload. +// pub ipip_tnl_tso: bool, +// /// IPv4 checksum calculation. +// pub ipv4_cksum: bool, +// /// MACsec insertion. +// pub macsec_insert: bool, +// /// Outer IPv4 checksum calculation. +// pub outer_ipv4_cksum: bool, +// /// QinQ (double VLAN) insertion. +// pub qinq_insert: bool, +// /// SCTP checksum calculation. +// pub sctp_cksum: bool, +// /// TCP checksum calculation. +// pub tcp_cksum: bool, +// /// TCP segmentation offload. +// pub tcp_tso: bool, +// /// UDP checksum calculation. +// pub udp_cksum: bool, +// /// UDP segmentation offload. +// pub udp_tso: bool, +// /// VLAN tag insertion. +// pub vlan_insert: bool, +// /// VXLAN tunnel segmentation offload. +// pub vxlan_tnl_tso: bool, +// /// Any flags that are not known to map to a valid offload. +// pub unknown: u64, +// } + +// impl Default for TxOffloadConfig { +// /// Defaults to enabling all known offloads +// fn default() -> Self { +// TxOffloadConfig { +// geneve_tnl_tso: true, +// gre_tnl_tso: true, +// ipip_tnl_tso: true, +// ipv4_cksum: true, +// macsec_insert: true, +// outer_ipv4_cksum: true, +// qinq_insert: true, +// sctp_cksum: true, +// tcp_cksum: true, +// tcp_tso: true, +// udp_cksum: true, +// udp_tso: true, +// vlan_insert: true, +// vxlan_tnl_tso: true, +// unknown: 0, +// } +// } +// } + +// impl Display for TxOffloadConfig { +// fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { +// write!(f, "{self:?}") +// } +// } bitflags! { #[repr(transparent)] @@ -413,97 +413,112 @@ bitflags! { } } -impl From for TxOffload { - fn from(value: TxOffloadConfig) -> Self { - use wrte_eth_tx_offload::*; - TxOffload( - if value.geneve_tnl_tso { - TX_OFFLOAD_GENEVE_TNL_TSO - } else { - 0 - } | if value.gre_tnl_tso { - TX_OFFLOAD_GRE_TNL_TSO - } else { - 0 - } | if value.ipip_tnl_tso { - TX_OFFLOAD_IPIP_TNL_TSO - } else { - 0 - } | if value.ipv4_cksum { - TX_OFFLOAD_IPV4_CKSUM - } else { - 0 - } | if value.macsec_insert { - TX_OFFLOAD_MACSEC_INSERT - } else { - 0 - } | if value.outer_ipv4_cksum { - TX_OFFLOAD_OUTER_IPV4_CKSUM - } else { - 0 - } | if value.qinq_insert { - TX_OFFLOAD_QINQ_INSERT - } else { - 0 - } | if value.sctp_cksum { - TX_OFFLOAD_SCTP_CKSUM - } else { - 0 - } | if value.tcp_cksum { - TX_OFFLOAD_TCP_CKSUM - } else { - 0 - } | if value.tcp_tso { TX_OFFLOAD_TCP_TSO } else { 0 } - | if value.udp_cksum { - TX_OFFLOAD_UDP_CKSUM - } else { - 0 - } - | if value.qinq_insert { TX_OFFLOAD_QINQ_INSERT } else { 0 } - | if value.sctp_cksum { TX_OFFLOAD_SCTP_CKSUM } else { 0 } - | if value.tcp_cksum { TX_OFFLOAD_TCP_CKSUM } else { 0 } - | if value.tcp_tso { TX_OFFLOAD_TCP_TSO } else { 0 } - | if value.udp_cksum { TX_OFFLOAD_UDP_CKSUM } else { 0 } - | if value.udp_tso { TX_OFFLOAD_UDP_TSO } else { 0 } - | if value.vlan_insert { TX_OFFLOAD_VLAN_INSERT } else { 0 } - | if value.udp_tso { TX_OFFLOAD_UDP_TSO } else { 0 } - | if value.vlan_insert { - TX_OFFLOAD_VLAN_INSERT - } else { - 0 - } - | if value.vxlan_tnl_tso { - TX_OFFLOAD_VXLAN_TNL_TSO - } else { - 0 - } - | value.unknown, - ) - } -} - -impl From for TxOffloadConfig { - fn from(value: TxOffload) -> Self { - use wrte_eth_tx_offload::*; - TxOffloadConfig { - geneve_tnl_tso: value.0 & TX_OFFLOAD_GENEVE_TNL_TSO != 0, - gre_tnl_tso: value.0 & TX_OFFLOAD_GRE_TNL_TSO != 0, - ipip_tnl_tso: value.0 & TX_OFFLOAD_IPIP_TNL_TSO != 0, - ipv4_cksum: value.0 & TX_OFFLOAD_IPV4_CKSUM != 0, - macsec_insert: value.0 & TX_OFFLOAD_MACSEC_INSERT != 0, - outer_ipv4_cksum: value.0 & TX_OFFLOAD_OUTER_IPV4_CKSUM != 0, - qinq_insert: value.0 & TX_OFFLOAD_QINQ_INSERT != 0, - sctp_cksum: value.0 & TX_OFFLOAD_SCTP_CKSUM != 0, - tcp_cksum: value.0 & TX_OFFLOAD_TCP_CKSUM != 0, - tcp_tso: value.0 & TX_OFFLOAD_TCP_TSO != 0, - udp_cksum: value.0 & TX_OFFLOAD_UDP_CKSUM != 0, - udp_tso: value.0 & TX_OFFLOAD_UDP_TSO != 0, - vlan_insert: value.0 & TX_OFFLOAD_VLAN_INSERT != 0, - vxlan_tnl_tso: value.0 & TX_OFFLOAD_VXLAN_TNL_TSO != 0, - unknown: value.0 & !TxOffload::ALL_KNOWN.0, - } - } -} +// // TODO: we have had some kind of merge issue and now this method is mostly nonsense +// impl From for TxOffload { +// fn from(value: TxOffloadConfig) -> Self { +// use wrte_eth_tx_offload::*; +// TxOffload( +// if value.geneve_tnl_tso { +// TX_OFFLOAD_GENEVE_TNL_TSO +// } else { +// 0 +// } | if value.gre_tnl_tso { +// TX_OFFLOAD_GRE_TNL_TSO +// } else { +// 0 +// } | if value.ipip_tnl_tso { +// TX_OFFLOAD_IPIP_TNL_TSO +// } else { +// 0 +// } | if value.ipv4_cksum { +// TX_OFFLOAD_IPV4_CKSUM +// } else { +// 0 +// } | if value.macsec_insert { +// TX_OFFLOAD_MACSEC_INSERT +// } else { +// 0 +// } | if value.outer_ipv4_cksum { +// TX_OFFLOAD_OUTER_IPV4_CKSUM +// } else { +// 0 +// } | if value.qinq_insert { +// TX_OFFLOAD_QINQ_INSERT +// } else { +// 0 +// } | if value.sctp_cksum { +// TX_OFFLOAD_SCTP_CKSUM +// } else { +// 0 +// } | if value.tcp_cksum { +// TX_OFFLOAD_TCP_CKSUM +// } else { +// 0 +// } | if value.tcp_tso { TX_OFFLOAD_TCP_TSO } else { 0 } +// | if value.udp_cksum { +// TX_OFFLOAD_UDP_CKSUM +// } else { +// 0 +// } +// | if value.qinq_insert { +// TX_OFFLOAD_QINQ_INSERT +// } else { +// 0 +// } +// | if value.sctp_cksum { +// TX_OFFLOAD_SCTP_CKSUM +// } else { +// 0 +// } +// | if value.tcp_cksum { +// TX_OFFLOAD_TCP_CKSUM +// } else { +// 0 +// } +// | if value.tcp_tso { TX_OFFLOAD_TCP_TSO } else { 0 } +// | if value.udp_cksum { +// TX_OFFLOAD_UDP_CKSUM +// } else { +// 0 +// } +// | if value.udp_tso { TX_OFFLOAD_UDP_TSO } else { 0 } +// | if value.vlan_insert { +// TX_OFFLOAD_VLAN_INSERT +// } else { +// 0 +// } +// | if value.vxlan_tnl_tso { +// TX_OFFLOAD_VXLAN_TNL_TSO +// } else { +// 0 +// } +// | value.unknown, +// ) +// } +// } + +// impl From for TxOffloadConfig { +// fn from(value: TxOffload) -> Self { +// use wrte_eth_tx_offload::*; +// TxOffloadConfig { +// geneve_tnl_tso: value.0 & TX_OFFLOAD_GENEVE_TNL_TSO != 0, +// gre_tnl_tso: value.0 & TX_OFFLOAD_GRE_TNL_TSO != 0, +// ipip_tnl_tso: value.0 & TX_OFFLOAD_IPIP_TNL_TSO != 0, +// ipv4_cksum: value.0 & TX_OFFLOAD_IPV4_CKSUM != 0, +// macsec_insert: value.0 & TX_OFFLOAD_MACSEC_INSERT != 0, +// outer_ipv4_cksum: value.0 & TX_OFFLOAD_OUTER_IPV4_CKSUM != 0, +// qinq_insert: value.0 & TX_OFFLOAD_QINQ_INSERT != 0, +// sctp_cksum: value.0 & TX_OFFLOAD_SCTP_CKSUM != 0, +// tcp_cksum: value.0 & TX_OFFLOAD_TCP_CKSUM != 0, +// tcp_tso: value.0 & TX_OFFLOAD_TCP_TSO != 0, +// udp_cksum: value.0 & TX_OFFLOAD_UDP_CKSUM != 0, +// udp_tso: value.0 & TX_OFFLOAD_UDP_TSO != 0, +// vlan_insert: value.0 & TX_OFFLOAD_VLAN_INSERT != 0, +// vxlan_tnl_tso: value.0 & TX_OFFLOAD_VXLAN_TNL_TSO != 0, +// unknown: value.0 & !TxOffload::ALL_KNOWN.0, +// } +// } +// } impl TxOffload { /// GENEVE tunnel segmentation offload. @@ -517,7 +532,8 @@ impl TxOffload { /// MACsec insertion. pub const MACSEC_INSERT: TxOffload = TxOffload(wrte_eth_tx_offload::TX_OFFLOAD_MACSEC_INSERT); /// Outer IPv4 checksum calculation. - pub const OUTER_IPV4_CKSUM: TxOffload = TxOffload(wrte_eth_tx_offload::TX_OFFLOAD_OUTER_IPV4_CKSUM); + pub const OUTER_IPV4_CKSUM: TxOffload = + TxOffload(wrte_eth_tx_offload::TX_OFFLOAD_OUTER_IPV4_CKSUM); /// QinQ (double VLAN) insertion. pub const QINQ_INSERT: TxOffload = TxOffload(wrte_eth_tx_offload::TX_OFFLOAD_QINQ_INSERT); /// SCTP checksum calculation. diff --git a/dpdk/src/queue/rx.rs b/dpdk/src/queue/rx.rs index eda96eaa..41d2db2d 100644 --- a/dpdk/src/queue/rx.rs +++ b/dpdk/src/queue/rx.rs @@ -9,7 +9,7 @@ use crate::socket::SocketId; use crate::{dev, mem, socket}; use dpdk_sys::*; use errno::ErrorCode; -use tracing::{info, trace, warn}; +use tracing::{trace, warn}; #[repr(transparent)] #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -62,7 +62,7 @@ pub struct RxQueueConfig { pub enum ConfigFailure { /// The device has been removed. DeviceRemoved(ErrorCode), - /// Invalid arguments were passed to the receive queue configuration. + /// Invalid arguments were passed to the rx queue configuration. InvalidArgument(ErrorCode), /// Memory allocation failed. NoMemory(ErrorCode), @@ -91,8 +91,7 @@ impl RxQueue { #[tracing::instrument(level = "info")] pub(crate) fn configure(dev: &dev::Dev, config: RxQueueConfig) -> Result { use ConfigFailure::*; - let socket_id = - SocketId::try_from(config.socket_preference).map_err(InvalidSocket)?; + let socket_id = SocketId::try_from(config.socket_preference).map_err(InvalidSocket)?; // dev.info.index // info!("Configuring RX queue on socket {socket_id} for device {dev_info}", d); @@ -123,7 +122,7 @@ impl RxQueue { } } - /// Start the receive queue. + /// Start the rx queue. #[tracing::instrument(level = "info")] pub(crate) fn start(self) -> Result { let ret = unsafe { @@ -140,7 +139,7 @@ impl RxQueue { } } - /// Start the receive queue. + /// Start the rx queue. #[tracing::instrument(level = "info")] pub(crate) fn stop(self) -> Result { let ret = unsafe { diff --git a/dpdk/src/queue/tx.rs b/dpdk/src/queue/tx.rs index 479dfdb3..03e665a0 100644 --- a/dpdk/src/queue/tx.rs +++ b/dpdk/src/queue/tx.rs @@ -3,7 +3,6 @@ //! Transmit queue configuration and management. -use tracing::info; use crate::dev::DevIndex; use crate::{dev, socket}; use dpdk_sys::*; diff --git a/net/src/lib.rs b/net/src/lib.rs index 33656f93..e7fa1f7d 100644 --- a/net/src/lib.rs +++ b/net/src/lib.rs @@ -1,10 +1,14 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright Open Network Fabric Authors -#![cfg_attr(not(test), no_std)] // This library should always compile without std (even if we never ship that way) -#![forbid(unsafe_code)] // Validation logic should always be strictly safe -#![deny(missing_docs, clippy::all, clippy::pedantic)] // yeah, I'm that guy. I'm not sorry. -#![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic)] // Do you know where your towel is? +// This library should always compile without std (even if we never ship that way) +#![cfg_attr(not(test), no_std)] +// Validation logic should always be strictly safe +#![forbid(unsafe_code)] +// yeah, I'm that guy. I'm not sorry. +#![deny(missing_docs, clippy::all, clippy::pedantic)] +// Do you know where your towel is? +#![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic)] //! A library for working with and strictly validating network data @@ -18,7 +22,7 @@ pub mod vxlan; mod tests { use super::*; use alloc::vec::Vec; - use etherparse::{PacketBuilder, PacketHeaders}; + use etherparse::PacketBuilder; pub fn gen_random_udp_packet() -> Vec { let src_mac: [u8; 6] = rand::random(); diff --git a/scratch/src/main.rs b/scratch/src/main.rs index ae8a6ac8..5bbb3cc5 100644 --- a/scratch/src/main.rs +++ b/scratch/src/main.rs @@ -1,7 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright Open Network Fabric Authors -use dpdk::dev::TxOffloadConfig; use dpdk::{dev, eal, mem, queue, socket}; use dpdk_sys::*; use std::ffi::{c_uint, CStr, CString}; @@ -660,11 +659,6 @@ fn eal_main() { rte.dev.iter().for_each(|dev| { info!("Device if_index: {if_index:?}", if_index = dev.if_index()); info!("Driver name: {name:?}", name = dev.driver_name()); - let tx_config: TxOffloadConfig = dev.tx_offload_caps().into(); - info!( - "Device tx offload capabilities: {tx_offload:?}", - tx_offload = tx_config - ); info!( "Device rx offload capabilities: {rx_offload:?}", rx_offload = dev.rx_offload_caps() @@ -675,7 +669,7 @@ fn eal_main() { num_rx_queues: 5, num_tx_queues: 5, num_hairpin_queues: 1, - tx_offloads: Some(TxOffloadConfig::default()), + tx_offloads: None, }; let mut my_dev = match config.apply(dev) { diff --git a/scripts/dpdk-sys.env b/scripts/dpdk-sys.env index ecaa6f9b..4053372d 100644 --- a/scripts/dpdk-sys.env +++ b/scripts/dpdk-sys.env @@ -1 +1,2 @@ -DPDK_SYS_COMMIT="927f4346e46c724f93af0e55b07de6282f9f3036" +DPDK_SYS_BRANCH="main" +DPDK_SYS_COMMIT="ab1caa860a3e1a8baef37345b8740098384d4afe"