[RFC net-next v2 1/6] ethtool: Add loopback netlink UAPI definitions
From: Björn Töpel
Date: Sun Mar 08 2026 - 08:41:55 EST
Add the netlink YAML spec and auto-generated UAPI header for a unified
loopback interface covering MAC, PCS, PHY, and pluggable module
components.
Each loopback point is described by a nested entry attribute
containing:
- component where in the path (MAC, PCS, PHY, MODULE)
- name subsystem label, e.g. "cmis-host" or "cmis-media"
- id optional instance selector (e.g. PHY id, port id)
- supported bitmask of supported directions
- direction NEAR_END, FAR_END, or 0 (disabled)
Signed-off-by: Björn Töpel <bjorn@xxxxxxxxxx>
---
Documentation/netlink/specs/ethtool.yaml | 115 ++++++++++++++++++
.../uapi/linux/ethtool_netlink_generated.h | 52 ++++++++
2 files changed, 167 insertions(+)
diff --git a/Documentation/netlink/specs/ethtool.yaml b/Documentation/netlink/specs/ethtool.yaml
index 4707063af3b4..05ebad6ae4e0 100644
--- a/Documentation/netlink/specs/ethtool.yaml
+++ b/Documentation/netlink/specs/ethtool.yaml
@@ -211,6 +211,39 @@ definitions:
name: discard
value: 31
+ -
+ name: loopback-component
+ type: enum
+ doc: |
+ Loopback component. Identifies where in the network path the
+ loopback is applied.
+ entries:
+ -
+ name: mac
+ doc: MAC loopback
+ -
+ name: pcs
+ doc: PCS loopback
+ -
+ name: phy
+ doc: PHY loopback
+ -
+ name: module
+ doc: Pluggable module (e.g. CMIS (Q)SFP) loopback
+ -
+ name: loopback-direction
+ type: flags
+ doc: |
+ Loopback direction flags. Used as a bitmask in supported, and as
+ a single value in direction.
+ entries:
+ -
+ name: near-end
+ doc: Near-end loopback; host-loop-host
+ -
+ name: far-end
+ doc: Far-end loopback; line-loop-line
+
attribute-sets:
-
name: header
@@ -1903,6 +1936,60 @@ attribute-sets:
name: link
type: nest
nested-attributes: mse-snapshot
+ -
+ name: loopback-entry
+ doc: Per-component loopback configuration entry.
+ attr-cnt-name: __ethtool-a-loopback-entry-cnt
+ attributes:
+ -
+ name: unspec
+ type: unused
+ value: 0
+ -
+ name: component
+ type: u32
+ enum: loopback-component
+ doc: Loopback component
+ -
+ name: id
+ type: u32
+ doc: |
+ Optional component instance identifier. Required for PHY,
+ optional for MODULE, omitted for MAC and PCS.
+ -
+ name: name
+ type: string
+ doc: |
+ Subsystem-specific name for the loopback point within the
+ component.
+ -
+ name: supported
+ type: u32
+ enum: loopback-direction
+ enum-as-flags: true
+ doc: Bitmask of supported loopback directions
+ -
+ name: direction
+ type: u32
+ enum: loopback-direction
+ doc: Current loopback direction, 0 means disabled
+ -
+ name: loopback
+ attr-cnt-name: __ethtool-a-loopback-cnt
+ attributes:
+ -
+ name: unspec
+ type: unused
+ value: 0
+ -
+ name: header
+ type: nest
+ nested-attributes: header
+ -
+ name: entry
+ type: nest
+ multi-attr: true
+ nested-attributes: loopback-entry
operations:
enum-model: directional
@@ -2855,6 +2942,34 @@ operations:
- worst-channel
- link
dump: *mse-get-op
+ -
+ name: loopback-get
+ doc: Get loopback configuration and capabilities.
+
+ attribute-set: loopback
+
+ do: &loopback-get-op
+ request:
+ attributes:
+ - header
+ reply:
+ attributes: &loopback
+ - header
+ - entry
+ dump: *loopback-get-op
+ -
+ name: loopback-set
+ doc: Set loopback configuration.
+
+ attribute-set: loopback
+
+ do:
+ request:
+ attributes: *loopback
+ -
+ name: loopback-ntf
+ doc: Notification for change in loopback configuration.
+ notify: loopback-get
mcast-groups:
list:
diff --git a/include/uapi/linux/ethtool_netlink_generated.h b/include/uapi/linux/ethtool_netlink_generated.h
index 114b83017297..83fb17dd5daf 100644
--- a/include/uapi/linux/ethtool_netlink_generated.h
+++ b/include/uapi/linux/ethtool_netlink_generated.h
@@ -78,6 +78,33 @@ enum ethtool_pse_event {
ETHTOOL_PSE_EVENT_SW_PW_CONTROL_ERROR = 64,
};
+/**
+ * enum ethtool_loopback_component - Loopback component. Identifies where in
+ * the network path the loopback is applied.
+ * @ETHTOOL_LOOPBACK_COMPONENT_MAC: MAC loopback
+ * @ETHTOOL_LOOPBACK_COMPONENT_PCS: PCS loopback
+ * @ETHTOOL_LOOPBACK_COMPONENT_PHY: PHY loopback
+ * @ETHTOOL_LOOPBACK_COMPONENT_MODULE: Pluggable module (e.g. CMIS (Q)SFP)
+ * loopback
+ */
+enum ethtool_loopback_component {
+ ETHTOOL_LOOPBACK_COMPONENT_MAC,
+ ETHTOOL_LOOPBACK_COMPONENT_PCS,
+ ETHTOOL_LOOPBACK_COMPONENT_PHY,
+ ETHTOOL_LOOPBACK_COMPONENT_MODULE,
+};
+
+/**
+ * enum ethtool_loopback_direction - Loopback direction flags. Used as a
+ * bitmask in supported, and as a single value in direction.
+ * @ETHTOOL_LOOPBACK_DIRECTION_NEAR_END: Near-end loopback; host-loop-host
+ * @ETHTOOL_LOOPBACK_DIRECTION_FAR_END: Far-end loopback; line-loop-line
+ */
+enum ethtool_loopback_direction {
+ ETHTOOL_LOOPBACK_DIRECTION_NEAR_END = 1,
+ ETHTOOL_LOOPBACK_DIRECTION_FAR_END = 2,
+};
+
enum {
ETHTOOL_A_HEADER_UNSPEC,
ETHTOOL_A_HEADER_DEV_INDEX,
@@ -838,6 +865,27 @@ enum {
ETHTOOL_A_MSE_MAX = (__ETHTOOL_A_MSE_CNT - 1)
};
+enum {
+ ETHTOOL_A_LOOPBACK_ENTRY_UNSPEC,
+ ETHTOOL_A_LOOPBACK_ENTRY_COMPONENT,
+ ETHTOOL_A_LOOPBACK_ENTRY_ID,
+ ETHTOOL_A_LOOPBACK_ENTRY_NAME,
+ ETHTOOL_A_LOOPBACK_ENTRY_SUPPORTED,
+ ETHTOOL_A_LOOPBACK_ENTRY_DIRECTION,
+
+ __ETHTOOL_A_LOOPBACK_ENTRY_CNT,
+ ETHTOOL_A_LOOPBACK_ENTRY_MAX = (__ETHTOOL_A_LOOPBACK_ENTRY_CNT - 1)
+};
+
+enum {
+ ETHTOOL_A_LOOPBACK_UNSPEC,
+ ETHTOOL_A_LOOPBACK_HEADER,
+ ETHTOOL_A_LOOPBACK_ENTRY,
+
+ __ETHTOOL_A_LOOPBACK_CNT,
+ ETHTOOL_A_LOOPBACK_MAX = (__ETHTOOL_A_LOOPBACK_CNT - 1)
+};
+
enum {
ETHTOOL_MSG_USER_NONE = 0,
ETHTOOL_MSG_STRSET_GET = 1,
@@ -891,6 +939,8 @@ enum {
ETHTOOL_MSG_RSS_CREATE_ACT,
ETHTOOL_MSG_RSS_DELETE_ACT,
ETHTOOL_MSG_MSE_GET,
+ ETHTOOL_MSG_LOOPBACK_GET,
+ ETHTOOL_MSG_LOOPBACK_SET,
__ETHTOOL_MSG_USER_CNT,
ETHTOOL_MSG_USER_MAX = (__ETHTOOL_MSG_USER_CNT - 1)
@@ -952,6 +1002,8 @@ enum {
ETHTOOL_MSG_RSS_CREATE_NTF,
ETHTOOL_MSG_RSS_DELETE_NTF,
ETHTOOL_MSG_MSE_GET_REPLY,
+ ETHTOOL_MSG_LOOPBACK_GET_REPLY,
+ ETHTOOL_MSG_LOOPBACK_NTF,
__ETHTOOL_MSG_KERNEL_CNT,
ETHTOOL_MSG_KERNEL_MAX = (__ETHTOOL_MSG_KERNEL_CNT - 1)
--
2.53.0