devtools: rewrite doc vs code check in Python
RFC 1/1 devtools: rewrite doc vs code check in Python
The existing check-doc-vs-code.sh only compares rte_flow items and actions, and only for drivers whose directory matches the ini name, so none of the drivers under net/intel are checked.
Replace it and parse-flow-support.sh with a Python script covering the whole NIC feature matrix:
- ini syntax: unknown rows, invalid values, duplicates, row order
- rte_flow items and actions, keeping the bnxt and dpaa2 exceptions
- feature rows against eth_dev_ops, fast-path ops, offload and capability flags, including full (Y) vs partial (P) support
- ops that only return -ENOTSUP
- OS and architecture rows against meson.build and its dependencies
- incomplete operation sets, e.g. start without stop,
or Rx timestamp without read_clock
- rows requiring another row in the same ini
Drivers sharing a directory (PF/VF, e1000/igb/igc) are matched by their own eth_dev_ops instance or source files.
Given a git reference, only drivers changed since the reference are checked, and findings already present at the reference are not reported, so existing documentation gaps do not fail CI.
Documented but not implemented is an error. Implemented but not documented, and incomplete operation sets, are warnings. Option -v adds notes such as platforms meson allows but the ini does not list. Option -g prints ini rows derived from driver code.
--- .github/workflows/build.yml | 2 +- MAINTAINERS | 3 +- devtools/check-doc-vs-code.py | 1132 ++++++++++++++++++++++++ devtools/check-doc-vs-code.sh | 84 -- devtools/parse-flow-support.sh | 92 -- doc/guides/contributing/new_driver.rst | 4 +- doc/guides/contributing/patches.rst | 27 + doc/guides/nics/features.rst | 5 + 8 files changed, 1169 insertions(+), 180 deletions(-) create mode 100755 devtools/check-doc-vs-code.py delete mode 100755 devtools/check-doc-vs-code.sh delete mode 100755 devtools/parse-flow-support.sh
.github/workflows/build.yml +1 -1
@@ -29,7 +29,7 @@ jobs: git remote add upstream ${{ env.REF_GIT_REPO }} git fetch upstream ${{ env.REF_GIT_BRANCH }} failed= - devtools/check-doc-vs-code.sh upstream/${{ env.REF_GIT_BRANCH }} || failed=true + devtools/check-doc-vs-code.py upstream/${{ env.REF_GIT_BRANCH }} || failed=true devtools/check-meson.py || failed=true devtools/check-spdx-tag.sh || failed=true [ -z "$failed" ]
MAINTAINERS +1 -2
@@ -88,7 +88,7 @@ F: MAINTAINERS F: devtools/build-dict.sh F: devtools/check-abi.sh F: devtools/check-abi-version.sh -F: devtools/check-doc-vs-code.sh +F: devtools/check-doc-vs-code.py F: devtools/check-dup-includes.sh F: devtools/check-maintainers.sh F: devtools/check-forbidden-tokens.awk
@@ -100,7 +100,6 @@ F: devtools/get-maintainer.sh F: devtools/git-log-fixes.sh F: devtools/load-devel-config F: devtools/mailmap-ctl.py -F: devtools/parse-flow-support.sh F: devtools/process-iwyu.py F: devtools/update-patches.py F: devtools/libabigail.abignore
devtools/check-doc-vs-code.py new file +1132 -0
1,132 lines not on this page · raw message
devtools/check-doc-vs-code.sh deleted +0 -84
84 lines not on this page · raw message
devtools/parse-flow-support.sh deleted +0 -92
92 lines not on this page · raw message
doc/guides/contributing/new_driver.rst +3 -1
@@ -97,6 +97,8 @@ Split patches following this approach: * Organize each patch logically as a new feature. * Run test tools per patch (See :ref:`contrib_tool_list`). * Update relevant documentation and `<driver>.ini` file with each patch. + ``devtools/check-doc-vs-code.py -g <driver>`` prints the rows + that the driver code supports, as a starting point. The following order in the patch series is as suggested below.
@@ -207,7 +209,7 @@ Run the following test tools per patch in a patch series: * `checkpatches.sh` * `check-git-log.sh` * `check-meson.py` -* `check-doc-vs-code.sh` +* `check-doc-vs-code.py` * `check-spdx-tag.sh` * Build documentation and validate how output looks * Optionally run ``review-patch.py`` for AI-assisted review
doc/guides/contributing/patches.rst +27 -0
@@ -513,6 +513,33 @@ The script usage is:: For both scripts, the -n option specifies a number of commits from HEAD, and the -r option specifies a ``git log`` range. +.. _contrib_check_doc_vs_code: + +When a patch changes a network driver or its features file, +check that the NIC feature tables (see :doc:`/nics/overview`) +match the driver code using the ``check-doc-vs-code.py`` script:: + + devtools/check-doc-vs-code.py origin/main + +With a git reference, only drivers changed since that reference are checked, +and only findings not already present at the reference are reported. +Without a reference, all drivers are checked. + +Errors are features documented without matching code, +platforms excluded by the build, and rte_flow mismatches. +Warnings are features implemented but not documented, +full support documented where the code is partial, +and incomplete sets of operations such as a queue start without stop. +The script exits with an error status only if errors are reported. + +The script usage is:: + + check-doc-vs-code.py [-h] [-d DRIVER] [-g DRIVER] [-q] [-v] [ref] + +The -d option restricts the check to one features file, +and the -g option prints the features derived from the driver code, +as a starting point for a new driver. + Additionally, when contributing to the DTS tool, check patches using the ``dts-check-format.sh`` script in the ``devtools`` directory of the DPDK repo. Running the script requires extra :ref:`Python dependencies <dts_deps>`.
doc/guides/nics/features.rst +5 -0
@@ -22,6 +22,11 @@ for cases where provided data can't be represented simply by a function. ``[related]`` : Related API with that feature. +The feature tables in ``doc/guides/nics/features/`` are checked against +the driver code by ``devtools/check-doc-vs-code.py``, +based on the structs and flags listed below. +See :ref:`the contributing guide <contrib_check_doc_vs_code>` for usage. + .. _nic_features_speed_capabilities:
Signature · 1 line
2.53.0
Quoted 23 lines · On Wed, 23 Sep 2026 11:42:07 -0700 Stephen Hemminger…
The existing
check-doc-vs-code.shonly comparesrte_flowitems and actions, and only for drivers whose directory matches the ini name, so none of the drivers under net/intel are checked.Replace it and
parse-flow-support.shwith a Python script covering the whole NIC feature matrix:
- ini syntax: unknown rows, invalid values, duplicates, row order
-rte_flowitems and actions, keeping the bnxt and dpaa2 exceptions
- feature rows againsteth_dev_ops, fast-path ops, offload and capability flags, including full (Y) vs partial (P) support
- ops that only return-ENOTSUP
- OS and architecture rows against meson.build and its dependencies
- incomplete operation sets, e.g. start without stop,
or Rx timestamp withoutread_clock
- rows requiring another row in the same iniDrivers sharing a directory (PF/VF, e1000/igb/igc) are matched by their own
eth_dev_opsinstance or source files.Given a git reference, only drivers changed since the reference are checked, and findings already present at the reference are not reported, so existing documentation gaps do not fail CI.
Quoted 7 lines
Documented but not implemented is an error. Implemented but not documented, and incomplete operation sets, are warnings. Option -v adds notes such as platforms meson allows but the ini does not list. Option -g prints ini rows derived from driver code.
Signed-off-by Stephen Hemminger <[email protected]>---
This tool finds lots of incorrect/missing stuff:
bonding: warning: no features ini
null: warning: no features ini
ring: warning: no features ini
softnic: warning: no features iniaf_xdp: warning: no OS documented
afpacket: warning: line 9: "MTU update" not in default.ini order
afpacket: warning: "Scattered Rx" implemented, not documented
afpacket: warning: "VLAN offload" implemented, not documented
afpacket: warning: "Timestamp offload" implemented, not documented
afpacket: warning: Rx timestamp offload without read_clock, no way to read NIC clock
afpacket: warning: no OS documented
afpacket: warning: no architecture documented
ark: warning: "Link status" implemented, not documented
ark: warning: "Link status event" implemented, not documented
ark: warning: "MTU update" implemented, not documented
ark: error: "Scattered Rx" documented, no RTE_ETH_RX_OFFLOAD_SCATTER
ark: warning: "Unicast MAC filter" implemented, not documented
ark: warning: "Timestamp offload" implemented, not documented
ark: warning: Rx timestamp offload without read_clock, no way to read NIC clock
ark: warning: Rx timestamp offload without rte_mbuf_dyn_rx_timestamp_register()
atlantic: warning: line 23: "MACsec offload" not in default.ini order
atlantic: warning: "Rx interrupt" implemented, not documented
atlantic: warning: "TSO" implemented, not documented
atlantic: warning: "Multicast MAC filter" implemented, not documented
avp: error: "Scattered Rx" documented, no RTE_ETH_RX_OFFLOAD_SCATTER
avp: error: "Unicast MAC filter" documented, no mac_addr_add or mac_addr_remove
avp: warning: "QinQ offload" implemented, not documented (partial)
avp: warning: VLAN filter offload without vlan_filter_set
axgbe: warning: "MTU update" implemented, not documented
axgbe: warning: "Unicast MAC filter" implemented, not documented
axgbe: warning: "Multicast MAC filter" implemented, not documented
axgbe: warning: "Flow control" implemented, not documented
axgbe: warning: "VLAN offload" implemented, not documented
axgbe: warning: "QinQ offload" implemented, not documented
axgbe: warning: "Packet type parsing" implemented, not documented
axgbe: warning: "Timesync" implemented, not documented
axgbe: warning: "Rx descriptor status" implemented, not documented
axgbe: warning: "Tx descriptor status" implemented, not documented
axgbe: warning: "Extended stats" implemented, not documented
axgbe: warning: "Stats per queue" implemented, not documented
axgbe: warning: "Registers dump" implemented, not documented
bnx2x: warning: "Allmulticast mode" implemented, not documented
bnx2x: warning: stats_get without stats_reset
bnxt: warning: line 40: "VLAN offload" not in default.ini order
bnxt: warning: line 64: "ipv4", "ipv6" not in default.ini order
bnxt: warning: "Removal event" implemented, not documented
bnxt: warning: "Buffer split on Rx" implemented, not documented
bnxt: warning: "QinQ offload" implemented, not documented
bnxt: warning: "Timestamp offload" implemented, not documented
bnxt: warning: "Inner L4 checksum" documented Y, partial in code (missing RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM)
bnxt: warning: Rx timestamp offload without read_clock, no way to read NIC clock
cnxk: warning: line 10: "SR-IOV", "Multiprocess aware", "Link status", "Link status event", "Fast mbuf free", "Free Tx mbuf on demand", "Queue start/stop", "Flow control", "Scattered Rx", "Timestamp offload", "Extended stats" not in default.ini order
cnxk: warning: "LRO" implemented, not documented
cnxk: warning: "Rate limitation" implemented, not documented
cnxk: warning: "CRC offload" implemented, not documented
cnxk: warning: "VLAN offload" implemented, not documented
cnxk: warning: "QinQ offload" implemented, not documented
cnxk: warning: "IP reassembly" implemented, not documented (partial)
cnxk: warning: "MACsec offload" implemented, not documented
cnxk: warning: ip_reassembly_conf_get = cn10k_nix_reassembly_conf_get only returns an error, leave it NULL
cnxk: warning: Tx send on timestamp without rte_mbuf_dyn_tx_timestamp_register()
cnxk: warning: VLAN filter offload without vlan_filter_setcnxk_vec: warning: line 10: "SR-IOV", "Multiprocess aware", "Link status", "Link status event", "Fast mbuf free", "Free Tx mbuf on demand", "Queue start/stop", "Flow control", "Extended stats" not in default.ini ordercnxk_vf: warning: line 10: "Multiprocess aware", "Link status", "Link status event", "Fast mbuf free", "Free Tx mbuf on demand", "Queue start/stop", "Scattered Rx", "Extended stats" not in default.ini order
cpfl: error: "Speed capabilities" documented, no speed_capa
cpfl: warning: "Fast mbuf free" implemented, not documented
cpfl: warning: "CRC offload" implemented, not documented
cpfl: warning: "VLAN offload" implemented, not documented
cpfl: warning: "QinQ offload" implemented, not documented
cpfl: warning: "Inner L3 checksum" implemented, not documented
cpfl: warning: "Timesync" implemented, not documented (partial)
cpfl: warning: "Extended stats" implemented, not documented
cpfl: warning: Rx timestamp offload without read_clock, no way to read NIC clock
cpfl: warning: Rx timestamp offload without rte_mbuf_dyn_rx_timestamp_register()
cpfl: warning: VLAN filter offload without vlan_filter_set
cxgbe: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
cxgbe: warning: "Stats per queue" documented, no q_[io](packets|bytes)|RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS
cxgbevf: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
cxgbevf: warning: "Stats per queue" documented, no q_[io](packets|bytes)|RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS
cxgbevf: warning: stats_get without stats_reset
dpaa: warning: line 23: "Timestamp offload" not in default.ini order
dpaa: warning: "Rx interrupt" implemented, not documented
dpaa: warning: "Lock-free Tx queue" implemented, not documented
dpaa: warning: "Fast mbuf free" implemented, not documented
dpaa: warning: "RSS key update" implemented, not documented
dpaa: error: "Timestamp offload" documented, no RTE_ETH_RX_OFFLOAD_TIMESTAMP
dpaa: warning: "Inner L3 checksum" implemented, not documented
dpaa: warning: no OS documented
dpaa2: warning: line 10: "Burst mode info", "MTU update", "Timestamp offload" not in default.ini order
dpaa2: warning: "Lock-free Tx queue" implemented, not documented
dpaa2: warning: "Fast mbuf free" implemented, not documented
dpaa2: error: "Queue start/stop" documented, no rx_queue_start or rx_queue_stop or tx_queue_start or tx_queue_stop
dpaa2: warning: "RSS key update" implemented, not documented
dpaa2: warning: "VLAN offload" documented Y, partial in code (missing RTE_ETH_RX_OFFLOAD_VLAN_STRIP|RTE_ETH_RX_OFFLOAD_VLAN)
dpaa2: warning: "Inner L3 checksum" implemented, not documented
dpaa2: warning: "Inner L4 checksum" implemented, not documented (partial)
dpaa2: warning: "Stats per queue" implemented, not documented
dpaa2: warning: Rx timestamp offload without read_clock, no way to read NIC clock
e1000: error: rte_flow item eth documented, not in code
e1000: error: rte_flow item ipv4 documented, not in code
e1000: error: rte_flow item ipv6 documented, not in code
e1000: error: rte_flow item raw documented, not in code
e1000: error: rte_flow item sctp documented, not in code
e1000: error: rte_flow item tcp documented, not in code
e1000: error: rte_flow item udp documented, not in code
e1000: error: rte_flow items documented without flow_ops_get
e1000: error: rte_flow action drop documented, not in code
e1000: error: rte_flow action queue documented, not in code
e1000: error: rte_flow action rss documented, not in code
e1000: error: rte_flow actions documented without flow_ops_get
e1000: error: "Free Tx mbuf on demand" documented, no tx_done_cleanup
e1000: warning: "Multicast MAC filter" implemented, not documented
e1000: error: "QinQ offload" documented, no RTE_ETH_RX_OFFLOAD_QINQ_STRIP|RTE_ETH_RX_OFFLOAD_VLAN_EXTEND or RTE_ETH_TX_OFFLOAD_QINQ_INSERT
e1000: warning: "LED" implemented, not documented
ena: warning: "Speed capabilities" implemented, not documented
ena: warning: "Timestamp offload" implemented, not documented
ena: warning: "Stats per queue" implemented, not documented
ena: warning: stats_get without stats_reset
ena: warning: Rx timestamp offload without read_clock, no way to read NIC clock
enetc: warning: line 7: "Packet type parsing", "Basic stats", "MTU update", "Queue start/stop" not in default.ini order
enetc4: warning: line 7: "Link status event", "RSS hash", "L3 checksum offload", "L4 checksum offload", "CRC offload", "Queue start/stop", "Scattered Rx" not in default.ini order
enetc4: error: "Speed capabilities" documented, no speed_capa
enetc4: error: "Link status event" documented, no RTE_ETH_DEV_INTR_LSC|RTE_PCI_DRV_INTR_LSC
enetc4: error: "Allmulticast mode" documented, no allmulticast_enable or allmulticast_disable
enetc4: error: "Unicast MAC filter" documented, no mac_addr_add or mac_addr_remove
enetc4: error: "VLAN filter" documented, no vlan_filter_setenetc4_vf: warning: line 9: "Speed capabilities", "Link status", "RSS hash", "L3 checksum offload", "L4 checksum offload", "CRC offload", "Queue start/stop", "Scattered Rx" not in default.ini orderenetc4_vf: error: "Speed capabilities" documented, no speed_capaenetc4_vf: warning: "MTU update" implemented, not documentedenetc4_vf: warning: "Unicast MAC filter" implemented, not documented (partial)enetc4_vf: warning: mac_addr_add without mac_addr_remove
enetfec: warning: "Link status" implemented, not documented
enetfec: warning: "Promiscuous mode" documented Y, partial in code (missing promiscuous_disable)
enetfec: warning: "Allmulticast mode" implemented, not documented (partial)
enetfec: warning: "CRC offload" implemented, not documented
enetfec: warning: "VLAN offload" documented Y, partial in code (missing RTE_ETH_TX_OFFLOAD_VLAN_INSERT)
enetfec: warning: "L3 checksum offload" documented Y, partial in code (missing RTE_ETH_TX_OFFLOAD_IPV4_CKSUM)
enetfec: warning: "L4 checksum offload" documented Y, partial in code (missing RTE_ETH_TX_OFFLOAD_UDP_CKSUM, RTE_ETH_TX_OFFLOAD_TCP_CKSUM)
enetfec: warning: promiscuous_enable without promiscuous_disable
enetfec: warning: allmulticast_enable without allmulticast_disable
enetfec: warning: stats_get without stats_reset
enic: warning: line 72: "queue" not in default.ini order
enic: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
enic: warning: "Inner L3 checksum" documented Y, partial in code (missing RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM)
enic: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
failsafe: warning: "RSS key update" implemented, not documented (partial)
failsafe: warning: "Extended stats" implemented, not documented
failsafe: warning: rss_hash_update without rss_hash_conf_get
failsafe: warning: no OS documented
fm10k: error: "Multicast MAC filter" documented, no set_mc_addr_list
fm10k: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
fm10k: warning: "QinQ offload" implemented, not documented (partial)fm10k_vf: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
gve: error: "Speed capabilities" documented, no speed_capa
gve: warning: "LRO" implemented, not documented
gve: warning: "L3 checksum offload" implemented, not documented
gve: warning: "Extended stats" implemented, not documented
hinic: warning: line 14: "LRO", "CRC offload", "Flow control", "ARMv8" not in default.ini order
hinic: error: "Queue start/stop" documented, no rx_queue_start or rx_queue_stop or tx_queue_start or tx_queue_stop
hinic: error: "Inner RSS" documented, no RTE_ETH_RSS_LEVEL_*|rss*.level
hinic: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
hinic: warning: "Inner L3 checksum" documented Y, partial in code (missing RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM)
hinic: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
hinic3: warning: line 17: "LRO", "ARMv8" not in default.ini order
hinic3: error: "Speed capabilities" documented, no speed_capa
hinic3: error: "Link speed configuration" documented, no link_speeds
hinic3: warning: "Link status event" implemented, not documented
hinic3: error: "Runtime Rx queue setup" documented, no RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP
hinic3: error: "Runtime Tx queue setup" documented, no RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP
hinic3: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
hinic3: error: "QinQ offload" documented, no RTE_ETH_RX_OFFLOAD_QINQ_STRIP|RTE_ETH_RX_OFFLOAD_VLAN_EXTEND or RTE_ETH_TX_OFFLOAD_QINQ_INSERT
hinic3: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
hinic3: error: "Packet type parsing" documented, no dev_supported_ptypes_get
hns3: warning: line 16: "Fast mbuf free", "Free Tx mbuf on demand", "LRO", "Module EEPROM dump", "Timesync", "Timestamp offload" not in default.ini order
hns3: warning: "Power mgmt address monitor" implemented, not documented
hns3: warning: "QinQ offload" implemented, not documented
hns3: warning: "Stats per queue" documented, no q_[io](packets|bytes)|RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS
hns3: warning: Rx timestamp offload without read_clock, no way to read NIC clockhns3_vf: warning: line 14: "Free Tx mbuf on demand", "LRO", "Rx descriptor status" not in default.ini orderhns3_vf: warning: "Power mgmt address monitor" implemented, not documentedhns3_vf: warning: "DCB" implemented, not documentedhns3_vf: warning: "Stats per queue" documented, no q_[io](packets|bytes)|RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATShns3_vf: warning: "FW version" implemented, not documented
i40e: warning: line 54: "ARMv8", "Power8" not in default.ini order
i40e: warning: "Free Tx mbuf on demand" implemented, not documented
i40e: warning: "MTU update" implemented, not documented
i40e: warning: "EEPROM dump" implemented, not documented
i40e: warning: "Registers dump" implemented, not documented
i40e: warning: "LED" implemented, not documented
iavf: warning: "Link status event" implemented, not documented
iavf: warning: "Fast mbuf free" implemented, not documented
iavf: warning: "Timesync" implemented, not documented (partial)
iavf: warning: Rx timestamp offload without read_clock, no way to read NIC clock
ice: warning: line 14: "FEC", "DCB" not in default.ini order
ice: error: rte_flow item l2tpv2 not documented
ice: error: rte_flow item ppp not documented
ice: warning: "Inner L4 checksum" documented Y, partial in code (missing RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM)
ice: warning: "EEPROM dump" implemented, not documentedice_dcf: warning: line 18: "RSS reta update", "RSS key update", "MTU update", "Promiscuous mode", "Allmulticast mode", "Unicast MAC filter", "VLAN filter", "Traffic manager", "VLAN offload", "Basic stats", "Power mgmt address monitor" not in default.ini orderice_dcf: warning: "Link status" implemented, not documentedice_dcf: warning: "Free Tx mbuf on demand" implemented, not documentedice_dcf: warning: "Multicast MAC filter" implemented, not documentedice_dcf: warning: "Packet type parsing" implemented, not documented
idpf: warning: line 23: "Packet type parsing" not in default.ini order
idpf: error: "Speed capabilities" documented, no speed_capa
idpf: warning: "Fast mbuf free" implemented, not documented
idpf: warning: "CRC offload" implemented, not documented
idpf: warning: "Inner L3 checksum" implemented, not documented (partial)
idpf: warning: "Extended stats" implemented, not documented
idpf: warning: Rx timestamp offload without read_clock, no way to read NIC clock
igb: error: rte_flow item eth not documented
igb: error: rte_flow item ipv4 not documented
igb: error: rte_flow item ipv6 not documented
igb: error: rte_flow item raw not documented
igb: error: rte_flow item sctp not documented
igb: error: rte_flow item tcp not documented
igb: error: rte_flow item udp not documented
igb: error: rte_flow action drop not documented
igb: error: rte_flow action queue not documented
igb: error: rte_flow action rss not documented
igb: warning: "Free Tx mbuf on demand" implemented, not documented
igb: warning: "Burst mode info" implemented, not documented
igb: error: "DCB" documented, no get_dcb_info
igb: warning: "QinQ offload" documented Y, partial in code (missing RTE_ETH_TX_OFFLOAD_QINQ_INSERT)
igb: warning: "LED" implemented, not documentedigb_vf: error: "Rx interrupt" documented, no rx_queue_intr_enable or rx_queue_intr_disableigb_vf: warning: "Free Tx mbuf on demand" implemented, not documentedigb_vf: warning: "Burst mode info" implemented, not documentedigb_vf: error: "Unicast MAC filter" documented, no mac_addr_add or mac_addr_removeigb_vf: warning: "Multicast MAC filter" implemented, not documentedigb_vf: warning: "QinQ offload" documented Y, partial in code (missing RTE_ETH_TX_OFFLOAD_QINQ_INSERT)
igc: warning: line 10: "FW version", "LED", "Packet type parsing", "Rx descriptor status", "Tx descriptor status", "Rx interrupt", "Flow control", "RSS key update", "RSS reta update", "VLAN filter", "VLAN offload" not in default.ini order
igc: warning: "Free Tx mbuf on demand" implemented, not documented
igc: warning: "QinQ offload" implemented, not documented (partial)
igc: warning: "Timestamp offload" implemented, not documented
igc: warning: Rx timestamp offload without rte_mbuf_dyn_rx_timestamp_register()
ionic: warning: line 25: "VLAN offload" not in default.ini order
ionic: error: "LRO" documented, no RTE_ETH_RX_OFFLOAD_TCP_LRO
ionic: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
ionic: warning: "Inner L3 checksum" implemented, not documented (partial)
ionic: warning: "Inner L4 checksum" implemented, not documented (partial)
ipn3ke: error: "Link status event" documented, no RTE_ETH_DEV_INTR_LSC|RTE_PCI_DRV_INTR_LSC
ipn3ke: error: "Rx interrupt" documented, no rx_queue_intr_enable or rx_queue_intr_disable
ipn3ke: warning: "Fast mbuf free" implemented, not documented
ipn3ke: warning: "MTU update" implemented, not documented
ipn3ke: error: "Scattered Rx" documented, no RTE_ETH_RX_OFFLOAD_SCATTER
ipn3ke: error: "Unicast MAC filter" documented, no mac_addr_add or mac_addr_remove
ipn3ke: error: "Multicast MAC filter" documented, no set_mc_addr_list
ipn3ke: error: "RSS hash" documented, no RTE_ETH_RX_OFFLOAD_RSS_HASH|flow_type_rss_offloads
ipn3ke: error: "RSS key update" documented, no rss_hash_update or rss_hash_conf_get
ipn3ke: error: "RSS reta update" documented, no reta_update or reta_query
ipn3ke: error: "VMDq" documented, no RTE_ETH_MQ_RX_VMDQ_ONLY|vmdq_rx_conf
ipn3ke: error: "DCB" documented, no get_dcb_info
ipn3ke: error: "VLAN filter" documented, no vlan_filter_set
ipn3ke: error: "Flow control" documented, no flow_ctrl_get or flow_ctrl_set
ipn3ke: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
ipn3ke: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
ipn3ke: error: "Packet type parsing" documented, no dev_supported_ptypes_get
ipn3ke: error: "Timesync" documented, no timesync_enable or timesync_disable or timesync_read_rx_timestamp or timesync_read_tx_timestamp or timesync_adjust_time or timesync_read_time or timesync_write_time
ipn3ke: error: "Rx descriptor status" documented, no rx_descriptor_status
ipn3ke: error: "Tx descriptor status" documented, no tx_descriptor_status
ipn3ke: error: "FW version" documented, no fw_version_get
ipn3ke: error: "Module EEPROM dump" documented, no get_module_info or get_module_eeprom
ipn3ke: warning: VLAN filter offload without vlan_filter_set
ixgbe: warning: "Fast mbuf free" implemented, not documented
ixgbe: warning: "Free Tx mbuf on demand" implemented, not documented
ixgbe: warning: "Burst mode info" implemented, not documented
ixgbe: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
ixgbe: warning: "LED" implemented, not documentedixgbe_vf: warning: "Free Tx mbuf on demand" implemented, not documentedixgbe_vf: warning: "Burst mode info" implemented, not documentedixgbe_vf: warning: "Multicast MAC filter" implemented, not documentedixgbe_vf: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
mana: warning: line 15: "MTU update" not in default.ini order
mana: warning: "RSS key update" implemented, not documented
mana: warning: "VLAN offload" implemented, not documented
mana: warning: "Packet type parsing" implemented, not documented
mana: warning: "Stats per queue" implemented, not documented
memif: warning: "Stats per queue" implemented, not documented
memif: warning: no OS documented
mlx4: error: "Queue start/stop" documented, no rx_queue_start or rx_queue_stop or tx_queue_start or tx_queue_stop
mlx4: warning: "Inner L3 checksum" documented Y, partial in code (missing RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM)
mlx4: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
mlx5: warning: line 103: "represented_port" not in default.ini order
mlx5: warning: line 135: "queue" not in default.ini order
mlx5: error: "Flow control" documented, flow_ctrl_get, flow_ctrl_set only returns an error
mlx5: warning: "Inner L3 checksum" documented Y, partial in code (missing RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM)
mlx5: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
mlx5: error: "Module EEPROM dump" documented, get_module_info, get_module_eeprom only returns an error
mlx5: warning: dev_set_link_down = mlx5_set_link_down only returns an error, leave it NULL
mlx5: warning: dev_set_link_up = mlx5_set_link_up only returns an error, leave it NULL
mlx5: warning: flow_ctrl_get = mlx5_dev_get_flow_ctrl only returns an error, leave it NULL
mlx5: warning: flow_ctrl_set = mlx5_dev_set_flow_ctrl only returns an error, leave it NULL
mlx5: warning: get_module_eeprom = mlx5_get_module_eeprom only returns an error, leave it NULL
mlx5: warning: get_module_info = mlx5_get_module_info only returns an error, leave it NULL
mlx5: warning: udp_tunnel_port_add without udp_tunnel_port_del
mvneta: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
mvneta: warning: no OS documented
mvpp2: warning: "Queue start/stop" implemented, not documented (partial)
mvpp2: error: "Multicast MAC filter" documented, no set_mc_addr_list
mvpp2: warning: "RSS key update" implemented, not documented
mvpp2: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
mvpp2: warning: "Stats per queue" implemented, not documented
mvpp2: warning: no OS documented
nbl: warning: "Link status" implemented, not documented
nbl: warning: "Link status event" implemented, not documented
nbl: error: "Unicast MAC filter" documented, no mac_addr_add or mac_addr_remove
nbl: warning: "RSS hash" implemented, not documented
netvsc: warning: line 15: "Extended stats", "MTU update" not in default.ini order
netvsc: warning: "Link status event" implemented, not documented
netvsc: warning: "Removal event" implemented, not documented
netvsc: error: "Scattered Rx" documented, no RTE_ETH_RX_OFFLOAD_SCATTER
netvsc: warning: "TSO" implemented, not documented
netvsc: warning: "Multicast MAC filter" implemented, not documented
netvsc: warning: "RSS hash" implemented, not documented
netvsc: warning: "RSS key update" implemented, not documented
netvsc: warning: "RSS reta update" implemented, not documented
netvsc: warning: "VLAN offload" implemented, not documented
netvsc: warning: "L3 checksum offload" implemented, not documented
netvsc: warning: "L4 checksum offload" implemented, not documented
netvsc: warning: "Packet type parsing" implemented, not documented
netvsc: warning: "Rx descriptor status" implemented, not documented
netvsc: warning: "Tx descriptor status" implemented, not documented
nfb: warning: "MTU update" implemented, not documented
nfb: warning: "FEC" implemented, not documented (partial)
nfb: error: "Extended stats" documented, no xstats_get or xstats_get_names
nfb: warning: fec_set without fec_get_capability
nfb: warning: Rx timestamp offload without read_clock, no way to read NIC clock
nfp: warning: line 15: "TSO", "Multiprocess aware" not in default.ini order
nfp: warning: line 68: "port_id" not in default.ini order
nfp: error: "Queue start/stop" documented, no rx_queue_start or rx_queue_stop or tx_queue_start or tx_queue_stop
nfp: warning: "Burst mode info" implemented, not documented
nfp: warning: "Inline crypto" implemented, not documented
nfp: warning: "Inline protocol" implemented, not documented
nfp: warning: "QinQ offload" documented Y, partial in code (missing RTE_ETH_TX_OFFLOAD_QINQ_INSERT)
nfp: warning: "Extended stats" implemented, not documented
nfp: warning: "FW version" implemented, not documented
ngbe: warning: "Inner L3 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM
ngbe: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUMngbe_vf: warning: line 8: "Unicast MAC filter", "Multicast MAC filter", "Free Tx mbuf on demand" not in default.ini orderngbe_vf: error: "LRO" documented, no RTE_ETH_RX_OFFLOAD_TCP_LROngbe_vf: error: "Inline crypto" documented, no RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTOngbe_vf: warning: "Inner L3 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUMngbe_vf: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
ntnic: warning: line 7: "FW version", "MTU update" not in default.ini order
ntnic: warning: "Promiscuous mode" implemented, not documented (partial)
ntnic: warning: "Unicast MAC filter" documented Y, partial in code (missing mac_addr_remove)
ntnic: warning: "Stats per queue" implemented, not documented
ntnic: warning: promiscuous_enable without promiscuous_disable
ntnic: warning: mac_addr_add without mac_addr_removeocteon_ep: warning: line 11: "Basic stats", "Link status", "MTU update", "Multiprocess aware" not in default.ini orderocteon_ep: warning: "Scattered Rx" implemented, not documentedocteon_ep: warning: "Stats per queue" implemented, not documented
octeontx: warning: line 20: "CRC offload", "Flow control" not in default.ini order
octeontx: error: "Link status event" documented, no RTE_ETH_DEV_INTR_LSC|RTE_PCI_DRV_INTR_LSC
octeontx: warning: "Fast mbuf free" implemented, not documented
octeontx: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
octeontx: error: "VLAN offload" documented, no RTE_ETH_RX_OFFLOAD_VLAN_STRIP|RTE_ETH_RX_OFFLOAD_VLAN or RTE_ETH_TX_OFFLOAD_VLAN_INSERT
octeontx: warning: "Inner L4 checksum" documented Y, partial in code (missing RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM)
pcap: warning: line 13: "VLAN offload" not in default.ini order
pcap: warning: "Scattered Rx" implemented, not documented
pfe: warning: line 12: "MTU update", "Promiscuous mode", "Allmulticast mode" not in default.ini order
pfe: warning: "Allmulticast mode" documented Y, partial in code (missing allmulticast_disable)
pfe: warning: allmulticast_enable without allmulticast_disable
pfe: warning: stats_get without stats_reset
qede: warning: line 33: "SR-IOV" not in default.ini order
qede: warning: "Link status event" implemented, not documented
qede: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
qede: warning: "Rx descriptor status" implemented, not documented
qede: warning: "FW version" implemented, not documentedqede_vf: warning: line 34: "LRO", "TSO" not in default.ini orderqede_vf: error: "Flow control" documented, no flow_ctrl_get or flow_ctrl_setqede_vf: warning: "FW version" implemented, not documented
r8169: warning: "Free Tx mbuf on demand" implemented, not documented
r8169: error: "Flow control" documented, no flow_ctrl_get or flow_ctrl_set
r8169: warning: "VLAN offload" implemented, not documented
rnp: warning: line 10: "Packet type parsing", "L3 checksum offload", "L4 checksum offload", "Inner L3 checksum", "Inner L4 checksum", "Basic stats", "Stats per queue", "Extended stats", "MTU update", "VLAN filter", "VLAN offload", "QinQ offload", "Scattered Rx", "TSO" not in default.ini order
rnp: warning: "Fast mbuf free" implemented, not documented
rnp: warning: "Burst mode info" implemented, not documented
rnp: error: "Inner RSS" documented, no RTE_ETH_RSS_LEVEL_*|rss*.level
rnp: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
sfc: warning: line 79: "queue" not in default.ini order
sxe2: warning: line 17: "Queue start/stop", "MTU update", "TSO", "Promiscuous mode", "Allmulticast mode", "Unicast MAC filter", "RSS hash", "RSS key update", "RSS reta update", "VLAN filter", "Inline crypto", "Packet type parsing", "Timesync" not in default.ini order
sxe2: warning: line 79: "port_id" not in default.ini order
sxe2: error: "Link status event" documented, no RTE_ETH_DEV_INTR_LSC|RTE_PCI_DRV_INTR_LSC
sxe2: warning: "Removal event" implemented, not documented
sxe2: warning: "LRO" implemented, not documented
sxe2: warning: "Multicast MAC filter" implemented, not documented
sxe2: error: "Timesync" documented, no timesync_enable or timesync_disable or timesync_read_rx_timestamp or timesync_read_tx_timestamp or timesync_adjust_time or timesync_read_time or timesync_write_time
sxe2: warning: "Stats per queue" implemented, not documented
sxe2: warning: Rx timestamp offload without read_clock, no way to read NIC clock
tap: warning: "TSO" implemented, not documented
tap: warning: "RSS key update" implemented, not documented (partial)
tap: warning: "Stats per queue" implemented, not documented
tap: warning: rss_hash_update without rss_hash_conf_get
thunderx: warning: "Fast mbuf free" implemented, not documented
thunderx: warning: "Promiscuous mode" documented Y, partial in code (missing promiscuous_disable)
thunderx: error: "Allmulticast mode" documented, no allmulticast_enable or allmulticast_disable
thunderx: error: "CRC offload" documented, no RTE_ETH_RX_OFFLOAD_KEEP_CRC
thunderx: warning: "Inner L3 checksum" implemented, not documented (partial)
thunderx: warning: promiscuous_enable without promiscuous_disable
txgbe: warning: "Free Tx mbuf on demand" implemented, not documented
txgbe: warning: "FEC" implemented, not documented
txgbe: warning: "MACsec offload" implemented, not documented
txgbe: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUMtxgbe_vf: warning: line 8: "Unicast MAC filter", "Multicast MAC filter", "Free Tx mbuf on demand" not in default.ini ordertxgbe_vf: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
vhost: warning: line 9: "Queue status event" not in default.ini order
vhost: warning: "Link status event" implemented, not documented
vhost: warning: "Rx interrupt" implemented, not documented
vhost: warning: "Power mgmt address monitor" implemented, not documented
vhost: warning: "VLAN offload" implemented, not documented
vhost: warning: "Stats per queue" implemented, not documented
vhost: warning: no OS documented
virtio: warning: line 22: "Extended stats", "MTU update" not in default.ini order
virtio: warning: "Burst mode info" implemented, not documented
virtio: warning: "Power mgmt address monitor" implemented, not documented
virtio: warning: "LRO" implemented, not documented
virtio: warning: "TSO" implemented, not documented
virtio: error: "Multicast MAC filter" documented, no set_mc_addr_list
virtio: warning: "VLAN offload" implemented, not documented
virtio: warning: "L4 checksum offload" implemented, not documented
vmxnet3: warning: "Rx interrupt" implemented, not documented
vmxnet3: warning: "Scattered Rx" implemented, not documented
vmxnet3: error: "Unicast MAC filter" documented, no mac_addr_add or mac_addr_remove
vmxnet3: warning: "RSS reta update" implemented, not documented
vmxnet3: warning: "L3 checksum offload" implemented, not documented (partial)
vmxnet3: warning: "FW version" implemented, not documented
xsc: warning: "Speed capabilities" implemented, not documented
xsc: error: "Link status event" documented, no RTE_ETH_DEV_INTR_LSC|RTE_PCI_DRV_INTR_LSC
xsc: error: "RSS reta update" documented, no reta_update or reta_query
xsc: warning: "FEC" documented Y, partial in code (missing fec_get_capability)
xsc: warning: "Timestamp offload" implemented, not documented
xsc: warning: "Inner L3 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM
xsc: warning: "Inner L4 checksum" documented, no RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM or RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM
xsc: warning: fec_set without fec_get_capability
xsc: warning: Rx timestamp offload without read_clock, no way to read NIC clock
xsc: warning: Rx timestamp offload without rte_mbuf_dyn_rx_timestamp_register()
zxdh: warning: line 7: "Linux", "x86-64", "ARMv8", "SR-IOV", "Multiprocess aware", "Scattered Rx", "Promiscuous mode", "Allmulticast mode", "RSS hash", "RSS reta update", "Inner RSS", "Basic stats", "Stats per queue", "MTU update", "LRO", "TSO" not in default.ini order
zxdh: warning: line 50: "count" not in default.ini order
zxdh: warning: "Speed capabilities" implemented, not documented
zxdh: warning: "Rx interrupt" implemented, not documented
zxdh: error: "Multicast MAC filter" documented, no set_mc_addr_list
zxdh: warning: "RSS key update" implemented, not documented
zxdh: warning: "L4 checksum offload" implemented, not documented
zxdh: warning: "Inner L4 checksum" documented Y, partial in code (missing RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM)
zxdh: warning: "Packet type parsing" implemented, not documented
zxdh: warning: "Inner L4 checksum" documented without "L4 checksum offload"
23/09/2026 20:42, Stephen Hemminger:
Quoted 6 lines
The existing
check-doc-vs-code.shonly comparesrte_flowitems and actions, and only for drivers whose directory matches the ini name, so none of the drivers under net/intel are checked.Replace it and
parse-flow-support.shwith a Python script covering the whole NIC feature matrix:
[...]
Quoted 10 lines
devtools/check-doc-vs-code.py | 1132 ++++++++++++++++++++++++ devtools/check-doc-vs-code.sh | 84 -- devtools/parse-flow-support.sh | 92 -- doc/guides/contributing/new_driver.rst | 4 +- doc/guides/contributing/patches.rst | 27 + doc/guides/nics/features.rst | 5 + 8 files changed, 1169 insertions(+), 180 deletions(-) create mode 100755 devtools/check-doc-vs-code.py delete mode 100755 devtools/check-doc-vs-code.sh delete mode 100755 devtools/parse-flow-support.sh
Thanks for working on it.
My concern is how easy it is to maintain for all contributors having to insert their rules and exceptions?
It is replacing less 200 lines with more than 1000 lines so it looks a lot more complex.
It is probably fully generated by AI?
Can we make it simpler?
Quoted 19 lines · On Wed, 23 Sep 2026 21:19:45 +0200 Thomas Monjalon <[email protected]> wrote:
23/09/2026 20:42, Stephen Hemminger:
Quoted 6 lines
The existing
check-doc-vs-code.shonly comparesrte_flowitems and actions, and only for drivers whose directory matches the ini name, so none of the drivers under net/intel are checked.Replace it and
parse-flow-support.shwith a Python script covering the whole NIC feature matrix:[...]
Quoted 10 lines
devtools/check-doc-vs-code.py | 1132 ++++++++++++++++++++++++ devtools/check-doc-vs-code.sh | 84 -- devtools/parse-flow-support.sh | 92 -- doc/guides/contributing/new_driver.rst | 4 +- doc/guides/contributing/patches.rst | 27 + doc/guides/nics/features.rst | 5 + 8 files changed, 1169 insertions(+), 180 deletions(-) create mode 100755 devtools/check-doc-vs-code.py delete mode 100755 devtools/check-doc-vs-code.sh delete mode 100755 devtools/parse-flow-support.sh
Quoted 4 lines
Thanks for working on it.
My concern is how easy it is to maintain for all contributors having to insert their rules and exceptions?
The result doesn't have to be nothing. I would rather not keep track of exceptions in the script.
Quoted 4 lines
It is replacing less 200 lines with more than 1000 lines so it looks a lot more complex.
It is probably fully generated by AI?
Can we make it simpler?
I will look into it, should be table driven and more split up.
Quoted 21 lines · On Wed, 23 Sep 2026 21:19:45 +0200 Thomas Monjalon <[email protected]> wrote:
23/09/2026 20:42, Stephen Hemminger:
Quoted 6 lines
The existing
check-doc-vs-code.shonly comparesrte_flowitems and actions, and only for drivers whose directory matches the ini name, so none of the drivers under net/intel are checked.Replace it and
parse-flow-support.shwith a Python script covering the whole NIC feature matrix:[...]
Quoted 10 lines
devtools/check-doc-vs-code.py | 1132 ++++++++++++++++++++++++ devtools/check-doc-vs-code.sh | 84 -- devtools/parse-flow-support.sh | 92 -- doc/guides/contributing/new_driver.rst | 4 +- doc/guides/contributing/patches.rst | 27 + doc/guides/nics/features.rst | 5 + 8 files changed, 1169 insertions(+), 180 deletions(-) create mode 100755 devtools/check-doc-vs-code.py delete mode 100755 devtools/check-doc-vs-code.sh delete mode 100755 devtools/parse-flow-support.shThanks for working on it.
Quoted 9 lines
My concern is how easy it is to maintain for all contributors having to insert their rules and exceptions?
It is replacing less 200 lines with more than 1000 lines so it looks a lot more complex.
It is probably fully generated by AI?
Can we make it simpler?
The other suggestion would be to git rid of the .ini file method of generating this feature matrix in doc and just have python script generate it. Prefer a single source of truth, less work
Quoted 34 lines · Stephen Hemminger
Quoted 21 lines · On Wed, 23 Sep 2026 21:19:45 +0200 Thomas Monjalon <[email protected]> wrote:
23/09/2026 20:42, Stephen Hemminger:
Quoted 6 lines
The existing
check-doc-vs-code.shonly comparesrte_flowitems and actions, and only for drivers whose directory matches the ini name, so none of the drivers under net/intel are checked.Replace it and
parse-flow-support.shwith a Python script covering the whole NIC feature matrix:[...]
Quoted 10 lines
devtools/check-doc-vs-code.py | 1132 ++++++++++++++++++++++++ devtools/check-doc-vs-code.sh | 84 -- devtools/parse-flow-support.sh | 92 -- doc/guides/contributing/new_driver.rst | 4 +- doc/guides/contributing/patches.rst | 27 + doc/guides/nics/features.rst | 5 + 8 files changed, 1169 insertions(+), 180 deletions(-) create mode 100755 devtools/check-doc-vs-code.py delete mode 100755 devtools/check-doc-vs-code.sh delete mode 100755 devtools/parse-flow-support.shThanks for working on it.
Quoted 9 lines
My concern is how easy it is to maintain for all contributors having to insert their rules and exceptions?
It is replacing less 200 lines with more than 1000 lines so it looks a lot more complex.
It is probably fully generated by AI?
Can we make it simpler?
Quoted 3 lines
The other suggestion would be to git rid of the .ini file method of generating this feature matrix in doc and just have python script generate it. Prefer a single source of truth, less work
+1, I was just going to suggest that when I saw the discussion on this script.
In case of autogeneration, for cases like "partial" support, we can have a well-defined comment tag or similar in the code to mark it.
/Bruce
24/09/2026 09:33, Bruce Richardson:
Quoted 35 lines · Stephen Hemminger
Quoted 34 lines
Quoted 30 lines · On Wed, 23 Sep 2026 21:19:45 +0200 Thomas Monjalon <[email protected]> wrote:
23/09/2026 20:42, Stephen Hemminger:
Quoted 6 lines
The existing
check-doc-vs-code.shonly comparesrte_flowitems and actions, and only for drivers whose directory matches the ini name, so none of the drivers under net/intel are checked.Replace it and
parse-flow-support.shwith a Python script covering the whole NIC feature matrix:[...]
Quoted 10 lines
devtools/check-doc-vs-code.py | 1132 ++++++++++++++++++++++++ devtools/check-doc-vs-code.sh | 84 -- devtools/parse-flow-support.sh | 92 -- doc/guides/contributing/new_driver.rst | 4 +- doc/guides/contributing/patches.rst | 27 + doc/guides/nics/features.rst | 5 + 8 files changed, 1169 insertions(+), 180 deletions(-) create mode 100755 devtools/check-doc-vs-code.py delete mode 100755 devtools/check-doc-vs-code.sh delete mode 100755 devtools/parse-flow-support.shThanks for working on it.
My concern is how easy it is to maintain for all contributors having to insert their rules and exceptions?
It is replacing less 200 lines with more than 1000 lines so it looks a lot more complex.
It is probably fully generated by AI?
Can we make it simpler?
Quoted 8 lines
Quoted 3 lines
The other suggestion would be to git rid of the .ini file method of generating this feature matrix in doc and just have python script generate it. Prefer a single source of truth, less work
+1, I was just going to suggest that when I saw the discussion on this script.
In case of autogeneration, for cases like "partial" support, we can have a well-defined comment tag or similar in the code to mark it.
I agree with this direction.
Quoted 40 lines · On Thu, 24 Sep 2026 10:36:42 +0200 Thomas Monjalon <[email protected]> wrote:
24/09/2026 09:33, Bruce Richardson:
Quoted 39 lines · Stephen Hemminger
Quoted 37 lines
Quoted 21 lines · On Wed, 23 Sep 2026 21:19:45 +0200 Thomas Monjalon <[email protected]> wrote:
23/09/2026 20:42, Stephen Hemminger:
Quoted 6 lines
The existing
check-doc-vs-code.shonly comparesrte_flowitems and actions, and only for drivers whose directory matches the ini name, so none of the drivers under net/intel are checked.Replace it and
parse-flow-support.shwith a Python script covering the whole NIC feature matrix:[...]
Quoted 10 lines
devtools/check-doc-vs-code.py | 1132 ++++++++++++++++++++++++ devtools/check-doc-vs-code.sh | 84 -- devtools/parse-flow-support.sh | 92 -- doc/guides/contributing/new_driver.rst | 4 +- doc/guides/contributing/patches.rst | 27 + doc/guides/nics/features.rst | 5 + 8 files changed, 1169 insertions(+), 180 deletions(-) create mode 100755 devtools/check-doc-vs-code.py delete mode 100755 devtools/check-doc-vs-code.sh delete mode 100755 devtools/parse-flow-support.shThanks for working on it.
Quoted 9 lines
My concern is how easy it is to maintain for all contributors having to insert their rules and exceptions?
It is replacing less 200 lines with more than 1000 lines so it looks a lot more complex.
It is probably fully generated by AI?
Can we make it simpler?The other suggestion would be to git rid of the .ini file method of generating this feature matrix in doc and just have python script generate it. Prefer a single source of truth, less work
Quoted 7 lines
Quoted 4 lines
+1, I was just going to suggest that when I saw the discussion on this script.
In case of autogeneration, for cases like "partial" support, we can have a well-defined comment tag or similar in the code to mark it.I agree with this direction.
The plan AI generated is:
# DPDK NIC feature matrix: generator concept
Handoff note for resuming in a new session.
Branch doc, worktree /home/shemminger/DPDK/doc.
## The idea
Today the NIC feature matrix is a **hand-maintained cache of facts that are already knowable from the code**. That is what produced ~448 doc-vs-code
findings: the cache went stale.
Replace it. Instead of checking docs against code, **generate the doc output from the code** using the same rules.
Split the current devtools/check-doc-vs-code.py into two tools with genuinely different jobs:
1. **generator** — code -> RST table directly. No .ini files at all.
2. **check-ethdev-ops** — a linter for *driver code* self-consistency. Nothing to do with docs.
The second tool matters because many current "findings" are **not doc bugs and cannot be fixed by editing docs**:
ena: stats_get without stats_reset
ntnic: mac_addr_add without mac_addr_remove
pfe: allmulticast_enable without allmulticast_disable
mlx5: flow_ctrl_get only returns an error, leave it NULL
nfb: fec_set without fec_get_capability
xsc: Rx timestamp offload without read_clock
Those are driver defects. The OP_PAIRS and CODE_IMPLIES tables already in the script are check-ethdev-ops in embryo — lift them out roughly as-is.
## Current pipeline
code -> (75 hand-maintained .ini) -> conf.py -> RST table
- doc/guides/conf.py:168 generate_overview_table(), called **22 times** across **8 device classes**.
- Feature dirs: nics, bbdevs, vdpadevs, regexdevs, compressdevs, gpus, cryptodevs, eventdevs.
- **Only nics has rules.** The other 7 classes have no code-derivation rules, so conf.py must keep the ini path for them. Two mechanisms will coexist unless that is also tackled. This is an open scoping question.
## Is the nics table fully derivable? Yes (measured)
Features 78 rows: 68 via RULES + 10 platform via meson -> 0 uncovered
rte_flow items 68 rows: scan RTE_FLOW_ITEM_TYPE_* tokens rte_flow actions 66 rows: scan RTE_FLOW_ACTION_TYPE_* tokens
check-doc-vs-code.py -g <driver> already generates a full ini and runs cleanly for all 75 drivers. The machinery largely exists.
## CRITICAL: naive generation REGRESSES the docs
Generated vs committed across all 75 inis: **only 1/75 match**.
Totals: **+811 rows / -165 rows / ~160 value changes.**
Three distinct causes, each needing a fix before output is publishable:
### 1. Platform rows (~300 bogus additions)
Generator adds LoongArch64 to 66 drivers, rv64 to 65, Power8 to 61, ARMv7 to 54 — solely because meson does not *exclude* them.
**"Not forbidden to build" != "supported".** Publishing this asserts tested support that does not exist. Counter-example already in tree: af_xdp.ini deliberately lists only x86-64 though meson allows every arch.
Fix: treat meson as an *upper bound* only; keep explicit per-driver platform claims. Do not assert support from absence of exclusion.
### 2. Non-derivable rows silently deletedUsage doc x38, SR-IOV x22 (also Design doc, Perf doc). These are the script's UNCHECKED set — no code equivalent exists. Pure information loss. **They need a home.** (Open question below.)
### 3. Partial support flattened: P -> Y, 160 times Generator cannot express partial support:eth P->Y x19, vlan P->Y x14, Speed capabilities P->Y x13, L4 checksum offload P->Y x11.
RULES already models requirement groups and support() already computes partial (some-but-not-all groups matched) — **generation just discards it.**
Fix: propagate P instead of flattening. Verified real case: igb eth = P is correct and the generator would clobber it to Y.
## Open questions for the user
1. **Where do non-derivable facts live?** (Usage doc, Design doc, Perf doc, SR-IOV, tested-platform claims.) Options: small per-driver override file; annotation in driver source; or drop those rows entirely.
2. **Scope across the other 7 device classes** — nics-only generation leaves two mechanisms in conf.py.
## Also deferred: DRIVERS[] table is brittle (user-flagged)
Hardcoded ini-name -> source-path map in the script.
- driver_for() falls back to (name, 'intel/'+name) — only ONE vendor dir is special-cased. A new vendor subdir, or a driver moving into one, **silently stops being checked**: no error, just no coverage. Worst failure mode for a linter. ipn3ke only works today via that fallback (intel/ipn3ke).
- all_dirs() hardcodes the same intel special case.
- 24/27 entries exist only to disambiguate PF/VF sharing one directory.
Idea: derive the directory from meson/driver registration and recurse vendor subdirs generically; keep DRIVERS[] only for genuine PF/VF ops-regex cases. **If the table becomes generated documentation rather than a lint heuristic, this must be solid first.**
## Verified facts worth not re-deriving
- Code.__init__ walks the **whole** driver dir and concatenates all .c/.h, so multi-file drivers are handled by default. Blind spot is only the 9 DRIVERS[] entries that narrow the *file set* via files= (e1000, igb, igb_vf, igc, enetc, enetc4, enetc4_vf, ice, ice_dcf). The other entries use ops= only, which still reads every file.
- **Rule adopted:** before deleting a doc row, grep the whole driver directory for the symbol, not just the globbed subset. If it exists outside the glob it is a script bug (defer); if absent everywhere the row is genuinely wrong.
- e1000/igb rte_flow was NOT a script bug: flow_ops_get and all 7 flow items exist only in igb (igb_flow.c); em has none. Rows were in the wrong file. The *shared* header e1000_ethdev.h declaring eth_igb_tx_done_cleanup is why e1000 wrongly claimed "Free Tx mbuf on demand" — multi-file layout was the *cause* of the doc errors, not an obstacle to finding them.
## Commit conventions (verified against DPDK's own checkers)
Always run: ./devtools/check-git-log.sh -nN && ./devtools/checkpatches.sh -nN
- A title containing "fix" **requires** a Fixes: tag or check-git-log fails. Generate with:
git log -1 --abbrev=12 --format='Fixes: %h ("%s")' <sha>
- Doc feature-matrix fixes in history also carry Cc: [email protected].
- Avoiding the word "fix" (e.g. "doc/af_packet: update feature matrix") is legitimate when there is no single culprit commit to blame.
- Find the culprit for a doc row: git log -S'<row text>' -- <ini path>
## Work already committed on branch doc (9 patches, all checker-clean)
7d85396ec1 net/af_packet: support reading device clock <- real code fix
41f385c391 doc/af_packet: update feature matrix cffcad6ad2 doc: fix e1000 and igb feature matrix 3718164550 doc/axgbe: update feature matrix
doc/mana, doc/memif, doc/pcap, doc/octeon_ep, doc/vhost
Drivers now reporting zero findings: afpacket, e1000, igb, axgbe, mana, memif, pcap, octeon_ep, vhost.
Recommendation: **keep these.** The af_packet read_clock is a genuine code fix, and the doc ones are correct under either design and shrink the eventual generated diff.
Uncommitted: nothing. A partial batch (ena, nfb, thunderx, enetfec, pfe, ntnic, bnx2x) was deliberately **not** applied pending this redesign.
## Constraints from the user
- Drivers with no ini today (bonding, null, ring, softnic): **do not create one.**
- Prefer updating docs over changing drivers; if both, one patch each.
- One patch per driver.
- First pass: fix what is clearly fixable, do not force ambiguous cases.