NIC and driver inventory
GET /api/bng/drivers read_only
Enumerates every Ethernet-class PCI device on the chassis, groups them by bound
kernel driver, and reports firmware, DDP, and addressing state. This is the
endpoint that answers "what NICs are in this box, what firmware are they running,
and which ones has VPP taken over".
{
"drivers": [
{
"name": "ice",
"module_version": "1.13.7",
"description": "Intel(R) Ethernet Connection E800 Series Linux Driver",
"supported_pci_ids": ["8086:1593"],
"nics": [
{
"pci": "0000:13:00.0", "driver": "ice", "vendor_device": "8086:1593",
"vendor_name": "Intel Corporation Ethernet Controller E810-C",
"ifname": "eno1np0", "mac": "3c:ec:ef:aa:bb:cc", "link_state": "up",
"firmware_version": "3.81 0x8000685b 1.3643.0",
"ddp_track_id": "0xc0000001", "ddp_version": "1.3.30.0",
"nvm_version": "3.81", "serial": "3CECEFAABBCC",
"binding_note": "", "vpp_name": "",
"ip_addrs": ["100.64.0.1/20"]
}
]
}
]
}
Notable semantics. A NIC with no bound driver is grouped under the literal key
"unbound". supported_pci_ids lists the device IDs actually present on
this chassis, not the driver's full support table. DDP and serial fields are
only populated for the Intel ice, i40e, and iavf drivers, which are the
ones exposing them through devlink; every other driver reports empty strings.
The most operationally significant field is binding_note. When a NIC is bound
to a userspace driver — vfio-pci, uio_pci_generic, or igb_uio — the kernel
tools can no longer read its firmware or DDP state, and the note explains
exactly that. For these NICs the MAC address and link state are backfilled from
VPP's own port inventory instead, so the record is still complete.
ip_addrs merges kernel-side and VPP-side addressing, deduplicated. Sub-interface
addresses roll up to their physical parent and are annotated with the owning
sub-interface, so an entry may read
"100.64.255.2/24 (FortyGigabitEthernet47/0/0.200)" rather than a bare CIDR.
Link-local and loopback addresses are excluded.
Every field degrades to "" rather than null or absence, so a client never has
to null-check. The endpoint always returns 200.