Files
infix/test/case/statd/interfaces-all/operational.json
T
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

737 lines
18 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": "1738370",
"out-octets": "1738370"
},
"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": "320955",
"out-octets": "1984258"
},
"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": "70",
"out-octets": "39889"
},
"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": "br-Q",
"flood": {
"broadcast": true,
"multicast": true,
"unicast": true
},
"multicast": {
"fast-leave": false,
"router": "auto"
},
"stp": {
"cist": {
"state": "forwarding"
}
}
},
"name": "e3",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:03",
"statistics": {
"out-octets": "45391"
},
"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:304",
"origin": "link-layer",
"prefix-length": 64
}
],
"mtu": 1500
},
"if-index": 5,
"name": "e4",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:04",
"statistics": {
"in-octets": "70",
"out-octets": "39570"
},
"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": "19910",
"out-octets": "39388"
},
"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: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": "26909",
"out-octets": "41285"
},
"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": "23322",
"out-octets": "39536"
},
"type": "infix-if-type:ethernet"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 9,
"infix-interfaces:bridge": {
"multicast": {
"querier": "off",
"snooping": false
},
"multicast-filters": {
"multicast-filter": []
}
},
"name": "br-0",
"oper-status": "down",
"phys-address": "00:a0:85:00:03:00",
"type": "infix-if-type:bridge"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 10,
"infix-interfaces:bridge-port": {
"bridge": "br-X",
"flood": {
"broadcast": true,
"multicast": true,
"unicast": true
},
"multicast": {
"fast-leave": false,
"router": "auto"
},
"stp": {
"cist": {
"state": "forwarding"
}
}
},
"infix-interfaces:vlan": {
"id": 30,
"lower-layer-if": "e2",
"tag-type": "ieee802-dot1q-types:c-vlan"
},
"name": "e2.30",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:02",
"type": "infix-if-type:vlan"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 11,
"infix-interfaces:bridge": {
"multicast": {
"querier": "off",
"snooping": false
},
"multicast-filters": {
"multicast-filter": []
}
},
"name": "br-X",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:00",
"type": "infix-if-type:bridge"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 12,
"infix-interfaces:bridge-port": {
"bridge": "br-Q",
"flood": {
"broadcast": true,
"multicast": true,
"unicast": true
},
"multicast": {
"fast-leave": false,
"router": "auto"
},
"stp": {
"cist": {
"state": "forwarding"
}
}
},
"infix-interfaces:veth": {
"peer": "veth0a"
},
"name": "veth0b",
"oper-status": "up",
"phys-address": "36:da:80:06:7f:99",
"statistics": {
"in-octets": "17190",
"out-octets": "299"
},
"type": "infix-if-type:veth"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 13,
"infix-interfaces:veth": {
"peer": "veth0b"
},
"name": "veth0a",
"oper-status": "up",
"phys-address": "6e:d0:98:c4:e7:ef",
"statistics": {
"in-octets": "299",
"out-octets": "17190"
},
"type": "infix-if-type:veth"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 14,
"infix-interfaces:bridge-port": {
"bridge": "br-D",
"flood": {
"broadcast": true,
"multicast": true,
"unicast": true
},
"multicast": {
"fast-leave": false,
"router": "auto"
},
"stp": {
"cist": {
"state": "forwarding"
}
}
},
"infix-interfaces:vlan": {
"id": 20,
"lower-layer-if": "veth0a",
"tag-type": "ieee802-dot1q-types:c-vlan"
},
"name": "veth0a.20",
"oper-status": "up",
"phys-address": "6e:d0:98:c4:e7:ef",
"statistics": {
"out-octets": "16936"
},
"type": "infix-if-type:vlan"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"address": [
{
"ip": "10.0.0.1",
"origin": "static",
"prefix-length": 8
},
{
"ip": "192.168.20.1",
"origin": "static",
"prefix-length": 24
}
],
"mtu": 1500
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "2001:db8::1",
"origin": "static",
"prefix-length": 64
},
{
"ip": "fe80::2a0:85ff:fe00:300",
"origin": "link-layer",
"prefix-length": 64
}
],
"mtu": 1500
},
"if-index": 15,
"infix-interfaces:bridge": {
"multicast": {
"querier": "off",
"snooping": false
},
"multicast-filters": {
"multicast-filter": []
}
},
"name": "br-D",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:00",
"statistics": {
"out-octets": "16936"
},
"type": "infix-if-type:bridge"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 16,
"infix-interfaces:bridge": {
"vlans": {
"proto": "ieee802-dot1q-types:c-vlan",
"vlan": [
{
"multicast": {
"querier": "off",
"snooping": true
},
"multicast-filters": {
"multicast-filter": []
},
"tagged": [
"e3",
"veth0b"
],
"untagged": [
"br-Q"
],
"vid": 20
},
{
"multicast": {
"querier": "off",
"snooping": true
},
"multicast-filters": {
"multicast-filter": []
},
"tagged": [
"e3",
"veth0b"
],
"untagged": [
"br-Q"
],
"vid": 30
},
{
"multicast": {
"querier": "off",
"snooping": true
},
"multicast-filters": {
"multicast-filter": []
},
"tagged": [
"br-Q",
"e3",
"veth0b"
],
"untagged": [],
"vid": 40
}
]
}
},
"name": "br-Q",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:00",
"statistics": {
"in-octets": "13940"
},
"type": "infix-if-type:bridge"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 17,
"infix-interfaces:vlan": {
"id": 40,
"lower-layer-if": "br-Q",
"tag-type": "ieee802-dot1q-types:c-vlan"
},
"name": "br-Q.40",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:00",
"type": "infix-if-type:vlan"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 18,
"infix-interfaces:vlan": {
"id": 10,
"lower-layer-if": "e3",
"tag-type": "ieee802-dot1q-types:c-vlan"
},
"name": "e3.10",
"oper-status": "up",
"phys-address": "00:a0:85:00:03:03",
"type": "infix-if-type:vlan"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1476
},
"ietf-ip:ipv6": {
"mtu": 1476
},
"if-index": 19,
"infix-interfaces:gre": {
"local": "192.168.20.1",
"remote": "192.168.20.2"
},
"name": "gre-v4",
"oper-status": "up",
"type": "infix-if-type:gre"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"address": [
{
"ip": "192.168.50.2",
"origin": "static",
"prefix-length": 16
}
],
"mtu": 1448
},
"ietf-ip:ipv6": {
"mtu": 1448
},
"if-index": 20,
"infix-interfaces:gre": {
"local": "2001:db8::1",
"remote": "2001:db8::2"
},
"name": "gre-v6",
"oper-status": "up",
"type": "infix-if-type:gre"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1462
},
"ietf-ip:ipv6": {
"mtu": 1462
},
"if-index": 21,
"infix-interfaces:gre": {
"local": "192.168.20.1",
"remote": "192.168.20.2"
},
"name": "gretap-v4",
"oper-status": "up",
"phys-address": "f6:d4:96:d8:9f:96",
"statistics": {
"out-octets": "243"
},
"type": "infix-if-type:gretap"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"mtu": 1434
},
"ietf-ip:ipv6": {
"mtu": 1434
},
"if-index": 22,
"infix-interfaces:gre": {
"local": "2001:db8::1",
"remote": "2001:db8::2"
},
"name": "gretap-v6",
"oper-status": "up",
"phys-address": "7a:46:13:bd:fa:e6",
"statistics": {
"out-octets": "199"
},
"type": "infix-if-type:gretap"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"address": [
{
"ip": "192.168.30.2",
"origin": "static",
"prefix-length": 24
}
],
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 23,
"infix-interfaces:vxlan": {
"local": "192.168.20.100",
"remote": "192.168.20.200",
"vni": 4
},
"name": "vxlan-v4",
"oper-status": "up",
"phys-address": "8a:ea:59:32:df:70",
"type": "infix-if-type:vxlan"
},
{
"admin-status": "up",
"ietf-ip:ipv4": {
"address": [
{
"ip": "192.168.40.2",
"origin": "static",
"prefix-length": 24
}
],
"mtu": 1500
},
"ietf-ip:ipv6": {
"mtu": 1500
},
"if-index": 24,
"infix-interfaces:vxlan": {
"local": "2001:db8::100",
"remote": "2001:db8::200",
"vni": 6
},
"name": "vxlan-v6",
"oper-status": "up",
"phys-address": "3e:30:c6:a1:71:64",
"statistics": {
"out-octets": "7690"
},
"type": "infix-if-type:vxlan"
}
]
}
}