Files
Joachim Wiberg 7fa141178f cli: layered show interface, IEEE 802.3.2-2025 ethernet model
Import ieee802-ethernet-interface@2025-09-10.yang, from IEEE 802.3.2-2025,
and companion ieee802-ethernet-phy-type.yang, replacing the 2019 revision.
Operational interface speed moves to ietf-interfaces:speed, RFC 8343,
eth:speed is now obsolete.  Bump infix-interfaces.yang revision to track
the upgrade.

The CLI 'show interface' command renders interfaces as bottom-up layered
protocol rows.  Ethernet interfaces a new IEEE link-mode row (1000baseT,
10GbaseLR, ...) is added with 'duplex: full|half' in the DATA column.
Without link the ethernet row is the first row.  Tunnels and wifi follow
the same layering: gre/vxlan rows carry remote:/vni: tokens with optional
ethernet sub-row for the L2-bearing variants; wifi rows carry 'station' or
'access-point' ssid:, signal:, stations: tokens.

admin@bpi-76-8f-c2:/> show interface
⚑ INTERFACE   PROTOCOL      STATE       DATA
⇅ lo          loopback      UP
              ipv4                      127.0.0.1/8 (static)
              ipv6                      ::1/128 (static)
⇅ br0         bridge        DOWN
  │           ethernet                  32:2e:3f:76:8f:c2
  │           ipv4                      192.168.0.1/24 (static)
⇅ ├ lan0      bridge        LOWER-DOWN
⇅ ├ lan1      bridge        LOWER-DOWN
⇅ ├ lan2      bridge        LOWER-DOWN
⇅ └ lan3      bridge        LOWER-DOWN
⇅ gre0        gre           UP          remote: 198.51.100.7
              ipv4                      10.255.0.1/30 (static)
⇅ sfp1        ethernet      DOWN        ca:59:f0:77:80:5b
⇅ wan         1000baseT     UP          duplex: full
              ethernet                  32:2e:3f:76:8f:c2
              ipv4                      192.168.0.235/24 (dhcp)
              ipv6                      fe80::302e:3fff:fe76:8fc2/64 (link-layer)
⇅ wan.10      vlan          UP          vid: 10
  │           ipv4                      10.0.10.1/24 (static)
  └ wan
⇅ wan.10.20   vlan          UP          vid: 20
  │           ipv4                      10.0.10.20/28 (static)
  └ wan.10
⇅ wifi0       wifi          UP          station ssid: corp-net signal: good
              ethernet                  dc:a6:32:00:11:22
              ipv4                      192.168.7.42/24 (dhcp)

yanger populates phy-type and pmd-type from a static ETHTOOL link-mode
identity table keyed on (port, speed, duplex).  Both leaves are populated
for unambiguous media (copper, DAC, copper-T); for generic fiber where
the (port, speed, duplex) tuple can map to multiple PMDs (SR vs LR vs
ER, etc.) only the phy-type family identity is emitted — guessing the
PMD would be misleading.  cli_pretty prefers pmd-type (specific) and
falls back to phy-type (family) for display.

yanger also emits ietf-interfaces:speed and fixes a long-standing
'auto-negotation' typo (yanger had never matched ethtool's correctly-
spelled JSON field, so operational auto-negotiation always read
'unknown').

Filling the WG's gap on fixed-speed config
------------------------------------------

IEEE Std 802.3.2-2025 obsoleted the eth:speed leaf without providing a
config-true replacement; the standards-correct way to express what
older Infix configurations called 'fixed speed' is to restrict the set
of PMDs auto-negotiation may advertise.  Augment auto-negotiation with
two leaf-lists:

  auto-negotiation/advertised-pmd-types  config-true,  leaf-list of pmd-type
  ethernet/supported-pmd-types           config-false, leaf-list of pmd-type

Pinning a port to a single mode is now expressed as a single-entry
advertised-pmd-types list.  The kernel-supported set is exposed as
operational state for diagnosis — SFP/SFP+ cages report the inserted
module's capabilities, narrowing the list to a single PMD when the
optic only supports one mode (as suggested by @wkz in PR review).
When the supported list collapses to a single entry, yanger uses it
to refine the operational pmd-type leaf — more accurate than the
(port, speed, duplex) lookup for fiber.

confd C apply path (src/confd/src/ieee802-ethernet-interface.c)
translates each advertised pmd-type identity to the corresponding
ETHTOOL_LINK_MODE_*_BIT_*, ORs them into a mask, and emits
'ethtool --change <if> autoneg on advertise 0x<mask>'.  An empty
list keeps the historical default of advertising every supported
mode.  The (legacy) 'auto-negotiation/enable = false' + speed/duplex
branch is removed — it has no model representation any more.

cli_pretty's detail view gains 'advertised' and 'supported' rows
listing the PMDs in each set.  A new _pr_label_list() helper unifies
multi-row rendering across these new rows and the pre-existing
ipv4/ipv6 address rows.

The detailed interface view also gains a 'link mode' row carrying the
pmd-type / phy-type-derived label.

Migration of existing startup configurations
--------------------------------------------

Bump confd version 1.8 → 1.9 to trigger the migration on upgrade.
share/migrate/1.9/10-ethernet-advertise.sh translates old configs of
the form

  ethernet { auto-negotiation { enable false; } speed S; duplex D; }

into

  ethernet { auto-negotiation { advertised-pmd-types [PMD]; } duplex D; }

mapping (S, D) → PMD via a static lookup covering the copper-T speeds
the deprecated speed leaf historically supported (10/100/1000/2.5G/
5G/10G).  Interfaces that don't disable auto-negotiation, or that
lack a speed leaf, are passed through untouched.

Closes #530
Closes #805

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2026-05-27 20:53:29 +02:00

1246 lines
35 KiB
JSON

{
"ietf-interfaces:interfaces": {
"interface": [
{
"admin-status": "up",
"ietf-ip:ipv4": {
"address": [
{
"ip": "127.0.0.1",
"origin": "static",
"prefix-length": 8
}
]
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "::1",
"origin": "static",
"prefix-length": 128
}
],
"mtu": 65536
},
"if-index": 1,
"name": "lo",
"oper-status": "up",
"phys-address": "00:00:00:00:00:00",
"statistics": {
"in-octets": "29943",
"out-octets": "29943"
},
"type": "infix-if-type:loopback"
},
{
"admin-status": "up",
"ieee802-ethernet-interface:ethernet": {
"auto-negotiation": {
"enable": false
}
},
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "fe80::2a0:85ff:fe00:301",
"origin": "link-layer",
"prefix-length": 64
}
],
"mtu": 1500
},
"if-index": 2,
"name": "e1",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:01",
"statistics": {
"in-octets": "274021",
"out-octets": "2236951"
},
"type": "infix-if-type:ethernet"
},
{
"admin-status": "up",
"ieee802-ethernet-interface:ethernet": {
"auto-negotiation": {
"enable": false
}
},
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "fe80::2a0:85ff:fe00:302",
"origin": "link-layer",
"prefix-length": 64
}
],
"mtu": 1500
},
"if-index": 3,
"name": "e2",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:02",
"statistics": {
"in-octets": "2050",
"out-octets": "72419"
},
"type": "infix-if-type:ethernet"
},
{
"admin-status": "up",
"ieee802-ethernet-interface:ethernet": {
"auto-negotiation": {
"enable": false
}
},
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 4,
"infix-interfaces:bridge-port": {
"bridge": "br0",
"flood": {
"broadcast": true,
"multicast": true,
"unicast": true
},
"multicast": {
"fast-leave": false,
"router": "auto"
},
"pvid": 1,
"stp": {
"cist": {
"state": "forwarding"
}
}
},
"name": "e3",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:03",
"statistics": {
"in-octets": "13502",
"out-octets": "117434"
},
"type": "infix-if-type:ethernet"
},
{
"admin-status": "up",
"ieee802-ethernet-interface:ethernet": {
"auto-negotiation": {
"enable": false
}
},
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 5,
"infix-interfaces:bridge-port": {
"bridge": "br0",
"flood": {
"broadcast": true,
"multicast": true,
"unicast": true
},
"multicast": {
"fast-leave": false,
"router": "auto"
},
"pvid": 1,
"stp": {
"cist": {
"state": "forwarding"
}
}
},
"name": "e4",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:04",
"statistics": {
"in-octets": "11449",
"out-octets": "113004"
},
"type": "infix-if-type:ethernet"
},
{
"admin-status": "up",
"ieee802-ethernet-interface:ethernet": {
"auto-negotiation": {
"enable": false
}
},
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "fe80::2a0:85ff:fe00:305",
"origin": "link-layer",
"prefix-length": 64
}
],
"mtu": 1500
},
"if-index": 6,
"name": "e5",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:05",
"statistics": {
"in-octets": "31213",
"out-octets": "34316"
},
"type": "infix-if-type:ethernet"
},
{
"admin-status": "up",
"ieee802-ethernet-interface:ethernet": {
"auto-negotiation": {
"enable": false
}
},
"ietf-ip:ipv4": {
"address": [
{
"ip": "10.1.1.101",
"origin": "static",
"prefix-length": 24
}
],
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "fe80::2a0:85ff:fe00:306",
"origin": "link-layer",
"prefix-length": 64
}
],
"mtu": 1500
},
"if-index": 7,
"name": "e6",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:06",
"statistics": {
"in-octets": "48652",
"out-octets": "60687"
},
"type": "infix-if-type:ethernet"
},
{
"admin-status": "up",
"ieee802-ethernet-interface:ethernet": {
"auto-negotiation": {
"enable": false
}
},
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "fe80::2a0:85ff:fe00:307",
"origin": "link-layer",
"prefix-length": 64
}
],
"mtu": 1500
},
"if-index": 8,
"name": "e7",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:07",
"statistics": {
"in-octets": "31741",
"out-octets": "34279"
},
"type": "infix-if-type:ethernet"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"if-index": 11,
"infix-interfaces:bridge-port": {
"bridge": "br0",
"flood": {
"broadcast": true,
"multicast": true,
"unicast": true
},
"multicast": {
"fast-leave": false,
"router": "auto"
},
"pvid": 1,
"stp": {
"cist": {
"state": "forwarding"
}
}
},
"name": "veth0b",
"oper-status": "up",
"phys-address": "e6:19:75:86:80:dd",
"statistics": {
"in-octets": "2013",
"out-octets": "34341"
},
"type": "infix-if-type:veth"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"if-index": 13,
"infix-interfaces:bridge-port": {
"bridge": "br0",
"flood": {
"broadcast": true,
"multicast": true,
"unicast": true
},
"multicast": {
"fast-leave": false,
"router": "auto"
},
"pvid": 1,
"stp": {
"cist": {
"state": "forwarding"
}
}
},
"name": "veth2b",
"oper-status": "up",
"phys-address": "b2:fa:30:63:98:f0",
"statistics": {
"in-octets": "266",
"out-octets": "37752"
},
"type": "infix-if-type:veth"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"address": [
{
"ip": "169.254.1.1",
"origin": "random",
"prefix-length": 16
}
],
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "fe80::2a0:85ff:fe00:300",
"origin": "link-layer",
"prefix-length": 64
}
]
},
"if-index": 14,
"infix-interfaces:bridge": {
"vlans": {
"proto": "ieee802-dot1q-types:c-vlan",
"vlan": [
{
"multicast": {
"querier": "off",
"snooping": true
},
"multicast-filters": {
"multicast-filter": []
},
"tagged": [],
"untagged": [
"br0",
"e3",
"e4",
"veth0b",
"veth2b"
],
"vid": 1
}
]
}
},
"infix-interfaces:bridge-port": {
"pvid": 1
},
"name": "br0",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:00",
"statistics": {
"in-octets": "3213",
"out-octets": "38442"
},
"type": "infix-if-type:bridge"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"if-index": 16,
"infix-interfaces:bridge-port": {
"bridge": "br1",
"flood": {
"broadcast": true,
"multicast": true,
"unicast": true
},
"multicast": {
"fast-leave": false,
"router": "auto"
},
"pvid": 6,
"stp": {
"cist": {
"state": "forwarding"
}
}
},
"name": "veth1b",
"oper-status": "up",
"phys-address": "3e:67:0f:15:24:14",
"statistics": {
"in-octets": "726",
"out-octets": "812"
},
"type": "infix-if-type:veth"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"if-index": 18,
"infix-interfaces:bridge-port": {
"bridge": "br1",
"flood": {
"broadcast": true,
"multicast": true,
"unicast": true
},
"multicast": {
"fast-leave": false,
"router": "auto"
},
"stp": {
"cist": {
"state": "forwarding"
}
}
},
"name": "veth3b",
"oper-status": "up",
"phys-address": "b2:1c:fa:a7:45:eb",
"statistics": {
"in-octets": "726",
"out-octets": "512"
},
"type": "infix-if-type:veth"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"if-index": 19,
"infix-interfaces:bridge": {
"vlans": {
"proto": "ieee802-dot1q-types:c-vlan",
"vlan": [
{
"multicast": {
"querier": "off",
"snooping": true
},
"multicast-filters": {
"multicast-filter": []
},
"tagged": [],
"untagged": [
"veth1b"
],
"vid": 6
}
]
}
},
"name": "br1",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:00",
"statistics": {
"in-octets": "600"
},
"type": "infix-if-type:bridge"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"address": [
{
"ip": "10.1.1.1",
"origin": "static",
"prefix-length": 32
}
],
"mtu": 1500
},
"if-index": 20,
"infix-interfaces:vlan": {
"id": 8,
"lower-layer-if": "e3",
"tag-type": "ieee802-dot1q-types:c-vlan"
},
"name": "e3.8",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:03",
"statistics": {
"in-octets": "10654",
"out-octets": "14688"
},
"type": "infix-if-type:vlan"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"address": [
{
"ip": "10.1.1.1",
"origin": "static",
"prefix-length": 32
}
],
"mtu": 1500
},
"if-index": 21,
"infix-interfaces:vlan": {
"id": 8,
"lower-layer-if": "e4",
"tag-type": "ieee802-dot1q-types:c-vlan"
},
"name": "e4.8",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:04",
"statistics": {
"in-octets": "8835",
"out-octets": "15085"
},
"type": "infix-if-type:vlan"
},
{
"admin-status": "up",
"description": "eth0",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "fe80::4a0:85ff:fe00:300",
"origin": "link-layer",
"prefix-length": 64
}
]
},
"if-index": 12,
"infix-interfaces:container-network": {
"containers": [
"container-B"
]
},
"name": "veth2a",
"oper-status": "up",
"phys-address": "06:a0:85:00:03:00",
"statistics": {
"in-octets": "38078",
"out-octets": "266"
},
"type": "infix-if-type:veth"
},
{
"admin-status": "up",
"description": "eth1",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "fe80::4a0:85ff:fe00:300",
"origin": "link-layer",
"prefix-length": 64
}
]
},
"if-index": 17,
"infix-interfaces:container-network": {
"containers": [
"container-B"
]
},
"name": "veth3a",
"oper-status": "up",
"phys-address": "06:a0:85:00:03:00",
"statistics": {
"in-octets": "768",
"out-octets": "726"
},
"type": "infix-if-type:veth"
},
{
"admin-status": "up",
"description": "br0",
"ietf-ip:ipv4": {
"address": [
{
"ip": "169.254.1.2",
"origin": "other",
"prefix-length": 16
}
],
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "fe80::4a0:85ff:fe00:300",
"origin": "link-layer",
"prefix-length": 64
}
]
},
"if-index": 10,
"infix-interfaces:container-network": {
"containers": [
"container-A"
]
},
"name": "veth0a",
"oper-status": "up",
"phys-address": "06:a0:85:00:03:00",
"statistics": {
"in-octets": "35483",
"out-octets": "2013"
},
"type": "infix-if-type:veth"
},
{
"admin-status": "up",
"description": "br1",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "fe80::4a0:85ff:fe00:300",
"origin": "link-layer",
"prefix-length": 64
}
]
},
"if-index": 15,
"infix-interfaces:container-network": {
"containers": [
"container-A"
]
},
"name": "veth1a",
"oper-status": "up",
"phys-address": "06:a0:85:00:03:00",
"statistics": {
"in-octets": "812",
"out-octets": "726"
},
"type": "infix-if-type:veth"
}
]
},
"ietf-routing:routing": {
"control-plane-protocols": {
"control-plane-protocol": [
{
"ietf-ospf:ospf": {
"ietf-ospf:address-family": "ipv4",
"ietf-ospf:areas": {
"ietf-ospf:area": [
{
"ietf-ospf:area-id": "0.0.0.1",
"ietf-ospf:area-type": "nssa-area",
"ietf-ospf:interfaces": {
"ietf-ospf:interface": [
{
"cost": 1,
"dead-interval": 40,
"enabled": true,
"hello-interval": 10,
"hello-timer": 2,
"ietf-ospf:neighbors": {
"ietf-ospf:neighbor": [
{
"address": "10.1.2.1",
"dead-timer": 22,
"infix-routing:interface-name": "e3.8:10.1.1.1",
"infix-routing:role": "DROther",
"infix-routing:uptime": 57,
"neighbor-router-id": "10.1.2.1",
"priority": 1,
"state": "full"
}
]
},
"interface-type": "point-to-point",
"name": "e3.8",
"passive": false,
"priority": 1,
"retransmit-interval": 5,
"state": "point-to-point",
"transmit-delay": 1,
"wait-timer": 40
},
{
"cost": 1,
"dead-interval": 40,
"enabled": true,
"hello-interval": 10,
"hello-timer": 2,
"ietf-ospf:neighbors": {
"ietf-ospf:neighbor": [
{
"address": "10.1.3.1",
"dead-timer": 22,
"infix-routing:interface-name": "e4.8:10.1.1.1",
"infix-routing:role": "DROther",
"infix-routing:uptime": 57,
"neighbor-router-id": "10.1.3.1",
"priority": 1,
"state": "full"
}
]
},
"interface-type": "point-to-point",
"name": "e4.8",
"passive": false,
"priority": 1,
"retransmit-interval": 5,
"state": "point-to-point",
"transmit-delay": 1,
"wait-timer": 40
},
{
"bdr-ip-addr": "10.1.1.101",
"bdr-router-id": "10.1.1.1",
"cost": 1,
"dead-interval": 40,
"dr-ip-addr": "10.1.1.100",
"dr-router-id": "192.168.100.1",
"enabled": true,
"hello-interval": 10,
"hello-timer": 2,
"ietf-ospf:neighbors": {
"ietf-ospf:neighbor": [
{
"address": "10.1.1.100",
"bdr-router-id": "10.1.1.1",
"dead-timer": 31,
"dr-router-id": "192.168.100.1",
"infix-routing:interface-name": "e6:10.1.1.101",
"infix-routing:role": "DR",
"infix-routing:uptime": 23,
"neighbor-router-id": "192.168.100.1",
"priority": 1,
"state": "full"
}
]
},
"interface-type": "broadcast",
"name": "e6",
"passive": false,
"priority": 1,
"retransmit-interval": 5,
"state": "bdr",
"transmit-delay": 1,
"wait-timer": 40
}
]
}
}
]
},
"ietf-ospf:local-rib": {
"ietf-ospf:route": [
{
"infix-routing:area-id": "0.0.0.1",
"metric": 2,
"next-hops": {
"next-hop": [
{
"next-hop": "10.1.1.100"
}
]
},
"prefix": "0.0.0.0/0",
"route-type": "inter-area"
},
{
"infix-routing:area-id": "0.0.0.1",
"metric": 1,
"next-hops": {
"next-hop": [
{
"outgoing-interface": "e6"
}
]
},
"prefix": "10.1.1.0/24",
"route-type": "intra-area"
},
{
"infix-routing:area-id": "0.0.0.1",
"metric": 2,
"next-hops": {
"next-hop": [
{
"next-hop": "10.1.1.100"
},
{
"next-hop": "10.1.2.1"
}
]
},
"prefix": "10.1.2.0/24",
"route-type": "intra-area"
},
{
"infix-routing:area-id": "0.0.0.1",
"metric": 2,
"next-hops": {
"next-hop": [
{
"next-hop": "10.1.1.100"
},
{
"next-hop": "10.1.3.1"
}
]
},
"prefix": "10.1.3.0/24",
"route-type": "intra-area"
}
]
},
"ietf-ospf:router-id": "10.1.1.1"
},
"name": "default",
"type": "infix-routing:ospfv2"
}
]
},
"interfaces": {
"interface": []
},
"ribs": {
"rib": [
{
"address-family": "ipv4",
"name": "ipv4",
"routes": {
"route": [
{
"active": [
null
],
"ietf-ipv4-unicast-routing:destination-prefix": "0.0.0.0/0",
"ietf-ospf:metric": 2,
"last-updated": "2026-02-25T05:16:22+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"ietf-ipv4-unicast-routing:address": "10.1.1.100",
"infix-routing:installed": [
null
]
}
]
}
},
"route-preference": 110,
"source-protocol": "ietf-ospf:ospfv2"
},
{
"ietf-ipv4-unicast-routing:destination-prefix": "0.0.0.0/0",
"last-updated": "2026-02-25T05:15:42+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"outgoing-interface": "br0"
}
]
}
},
"route-preference": 254,
"source-protocol": "static"
},
{
"ietf-ipv4-unicast-routing:destination-prefix": "10.1.1.0/24",
"ietf-ospf:metric": 1,
"last-updated": "2026-02-25T05:15:28+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"outgoing-interface": "e6"
}
]
}
},
"route-preference": 110,
"source-protocol": "ietf-ospf:ospfv2"
},
{
"active": [
null
],
"ietf-ipv4-unicast-routing:destination-prefix": "10.1.1.0/24",
"last-updated": "2026-02-25T05:15:28+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"infix-routing:installed": [
null
],
"outgoing-interface": "e6"
}
]
}
},
"route-preference": 0,
"source-protocol": "direct"
},
{
"ietf-ipv4-unicast-routing:destination-prefix": "10.1.1.1/32",
"last-updated": "2026-02-25T05:15:27+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"infix-routing:installed": [
null
],
"outgoing-interface": "e4.8"
}
]
}
},
"route-preference": 0,
"source-protocol": "direct"
},
{
"active": [
null
],
"ietf-ipv4-unicast-routing:destination-prefix": "10.1.1.1/32",
"last-updated": "2026-02-25T05:15:27+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"infix-routing:installed": [
null
],
"outgoing-interface": "e3.8"
}
]
}
},
"route-preference": 0,
"source-protocol": "direct"
},
{
"active": [
null
],
"ietf-ipv4-unicast-routing:destination-prefix": "10.1.2.0/24",
"ietf-ospf:metric": 2,
"last-updated": "2026-02-25T05:16:22+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"ietf-ipv4-unicast-routing:address": "10.1.1.100",
"infix-routing:installed": [
null
]
},
{
"ietf-ipv4-unicast-routing:address": "10.1.2.1",
"infix-routing:installed": [
null
]
}
]
}
},
"route-preference": 110,
"source-protocol": "ietf-ospf:ospfv2"
},
{
"active": [
null
],
"ietf-ipv4-unicast-routing:destination-prefix": "10.1.3.0/24",
"ietf-ospf:metric": 2,
"last-updated": "2026-02-25T05:16:22+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"ietf-ipv4-unicast-routing:address": "10.1.1.100",
"infix-routing:installed": [
null
]
},
{
"ietf-ipv4-unicast-routing:address": "10.1.3.1",
"infix-routing:installed": [
null
]
}
]
}
},
"route-preference": 110,
"source-protocol": "ietf-ospf:ospfv2"
},
{
"active": [
null
],
"ietf-ipv4-unicast-routing:destination-prefix": "169.254.0.0/16",
"last-updated": "2026-02-25T05:15:33+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"infix-routing:installed": [
null
],
"outgoing-interface": "br0"
}
]
}
},
"route-preference": 0,
"source-protocol": "direct"
}
]
}
},
{
"address-family": "ipv6",
"name": "ipv6",
"routes": {
"route": [
{
"ietf-ipv6-unicast-routing:destination-prefix": "fe80::/64",
"last-updated": "2026-02-25T05:15:29+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"infix-routing:installed": [
null
],
"outgoing-interface": "e6"
}
]
}
},
"route-preference": 0,
"source-protocol": "direct"
},
{
"ietf-ipv6-unicast-routing:destination-prefix": "fe80::/64",
"last-updated": "2026-02-25T05:15:28+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"infix-routing:installed": [
null
],
"outgoing-interface": "br0"
}
]
}
},
"route-preference": 0,
"source-protocol": "direct"
},
{
"ietf-ipv6-unicast-routing:destination-prefix": "fe80::/64",
"last-updated": "2026-02-25T05:15:26+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"infix-routing:installed": [
null
],
"outgoing-interface": "e2"
}
]
}
},
"route-preference": 0,
"source-protocol": "direct"
},
{
"ietf-ipv6-unicast-routing:destination-prefix": "fe80::/64",
"last-updated": "2026-02-25T05:14:36+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"infix-routing:installed": [
null
],
"outgoing-interface": "e7"
}
]
}
},
"route-preference": 0,
"source-protocol": "direct"
},
{
"ietf-ipv6-unicast-routing:destination-prefix": "fe80::/64",
"last-updated": "2026-02-25T05:14:36+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"infix-routing:installed": [
null
],
"outgoing-interface": "e5"
}
]
}
},
"route-preference": 0,
"source-protocol": "direct"
},
{
"active": [
null
],
"ietf-ipv6-unicast-routing:destination-prefix": "fe80::/64",
"last-updated": "2026-02-25T05:14:36+00:00",
"next-hop": {
"next-hop-list": {
"next-hop": [
{
"infix-routing:installed": [
null
],
"outgoing-interface": "e1"
}
]
}
},
"route-preference": 0,
"source-protocol": "direct"
}
]
}
}
]
}
},
"infix-containers:containers": {
"container": [
{
"cmdline": "/usr/bin/tini -- /usr/sbin/httpd -f -v",
"id": "78d28082c2e5d494c82aa181c95118ce498e25930ad9e288ba010257ca336378",
"image": "localhost/curios-httpd-oci-amd64-v24.11.0:latest",
"image-id": "d6930d60a73be9980f8e19b4b4f63586a6d3492178e20bea962e4e9b8c654033",
"name": "container-B",
"network": {
"interface": [
{
"name": "veth2a"
},
{
"name": "veth3a"
}
],
"publish": []
},
"running": true,
"status": "Up About a minute"
},
{
"cmdline": "/usr/bin/tini -- /usr/sbin/httpd -f -v -p 91",
"id": "3451cfceca4eee1091c1dfedece2faee99bc8a729e781799d9c0b4368a31d86d",
"image": "localhost/curios-httpd-oci-amd64-v24.11.0:latest",
"image-id": "d6930d60a73be9980f8e19b4b4f63586a6d3492178e20bea962e4e9b8c654033",
"name": "container-A",
"network": {
"interface": [
{
"name": "veth0a"
},
{
"name": "veth1a"
}
],
"publish": [
"34515:91/tcp"
]
},
"running": true,
"status": "Up About a minute"
},
{
"cmdline": "/usr/bin/tini -- /usr/sbin/nft-helper /etc/nftables.conf",
"id": "4e7c3daeba15546e7640014b9ee46e389737ed36583e5cb2f8b75a07a82e8523",
"image": "localhost/curios-nftables-oci-amd64-v24.11.0:latest",
"image-id": "7a3cc502436250357a6664100a600f306334b4d7203890b85b7ea9b8da6b5665",
"name": "firewall",
"network": {
"host": true
},
"running": true,
"status": "Up About a minute"
}
]
}
}