dpdk core - #1819
Draft
daniel-noland wants to merge 32 commits into
Draft
dpdk core#1819daniel-noland wants to merge 32 commits into
daniel-noland wants to merge 32 commits into
Conversation
`just fmt --check` -- what CI runs as `ci::check-fmt` -- rejects `n-vm/src/bin/n-vm-reap.rs` and `n-vm/src/cloud_hypervisor/events.rs`. `rustfmt.toml` is byte-identical to `main`'s, so this is authoring-time drift against a different rustfmt, not a config disagreement, and it would have failed wherever these commits landed. Whitespace only. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
`vm_boots_with_host_hugepages` is the last test failing on the runners:
× hugepage pool unavailable
╰─▶ the 1073741824-byte hugepage pool has 0 free page(s); this VM needs 1
It asks for a 1 GiB *host* page because that is what makes the guest's memory
physically contiguous, which is the only thing DPDK-through-an-IOMMU can tell
apart. Nothing else asks -- `HostPageSize`'s docs record that the default
deliberately leaves this pool alone, after a version that did not made ten of
eighteen tests contend for a page they had no use for.
The runner cannot reserve it: measured on one, `CapEff` is zero, so writing
`/sys/kernel/mm/hugepages` is not available to it. It can ask the host's
daemon for a privileged container that can, and the hugepage sysfs is not
namespaced, so the reservation lands on the machine and every job on it sees
the result. Verified against a local daemon that a privileged container's
write does reach host sysfs.
Only ever raises the count. Lowering it would take pages away from whatever
else is running on a shared machine, and four is a floor rather than this
job's private allocation.
Never fails the job. A 1 GiB reservation is a request: the kernel has to find
that many physically contiguous gigabytes and on a long-lived machine it may
not. If it comes up short, the test that needs a page reports it precisely,
which is a better place to read it than a setup step -- so this warns and
carries on.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Daniel Noland <daniel@githedgehog.com>
The RteAllocator GlobalAlloc impl was never installed as #[global_allocator] anywhere, so its socket-aware rte_malloc/rte_free routing, the RteInit guard, the per-thread SWITCHED/RTE_SOCKET cells, and the mark_initialized/assert_initialized hooks in eal::init and lcore were all dead code. They also carried a real hazard: a worker thread that never ran assert_initialized would allocate with the system allocator and free with rte_free (or the reverse), a cross-allocator free. Remove the lot. eal::init no longer needs the scope or comments that existed only to sequence the allocator swap; the argv pointer-provenance handling is unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Introduce MbufArray, an inline (ArrayVec-backed, capacity MBUF_BURST = 64), bulk-freed batch of mbufs, and make it the unit of allocation, receive, and transmit. It frees everything it still owns in one rte_pktmbuf_free_bulk on drop, which a per-value Drop on individual mbufs cannot do. A batch larger than the capacity must be processed in MBUF_BURST-sized chunks. This fixes three memory bugs in the previous per-mbuf handling: - TxQueue::transmit dropped the whole Vec<Mbuf> after rte_eth_tx_burst even though the PMD already owns and frees transmitted mbufs (a double free), and could spin forever when the queue stopped accepting packets. It now takes and returns an MbufArray: the unsent tail comes back to the caller and the burst loop stops as soon as no progress is made. - Pool::alloc_bulk built Mbufs from null pointers via transmute, violating the NonNull invariant (instant UB). It now fills a raw inline array and wraps the pointers only after a successful bulk alloc, returning MbufAllocError on exhaustion or over-capacity. - RxQueue::receive returned a lazy iterator that leaked un-yielded mbufs on early drop. It now returns an owning MbufArray that frees the remainder. Adds Mbuf::into_raw to hand ownership to the PMD without a double free. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Device and queue setup previously hard-coded values that ignored what the NIC
actually reports:
- The RX MTU was pinned at 1514 and max-LRO at 8192. Replace these with a
configurable DevConfig::mtu (defaulting to the standard Ethernet MTU,
validated against the device's [min_mtu, max_mtu] range) and source the
max-LRO size from rte_eth_dev_info.
- RX and TX queue setup passed the raw requested descriptor count straight to
rte_eth_{rx,tx}_queue_setup, which can be below the driver minimum, above its
maximum, or misaligned. Run the count through
rte_eth_dev_adjust_nb_rx_tx_desc first so it is clamped to the driver's
limits.
Also document that the zeroed rte_eth_rxconf/txconf threshold fields are left
zero on purpose: DPDK reads zero as "use the PMD's per-driver defaults".
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Packet<Buf> and TestBuffer derived Clone, but Packet<Mbuf> could not (Mbuf is not Clone), so tests could duplicate packets in a way production cannot, with deep-copy semantics that match neither DPDK duplication primitive (rte_pktmbuf_copy is the rare deep copy; rte_pktmbuf_clone is a refcount share). Introduce a DeepCopy trait (net::buffer) and drop the Clone derives: - TestBuffer implements DeepCopy infallibly (heap clone). - Mbuf implements DeepCopy via rte_pktmbuf_copy into its own originating pool, returning MbufCopyError when the pool is exhausted. - Packet::deep_copy clones the parsed headers and metadata and deep-copies the payload buffer, returning the buffer's DeepCopy::Error. The capability is now uniform across test and production buffers, and the only callers (all tests) are updated to deep_copy(). This is step 1 of the buffer/multi-seg rework; later steps add fallible mutation, the packet-length/buffer-length split, and TestBuffer segmentation. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Replace the infallible `AsMut<[u8]>` bound on PacketBufferMut with a `TryAsMut` trait whose `try_as_mut(&mut self) -> Result<&mut [u8], NotWritable>` can report that a buffer is shared and must not be mutated in place. Reading (`AsRef<[u8]>`) stays infallible. Infallible mutable access was the place where callers could silently assume exclusive ownership that an Mbuf-backed buffer cannot guarantee. Mbuf now gates mutation on being directly owned (not indirect/external) with a refcount of one; TestBuffer (heap-backed, always exclusive) returns Ok. No sharing is created yet, so the gate never trips today, but the API is now sharing-aware. The production write path (Packet::serialize / vxlan_encap) already goes through the fallible `prepend()`, so prepend/append/trim are left as-is; their NotWritable arm can be added without breakage when refcount sharing (multicast) lands, since callers propagate their errors generically. Callers updated: the tap reader maps NotWritable to an io error; the remaining sites are tests that deparse into a TestBuffer and now go through try_as_mut. That includes acl-filter and flow-filter, which landed on main after this line forked -- their migration is the same mechanical change, folded in here rather than left to a follow-up so the workspace never stops building. This is step 2 of the buffer/multi-seg rework. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
`as_ref().len()` is the length of the contiguous head view, which equals the packet length only for a single-segment buffer. Code that means "the whole packet" (length fields, total sizing) was using it, which will silently under-count once buffers can be multi-segment. Add a `PacketLength` trait (a `PacketBuffer` supertrait) with `packet_len()`: - Mbuf returns `pkt_len` (the sum across all segments). - TestBuffer returns `as_ref().len()` (single-segment today; will sum segments once it becomes a chain). Migrate the whole-packet length uses onto it: `Packet::payload_len`, the VXLAN encap UDP-length computation, and the tap reader's buffer sizing. These are behavior-preserving while everything is single-segment, but now say what they mean so they stay correct when segmentation lands. Step 3 of the buffer/multi-seg rework. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
TestBuffer was a single contiguous Vec, so it could never exhibit multi-segment behavior and every test ran against a model where packet_len() always equalled as_ref().len() -- leaving the multi-segment paths (and the length split from the previous commit) unexercised. Rebuild it as a chain of TestSegments, each a fixed-size Box<[u8]> "room" with data_off/data_len cursors and a Box<next>, mirroring an mbuf chain: - as_ref()/try_as_mut expose the head segment (the header window); - packet_len() sums all segments; - headroom is the head's, tailroom is the last segment's; - prepend/trim_from_start act on the head (mbuf prepend/adj), append/ trim_from_end on the last segment (mbuf append/trim); - deep_copy clones the whole chain into independent rooms. Single-segment behavior (from_raw_data, new) is unchanged, so existing tests are unaffected; from_segments() builds multi-segment buffers to exercise the new paths, covered by added unit tests. The room is Box (uniquely owned) rather than a refcounted Arc: with no sharing yet, mutation stays infallible and prepend/trim keep their room-only errors (consistent with the TryAsMut step); the room becomes shareable when multicast lands, alongside the NotWritable arms. Step 4 (final structural step) of the buffer/multi-seg rework. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
…> typestate Dev had a runtime start/stop on &mut self plus a dead `State` enum and an unused `StartedDev` struct, so nothing stopped a caller from configuring a queue on a running device or receiving on a stopped one. Make the lifecycle a typestate (mirroring the crate's ACL context): Dev<S: DevState> with marker states Stopped (default) and Started, sealed so external crates cannot add states. - new_rx_queue/new_tx_queue/new_hairpin_queue live only on Dev<Stopped>. - rx_queue/tx_queue accessors (the packet-I/O entry points) live only on Dev<Started>. - start(self) -> Dev<Started> and stop(self) -> Dev<Stopped> consume and transition; on failure they hand the device back (DevStartFailure / DevStopFailure) so it can be retried or dropped, like AclBuildFailure. The transition moves fields out under ManuallyDrop so Drop does not fire mid-transition. Drop cannot be specialized per typestate, so a single impl<S: DevState> Drop consults a compile-time DevState::RUNNING const and only stops the device when it is Started. Removes the dead State enum and StartedDev. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Add the cmdline lib (a testpmd hard dependency) and switch from -Ddisable_apps=* to -Denable_apps=test-pmd so the build produces dpdk-testpmd, used as the manual rte_flow / offload validation tool. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Expose ol_flags(), rss_hash() and rx_mark() on Mbuf so receive-side code can read NIC-stamped metadata: the RSS hash (gated on RTE_MBUF_F_RX_RSS_HASH) and the flow MARK / FDIR id (gated on RTE_MBUF_F_RX_FDIR_ID), the channel a packet uses to carry hardware-stamped context to software. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Add RssConf { key, hf } and DevConfig.rss, applied into eth_conf.rx_adv_conf.rss_conf during rte_eth_dev_configure. RSS must be set before the rx queues are built; a runtime rss_hash_update afterwards does not deliver the hash to the mbuf on mlx5. None leaves rss_hf = 0 (the prior behavior).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Daniel Noland <daniel@githedgehog.com>
offload_probe installs a group0->jump->group1 eth/ipv4 -> MARK+QUEUE rule and verifies the MARK reaches the mbuf; rss_probe configures RSS and checks the NIC Toeplitz hash against an independent software computation per packet. Both confirm offload behavior by observed mbuf metadata, not create/validate return codes. Adds dpdk-sys as a dev-dependency for the raw rte_flow FFI. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Sets a TAG or META value in group 1 and matches it in group 2 to fire a MARK, validating that hardware carries context between pipeline stages. On the BF-3: TAG works natively; ingress META match is rejected in legacy metadata mode (dv_xmeta_en does not lift it under HWS or SWS), so TAG is the usable cross-stage carry primitive here. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
…havior Rewrites ingress dst IP and/or dst port and verifies the NIC fixes the IPv4 and L4 checksums, two ways: software recompute over delivered bytes and the NIC RX-cksum ol_flags. On the BF-3 both are auto-corrected (incl. the UDP pseudo-header on a dst-IP change), so NAT-style rewrite needs no separate checksum action. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Probes OF_PUSH/POP_VLAN, OF_PUSH/POP_MPLS, OF_SET_VLAN_VID/PCP and cross-stage set, reporting the L2 shape of each delivered frame. On the BF-3 ingress NIC domain: VLAN pop works (with a VLAN match); VLAN push, MPLS push/pop, and VLAN field-set are all rejected (push/encap are egress/transfer ops). Consistent with the rewrite finding: ingress strips + rewrites existing fields but does not add headers. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
flow/mod.rs was a dead, unreachable skeleton: hand-transcribed copies of the rte_flow C enums plus home-rolled duplicates of net types (MAC/EtherType/VNI/IPv4/IPv6/TCP/UDP/VLAN headers, big-endian helpers), field-setters mostly todo!(), and zero rte_flow_create/validate/destroy calls. Nothing referenced it. Strip to a clean slate documenting the validated design direction (RAII FlowRule borrowing the device, domain typestate, net-typed items/actions, rte_flow_error mapping) for the rebuild. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
rss_key_buf was initialized with a dummy [0u8; 40] that is only ever overwritten (on the rss.is_some() path) or unused -- a dead store that fails clippy under -D warnings. Defer initialization to the path that actually writes and reads it. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
First slice of the rebuilt flow module, standalone and agnostic to match-action. FlowRule<dev> owns its rte_flow handle, borrows Dev<Started>, and destroys on drop, so a rule cannot outlive its device and teardown order is enforced by the borrow checker. Flow::ingress/egress/transfer fix the mutually-exclusive direction attribute as a typestate. FlowError maps rte_flow_error structurally (message as context, never matched). All FFI and the pattern/action-array pointer lifetimes are contained in builder.rs. This slice matches header presence and supports jump/mark/queue/drop; per-field spec/mask matching and the wider action/item set build on it. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Re-expresses the offload_probe group0->jump->group1, eth/ipv4->MARK+QUEUE rule through the typed Flow builder with no dpdk-sys and no unsafe in the example. Verified on a BF-3: both rules install and 500/500 received packets carry the mark. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
…cle only The async/HWS engine enqueues destroy on a per-core, non-thread-safe flow queue and reaps via rte_flow_pull, which a Drop firing on an arbitrary thread cannot do. Record that only the create/destroy lifecycle forks (pattern/action content is shared), that classic FlowRule assumes single-threaded flow management (it is !Send), and that async rules will be queue-owned rather than Drop-RAII. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Add Ipv4Match/UdpMatch/TcpMatch (Default = header presence; builder methods constrain fields) and Ipv4Prefix (host/prefix/masked). match_ipv4/udp/tcp lower to rte_flow_item spec+mask, owned by the builder so the pointers outlive create. Match values use permissive types (Ipv4Addr/u16/u8), not the strict net newtypes, since a match is a pattern not a parsed packet. Add set_ipv4_src/dst and set_tp_src/dst actions (the NIC fixes the affected checksums, validated earlier). match_eth stays presence-only for now (eth fields sit behind an anon union). Updates flow_api_probe for the new match_ipv4 signature. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
…e safe API Matches ipv4(dst=10.0.0.2)/udp(dst=1000) and rewrites to 10.9.9.9:4321 through the typed builder (no dpdk-sys, no unsafe in the example). On a BF-3: 500/500 delivered packets are rewritten with the IPv4 and UDP checksums fixed by the NIC. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
…hin lattice FlowBuilder gains a Pos typestate -- the same net header types Headers::pat() uses -- and each match_* step carries a `Next: Within<Pos>` bound, reusing net header-adjacency graph rather than re-rolling one. A fresh builder starts at Pos=() where only match_eth (the sole Within<()> layer) is available; an out-of-order pattern (an L3 match before match_eth, match_udp with no IP layer, a second match_eth) is now a compile error instead of a runtime PMD rejection. Pure type-level change: Pos is PhantomData and lower() emits byte-identical rte_flow arrays, so existing call chains (and the two probe examples) compile and behave unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
The flow builder now sorts actions into the mlx5 fixed action-pipeline order
(pop -> MARK -> MODIFY_HDR -> push -> terminal) via a stable rank, so actions
added in any order produce a hardware-valid rule. mlx5 HWS rejects an
out-of-order actions list ("Invalid action_type sequence"); a BlueField-3
confirmed `MARK` must precede a `SET_*` rewrite, and the full chain is accepted.
Adds per-field match items for `IPv6` (src/dst prefix + proto), `VLAN`
(vid/pcp), and `VXLAN` (vni), each gated by the `Within` lattice so an
out-of-order pattern fails to compile. Validated end to end on a BlueField-3
against live traffic: `ICMPv6` pings, `802.1Q` vid 100, and `VXLAN` vni 999.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Reads the `rte_flow` dynamic metadata field from the mbuf (parallel to `rx_mark`), exposing the 32-bit `META` value the NIC stamps via a `MODIFY_FIELD`/`SET_META` action. This is the second HW->SW channel alongside `MARK`; validated on a BlueField-3 delivering the full 32 bits intact. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
Adds the BlueField-3 validation harness used to characterize the offload datapath: per-field flow matches (`IPv6`/`VLAN`/`VXLAN`), same-port and cross-port hardware hairpin (zero host bounce), `MARK`/`META` channels, the HWS action-ordering sweep, template/indirect-action engine probes, and the eswitch representor topology mapper. These read mbuf metadata and device xstats directly (the nix build disables testpmd's verbose dump) and are the evidence base behind the offload design. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
…imit)
Wires generic `MODIFY_FIELD` into the flow builder (canonicalized at the
MODIFY_HDR rank) with typed setters: `set_meta` (32-bit `META` channel,
immediate value), `set_ipv6_src`/`set_ipv6_dst`, `set_ipv4_ttl`, and
`set_ipv6_hop_limit`.
`set_meta` is validated on a BlueField-3: a per-VNI match rule stamps the
matched VNI into `META` (rx_meta=999 for `VXLAN` vni 999). There is deliberately
no `set_vxlan_vni` / copy-from-`VXLAN_VNI`: mlx5 rejects `VXLAN_VNI` as a
`MODIFY_FIELD` source or destination ("modifications of the VXLAN Network
Identifier is not supported"), so a VNI change goes via decap + re-encap and the
VNI reaches software as a per-VNI immediate stamp. `META` delivery additionally
needs device-level setup (`dv_xmeta_en` + `rte_flow_dynf_metadata_register`).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Daniel Noland <daniel@githedgehog.com>
…eld-3 `flow_vxlan_modify_probe` matches `vxlan(vni=999)`, `set_meta(999)`, and confirms `rx_meta=999` on the delivered frames -- the per-VNI immediate stamp, since mlx5 rejects a `MODIFY_FIELD` on `VXLAN_VNI`. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
`vxlan_decap` strips a matched tunnel's outer Ethernet/IP/UDP/VXLAN headers, exposing the inner frame for the (now outermost) headers to be matched or rewritten. `vxlan_encap` prepends a fresh outer header set described by `VxlanEncap`; byte orders are handled internally and the outer UDP destination is fixed at 4789. Paired -- decap is canonicalized to run first -- they are the supported path for a VNI change, since mlx5 rejects an in-place `VXLAN_VNI` rewrite. The encap action's backing (four outer-header specs, the item list referencing them, and the action struct whose `definition` points at that list) is boxed so those internal self-references stay valid when the owning `Action` moves in the builder's `Vec`. Two BlueField-3 probes exercise the pair: `flow_vxlan_decap_probe` confirms the delivered frame has lost the outer signature, and `flow_vxlan_reencap_probe` answers whether mlx5 accepts decap and encap in a single rule rather than requiring separate groups. `scripts/bf3-eswitch-reset.sh` resets a BF-3 e-switch into the stock switchdev/HWS/multiport topology the probes assume. It is a validation hack full of fixed-sleep races, as its own header says. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
…abilities `DevConfig::apply` asked every device for `RTE_ETH_MQ_RX_RSS` unconditionally. Emulated NICs -- e1000, e1000e, and virtio without multi-queue feature negotiation -- report `flow_type_rss_offloads == 0` and fail `rte_eth_dev_configure` outright when handed that mode, so the crate could not configure a device in a VM at all. Ask `dev_info` instead: RSS distribution where the device advertises hash functions, `RTE_ETH_MQ_RX_NONE` where it does not. Devices that do support RSS keep the previous behaviour byte for byte, whether or not `DevConfig::rss` requests a hash -- `rss_hf = 0` under `RTE_ETH_MQ_RX_RSS` is how this crate has always configured mlx5. An explicit `rss` request that the device cannot honour is now rejected with `DevConfigError::RssUnsupported` rather than silently dropped, for the same reason `resolve_mtu` rejects an out-of-range MTU: a misconfiguration that shows up only as traffic landing on the wrong queue is far harder to diagnose than an error at configure time. Four additions the caller needs to ask rather than assert: - `DevInfo::rx_queue_offload_caps` / `tx_queue_offload_caps`. The per-queue capability mask is a subset of the port mask, which also counts offloads that can only be set port-wide at configure time. DPDK rejects a port-only offload in a queue's setup configuration, so queue setup has to be handed this mask. - `DevInfo::max_mtu` / `min_mtu` / `supports_rss`. - `RxOffload::NONE` / `TxOffload::NONE`. Distinct from a `None` offload config, which asks for *every* offload the device supports -- including LRO, which drags `max_lro_pkt_size` validation into configurations with no use for it. - `Dev::set_promiscuous`, valid in either typestate. The BlueField-3 probe examples still call `rte_eth_promiscuous_enable` directly; they pair it with `rte_eth_allmulticast_enable`, which has no wrapper, so converting half of each unsafe block would buy nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Daniel Noland <daniel@githedgehog.com>
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueComment |
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
scratch: don't yet review please
🤖 Generated with Claude Code