network
- GET /network/config/bonds
List LACP bonds
Retrieves all LACP bonds on the host with health classification
- Status Codes:
200 OK – List of bonds with LACP state + metrics
500 Internal Server Error – Internal server error
- Response JSON Object:
bonds[].active_aggregator (integer)
bonds[].admin_state (string)
bonds[].carrier (boolean)
bonds[].health (string) – healthy|degraded_no_partner|degraded_slave_down|down
bonds[].ip_addresses[] (string)
bonds[].lacp_rate (string) – “fast” | “slow”
bonds[].mac_address (string)
bonds[].mode (string) – “IEEE 802.3ad …”
bonds[].mtu (integer)
bonds[].name (string) – “bond0”
bonds[].oper_state (string)
bonds[].partner_mac (string) – switch-side; zero = not negotiated
bonds[].slaves[].aggregator_id (integer)
bonds[].slaves[].link_failures (integer)
bonds[].slaves[].mii_status (string) – “up” | “down”
bonds[].slaves[].name (string)
bonds[].slaves[].speed_mbps (integer)
bonds[].slaves_total (integer)
bonds[].slaves_up (integer)
bonds[].xmit_hash_policy (string) – “layer3+4” etc
count (integer)
metrics.degraded_no_partner (integer)
metrics.degraded_slave_down (integer)
metrics.down (integer)
metrics.healthy (integer)
metrics.total (integer)
- GET /network/config/bonds/{name}
Get bond status
Retrieves detailed LACP + per-slave state for one bond
- Parameters:
name (string) – Bond name (e.g. bond0)
- Status Codes:
200 OK – OK
404 Not Found – Bond not found
- Response JSON Object:
active_aggregator (integer)
admin_state (string)
carrier (boolean)
health (string) – healthy|degraded_no_partner|degraded_slave_down|down
index (integer)
ip_addresses[] (string)
lacp_rate (string) – “fast” | “slow”
mac_address (string)
mode (string) – “IEEE 802.3ad …”
mtu (integer)
name (string) – “bond0”
oper_state (string)
partner_mac (string) – switch-side; zero = not negotiated
slaves[].aggregator_id (integer)
slaves[].link_failures (integer)
slaves[].mii_status (string) – “up” | “down”
slaves[].name (string)
slaves[].speed_mbps (integer)
slaves_total (integer)
slaves_up (integer)
stats.collisions (integer)
stats.multicast (integer)
stats.rx_bytes (integer)
stats.rx_compressed (integer)
stats.rx_crc_errors (integer)
stats.rx_dropped (integer)
stats.rx_errors (integer)
stats.rx_fifo_errors (integer)
stats.rx_frame_errors (integer)
stats.rx_length_errors (integer)
stats.rx_missed_errors (integer)
stats.rx_over_errors (integer)
stats.rx_packets (integer)
stats.tx_aborted_errors (integer)
stats.tx_bytes (integer)
stats.tx_carrier_errors (integer)
stats.tx_compressed (integer)
stats.tx_dropped (integer)
stats.tx_errors (integer)
stats.tx_fifo_errors (integer)
stats.tx_heartbeat_errors (integer)
stats.tx_packets (integer)
stats.tx_window_errors (integer)
xmit_hash_policy (string) – “layer3+4” etc
- GET /network/config/bridges
List network bridges
Retrieves a list of all network bridges
- Status Codes:
200 OK – List of network bridges
500 Internal Server Error – Internal server error
- Response JSON Object:
bridges[].admin_state (string)
bridges[].bucket (string)
bridges[].carrier (boolean)
bridges[].flags[] (string)
bridges[].ip_addresses[] (string)
bridges[].mac_address (string)
bridges[].members[] (string)
bridges[].mtu (integer)
bridges[].name (string)
bridges[].offloads (object)
bridges[].oper_state (string)
bridges[].tx_qlen (integer)
count (integer)
metrics.active_bridges (integer)
metrics.admin_down_count (integer)
metrics.highest_error_bridge (string)
metrics.highest_error_bridge_errors (integer)
metrics.highest_mtu (integer) – Highest MTU
metrics.highest_mtu_owner (string)
metrics.inactive_bridges (integer)
metrics.most_members_bridge (string)
metrics.most_members_count (integer)
metrics.most_used_bridge (string)
metrics.most_used_bytes (integer)
metrics.oper_down_count (integer)
metrics.total_bridges (integer)
metrics.total_errors (integer) – Error tracking
metrics.total_members (integer) – Members
metrics.total_rx_bytes (integer) – Aggregate traffic
metrics.total_tx_bytes (integer)
metrics.worst_oper_state (string)
metrics.worst_state_bridge (string) – Worst state
- GET /network/config/bridges/{name}
Get bridge status
Retrieves the status of a specific network bridge
- Parameters:
name (string) – Bridge name
- Status Codes:
200 OK – Bridge status successfully retrieved
404 Not Found – Bridge not found
500 Internal Server Error – Internal server error
- Response JSON Object:
admin_state (string)
allmulticast (boolean)
carrier (boolean)
flags[] (string)
index (integer)
ip_addresses[] (string)
mac_address (string)
master (string)
members[] (string)
mtu (integer)
name (string)
offloads (object)
oper_state (string)
promiscuous (boolean)
raw_flags (integer)
stats.collisions (integer)
stats.multicast (integer)
stats.rx_bytes (integer)
stats.rx_compressed (integer)
stats.rx_crc_errors (integer)
stats.rx_dropped (integer)
stats.rx_errors (integer)
stats.rx_fifo_errors (integer)
stats.rx_frame_errors (integer)
stats.rx_length_errors (integer)
stats.rx_missed_errors (integer)
stats.rx_over_errors (integer)
stats.rx_packets (integer)
stats.tx_aborted_errors (integer)
stats.tx_bytes (integer)
stats.tx_carrier_errors (integer)
stats.tx_compressed (integer)
stats.tx_dropped (integer)
stats.tx_errors (integer)
stats.tx_fifo_errors (integer)
stats.tx_heartbeat_errors (integer)
stats.tx_packets (integer)
stats.tx_window_errors (integer)
tx_queue_len (integer)
type (string) – always “bridge”
- GET /network/config/bridges/{name}/qos
Get QoS state for a bridge
Retrieves the live qdisc/class/filter tree for a bridge
- Parameters:
name (string) – Bridge name
- Status Codes:
200 OK – QoS state successfully retrieved
404 Not Found – Bridge not found
500 Internal Server Error – Internal server error
- Response JSON Object:
cake (any) – Cake carries CAKE’s full config + per-tin runtime stats, decoded directly from raw netlink attributes (see qos_cake_read.go — the vendored netlink library has no typed Cake qdisc and drops TCA_STATS_APP for every qdisc kind, so this is not reachable through Qdiscs above). Populated only when RootQdisc == “cake”; nil otherwise.
classes[].backlog (integer)
classes[].bytes (integer)
classes[].ceil_bytes_per_sec (integer)
classes[].class_id (string)
classes[].drops (integer)
classes[].overlimits (integer)
classes[].packets (integer)
classes[].parent (string)
classes[].prio (integer)
classes[].qlen (integer)
classes[].rate_bytes_per_sec (integer)
classes[].requeues (integer)
classes[].type (string)
device (string)
device_class (string) – bridge|virtual|nic
effective_device (string) – A Linux bridge never carries the egress shaper itself — a CAKE/HTB shaper lives on its enslaved physical UPLINK (the device the golden karios-cake-egress script and apply_qos_step target), not on the bridge. So a bare read of a bridge reports Profile “none” while its uplink is shaped. For a bridge, EffectiveDevice names that uplink and EffectiveQoS carries the uplink’s full QoS (incl. CAKE detail), so a consumer can show the REAL policy instead of a misleading “none”. Both empty/nil for non-bridges and for a bridge with no physical uplink yet (collapsed/flat).
effective_qos (object) – Self-referencing ‘utils.DeviceQoSInfo’ child — recursion broken so the docs renderer (sphinxcontrib-openapi) does not infinite-loop. See raw spec for full self-referential type.
filters[].parent (string)
filters[].priority (integer)
filters[].type (string)
profile (string) – Profile is the best-effort match against the named profile catalogue (QoSProfile* constants above), or QoSProfileUnmanaged if the live tree shape matches none of them. Never rounded to the nearest known profile.
qdiscs[].backlog (integer)
qdiscs[].bytes (integer)
qdiscs[].drops (integer)
qdiscs[].handle (string)
qdiscs[].overlimits (integer)
qdiscs[].packets (integer)
qdiscs[].parent (string)
qdiscs[].qlen (integer)
qdiscs[].requeues (integer)
qdiscs[].type (string)
root_handle (string)
root_qdisc (string) – kind of the root qdisc, e.g. “mq”, “htb”, “fq_codel”, “noqueue”
- GET /network/config/interfaces
List network interfaces
Retrieves a list of all network interfaces
- Status Codes:
200 OK – List of network interfaces
500 Internal Server Error – Internal server error
- Response JSON Object:
count (integer)
interfaces[].admin_state (string)
interfaces[].allmulticast (boolean)
interfaces[].carrier (boolean)
interfaces[].code (string) – machine reason code (constants.Code*)
interfaces[].current_speed (integer)
interfaces[].flags[] (string)
interfaces[].hardware.bus_info (string) – PCI/USB bus address (e.g., “0000:01:00.0”)
interfaces[].hardware.device_type (string) – “physical”, “virtual”, “bridge”, “vlan”, etc.
interfaces[].hardware.driver (string) – Kernel driver name (e.g., “e1000e”, “ixgbe”)
interfaces[].hardware.driver_version (string) – Driver version
interfaces[].hardware.firmware_version (string) – Firmware version
interfaces[].hardware.is_sriov_pf (boolean) – true if SR-IOV physical function
interfaces[].hardware.is_sriov_vf (boolean) – true if SR-IOV virtual function
interfaces[].hardware.mac_vendor (string) – Human-readable vendor name derived from PCI vendor ID
interfaces[].hardware.modalias (string) – Device modalias string
interfaces[].hardware.pci_device (string) – PCI device ID
interfaces[].hardware.pci_subsystem (string) – PCI subsystem ID
interfaces[].hardware.pci_vendor (string) – PCI vendor ID (e.g., “8086” for Intel)
interfaces[].ip_addresses[] (string)
interfaces[].last_state_change_secs (integer) – State change tracking
interfaces[].mac_address (string)
interfaces[].master (string)
interfaces[].max_speed (integer)
interfaces[].mtu (integer)
interfaces[].name (string)
interfaces[].offloads (object)
interfaces[].oper_state (string)
interfaces[].overall_state (string) – Computed display fields
interfaces[].ownership (string) – system|user|available|quarantine — see netconstants.Bucket*
interfaces[].promiscuous (boolean)
interfaces[].raw_flags (integer)
interfaces[].reason (string) – human-readable reason
interfaces[].ring_rx_current (integer) – Ring buffer sizes (ethtool -g) — current + hardware max, so the detail page can show the live value next to the editable ring_rx/ring_tx control.
interfaces[].ring_rx_max (integer)
interfaces[].ring_tx_current (integer)
interfaces[].ring_tx_max (integer)
interfaces[].sdwan_type (string)
interfaces[].status (string) – Eligibility classification (net-new). Stamped node-local by ClassifyNICs so the values survive the control-node proxy and reach the UI as-is. The owning bridge is carried by the existing master field — no separate owner field.
interfaces[].throughput_rx_mbps (number) – Throughput — 1-minute rolling average computed by the interface poller
interfaces[].throughput_tx_mbps (number)
interfaces[].traffic_role (string) – public|guest|management|”” - CS traffic-type via agent.properties
interfaces[].tx_queue_len (integer)
interfaces[].type (string)
metrics.active_nics (integer)
metrics.admin_down_count (integer)
metrics.highest_error_nic (string) – NIC with the most errors
metrics.highest_error_nic_errors (integer)
metrics.highest_mtu (integer) – Highest MTU
metrics.highest_mtu_owner (string)
metrics.inactive_nics (integer)
metrics.most_used_bytes (integer)
metrics.most_used_nic (string)
metrics.oper_down_count (integer)
metrics.top_talker_nic (string)
metrics.total_errors (integer) – Error tracking
metrics.total_nics (integer)
metrics.total_rx_bytes (integer) – Aggregate traffic
metrics.total_tx_bytes (integer)
metrics.worst_oper_state (string)
metrics.worst_state_nic (string) – Worst state — the NIC with the worst oper_state (down > lowerlayerdown > unknown > up)
- POST /network/config/interfaces
Create a dummy interface
Creates a dummy interface (kernel link + karios-managed ifupdown fragment) synchronously
- Request JSON Object:
address_cidr (string)
dns[] (string)
gateway (string)
mode (string) – IP config — mapped into a configuremodels.VLANIPConfig, validated with the shared ValidateVLANIPConfig, applied live via applyL3Local, and persisted into the ifupdown fragment (a dummy is often created for a stable IP that must survive reboot). Mode nil or “” means manual (L2-only), same semantics as a VLAN create.
mtu (integer)
name (string) – (required)
- Status Codes:
200 OK – OK
400 Bad Request – Bad Request
409 Conflict – Conflict
500 Internal Server Error – Internal Server Error
- GET /network/config/interfaces/{name}
Get network interface status
Retrieves the status of a specific network interface
- Parameters:
name (string) – Interface name
- Status Codes:
200 OK – Interface status successfully retrieved
404 Not Found – Interface not found
500 Internal Server Error – Internal server error
- Response JSON Object:
address_cidr (string)
admin_state (string)
alias (string)
allmulticast (boolean)
autoneg (boolean) – nil = could not read (unknown); tri-state so the UI never shows a guessed value
carrier (boolean)
current_speed (integer) – Enriched fields — populated ON DEMAND by EnrichInterfaceDetail in the HTTP detail handler path only (network/handlers/monitoring.go), NOT by the light GetInterfaceStatus the 60s poller calls per interface. The detail page and Edit panel show the LIVE value next to each editable control. Best-effort: a NIC without ethtool support (e.g. a dummy) leaves speed/ring/duplex zero, Autoneg nil, and Offloads nil, which the UI treats as “state unknown” (toggles disabled) rather than lying that it is off.
dns[] (string)
duplex (string) – “half” | “full” | “” (unknown), ethtool link settings
flags[] (string)
gateway (string)
index (integer)
ip_addresses[] (string)
mac_address (string)
master (string)
max_mtu (integer) – MaxMTU is the NIC’s hardware MTU ceiling (sysfs max_mtu), so the Edit panel can bound the MTU field. 0/absent when the kernel doesn’t expose it.
max_speed (integer)
mode (string) – Declared L3 config parsed from this interface’s karios-owned interfaces.d/<name>.cfg fragment (via ReadInterfaceDeclared), so the Edit panel can prefill the IP form with what will actually persist across a reboot — distinct from IPAddresses, which are the live kernel addresses. Empty when no fragment declares an L3 config. Enriched on demand alongside the ethtool fields above.
mtu (integer)
name (string)
offloads (object)
offloads_fixed (object) – OffloadsFixed carries an entry (always true) for every offload key the driver reports [fixed] in ethtool -k - not user-settable on this hardware, distinct from merely being off. A key’s ABSENCE means settable; only fixed keys are listed, so the UI greys out exactly the toggles that would otherwise fail with “Could not change any device features” (checkOffloadSettable enforces this same fact server-side - interface_lifecycle.go). Populated from the SAME ethtool -k read as Offloads (getInterfaceOffloadState, dashboard.go) - no extra exec.
oper_state (string)
ownership (string) – system|user|available|quarantine — see netconstants.Bucket*
perm_hw_addr (string)
promiscuous (boolean)
raw_flags (integer)
ring_rx_current (integer)
ring_rx_max (integer)
ring_tx_current (integer)
ring_tx_max (integer)
stats.collisions (integer)
stats.multicast (integer)
stats.rx_bytes (integer)
stats.rx_compressed (integer)
stats.rx_crc_errors (integer)
stats.rx_dropped (integer)
stats.rx_errors (integer)
stats.rx_fifo_errors (integer)
stats.rx_frame_errors (integer)
stats.rx_length_errors (integer)
stats.rx_missed_errors (integer)
stats.rx_over_errors (integer)
stats.rx_packets (integer)
stats.tx_aborted_errors (integer)
stats.tx_bytes (integer)
stats.tx_carrier_errors (integer)
stats.tx_compressed (integer)
stats.tx_dropped (integer)
stats.tx_errors (integer)
stats.tx_fifo_errors (integer)
stats.tx_heartbeat_errors (integer)
stats.tx_packets (integer)
stats.tx_window_errors (integer)
suggested_test_target (string) – SuggestedTestTarget is the IP the connectivity-safety gate WOULD DF-ping to verify a breaking change on this interface (the gateway reachable via this interface, else the node default gateway). The Edit panel prefills its “test target” field with it so an operator can accept or override the probe destination. Best-effort; empty when no target resolves. Enriched on demand alongside the ethtool/L3 fields above.
traffic_role (string) – public|guest|management|”” - CS traffic-type via agent.properties
tx_queue_len (integer)
type (string)
- PUT /network/config/interfaces/{name}
Update an interface
Applies an admin-state/MTU/flag change on an existing interface synchronously
- Parameters:
name (string) – Interface name
- Request JSON Object:
address_cidr (string)
admin_state (string) – “up” | “down”
allmulticast (boolean)
autoneg (boolean) – autonegotiation on/off
confirm (boolean) – Confirm must be true to proceed when the interface is enslaved to a bridge (ErrConfirmMissing / 409) — protects against an operator accidentally disabling/re-MTU-ing a live bridge member.
dns[] (string)
duplex (string) – “half” | “full”
gateway (string)
mac_address (string) – MACAddress — netlink LinkSetHardwareAddr (unicast only).
mode (string) – IP config — mapped into a configuremodels.VLANIPConfig and applied via the shared L3 helper. Mode nil or “” leaves the interface’s IP unchanged (same semantics as a VLAN update); a set Mode replaces it.
mtu (integer)
offloads (object) – Offloads — ethtool -K short keys (constants.SettableOffloadKeys) -> on/off.
promiscuous (boolean)
qos (any) – QoS — nil leaves the device’s QoS profile unchanged, same semantics as every other optional field above. Validated (utils.ValidateQoSSpec) but not yet applied — see QoSSpec’s doc comment.
ring_rx (integer) – Ring buffers — ethtool -G <dev> rx N tx M.
ring_tx (integer)
speed (integer) – Link parameters — applied together via ethtool -s.
test_target (string) – TestTarget overrides the IP the connectivity-safety gate DF-pings when it verifies a breaking change (see network/utils/interface_safety.go). When set it MUST parse as a valid IP (else 400); when empty the gate resolves the gateway reachable VIA this interface, else the node default gateway. It lets an operator point the probe at a known-good far-end when the auto-resolved target is wrong for the interface under test (e.g. an off-path NIC whose reachable peer is not the default gateway).
tx_queue_len (integer) – TxQueueLen — netlink LinkSetTxQLen.
- Status Codes:
200 OK – OK
400 Bad Request – Bad Request
404 Not Found – Not Found
409 Conflict – Conflict
500 Internal Server Error – Internal Server Error
- POST /network/config/interfaces/{name}/connectivity-test
Test connectivity for a proposed interface change
Dry-runs the connectivity-safety gate for a proposed MTU change (applies it, egress-bound DF-probes, then reverts) and reports pass/fail WITHOUT committing - the UI’s “Test” button.
- Parameters:
name (string) – Interface name
- Request JSON Object:
address_cidr (string)
admin_state (string) – “up” | “down”
allmulticast (boolean)
autoneg (boolean) – autonegotiation on/off
confirm (boolean) – Confirm must be true to proceed when the interface is enslaved to a bridge (ErrConfirmMissing / 409) — protects against an operator accidentally disabling/re-MTU-ing a live bridge member.
dns[] (string)
duplex (string) – “half” | “full”
gateway (string)
mac_address (string) – MACAddress — netlink LinkSetHardwareAddr (unicast only).
mode (string) – IP config — mapped into a configuremodels.VLANIPConfig and applied via the shared L3 helper. Mode nil or “” leaves the interface’s IP unchanged (same semantics as a VLAN update); a set Mode replaces it.
mtu (integer)
offloads (object) – Offloads — ethtool -K short keys (constants.SettableOffloadKeys) -> on/off.
promiscuous (boolean)
qos (any) – QoS — nil leaves the device’s QoS profile unchanged, same semantics as every other optional field above. Validated (utils.ValidateQoSSpec) but not yet applied — see QoSSpec’s doc comment.
ring_rx (integer) – Ring buffers — ethtool -G <dev> rx N tx M.
ring_tx (integer)
speed (integer) – Link parameters — applied together via ethtool -s.
test_target (string) – TestTarget overrides the IP the connectivity-safety gate DF-pings when it verifies a breaking change (see network/utils/interface_safety.go). When set it MUST parse as a valid IP (else 400); when empty the gate resolves the gateway reachable VIA this interface, else the node default gateway. It lets an operator point the probe at a known-good far-end when the auto-resolved target is wrong for the interface under test (e.g. an off-path NIC whose reachable peer is not the default gateway).
tx_queue_len (integer) – TxQueueLen — netlink LinkSetTxQLen.
- Status Codes:
200 OK – OK
400 Bad Request – Bad Request
500 Internal Server Error – Internal Server Error
- Response JSON Object:
egress (string)
message (string)
mtu (integer)
passed (boolean)
target (string)
tested (boolean)
- GET /network/config/interfaces/{name}/qos
Get QoS state for a network interface
Retrieves the live qdisc/class/filter tree for a physical NIC or virtual interface
- Parameters:
name (string) – Interface name
- Status Codes:
200 OK – QoS state successfully retrieved
404 Not Found – Interface not found
500 Internal Server Error – Internal server error
- Response JSON Object:
cake (any) – Cake carries CAKE’s full config + per-tin runtime stats, decoded directly from raw netlink attributes (see qos_cake_read.go — the vendored netlink library has no typed Cake qdisc and drops TCA_STATS_APP for every qdisc kind, so this is not reachable through Qdiscs above). Populated only when RootQdisc == “cake”; nil otherwise.
classes[].backlog (integer)
classes[].bytes (integer)
classes[].ceil_bytes_per_sec (integer)
classes[].class_id (string)
classes[].drops (integer)
classes[].overlimits (integer)
classes[].packets (integer)
classes[].parent (string)
classes[].prio (integer)
classes[].qlen (integer)
classes[].rate_bytes_per_sec (integer)
classes[].requeues (integer)
classes[].type (string)
device (string)
device_class (string) – bridge|virtual|nic
effective_device (string) – A Linux bridge never carries the egress shaper itself — a CAKE/HTB shaper lives on its enslaved physical UPLINK (the device the golden karios-cake-egress script and apply_qos_step target), not on the bridge. So a bare read of a bridge reports Profile “none” while its uplink is shaped. For a bridge, EffectiveDevice names that uplink and EffectiveQoS carries the uplink’s full QoS (incl. CAKE detail), so a consumer can show the REAL policy instead of a misleading “none”. Both empty/nil for non-bridges and for a bridge with no physical uplink yet (collapsed/flat).
effective_qos (object) – Self-referencing ‘utils.DeviceQoSInfo’ child — recursion broken so the docs renderer (sphinxcontrib-openapi) does not infinite-loop. See raw spec for full self-referential type.
filters[].parent (string)
filters[].priority (integer)
filters[].type (string)
profile (string) – Profile is the best-effort match against the named profile catalogue (QoSProfile* constants above), or QoSProfileUnmanaged if the live tree shape matches none of them. Never rounded to the nearest known profile.
qdiscs[].backlog (integer)
qdiscs[].bytes (integer)
qdiscs[].drops (integer)
qdiscs[].handle (string)
qdiscs[].overlimits (integer)
qdiscs[].packets (integer)
qdiscs[].parent (string)
qdiscs[].qlen (integer)
qdiscs[].requeues (integer)
qdiscs[].type (string)
root_handle (string)
root_qdisc (string) – kind of the root qdisc, e.g. “mq”, “htb”, “fq_codel”, “noqueue”
- GET /network/config/vlan-interfaces
List VLAN sub-interfaces
Retrieves all 802.1Q VLAN sub-interfaces on the host with health classification
- Status Codes:
200 OK – List of VLAN sub-ifaces + metrics
500 Internal Server Error – Internal server error
- Response JSON Object:
count (integer)
metrics.configured_not_present (integer)
metrics.degraded_mtu_exceeds_parent (integer)
metrics.degraded_no_carrier (integer)
metrics.down (integer)
metrics.healthy (integer)
metrics.total (integer)
vlan_interfaces[].address_cidr (string) – static
vlan_interfaces[].admin_state (string)
vlan_interfaces[].carrier (boolean)
vlan_interfaces[].configured_only (boolean) – cfg fragment exists but kernel device is absent
vlan_interfaces[].dns[] (string)
vlan_interfaces[].gateway (string) – static
vlan_interfaces[].health (string) – healthy|degraded_no_carrier|degraded_mtu_exceeds_parent|down|configured_not_present
vlan_interfaces[].ip_addresses[] (string)
vlan_interfaces[].mac_address (string)
vlan_interfaces[].master_bridge (string) – “cloudbr1” if enslaved
vlan_interfaces[].mode (string) – Declared L3 config, parsed from the KARIOS-VLAN cfg (managed interfaces only; empty for unmanaged/platform). This is the INTENT (mode + declared address/gateway/DNS) — distinct from IPAddresses, which is the live kernel state. The UI edits against these.
vlan_interfaces[].mtu (integer)
vlan_interfaces[].name (string) – “bond0.2005”
vlan_interfaces[].offloads (object)
vlan_interfaces[].oper_state (string)
vlan_interfaces[].ownership (string) – user|platform|unmanaged — see netconstants.VLANOwnership*
vlan_interfaces[].parent (string) – “bond0” | “eth4”
vlan_interfaces[].parent_mtu (integer)
vlan_interfaces[].suggested_test_target (string) – SuggestedTestTarget is the IP the connectivity-safety gate WOULD DF-ping to verify a breaking change on this VLAN sub-interface (the gateway reachable via it, else the node default gateway). The Edit panel prefills its test target field with it. Best-effort; populated on the single-interface detail read (GetVLANInterfaceStatus) only, empty when none resolves.
vlan_interfaces[].vlan_tag (integer) – 2005
- POST /network/config/vlan-interfaces
Create VLAN sub-interface
- Request JSON Object:
address_cidr (string) – static only, e.g. “10.20.0.5/24”
dns[] (string)
gateway (string) – static only, optional
mode (string) – L3 configuration. Mode “” or “manual” = L2-only (default, prior behavior). “static” requires AddressCIDR; Gateway/DNS optional. “dhcp” takes no address fields — the server provides them.
mtu (integer) – 0 = inherit parent MTU
parent (string) – (required)
vlan_id (integer) – (required)
- Status Codes:
200 OK – created
400 Bad Request – validation error
409 Conflict – already exists / IP in use
421 Misdirected Request – misdirected: X-Destination-Node names another node
- GET /network/config/vlan-interfaces/{name}
Get VLAN sub-interface status
Retrieves detailed state for one VLAN sub-iface incl. parent + master bridge
- Parameters:
name (string) – VLAN iface name (e.g. bond0.2005)
- Status Codes:
200 OK – OK
404 Not Found – VLAN interface not found
- Response JSON Object:
address_cidr (string) – static
admin_state (string)
carrier (boolean)
configured_only (boolean) – cfg fragment exists but kernel device is absent
dns[] (string)
gateway (string) – static
health (string) – healthy|degraded_no_carrier|degraded_mtu_exceeds_parent|down|configured_not_present
index (integer)
ip_addresses[] (string)
mac_address (string)
master_bridge (string) – “cloudbr1” if enslaved
mode (string) – Declared L3 config, parsed from the KARIOS-VLAN cfg (managed interfaces only; empty for unmanaged/platform). This is the INTENT (mode + declared address/gateway/DNS) — distinct from IPAddresses, which is the live kernel state. The UI edits against these.
mtu (integer)
name (string) – “bond0.2005”
offloads (object)
oper_state (string)
ownership (string) – user|platform|unmanaged — see netconstants.VLANOwnership*
parent (string) – “bond0” | “eth4”
parent_mtu (integer)
stats.collisions (integer)
stats.multicast (integer)
stats.rx_bytes (integer)
stats.rx_compressed (integer)
stats.rx_crc_errors (integer)
stats.rx_dropped (integer)
stats.rx_errors (integer)
stats.rx_fifo_errors (integer)
stats.rx_frame_errors (integer)
stats.rx_length_errors (integer)
stats.rx_missed_errors (integer)
stats.rx_over_errors (integer)
stats.rx_packets (integer)
stats.tx_aborted_errors (integer)
stats.tx_bytes (integer)
stats.tx_carrier_errors (integer)
stats.tx_compressed (integer)
stats.tx_dropped (integer)
stats.tx_errors (integer)
stats.tx_fifo_errors (integer)
stats.tx_heartbeat_errors (integer)
stats.tx_packets (integer)
stats.tx_window_errors (integer)
suggested_test_target (string) – SuggestedTestTarget is the IP the connectivity-safety gate WOULD DF-ping to verify a breaking change on this VLAN sub-interface (the gateway reachable via it, else the node default gateway). The Edit panel prefills its test target field with it. Best-effort; populated on the single-interface detail read (GetVLANInterfaceStatus) only, empty when none resolves.
vlan_tag (integer) – 2005
- PUT /network/config/vlan-interfaces/{name}
Update VLAN sub-interface
- Parameters:
name (string) – VLAN sub-interface name (<parent>.<vid>)
- Request JSON Object:
address_cidr (string)
admin_state (string) – “up” | “down” | “” (leave unchanged)
dns[] (string)
gateway (string)
mode (string) – “” leaves IP unchanged; manual|static|dhcp changes it
mtu (integer)
offloads (object)
qos (any) – QoS — nil leaves the sub-interface’s QoS profile unchanged. See QoSSpec’s doc comment on InterfaceUpdateRequest for the shared-struct rationale.
test_target (string) – TestTarget overrides the IP the connectivity-safety gate DF-pings when it verifies a breaking change (MTU / admin-down / IP) on a management-path VLAN sub-interface. Must parse as an IP (else 400); empty lets the gate resolve the gateway reachable via this interface, then the node default gateway. Mirrors InterfaceUpdateRequest.TestTarget.
- Status Codes:
200 OK – updated
400 Bad Request – validation error
409 Conflict – platform-owned / IP in use
- GET /network/config/vlan-interfaces/{name}/qos
Get QoS state for a VLAN sub-interface
Retrieves the live qdisc/class/filter tree for a VLAN sub-interface
- Parameters:
name (string) – VLAN iface name (e.g. bond0.2005)
- Status Codes:
200 OK – QoS state successfully retrieved
404 Not Found – VLAN interface not found
500 Internal Server Error – Internal server error
- Response JSON Object:
cake (any) – Cake carries CAKE’s full config + per-tin runtime stats, decoded directly from raw netlink attributes (see qos_cake_read.go — the vendored netlink library has no typed Cake qdisc and drops TCA_STATS_APP for every qdisc kind, so this is not reachable through Qdiscs above). Populated only when RootQdisc == “cake”; nil otherwise.
classes[].backlog (integer)
classes[].bytes (integer)
classes[].ceil_bytes_per_sec (integer)
classes[].class_id (string)
classes[].drops (integer)
classes[].overlimits (integer)
classes[].packets (integer)
classes[].parent (string)
classes[].prio (integer)
classes[].qlen (integer)
classes[].rate_bytes_per_sec (integer)
classes[].requeues (integer)
classes[].type (string)
device (string)
device_class (string) – bridge|virtual|nic
effective_device (string) – A Linux bridge never carries the egress shaper itself — a CAKE/HTB shaper lives on its enslaved physical UPLINK (the device the golden karios-cake-egress script and apply_qos_step target), not on the bridge. So a bare read of a bridge reports Profile “none” while its uplink is shaped. For a bridge, EffectiveDevice names that uplink and EffectiveQoS carries the uplink’s full QoS (incl. CAKE detail), so a consumer can show the REAL policy instead of a misleading “none”. Both empty/nil for non-bridges and for a bridge with no physical uplink yet (collapsed/flat).
effective_qos (object) – Self-referencing ‘utils.DeviceQoSInfo’ child — recursion broken so the docs renderer (sphinxcontrib-openapi) does not infinite-loop. See raw spec for full self-referential type.
filters[].parent (string)
filters[].priority (integer)
filters[].type (string)
profile (string) – Profile is the best-effort match against the named profile catalogue (QoSProfile* constants above), or QoSProfileUnmanaged if the live tree shape matches none of them. Never rounded to the nearest known profile.
qdiscs[].backlog (integer)
qdiscs[].bytes (integer)
qdiscs[].drops (integer)
qdiscs[].handle (string)
qdiscs[].overlimits (integer)
qdiscs[].packets (integer)
qdiscs[].parent (string)
qdiscs[].qlen (integer)
qdiscs[].requeues (integer)
qdiscs[].type (string)
root_handle (string)
root_qdisc (string) – kind of the root qdisc, e.g. “mq”, “htb”, “fq_codel”, “noqueue”