From e507ce4d981f8981af5bd2e7f6c6aad313d14f2d Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 18 May 2026 22:37:20 +0200 Subject: [PATCH 1/5] cli: layered show interface, IEEE 802.3.2-2025 ethernet model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) The detailed interface view gains a 'link mode' row carrying the same label. 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. Future SFP EEPROM reads (ethtool -m) could refine pmd-type at runtime. 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'). No config migration needed: the only config-true leaf in the ethernet container, auto-negotiation/enable, is unchanged across the model upgrade. Closes #530 Signed-off-by: Joachim Wiberg --- src/confd/yang/confd.inc | 7 +- ...ieee802-ethernet-interface@2019-06-21.yang | 928 ------ ...ieee802-ethernet-interface@2025-09-10.yang | 860 +++++ .../ieee802-ethernet-phy-type@2025-09-10.yang | 2955 +++++++++++++++++ .../yang/confd/infix-ethernet-interface.yang | 10 + ... infix-ethernet-interface@2026-05-18.yang} | 0 src/confd/yang/confd/infix-interfaces.yang | 9 + ....yang => infix-interfaces@2026-05-18.yang} | 0 src/statd/python/cli_pretty/cli_pretty.py | 213 +- .../python/yanger/ietf_interfaces/ethernet.py | 86 +- .../python/yanger/ietf_interfaces/link.py | 5 +- .../statd/bridge-mdb/ietf-interfaces.json | 14 +- test/case/statd/bridge-mdb/operational.json | 14 +- .../case/statd/containers/cli/show-interfaces | 82 +- .../statd/containers/ietf-interfaces.json | 14 +- test/case/statd/containers/operational.json | 14 +- .../statd/interfaces-all/cli/show-interfaces | 106 +- .../statd/interfaces-all/ietf-interfaces.json | 14 +- .../statd/interfaces-all/operational.json | 14 +- 19 files changed, 4169 insertions(+), 1176 deletions(-) delete mode 100644 src/confd/yang/confd/ieee802-ethernet-interface@2019-06-21.yang create mode 100644 src/confd/yang/confd/ieee802-ethernet-interface@2025-09-10.yang create mode 100644 src/confd/yang/confd/ieee802-ethernet-phy-type@2025-09-10.yang rename src/confd/yang/confd/{infix-ethernet-interface@2024-02-27.yang => infix-ethernet-interface@2026-05-18.yang} (100%) rename src/confd/yang/confd/{infix-interfaces@2026-05-13.yang => infix-interfaces@2026-05-18.yang} (100%) diff --git a/src/confd/yang/confd.inc b/src/confd/yang/confd.inc index 291bc4cac..e5a1e7236 100644 --- a/src/confd/yang/confd.inc +++ b/src/confd/yang/confd.inc @@ -44,10 +44,11 @@ MODULES=( "infix-meta@2025-12-10.yang" "infix-system@2026-03-09.yang" "infix-services@2026-03-20.yang" - "ieee802-ethernet-interface@2019-06-21.yang" - "infix-ethernet-interface@2024-02-27.yang" + "ieee802-ethernet-interface@2025-09-10.yang" + "ieee802-ethernet-phy-type@2025-09-10.yang" + "infix-ethernet-interface@2026-05-18.yang" "infix-factory-default@2023-06-28.yang" - "infix-interfaces@2026-05-13.yang -e vlan-filtering" + "infix-interfaces@2026-05-18.yang -e vlan-filtering" "ietf-crypto-types -e cleartext-symmetric-keys" "infix-crypto-types@2026-02-14.yang" "ietf-keystore -e symmetric-keys" diff --git a/src/confd/yang/confd/ieee802-ethernet-interface@2019-06-21.yang b/src/confd/yang/confd/ieee802-ethernet-interface@2019-06-21.yang deleted file mode 100644 index d02ecced8..000000000 --- a/src/confd/yang/confd/ieee802-ethernet-interface@2019-06-21.yang +++ /dev/null @@ -1,928 +0,0 @@ -module ieee802-ethernet-interface { - yang-version 1.1; - - namespace - "urn:ieee:std:802.3:yang:ieee802-ethernet-interface"; - - prefix ieee802-eth-if; - - import ietf-yang-types { - prefix yang; - reference "IETF RFC 6991"; - } - - import ietf-interfaces { - prefix if; - reference "IETF RFC 8343"; - } - - import iana-if-type { - prefix ianaift; - reference "http://www.iana.org/assignments/yang-parameters/ - iana-if-type@2018-07-03.yang"; - } - - organization - "IEEE Std 802.3 Ethernet Working Group - Web URL: http://www.ieee802.org/3/"; - - contact - "Web URL: http://www.ieee802.org/3/"; - - description - "This module contains YANG definitions for configuring IEEE Std - 802.3 Ethernet Interfaces. - In this YANG module, 'Ethernet interface' can be interpreted - as referring to 'IEEE Std 802.3 compliant Ethernet - interfaces'."; - - revision 2019-06-21{ - description "Initial revision."; - reference "IEEE Std 802.3-2018, unless dated explicitly"; - } - - typedef eth-if-speed-type { - type decimal64 { - fraction-digits 3; - } - units "Gb/s"; - description - "Used to represent the configured, negotiated, or actual speed - of an Ethernet interface in Gigabits per second (Gb/s), - accurate to 3 decimal places (i.e., accurate to 1 Mb/s)."; - } - - typedef duplex-type { - type enumeration { - enum full { - description - "Full duplex."; - } - enum half { - description - "Half duplex."; - } - enum unknown { - description - "Link is currently disconnected or initializing."; - } - } - default full; - description - "Used to represent the configured, negotiated, or actual - duplex mode of an Ethernet interface."; - reference "IEEE Std 802.3, 30.3.1.1.32, aDuplexStatus"; - } - - typedef pause-fc-direction-type { - type enumeration { - enum "disabled" { - description - "Flow-control disabled in both ingress and egress - directions, i.e., PAUSE frames are not transmitted and - PAUSE frames received in the ingress direction are - discarded without processing."; - } - enum "ingress-only" { - description - "PAUSE frame based flow control is enabled in the ingress - direction only, i.e., PAUSE frames may be transmitted to - reduce the ingress traffic flow, but PAUSE frames received - in the ingress direction are discarded without reducing - the egress traffic rate."; - } - enum "egress-only" { - description - "PAUSE frame based flow control is enabled in the egress - direction only, i.e., PAUSE frames are not transmitted, - but PAUSE frames received in the ingress direction are - processed to reduce the egress traffic rate."; - } - enum "bi-directional" { - description - "PAUSE frame based flow control is enabled in both ingress - and egress directions, i.e., PAUSE frames may be - transmitted to reduce the ingress traffic flow, and - PAUSE frames received on ingress are processed to reduce - the egress traffic rate."; - } - enum "undefined" { - description - "Link is currently disconnected or initializing."; - } - } - description - "Used to represent the configured, negotiated, or actual - PAUSE frame-based flow control setting."; - - reference - "IEEE Std 802.3.1, dot3PauseAdminMode and dot3PauseOperMode"; - } - - feature ethernet-pfc { - description - "This device supports Ethernet priority flow-control."; - } - - feature ethernet-pause { - description - "This device supports Ethernet PAUSE."; - } - - augment "/if:interfaces/if:interface" { - when "derived-from-or-self(if:type, 'ianaift:ethernetCsmacd')" { - description - "Applies to all P2P Ethernet interfaces."; - } - description - "Augment interface model with Ethernet interface - specific configuration nodes."; - - container ethernet { - description - "Contains all Ethernet interface related configuration."; - - container auto-negotiation { - presence - "The presence of this container indicates that - auto-negotiation is supported on this Ethernet - interface."; - description - "Contains auto-negotiation transmission parameters - - This container contains a data node that allows the - advertised duplex value in the negotiation to be - restricted. - - If not specified then the default behavior for the duplex - data node is to negotiate all available values for the - particular type of Ethernet PHY associated with the - interface. - - If auto-negotiation is enabled, and PAUSE frame based flow - control has not been explicitly configured, then the - default PAUSE frame based flow control capabilities that - are negotiated allow for bi-directional or egress-only - PAUSE frame based flow control. - - If auto-negotiation is enabled, and PAUSE frame based flow - control has been explicitly configured, then the - configuration settings restrict the values that may be - negotiated. However, it should be noted that the protocol - does not allow only egress PAUSE frame based flow control - to be negotiated without also allowing bi-directional - PAUSE frame based flow control."; - reference - "IEEE Std 802.3, Clause 28 and Annexes 28A-D"; - - leaf enable { - type boolean; - default true; - - description - "Controls whether auto-negotiation is enabled or - disabled. - For interface types that support auto-negotiation then - it defaults to being enabled. - - For interface types that do not support auto-negotiation, - the related configuration data is ignored."; - } - leaf negotiation-status { - when "../enable = 'true'"; - type enumeration { - enum in-progress { - description - "The auto-negotiation protocol is running and - negotiation is currently in-progress."; - } - enum complete { - description - "The auto-negotiation protocol has completed - successfully."; - } - enum failed { - description - "The auto-negotiation protocol has failed."; - } - enum unknown { - description - "The auto-negotiation status is not currently known, - this could be because it is still negotiating or the - protocol cannot run (e.g., if no medium is present)."; - } - enum no-negotiation { - description - "No auto-negotiation is executed. - The auto-negotation function is either not supported - on this interface or has not been enabled."; - } - } - config false; - description - "The status of the auto-negotiation protocol."; - reference - "IEEE 802.3, 30.6.1.1.4, aAutoNegAutoConfig"; - } - - } - - leaf duplex { - type duplex-type; - description - "Operational duplex mode of the Ethernet interface."; - reference - "IEEE Std 802.3, 30.3.1.1.32 aDuplexStatus"; - } - - leaf speed { - type eth-if-speed-type; - units "Gb/s"; - description - "Operational speed (data rate) of the Ethernet interface. - The default value is implementation-dependent."; - } - - container flow-control { - description - "Holds the different types of Ethernet PAUSE frame based - flow control that can be enabled."; - container pause { - if-feature "ethernet-pause"; - description - "IEEE Std 802.3 PAUSE frame based PAUSE frame based flow - control."; - reference - "IEEE Std 802.3, Annex 31B"; - leaf direction { - type pause-fc-direction-type; - description - "Indicates which direction PAUSE frame based flow - control is enabled in, or whether it is disabled. - The default flow-control settings are vendor specific. - If auto-negotiation is enabled, then PAUSE based - flow-control is negotiated by default. - The default value is implementation-dependent."; - } - - container statistics { - config false; - description - "Contains the number of PAUSE frames received or - transmitted."; - leaf in-frames-pause { - type yang:counter64; - units frames; - description - "A count of PAUSE MAC Control frames transmitted on - this Ethernet interface. - - Discontinuities in the values of counters in - this container can occur at re-initialization of the - management system, and at other times as indicated - by the value of the 'discontinuity-time' leaf - defined in the ietf-interfaces YANG module - (IETF RFC 8343)."; - reference - "IEEE Std 802.3, 30.3.4.3 aPAUSEMACCtrlFramesReceived"; - } - leaf out-frames-pause { - type yang:counter64; - units frames; - description - "A count of PAUSE MAC Control frames transmitted on - this Ethernet interface. - - Discontinuities in the values of counters in - this container can occur at re-initialization of the - management system, and at other times as indicated - by the value of the 'discontinuity-time' leaf - defined in the ietf-interfaces YANG module - (IETF RFC 8343)."; - reference - "IEEE Std 802.3, 30.3.4.2 - aPAUSEMACCtrlFramesTransmitted"; - } - } - } - - container pfc { - if-feature "ethernet-pfc"; - description - "IEEE Std 802.3 Priority-based flow control."; - reference - "IEEE Std 802.3, Annex 31D"; - - leaf enable { - type boolean; - - description - "True indicates that IEEE Std 802.3 priority-based - flow control is enabled, false indicates that - IEEE Std 802.3 priority-based flow control is disabled. - For interfaces that have auto-negotiation, - the priority-based flow control is enabled by default."; - } - - container statistics { - config false; - description - "This container collects all statistics for - Ethernet interfaces."; - - leaf in-frames-pfc { - type yang:counter64; - units frames; - description - "A count of PFC MAC Control frames received on this - Ethernet interface. - - Discontinuities in the values of counters in - this container can occur at re-initialization of the - management system, and at other times as indicated - by the value of the 'discontinuity-time' leaf - defined in the ietf-interfaces YANG module - (IETF RFC 8343)."; - reference - "IEEE Std 802.3.1, dot3HCInPFCFrames"; - } - - leaf out-frames-pfc { - type yang:counter64; - units frames; - description - "A count of PFC MAC Control frames transmitted on - this interface. - - Discontinuities in the values of counters in - this container can occur at re-initialization of the - management system, and at other times as indicated - by the value of the 'discontinuity-time' leaf - defined in the ietf-interfaces YANG module - (IETF RFC 8343)."; - reference - "IEEE Std 802.3.1, dot3HCInPFCFrames"; - } - } - } - - leaf force-flow-control { - type boolean; - default false; - description - "Explicitly forces the local PAUSE frame based flow control - settings regardless of what has been negotiated. - - Since the auto-negotiation of flow-control settings - does not allow all sane combinations to be negotiated - (e.g., consider a device that is only capable of sending - PAUSE frames connected to a peer device that is only - capable of receiving and acting on PAUSE frames) and - failing to agree on the flow-control settings does not - cause the auto-negotiation to fail completely, then it is - sometimes useful to be able to explicitly enable - particular PAUSE frame based flow control settings on - the local device regardless of what is being advertised - or negotiated."; - reference - "IEEE Std 802.3, Table 28B-3"; - } - } - - leaf max-frame-length { - type uint16; - units octets; - config false; - description - "This indicates the MAC frame length (including FCS bytes) - at which frames are dropped for being too long."; - reference - "IEEE Std 802.3, 30.3.1.1.37 aMaxFrameLength"; - } - - leaf mac-control-extension-control { - type boolean; - config false; - description - "A value that identifies the current EXTENSION MAC Control - function, as specified in IEEE Std 802.3, Annex 31C."; - reference - "IEEE Std 802.3, 30.3.8.3 aEXTENSIONMACCtrlStatus - IEEE Std 802.3.1, dot3ExtensionMacCtrlStatus "; - } - - leaf frame-limit-slow-protocol { - type uint64; - units f/s; - default 10; - config false; - description - "The maximum number of Slow Protocol frames of a given - subtype that can be transmitted in a one second interval. - The default value is 10."; - reference - "IEEE Std 802.3, 30.3.1.1.38 aSlowProtocolFrameLimit"; - } - - container capabilities { - config false; - description - "Container all Ethernet interface specific capabilities."; - - leaf auto-negotiation { - type boolean; - description - "Indicates whether auto-negotiation may be configured on - this interface."; - } - - } - - container statistics { - config false; - description - "Contains statistics specific to Ethernet interfaces. - - Discontinuities in the values of counters in the - container can occur at re-initialization of the management - system, and at other times as indicated by the value of - the 'discontinuity-time' leaf defined in the - ietf-interfaces YANG module (IETF RFC 8343)."; - - container frame { - description - "Contains frame statistics specific to Ethernet - interfaces. - - All octet frame lengths include the 4 byte FCS. - - Error counters are only reported once ... The count - represented by an instance of this object is incremented - when the frameCheckError status is returned by the MAC - service to the LLC (or other MAC user). Received frames - for which multiple error conditions pertain are, - according to the conventions of IEEE Std 802.3 Layer - Management, counted exclusively according to the error - status presented to the LLC. - - A frame that is counted by an instance of this object is - also counted by the corresponding instance of 'in-errors' - leaf defined in the ietf-interfaces YANG module - (IETF RFC 8343). - - Discontinuities in the values of counters in the - container can occur at re-initialization of the - management system, and at other times as indicated by - the value of the 'discontinuity-time' leaf defined in - the ietf-interfaces YANG module (IETF RFC 8343)."; - - leaf in-total-frames { - type yang:counter64; - units frames; - description - "The total number of frames (including bad frames) - received on the Ethernet interface. - - This counter is calculated by summing the following - IEEE Std 802.3, Clause 30 counters: - aFramesReceivedOK + - aFrameCheckSequenceErrors + - aAlignmentErrors + - aFrameTooLongErrors + - aFramesLostDueToIntMACRcvError - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, Clause 30 counters, as specified - in the description above."; - } - - leaf in-total-octets { - type yang:counter64; - units octets; - description - "The total number of octets of data (including those in - bad frames) received on the Ethernet interface. - - Includes the 4-octet FCS. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IETF RFC 2819, etherStatsOctets"; - } - - leaf in-frames { - type yang:counter64; - units frames; - description - "A count of frames (including unicast, multicast and - broadcast) that have been successfully received on the - Ethernet interface. - - This count does not include frames received with - frame-too-long, FCS, length or alignment errors, or - frames lost due to internal MAC sublayer error. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.1.1.5 aFramesReceivedOK"; - } - - leaf in-multicast-frames { - type yang:counter64; - units frames; - description - "A count of multicast frames that have been - successfully received on the Ethernet interface. - - This counter represents a subset of the frames counted - by in-frames. - - This count does not include frames received with - frame-too-long, FCS, length or alignment errors, or - frames lost due to internal MAC sublayer error. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.1.1.21 aMulticastFramesReceivedOK"; - } - - leaf in-broadcast-frames { - type yang:counter64; - units frames; - description - "A count of broadcast frames that have been - successfully received on the Ethernet interface. - - This counter represents a subset of the frames counted - by in-frames. - - This count does not include frames received with - frame-too-long, FCS, length or alignment errors, or - frames lost due to internal MAC sublayer error. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.1.1.22 aBroadcastFramesReceivedOK"; - } - - leaf in-error-fcs-frames { - type yang:counter64; - units frames; - description - "A count of receive frames that are of valid length, - but do not pass the FCS check, regardless of whether - or not the frames are an integral number of octets in - length. - - This count effectively comprises - aFrameCheckSequenceErrors and aAlignmentErrors added - together. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.1.1.6 aFrameCheckSequenceErrors; - IEEE Std 802.3, 30.3.1.1.7 aAlignmentErrors"; - } - - leaf in-error-undersize-frames { - type yang:counter64; - units frames; - description - "A count of frames received on a particular Ethernet - interface that are less than 64 bytes in length, and - are discarded. - - This counter is incremented regardless of whether the - frame passes the FCS check. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IETF RFC 2819, etherStatsUndersizePkts and - etherStatsFragments"; - } - - leaf in-error-oversize-frames { - type yang:counter64; - units frames; - description - "A count of frames received on a particular Ethernet - interface that exceed the maximum permitted frame - size, that is specified in max-frame-length, and are - discarded. - - This counter is incremented regardless of whether the - frame passes the FCS check. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference "IEEE Std 802.3, 30.3.1.1.25 aFrameTooLongErrors"; - } - - leaf in-error-mac-internal-frames { - type yang:counter64; - units frames; - description - "A count of frames for which reception on a particular - Ethernet interface fails due to an internal MAC - sublayer receive error. - - A frame is only counted by an instance of this object - if it is not counted by the corresponding instance of - either the in-error-fcs-frames, in-error-undersize-frames, - or in-error-oversize-frames. The precise meaning of the - count represented by an instance of this object is - implementation-specific. - - In particular, an instance of this object may - represent a count of receive errors on a particular - Ethernet interface that are not otherwise counted. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.1.1.15 - aFramesLostDueToIntMACRcvError"; - } - - leaf out-frames { - type yang:counter64; - units frames; - description - "A count of frames (including unicast, multicast and - broadcast) that have been successfully transmitted on - the Ethernet interface. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.1.1.2 aFramesTransmittedOK"; - } - - leaf out-multicast-frames { - type yang:counter64; - units frames; - description - "A count of multicast frames that have been - successfully transmitted on the Ethernet interface. - - This counter represents a subset of the frames counted - by out-frames. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.1.1.18 aMulticastFramesXmittedOK"; - } - - leaf out-broadcast-frames { - type yang:counter64; - units frames; - description - "A count of broadcast frames that have been - successfully transmitted on the Ethernet interface. - - This counter represents a subset of the frames counted - by out-frames. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.1.1.19 aBroadcastFramesXmittedOK"; - } - - leaf out-error-mac-internal-frames { - type yang:counter64; - units frames; - description - "A count of frames for which transmission on a - particular Ethernet interface fails due to an internal - MAC sublayer transmit error. - - The precise meaning of the count represented by an - instance of this object is implementation-specific. In - particular, an instance of this object may represent a - count of transmission errors on a particular Ethernet - interface that are not otherwise counted. - - Also see the 'description' statement associated with - the parent 'statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.1.1.12 - aFramesLostDueToIntMACXmitError"; - } - } - - container phy { - description - "Ethernet statistics related to the PHY layer. - - Discontinuities in the values of counters in the - container can occur at re-initialization of the - management system, and at other times as indicated by - the value of the 'discontinuity-time' leaf defined in - the ietf-interfaces YANG module (IETF RFC 8343)."; - - leaf in-error-symbol { - type yang:counter64; - units errors; - description - "A count of the number of symbol errors that have - occurred. - - For the precise definition of when the symbol error - counter is incremented, please see the 'description' - text associated with aSymbolErrorDuringCarrier, - specified in IEEE Std 802.3, 30.3.2.1.5. - - Also see the 'description' statement associated with - the parent 'phy-statistics' container for additional - common semantics related to this counter."; - reference - "IEEE Std 802.3, 30.3.2.1.5 aSymbolErrorDuringCarrier"; - } - - container lpi { - description - "Physical Ethernet statistics for the energy efficiency - related low power idle indications."; - - leaf in-lpi-transitions { - type yang:counter64; - units transitions; - description - "A count of occurrences of the transition from - DEASSERT to ASSERT of the LPI_INDICATE - parameter. The indication reflects the state of the - PHY according to the requirements of the RS (see - IEEE Std 802.3, 22.7, 35.4, and 46.4). - - Also see the 'description' statement associated with - the parent 'phy-statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.2.1.11 aReceiveLPITransitions"; - } - - leaf in-lpi-time { - type decimal64 { - fraction-digits 6; - } - units seconds; - description - "A count reflecting the total amount of time (in - seconds) that the LPI_REQUEST parameter has the - value ASSERT. The request is indicated to the PHY - according to the requirements of the RS (see IEEE Std - 802.3, 22.7, 35.4, and 46.4). - - Also see the 'description' statement associated with - the parent 'phy-statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.2.1.9 aReceiveLPIMicroseconds"; - } - - leaf out-lpi-transitions { - type yang:counter64; - units transitions; - description - "A count of occurrences of the transition from state - LPI_DEASSERTED to state LPI_ASSERTED in the LPI - transmit state diagram of the RS. The state - transition corresponds to the assertion of the - LPI_REQUEST parameter. The request is indicated to - the PHY according to the requirements of the RS (see - IEEE Std 802.3, 22.7, 35.4, 46.4.) - - Also see the 'description' statement associated with - the parent 'phy-statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.2.1.10 aTransmitLPITransitions"; - } - - leaf out-lpi-time { - type decimal64 { - fraction-digits 6; - } - units seconds; - description - "A count reflecting the total amount of time (in - seconds) that the LPI_INDICATION parameter has the - value ASSERT. The request is indicated to the PHY - according to the requirements of the RS (see IEEE - 802.3, 22.7, 35.4, and 46.4). - - Also see the 'description' statement associated with - the parent 'phy-statistics' container for additional - common semantics related to this counter."; - - reference - "IEEE Std 802.3, 30.3.2.1.8 aTransmitLPIMicroseconds"; - } - } - } - - container mac-control { - description - "A group of statistics specific to MAC Control operation - of selected Ethernet interfaces. - - Discontinuities in the values of counters in the - container can occur at re-initialization of the - management system, and at other times as indicated by - the value of the 'discontinuity-time' leaf defined in - the ietf-interfaces YANG module (IETF RFC 8343)."; - - reference - "IEEE Std 802.3.1, dot3ExtensionTable"; - - leaf in-frames-mac-control-unknown { - type yang:counter64; - units frames; - description - "A count of MAC Control frames with an unsupported - opcode received on this Ethernet interface. - - Frames counted against this counter are also counted - against in-discards defined in the ietf-interfaces - YANG module (IETF RFC 8343). - - Also see the 'description' statement associated with - the parent 'mac-control-statistics' container for - additional semantics."; - reference - "IEEE Std 802.3, 30.3.3.5 aUnsupportedOpcodesReceived"; - } - - leaf in-frames-mac-control-extension { - type yang:counter64; - units frames; - description - "The count of Extension MAC Control frames received on - this Ethernet interface. - - Also see the 'description' statement associated with - the parent 'mac-control-statistics' container for - additional semantics."; - reference - "IEEE Std 802.3, 30.3.8.2 - aEXTENSIONMACCtrlFramesReceived"; - } - - leaf out-frames-mac-control-extension { - type yang:counter64; - units frames; - description - "The count of Extension MAC Control frames transmitted - on this Ethernet interface. - - Also see the 'description' statement associated with - the parent 'mac-control-statistics' container for - additional semantics."; - reference - "IEEE Std 802.3, 30.3.8.1 - aEXTENSIONMACCtrlFramesTransmitted"; - } - } - } - } - } -} \ No newline at end of file diff --git a/src/confd/yang/confd/ieee802-ethernet-interface@2025-09-10.yang b/src/confd/yang/confd/ieee802-ethernet-interface@2025-09-10.yang new file mode 100644 index 000000000..4e33c11c4 --- /dev/null +++ b/src/confd/yang/confd/ieee802-ethernet-interface@2025-09-10.yang @@ -0,0 +1,860 @@ +module ieee802-ethernet-interface { + yang-version 1.1; + namespace "urn:ieee:std:802.3:yang:ieee802-ethernet-interface"; + prefix ieee802-eth-if; + + import ietf-yang-types { + prefix yang; + reference + "IETF RFC 6991"; + } + import iana-if-type { + prefix ianaift; + reference + "http://www.iana.org/assignments/yang-parameters/ + iana-if-type@2023-01-26.yang"; + } + import ietf-interfaces { + prefix if; + reference + "IETF RFC 8343"; + } + import ieee802-ethernet-phy-type { + prefix ieee802-phy; + reference + "IEEE Std 802.3-2022"; + } + + organization + "IEEE Std 802.3 Ethernet Working Group + Web URL: http://www.ieee802.org/3/"; + contact + "Web URL: http://www.ieee802.org/3/"; + description + "This module contains YANG definitions for configuring IEEE Std + 802.3 Ethernet Interfaces. + In this YANG module, 'Ethernet interface' can be interpreted + as referring to 'IEEE Std 802.3 compliant Ethernet + interfaces'."; + + revision 2025-09-10 { + description + "Updates under IEEE Std 802.3.2-2025"; + reference + "IEEE Std 802.3-2022 and IEEE Std 802.3.1-2024, unless dated + explicitly"; + } + + feature ethernet-pfc { + description + "This device supports Ethernet priority flow control."; + } + + feature ethernet-pause { + description + "This device supports Ethernet PAUSE."; + } + + typedef eth-if-speed-type { + type decimal64 { + fraction-digits 3; + } + units "Gb/s"; + status obsolete; + description + "Used to represent the configured, negotiated, or actual + speed of an Ethernet interface in Gigabits per second + (Gb/s), accurate to 3 decimal places (i.e., accurate to + 1 Mb/s)."; + } + + typedef duplex-type { + type enumeration { + enum full { + description + "Full duplex."; + } + enum half { + description + "Half duplex."; + } + enum unknown { + description + "Link is currently disconnected or initializing."; + } + } + default "full"; + description + "Used to represent the configured, negotiated, or actual + duplex mode of an Ethernet interface."; + reference + "IEEE Std 802.3, 30.3.1.1.32, aDuplexStatus"; + } + + typedef pause-fc-direction-type { + type enumeration { + enum disabled { + description + "Flow control disabled in both ingress and egress + directions."; + } + enum ingress-only { + description + "PAUSE frame-based flow control is enabled in the ingress + direction only."; + } + enum egress-only { + description + "PAUSE frame-based flow control is enabled in the egress + direction only."; + } + enum bi-directional { + description + "PAUSE frame-based flow control is enabled in both + ingress and egress directions."; + } + enum undefined { + description + "Link is currently disconnected or initializing."; + } + } + description + "Used to represent the configured, negotiated, or actual + PAUSE frame-based flow control setting."; + reference + "IEEE Std 802.3.1, dot3PauseAdminMode and dot3PauseOperMode"; + } + + augment "/if:interfaces/if:interface" { + when "derived-from-or-self(if:type, 'ianaift:ethernetCsmacd')" { + description + "Applies to all Ethernet interfaces."; + } + description + "Augment interface model with Ethernet interface + specific configuration nodes."; + container ethernet { + description + "Contains all Ethernet interface related configuration."; + container auto-negotiation { + presence "The presence of this container indicates that + auto-negotiation is supported on this Ethernet + interface."; + description + "Contains auto-negotiation transmission parameters. + + This container contains a data node that allows the + advertised duplex value in the negotiation to be + restricted. + + If not specified then the default behavior for the + duplex data node is to negotiate all available values for + the particular type of Ethernet PHY associated with the + interface."; + reference + "IEEE Std 802.3, Clause 28 and Annexes 28A-D"; + leaf enable { + type boolean; + default "true"; + description + "Controls whether auto-negotiation is enabled or + disabled. + For interface types that support auto-negotiation then + it defaults to being enabled. + + For interface types that do not support + auto-negotiation, the related configuration data is + ignored."; + } + leaf negotiation-status { + when "../enable = 'true'"; + type enumeration { + enum in-progress { + description + "The auto-negotiation protocol is running and + negotiation is currently in-progress."; + } + enum complete { + description + "The auto-negotiation protocol has completed + successfully."; + } + enum failed { + description + "The auto-negotiation protocol has failed."; + } + enum unknown { + description + "The auto-negotiation status is not currently known, + this could be because it is still negotiating or the + protocol cannot run + (e.g., if no medium is present)."; + } + enum no-negotiation { + description + "No auto-negotiation is executed. + The auto-negotiation function is either not + supported on this interface or has not been + enabled."; + } + } + config false; + description + "The status of the auto-negotiation protocol."; + reference + "IEEE 802.3, 30.6.1.1.4, aAutoNegAutoConfig"; + } + } + leaf phy-type { + type identityref { + base ieee802-phy:phy-type; + } + config false; + description + "A value that uniquely identifies the IEEE 802.3 PHY type + of the interface."; + reference + "IEEE Std 802.3, 30.3.2.1.2 aPhyType"; + } + leaf pmd-type { + type identityref { + base ieee802-phy:pmd-type; + } + config false; + description + "A value that uniquely identifies the IEEE 802.3 PMD type + of the interface."; + reference + "IEEE Std 802.3, 30.5.1.1.2 aMAUType"; + } + leaf duplex { + type duplex-type; + description + "Operational duplex mode of the Ethernet interface."; + reference + "IEEE Std 802.3, 30.3.1.1.32 aDuplexStatus"; + } + leaf speed { + type eth-if-speed-type; + units "Gb/s"; + status obsolete; + description + "Operational speed (data rate) of the Ethernet interface. + The default value is implementation dependent. + Superseded by speed in /if:interfaces/if:interface"; + } + /* deprecated flow-control container */ + container flow-control { + status deprecated; + description + "Holds the different types of Ethernet PAUSE frame-based + flow control that can be enabled. + Superseded by new container - pause."; + container pause { + if-feature "ethernet-pause"; + description + "IEEE Std 802.3 PAUSE frame-based flow control."; + reference + "IEEE Std 802.3, Annex 31B"; + leaf direction { + type pause-fc-direction-type; + description + "Indicates which direction PAUSE frame-based flow + control is enabled in, or whether it is disabled. + The default flow-control settings are vendor + specific. If auto-negotiation is enabled, then PAUSE + based flow control is negotiated by default. + The default value is implementation dependent."; + } + container statistics { + config false; + description + "Contains the number of PAUSE frames received or + transmitted. + + Discontinuities in the values of counters in + this container can occur at re-initialization of + the management system, and at other times as + indicated by the value of the 'discontinuity-time' + leaf defined in the ietf-interfaces YANG module + (IETF RFC 8343)."; + leaf in-frames-pause { + type yang:counter64; + units "frames"; + description + "A count of PAUSE MAC Control frames transmitted on + this Ethernet interface."; + reference + "IEEE Std 802.3, 30.3.4.3 + aPAUSEMACCtrlFramesReceived"; + } + leaf out-frames-pause { + type yang:counter64; + units "frames"; + description + "A count of PAUSE MAC Control frames transmitted on + this Ethernet interface."; + reference + "IEEE Std 802.3, 30.3.4.2 + aPAUSEMACCtrlFramesTransmitted"; + } + } + } + container pfc { + if-feature "ethernet-pfc"; + description + "IEEE Std 802.3 Priority-based flow control."; + reference + "IEEE Std 802.3, Annex 31D"; + leaf enable { + type boolean; + description + "True indicates that IEEE Std 802.3 priority-based + flow control is enabled, false indicates that + IEEE Std 802.3 priority-based flow control is + disabled. For interfaces that have auto-negotiation, + the priority-based flow control is enabled by + default."; + } + container statistics { + config false; + status deprecated; + description + "This container collects all statistics for + Ethernet interfaces. + + Discontinuities in the values of counters in + this container can occur at re-initialization of + the management system, and at other times as + indicated by the value of the 'discontinuity-time' + leaf defined in the ietf-interfaces YANG module + (IETF RFC 8343)."; + leaf in-frames-pfc { + type yang:counter64; + units "frames"; + description + "Deprecated in-frames-pfc as not defined in base + standard. A count of PFC MAC Control frames + received on this Ethernet interface."; + reference + "IEEE Std 802.3.1, dot3HCInPFCFrames"; + } + leaf out-frames-pfc { + type yang:counter64; + units "frames"; + description + "Deprecated out-frames-pfc as not defined in base + standard. A count of PFC MAC Control frames + transmitted on this interface."; + reference + "IEEE Std 802.3.1, dot3HCInPFCFrames"; + } + } + } + leaf force-flow-control { + type boolean; + default "false"; + description + "Explicitly forces the local PAUSE frame-based flow + control settings regardless of what has been + negotiated. + + Since the auto-negotiation of flow control settings + does not allow all sane combinations to be negotiated + (e.g., consider a device that is only capable of + sending PAUSE frames connected to a peer device that + is only capable of receiving and acting on PAUSE + frames) and failing to agree on the flow control + settings does not cause the auto-negotiation to fail + completely, then it is sometimes useful to be able to + explicitly enable particular PAUSE frame-based flow + control settings on the local device regardless of + what is being advertised or negotiated."; + reference + "IEEE Std 802.3, Table 28B-3"; + } + } + leaf max-frame-length { + type uint16; + units "octets"; + config false; + description + "This indicates the MAC frame length (including FCS bytes) + at which frames are dropped for being too long."; + reference + "IEEE Std 802.3, 30.3.1.1.37 aMaxFrameLength"; + } + leaf mac-control-extension-control { + type boolean; + config false; + description + "A value that identifies the current EXTENSION + MAC Control function, as specified in + IEEE Std 802.3, Annex 31C."; + reference + "IEEE Std 802.3, 30.3.8.3 aEXTENSIONMACCtrlStatus + IEEE Std 802.3.1, dot3ExtensionMacCtrlStatus "; + } + leaf frame-limit-slow-protocol { + type uint64; + units "f/s"; + default "10"; + config false; + description + "The maximum number of Slow Protocol frames of a given + subtype that can be transmitted in a one second + interval. + The default value is 10."; + reference + "IEEE Std 802.3, 30.3.1.1.38 aSlowProtocolFrameLimit"; + } + container capabilities { + config false; + description + "Contains all Ethernet interface specific capabilities."; + leaf auto-negotiation { + type boolean; + description + "Indicates whether auto-negotiation may be configured on + this interface."; + } + } + container ethernet-pause { + if-feature "ethernet-pause"; + description + "IEEE Std 802.3 PAUSE flow control. + + Discontinuities in the values of counters in + this container can occur at re-initialization of + the management system, and at other times as + indicated by the value of the 'discontinuity-time' + leaf defined in the ietf-interfaces YANG module + (IETF RFC 8343)."; + reference + "IEEE Std 802.3, 30.3.4 PAUSE entity managed object class + and Clause 31, Annex 31B)"; + container control-and-status { + description + "PAUSE function control and status objects."; + leaf pause-admin-control { + type pause-fc-direction-type; + default "disabled"; + description + "What PAUSE functionality will run on this interface + when Auto-Negotiation is not implemented + or disabled."; + reference + "IEEE Std 802.3.1, dot3PauseAdminMode"; + } + leaf pause-oper-status { + type pause-fc-direction-type; + config false; + description + "What PAUSE functionality is running on this + interface, as a result of Auto-Negotiation or + setting pause-admin-control."; + reference + "IEEE Std 802.3.1, dot3PauseOperMode"; + } + leaf link-delay-allowance { + type uint32; + description + "The value in bit-times of the allowance made by the + MAC Control PAUSE entity for round-trip propagation + delay. + The default value is implementation dependent."; + } + leaf pfc-enable-status { + type boolean; + config false; + description + "Is IEEE 802.1 Priority-based Flow Control (PFC) + enabled on the interface. If PFC is enabled, then + 802.3 PAUSE flow control is disabled."; + reference + "IEEE Std 802.3, 30.3.3.6 aPFCEnableStatus"; + } + } + container statistics { + config false; + description + "PAUSE frame counters."; + leaf in-frames-pause { + type yang:counter64; + units "frames"; + description + "A count of MAC Control PAUSE frames transmitted on + this Ethernet interface."; + reference + "IEEE Std 802.3, 30.3.4.3 + aPAUSEMACCtrlFramesReceived"; + } + leaf out-frames-pause { + type yang:counter64; + units "frames"; + description + "A count of MAC Control PAUSE frames transmitted on + this Ethernet interface."; + reference + "IEEE Std 802.3, 30.3.4.2 + aPAUSEMACCtrlFramesTransmitted"; + } + } + } + container statistics { + config false; + description + "Contains statistics specific to Ethernet interfaces. + + Discontinuities in the values of counters in the + container can occur at re-initialization of the + management system, and at other times as indicated by + the value of the 'discontinuity-time' leaf defined in + the ietf-interfaces YANG module (IETF RFC 8343)."; + container frame { + description + "Contains frame statistics specific to Ethernet + interfaces. + + All octet frame lengths include the 4-byte FCS. + + Error counters are only reported once. The count + represented by an instance of this object is + incremented when the frameCheckError status is + returned by the MAC service to the MAC Client. + Received frames for which multiple error conditions + pertain are, according to the conventions of + IEEE Std 802.3 Layer Management, counted exclusively + according to the error status presented to the MAC + Client. + + A frame that is counted by an instance of this object + is also counted by the corresponding instance of + 'in-errors' leaf defined in the ietf-interfaces YANG + module (IETF RFC 8343)."; + leaf in-total-frames { + type yang:counter64; + units "frames"; + description + "The total number of frames (including bad frames) + received on the Ethernet interface. + + This counter is calculated by summing the following + IEEE Std 802.3, Clause 30 counters: + aFramesReceivedOK + + aFrameCheckSequenceErrors + + aAlignmentErrors + + aFrameTooLongErrors + + aFramesLostDueToIntMACRcvError"; + reference + "IEEE Std 802.3, Clause 30 counters, as specified + in the description above."; + } + leaf in-total-octets { + type yang:counter64; + units "octets"; + description + "The total number of octets of data (including those + in bad frames) received on the Ethernet interface. + + Includes the 4-octet FCS."; + reference + "IETF RFC 2819, etherStatsOctets"; + } + leaf in-frames { + type yang:counter64; + units "frames"; + description + "A count of frames (including unicast, multicast, and + broadcast) that have been successfully received on + the Ethernet interface. + + This count does not include frames received with + frame-too-long, FCS, length, or alignment errors, or + frames lost due to internal MAC sublayer error."; + reference + "IEEE Std 802.3, 30.3.1.1.5 aFramesReceivedOK"; + } + leaf in-multicast-frames { + type yang:counter64; + units "frames"; + description + "A count of multicast frames that have been + successfully received on the Ethernet interface. + + This counter represents a subset of the frames + counted by in-frames. + + This count does not include frames received with + frame-too-long, FCS, length, or alignment errors, or + frames lost due to internal MAC sublayer error."; + reference + "IEEE Std 802.3, 30.3.1.1.21 + aMulticastFramesReceivedOK"; + } + leaf in-broadcast-frames { + type yang:counter64; + units "frames"; + description + "A count of broadcast frames that have been + successfully received on the Ethernet interface. + + This counter represents a subset of the frames + counted by in-frames. + + This count does not include frames received with + frame-too-long, FCS, length, or alignment errors, or + frames lost due to internal MAC sublayer error."; + reference + "IEEE Std 802.3, 30.3.1.1.22 + aBroadcastFramesReceivedOK"; + } + leaf in-error-fcs-frames { + type yang:counter64; + units "frames"; + description + "A count of receive frames that are of valid length, + but do not pass the FCS check, regardless of whether + or not the frames are an integral number of octets + in length. + + This counter is calculated by summing the following + counters: + aFrameCheckSequenceErrors + + aAlignmentErrors"; + reference + "IEEE Std 802.3, 30.3.1.1.6 aFrameCheckSequenceErrors; + IEEE Std 802.3, 30.3.1.1.7 aAlignmentErrors"; + } + leaf in-error-undersize-frames { + type yang:counter64; + units "frames"; + status deprecated; + description + "Deprecated in-error-undersize-frames as not defined + in base standard. A count of frames received on a + particular Ethernet interface that are less than + 64 bytes in length, and are discarded. + + This counter is incremented regardless of whether + the frame passes the FCS check."; + reference + "IETF RFC 2819, etherStatsUndersizePkts and + etherStatsFragments"; + } + leaf in-error-oversize-frames { + type yang:counter64; + units "frames"; + description + "A count of frames received on a particular Ethernet + interface that exceed the maximum permitted frame + size, that is specified in max-frame-length, and are + discarded. + + This counter is incremented regardless of whether + the frame passes the FCS check."; + reference + "IEEE Std 802.3, 30.3.1.1.25 + aFrameTooLongErrors"; + } + leaf in-error-mac-internal-frames { + type yang:counter64; + units "frames"; + description + "A count of frames for which reception on a + particular Ethernet interface fails due to an + internal MAC sublayer receive error. + + A frame is only counted by an instance of this + object if it is not counted by the corresponding + instance of either the in-error-fcs-frames, + in-error-undersize-frames, or + in-error-oversize-frames. The precise meaning of + the count represented by an instance of this object + is implementation-specific. + + In particular, an instance of this object may + represent a count of receive errors on a particular + Ethernet interface that are not otherwise counted."; + reference + "IEEE Std 802.3, 30.3.1.1.15 + aFramesLostDueToIntMACRcvError"; + } + leaf out-frames { + type yang:counter64; + units "frames"; + description + "A count of frames (including unicast, multicast, and + broadcast) that have been successfully transmitted + on the Ethernet interface."; + reference + "IEEE Std 802.3, 30.3.1.1.2 aFramesTransmittedOK"; + } + leaf out-multicast-frames { + type yang:counter64; + units "frames"; + description + "A count of multicast frames that have been + successfully transmitted on the Ethernet interface. + + This counter represents a subset of the frames + counted by out-frames."; + reference + "IEEE Std 802.3, 30.3.1.1.18 + aMulticastFramesXmittedOK"; + } + leaf out-broadcast-frames { + type yang:counter64; + units "frames"; + description + "A count of broadcast frames that have been + successfully transmitted on the Ethernet interface. + + This counter represents a subset of the frames + counted by out-frames."; + reference + "IEEE Std 802.3, 30.3.1.1.19 + aBroadcastFramesXmittedOK"; + } + leaf out-error-mac-internal-frames { + type yang:counter64; + units "frames"; + description + "A count of frames for which transmission on a + particular Ethernet interface fails due to an + internal MAC sublayer transmit error. + + The precise meaning of the count represented by an + instance of this object is implementation-specific. + In particular, an instance of this object may + represent a count of transmission errors on a + particular Ethernet interface that are not otherwise + counted."; + reference + "IEEE Std 802.3, 30.3.1.1.12 + aFramesLostDueToIntMACXmitError"; + } + } + container phy { + description + "Ethernet statistics related to the PHY layer."; + leaf in-error-symbol { + type yang:counter64; + units "errors"; + description + "A count of the number of symbol errors that have + occurred. + + For the precise definition of when the symbol error + counter is incremented, please see the 'description' + text associated with aSymbolErrorDuringCarrier, + specified in IEEE Std 802.3, 30.3.2.1.5."; + reference + "IEEE Std 802.3, 30.3.2.1.5 + aSymbolErrorDuringCarrier"; + } + container lpi { + description + "Physical Ethernet statistics for the energy + efficiency related low power idle indications."; + leaf in-lpi-transitions { + type yang:counter64; + units "transitions"; + description + "The number of times the link partner transitioned to + Low Power Idle. + This counter has a maximum per second increment rate + of: + 50 thousand for 100 Mb/s; + 90 thousand for 1000 Mb/s + 230 thousand for 10 Gb/s."; + reference + "IEEE Std 802.3, 30.3.2.1.11 + aReceiveLPITransitions"; + } + leaf in-lpi-time { + type decimal64 { + fraction-digits 6; + } + units "seconds"; + description + "The amount of time the link partner has + been in Low Power Idle."; + reference + "IEEE Std 802.3, 30.3.2.1.9 + aReceiveLPIMicroseconds"; + } + leaf out-lpi-transitions { + type yang:counter64; + units "transitions"; + description + "The number of times this port transitioned to + Low Power Idle. + This counter has a maximum per second increment rate + of: + 50 thousand for 100 Mb/s; + 90 thousand for 1000 Mb/s + 230 thousand for 10 Gb/s."; + reference + "IEEE Std 802.3, 30.3.2.1.10 + aTransmitLPITransitions"; + } + leaf out-lpi-time { + type decimal64 { + fraction-digits 6; + } + units "seconds"; + description + "The amount of time in this port has + been in Low Power Idle."; + reference + "IEEE Std 802.3, 30.3.2.1.8 + aTransmitLPIMicroseconds"; + } + } + } + container mac-control { + description + "A group of statistics specific to MAC Control + operation of selected Ethernet interfaces."; + reference + "IEEE Std 802.3.1, dot3ExtensionTable"; + leaf in-frames-mac-control-unknown { + type yang:counter64; + units "frames"; + description + "A count of MAC Control frames with an unsupported + opcode received on this Ethernet interface. + + Frames counted against this counter are also counted + against in-discards defined in the ietf-interfaces + YANG module (IETF RFC 8343)."; + reference + "IEEE Std 802.3, 30.3.3.5 + aUnsupportedOpcodesReceived"; + } + leaf in-frames-mac-control-extension { + type yang:counter64; + units "frames"; + description + "The count of Extension MAC Control frames received + on this Ethernet interface."; + reference + "IEEE Std 802.3, 30.3.8.2 + aEXTENSIONMACCtrlFramesReceived"; + } + leaf out-frames-mac-control-extension { + type yang:counter64; + units "frames"; + description + "The count of Extension MAC Control frames + transmitted on this Ethernet interface."; + reference + "IEEE Std 802.3, 30.3.8.1 + aEXTENSIONMACCtrlFramesTransmitted"; + } + } + } + } + } +} diff --git a/src/confd/yang/confd/ieee802-ethernet-phy-type@2025-09-10.yang b/src/confd/yang/confd/ieee802-ethernet-phy-type@2025-09-10.yang new file mode 100644 index 000000000..c32562c49 --- /dev/null +++ b/src/confd/yang/confd/ieee802-ethernet-phy-type@2025-09-10.yang @@ -0,0 +1,2955 @@ +module ieee802-ethernet-phy-type { + yang-version 1.1; + namespace "urn:ieee:std:802.3:yang:ieee802-ethernet-phy-type"; + prefix ieee802-eth-phy-type; + + organization + "IEEE Std 802.3 Ethernet Working Group + Web URL: http://www.ieee802.org/3/"; + contact + "Web URL: http://www.ieee802.org/3/"; + description + "This module contains YANG definitions for Physical Layer device + (PHY) and Physical Medium Dependent (PMD) identities and related + types."; + + revision 2025-09-10 { + description + "Initial revision derived from IANA-MAU-MIB REVISION + 202309070000Z using smidump."; + reference + "IEEE Std 802.3-2022, unless dated explicitly"; + } + + /* PHY type identities */ + + identity phy-type { + description + "Base type for PHY types."; + reference + "IEEE Std 802.3, 30.3.2.1.2 aPhyType"; + } + + identity phy-type-other { + base phy-type; + description + "Undefined"; + } + + identity phy-type-unknown { + base phy-type; + description + "Initializing, true state or type not yet known"; + } + + identity phy-type-none { + base phy-type; + description + "MII present and nothing connected"; + } + + identity phy-type-10BASE-T { + base phy-type; + description + "Clause 14 10 Mb/s PAM3"; + } + + identity phy-type-10BASE-T1L { + base phy-type; + description + "Clause 146 10 Mb/s PAM3"; + } + + identity phy-type-10BASE-T1S { + base phy-type; + description + "Clause 147 10 Mb/s DME"; + } + + identity phy-type-100BASE-T1 { + base phy-type; + description + "Clause 96 100 Mb/s PAM3"; + } + + identity phy-type-100BASE-X { + base phy-type; + description + "Clause 24 or subclause 66.1 100 Mb/s 4B/5B"; + } + + identity phy-type-1000BASE-H { + base phy-type; + description + "Clause 115 1000 Mb/s PAM16-THP"; + } + + identity phy-type-1000BASE-T { + base phy-type; + description + "Clause 40 1000 Mb/s 4D-PAM5"; + } + + identity phy-type-1000BASE-T1 { + base phy-type; + description + "Clause 97 1000 Mb/s PAM3"; + } + + identity phy-type-1000BASE-X { + base phy-type; + description + "Clause 36 or subclause 66.2 1000 Mb/s 8B/10B"; + } + + identity phy-type-2.5GBASE-T { + base phy-type; + description + "Clause 126 2.5 Gb/s PAM16"; + } + + identity phy-type-2.5GBASE-T1 { + base phy-type; + description + "Clause 149 2.5 Gb/s PAM4"; + } + + identity phy-type-2.5GBASE-X { + base phy-type; + description + "Clause 127 2.5 Gb/s 8B/10B"; + } + + identity phy-type-5GBASE-R { + base phy-type; + description + "Clause 129 5 Gb/s 64/66B"; + } + + identity phy-type-5GBASE-T { + base phy-type; + description + "Clause 126 5 Gb/s PAM16"; + } + + identity phy-type-5GBASE-T1 { + base phy-type; + description + "Clause 149 5 Gb/s PAM4"; + } + + identity phy-type-10G-1GBASE-PRX { + base phy-type; + description + "Clause 76 10/1G-EPON 10 Gb/s 64B/66B downstream and + 1 Gb/s 8B/10B upstream"; + } + + identity phy-type-10GBASE-PR { + base phy-type; + description + "Clause 76 10/10G-EPON 10 Gb/s 64B/66B"; + } + + identity phy-type-10GBASE-R { + base phy-type; + description + "Clause 49 10 Gb/s 64B/66B"; + } + + identity phy-type-10GBASE-T { + base phy-type; + description + "Clause 55 10 Gb/s DSQ128"; + } + + identity phy-type-10GBASE-T1 { + base phy-type; + description + "Clause 149 10 Gb/s PAM4"; + } + + identity phy-type-10GBASE-X { + base phy-type; + description + "Clause 48 10 Gb/s 4 lane 8B/10B"; + } + + identity phy-type-10GPASS-XR { + base phy-type; + description + "Clause 101 PCS up to 10 Gb/s 64B/66B OFDM downstream + and up to 1.6 Gb/s 64B/66B OFDMA upstream"; + } + + identity phy-type-10G-2p5GGBASE-SP { + base phy-type; + description + "Subclause 164.3 10 Gb/s downstream and 2.5 Gb/s upstream + 256B/257B"; + } + + identity phy-type-10GBASE-SP { + base phy-type; + description + "Subclause 164.3 10 Gb/s 256B/257B"; + } + + identity phy-type-25G-10GBASE-PQ { + base phy-type; + description + "Clause 142 25/10G-EPON 256B/257B"; + } + + identity phy-type-25GBASE-PQ { + base phy-type; + description + "Clause 142 25/25G-EPON 256B/257B"; + } + + identity phy-type-25GBASE-R { + base phy-type; + description + "Clause 107 25 Gb/s 64B/66B"; + } + + identity phy-type-25GBASE-T { + base phy-type; + description + "Clause 113 25 Gb/s DSQ128"; + } + + identity phy-type-40GBASE-R { + base phy-type; + description + "Clause 82 40 Gb/s multi-PCS lane 64B/66B"; + } + + identity phy-type-40GBASE-T { + base phy-type; + description + "Clause 113 40 Gb/s DSQ128"; + } + + identity phy-type-50G-10GBASE-PQ { + base phy-type; + description + "Clause 142 50/10G-EPON 256B/257B"; + } + + identity phy-type-50G-25GBASE-PQ { + base phy-type; + description + "Clause 142 50/25G-EPON 256B/257B"; + } + + identity phy-type-50GBASE-PQ { + base phy-type; + description + "Clause 142 50/50G-EPON 256B/257B"; + } + + identity phy-type-50GBASE-R { + base phy-type; + description + "Clause 133 50 Gb/s multi-PCS lane 64B/66B"; + } + + identity phy-type-100GBASE-P { + base phy-type; + description + "Clause 82 100 Gb/s multi-PCS lane using >2-level PAM"; + } + + identity phy-type-100GBASE-R { + base phy-type; + description + "Clause 82 100 Gb/s multi-PCS lane using 2-level PAM"; + } + + identity phy-type-200GBASE-R { + base phy-type; + description + "Clause 119 200 Gb/s multi-PCS lane 64B/66B"; + } + + identity phy-type-400GBASE-R { + base phy-type; + description + "Clause 119 400 Gb/s multi-PCS lane 64B/66B"; + } + + identity phy-type-800GBASE-R { + base phy-type; + description + "Clause 172 800 Gb/s multi-PCS lane 64B/66B"; + } + + /* PMD identities */ + + identity pmd-type { + description + "Base type for Physical Medium Dependent (PMD) sublayer types."; + reference + "IEEE Std 802.3, 30.5.1.1.2 aMAUType"; + } + + identity pmd-type-global { + base pmd-type; + description + "Undefined"; + } + + identity pmd-type-other { + base pmd-type; + description + "Nonconformant PMD."; + } + + identity pmd-type-unknown { + base pmd-type; + description + "Initializing, true state or type not yet known."; + } + + identity pmd-type-10BASE-T { + base pmd-type; + description + "Twisted-pair cabling MAU as specified in Clause 14"; + } + + identity pmd-type-10BASE-T1L { + base pmd-type; + description + "Single balanced pair PHY as specified in Clause 146"; + } + + identity pmd-type-10BASE-T1S { + base pmd-type; + description + "Single balanced pair PHY as specified in Clause 147, full + duplex mode"; + } + + identity pmd-type-10BASE-T1SMD { + base pmd-type; + description + "Single balanced pair PHY as specified in Clause 147, + multidrop mode"; + } + + identity pmd-type-100BASE-BX10D { + base pmd-type; + description + "One single-mode fiber OLT PHY as specified in Clause 58"; + } + + identity pmd-type-100BASE-BX10U { + base pmd-type; + description + "One single-mode fiber ONU PHY as specified in Clause 58"; + } + + identity pmd-type-100BASE-FX { + base pmd-type; + description + "100BASE-FX PMD as specified in Clause 26"; + } + + identity pmd-type-100BASE-LX10 { + base pmd-type; + description + "Two fiber PHY as specified in Clause 58"; + } + + identity pmd-type-100BASE-T1 { + base pmd-type; + description + "Single balanced twisted-pair copper cabling PHY as specified + in Clause 96"; + } + + identity pmd-type-100BASE-TX { + base pmd-type; + description + "Two-pair Category 5 twisted-pair cabling as specified in + Clause 25"; + } + + identity pmd-type-1000BASE-BX10D { + base pmd-type; + description + "One single-mode fiber OLT PHY as specified in Clause 59"; + } + + identity pmd-type-1000BASE-BX10U { + base pmd-type; + description + "One single-mode fiber ONU PHY as specified in Clause 59"; + } + + identity pmd-type-1000BASE-KX { + base pmd-type; + description + "1000BASE-KX PCS/PMA over an electrical backplane PMD as + specified in Clause 70"; + } + + identity pmd-type-1000BASE-LX { + base pmd-type; + description + "1000BASE-LX fiber over long-wavelength laser PMD as specified + in Clause 38"; + } + + identity pmd-type-1000BASE-LX10 { + base pmd-type; + description + "Two fiber 10 km PHY as specified in Clause 59"; + } + + identity pmd-type-1000BASE-PX10-D { + base pmd-type; + description + "One single-mode fiber OMP OLT PHY, as specified in Clause 60, + supporting a distance of at least 10 km, and a split of at + least 1:16"; + } + + identity pmd-type-1000BASE-PX10-U { + base pmd-type; + description + "One single-mode fiber OMP ONU PHY, as specified in Clause 60, + supporting a distance of at least 10 km, and a split of at + least 1:16"; + } + + identity pmd-type-1000BASE-PX20-D { + base pmd-type; + description + "One single-mode fiber OMP OLT PHY, as specified in Clause 60, + supporting a distance of at least 20 km, and a split of at + least 1:16"; + } + + identity pmd-type-1000BASE-PX20-U { + base pmd-type; + description + "One single-mode fiber OMP ONU PHY, as specified in Clause 60, + supporting a distance of at least 20 km, and a split of at + least 1:16"; + } + + identity pmd-type-1000BASE-PX30-D { + base pmd-type; + description + "One single-mode fiber OMP OLT PHY, as specified in Clause 60, + supporting a distance of at least 20 km, and a split of at + least 1:32"; + } + + identity pmd-type-1000BASE-PX30-U { + base pmd-type; + description + "One single-mode fiber OMP ONU PHY, as specified in Clause 60, + supporting a distance of at least 20 km, and a split of at + least 1:32"; + } + + identity pmd-type-1000BASE-PX40-D { + base pmd-type; + description + "One single-mode fiber OMP OLT PHY as specified in Clause 60, + supporting a distance of at least 20 km, and a split of at + least 1:64"; + } + + identity pmd-type-1000BASE-PX40-U { + base pmd-type; + description + "One single-mode fiber OMP ONU PHY as specified in Clause 60, + supporting a distance of at least 20 km, and a split of at + least 1:64"; + } + + identity pmd-type-1000BASE-RHA { + base pmd-type; + description + "Plastic optical fiber PHY as specified in Clause 115."; + } + + identity pmd-type-1000BASE-RHB { + base pmd-type; + description + "Plastic optical fiber PHY as specified in Clause 115."; + } + + identity pmd-type-1000BASE-RHC { + base pmd-type; + description + "Plastic optical fiber PHY as specified in Clause 115."; + } + + identity pmd-type-1000BASE-SX { + base pmd-type; + description + "1000BASE-SX fiber over short-wavelength laser PMD as + specified in Clause 38"; + } + + identity pmd-type-1000BASE-T { + base pmd-type; + description + "Four-pair Category 5 twisted-pair cabling PHY as specified in + Clause 40"; + } + + identity pmd-type-1000BASE-T1 { + base pmd-type; + description + "Single twisted-pair copper cable PHY as specified in Clause + 97"; + } + + identity pmd-type-1000BASE-X { + base pmd-type; + description + "1000BASE-X PCS/PMA as specified in Clause 36 over undefined + PMD"; + } + + identity pmd-type-2.5GBASE-KX { + base pmd-type; + description + "2.5GBASE-X PMD as specified in Clause 128 over an electrical + backplane as specified in Clause 128"; + } + + identity pmd-type-2.5GBASE-T { + base pmd-type; + description + "Four-pair twisted-pair balanced copper cabling PHY as + specified in Clause 126"; + } + + identity pmd-type-2.5GBASE-T1 { + base pmd-type; + description + "Single balanced pair of conductors PHY as specified in Clause + 149"; + } + + identity pmd-type-2.5GBASE-X { + base pmd-type; + description + "2.5GBASE-X PCS/PMA as specified in Clause 127 over undefined + PMD"; + } + + identity pmd-type-5GBASE-KR { + base pmd-type; + description + "5GBASE-KR PMD as specified in Clause 130 over an electrical + backplane as specified in Clause 130"; + } + + identity pmd-type-5GBASE-R { + base pmd-type; + description + "5GBASE-R PCS/PMA as specified in Clause 129 over undefined + PMD"; + } + + identity pmd-type-5GBASE-T { + base pmd-type; + description + "Four-pair twisted-pair balanced copper cabling PHY as + specified in Clause 126"; + } + + identity pmd-type-5GBASE-T1 { + base pmd-type; + description + "Single balanced pair of conductors PHY as specified in Clause + 149"; + } + + identity pmd-type-10G-1GBASE-PRX-D1 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream OLT PHY as specified in Clause 75"; + } + + identity pmd-type-10G-1GBASE-PRX-D2 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream OLT PHY as specified in Clause 75"; + } + + identity pmd-type-10G-1GBASE-PRX-D3 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream OLT PHY as specified in Clause 75"; + } + + identity pmd-type-10G-1GBASE-PRX-D4 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream OLT PHY as specified in Clause 75"; + } + + identity pmd-type-10G-1GBASE-PRX-U1 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream ONU PHY as specified in Clause 75"; + } + + identity pmd-type-10G-1GBASE-PRX-U2 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream ONU PHY as specified in Clause 75"; + } + + identity pmd-type-10G-1GBASE-PRX-U3 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream ONU PHY as specified in Clause 75"; + } + + identity pmd-type-10G-1GBASE-PRX-U4 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream ONU PHY as specified in Clause 75"; + } + + identity pmd-type-10GBASE-BR10-D { + base pmd-type; + description + "One single-mode fiber OLT PHY supporting a distance of at + least 10 km as specified in Clause 158"; + } + + identity pmd-type-10GBASE-BR10-U { + base pmd-type; + description + "One single-mode fiber ONU PHY supporting a distance of at + least 10 km as specified in Clause 158"; + } + + identity pmd-type-10GBASE-BR20-D { + base pmd-type; + description + "One single-mode fiber OLT PHY supporting a distance of at + least 20 km as specified in Clause 158"; + } + + identity pmd-type-10GBASE-BR20-U { + base pmd-type; + description + "One single-mode fiber ONU PHY supporting a distance of at + least 20 km as specified in Clause 158"; + } + + identity pmd-type-10GBASE-BR40-D { + base pmd-type; + description + "One single-mode fiber OLT PHY supporting a distance of at + least 40 km as specified in Clause 158"; + } + + identity pmd-type-10GBASE-BR40-U { + base pmd-type; + description + "One single-mode fiber ONU PHY supporting a distance of at + least 40 km as specified in Clause 158"; + } + + identity pmd-type-10GBASE-CX4 { + base pmd-type; + description + "10GBASE-CX4 copper over 8 pair 100-Ohm balanced cable as + specified in Clause 54"; + } + + identity pmd-type-10GBASE-ER { + base pmd-type; + description + "10GBASE-ER fiber over 1550nm optics as specified in Clause 52"; + } + + identity pmd-type-10GBASE-EW { + base pmd-type; + description + "10GBASE-EW fiber over 1550nm optics as specified in Clause 52"; + } + + identity pmd-type-10GBASE-KR { + base pmd-type; + description + "10GBASE-KR PCS/PMA over an electrical backplane PMD as + specified in Clause 72"; + } + + identity pmd-type-10GBASE-KX4 { + base pmd-type; + description + "10GBASE-KX4 PCS/PMA over an electrical backplane PMD as + specified in Clause 71"; + } + + identity pmd-type-10GBASE-LR { + base pmd-type; + description + "10GBASE-LR fiber over 1310nm optics as specified in Clause 52"; + } + + identity pmd-type-10GBASE-LRM { + base pmd-type; + description + "10GBASE-LRM fiber over 1310 nm optics as specified in + Clause 68"; + } + + identity pmd-type-10GBASE-LW { + base pmd-type; + description + "10GBASE-LW fiber over 1310nm optics as specified in Clause 52"; + } + + identity pmd-type-10GBASE-LX4 { + base pmd-type; + description + "10GBASE-LX4 fiber over 4 lane 1310nm optics as specified in + Clause 53"; + } + + identity pmd-type-10GBASE-PR-D1 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream OLT PHY as specified in Clause 75"; + } + + identity pmd-type-10GBASE-PR-D2 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream OLT PHY as specified in Clause 75"; + } + + identity pmd-type-10GBASE-PR-D3 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream OLT PHY as specified in Clause 75"; + } + + identity pmd-type-10GBASE-PR-D4 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream OLT PHY as specified in Clause 75"; + } + + identity pmd-type-10GBASE-PR-U1 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream ONU PHY as specified in Clause 75"; + } + + identity pmd-type-10GBASE-PR-U3 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream ONU PHY as specified in Clause 75"; + } + + identity pmd-type-10GBASE-PR-U4 { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 1.25 GBd burst mode upstream ONU PHY as specified in Clause 75"; + } + + identity pmd-type-10GBASE-R { + base pmd-type; + description + "10GBASE-R PCS/PMA as specified in Clause 49 over undefined + PMD"; + } + + identity pmd-type-10GBASE-SR { + base pmd-type; + description + "10GBASE-SR fiber over 850nm optics as specified in Clause 52"; + } + + identity pmd-type-10GBASE-SW { + base pmd-type; + description + "10GBASE-SW fiber over 850nm optics as specified in Clause 52"; + } + + identity pmd-type-10GBASE-T { + base pmd-type; + description + "Four-pair twisted-pair balanced copper cabling PHY as + specified in Clause 55"; + } + + identity pmd-type-10GBASE-T1 { + base pmd-type; + description + "Single balanced pair of conductors PHY as specified in Clause + 149"; + } + + identity pmd-type-10GBASE-X { + base pmd-type; + description + "10GBASE-X PCS/PMA as specified in Clause 48 over undefined + PMD"; + } + + identity pmd-type-10GPASS-XR { + base pmd-type; + description + "Coax cable distribution network PHY continuous + downstream/burst mode upstream PHY as specified in Clause 100 + and Clause 101"; + } + + identity pmd-type-10G-2p5GGBASE-SP1-Dx { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 2.578125 GBd burst mode upstream OLT PHY supporting + channel x of FSR set 1, as specified in 164.2,"; + } + + identity pmd-type-10G-2p5GGBASE-SP1-Uxy { + base pmd-type; + description + "One single-mode fiber 10.3125 GBd continuous downstream / + 2.578125 GBd burst mode upstream ONU PHY supporting + channels x to y of FSR set 1, as specified in 164.2"; + } + + identity pmd-type-10GBASE-SP { + base pmd-type; + description + "Subclause 164.3 10 Gb/s 256B/257B"; + } + + identity pmd-type-25G-10GBASE-PQG-D2 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous + transmission / 1 x 10.3125 GBd burst mode reception, medium + power class, as specified in Clause 141"; + } + + identity pmd-type-25G-10GBASE-PQG-D3 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous + transmission / 1 x 10.3125 GBd burst mode reception, high + power class, as specified in Clause 141"; + } + + identity pmd-type-25G-10GBASE-PQG-U2 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous reception + / 1 x 10.3125 GBd burst mode transmission, medium power class, + as specified in Clause 141"; + } + + identity pmd-type-25G-10GBASE-PQG-U3 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous reception + / 1 x 10.3125 GBd burst mode transmission, high power class, + as specified in Clause 141"; + } + + identity pmd-type-25G-10GBASE-PQX-D2 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous + transmission / 1 x 10.3125 GBd burst mode reception, medium + power class, as specified in Clause 141"; + } + + identity pmd-type-25G-10GBASE-PQX-D3 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous + transmission / 1 x 10.3125 GBd burst mode reception, high + power class, as specified in Clause 141"; + } + + identity pmd-type-25G-10GBASE-PQX-U2 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous reception + / 1 x 10.3125 GBd burst mode transmission, medium power class, + as specified in Clause 141"; + } + + identity pmd-type-25G-10GBASE-PQX-U3 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous reception + / 1 x 10.3125 GBd burst mode transmission, high power class, + as specified in Clause 141"; + } + + identity pmd-type-25GBASE-BR10-D { + base pmd-type; + description + "One single-mode fiber OLT PHY supporting a distance of at + least 10 km as specified in Clause 159"; + } + + identity pmd-type-25GBASE-BR10-U { + base pmd-type; + description + "One single-mode fiber ONU PHY supporting a distance of at + least 10 km as specified in Clause 159"; + } + + identity pmd-type-25GBASE-BR20-D { + base pmd-type; + description + "One single-mode fiber OLT PHY supporting a distance of at + least 20 km as specified in Clause 159"; + } + + identity pmd-type-25GBASE-BR20-U { + base pmd-type; + description + "One single-mode fiber ONU PHY supporting a distance of at + least 20 km as specified in Clause 159"; + } + + identity pmd-type-25GBASE-BR40-D { + base pmd-type; + description + "One single-mode fiber OLT PHY supporting a distance of at + least 40 km as specified in Clause 159"; + } + + identity pmd-type-25GBASE-BR40-U { + base pmd-type; + description + "One single-mode fiber ONU PHY supporting a distance of at + least 40 km as specified in Clause 159"; + } + + identity pmd-type-25GBASE-CR { + base pmd-type; + description + "25GBASE-R PCS/PMA over shielded balanced copper cable PMD as + specified in Clause 110"; + } + + identity pmd-type-25GBASE-CR-S { + base pmd-type; + description + "25GBASE-R PCS/PMA over shielded balanced copper cable PMD as + specified in Clause 110 without support for RS-FEC "; + } + + identity pmd-type-25GBASE-ER { + base pmd-type; + description + "25GBASE-R PCS/PMA over single-mode fiber PMD, with extended + reach, as specified in Clause 114"; + } + + identity pmd-type-25GBASE-KR { + base pmd-type; + description + "25GBASE-R PCS/PMA over an electrical backplane PMD as + specified in Clause 111"; + } + + identity pmd-type-25GBASE-KR-S { + base pmd-type; + description + "25GBASE-R PCS/PMA over an electrical backplane PMD as + specified in Clause 111 without support for RS-FEC"; + } + + identity pmd-type-25GBASE-LR { + base pmd-type; + description + "25GBASE-R PCS/PMA over single-mode fiber PMD, with long + reach, as specified in Clause 114"; + } + + identity pmd-type-25GBASE-PQG-D2 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous + transmission / 1 x 25.78125 GBd burst mode reception, medium + power class, as specified in Clause 141"; + } + + identity pmd-type-25GBASE-PQG-D3 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous + transmission / 1 x 25.78125 GBd burst mode reception, high + power class, as specified in Clause 141"; + } + + identity pmd-type-25GBASE-PQG-U2 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous reception + / 1 x 25.78125 GBd burst mode transmission, medium power + class, as specified in Clause 141"; + } + + identity pmd-type-25GBASE-PQG-U3 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous reception + / 1 x 25.78125 GBd burst mode transmission, high power class, + as specified in Clause 141"; + } + + identity pmd-type-25GBASE-PQX-D2 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous + transmission / 1 x 25.78125 GBd burst mode reception, medium + power class, as specified in Clause 141"; + } + + identity pmd-type-25GBASE-PQX-D3 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous + transmission / 1 x 25.78125 GBd burst mode reception, high + power class, as specified in Clause 141"; + } + + identity pmd-type-25GBASE-PQX-U2 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous reception + / 1 x 25.78125 GBd burst mode transmission, medium power + class, as specified in Clause 141"; + } + + identity pmd-type-25GBASE-PQX-U3 { + base pmd-type; + description + "One single mode fiber, 1 x 25.78125 GBd continuous reception + / 1 x 25.78125 GBd burst mode transmission, high power class, + as specified in Clause 141"; + } + + identity pmd-type-25GBASE-R { + base pmd-type; + description + "PCS as specified in Clause 107 with PMA as specified in + Clause 109 over undefined PMD"; + } + + identity pmd-type-25GBASE-SR { + base pmd-type; + description + "25GBASE-R PCS/PMA over multimode fiber PMD as specified in + Clause 112"; + } + + identity pmd-type-25GBASE-T { + base pmd-type; + description + "Four-pair twisted-pair balanced copper cabling PHY as + specified in Clause 113"; + } + + identity pmd-type-40GBASE-CR4 { + base pmd-type; + description + "40GBASE-R PCS/PMA over 4 lane shielded copper balanced cable + PMD as specified in Clause 85"; + } + + identity pmd-type-40GBASE-ER4 { + base pmd-type; + description + "40GBASE-R PCS/PMA over 4 WDM lane single mode fiber PMD, with + extended reach, as specified in Clause 87"; + } + + identity pmd-type-40GBASE-FR { + base pmd-type; + description + "40GBASE-R PCS/PMA over single mode fiber PMD as specified in + Clause 89"; + } + + identity pmd-type-40GBASE-KR4 { + base pmd-type; + description + "40GBASE-R PCS/PMA over an electrical backplane PMD as + specified in Clause 84"; + } + + identity pmd-type-40GBASE-LR4 { + base pmd-type; + description + "40GBASE-R PCS/PMA over 4 WDM lane single mode fiber PMD, with + long reach, as specified in Clause 87"; + } + + identity pmd-type-40GBASE-R { + base pmd-type; + description + "Multi-lane PCS as specified in Clause 82 over undefined + PMA/PMD"; + } + + identity pmd-type-40GBASE-SR4 { + base pmd-type; + description + "40GBASE-R PCS/PMA over 4 lane multimode fiber PMD as + specified in Clause 86"; + } + + identity pmd-type-40GBASE-T { + base pmd-type; + description + "Four-pair twisted-pair balanced copper cabling PHY as + specified in Clause 113"; + } + + identity pmd-type-50G-10GBASE-PQG-D2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 1 x 10.3125 GBd burst mode reception, medium + power class, as specified in Clause 141"; + } + + identity pmd-type-50G-10GBASE-PQG-D3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 1 x 10.3125 GBd burst mode reception, high + power class, as specified in Clause 141"; + } + + identity pmd-type-50G-10GBASE-PQG-U2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 1 x 10.3125 GBd burst mode transmission, medium power class, + as specified in Clause 141"; + } + + identity pmd-type-50G-10GBASE-PQG-U3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 1 x 10.3125 GBd burst mode transmission, high power class, + as specified in Clause 141"; + } + + identity pmd-type-50G-10GBASE-PQX-D2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 1 x 10.3125 GBd burst mode reception, medium + power class, as specified in Clause 141"; + } + + identity pmd-type-50G-10GBASE-PQX-D3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 1 x 10.3125 GBd burst mode reception, high + power class, as specified in Clause 141"; + } + + identity pmd-type-50G-10GBASE-PQX-U2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 1 x 10.3125 GBd burst mode transmission, medium power class, + as specified in Clause 141"; + } + + identity pmd-type-50G-10GBASE-PQX-U3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 1 x 10.3125 GBd burst mode transmission, high power class, + as specified in Clause 141"; + } + + identity pmd-type-50G-25GBASE-PQG-D2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 1 x 25.78125 GBd burst mode reception, medium + power class, as specified in Clause 141"; + } + + identity pmd-type-50G-25GBASE-PQG-D3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 1 x 25.78125 GBd burst mode reception, high + power class, as specified in Clause 141"; + } + + identity pmd-type-50G-25GBASE-PQG-U2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 1 x 25.78125 GBd burst mode transmission, medium power + class, as specified in Clause 141"; + } + + identity pmd-type-50G-25GBASE-PQG-U3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 1 x 25.78125 GBd burst mode transmission, high power class, + as specified in Clause 141"; + } + + identity pmd-type-50G-25GBASE-PQX-D2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 1 x 25.78125 GBd burst mode reception, medium + power class, as specified in Clause 141"; + } + + identity pmd-type-50G-25GBASE-PQX-D3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 1 x 25.78125 GBd burst mode reception, high + power class, as specified in Clause 141"; + } + + identity pmd-type-50G-25GBASE-PQX-U2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 1 x 25.78125 GBd burst mode transmission, medium power + class, as specified in Clause 141"; + } + + identity pmd-type-50G-25GBASE-PQX-U3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 1 x 25.78125 GBd burst mode transmission, high power class, + as specified in Clause 141"; + } + + identity pmd-type-50GBASE-BR10-D { + base pmd-type; + description + "One single-mode fiber OLT PHY supporting a distance of at + least 10 km as specified in Clause 160"; + } + + identity pmd-type-50GBASE-BR10-U { + base pmd-type; + description + "One single-mode fiber ONU PHY supporting a distance of at + least 10 km as specified in Clause 160"; + } + + identity pmd-type-50GBASE-BR20-D { + base pmd-type; + description + "One single-mode fiber OLT PHY supporting a distance of at + least 20 km as specified in Clause 160"; + } + + identity pmd-type-50GBASE-BR20-U { + base pmd-type; + description + "One single-mode fiber ONU PHY supporting a distance of at + least 20 km as specified in Clause 160"; + } + + identity pmd-type-50GBASE-BR40-D { + base pmd-type; + description + "One single-mode fiber OLT PHY supporting a distance of at + least 40 km as specified in Clause 160"; + } + + identity pmd-type-50GBASE-BR40-U { + base pmd-type; + description + "One single-mode fiber ONU PHY supporting a distance of at + least 40 km as specified in Clause 160"; + } + + identity pmd-type-50GBASE-CR { + base pmd-type; + description + "50GBASE-R PCS/PMA over shielded copper balanced cable PMD as + specified in Clause 136 "; + } + + identity pmd-type-50GBASE-ER { + base pmd-type; + description + "50GBASE-R PCS/PMA over single-mode fiber PMD with reach up to + at least 40 km as specified in Clause 139"; + } + + identity pmd-type-50GBASE-FR { + base pmd-type; + description + "50GBASE-R PCS/PMA over single mode fiber PMD as specified in + Clause 139"; + } + + identity pmd-type-50GBASE-KR { + base pmd-type; + description + "50GBASE-R PCS/PMA over an electrical backplane PMD as + specified in Clause 137"; + } + + identity pmd-type-50GBASE-LR { + base pmd-type; + description + "50GBASE-R PCS/PMA over single mode fiber PMD as specified in + Clause 139"; + } + + identity pmd-type-50GBASE-PQG-D2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 2 x 25.78125 GBd burst mode reception, medium + power class, as specified in Clause 141"; + } + + identity pmd-type-50GBASE-PQG-D3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 2 x 25.78125 GBd burst mode reception, high + power class, as specified in Clause 141"; + } + + identity pmd-type-50GBASE-PQG-U2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 2 x 25.78125 GBd burst mode transmission, medium power + class, as specified in Clause 141"; + } + + identity pmd-type-50GBASE-PQG-U3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 2 x 25.78125 GBd burst mode transmission, high power class, + as specified in Clause 141"; + } + + identity pmd-type-50GBASE-PQX-D2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 2 x 25.78125 GBd burst mode reception, medium + power class, as specified in Clause 141"; + } + + identity pmd-type-50GBASE-PQX-D3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous + transmission / 2 x 25.78125 GBd burst mode reception, high + power class, as specified in Clause 141"; + } + + identity pmd-type-50GBASE-PQX-U2 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 2 x 25.78125 GBd burst mode transmission, medium power + class, as specified in Clause 141"; + } + + identity pmd-type-50GBASE-PQX-U3 { + base pmd-type; + description + "One single mode fiber, 2 x 25.78125 GBd continuous reception + / 2 x 25.78125 GBd burst mode transmission, high power class, + as specified in Clause 141"; + } + + identity pmd-type-50GBASE-R { + base pmd-type; + description + "Multi-lane PCS as specified in Clause 133 with PMA as + specified in Clause 135 over undefined PMD"; + } + + identity pmd-type-50GBASE-SR { + base pmd-type; + description + "50GBASE-R PCS/PMA over multimode fiber PMD as specified in + Clause 138"; + } + + identity pmd-type-100GBASE-CR1 { + base pmd-type; + description + "100GBASE-CR1 as specified in Clause 162 or 100GBASE-KR1 as + specified in Clause 163"; + } + + identity pmd-type-100GBASE-CR2 { + base pmd-type; + description + "100GBASE-R PCS/PMA over 2 lane shielded copper balanced cable + PMD as specified in Clause 136"; + } + + identity pmd-type-100GBASE-CR4 { + base pmd-type; + description + "100GBASE-R PCS/PMA over 4 lane shielded copper balanced cable + PMD as specified in Clause 92"; + } + + identity pmd-type-100GBASE-CR10 { + base pmd-type; + description + "100GBASE-R PCS/PMA over 10 lane shielded copper balanced + cable PMD as specified in Clause 85"; + } + + identity pmd-type-100GBASE-DR { + base pmd-type; + description + "100GBASE-R PCS/PMA over single mode fiber PMD as specified in + Clause 140"; + } + + identity pmd-type-100GBASE-ER4 { + base pmd-type; + description + "100GBASE-R PCS/PMA over 4 WDM lane single mode fiber PMD, + with extended reach, as specified in Clause 88"; + } + + identity pmd-type-100GBASE-FR1 { + base pmd-type; + description + "100GBASE-R PCS/PMA over single-mode fiber PMD with reach up + to at least 2 km as specified in Clause 140"; + } + + identity pmd-type-100GBASE-KP4 { + base pmd-type; + description + "100GBASE-P PCS/PMA over an electrical backplane PMD as + specified in Clause 94"; + } + + identity pmd-type-100GBASE-KR2 { + base pmd-type; + description + "100GBASE-R PCS/PMA over an electrical backplane PMD as + specified in Clause 137"; + } + + identity pmd-type-100GBASE-KR4 { + base pmd-type; + description + "100GBASE-R PCS/PMA over an electrical backplane PMD as + specified in Clause 93"; + } + + identity pmd-type-100GBASE-LR1 { + base pmd-type; + description + "100GBASE-R PCS/PMA over single-mode fiber PMD with reach up + to at least 10 km as specified in Clause 140"; + } + + identity pmd-type-100GBASE-LR4 { + base pmd-type; + description + "100GBASE-R PCS/PMA over 4 WDM lane single mode fiber PMD, + with long reach, as specified in Clause 88"; + } + + identity pmd-type-100GBASE-R { + base pmd-type; + description + "Multi-lane PCS as specified in Clause 82 over undefined + 100GBASE-R or 100GBASE-P PMA/PMD"; + } + + identity pmd-type-100GBASE-SR1 { + base pmd-type; + description + "100GBASE-R PCS/PMA over multimode fiber PMD with + reach up to at least 100 m as specified in Clause 167"; + } + + identity pmd-type-100GBASE-SR2 { + base pmd-type; + description + "100GBASE-R PCS/PMA over 2 lane multimode fiber PMD as + specified in Clause 138"; + } + + identity pmd-type-100GBASE-SR4 { + base pmd-type; + description + "100GBASE-R PCS/PMA over 4 lane multimode fiber PMD as + specified in Clause 95"; + } + + identity pmd-type-100GBASE-SR10 { + base pmd-type; + description + "100GBASE-R PCS/PMA over 10 lane multimode fiber PMD as + specified in Clause 86"; + } + + identity pmd-type-100GBASE-VR1 { + base pmd-type; + description + "100GBASE-R PCS/PMA over multimode fiber PMD with + reach up to at least 50 m as specified in Clause 167"; + } + + identity pmd-type-100GBASE-ZR { + base pmd-type; + description + "100GBASE-R PCS/100GBASE-ZR PMA over a PMD with reach up to at + least 80 km as specified in Clause 154"; + } + + identity pmd-type-200GBASE-CR2 { + base pmd-type; + description + "200GBASE-CR2 as specified in Clause 162 or 200GBASE-KR2 as + specified in Clause 163"; + } + + identity pmd-type-200GBASE-CR4 { + base pmd-type; + description + "200GBASE-R PCS/PMA over 4 lane shielded copper balanced cable + PMD as specified in Clause 136 "; + } + + identity pmd-type-200GBASE-DR4 { + base pmd-type; + description + "200GBASE-R PCS/PMA over 4-lane single-mode fiber PMD as + specified in Clause 121"; + } + + identity pmd-type-200GBASE-ER4 { + base pmd-type; + description + "200GBASE-R PCS/PMA over 4 WDM lane single-mode fiber PMD with + reach up to at least 40 km as specified in Clause 122"; + } + + identity pmd-type-200GBASE-FR4 { + base pmd-type; + description + "200GBASE-R PCS/PMA over 4 WDM lane single-mode fiber PMD with + reach up to at least 2 km as specified in Clause 122"; + } + + identity pmd-type-200GBASE-KR2 { + base pmd-type; + description + "200GBASE-R PCS/PMA over an electrical backplane PMD + as specified in Clause 163"; + } + + identity pmd-type-200GBASE-KR4 { + base pmd-type; + description + "200GBASE-R PCS/PMA over an electrical backplane PMD as + specified in Clause 137"; + } + + identity pmd-type-200GBASE-LR4 { + base pmd-type; + description + "200GBASE-R PCS/PMA over 4 WDM lane single-mode fiber PMD with + reach up to at least 10 km as specified in Clause 122"; + } + + identity pmd-type-200GBASE-R { + base pmd-type; + description + "Multi-lane PCS as specified in Clause 119 over undefined + PMA/PMD"; + } + + identity pmd-type-200GBASE-SR2 { + base pmd-type; + description + "200GBASE-R PCS/PMA over 2 lane multimode fiber PMD with + reach up to at least 100 m as specified in Clause 167"; + } + + identity pmd-type-200GBASE-SR4 { + base pmd-type; + description + "200GBASE-R PCS/PMA over 4 lane multimode fiber PMD as + specified in Clause 138"; + } + + identity pmd-type-200GBASE-VR2 { + base pmd-type; + description + "200GBASE-R PCS/PMA over 2 lane multimode fiber PMD with + reach up to at least 50 m as specified in Clause 167"; + } + + identity pmd-type-400GBASE-DR4 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 4-lane single-mode fiber PMD as + specified in Clause 124"; + } + + identity pmd-type-400GBASE-DR4-2 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 4 single-mode fibers in each + direction PMD with reach up to at least 2 km as specified + in Clause 124"; + } + + identity pmd-type-400GBASE-ER8 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 8 WDM lane single-mode fiber PMD with + reach up to at least 40 km as specified in Clause 122"; + } + + identity pmd-type-400GBASE-FR4 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 4 WDM lane single-mode fiber PMD with + reach up to at least 2 km as specified in Clause 151"; + } + + identity pmd-type-400GBASE-FR8 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 8 WDM lane single-mode fiber PMD with + reach up to at least 2 km as specified in Clause 122"; + } + + identity pmd-type-400GBASE-LR4-6 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 4 WDM lane single-mode fiber PMD with + reach up to at least 6 km as specified in Clause 151"; + } + + identity pmd-type-400GBASE-LR8 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 8 WDM lane single-mode fiber PMD with + reach up to at least 10 km as specified in Clause 122"; + } + + identity pmd-type-400GBASE-R { + base pmd-type; + description + "Multi-lane PCS as specified in Clause 119 over undefined + PMA/PMD"; + } + + identity pmd-type-400GBASE-SR4 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 4 lane multimode fiber PMD with + reach up to at least 100 m as specified in Clause 167"; + } + + identity pmd-type-400GBASE-SR4d2 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 8-lane multimode fiber PMD as + specified in Clause 150"; + } + + identity pmd-type-400GBASE-SR8 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 8-lane multimode fiber PMD as + specified in Clause 138"; + } + + identity pmd-type-400GBASE-SR16 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 16-lane multimode fiber PMD as + specified in Clause 123"; + } + + identity pmd-type-400GBASE-VR4 { + base pmd-type; + description + "400GBASE-R PCS/PMA over 4 lane multimode fiber PMD with + reach up to at least 50 m as specified in Clause 167"; + } + + identity pmd-type-800GBASE-CR8 { + base pmd-type; + description + "800GBASE-R PCS/PMA over 8-lane shielded balanced copper cable + PMD as specified in Clause 162"; + } + + identity pmd-type-800GBASE-DR8 { + base pmd-type; + description + "800GBASE-R PCS/PMA over 8 single-mode fibers in each + direction PMD with reach up to at least 500 m as specified + in Clause 124"; + } + + identity pmd-type-800GBASE-DR8-2 { + base pmd-type; + description + "800GBASE-R PCS/PMA over 8 single-mode fibers in each + direction PMD with reach up to at least 2 km as specified + in Clause 124"; + } + + identity pmd-type-800GBASE-KR8 { + base pmd-type; + description + "800GBASE-R PCS/PMA over an electrical backplane PMD as + specified in Clause 163"; + } + + identity pmd-type-800GBASE-R { + base pmd-type; + description + "Multi-lane PCS as specified in Clause 172 over + undefined PMA/PMD"; + } + + identity pmd-type-800GBASE-SR8 { + base pmd-type; + description + "800GBASE-R PCS/PMA over 8 multimode fibers in each + direction PMD with reach up to at least 100 m as specified + in Clause 167"; + } + + identity pmd-type-800GBASE-VR8 { + base pmd-type; + description + "800GBASE-R PCS/PMA over 8 multimode fibers in each + direction PMD with reach up to at least 50 m as specified + in Clause 167"; + } + + typedef pmd-type-list { + type bits { + /* 802.3-2022 */ + bit bOther { + description + "Other"; + } + bit b10baseT { + description + "10BASE-T"; + } + bit b10baseFL { + description + "10BASE-FL"; + } + bit b100baseTX { + description + "100BASE-TX"; + } + bit b100baseFX { + description + "100BASE-FX"; + } + bit b1000baseX { + description + "1000BASE-X"; + } + bit b1000baseLX { + description + "1000BASE-LX"; + } + bit b1000baseSX { + description + "1000BASE-SX"; + } + bit b1000baseCX { + description + "1000BASE-CX"; + } + bit b1000baseT { + description + "1000BASE-T"; + } + bit b10GbaseX { + description + "10GBASE-X"; + } + bit b10GbaseLX4 { + description + "10GBASE-LX4"; + } + bit b10GbaseR { + description + "10GBASE-R"; + } + bit b10GbaseER { + description + "10GBASE-ER"; + } + bit b10GbaseLR { + description + "10GBASE-LR"; + } + bit b10GbaseSR { + description + "10GBASE-SR"; + } + bit b10GbaseSW { + description + "10GBASE-SW"; + } + bit b10GbaseCX4 { + description + "10GBASE-CX4"; + } + bit b100BaseBX10D { + description + "100BASE-BX10D"; + } + bit b100BaseBX10U { + description + "100BASE-BX10U"; + } + bit b100BaseLX10 { + description + "100BASE-LX10"; + } + bit b1000BaseBX10D { + description + "1000BASE-BX10D"; + } + bit b1000BaseBX10U { + description + "1000BASE-BX10U"; + } + bit b1000BaseLX10 { + description + "1000BASE-LX10"; + } + bit b1000BasePX10D { + description + "1000BASE-PX10D"; + } + bit b1000BasePX10U { + description + "1000BASE-PX10U"; + } + bit b1000BasePX20D { + description + "1000BASE-PX20D"; + } + bit b1000BasePX20U { + description + "1000BASE-PX20U"; + } + bit b10GbaseT { + description + "10GBASE-T"; + } + bit b10GbaseLRM { + description + "10GBASE-LRM"; + } + bit b1000baseKX { + description + "1000BASE-KX"; + } + bit b10GbaseKX4 { + description + "10GBASE-KX4"; + } + bit b10GbaseKR { + description + "10GBASE-KR"; + } + bit b10G1GbasePRXD1 { + description + "10/1GBASE-PRXD1"; + } + bit b10G1GbasePRXD2 { + description + "10/1GBASE-PRXD2"; + } + bit b10G1GbasePRXD3 { + description + "10/1GBASE-PRXD3"; + } + bit b10G1GbasePRXU1 { + description + "10/1GBASE-PRXU1"; + } + bit b10G1GbasePRXU2 { + description + "10/1GBASE-PRXU2"; + } + bit b10G1GbasePRXU3 { + description + "10/1GBASE-PRXU3"; + } + bit b10GbasePRD1 { + description + "10GBASE-PRD1"; + } + bit b10GbasePRD2 { + description + "10GBASE-PRD2"; + } + bit b10GbasePRD3 { + description + "10GBASE-PRD3"; + } + bit b10GbasePRU1 { + description + "10GBASE-PRU1"; + } + bit b10GbasePRU3 { + description + "10GBASE-PRU3"; + } + bit b40GbaseKR4 { + description + "40GBASE-KR4"; + } + bit b40GbaseCR4 { + description + "40GBASE-CR4"; + } + bit b40GbaseSR4 { + description + "40GBASE-SR4"; + } + bit b40GbaseFR { + description + "40GBASE-FR"; + } + bit b40GbaseLR4 { + description + "40GBASE-LR4"; + } + bit b100GbaseCR10 { + description + "100GBASE-CR10"; + } + bit b100GbaseSR10 { + description + "100GBASE-SR10"; + } + bit b100GbaseLR4 { + description + "100GBASE-LR4"; + } + bit b100GbaseER4 { + description + "100GBASE-ER4"; + } + bit b1000baseT1 { + description + "1000BASE-T1"; + } + bit b1000basePX30D { + description + "1000BASE-PX30D"; + } + bit b1000basePX30U { + description + "1000BASE-PX30U"; + } + bit b1000basePX40D { + description + "1000BASE-PX40D"; + } + bit b1000basePX40U { + description + "1000BASE-PX40U"; + } + bit b10G1GbasePRXD4 { + description + "10/1GBASE-PRXD4"; + } + bit b10G1GbasePRXU4 { + description + "10/1GBASE-PRXU4"; + } + bit b10GbasePRD4 { + description + "10GBASE-PRD4"; + } + bit b10GbasePRU4 { + description + "10GBASE-PRU4"; + } + bit b25GbaseCR { + description + "25GBASE-CR"; + } + bit b25GbaseCRS { + description + "25GBASE-CRS"; + } + bit b25GbaseKR { + description + "25GBASE-KR"; + } + bit b25GbaseKRS { + description + "25GBASE-KRS"; + } + bit b25GbaseR { + description + "25GBASE-R"; + } + bit b25GbaseSR { + description + "25GBASE-SR"; + } + bit b25GbaseT { + description + "25GBASE-T"; + } + bit b40GbaseER4 { + description + "40GBASE-ER4"; + } + bit b40GbaseR { + description + "40GBASE-R"; + } + bit b40GbaseT { + description + "40GBASE-T"; + } + bit b100GbaseCR4 { + description + "100GBASE-CR4"; + } + bit b100GbaseKR4 { + description + "100GBASE-KR4"; + } + bit b100GbaseKP4 { + description + "100GBASE-KP4"; + } + bit b100GbaseR { + description + "100GBASE-R"; + } + bit b100GbaseSR4 { + description + "100GBASE-SR4"; + } + bit b2p5GbaseT { + description + "2.5GBASE-T"; + } + bit b5GbaseT { + description + "5GBASE-T"; + } + bit b100baseT1 { + description + "100BASE-T1"; + } + bit b1000baseRHA { + description + "1000BASE-RHA"; + } + bit b1000baseRHB { + description + "1000BASE-RHB"; + } + bit b1000baseRHC { + description + "1000BASE-RHC"; + } + bit b2p5GbaseKX { + description + "2.5GBASE-KX"; + } + bit b2p5GbaseX { + description + "2.5GBASE-X"; + } + bit b5GbaseKR { + description + "5GBASE-KR"; + } + bit b5GbaseR { + description + "5GBASE-R"; + } + bit b10GpassXR { + description + "10GPASS-XR"; + } + bit b25GbaseLR { + description + "25GBASE-LR"; + } + bit b25GbaseER { + description + "25GBASE-ER"; + } + bit b50GbaseR { + description + "50GBASE-R"; + } + bit b50GbaseCR { + description + "50GBASE-CR"; + } + bit b50GbaseKR { + description + "50GBASE-KR"; + } + bit b50GbaseSR { + description + "50GBASE-SR"; + } + bit b50GbaseFR { + description + "50GBASE-FR"; + } + bit b50GbaseLR { + description + "50GBASE-LR"; + } + bit b50GbaseER { + description + "50GBASE-ER"; + } + bit b100GbaseCR2 { + description + "100GBASE-CR2"; + } + bit b100GbaseKR2 { + description + "100GBASE-KR2"; + } + bit b100GbaseSR2 { + description + "100GBASE-SR2"; + } + bit b100GbaseDR { + description + "100GBASE-DR"; + } + bit b200GbaseR { + description + "200GBASE-R"; + } + bit b200GbaseDR4 { + description + "200GBASE-DR4"; + } + bit b200GbaseFR4 { + description + "200GBASE-FR4"; + } + bit b200GbaseLR4 { + description + "200GBASE-LR4"; + } + bit b200GbaseCR4 { + description + "200GBASE-CR4"; + } + bit b200GbaseKR4 { + description + "200GBASE-KR4"; + } + bit b200GbaseSR4 { + description + "200GBASE-SR4"; + } + bit b200GbaseER4 { + description + "200GBASE-ER4"; + } + bit b400GbaseR { + description + "400GBASE-R"; + } + bit b400GbaseSR16 { + description + "400GBASE-SR16"; + } + bit b400GbaseDR4 { + description + "400GBASE-DR4"; + } + bit b400GbaseFR8 { + description + "400GBASE-FR8"; + } + bit b400GbaseLR8 { + description + "400GBASE-LR8"; + } + bit b400GbaseER8 { + description + "400GBASE-ER8"; + } + bit b10baseT1L { + description + "10BASE-T1L"; + } + bit b10baseT1S { + description + "10BASE-T1S"; + } + bit b10baseT1SMD { + description + "10BASE-T1SMD"; + } + bit b100GbaseFR1 { + description + "100GBASE-FR1"; + } + bit b100GbaseLR1 { + description + "100GBASE-LR1"; + } + bit b100GBASE-CR1 { + description + "100GBASE-LR1"; + } + bit b400GbaseFR4 { + description + "400GBASE-FR4"; + } + bit b400GbaseLR46 { + description + "400GBASE-LR46"; + } + bit b400GbaseSR8 { + description + "400GBASE-SR8"; + } + bit b400GbaseSR4p2 { + description + "400GBASE-SR4p2"; + } + bit b2p5GbaseT1 { + description + "2.5GBASE-T1"; + } + bit b5GbaseT1 { + description + "5GBASE-T1"; + } + bit b10GbaseT1 { + description + "10GBASE-T1"; + } + bit b25G10GbasePQGD2 { + description + "25/10GBASE-PQGD2"; + } + bit b25G10GbasePQGD3 { + description + "25/10GBASE-PQGD3"; + } + bit b25G10GbasePQGU2 { + description + "25/10GBASE-PQGU2"; + } + bit b25G10GbasePQGU3 { + description + "25/10GBASE-PQGU3"; + } + bit b25G10GbasePQXD2 { + description + "25/10GBASE-PQXD2"; + } + bit b25G10GbasePQXD3 { + description + "25/10GBASE-PQXD3"; + } + bit b25G10GbasePQXU2 { + description + "25/10GBASE-PQXU2"; + } + bit b25G10GbasePQXU3 { + description + "25/10GBASE-PQXU3"; + } + bit b25GbasePQGD2 { + description + "25GBASE-PQGD2"; + } + bit b25GbasePQGD3 { + description + "25GBASE-PQGD3"; + } + bit b25GbasePQGU2 { + description + "25GBASE-PQGU2"; + } + bit b25GbasePQGU3 { + description + "25GBASE-PQGU3"; + } + bit b25GbasePQXD2 { + description + "25GBASE-PQXD2"; + } + bit b25GbasePQXD3 { + description + "25GBASE-PQXD3"; + } + bit b25GbasePQXU2 { + description + "25GBASE-PQXU2"; + } + bit b25GbasePQXU3 { + description + "25GBASE-PQXU3"; + } + bit b50G10GbasePQGD2 { + description + "50/10GBASE-PQGD2"; + } + bit b50G10GbasePQGD3 { + description + "50/10GBASE-PQGD3"; + } + bit b50G10GbasePQGU2 { + description + "50/10GBASE-PQGU2"; + } + bit b50G10GbasePQGU3 { + description + "50/10GBASE-PQGU3"; + } + bit b50G10GbasePQXD2 { + description + "50/10GBASE-PQXD2"; + } + bit b50G10GbasePQXD3 { + description + "50/10GBASE-PQXD3"; + } + bit b50G10GbasePQXU2 { + description + "50/10GBASE-PQXU2"; + } + bit b50G10GbasePQXU3 { + description + "50/10GBASE-PQXU3"; + } + bit b50G25GbasePQGD2 { + description + "50/25GBASE-PQGD2"; + } + bit b50G25GbasePQGD3 { + description + "50/25GBASE-PQGD3"; + } + bit b50G25GbasePQGU2 { + description + "50/25GBASE-PQGU2"; + } + bit b50G25GbasePQGU3 { + description + "50/25GBASE-PQGU3"; + } + bit b50G25GbasePQXD2 { + description + "50/25GBASE-PQXD2"; + } + bit b50G25GbasePQXD3 { + description + "50/25GBASE-PQXD3"; + } + bit b50G25GbasePQXU2 { + description + "50/25GBASE-PQXU2"; + } + bit b50G25GbasePQXU3 { + description + "50/25GBASE-PQXU3"; + } + bit b50GbasePQGD2 { + description + "50GBASE-PQGD2"; + } + bit b50GbasePQGD3 { + description + "50GBASE-PQGD3"; + } + bit b50GbasePQGU2 { + description + "50GBASE-PQGU2"; + } + bit b50GbasePQGU3 { + description + "50GBASE-PQGU3"; + } + bit b50GbasePQXD2 { + description + "50GBASE-PQXD2"; + } + bit b50GbasePQXD3 { + description + "50GBASE-PQXD3"; + } + bit b50GbasePQXU2 { + description + "50GBASE-PQXU2"; + } + bit b50GbasePQXU3 { + description + "50GBASE-PQXU3"; + } + bit b100GbaseZR { + description + "100GBASE-ZR"; + } + bit b10GbaseBR10D { + description + "10GBASE-BR10D"; + } + bit b10GbaseBR10U { + description + "10GBASE-BR10U"; + } + bit b10GbaseBR20D { + description + "10GBASE-BR20D"; + } + bit b10GbaseBR20U { + description + "10GBASE-BR20U"; + } + bit b10GbaseBR40D { + description + "10GBASE-BR40D"; + } + bit b10GbaseBR40U { + description + "10GBASE-BR40U"; + } + bit b25GbaseBR10D { + description + "25GBASE-BR10D"; + } + bit b25GbaseBR10U { + description + "25GBASE-BR10U"; + } + bit b25GbaseBR20D { + description + "25GBASE-BR20D"; + } + bit b25GbaseBR20U { + description + "25GBASE-BR20U"; + } + bit b25GbaseBR40D { + description + "25GBASE-BR40D"; + } + bit b25GbaseBR40U { + description + "25GBASE-BR40U"; + } + bit b50GbaseBR10D { + description + "50GBASE-BR10D"; + } + bit b50GbaseBR10U { + description + "50GBASE-BR10U"; + } + bit b50GbaseBR20D { + description + "50GBASE-BR20D"; + } + bit b50GbaseBR20U { + description + "50GBASE-BR20U"; + } + bit b50GbaseBR40D { + description + "50GBASE-BR40D"; + } + bit b50GbaseBR40U { + description + "50GBASE-BR40U"; + } + /* 802.3ck-2022 */ + bit b100GBaseCR1 { + description + "100GBASE-CR1"; + } + bit b100GBaseKR1 { + description + "100GBASE-KR1"; + } + bit b200GBaseCR2 { + description + "200GBASE-CR2"; + } + bit b200GBaseKR2 { + description + "200GBASE-KR2"; + } + bit b400GBaseCR4 { + description + "400GBASE-CR4"; + } + bit b400GBaseKR4 { + description + "400GBASE-KR4"; + } + /* 802.3cs-2022 */ + bit b10G2p5GBaseSP1Dx { + description + "10/2.5GBASE-SP1-Dx"; + } + bit b10G2p5GBaseSP1Uxy { + description + "10/2.5GBASE-SP1-Uxy"; + } + bit b10GBaseSP1Dx { + description + "10GBASE-SP1-Dx"; + } + bit b10GBaseSP1Uxy { + description + "10GBASE-SP1-Uxy"; + } + /* 802.3db-2022 */ + bit b100GBaseSR1 { + description + "100GBASE-SR1"; + } + bit b100GBaseVR1 { + description + "100GBASE-VR1"; + } + bit bit200GBaseSR2 { + description + "200GBASE-SR2"; + } + bit bit200GBaseVR2 { + description + "200GBASE-VR2"; + } + bit bit400GBaseSR4 { + description + "400GBASE-SR4"; + } + bit bit400GBaseVR4 { + description + "400GBASE-VR4"; + } + /* 802.3cz-2023 */ + bit b2p5GbaseAU { + description + "2.5GBASE-AU"; + } + bit b5GbaseAU { + description + "5GBASE-AU"; + } + bit b10GbaseAU { + description + "10GBASE-AU"; + } + bit b25GbaseAU { + description + "25GBASE-AU"; + } + bit b50GbaseAU { + description + "50GBASE-AU"; + } + /* 802.3cy-2023 */ + bit b25GbaseT1 { + description + "25GBASE-T1"; + } + /* 802.3df-2024 */ + bit bit400GBaseDR4d2 { + description + "400GBASE-DR4-2"; + } + bit bit800GBaseCR8 { + description + "800GBASE-CR8"; + } + bit bit800GBaseDR8 { + description + "800GBASE-DR8"; + } + bit bit800GBaseDR8d2 { + description + "800GBASE-DR8-2"; + } + bit bit800GBaseKR8 { + description + "800GBASE-KR8"; + } + bit bit800GBaseR { + description + "800GBASE-R"; + } + bit bit800GBaseSR8 { + description + "800GBASE-SR8"; + } + bit bit800GBaseVR8 { + description + "800GBASE-VR8"; + } + } + description + "This data type is used to report the set of pmd-type values + an interface can implement."; + reference + "IEEE Std 802.3, 30.5.1.1.3 aMAUTypeList"; + } + + typedef media-available-type { + type enumeration { + /* 802.3-2022 */ + enum other { + description + "Undefined"; + } + enum unknown { + description + "initializing, true state not yet known"; + } + enum available { + description + "link or light normal, loopback normal"; + } + enum notAvailable { + description + "link loss or low light, no loopback"; + } + enum remoteFault { + description + "remote fault with no detail"; + } + enum remoteJabber { + description + "remote fault, reason known to be jabber"; + } + enum remoteLinkLoss { + description + "remote fault, reason known to be far-end link loss"; + } + enum remoteTest { + description + "remote fault, reason known to be test"; + } + enum offline { + description + "offline, applies only to Clause 37 Auto-Negotiation"; + } + enum autoNegError { + description + "Auto-Negotiation Error, applies only to Clause 37 + auto-Negotiation"; + } + enum pmdLinkFault { + description + "PMD/PMA receive link fault"; + } + enum pcsLinkFault { + description + "PCS receive link fault"; + } + enum excessiveBER { + description + "PCS Bit Error Ratio monitor reporting excessive error + ratio"; + } + enum dxsLinkFault { + description + "DTE XGXS receive link fault, applies only to XAUI "; + } + enum pxsLinkFault { + description + "PHY XGXS transmit link fault, applies only to XAUI"; + } + } + description + "This data type is used to report media availability."; + reference + "IEEE Std 802.3, 30.5.1.1.4 aMediaAvailable"; + } + + typedef auto-neg-ability-bits { + type bits { + /* Not PHY specific */ + bit bOther { + description + "Other abilities beyond the scope of this module."; + } + bit bHalfDuplex { + description + "Half duplex"; + } + bit bFullDuplex { + description + "Full duplex"; + } + bit bPause { + description + "PAUSE operation as defined in Annex 31B"; + } + bit bAPause { + description + "Asymmetric PAUSE operation as defined in + Clause 37, Annex 28B, and Annex 31B"; + } + bit bSPause { + description + "Symmetric PAUSE operation as defined in + Clause 37, Annex 28B, and Annex 31B"; + } + bit bBPause { + description + "Asymmetric and Symmetric PAUSE operation + as defined in Clause 37, Annex 28B, and Annex 31B"; + } + bit bRemFault { + description + "Remote fault bit (RF) as specified in Clause 73 + and Clause 98"; + } + bit bRemFault1 { + description + "Remote fault bit 1 (RF1) as specified in Clause 37"; + } + bit bRemFault2 { + description + "Remote fault bit 2 (RF2) as specified in Clause 37"; + } + bit bFECCapable { + description + "FEC ability as specified in Clause 73 (see 73.6.5) + and Clause 74"; + } + bit bFECRequested { + description + "FEC requested as specified in Clause 73 (see 73.6.5) + and Clause 74"; + } + bit bRSFEC25Greq { + description + "25G RS-FEC requested as specified in Clause 73 (see 73.6.5) + and Clause 108"; + } + bit bBaseFEC25Greq { + description + "25Gb/s BASE-R FEC "; + } + bit bForceMS { + description + "Force MASTER-SLAVE as specified in Clause 98 (see + 98.2.1.2.5)"; + } + /* PHY/PMD */ + bit b10baseT { + description + "10BASE-T as defined in Clause 14"; + } + bit b10baseT1L { + description + "10BASE-T1L as specified in Clause 146"; + } + bit b10baseT1S { + description + "10BASE-T1S as specified in Clause 147"; + } + bit b100baseTX { + description + "100BASE-TX as defined in Clause 25"; + } + bit b1000baseX { + description + "1000BASE-X half duplex as specified in Clause 36"; + } + bit b1000baseT { + description + "1000BASE-T PHY as specified in Clause 40"; + } + bit b1000baseT1 { + description + "1000BASE-T1 as specified in Clause 97"; + } + bit b2p5GbaseT { + description + "2.5GBASE-T PHY as specified in Clause 126"; + } + bit b2p5GbaseT1 { + description + "2.5GBASE-T1 as specified in Clause 149"; + } + bit b2p5GbaseKX { + description + "2.5GBASE-KX as specified in Clause 128"; + } + bit b5GBaseT { + description + "5GBASE-T PHY as specified in Clause 126"; + } + bit b5GbaseT1 { + description + "5GBASE-T1 as specified in Clause 149"; + } + bit b5GbaseKR { + description + "5GBASE-KR as specified in Clause 130"; + } + bit b10GbaseT { + description + "10GBASE-T PHY as specified in Clause 55"; + } + bit b1000baseKX { + description + "1000BASE-KX as specified in Clause 70"; + } + bit b10GbaseKX4 { + description + "10GBASE-KX4 as specified in Clause 71"; + } + bit b10GbaseKR { + description + "10GBASE-KR as specified in Clause 72"; + } + bit b25GbaseT { + description + "25GBASE-T as specified in Clause 113"; + } + bit b25GbaseRS { + description + "25GBASE-CR-S as specified in Clause 110 or + 25GBASE-KR-S as specified in Clause 111"; + } + bit b25GbaseR { + description + "25GBASE-CR as specified in Clause 110 or + 25GBASE-KR as specified in Clause 111"; + } + bit b25GbaseT1 { + description + "25GBASE-T1 as specified in Clause 165"; + } + bit b40GbaseKR4 { + description + "40GBASE-KR4 as specified in Clause 84"; + } + bit b40GbaseCR4 { + description + "40GBASE-CR4 as specified in Clause 85"; + } + bit b40GbaseT { + description + "40GBASE-T as specified in Clause 113"; + } + bit b50GbaseR { + description + "50GBASE-CR as specified in Clause 136 or + 50GBASE-KR as specified in Clause 137"; + } + bit b100GbaseCR10 { + description + "100GBASE-CR10 as specified in Clause 85"; + } + bit b100GbaseCR4 { + description + "100GBASE-CR4 as specified in Clause 92"; + } + bit b100GbaseKR4 { + description + "100GBASE-KR4 as specified in Clause 93"; + } + bit b100GbaseKP4 { + description + "100GBASE-KP4 as specified in Clause 94"; + } + bit b100GbaseR2 { + description + "100GBASE-CR2 as specified in Clause 136 or + 100GBASE-KR2 as specified in Clause 137"; + } + bit b200GbaseR4 { + description + "200GBASE-CR4 as specified in Clause 136 + or 200GBASE-KR4 as specified in Clause 137"; + } + } + description + "This data type is used as the syntax of the + ieee802-eth-phy-auto-neg-capability-bits, + ieee802-eth-phy-auto-neg-cap-advertised-bits, + and ieee802-eth-phy-auto-neg-cap-received-bits + objects in ieee802-eth-phy-auto-neg-table."; + reference + "IEEE Std 802.3, 30.6.1.1.5"; + } +} diff --git a/src/confd/yang/confd/infix-ethernet-interface.yang b/src/confd/yang/confd/infix-ethernet-interface.yang index f663a91fd..b5bbf4c9c 100644 --- a/src/confd/yang/confd/infix-ethernet-interface.yang +++ b/src/confd/yang/confd/infix-ethernet-interface.yang @@ -5,6 +5,7 @@ module infix-ethernet-interface { import ieee802-ethernet-interface { prefix eth; + revision-date 2025-09-10; } import ietf-interfaces { prefix if; @@ -18,6 +19,15 @@ module infix-ethernet-interface { contact "kernelkit@googlegroups.com"; description "Extensions and deviations to ieee802-ethernet-interface.yang"; + revision 2026-05-18 { + description "Updated to ieee802-ethernet-interface@2025-09-10 base + (IEEE Std 802.3.2-2025). No path or semantic changes + to Infix-exposed config; new operational leaves + phy-type and pmd-type from the upstream model are + used directly without deviation."; + reference "internal"; + } + revision 2024-02-27 { description "Add augment for in-good-octets and out-good-octets"; reference "internal"; diff --git a/src/confd/yang/confd/infix-ethernet-interface@2024-02-27.yang b/src/confd/yang/confd/infix-ethernet-interface@2026-05-18.yang similarity index 100% rename from src/confd/yang/confd/infix-ethernet-interface@2024-02-27.yang rename to src/confd/yang/confd/infix-ethernet-interface@2026-05-18.yang diff --git a/src/confd/yang/confd/infix-interfaces.yang b/src/confd/yang/confd/infix-interfaces.yang index f4de3640f..6cd517d85 100644 --- a/src/confd/yang/confd/infix-interfaces.yang +++ b/src/confd/yang/confd/infix-interfaces.yang @@ -41,6 +41,15 @@ module infix-interfaces { contact "kernelkit@googlegroups.com"; description "Linux bridge and lag extensions for ietf-interfaces."; + revision 2026-05-18 { + description "Track ieee802-ethernet-interface@2025-09-10 upgrade + (IEEE Std 802.3.2-2025): operational data now exposes + phy-type/pmd-type leaves and the interface speed via + ietf-interfaces:speed (bits/s) rather than the obsolete + eth:speed."; + reference "internal"; + } + revision 2026-05-13 { description "Add limitations on custom mac addresses on interfaces, now needs to be a correct unicast mac-address"; reference "internal"; diff --git a/src/confd/yang/confd/infix-interfaces@2026-05-13.yang b/src/confd/yang/confd/infix-interfaces@2026-05-18.yang similarity index 100% rename from src/confd/yang/confd/infix-interfaces@2026-05-13.yang rename to src/confd/yang/confd/infix-interfaces@2026-05-18.yang diff --git a/src/statd/python/cli_pretty/cli_pretty.py b/src/statd/python/cli_pretty/cli_pretty.py index bf77df3db..fbb792344 100755 --- a/src/statd/python/cli_pretty/cli_pretty.py +++ b/src/statd/python/cli_pretty/cli_pretty.py @@ -101,7 +101,7 @@ def compress_interface_list(interfaces): class Pad: flags = 2 iface = 16 - proto = 11 + proto = 14 state = 12 data = 41 @@ -1042,7 +1042,9 @@ def __init__(self, data): self.autoneg = get_json_data('unknown', self.data, 'ieee802-ethernet-interface:ethernet', 'auto-negotiation', 'enable') self.duplex = get_json_data('', self.data,'ieee802-ethernet-interface:ethernet','duplex') - self.speed = get_json_data('', self.data, 'ieee802-ethernet-interface:ethernet', 'speed') + self.speed = get_json_data('', self.data, 'speed') + self.pmd_type = get_json_data('', self.data, 'ieee802-ethernet-interface:ethernet', 'pmd-type') + self.phy_type = get_json_data('', self.data, 'ieee802-ethernet-interface:ethernet', 'phy-type') self.phys_address = data.get('phys-address', '') self.br_mdb = get_json_data({}, self.data, 'infix-interfaces:bridge', 'multicast-filters') @@ -1107,9 +1109,12 @@ def __init__(self, data): self.wireguard = self.data.get('infix-interfaces:wireguard') if self.data.get('infix-interfaces:vlan'): - self.lower_if = self.data.get('infix-interfaces:vlan', None).get('lower-layer-if',None) + vlan_data = self.data.get('infix-interfaces:vlan') + self.lower_if = vlan_data.get('lower-layer-if', None) + self.vid = vlan_data.get('id', None) else: self.lower_if = '' + self.vid = None def is_wifi(self): return self.type == "infix-if-type:wifi" @@ -1173,66 +1178,102 @@ def pr_proto_ipv6(self, pipe=''): row += f"{'':<{Pad.state}}{addr['ip']}/{addr['prefix-length']} {origin}" print(row) - def _pr_proto_common(self, name, phys_address, pipe=''): + def _phy_label(self): + """Display label derived from IEEE pmd-type or phy-type identity. + + Prefers pmd-type (specific medium, e.g. '10GbaseLR') over phy-type + (family-level, e.g. '10GbaseR') when both are populated. Empty + when neither is reported — non-ethernet interfaces don't have these + leaves, and yanger skips them for ethernet ports with no link or + unmapped (port, speed, duplex) tuple. + """ + identity = self.pmd_type or self.phy_type + if not identity: + return "" + return identity.removeprefix( + "ieee802-ethernet-phy-type:pmd-type-" + ).removeprefix( + "ieee802-ethernet-phy-type:phy-type-" + ).replace("BASE-", "base") + + def _pr_proto_common(self, name, pipe='', data='', show_state=True): + # pipe="" means this row follows pr_name() on the same line, so col 1-2 + # are already on screen. A non-empty pipe (" ", "│", "└ ") prints col + # 1-2 with that marker. show_state=False blanks the STATE column for + # sub-rows whose state was already reflected in the row above. row = "" if len(pipe) > 0: row = f"{'':<{Pad.flags}}" row += f"{pipe:<{Pad.iface}}" row += f"{name:<{Pad.proto}}" - dec = Decore.green if self.oper() == "up" else Decore.red - row += dec(f"{self.oper().upper():<{Pad.state}}") - if phys_address: - row += f"{self.phys_address:<{Pad.data}}" + if show_state: + dec = Decore.green if self.oper() == "up" else Decore.red + row += dec(f"{self.oper().upper():<{Pad.state}}") + else: + row += f"{'':<{Pad.state}}" + if data: + row += f"{data:<{Pad.data}}" return row - def pr_proto_eth(self, pipe=''): - row = self._pr_proto_common("ethernet", True, pipe); - print(row) + def _pr_phy_row(self, pipe=''): + """Emit the physical-medium row when applicable. Return True if printed. - def pr_proto_veth(self, pipe=''): - row = self._pr_proto_common("veth", True, pipe); + Skipped when pmd-type is unknown or the link is not up — keeping the + common 'boring port' cases quiet and falling back to the ethernet row. + """ + label = self._phy_label() + if not label or self.oper() != "up": + return False + data = f"duplex: {self.duplex}" if self.duplex else "" + print(self._pr_proto_common(label, pipe, data)) + return True - if self.lower_if: - row = f"{'':<{Pad.iface}}" - row += f"{'veth':<{Pad.proto}}" - row += f"{'':<{Pad.state}}" - row += f"peer:{self.lower_if}" + def pr_proto_eth(self, pipe=''): + print(self._pr_proto_common("ethernet", pipe, self.phys_address or "")) - print(row) + def pr_proto_eth_subrow(self, pipe=' '): + """Ethernet row beneath another protocol row: bare MAC, no STATE column.""" + print(self._pr_proto_common("ethernet", pipe, self.phys_address or "", + show_state=False)) - def pr_proto_gretap(self, pipe=''): - row = self._pr_proto_common("gretap", True, pipe); - print(row) + def pr_proto_veth(self, pipe=''): + parts = [] + if self.phys_address: + parts.append(self.phys_address) + if self.lower_if: + parts.append(f"peer: {self.lower_if}") + print(self._pr_proto_common("veth", pipe, " ".join(parts))) def pr_proto_gre(self, pipe=''): - row = self._pr_proto_common("gre", False, pipe); - print(row) + data = "" + if self.gre and (remote := self.gre.get('remote')): + data = f"remote: {remote}" + print(self._pr_proto_common("gre", pipe, data)) def pr_proto_vxlan(self, pipe=''): - row = self._pr_proto_common("vxlan", True, pipe); - print(row) + parts = [] + if self.vxlan: + if (vni := self.vxlan.get('vni')) is not None: + parts.append(f"vni: {vni}") + if remote := self.vxlan.get('remote'): + parts.append(f"remote: {remote}") + print(self._pr_proto_common("vxlan", pipe, " ".join(parts))) def pr_proto_wireguard(self, pipe=''): - row = self._pr_proto_common("wireguard", False, pipe) - + data = "" if self.wireguard: peer_status = self.wireguard.get('peer-status', {}) peers = peer_status.get('peer', []) total_peers = len(peers) up_peers = sum(1 for p in peers if p.get('connection-status') == 'up') - if total_peers > 0: - row += f"{total_peers} peer" - if total_peers != 1: - row += "s" - row += f" ({up_peers} up)" - - print(row) + plural = "s" if total_peers != 1 else "" + data = f"{total_peers} peer{plural} ({up_peers} up)" + print(self._pr_proto_common("wireguard", pipe, data)) def pr_proto_loopack(self, pipe=''): - row = self._pr_proto_common("loopback", False, pipe); - print(row) + print(self._pr_proto_common("loopback", pipe)) def pr_wifi_ssids(self): width = 70 @@ -1309,42 +1350,19 @@ def pr_wifi_stations(self): def pr_proto_wifi(self, pipe=''): - row = self._pr_proto_common("ethernet", True, pipe); - print(row) - ssid = None - signal = None - mode = None - - if self.wifi: - # Detect mode: AP has "stations", Station has "signal-strength" or "scan-results" - ap=self.wifi.get("access-point", {}) - if ap: - ssid = ap.get("ssid", "------") - mode = "AP" - stations_data = ap.get("stations", {}) - stations = stations_data.get("station", []) - station_count = len(stations) - data_str = f"{mode}, ssid: {ssid}, stations: {station_count}" - else: - station=self.wifi.get("station", {}) - ssid = station.get("ssid", "------") - signal = station.get("signal-strength") - mode = "Station" - if signal is not None: - signal_str = signal_to_status(signal) - data_str = f"{mode}, ssid: {ssid}, signal: {signal_str}" - else: - data_str = f"{mode}, ssid: {ssid}" + if self.wifi and (ap := self.wifi.get("access-point", {})): + ssid = ap.get("ssid", "------") + stations = ap.get("stations", {}).get("station", []) + data_str = f"access-point ssid: {ssid} stations: {len(stations)}" + elif self.wifi and (station := self.wifi.get("station", {})): + ssid = station.get("ssid", "------") + data_str = f"station ssid: {ssid}" + if (signal := station.get("signal-strength")) is not None: + data_str += f" signal: {signal_to_status(signal)}" else: data_str = "ssid: ------" - row = f"{'':<{Pad.flags}}" - row += f"{pipe:<{Pad.iface}}" - row = f"{'':<{Pad.flags}}" - row += f"{pipe:<{Pad.iface}}" - row += f"{'wifi':<{Pad.proto}}" - row += f"{'':<{Pad.state}}{data_str}" - print(row) + print(self._pr_proto_common("wifi", pipe, data_str)) def pr_proto_br(self, br_vlans): data_str = "" @@ -1357,23 +1375,18 @@ def pr_proto_br(self, br_vlans): else: row += Decore.red(f"{self.oper().upper():<{Pad.state}}") + vlans = [] for vlan in br_vlans: - if 'tagged' in vlan: - for tagged in vlan['tagged']: - if tagged == self.name: - if data_str: - data_str += f",{vlan['vid']}t" - else: - data_str += f"vlan:{vlan['vid']}t" - if 'untagged' in vlan: - for untagged in vlan['untagged']: - if untagged == self.name: - if data_str: - data_str += f",{vlan['vid']}u" - else: - data_str += f"vlan:{vlan['vid']}u" + if 'tagged' in vlan and self.name in vlan['tagged']: + vlans.append(f"{vlan['vid']}t") + if 'untagged' in vlan and self.name in vlan['untagged']: + vlans.append(f"{vlan['vid']}u") + tokens = [] + if vlans: + tokens.append(f"vlan: {','.join(vlans)}") if self.pvid: - data_str += f" pvid:{self.pvid}" + tokens.append(f"pvid: {self.pvid}") + data_str = " ".join(tokens) if data_str: row += f"{data_str:<{Pad.data}}" @@ -1390,11 +1403,11 @@ def pr_bridge(self, _ifaces): lowers.append(_iface) if lowers: - self.pr_proto_eth(pipe='│') + self.pr_proto_eth_subrow(pipe='│') self.pr_proto_ipv4(pipe='│') self.pr_proto_ipv6(pipe='│') else: - self.pr_proto_eth(pipe=' ') + self.pr_proto_eth_subrow() self.pr_proto_ipv4() self.pr_proto_ipv6() @@ -1449,11 +1462,11 @@ def pr_lag(self, _ifaces): lowers.append(_iface) if lowers: - self.pr_proto_eth(pipe='│') + self.pr_proto_eth_subrow(pipe='│') self.pr_proto_ipv4(pipe='│') self.pr_proto_ipv6(pipe='│') else: - self.pr_proto_eth(pipe=' ') + self.pr_proto_eth_subrow() self.pr_proto_ipv4() self.pr_proto_ipv6() @@ -1476,13 +1489,15 @@ def pr_gre(self): def pr_gretap(self): self.pr_name(pipe="") - self.pr_proto_gretap() + self.pr_proto_gre() + self.pr_proto_eth_subrow() self.pr_proto_ipv4() self.pr_proto_ipv6() def pr_vxlan(self): self.pr_name(pipe="") self.pr_proto_vxlan() + self.pr_proto_eth_subrow() self.pr_proto_ipv4() self.pr_proto_ipv6() @@ -1495,12 +1510,14 @@ def pr_wireguard(self): def pr_wifi(self): self.pr_name(pipe="") self.pr_proto_wifi() + self.pr_proto_eth_subrow() self.pr_proto_ipv4() self.pr_proto_ipv6() def pr_vlan(self, _ifaces): self.pr_name(pipe="") - self.pr_proto_eth() + data = f"vid: {self.vid}" if self.vid is not None else "" + print(self._pr_proto_common("vlan", "", data)) if self.lower_if: self.pr_proto_ipv4(pipe='│') @@ -1515,7 +1532,7 @@ def pr_vlan(self, _ifaces): print(f"Error, didn't find parent interface for vlan {self.name}") sys.exit(1) parent.pr_name(pipe='└ ') - parent.pr_proto_eth() + print() def pr_container(self): # Add ⇅ flag for interfaces with IP forwarding enabled @@ -1549,6 +1566,9 @@ def pr_iface(self): if self.lower_if: print(f"{'lower-layer-if':<{20}}: {self.lower_if}") + if label := self._phy_label(): + print(f"{'link mode':<{20}}: {label}") + if self.autoneg != 'unknown': val = "on" if self.autoneg else "off" print(f"{'auto-negotiation':<{20}}: {val}") @@ -1557,8 +1577,8 @@ def pr_iface(self): print(f"{'duplex':<{20}}: {self.duplex}") if self.speed: - mbs = float(self.speed) * 1000 - print(f"{'speed':<{20}}: {int(mbs)}") + mbps = int(self.speed) // 1_000_000 + print(f"{'speed':<{20}}: {mbps}") if self.phys_address: print(f"{'physical address':<{20}}: {self.phys_address}") @@ -1804,7 +1824,10 @@ def brport_sort(iface): def print_interface(iface): iface.pr_name() - iface.pr_proto_eth() + if iface._pr_phy_row(): + iface.pr_proto_eth_subrow() + else: + iface.pr_proto_eth() iface.pr_proto_ipv4() iface.pr_proto_ipv6() diff --git a/src/statd/python/yanger/ietf_interfaces/ethernet.py b/src/statd/python/yanger/ietf_interfaces/ethernet.py index c2b3821c8..670246ccc 100644 --- a/src/statd/python/yanger/ietf_interfaces/ethernet.py +++ b/src/statd/python/yanger/ietf_interfaces/ethernet.py @@ -68,31 +68,87 @@ def statistics(ifname): return statistics +# ethtool reports SPEED_UNKNOWN as UINT32_MAX when no link / no medium. +_ETHTOOL_SPEED_UNKNOWN = (1 << 32) - 1 + +# Map (ethtool port string, speed in Mb/s, duplex) -> (phy-type, pmd-type) +# identity suffixes per IEEE Std 802.3.2-2025 (ieee802-ethernet-phy-type). +# +# phy-type names the PHY family / line coding (e.g. 1000BASE-X is the 8B/10B +# family covering LX/SX/ZX/CX); pmd-type names the specific physical medium +# (1000BASE-LX vs 1000BASE-SX). For media where ethtool's (port, speed, +# duplex) tuple uniquely identifies the variant — copper, DAC, copper-T — +# both leaves are populated with the right identities (often the same name). +# For generic fiber where the same tuple can be SR/LR/ER/etc., we only +# populate phy-type (family) and leave pmd-type as None — emitting a guess +# would be misleading. Refining the PMD on fiber needs the SFP EEPROM +# (ethtool -m), deferred. +_LINK_MODES = { + # (port, speed Mb/s, duplex): (phy-type, pmd-type or None) + ("Twisted Pair", 10, "full"): ("10BASE-T", "10BASE-T"), + ("Twisted Pair", 10, "half"): ("10BASE-T", "10BASE-T"), + ("Twisted Pair", 100, "full"): ("100BASE-X", "100BASE-TX"), + ("Twisted Pair", 100, "half"): ("100BASE-X", "100BASE-TX"), + ("Twisted Pair", 1000, "full"): ("1000BASE-T", "1000BASE-T"), + ("Twisted Pair", 1000, "half"): ("1000BASE-T", "1000BASE-T"), + ("Twisted Pair", 2500, "full"): ("2.5GBASE-T", "2.5GBASE-T"), + ("Twisted Pair", 5000, "full"): ("5GBASE-T", "5GBASE-T"), + ("Twisted Pair", 10000, "full"): ("10GBASE-T", "10GBASE-T"), + ("Twisted Pair", 25000, "full"): ("25GBASE-T", "25GBASE-T"), + ("Twisted Pair", 40000, "full"): ("40GBASE-T", "40GBASE-T"), + ("MII", 10, "full"): ("10BASE-T", "10BASE-T"), + ("MII", 10, "half"): ("10BASE-T", "10BASE-T"), + ("MII", 100, "full"): ("100BASE-X", "100BASE-TX"), + ("MII", 100, "half"): ("100BASE-X", "100BASE-TX"), + ("FIBRE", 100, "full"): ("100BASE-X", None), + ("FIBRE", 1000, "full"): ("1000BASE-X", None), + ("FIBRE", 10000, "full"): ("10GBASE-R", None), + ("FIBRE", 25000, "full"): ("25GBASE-R", None), + ("FIBRE", 40000, "full"): ("40GBASE-R", None), + ("FIBRE", 100000, "full"): ("100GBASE-R", None), + ("Direct Attach Copper", 10000, "full"): ("10GBASE-R", "10GBASE-CR"), + ("Direct Attach Copper", 25000, "full"): ("25GBASE-R", "25GBASE-CR"), + ("Direct Attach Copper", 40000, "full"): ("40GBASE-R", "40GBASE-CR4"), + ("Direct Attach Copper", 100000, "full"): ("100GBASE-R", "100GBASE-CR4"), +} + + def link(ifname): - """Parse speed/duplex/autoneg from ethtool output""" + """Read link properties from ethtool. + + Returns (eth_container_dict, interface_speed_bps_or_None); the + interface speed is lifted onto ietf-interfaces:speed by the caller. + """ if data := HOST.run_json(["ethtool", "--json", ifname], {}): data = data[0] else: - return None + return {}, None - eth = {} - eth["auto-negotation"] = { "enable": data.get("auto-negotation", False) } + eth = {"auto-negotiation": {"enable": data.get("auto-negotiation", False)}} - if data.get("speed"): - gbps = round((int(data["speed"]) / 1000), 3) - eth["speed"] = str(gbps) - if data.get("duplex"): - eth["duplex"] = data["duplex"].lower() - return eth + duplex = (data.get("duplex") or "").lower() + if duplex in ("full", "half"): + eth["duplex"] = duplex + speed_bps = None + speed_mbps = data.get("speed") + if isinstance(speed_mbps, int) and 0 < speed_mbps < _ETHTOOL_SPEED_UNKNOWN: + speed_bps = speed_mbps * 1_000_000 + port = data.get("port") or "" + if mapping := _LINK_MODES.get((port, speed_mbps, duplex)): + phy, pmd = mapping + eth["phy-type"] = f"ieee802-ethernet-phy-type:phy-type-{phy}" + if pmd is not None: + eth["pmd-type"] = f"ieee802-ethernet-phy-type:pmd-type-{pmd}" + + return eth, speed_bps -def ethernet(iplink): - eth = link(iplink["ifname"]) - if eth is None: - eth = {} +def ethernet(iplink): + """Return (ethernet container, interface speed in bits/s or None).""" + eth, speed_bps = link(iplink["ifname"]) if stats := statistics(iplink["ifname"]): eth["statistics"] = stats - return eth + return eth, speed_bps diff --git a/src/statd/python/yanger/ietf_interfaces/link.py b/src/statd/python/yanger/ietf_interfaces/link.py index 4f99c8769..f4ae79a2b 100644 --- a/src/statd/python/yanger/ietf_interfaces/link.py +++ b/src/statd/python/yanger/ietf_interfaces/link.py @@ -159,8 +159,11 @@ def interface(iplink, ipaddr, systemjson=None): if lg := lag.lag(iplink): interface["infix-interfaces:lag"] = lg case "infix-if-type:ethernet": - if eth := ethernet.ethernet(iplink): + eth, speed_bps = ethernet.ethernet(iplink) + if eth: interface["ieee802-ethernet-interface:ethernet"] = eth + if speed_bps: + interface["speed"] = str(speed_bps) case "infix-if-type:vxlan": if vxlan := tun.vxlan(iplink): interface["infix-interfaces:vxlan"] = vxlan diff --git a/test/case/statd/bridge-mdb/ietf-interfaces.json b/test/case/statd/bridge-mdb/ietf-interfaces.json index 3967bc8a7..5dc320677 100644 --- a/test/case/statd/bridge-mdb/ietf-interfaces.json +++ b/test/case/statd/bridge-mdb/ietf-interfaces.json @@ -57,7 +57,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -80,7 +80,7 @@ "mtu": 1500 }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -120,7 +120,7 @@ "mtu": 1500 }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -160,7 +160,7 @@ "mtu": 1500 }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -207,7 +207,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -237,7 +237,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -267,7 +267,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } diff --git a/test/case/statd/bridge-mdb/operational.json b/test/case/statd/bridge-mdb/operational.json index ccb7b39de..e8f9697b1 100644 --- a/test/case/statd/bridge-mdb/operational.json +++ b/test/case/statd/bridge-mdb/operational.json @@ -35,7 +35,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -65,7 +65,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -105,7 +105,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -145,7 +145,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -185,7 +185,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -215,7 +215,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -245,7 +245,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, diff --git a/test/case/statd/containers/cli/show-interfaces b/test/case/statd/containers/cli/show-interfaces index 375beb061..12ed8c334 100644 --- a/test/case/statd/containers/cli/show-interfaces +++ b/test/case/statd/containers/cli/show-interfaces @@ -1,41 +1,41 @@ -⚑ INTERFACE PROTOCOL STATE DATA  - lo loopback UP  - ipv4 127.0.0.1/8 (static) - ipv6 ::1/128 (static) - br0 bridge  vlan:1u pvid:1 - │ ethernet UP 00:a0:85:00:03:00 - │ ipv4 169.254.1.1/16 (random) - │ ipv6 fe80::2a0:85ff:fe00:300/64 (link-layer) - ├ e3 bridge FORWARDING vlan:1u pvid:1 - ├ e4 bridge FORWARDING vlan:1u pvid:1 - ├ veth0b bridge FORWARDING vlan:1u pvid:1 - └ veth2b bridge FORWARDING vlan:1u pvid:1 - br1 bridge   - │ ethernet UP 00:a0:85:00:03:00 - ├ veth1b bridge FORWARDING vlan:6u pvid:6 - └ veth3b bridge FORWARDING  - e1 ethernet UP 00:a0:85:00:03:01 - ipv6 fe80::2a0:85ff:fe00:301/64 (link-layer) - e2 ethernet UP 00:a0:85:00:03:02 - ipv6 fe80::2a0:85ff:fe00:302/64 (link-layer) - e3.8 ethernet UP 00:a0:85:00:03:03 - │ ipv4 10.1.1.1/32 (static) - └ e3 ethernet UP 00:a0:85:00:03:03 - e4.8 ethernet UP 00:a0:85:00:03:04 - │ ipv4 10.1.1.1/32 (static) - └ e4 ethernet UP 00:a0:85:00:03:04 - e5 ethernet UP 00:a0:85:00:03:05 - ipv6 fe80::2a0:85ff:fe00:305/64 (link-layer) - e6 ethernet UP 00:a0:85:00:03:06 - ipv4 10.1.1.101/24 (static) - ipv6 fe80::2a0:85ff:fe00:306/64 (link-layer) - e7 ethernet UP 00:a0:85:00:03:07 - ipv6 fe80::2a0:85ff:fe00:307/64 (link-layer) - veth0a container container-A  - veth0b veth UP e6:19:75:86:80:dd - veth1a container container-A  - veth1b veth UP 3e:67:0f:15:24:14 - veth2a container container-B  - veth2b veth UP b2:fa:30:63:98:f0 - veth3a container container-B  - veth3b veth UP b2:1c:fa:a7:45:eb +⚑ INTERFACE PROTOCOL STATE DATA  + lo loopback UP  + ipv4 127.0.0.1/8 (static) + ipv6 ::1/128 (static) + br0 bridge  vlan: 1u pvid: 1 + │ ethernet 00:a0:85:00:03:00 + │ ipv4 169.254.1.1/16 (random) + │ ipv6 fe80::2a0:85ff:fe00:300/64 (link-layer) + ├ e3 bridge FORWARDING vlan: 1u pvid: 1 + ├ e4 bridge FORWARDING vlan: 1u pvid: 1 + ├ veth0b bridge FORWARDING vlan: 1u pvid: 1 + └ veth2b bridge FORWARDING vlan: 1u pvid: 1 + br1 bridge   + │ ethernet 00:a0:85:00:03:00 + ├ veth1b bridge FORWARDING vlan: 6u pvid: 6 + └ veth3b bridge FORWARDING  + e1 ethernet UP 00:a0:85:00:03:01 + ipv6 fe80::2a0:85ff:fe00:301/64 (link-layer) + e2 ethernet UP 00:a0:85:00:03:02 + ipv6 fe80::2a0:85ff:fe00:302/64 (link-layer) + e3.8 vlan UP vid: 8 + │ ipv4 10.1.1.1/32 (static) + └ e3 + e4.8 vlan UP vid: 8 + │ ipv4 10.1.1.1/32 (static) + └ e4 + e5 ethernet UP 00:a0:85:00:03:05 + ipv6 fe80::2a0:85ff:fe00:305/64 (link-layer) + e6 ethernet UP 00:a0:85:00:03:06 + ipv4 10.1.1.101/24 (static) + ipv6 fe80::2a0:85ff:fe00:306/64 (link-layer) + e7 ethernet UP 00:a0:85:00:03:07 + ipv6 fe80::2a0:85ff:fe00:307/64 (link-layer) + veth0a container container-A  + veth0b veth UP e6:19:75:86:80:dd + veth1a container container-A  + veth1b veth UP 3e:67:0f:15:24:14 + veth2a container container-B  + veth2b veth UP b2:fa:30:63:98:f0 + veth3a container container-B  + veth3b veth UP b2:1c:fa:a7:45:eb diff --git a/test/case/statd/containers/ietf-interfaces.json b/test/case/statd/containers/ietf-interfaces.json index b60d8694e..29b4bf8e8 100644 --- a/test/case/statd/containers/ietf-interfaces.json +++ b/test/case/statd/containers/ietf-interfaces.json @@ -57,7 +57,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -87,7 +87,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -110,7 +110,7 @@ "mtu": 1500 }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -151,7 +151,7 @@ "mtu": 1500 }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -199,7 +199,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -236,7 +236,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -266,7 +266,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } diff --git a/test/case/statd/containers/operational.json b/test/case/statd/containers/operational.json index 23198c4a3..fd3773d9d 100644 --- a/test/case/statd/containers/operational.json +++ b/test/case/statd/containers/operational.json @@ -35,7 +35,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -65,7 +65,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -95,7 +95,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -136,7 +136,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -177,7 +177,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -207,7 +207,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -244,7 +244,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, diff --git a/test/case/statd/interfaces-all/cli/show-interfaces b/test/case/statd/interfaces-all/cli/show-interfaces index 2d64d5a4a..e992c2e30 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces +++ b/test/case/statd/interfaces-all/cli/show-interfaces @@ -1,51 +1,55 @@ -⚑ INTERFACE PROTOCOL STATE DATA  - lo loopback UP  - ipv4 127.0.0.1/8 (static) - ipv6 ::1/128 (static) - br-0 bridge DOWN  - ethernet DOWN 00:a0:85:00:03:00 - br-D bridge   - │ ethernet UP 00:a0:85:00:03:00 - │ ipv4 10.0.0.1/8 (static) - │ ipv4 192.168.20.1/24 (static) - │ ipv6 2001:db8::1/64 (static) - │ ipv6 fe80::2a0:85ff:fe00:300/64 (link-layer) - └ veth0a.20 bridge FORWARDING  - br-Q bridge  vlan:20u,30u,40t - │ ethernet UP 00:a0:85:00:03:00 - ├ e3 bridge FORWARDING vlan:20t,30t,40t - └ veth0b bridge FORWARDING vlan:20t,30t,40t - br-Q.40 ethernet UP 00:a0:85:00:03:00 - └ br-Q ethernet UP 00:a0:85:00:03:00 - br-X bridge   - │ ethernet UP 00:a0:85:00:03:00 - └ e2.30 bridge FORWARDING  - e1 ethernet UP 00:a0:85:00:03:01 - ipv6 fe80::2a0:85ff:fe00:301/64 (link-layer) - e2 ethernet UP 00:a0:85:00:03:02 - ipv6 fe80::2a0:85ff:fe00:302/64 (link-layer) - e2.30 ethernet UP 00:a0:85:00:03:02 - └ e2 ethernet UP 00:a0:85:00:03:02 - e3.10 ethernet UP 00:a0:85:00:03:03 - └ e3 ethernet UP 00:a0:85:00:03:03 - e4 ethernet UP 00:a0:85:00:03:04 - ipv6 fe80::2a0:85ff:fe00:304/64 (link-layer) - e5 ethernet UP 00:a0:85:00:03:05 - ipv6 fe80::2a0:85ff:fe00:305/64 (link-layer) - e6 ethernet UP 00:a0:85:00:03:06 - ipv6 fe80::2a0:85ff:fe00:306/64 (link-layer) - e7 ethernet UP 00:a0:85:00:03:07 - ipv6 fe80::2a0:85ff:fe00:307/64 (link-layer) - gre-v4 gre UP  - gre-v6 gre UP  - ipv4 192.168.50.2/16 (static) - gretap-v4 gretap UP f6:d4:96:d8:9f:96 - gretap-v6 gretap UP 7a:46:13:bd:fa:e6 - veth0a veth UP 6e:d0:98:c4:e7:ef - veth0a.20 ethernet UP 6e:d0:98:c4:e7:ef - └ veth0a ethernet UP 6e:d0:98:c4:e7:ef - veth0b veth UP 36:da:80:06:7f:99 - vxlan-v4 vxlan UP 8a:ea:59:32:df:70 - ipv4 192.168.30.2/24 (static) - vxlan-v6 vxlan UP 3e:30:c6:a1:71:64 - ipv4 192.168.40.2/24 (static) +⚑ INTERFACE PROTOCOL STATE DATA  + lo loopback UP  + ipv4 127.0.0.1/8 (static) + ipv6 ::1/128 (static) + br-0 bridge DOWN  + ethernet 00:a0:85:00:03:00 + br-D bridge   + │ ethernet 00:a0:85:00:03:00 + │ ipv4 10.0.0.1/8 (static) + │ ipv4 192.168.20.1/24 (static) + │ ipv6 2001:db8::1/64 (static) + │ ipv6 fe80::2a0:85ff:fe00:300/64 (link-layer) + └ veth0a.20 bridge FORWARDING  + br-Q bridge  vlan: 20u,30u,40t + │ ethernet 00:a0:85:00:03:00 + ├ e3 bridge FORWARDING vlan: 20t,30t,40t + └ veth0b bridge FORWARDING vlan: 20t,30t,40t + br-Q.40 vlan UP vid: 40 + └ br-Q + br-X bridge   + │ ethernet 00:a0:85:00:03:00 + └ e2.30 bridge FORWARDING  + e1 ethernet UP 00:a0:85:00:03:01 + ipv6 fe80::2a0:85ff:fe00:301/64 (link-layer) + e2 ethernet UP 00:a0:85:00:03:02 + ipv6 fe80::2a0:85ff:fe00:302/64 (link-layer) + e2.30 vlan UP vid: 30 + └ e2 + e3.10 vlan UP vid: 10 + └ e3 + e4 ethernet UP 00:a0:85:00:03:04 + ipv6 fe80::2a0:85ff:fe00:304/64 (link-layer) + e5 ethernet UP 00:a0:85:00:03:05 + ipv6 fe80::2a0:85ff:fe00:305/64 (link-layer) + e6 ethernet UP 00:a0:85:00:03:06 + ipv6 fe80::2a0:85ff:fe00:306/64 (link-layer) + e7 ethernet UP 00:a0:85:00:03:07 + ipv6 fe80::2a0:85ff:fe00:307/64 (link-layer) + gre-v4 gre UP remote: 192.168.20.2 + gre-v6 gre UP remote: 2001:db8::2 + ipv4 192.168.50.2/16 (static) + gretap-v4 gre UP remote: 192.168.20.2 + ethernet f6:d4:96:d8:9f:96 + gretap-v6 gre UP remote: 2001:db8::2 + ethernet 7a:46:13:bd:fa:e6 + veth0a veth UP 6e:d0:98:c4:e7:ef + veth0a.20 vlan UP vid: 20 + └ veth0a + veth0b veth UP 36:da:80:06:7f:99 + vxlan-v4 vxlan UP vni: 4 remote: 192.168.20.200 + ethernet 8a:ea:59:32:df:70 + ipv4 192.168.30.2/24 (static) + vxlan-v6 vxlan UP vni: 6 remote: 2001:db8::200 + ethernet 3e:30:c6:a1:71:64 + ipv4 192.168.40.2/24 (static) diff --git a/test/case/statd/interfaces-all/ietf-interfaces.json b/test/case/statd/interfaces-all/ietf-interfaces.json index bbd5cdb5b..e476101bb 100644 --- a/test/case/statd/interfaces-all/ietf-interfaces.json +++ b/test/case/statd/interfaces-all/ietf-interfaces.json @@ -57,7 +57,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -87,7 +87,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -109,7 +109,7 @@ "mtu": 1500 }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -156,7 +156,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -186,7 +186,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -216,7 +216,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } @@ -246,7 +246,7 @@ ] }, "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } } diff --git a/test/case/statd/interfaces-all/operational.json b/test/case/statd/interfaces-all/operational.json index 8a6725f90..cfc2b6ed8 100644 --- a/test/case/statd/interfaces-all/operational.json +++ b/test/case/statd/interfaces-all/operational.json @@ -35,7 +35,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -65,7 +65,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -95,7 +95,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -134,7 +134,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -164,7 +164,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -194,7 +194,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, @@ -224,7 +224,7 @@ { "admin-status": "up", "ieee802-ethernet-interface:ethernet": { - "auto-negotation": { + "auto-negotiation": { "enable": false } }, From 0d3236cced5d75c5aa06ea97e38c873edd30fe01 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 18 May 2026 22:37:34 +0200 Subject: [PATCH 2/5] doc: refresh show interface samples and rename plural form MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update CLI samples across the documentation to the new layered presentation: physical-medium row when linked (1000baseT/...), bare MACs, and key: value DATA tokens. Add a short prose block in ethernet.md and iface.md explaining the layering. Drop the historical 'show interfaces' (plural) form — removed from klish years ago — from all user-facing examples and the landing page. Signed-off-by: Joachim Wiberg --- doc/cli/introduction.md | 2 +- doc/dhcp.md | 8 +-- doc/ethernet.md | 35 +++++++++--- doc/iface.md | 14 +++-- doc/ip.md | 78 ++++++++++++------------- doc/lag.md | 36 ++++++------ doc/management.md | 10 ++-- doc/scripting-prod.md | 122 ++++++++++++++++++++-------------------- doc/vpn-wireguard.md | 4 +- src/landing/index.html | 17 +++--- 10 files changed, 177 insertions(+), 149 deletions(-) diff --git a/doc/cli/introduction.md b/doc/cli/introduction.md index 4630c3562..aeb7f0652 100644 --- a/doc/cli/introduction.md +++ b/doc/cli/introduction.md @@ -164,7 +164,7 @@ interfaces { } } admin@host-12-34-56:/config/interface/eth0/> leave -admin@host-12-34-56:/> show interfaces +admin@host-12-34-56:/> show interface INTERFACE PROTOCOL STATE DATA lo loopback UNKNOWN 00:00:00:00:00:00 ipv4 127.0.0.1/8 (static) diff --git a/doc/dhcp.md b/doc/dhcp.md index c2792930d..6898ebd91 100644 --- a/doc/dhcp.md +++ b/doc/dhcp.md @@ -109,11 +109,11 @@ When configuring, e.g., `dns-server`, or `router` options with the value `auto`, the system uses the IP address from the interface matching the subnet. For example: -
admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
+
admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
                 ipv4                   192.168.1.1/24 (static)
-eth1            ethernet   UP          02:00:00:00:00:01
+eth1            ethernet      UP          02:00:00:00:00:01
                 ipv4                   192.168.2.1/24 (static)
 
 admin@example:/config/dhcp-server/subnet/192.168.1.0/24/> edit option dns-server
diff --git a/doc/ethernet.md b/doc/ethernet.md
index 84e8cb75c..d877500d8 100644
--- a/doc/ethernet.md
+++ b/doc/ethernet.md
@@ -56,22 +56,41 @@ top of a bridge interface *br0* is named *vlan10*.
 Physical Ethernet interfaces provide low-level settings for speed/duplex as
 well as packet status and [statistics](#ethernet-statistics).
 
-By default, Ethernet interfaces defaults to auto-negotiating
-speed/duplex modes, advertising all speed and duplex modes available.
-In the example below, the switch would by default auto-negotiate speed
-1 Gbit/s on port eth1 and 100 Mbit/s on port eth4, as those are the
-highest speeds supported by H1 and H2 respectively.
+By default, Ethernet interfaces defaults to auto-negotiating speed/duplex
+modes, advertising all speed and duplex modes available.  In the example
+below, the switch would by default auto-negotiate speed 1 Gbps on port eth1
+and 100 Mbps on port eth4, as those are the highest speeds supported by H1 and
+H2 respectively.
 
 ![4-port Gbit/s switch connected to Gbit and Fast Ethernet Hosts](img/ethernet-autoneg.svg)
 
-The speed and duplex status for the links can be listed as shown
-below, assuming the link operational status is 'up'.
+A quick at-a-glance view of the physical link is available in the summary
+listing.  When a port is up, a physical-layer row appears above the ethernet
+row, naming the IEEE PMD type (e.g. `1000baseT`, `10GbaseLR`) in the PROTOCOL
+column and the negotiated duplex in DATA.  When the link is down the row is
+omitted and the interface name falls onto the ethernet row.
+
+
admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA             
+eth1            1000baseT     UP          duplex: full
+                ethernet                  00:53:00:06:11:01
+eth2            1000baseT     UP          duplex: full
+                ethernet                  00:53:00:06:11:02
+eth3            ethernet      DOWN        00:53:00:06:11:03
+eth4            100baseTX     UP          duplex: full
+                ethernet                  00:53:00:06:11:04
+...
+
+ +The detail view spells everything out, including auto-negotiation +state and the speed in Mbit/s.
admin@example:/> show interface eth1
 name                : eth1
 index               : 2
 mtu                 : 1500
 operational status  : up
+link mode           : 1000baseT
 auto-negotiation    : on
 duplex              : full
 speed               : 1000
@@ -86,6 +105,7 @@ name                : eth4
 index               : 5
 mtu                 : 1500
 operational status  : up
+link mode           : 100baseTX
 auto-negotiation    : on
 duplex              : full
 speed               : 100
@@ -142,6 +162,7 @@ name                : eth1
 index               : 2
 mtu                 : 1500
 operational status  : up
+link mode           : 1000baseT
 auto-negotiation    : on
 duplex              : full
 speed               : 1000
diff --git a/doc/iface.md b/doc/iface.md
index 9cecd8daa..94a549f34 100644
--- a/doc/iface.md
+++ b/doc/iface.md
@@ -61,13 +61,19 @@ admin@example:/config/interface/eth0/> leave
 The operational status can be inspected to see both administrative and
 actual link state:
 
-
admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA
-eth0            ethernet   DISABLED    02:00:00:00:00:00
-eth1            ethernet   UP          02:00:00:00:00:01
+
admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA             
+eth0            ethernet      DISABLED    02:00:00:00:00:00
+eth1            1000baseT     UP          duplex: full
+                ethernet                  02:00:00:00:00:01
 ...
 
+The rows are layered bottom-up by protocol: a physical-medium row (only +emitted when the link is up) on top, then the ethernet row carrying the +bare MAC, then any ipv4/ipv6 sub-rows. See [Ethernet](ethernet.md) for the +full set of summary fields. + ## Description diff --git a/doc/ip.md b/doc/ip.md index a42302ff4..e53f334fd 100644 --- a/doc/ip.md +++ b/doc/ip.md @@ -117,11 +117,11 @@ will be ignored. For details on how to enable the NTP client, see the ![Switch example (eth0 and lo)](img/ip-address-example-switch.svg) -
admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
+
admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
                 ipv6                   fe80::ff:fe00:0/64 (link-layer)
-lo              ethernet   UP          00:00:00:00:00:00
+lo              ethernet      UP          00:00:00:00:00:00
                 ipv4                   127.0.0.1/8 (static)
                 ipv6                   ::1/128 (static)
 admin@example:/>
@@ -153,13 +153,13 @@ admin@example:/config/interface/eth0/ipv4/> diff
 +  }
 +}
 admin@example:/config/interface/eth0/ipv4/> leave
-admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
+admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
                 ipv4                   169.254.1.3/16 (random)
                 ipv4                   10.0.1.1/24 (static)
                 ipv6                   fe80::ff:fe00:0/64 (link-layer)
-lo              ethernet   UP          00:00:00:00:00:00
+lo              ethernet      UP          00:00:00:00:00:00
                 ipv4                   127.0.0.1/8 (static)
                 ipv6                   ::1/128 (static)
 admin@example:/>
@@ -188,12 +188,12 @@ admin@example:/config/interface/eth0/ipv4/autoconf/> leave
 admin@example:/config/> edit interface eth0 ipv4
 admin@example:/config/interface/eth0/ipv4/> set dhcp
 admin@example:/config/interface/eth0/ipv4/> leave
-admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
+admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
                 ipv4                   10.1.2.100/24 (dhcp)
                 ipv6                   fe80::ff:fe00:0/64 (link-layer)
-lo              ethernet   UP          00:00:00:00:00:00
+lo              ethernet      UP          00:00:00:00:00:00
                 ipv4                   127.0.0.1/8 (static)
                 ipv6                   ::1/128 (static)
 admin@example:/>
@@ -235,11 +235,11 @@ admin@example:/config/> edit interface eth0 ipv6
 admin@example:/config/interface/eth0/ipv6/> set dhcp
 admin@example:/config/interface/eth0/ipv6/> leave
 admin@example:/> show interface
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
                 ipv6                   2001:db8::42/128 (dhcp)
                 ipv6                   fe80::ff:fe00:0/64 (link-layer)
-lo              ethernet   UP          00:00:00:00:00:00
+lo              ethernet      UP          00:00:00:00:00:00
                 ipv4                   127.0.0.1/8 (static)
                 ipv6                   ::1/128 (static)
 admin@example:/>
@@ -291,10 +291,10 @@ on the interface.
 admin@example:/config/> edit interface eth0 ipv6
 admin@example:/config/interface/eth0/ipv6/> set enabled false
 admin@example:/config/interface/eth0/ipv6/> leave
-admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
-lo              ethernet   UP          00:00:00:00:00:00
+admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
+lo              ethernet      UP          00:00:00:00:00:00
                 ipv4                   127.0.0.1/8 (static)
                 ipv6                   ::1/128 (static)
 admin@example:/>
@@ -308,12 +308,12 @@ admin@example:/>
 admin@example:/config/> edit interface eth0 ipv6
 admin@example:/config/interface/eth0/ipv6/> set address 2001:db8::1 prefix-length 64
 admin@example:/config/interface/eth0/ipv6/> leave
-admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
+admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
                 ipv6                   2001:db8::1/64 (static)
                 ipv6                   fe80::ff:fe00:0/64 (link-layer)
-lo              ethernet   UP          00:00:00:00:00:00
+lo              ethernet      UP          00:00:00:00:00:00
                 ipv4                   127.0.0.1/8 (static)
                 ipv6                   ::1/128 (static)
 admin@example:/>
@@ -330,12 +330,12 @@ advertised by the router (here 2001:db8:0:1::0/64) and the interface
 identifier.  The resulting address is of type *link-layer*, as it is
 formed based on the interface identifier ([ietf-ip.yang][2]).
 
-
admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
+
admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
                 ipv6                   2001:db8:0:1:0:ff:fe00:0/64 (link-layer)
                 ipv6                   fe80::ff:fe00:0/64 (link-layer)
-lo              ethernet   UP          00:00:00:00:00:00
+lo              ethernet      UP          00:00:00:00:00:00
                 ipv4                   127.0.0.1/8 (static)
                 ipv6                   ::1/128 (static)
 admin@example:/>
@@ -348,11 +348,11 @@ below.
 admin@example:/config/> edit interface eth0 ipv6
 admin@example:/config/interface/eth0/ipv6/> set autoconf create-global-addresses false
 admin@example:/config/interface/eth0/ipv6/> leave
-admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
+admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
                 ipv6                   fe80::ff:fe00:0/64 (link-layer)
-lo              ethernet   UP          00:00:00:00:00:00
+lo              ethernet      UP          00:00:00:00:00:00
                 ipv4                   127.0.0.1/8 (static)
                 ipv6                   ::1/128 (static)
 admin@example:/>
@@ -366,12 +366,12 @@ admin@example:/>
 By default, the auto-configured link-local and global IPv6 addresses
 are formed from a link-identifier based on the MAC address.
 
-
admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
+
admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
                 ipv6                   2001:db8:0:1:0:ff:fe00:0/64 (link-layer)
                 ipv6                   fe80::ff:fe00:0/64 (link-layer)
-lo              ethernet   UP          00:00:00:00:00:00
+lo              ethernet      UP          00:00:00:00:00:00
                 ipv4                   127.0.0.1/8 (static)
                 ipv6                   ::1/128 (static)
 admin@example:/>
@@ -385,12 +385,12 @@ possible to specify use of a random identifier ([ietf-ip.yang][2] and
 admin@example:/config/> edit interface eth0 ipv6
 admin@example:/config/interface/eth0/ipv6/> set autoconf create-temporary-addresses true
 admin@example:/config/interface/eth0/ipv6/> leave
-admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-eth0            ethernet   UP          02:00:00:00:00:00
+admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+eth0            ethernet      UP          02:00:00:00:00:00
                 ipv6                   2001:db8:0:1:b705:8374:638e:74a8/64 (random)
                 ipv6                   fe80::ad3d:b274:885a:9ffb/64 (random)
-lo              ethernet   UP          00:00:00:00:00:00
+lo              ethernet      UP          00:00:00:00:00:00
                 ipv4                   127.0.0.1/8 (static)
                 ipv6                   ::1/128 (static)
 admin@example:/>
diff --git a/doc/lag.md b/doc/lag.md
index b4c6b4f81..93f2b9efa 100644
--- a/doc/lag.md
+++ b/doc/lag.md
@@ -87,34 +87,34 @@ Like other interfaces, link aggregates are also available in the general
 interfaces overview in the CLI admin-exec context.  Here is the above
 static mode aggregate:
 
-
admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-lo              ethernet   UP          00:00:00:00:00:00
-                ipv4                   127.0.0.1/8 (static)
-                ipv6                   ::1/128 (static)
+
admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+lo              ethernet      UP          00:00:00:00:00:00
+                ipv4                      127.0.0.1/8 (static)
+                ipv6                      ::1/128 (static)
 .
 .
 .
-lag0            lag        UP          static: balance-xor, hash: layer2
-│               ethernet   UP          00:a0:85:00:02:00
-├ eth7          lag        ACTIVE
-└ eth8          lag        ACTIVE
+lag0            lag           UP          static: balance-xor, hash: layer2
+│               ethernet      UP          00:a0:85:00:02:00
+├ eth7          lag           ACTIVE
+└ eth8          lag           ACTIVE
 
Same aggregate, but in LACP mode: -
admin@example:/> show interfaces
-INTERFACE       PROTOCOL   STATE       DATA                                    
-lo              ethernet   UP          00:00:00:00:00:00
-                ipv4                   127.0.0.1/8 (static)
-                ipv6                   ::1/128 (static)
+
admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                                    
+lo              ethernet      UP          00:00:00:00:00:00
+                ipv4                      127.0.0.1/8 (static)
+                ipv6                      ::1/128 (static)
 .
 .
 .
-lag0            lag        UP          lacp: active, rate: fast (1s), hash: layer2
-│               ethernet   UP          00:a0:85:00:02:00
-├ eth7          lag        ACTIVE      active, short_timeout, aggregating, in_sync, collecting, distributing
-└ eth8          lag        ACTIVE      active, short_timeout, aggregating, in_sync, collecting, distributing
+lag0            lag           UP          lacp: active, rate: fast (1s), hash: layer2
+│               ethernet      UP          00:a0:85:00:02:00
+├ eth7          lag           ACTIVE      active, short_timeout, aggregating, in_sync, collecting, distributing
+└ eth8          lag           ACTIVE      active, short_timeout, aggregating, in_sync, collecting, distributing
 
diff --git a/doc/management.md b/doc/management.md index 2a75214cb..677fd9961 100644 --- a/doc/management.md +++ b/doc/management.md @@ -109,13 +109,13 @@ CLI can be entered from shell in the same way as for SSH. See the 'help' command for an introduction to the system -admin@example:/> show interfaces -INTERFACE PROTOCOL STATE DATA -lo ethernet UP 00:00:00:00:00:00 +admin@example:/> show interface +INTERFACE PROTOCOL STATE DATA +lo ethernet UP 00:00:00:00:00:00 ipv4 127.0.0.1/8 (static) ipv6 ::1/128 (static) -e1 ethernet LOWER-DOWN 00:53:00:06:03:01 -e2 ethernet LOWER-DOWN 00:53:00:06:03:02 +e1 ethernet LOWER-DOWN 00:53:00:06:03:01 +e2 ethernet LOWER-DOWN 00:53:00:06:03:02 ... admin@example:/>
diff --git a/doc/scripting-prod.md b/doc/scripting-prod.md index 70fd1da44..7379636ff 100644 --- a/doc/scripting-prod.md +++ b/doc/scripting-prod.md @@ -39,20 +39,20 @@ Starting out, we assume a configuration where all ports are network interfaces (possibly with IPv6 enabled). ``` -admin@example:/> show interfaces -lo ethernet UP 00:00:00:00:00:00 +admin@example:/> show interface +lo ethernet UP 00:00:00:00:00:00 ipv4 127.0.0.1/8 (static) ipv6 ::1/128 (static) -e1 ethernet LOWER-DOWN 00:53:00:06:11:01 -e2 ethernet LOWER-DOWN 00:53:00:06:11:02 -e3 ethernet LOWER-DOWN 00:53:00:06:11:03 -e4 ethernet LOWER-DOWN 00:53:00:06:11:04 -e5 ethernet LOWER-DOWN 00:53:00:06:11:05 -e6 ethernet LOWER-DOWN 00:53:00:06:11:06 -e7 ethernet LOWER-DOWN 00:53:00:06:11:07 -e8 ethernet LOWER-DOWN 00:53:00:06:11:08 -e9 ethernet LOWER-DOWN 00:53:00:06:11:09 -e10 ethernet UP 00:53:00:06:11:0a +e1 ethernet LOWER-DOWN 00:53:00:06:11:01 +e2 ethernet LOWER-DOWN 00:53:00:06:11:02 +e3 ethernet LOWER-DOWN 00:53:00:06:11:03 +e4 ethernet LOWER-DOWN 00:53:00:06:11:04 +e5 ethernet LOWER-DOWN 00:53:00:06:11:05 +e6 ethernet LOWER-DOWN 00:53:00:06:11:06 +e7 ethernet LOWER-DOWN 00:53:00:06:11:07 +e8 ethernet LOWER-DOWN 00:53:00:06:11:08 +e9 ethernet LOWER-DOWN 00:53:00:06:11:09 +e10 ethernet UP 00:53:00:06:11:0a ipv6 fe80::0053:00ff:fe06:110a/64 (link-layer) admin@example:/> ``` @@ -80,7 +80,7 @@ admin@example:/config/> set interface e10 bridge-port bridge br0 admin@example:/config/> ``` -The interface status can be viewed using `show interfaces` after leaving +The interface status can be viewed using `show interface` after leaving configuration context. When configuring via SSH, first assign an IP address to `br0` *before leaving* configuration context, e.g. @@ -95,10 +95,10 @@ setup, including [setting IP address](#set-ip-address). ``` admin@example:/config/> leave admin@example:/> -admin@example:/> show interfaces -INTERFACE PROTOCOL STATE DATA +admin@example:/> show interface +INTERFACE PROTOCOL STATE DATA br0 bridge -│ ethernet UP 00:53:00:06:11:01 +│ ethernet UP 00:53:00:06:11:01 ├ e1 bridge LOWER-DOWN ├ e2 bridge LOWER-DOWN ├ e3 bridge LOWER-DOWN @@ -109,7 +109,7 @@ br0 bridge ├ e8 bridge LOWER-DOWN ├ e9 bridge LOWER-DOWN └ e10 bridge FORWARDING -lo ethernet UP 00:00:00:00:00:00 +lo ethernet UP 00:00:00:00:00:00 ipv4 127.0.0.1/8 (static) ipv6 ::1/128 (static) admin@example:/> @@ -154,21 +154,21 @@ admin@example:/> Interface status would now should something like the following ``` -admin@example:/> show interfaces -INTERFACE PROTOCOL STATE DATA +admin@example:/> show interface +INTERFACE PROTOCOL STATE DATA br0 bridge -│ ethernet UP 00:53:00:06:11:01 -├ e1 bridge LOWER-DOWN vlan:10u pvid:10 -├ e2 bridge LOWER-DOWN vlan:10u pvid:10 -├ e3 bridge LOWER-DOWN vlan:20u pvid:20 -├ e4 bridge LOWER-DOWN vlan:20u pvid:20 -├ e5 bridge LOWER-DOWN vlan:30u pvid:30 -├ e6 bridge LOWER-DOWN vlan:30u pvid:30 -├ e7 bridge LOWER-DOWN vlan:40u pvid:40 -├ e8 bridge LOWER-DOWN vlan:40u pvid:40 -├ e9 bridge LOWER-DOWN vlan:50u pvid:50 -└ e10 bridge FORWARDING vlan:50u pvid:50 -lo ethernet UP 00:00:00:00:00:00 +│ ethernet UP 00:53:00:06:11:01 +├ e1 bridge LOWER-DOWN vlan:10u pvid: 10 +├ e2 bridge LOWER-DOWN vlan:10u pvid: 10 +├ e3 bridge LOWER-DOWN vlan:20u pvid: 20 +├ e4 bridge LOWER-DOWN vlan:20u pvid: 20 +├ e5 bridge LOWER-DOWN vlan:30u pvid: 30 +├ e6 bridge LOWER-DOWN vlan:30u pvid: 30 +├ e7 bridge LOWER-DOWN vlan:40u pvid: 40 +├ e8 bridge LOWER-DOWN vlan:40u pvid: 40 +├ e9 bridge LOWER-DOWN vlan:50u pvid: 50 +└ e10 bridge FORWARDING vlan:50u pvid: 50 +lo ethernet UP 00:00:00:00:00:00 ipv4 127.0.0.1/8 (static) ipv6 ::1/128 (static) admin@example:/> @@ -181,21 +181,21 @@ patched according to [above](#vlan-snake). We should see link up and *FORWARDING* on all ports in the bridge. ``` -admin@example:/> show interfaces -INTERFACE PROTOCOL STATE DATA +admin@example:/> show interface +INTERFACE PROTOCOL STATE DATA br0 bridge -│ ethernet UP 00:53:00:06:11:01 -├ e1 bridge FORWARDING vlan:10u pvid:10 -├ e2 bridge FORWARDING vlan:10u pvid:10 -├ e3 bridge FORWARDING vlan:20u pvid:20 -├ e4 bridge FORWARDING vlan:20u pvid:20 -├ e5 bridge FORWARDING vlan:30u pvid:30 -├ e6 bridge FORWARDING vlan:30u pvid:30 -├ e7 bridge FORWARDING vlan:40u pvid:40 -├ e8 bridge FORWARDING vlan:40u pvid:40 -├ e9 bridge FORWARDING vlan:50u pvid:50 -└ e10 bridge FORWARDING vlan:50u pvid:50 -lo ethernet UP 00:00:00:00:00:00 +│ ethernet UP 00:53:00:06:11:01 +├ e1 bridge FORWARDING vlan:10u pvid: 10 +├ e2 bridge FORWARDING vlan:10u pvid: 10 +├ e3 bridge FORWARDING vlan:20u pvid: 20 +├ e4 bridge FORWARDING vlan:20u pvid: 20 +├ e5 bridge FORWARDING vlan:30u pvid: 30 +├ e6 bridge FORWARDING vlan:30u pvid: 30 +├ e7 bridge FORWARDING vlan:40u pvid: 40 +├ e8 bridge FORWARDING vlan:40u pvid: 40 +├ e9 bridge FORWARDING vlan:50u pvid: 50 +└ e10 bridge FORWARDING vlan:50u pvid: 50 +lo ethernet UP 00:00:00:00:00:00 ipv4 127.0.0.1/8 (static) ipv6 ::1/128 (static) admin@example:/> @@ -284,26 +284,26 @@ admin@example:/> Interface *vlan10* with an auto-configured IPv6 address should appear. ``` -admin@example:/> show interfaces -INTERFACE PROTOCOL STATE DATA +admin@example:/> show interface +INTERFACE PROTOCOL STATE DATA br0 bridge vlan:10t -│ ethernet UP 00:53:00:06:11:01 -├ e1 bridge FORWARDING vlan:10u pvid:10 -├ e2 bridge FORWARDING vlan:10u pvid:10 -├ e3 bridge FORWARDING vlan:20u pvid:20 -├ e4 bridge FORWARDING vlan:20u pvid:20 -├ e5 bridge FORWARDING vlan:30u pvid:30 -├ e6 bridge FORWARDING vlan:30u pvid:30 -├ e7 bridge FORWARDING vlan:40u pvid:40 -├ e8 bridge FORWARDING vlan:40u pvid:40 -├ e9 bridge FORWARDING vlan:50u pvid:50 -└ e10 bridge FORWARDING vlan:50u pvid:50 -lo ethernet UP 00:00:00:00:00:00 +│ ethernet UP 00:53:00:06:11:01 +├ e1 bridge FORWARDING vlan:10u pvid: 10 +├ e2 bridge FORWARDING vlan:10u pvid: 10 +├ e3 bridge FORWARDING vlan:20u pvid: 20 +├ e4 bridge FORWARDING vlan:20u pvid: 20 +├ e5 bridge FORWARDING vlan:30u pvid: 30 +├ e6 bridge FORWARDING vlan:30u pvid: 30 +├ e7 bridge FORWARDING vlan:40u pvid: 40 +├ e8 bridge FORWARDING vlan:40u pvid: 40 +├ e9 bridge FORWARDING vlan:50u pvid: 50 +└ e10 bridge FORWARDING vlan:50u pvid: 50 +lo ethernet UP 00:00:00:00:00:00 ipv4 127.0.0.1/8 (static) ipv6 ::1/128 (static) -vlan10 ethernet UP 00:53:00:06:11:01 +vlan10 ethernet UP 00:53:00:06:11:01 │ ipv6 fe80::0053:00ff:fe06:1101/64 (link-layer) -└ br0 ethernet UP 00:53:00:06:11:01 +└ br0 ethernet UP 00:53:00:06:11:01 admin@example:/> ``` diff --git a/doc/vpn-wireguard.md b/doc/vpn-wireguard.md index 10255847e..8db1e4e4a 100644 --- a/doc/vpn-wireguard.md +++ b/doc/vpn-wireguard.md @@ -345,12 +345,12 @@ tunnel endpoints use IPv4 or IPv6. Check WireGuard interface status and peer connections: -
admin@example:/> show interfaces
+
admin@example:/> show interface
 wg0             wireguard  UP          2 peers (1 up)
                 ipv4                   10.0.0.1/24 (static)
                 ipv6                   fd00::1/64 (static)
 
-admin@example:/> show interfaces wg0
+admin@example:/> show interface wg0
 name                : wg0
 type                : wireguard
 index               : 12
diff --git a/src/landing/index.html b/src/landing/index.html
index 2a0a4ec51..e481dfe19 100644
--- a/src/landing/index.html
+++ b/src/landing/index.html
@@ -106,14 +106,15 @@ 

Welcome to Infix :-)

} } admin@infix-12-34-56:/config/interface/eth0/> leave -admin@infix-12-34-56:/> show interfaces -INTERFACE PROTOCOL STATE DATA -eth0 ethernet UP 52:54:00:12:34:56 - ipv4 192.168.2.200/24 (static) - ipv6 fe80::5054:ff:fe12:3456/64 (link-layer) -lo ethernet UP 00:00:00:00:00:00 - ipv4 127.0.0.1/8 (static) - ipv6 ::1/128 (static) +admin@infix-12-34-56:/> show interface +INTERFACE PROTOCOL STATE DATA +eth0 1000baseT UP duplex: full + ethernet 52:54:00:12:34:56 + ipv4 192.168.2.200/24 (static) + ipv6 fe80::5054:ff:fe12:3456/64 (link-layer) +lo loopback UP + ipv4 127.0.0.1/8 (static) + ipv6 ::1/128 (static) admin@infix-12-34-56:/> copy running-config startup-config
Click here for more details. From 327085de0f7397c6ab7b1b6f346c2ceddc19816b Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 19 May 2026 05:17:52 +0200 Subject: [PATCH 3/5] doc: add vlan.md, update ChangeLog for the branch Fix #1506: restore the VLAN interface documentation that was lost when networking.md was split into per-topic pages. Content adapted from the v25.11.0 networking.md VLAN section, plus a new "Stacked (Q-in-Q)" section showing `eth0.10.20`-style nesting and the layered `show interface` rendering of the parent chain. Update the interface-type table in networking.md to point at the new vlan.md instead of the dangling ethernet.md#vlan-interfaces anchor. ChangeLog: document the user-facing changes on this branch (YANG model upgrade, layered show interface output, auto-negotation typo fix) and the new VLAN documentation. Signed-off-by: Joachim Wiberg --- doc/ChangeLog.md | 14 ++++++++ doc/bridging.md | 4 +-- doc/ethernet.md | 50 ++------------------------ doc/networking.md | 2 +- doc/vlan.md | 89 +++++++++++++++++++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 6 files changed, 110 insertions(+), 50 deletions(-) create mode 100644 doc/vlan.md diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index 6c3d95ca0..56cc22482 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -10,11 +10,25 @@ All notable changes to the project are documented in this file. - Upgrade Linux kernel to 6.18.31 (LTS) - Upgrade FRR to 10.5.4 +- Upgrade `ieee802-ethernet-interface` YANG model to revision 2025-09-10 (IEEE + Std 802.3.2-2025), adding the standard `phy-type` and `pmd-type` operational + leaves. Speed is now exposed via `ietf-interfaces:speed` (bps, RFC 8343); + the now obsolete `eth:speed` is no longer returned +- Rework `show interface` summary output as layered protocol rows. When a + port has link, a physical-medium row (e.g. `1000baseT`, `10GbaseLR`) appears + above the `ethernet` row. VLAN, GRE, VXLAN and WiFi interfaces likewise get + one row per protocol layer, with type-specific data on each (`vid:`, + `remote:`, `vni:`, `station ssid:`, etc.), issue #530 ### Fixes - Fix #1493: container with a physical interface not properly removed when switching to a configuration without containers +- Fix #1506: add documentation on how to configure VLAN interfaces, + including stacked (Q-in-Q) VLAN interfaces, in a dedicated `vlan.md` +- Fix long-standing typo `auto-negotation` in `yanger`, which caused + the operational `auto-negotiation/enable` leaf to always read as + `unknown` regardless of the actual port setting - Handle unclean daemon exits better, e.g., `dbus-daemon` crashing and leaving a stale pidfile behind, causing it to refuse to be restarted - Fix occasional blank or garbled `[ OK ]` lines at startup diff --git a/doc/bridging.md b/doc/bridging.md index 187cb980a..3ba38052a 100644 --- a/doc/bridging.md +++ b/doc/bridging.md @@ -73,8 +73,8 @@ admin@example:/config/interface/br0/> set bridge vlans vlan 20 tagged br0
To route or to manage via a VLAN, a VLAN interface needs to be created -on top of the bridge, see section [VLAN Interfaces](ethernet.md#vlan-interfaces) -for more on this topic. +on top of the bridge, see section [VLAN Interfaces](vlan.md) for more +on this topic. > [!NOTE] > In some use-cases only a single management VLAN on the bridge is used. diff --git a/doc/ethernet.md b/doc/ethernet.md index d877500d8..697e1daad 100644 --- a/doc/ethernet.md +++ b/doc/ethernet.md @@ -1,52 +1,8 @@ # Ethernet Interfaces -This document covers VLAN interfaces, physical Ethernet interfaces, -and virtual Ethernet (VETH) pairs. - - -## VLAN Interfaces - -Creating a VLAN can be done in many ways. This section assumes VLAN -interfaces created atop another Linux interface. E.g., the VLAN -interfaces created on top of the Ethernet interface or bridge in the -picture below. - -![VLAN interface on top of Ethernet or Bridge interfaces](img/interface-vlan-variants.svg) - -A VLAN interface is basically a filtering abstraction. When you run -`tcpdump` on a VLAN interface you will only see the frames matching the -VLAN ID of the interface, compared to *all* the VLAN IDs if you run -`tcpdump` on the lower-layer interface. - -
admin@example:/> configure
-admin@example:/config/> edit interface eth0.20
-admin@example:/config/interface/eth0.20/> show
-type vlan;
-vlan {
-  tag-type c-vlan;
-  id 20;
-  lower-layer-if eth0;
-}
-admin@example:/config/interface/eth0.20/> leave
-
- -The example below assumes bridge br0 is already created, see [VLAN -Filtering Bridge](bridging.md#vlan-filtering-bridge). - -
admin@example:/> configure
-admin@example:/config/> edit interface vlan10
-admin@example:/config/interface/vlan10/> set vlan id 10
-admin@example:/config/interface/vlan10/> set vlan lower-layer-if br0
-admin@example:/config/interface/vlan10/> leave
-
- -As conventions, a VLAN interface for VID 20 on top of an Ethernet -interface *eth0* is named *eth0.20*, and a VLAN interface for VID 10 on -top of a bridge interface *br0* is named *vlan10*. - -> [!NOTE] -> If you name your VLAN interface `foo0.N` or `vlanN`, where `N` is a -> number, the CLI infers the interface type automatically. +This document covers physical Ethernet interfaces and virtual Ethernet +(VETH) pairs. For VLAN interfaces stacked on top of an Ethernet port +or bridge, see [VLAN Interfaces](vlan.md). ## Physical Ethernet Interfaces diff --git a/doc/networking.md b/doc/networking.md index bbe10226f..cb799a9d8 100644 --- a/doc/networking.md +++ b/doc/networking.md @@ -47,7 +47,7 @@ other traffic would be bridged as usual. |----------|----------------------------|--------------------------------------------------------------| | [bridge](bridging.md) | infix-if-bridge | SW implementation of an IEEE 802.1Q bridge | | [ip](ip.md) | ietf-ip, infix-ip | IP address to the subordinate interface | -| [vlan](ethernet.md#vlan-interfaces) | infix-if-vlan | Capture all traffic belonging to a specific 802.1Q VID | +| [vlan](vlan.md) | infix-if-vlan | Capture all traffic belonging to a specific 802.1Q VID | | [lag](lag.md) | infix-if-lag | Link aggregation, static and IEEE 802.3ad (LACP) | | lo | ietf-interfaces | Software loopback interface | | [eth](ethernet.md#physical-ethernet-interfaces) | ieee802-ethernet-interface | Physical Ethernet device/port | diff --git a/doc/vlan.md b/doc/vlan.md new file mode 100644 index 000000000..687ecae29 --- /dev/null +++ b/doc/vlan.md @@ -0,0 +1,89 @@ +# VLAN Interfaces + +A VLAN interface is an interface stacked on top of another Linux interface +that filters traffic for a single 802.1Q VID. `tcpdump` on a VLAN interface +shows only frames matching that VID, compared to *all* VIDs when listening +on the lower-layer interface. + +![VLAN interface on top of Ethernet or Bridge interfaces](img/interface-vlan-variants.svg) + +This page covers VLAN interfaces stacked on Ethernet, on a VLAN-filtering +bridge, and on other VLAN interfaces. For VLAN handling *inside* a bridge +(port VIDs, tagged/untagged membership, pvid), see [VLAN Filtering +Bridge](bridging.md#vlan-filtering-bridge). + +## On Top of an Ethernet Interface + +A VLAN interface for VID 20 on top of an Ethernet interface `eth0` is by +convention named `eth0.20`. + +
admin@example:/> configure
+admin@example:/config/> edit interface eth0.20
+admin@example:/config/interface/eth0.20/> show
+type vlan;
+vlan {
+  tag-type c-vlan;
+  id 20;
+  lower-layer-if eth0;
+}
+admin@example:/config/interface/eth0.20/> leave
+
+ +The `tag-type` defaults to `c-vlan` (802.1Q customer VLAN, EtherType 0x8100). +Set to `s-vlan` (802.1ad service VLAN, EtherType 0x88A8) to terminate an outer +S-Tag. + +> [!TIP] +> If you name your VLAN interface `foo0.N` or `vlanN`, where `N` is a +> number, the CLI infers the interface type automatically. Otherwise +> the type must be set explicitly. + +## On Top of a Bridge + +When the lower-layer interface is a VLAN-filtering bridge, the VLAN interface +gives the CPU an IP-addressable endpoint inside the bridged broadcast domain +for that VID. This pattern is named `vlanN` by convention. + +
admin@example:/> configure
+admin@example:/config/> edit interface vlan10
+admin@example:/config/interface/vlan10/> set vlan id 10
+admin@example:/config/interface/vlan10/> set vlan lower-layer-if br0
+admin@example:/config/interface/vlan10/> leave
+
+ +The bridge `br0` must have VLAN 10 configured with the bridge itself as a +tagged member. See [VLAN Filtering Bridge](bridging.md#vlan-filtering-bridge) +for the bridge-side configuration. + +## Stacked (Q-in-Q) + +VLAN interfaces can be stacked. A VLAN interface whose lower-layer is itself +a VLAN interface terminates the inner tag, leaving the outer tag for the +parent to handle. + +
admin@example:/> configure
+admin@example:/config/> edit interface eth0.10
+admin@example:/config/interface/eth0.10/> set vlan tag-type s-vlan
+admin@example:/config/interface/eth0.10/> leave
+admin@example:/config/> edit interface eth0.10.20
+admin@example:/config/interface/eth0.10.20/> show
+type vlan;
+vlan {
+  tag-type c-vlan;
+  id 20;
+  lower-layer-if eth0.10;
+}
+admin@example:/config/interface/eth0.10.20/> leave
+
+ +The summary view shows each VLAN row pointing at its immediate parent: + +
admin@example:/> show interface
+INTERFACE       PROTOCOL      STATE       DATA                  
+eth0.10         vlan          UP          vid: 10
+│               ipv4                      10.0.10.1/24 (static)
+└ eth0
+eth0.10.20      vlan          UP          vid: 20
+│               ipv4                      10.0.10.20/28 (static)
+└ eth0.10
+
diff --git a/mkdocs.yml b/mkdocs.yml index 9e92c10d6..11769c7d1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -33,6 +33,7 @@ nav: - Bridging: bridging.md - Link Aggregation: lag.md - Ethernet Interfaces: ethernet.md + - VLAN Interfaces: vlan.md - IP Addressing: ip.md - Routing: routing.md - Firewall Configuration: firewall.md From 97b8c02a7682646057bcd72c7131a8ee3fbb4fe9 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 19 May 2026 07:46:06 +0200 Subject: [PATCH 4/5] cli: tighten 'show interface' detail-view alignment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Ethernet packet/RMON counters at the bottom of 'show interface ' were appended with a wider label column than the operational data above them, breaking visual alignment. Group them under an "Ethernet Statistics" section heading (Decore.title), same convention as 'Available Networks' in the wifi scan view. Narrow the operational-data label column from 20 to 19 chars so the title bar exactly matches the heading text — a tighter and more deliberately aligned look. All labels in pr_iface fit within 19 chars except 'lacp system priority' (20); rename it to 'lacp sys priority' for consistency with the other 'lacp ...' labels (lacp aggregate id, lacp partner mac, ...) so the new field width works universally. Refresh CLI snapshots and doc samples to match. Signed-off-by: Joachim Wiberg --- doc/ethernet.md | 101 ++++++++-------- doc/iface.md | 6 +- doc/lag.md | 96 ++++++++-------- doc/vpn-wireguard.md | 10 +- doc/wifi.md | 46 ++++---- src/statd/python/cli_pretty/cli_pretty.py | 108 +++++++++--------- .../cli/show-interfaces_-n_br-0 | 18 +-- .../cli/show-interfaces_-n_br-D | 22 ++-- .../cli/show-interfaces_-n_br-Q | 18 +-- .../cli/show-interfaces_-n_br-Q.40 | 20 ++-- .../cli/show-interfaces_-n_br-X | 18 +-- .../cli/show-interfaces_-n_gre-v4 | 20 ++-- .../cli/show-interfaces_-n_gre-v6 | 20 ++-- .../cli/show-interfaces_-n_gretap-v4 | 22 ++-- .../cli/show-interfaces_-n_gretap-v6 | 22 ++-- .../cli/show-interfaces_-n_veth0a | 22 ++-- .../cli/show-interfaces_-n_veth0a.20 | 20 ++-- .../cli/show-interfaces_-n_veth0b | 22 ++-- .../cli/show-interfaces_-n_vxlan-v4 | 24 ++-- .../cli/show-interfaces_-n_vxlan-v6 | 24 ++-- 20 files changed, 330 insertions(+), 329 deletions(-) diff --git a/doc/ethernet.md b/doc/ethernet.md index 697e1daad..d27489e7e 100644 --- a/doc/ethernet.md +++ b/doc/ethernet.md @@ -42,34 +42,34 @@ The detail view spells everything out, including auto-negotiation state and the speed in Mbit/s.
admin@example:/> show interface eth1
-name                : eth1
-index               : 2
-mtu                 : 1500
-operational status  : up
-link mode           : 1000baseT
-auto-negotiation    : on
-duplex              : full
-speed               : 1000
-physical address    : 00:53:00:06:11:01
-ipv4 addresses      :
-ipv6 addresses      :
-in-octets           : 75581
-out-octets          : 43130
+name               : eth1
+index              : 2
+mtu                : 1500
+operational status : up
+link mode          : 1000baseT
+auto-negotiation   : on
+duplex             : full
+speed              : 1000
+physical address   : 00:53:00:06:11:01
+ipv4 addresses     :
+ipv6 addresses     :
+in-octets          : 75581
+out-octets         : 43130
 ...
 admin@example:/> show interface eth4
-name                : eth4
-index               : 5
-mtu                 : 1500
-operational status  : up
-link mode           : 100baseTX
-auto-negotiation    : on
-duplex              : full
-speed               : 100
-physical address    : 00:53:00:06:11:04
-ipv4 addresses      :
-ipv6 addresses      :
-in-octets           : 75439
-out-octets          : 550704
+name               : eth4
+index              : 5
+mtu                : 1500
+operational status : up
+link mode          : 100baseTX
+auto-negotiation   : on
+duplex             : full
+speed              : 100
+physical address   : 00:53:00:06:11:04
+ipv4 addresses     :
+ipv6 addresses     :
+in-octets          : 75439
+out-octets         : 550704
 ...
 admin@example:/>
 
@@ -114,30 +114,31 @@ require auto-negotiation to be enabled. Ethernet packet statistics[^1] can be listed as shown below.
admin@example:/> show interface eth1
-name                : eth1
-index               : 2
-mtu                 : 1500
-operational status  : up
-link mode           : 1000baseT
-auto-negotiation    : on
-duplex              : full
-speed               : 1000
-physical address    : 00:53:00:06:11:0a
-ipv4 addresses      :
-ipv6 addresses      :
-in-octets           : 75581
-out-octets          : 43130
-
-eth-in-frames                : 434
-eth-in-multicast-frames      : 296
-eth-in-broadcast-frames      : 138
-eth-in-error-fcs-frames      : 0
-eth-in-error-oversize-frames : 0
-eth-out-frames               : 310
-eth-out-multicast-frames     : 310
-eth-out-broadcast-frames     : 0
-eth-out-good-octets          : 76821
-eth-in-good-octets           : 60598
+name               : eth1
+index              : 2
+mtu                : 1500
+operational status : up
+link mode          : 1000baseT
+auto-negotiation   : on
+duplex             : full
+speed              : 1000
+physical address   : 00:53:00:06:11:0a
+ipv4 addresses     :
+ipv6 addresses     :
+in-octets          : 75581
+out-octets         : 43130
+───────────────────
+Ethernet Statistics
+in-frames                : 434
+in-multicast-frames      : 296
+in-broadcast-frames      : 138
+in-error-fcs-frames      : 0
+in-error-oversize-frames : 0
+out-frames               : 310
+out-multicast-frames     : 310
+out-broadcast-frames     : 0
+out-good-octets          : 76821
+in-good-octets           : 60598
 admin@example:/>
 
diff --git a/doc/iface.md b/doc/iface.md index 94a549f34..679fe5021 100644 --- a/doc/iface.md +++ b/doc/iface.md @@ -90,9 +90,9 @@ The description is visible in the operational datastore and in `show` commands:
admin@example:/> show interface eth0
-name                : eth0
-description         : Uplink to core switch
-index               : 2
+name               : eth0
+description        : Uplink to core switch
+index              : 2
 ...
 
diff --git a/doc/lag.md b/doc/lag.md index 93f2b9efa..b6b849341 100644 --- a/doc/lag.md +++ b/doc/lag.md @@ -124,45 +124,45 @@ In addition to basic status shown in the interface overview, detailed LAG status can be inspected:
admin@example:/> show interface lag0
-name                : lag0
-index               : 25
-mtu                 : 1500
-operational status  : up
-physical address    : 00:a0:85:00:02:00
-lag mode            : static
-lag type            : balance-xor
-lag hash            : layer2
-link debounce up    : 0 msec
-link debounce down  : 0 msec
-ipv4 addresses      :
-ipv6 addresses      :
-in-octets           : 0
-out-octets          : 2142
+name               : lag0
+index              : 25
+mtu                : 1500
+operational status : up
+physical address   : 00:a0:85:00:02:00
+lag mode           : static
+lag type           : balance-xor
+lag hash           : layer2
+link debounce up   : 0 msec
+link debounce down : 0 msec
+ipv4 addresses     :
+ipv6 addresses     :
+in-octets          : 0
+out-octets         : 2142
 
Same aggregate, but in LACP mode:
admin@example:/> show interface lag0
-name                : lag0
-index               : 24
-mtu                 : 1500
-operational status  : up
-physical address    : 00:a0:85:00:02:00
-lag mode            : lacp
-lag hash            : layer2
-lacp mode           : active
-lacp rate           : fast (1s)
-lacp aggregate id   : 1
+name               : lag0
+index              : 24
+mtu                : 1500
+operational status : up
+physical address   : 00:a0:85:00:02:00
+lag mode           : lacp
+lag hash           : layer2
+lacp mode          : active
+lacp rate          : fast (1s)
+lacp aggregate id  : 1
 lacp system priority: 65535
-lacp actor key      : 9
-lacp partner key    : 9
-lacp partner mac    : 00:a0:85:00:03:00
-link debounce up    : 0 msec
-link debounce down  : 0 msec
-ipv4 addresses      :
-ipv6 addresses      :
-in-octets           : 100892
-out-octets          : 111776
+lacp actor key     : 9
+lacp partner key   : 9
+lacp partner mac   : 00:a0:85:00:03:00
+link debounce up   : 0 msec
+link debounce down : 0 msec
+ipv4 addresses     :
+ipv6 addresses     :
+in-octets          : 100892
+out-octets         : 111776
 
Member ports provide additional status information: @@ -184,21 +184,21 @@ Member ports provide additional status information: Example member port status:
admin@example:/> show interface eth7
-name                : eth7
-index               : 8
-mtu                 : 1500
-operational status  : up
-physical address    : 00:a0:85:00:02:00
-lag member          : lag0
-lag member state    : active
-lacp aggregate id   : 1
-lacp actor state    : active, short_timeout, aggregating, in_sync, collecting, distributing
-lacp partner state  : active, short_timeout, aggregating, in_sync, collecting, distributing
-link failure count  : 0
-ipv4 addresses      :
-ipv6 addresses      :
-in-octets           : 473244
-out-octets          : 499037
+name               : eth7
+index              : 8
+mtu                : 1500
+operational status : up
+physical address   : 00:a0:85:00:02:00
+lag member         : lag0
+lag member state   : active
+lacp aggregate id  : 1
+lacp actor state   : active, short_timeout, aggregating, in_sync, collecting, distributing
+lacp partner state : active, short_timeout, aggregating, in_sync, collecting, distributing
+link failure count : 0
+ipv4 addresses     :
+ipv6 addresses     :
+in-octets          : 473244
+out-octets         : 499037
 
diff --git a/doc/vpn-wireguard.md b/doc/vpn-wireguard.md index 8db1e4e4a..a3d41b97d 100644 --- a/doc/vpn-wireguard.md +++ b/doc/vpn-wireguard.md @@ -351,11 +351,11 @@ wg0 wireguard UP 2 peers (1 up) ipv6 fd00::1/64 (static) admin@example:/> show interface wg0 -name : wg0 -type : wireguard -index : 12 -operational status : up -peers : 2 +name : wg0 +type : wireguard +index : 12 +operational status : up +peers : 2 Peer 1: status : UP diff --git a/doc/wifi.md b/doc/wifi.md index 96183a6db..661f79c81 100644 --- a/doc/wifi.md +++ b/doc/wifi.md @@ -213,22 +213,22 @@ access-point). Use `show interface` to see discovered networks and their signal strength:
admin@example:/> show interface wifi0
-name                : wifi0
-type                : wifi
-index               : 3
-mtu                 : 1500
-operational status  : up
-ip forwarding       : enabled
-physical address    : f0:09:0d:36:5f:86
-ipv4 addresses      : 192.168.1.100/24 (dhcp)
-ipv6 addresses      :
-in-octets           : 148388
-out-octets          : 24555
-mode                : station
-ssid                : MyNetwork
-signal              : -45 dBm (good)
-rx bitrate          : 72.2 Mbps
-tx bitrate          : 86.6 Mbps
+name               : wifi0
+type               : wifi
+index              : 3
+mtu                : 1500
+operational status : up
+ip forwarding      : enabled
+physical address   : f0:09:0d:36:5f:86
+ipv4 addresses     : 192.168.1.100/24 (dhcp)
+ipv6 addresses     :
+in-octets          : 148388
+out-octets         : 24555
+mode               : station
+ssid               : MyNetwork
+signal             : -45 dBm (good)
+rx bitrate         : 72.2 Mbps
+tx bitrate         : 86.6 Mbps
 ──────────────────────────────────────────────────────────────────────
 Available Networks
 SSID                 BSSID              SECURITY       SIGNAL  CHANNEL
@@ -294,13 +294,13 @@ admin@example:/config/interface/wifi0/> leave
 The connection attempt will start immediately. You can verify the connection status:
 
 
admin@example:/> show interface wifi0
-name                : wifi0
-type                : wifi
-operational status  : up
-physical address    : f0:09:0d:36:5f:86
-mode                : station
-ssid                : MyHomeNetwork
-signal              : -52 dBm (good)
+name               : wifi0
+type               : wifi
+operational status : up
+physical address   : f0:09:0d:36:5f:86
+mode               : station
+ssid               : MyHomeNetwork
+signal             : -52 dBm (good)
 
**Station configuration parameters:** diff --git a/src/statd/python/cli_pretty/cli_pretty.py b/src/statd/python/cli_pretty/cli_pretty.py index fbb792344..22ef48b94 100755 --- a/src/statd/python/cli_pretty/cli_pretty.py +++ b/src/statd/python/cli_pretty/cli_pretty.py @@ -1549,65 +1549,65 @@ def pr_container(self): def pr_iface(self): if self.is_in_container(): - print(Decore.gray_bg(f"{'owned by container':<{20}}: {', ' . join(self.containers)}")) + print(Decore.gray_bg(f"{'owned by container':<{19}}: {', ' . join(self.containers)}")) - print(f"{'name':<{20}}: {self.name}") - print(f"{'type':<{20}}: {self.type.split(':')[1]}") - print(f"{'index':<{20}}: {self.index}") + print(f"{'name':<{19}}: {self.name}") + print(f"{'type':<{19}}: {self.type.split(':')[1]}") + print(f"{'index':<{19}}: {self.index}") if self.mtu: - print(f"{'mtu':<{20}}: {self.mtu}") + print(f"{'mtu':<{19}}: {self.mtu}") if self.oper(): - print(f"{'operational status':<{20}}: {self.oper(detail=True)}") + print(f"{'operational status':<{19}}: {self.oper(detail=True)}") forwarding = "enabled" if self.name in Iface._routing_ifaces else "disabled" - print(f"{'ip forwarding':<{20}}: {forwarding}") + print(f"{'ip forwarding':<{19}}: {forwarding}") if self.lower_if: - print(f"{'lower-layer-if':<{20}}: {self.lower_if}") + print(f"{'lower-layer-if':<{19}}: {self.lower_if}") if label := self._phy_label(): - print(f"{'link mode':<{20}}: {label}") + print(f"{'link mode':<{19}}: {label}") if self.autoneg != 'unknown': val = "on" if self.autoneg else "off" - print(f"{'auto-negotiation':<{20}}: {val}") + print(f"{'auto-negotiation':<{19}}: {val}") if self.duplex: - print(f"{'duplex':<{20}}: {self.duplex}") + print(f"{'duplex':<{19}}: {self.duplex}") if self.speed: mbps = int(self.speed) // 1_000_000 - print(f"{'speed':<{20}}: {mbps}") + print(f"{'speed':<{19}}: {mbps}") if self.phys_address: - print(f"{'physical address':<{20}}: {self.phys_address}") + print(f"{'physical address':<{19}}: {self.phys_address}") if self.lag_mode: - print(f"{'lag mode':<{20}}: {self.lag_mode}") + print(f"{'lag mode':<{19}}: {self.lag_mode}") if self.lag_mode == "lacp": - print(f"{'lag hash':<{20}}: {self.lag_hash}") - print(f"{'lacp mode':<{20}}: {self.lacp_mode}") - print(f"{'lacp rate':<{20}}: {self.lacp_rate}") - print(f"{'lacp aggregate id':<{20}}: {self.lacp_id}") - print(f"{'lacp system priority':<{20}}: {self.lacp_sys_prio}") - print(f"{'lacp actor key':<{20}}: {self.lacp_actor_key}") - print(f"{'lacp partner key':<{20}}: {self.lacp_partner_key}") - print(f"{'lacp partner mac':<{20}}: {self.lacp_partner_mac}") + print(f"{'lag hash':<{19}}: {self.lag_hash}") + print(f"{'lacp mode':<{19}}: {self.lacp_mode}") + print(f"{'lacp rate':<{19}}: {self.lacp_rate}") + print(f"{'lacp aggregate id':<{19}}: {self.lacp_id}") + print(f"{'lacp sys priority':<{19}}: {self.lacp_sys_prio}") + print(f"{'lacp actor key':<{19}}: {self.lacp_actor_key}") + print(f"{'lacp partner key':<{19}}: {self.lacp_partner_key}") + print(f"{'lacp partner mac':<{19}}: {self.lacp_partner_mac}") else: - print(f"{'lag type':<{20}}: {self.lag_type}") - print(f"{'lag hash':<{20}}: {self.lag_hash}") - print(f"{'link debounce up':<{20}}: {self.link_updelay} msec") - print(f"{'link debounce down':<{20}}: {self.link_downdelay} msec") + print(f"{'lag type':<{19}}: {self.lag_type}") + print(f"{'lag hash':<{19}}: {self.lag_hash}") + print(f"{'link debounce up':<{19}}: {self.link_updelay} msec") + print(f"{'link debounce down':<{19}}: {self.link_downdelay} msec") if self.lag: - print(f"{'lag member':<{20}}: {self.lag}") - print(f"{'lag member state':<{20}}: {self.lag_state}") + print(f"{'lag member':<{19}}: {self.lag}") + print(f"{'lag member state':<{19}}: {self.lag_state}") if self.lacp_state: - print(f"{'lacp aggregate id':<{20}}: {self.lacp_id}") - print(f"{'lacp actor state':<{20}}: {', '.join(self.lacp_state)}") - print(f"{'lacp partner state':<{20}}: {', '.join(self.lacp_pstate)}") - print(f"{'link failure count':<{20}}: {self.link_failures}") + print(f"{'lacp aggregate id':<{19}}: {self.lacp_id}") + print(f"{'lacp actor state':<{19}}: {', '.join(self.lacp_state)}") + print(f"{'lacp partner state':<{19}}: {', '.join(self.lacp_pstate)}") + print(f"{'link failure count':<{19}}: {self.link_failures}") if self.ipv4_addr: first = True @@ -1615,12 +1615,12 @@ def pr_iface(self): origin = f"({addr['origin']})" if addr.get('origin') else "" key = 'ipv4 addresses' if first else '' colon = ':' if first else ' ' - row = f"{key:<{20}}{colon} " + row = f"{key:<{19}}{colon} " row += f"{addr['ip']}/{addr['prefix-length']} {origin}" print(row) first = False else: - print(f"{'ipv4 addresses':<{20}}:") + print(f"{'ipv4 addresses':<{19}}:") if self.ipv6_addr: first = True @@ -1628,16 +1628,16 @@ def pr_iface(self): origin = f"({addr['origin']})" if addr.get('origin') else "" key = 'ipv6 addresses' if first else '' colon = ':' if first else ' ' - row = f"{key:<{20}}{colon} " + row = f"{key:<{19}}{colon} " row += f"{addr['ip']}/{addr['prefix-length']} {origin}" print(row) first = False else: - print(f"{'ipv6 addresses':<{20}}:") + print(f"{'ipv6 addresses':<{19}}:") if self.in_octets and self.out_octets: - print(f"{'in-octets':<{20}}: {self.in_octets}") - print(f"{'out-octets':<{20}}: {self.out_octets}") + print(f"{'in-octets':<{19}}: {self.in_octets}") + print(f"{'out-octets':<{19}}: {self.out_octets}") if self.wifi: # Detect mode: AP has "stations", Station has "signal-strength" or "scan-results" @@ -1647,43 +1647,43 @@ def pr_iface(self): ssid = ap.get('ssid', "----") stations_data = ap.get("stations", {}) stations = stations_data.get("station", []) - print(f"{'mode':<{20}}: {mode}") - print(f"{'ssid':<{20}}: {ssid}") - print(f"{'connected stations':<{20}}: {len(stations)}") + print(f"{'mode':<{19}}: {mode}") + print(f"{'ssid':<{19}}: {ssid}") + print(f"{'connected stations':<{19}}: {len(stations)}") self.pr_wifi_stations() else: mode = "station" station = self.wifi.get('station', {}) signal = station.get('signal-strength') ssid = station.get('ssid', "----") - print(f"{'mode':<{20}}: {mode}") - print(f"{'ssid':<{20}}: {ssid}") + print(f"{'mode':<{19}}: {mode}") + print(f"{'ssid':<{19}}: {ssid}") if signal is not None: signal_status = signal_to_status(signal) - print(f"{'signal':<{20}}: {signal} dBm ({signal_status})") + print(f"{'signal':<{19}}: {signal} dBm ({signal_status})") rx_speed = station.get('rx-speed') tx_speed = station.get('tx-speed') if rx_speed is not None: - print(f"{'rx bitrate':<{20}}: {rx_speed / 10:.1f} Mbps") + print(f"{'rx bitrate':<{19}}: {rx_speed / 10:.1f} Mbps") if tx_speed is not None: - print(f"{'tx bitrate':<{20}}: {tx_speed / 10:.1f} Mbps") + print(f"{'tx bitrate':<{19}}: {tx_speed / 10:.1f} Mbps") if "scan-results" in station: self.pr_wifi_ssids() if self.gre: - print(f"{'local address':<{20}}: {self.gre['local']}") - print(f"{'remote address':<{20}}: {self.gre['remote']}") + print(f"{'local address':<{19}}: {self.gre['local']}") + print(f"{'remote address':<{19}}: {self.gre['remote']}") if self.vxlan: - print(f"{'local address':<{20}}: {self.vxlan['local']}") - print(f"{'remote address':<{20}}: {self.vxlan['remote']}") - print(f"{'VxLAN id':<{20}}: {self.vxlan['vni']}") + print(f"{'local address':<{19}}: {self.vxlan['local']}") + print(f"{'remote address':<{19}}: {self.vxlan['remote']}") + print(f"{'VxLAN id':<{19}}: {self.vxlan['vni']}") if self.wireguard: peer_status = self.wireguard.get('peer-status', {}) peers = peer_status.get('peer', []) if peers: - print(f"{'peers':<{20}}: {len(peers)}") + print(f"{'peers':<{19}}: {len(peers)}") for idx, peer in enumerate(peers, 1): print(f"\n Peer {idx}:") @@ -1720,10 +1720,10 @@ def pr_iface(self): frame = get_json_data([], self.data,'ieee802-ethernet-interface:ethernet', 'statistics', 'frame') if frame: - print("") + Decore.title("Ethernet Statistics") for key, val in frame.items(): key = remove_yang_prefix(key) - print(f"eth-{key:<{25}}: {val}") + print(f"{key:<{25}}: {val}") def pr_mdb(self, bridge): for group in self.br_mdb.get("multicast-filter", {}): diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-0 b/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-0 index ada755b4b..f3a338758 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-0 +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-0 @@ -1,9 +1,9 @@ -name : br-0 -type : bridge -index : 9 -mtu : 1500 -operational status : down -ip forwarding : disabled -physical address : 00:a0:85:00:03:00 -ipv4 addresses : -ipv6 addresses : +name : br-0 +type : bridge +index : 9 +mtu : 1500 +operational status : down +ip forwarding : disabled +physical address : 00:a0:85:00:03:00 +ipv4 addresses : +ipv6 addresses : diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-D b/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-D index a7cf8ca8f..2c30ec700 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-D +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-D @@ -1,11 +1,11 @@ -name : br-D -type : bridge -index : 15 -mtu : 1500 -operational status : up -ip forwarding : disabled -physical address : 00:a0:85:00:03:00 -ipv4 addresses : 10.0.0.1/8 (static) - 192.168.20.1/24 (static) -ipv6 addresses : 2001:db8::1/64 (static) - fe80::2a0:85ff:fe00:300/64 (link-layer) +name : br-D +type : bridge +index : 15 +mtu : 1500 +operational status : up +ip forwarding : disabled +physical address : 00:a0:85:00:03:00 +ipv4 addresses : 10.0.0.1/8 (static) + 192.168.20.1/24 (static) +ipv6 addresses : 2001:db8::1/64 (static) + fe80::2a0:85ff:fe00:300/64 (link-layer) diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-Q b/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-Q index f149ac4df..f5be2191d 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-Q +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-Q @@ -1,9 +1,9 @@ -name : br-Q -type : bridge -index : 16 -mtu : 1500 -operational status : up -ip forwarding : disabled -physical address : 00:a0:85:00:03:00 -ipv4 addresses : -ipv6 addresses : +name : br-Q +type : bridge +index : 16 +mtu : 1500 +operational status : up +ip forwarding : disabled +physical address : 00:a0:85:00:03:00 +ipv4 addresses : +ipv6 addresses : diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-Q.40 b/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-Q.40 index 79d1e0582..bc2ddbbd5 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-Q.40 +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-Q.40 @@ -1,10 +1,10 @@ -name : br-Q.40 -type : vlan -index : 17 -mtu : 1500 -operational status : up -ip forwarding : disabled -lower-layer-if : br-Q -physical address : 00:a0:85:00:03:00 -ipv4 addresses : -ipv6 addresses : +name : br-Q.40 +type : vlan +index : 17 +mtu : 1500 +operational status : up +ip forwarding : disabled +lower-layer-if : br-Q +physical address : 00:a0:85:00:03:00 +ipv4 addresses : +ipv6 addresses : diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-X b/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-X index 29e6717cc..5e9bc6126 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-X +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_br-X @@ -1,9 +1,9 @@ -name : br-X -type : bridge -index : 11 -mtu : 1500 -operational status : up -ip forwarding : disabled -physical address : 00:a0:85:00:03:00 -ipv4 addresses : -ipv6 addresses : +name : br-X +type : bridge +index : 11 +mtu : 1500 +operational status : up +ip forwarding : disabled +physical address : 00:a0:85:00:03:00 +ipv4 addresses : +ipv6 addresses : diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_gre-v4 b/test/case/statd/interfaces-all/cli/show-interfaces_-n_gre-v4 index 0b384b6bb..5e1386e74 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_gre-v4 +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_gre-v4 @@ -1,10 +1,10 @@ -name : gre-v4 -type : gre -index : 19 -mtu : 1476 -operational status : up -ip forwarding : disabled -ipv4 addresses : -ipv6 addresses : -local address : 192.168.20.1 -remote address : 192.168.20.2 +name : gre-v4 +type : gre +index : 19 +mtu : 1476 +operational status : up +ip forwarding : disabled +ipv4 addresses : +ipv6 addresses : +local address : 192.168.20.1 +remote address : 192.168.20.2 diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_gre-v6 b/test/case/statd/interfaces-all/cli/show-interfaces_-n_gre-v6 index a8e11775a..fa1f40b28 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_gre-v6 +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_gre-v6 @@ -1,10 +1,10 @@ -name : gre-v6 -type : gre -index : 20 -mtu : 1448 -operational status : up -ip forwarding : disabled -ipv4 addresses : 192.168.50.2/16 (static) -ipv6 addresses : -local address : 2001:db8::1 -remote address : 2001:db8::2 +name : gre-v6 +type : gre +index : 20 +mtu : 1448 +operational status : up +ip forwarding : disabled +ipv4 addresses : 192.168.50.2/16 (static) +ipv6 addresses : +local address : 2001:db8::1 +remote address : 2001:db8::2 diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_gretap-v4 b/test/case/statd/interfaces-all/cli/show-interfaces_-n_gretap-v4 index a33278028..87834dbb6 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_gretap-v4 +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_gretap-v4 @@ -1,11 +1,11 @@ -name : gretap-v4 -type : gretap -index : 21 -mtu : 1462 -operational status : up -ip forwarding : disabled -physical address : f6:d4:96:d8:9f:96 -ipv4 addresses : -ipv6 addresses : -local address : 192.168.20.1 -remote address : 192.168.20.2 +name : gretap-v4 +type : gretap +index : 21 +mtu : 1462 +operational status : up +ip forwarding : disabled +physical address : f6:d4:96:d8:9f:96 +ipv4 addresses : +ipv6 addresses : +local address : 192.168.20.1 +remote address : 192.168.20.2 diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_gretap-v6 b/test/case/statd/interfaces-all/cli/show-interfaces_-n_gretap-v6 index 24850d75d..eb25e8932 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_gretap-v6 +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_gretap-v6 @@ -1,11 +1,11 @@ -name : gretap-v6 -type : gretap -index : 22 -mtu : 1434 -operational status : up -ip forwarding : disabled -physical address : 7a:46:13:bd:fa:e6 -ipv4 addresses : -ipv6 addresses : -local address : 2001:db8::1 -remote address : 2001:db8::2 +name : gretap-v6 +type : gretap +index : 22 +mtu : 1434 +operational status : up +ip forwarding : disabled +physical address : 7a:46:13:bd:fa:e6 +ipv4 addresses : +ipv6 addresses : +local address : 2001:db8::1 +remote address : 2001:db8::2 diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0a b/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0a index 5c7ea4226..5d7db92ea 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0a +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0a @@ -1,11 +1,11 @@ -name : veth0a -type : veth -index : 13 -mtu : 1500 -operational status : up -ip forwarding : disabled -physical address : 6e:d0:98:c4:e7:ef -ipv4 addresses : -ipv6 addresses : -in-octets : 299 -out-octets : 17190 +name : veth0a +type : veth +index : 13 +mtu : 1500 +operational status : up +ip forwarding : disabled +physical address : 6e:d0:98:c4:e7:ef +ipv4 addresses : +ipv6 addresses : +in-octets : 299 +out-octets : 17190 diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0a.20 b/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0a.20 index b42b6c6de..4c3c26e32 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0a.20 +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0a.20 @@ -1,10 +1,10 @@ -name : veth0a.20 -type : vlan -index : 14 -mtu : 1500 -operational status : up -ip forwarding : disabled -lower-layer-if : veth0a -physical address : 6e:d0:98:c4:e7:ef -ipv4 addresses : -ipv6 addresses : +name : veth0a.20 +type : vlan +index : 14 +mtu : 1500 +operational status : up +ip forwarding : disabled +lower-layer-if : veth0a +physical address : 6e:d0:98:c4:e7:ef +ipv4 addresses : +ipv6 addresses : diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0b b/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0b index 7b3fadf2a..5b286a667 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0b +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_veth0b @@ -1,11 +1,11 @@ -name : veth0b -type : veth -index : 12 -mtu : 1500 -operational status : up -ip forwarding : disabled -physical address : 36:da:80:06:7f:99 -ipv4 addresses : -ipv6 addresses : -in-octets : 17190 -out-octets : 299 +name : veth0b +type : veth +index : 12 +mtu : 1500 +operational status : up +ip forwarding : disabled +physical address : 36:da:80:06:7f:99 +ipv4 addresses : +ipv6 addresses : +in-octets : 17190 +out-octets : 299 diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_vxlan-v4 b/test/case/statd/interfaces-all/cli/show-interfaces_-n_vxlan-v4 index 1fb950e96..144336574 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_vxlan-v4 +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_vxlan-v4 @@ -1,12 +1,12 @@ -name : vxlan-v4 -type : vxlan -index : 23 -mtu : 1500 -operational status : up -ip forwarding : disabled -physical address : 8a:ea:59:32:df:70 -ipv4 addresses : 192.168.30.2/24 (static) -ipv6 addresses : -local address : 192.168.20.100 -remote address : 192.168.20.200 -VxLAN id : 4 +name : vxlan-v4 +type : vxlan +index : 23 +mtu : 1500 +operational status : up +ip forwarding : disabled +physical address : 8a:ea:59:32:df:70 +ipv4 addresses : 192.168.30.2/24 (static) +ipv6 addresses : +local address : 192.168.20.100 +remote address : 192.168.20.200 +VxLAN id : 4 diff --git a/test/case/statd/interfaces-all/cli/show-interfaces_-n_vxlan-v6 b/test/case/statd/interfaces-all/cli/show-interfaces_-n_vxlan-v6 index 0cf4d4fde..1e14a458d 100644 --- a/test/case/statd/interfaces-all/cli/show-interfaces_-n_vxlan-v6 +++ b/test/case/statd/interfaces-all/cli/show-interfaces_-n_vxlan-v6 @@ -1,12 +1,12 @@ -name : vxlan-v6 -type : vxlan -index : 24 -mtu : 1500 -operational status : up -ip forwarding : disabled -physical address : 3e:30:c6:a1:71:64 -ipv4 addresses : 192.168.40.2/24 (static) -ipv6 addresses : -local address : 2001:db8::100 -remote address : 2001:db8::200 -VxLAN id : 6 +name : vxlan-v6 +type : vxlan +index : 24 +mtu : 1500 +operational status : up +ip forwarding : disabled +physical address : 3e:30:c6:a1:71:64 +ipv4 addresses : 192.168.40.2/24 (static) +ipv6 addresses : +local address : 2001:db8::100 +remote address : 2001:db8::200 +VxLAN id : 6 From 7853df620888f8422846937b00bc7a1a16067577 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 19 May 2026 10:18:16 +0200 Subject: [PATCH 5/5] show: relay cli-pretty's user-facing error messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cli-pretty prints a friendly message on stdout before any sys.exit(1) — 'Interface "w" not found', 'Error, top level "ietf-routing:routing" missing', etc. The wrapper used subprocess.run(..., check=True) and on non-zero exit caught CalledProcessError, throwing away the captured stdout and printing the generic exception message instead. Drop the check=True / try-except dance, always relay stdout, and only fall back to the generic 'Error running cli-pretty' line when the subprocess crashed without producing any output. Before: admin@bpi:/> show interface w Error running cli-pretty: Command '['/usr/libexec/statd/cli-pretty', 'show-interfaces', '-n', 'w']' returned non-zero exit status 1. After: admin@bpi:/> show interface w Interface "w" not found Signed-off-by: Joachim Wiberg --- src/bin/show/__init__.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/bin/show/__init__.py b/src/bin/show/__init__.py index 266e642b8..68b2ef414 100755 --- a/src/bin/show/__init__.py +++ b/src/bin/show/__init__.py @@ -40,15 +40,20 @@ def cli_pretty(json_data: dict, command: str, *args: str): return safe_args = [shlex.quote(arg) for arg in args] - - try: - json_input = json.dumps(json_data) # Keep as string, not bytes - result = subprocess.run([ - "/usr/libexec/statd/cli-pretty", command, *safe_args - ], input=json_input, capture_output=True, text=True, check=True) + json_input = json.dumps(json_data) + result = subprocess.run([ + "/usr/libexec/statd/cli-pretty", command, *safe_args + ], input=json_input, capture_output=True, text=True) + + # cli-pretty prints a user-facing message on stdout before any + # sys.exit(1) (e.g. 'Interface "w" not found'). Relay it regardless + # of the exit status, and only surface the generic exec error when + # nothing useful was produced. + if result.stdout: print(result.stdout, end="") - except subprocess.CalledProcessError as e: - print(f"Error running cli-pretty: {e}") + elif result.returncode != 0: + msg = result.stderr.strip() or f"exit status {result.returncode}" + print(f"Error running cli-pretty: {msg}") def dhcp(args: List[str]) -> None: