On Wed, 23 Sep 2026 05:20:51 +0200 Thomas Monjalon <[email protected]> wrote:
> Remove rows which are not useful in the NIC feature overview: > documentation availability, basic stats and link status. > The last two are always implemented so they are not really useful > in the matrix but their description are kept in features.rst. > > Merge Rx/Tx variants when the support is identical: > descriptor status and runtime queue setup. > > Signed-off-by: Thomas Monjalon <[email protected]> > --- Correction to previous mail, spotted by AI: Rx timestamp does have a row. The problem is that its features.rst entry is stale: it cites RTE_MBUF_F_RX_TIMESTAMP and mbuf.timestamp, and neither exists (the field became a dynamic field in 20.11). The offloads that actually have no row are Tx MULTI_SEGS (45 drivers), the tunnel TSO flags (VXLAN in 14 drivers, GENEVE 12, GRE 9, IPIP 6, IP/UDP 3 each) and SEND_ON_TIMESTAMP (3 drivers). And AI audit of current features said: Ran 41 commands, searched the web, searched past chats Audited main at a1ff3ac (2026-09-15). I couldn't find the pending simplification series on the list, so everything below is measured against main. Driver counts come from grepping drivers/net for flag references and .op = assignments. 1. Offloads with no matrix row TX_OFFLOAD_MULTI_SEGS: 53 drivers. This is the Tx counterpart of Scattered Rx and has no row. Tunnel TSO has no row: VXLAN_TNL_TSO (17 drivers), GENEVE_TNL_TSO (15), GRE_TNL_TSO (12), IPIP_TNL_TSO (9), UDP_TNL_TSO (3), IP_TNL_TSO (3). UDP_TSO (12 drivers) appears only in the TSO [provides] line. The [uses] line lists only TCP_TSO. TX_OFFLOAD_SEND_ON_TIMESTAMP: 4 drivers, no row. DEV_CAPA_FLOW_RULE_KEEP (18) and FLOW_SHARED_OBJECT_KEEP (2): no row. RX_OFFLOAD_VLAN_EXTEND (17) is in VLAN offload [uses] but not [provides]. KEEP_CRC has no [provides] line either. 2. dev_ops with no row (driver count in parens) dev_set_link_up/down (37) rx_queue_count (24) is parked in "Other", yet tx_queue_count has a row with one user (cnxk). tx_pkt_prepare (22) is also in "Other". dev_reset (16) mtr_ops_get (7): rte_tm has a row, rte_mtr does not. Smaller ones: hairpin_*, representor_info_get, recycle_rxq_info_get, speed_lanes_*, rx_metadata_negotiate, rx_queue_avail_thresh_*, count_aggr_ports/map_aggr_tx_affinity, xstats_enable/disable, eth_rx/tx_descriptor_dump. Rate limitation is missing get_queue_rate_limit (added in 26.11; ice, mlx5). Congestion management is missing cman_config_init. 3. Rows that are always present or not really per-driver Basic stats: 74 of 75 drivers claim it, and features.rst itself says it applies to all drivers. The one exception, enetfec, does implement stats_get, so its .ini is simply wrong. Extended stats: ethdev synthesizes basic xstats (and per-queue ones with AUTOFILL) for every driver, so rte_eth_xstats_get() works without xstats_get. The row really means "has driver-private counters". Stats per queue: the definition is stale. The q_* fields were removed from rte_eth_stats in 25.11, and queue stats mapping was removed in 26.11. Per-queue stats now come through the qstats arg of stats_get plus RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS, and the claims don't track that: Set AUTOFILL but don't claim: axgbe, dpaa2, ena, memif, mvpp2, sxe2, tap, vhost. Claim without AUTOFILL: cnxk, cxgbe, hns3, rnp, txgbe, virtio, zxdh. Link status: effectively mandatory, since rte_eth_link_get() returns -ENOTSUP without link_update. ark, enetfec and nbl implement it but don't claim it. CRC offload: the text says stripping is assumed, so the row can only usefully mean KEEP_CRC. Ten drivers claim it with no KEEP_CRC reference in source: cxgbe, enic, fm10k, hinic, hinic3, ipn3ke, mvneta, mvpp2, octeontx, thunderx. Doc rows: every column already has a guide, yet only 37 claim Usage doc. Design doc (2 drivers) and Perf doc (1) are dead rows. OS/arch rows: hand-maintained and derivable from meson. rv64 and LoongArch64 are claimed by ixgbe only, while only 28 net drivers have any arch gating at all. 4. features.rst errors The Inner L3/L4 checksum sections actually document OUTER_IPV4_CKSUM, OUTER_UDP_CKSUM and RX_OUTER_*. The rows are misnamed. Timestamp offload references RTE_MBUF_F_RX_TIMESTAMP and mbuf.timestamp, both gone since 21.02. The current mechanism is rte_mbuf_dyn_rx_timestamp_register(). Flow control names the op priority_flow_ctrl_queue_configure; the real op is priority_flow_ctrl_queue_config. PFC is also folded into link flow control rather than having its own row. Tx queue count is tagged as an eth_dev_ops member, but it's a fast-path rte_eth_dev member. Scattered Rx has the same problem with rx_pkt_burst. IP reassembly uses [provides] eth_dev_ops instead of [implements]. No driver claims the row, yet cnxk (cn10k, cn20k) implements it. The rv64 section sits under the _nic_features_x86-32 anchor, and x86-32 has no anchor of its own. Section order diverges from default.ini. Runtime queue setup, Burst mode info and Power mgmt sit after Perf doc. The row name "Power mgmt address monitor" doesn't match its section heading. Nits: trailing comma after buffer_split_supported_hdr_ptypes_get, and missing () on rte_eth_dev_rss_hash_update. 5. .ini claims vs driver code Claimed, but the op is absent: Queue start/stop: dpaa2, hinic, mlx4, nfp. ipn3ke: 13 rows. The representor ops only cover about 30 basic ops. Unicast MAC filter: avp, nbl. Multicast MAC filter: fm10k (base code only). One row each: nfb: Extended stats. r8169: Flow control. sxe2: Timesync. thunderx: Allmulticast. xsc: RSS reta update. hinic3: Packet type parsing. igb: DCB. virtio, mvpp2 and zxdh claim Multicast MAC filter via mac_addr_add, not set_mc_addr_list. That's a definition ambiguity rather than a driver bug. Implemented, but not claimed (drivers with a single .ini only): i40e: MTU update, Free Tx mbuf on demand, EEPROM dump, Registers dump, LED. axgbe: 10 rows, including MTU, Timesync, xstats and Registers dump. netvsc: Multicast MAC, RSS reta/key, Rx/Tx descriptor status, Packet type parsing. nfp: Burst mode info, Extended stats, FW version. vmxnet3: Rx interrupt, RSS reta update, FW version. zxdh: Rx interrupt, RSS key update, Packet type parsing. Other gaps bonding, null, ring and softnic implement eth_dev_ops but have no .ini, so they're absent from the matrix. 38 .ini files are out of default.ini order. conf.py doesn't check order. check-doc-vs-code.sh only covers rte_flow items and actions. Most of section 5 could be a mechanical check.

