Some PHYs provide Signal Quality Index (SQI) if the link is in active
state. This information can help to diagnose cable and system design
related issues.

Signed-off-by: Oleksij Rempel <[email protected]>
---
 netlink/desc-ethtool.c       |  2 ++
 netlink/settings.c           | 16 ++++++++++++++++
 uapi/linux/ethtool_netlink.h |  2 ++
 3 files changed, 20 insertions(+)

diff --git a/netlink/desc-ethtool.c b/netlink/desc-ethtool.c
index 76c6f13..f4559ea 100644
--- a/netlink/desc-ethtool.c
+++ b/netlink/desc-ethtool.c
@@ -91,6 +91,8 @@ static const struct pretty_nla_desc __linkstate_desc[] = {
        NLATTR_DESC_INVALID(ETHTOOL_A_LINKSTATE_UNSPEC),
        NLATTR_DESC_NESTED(ETHTOOL_A_LINKSTATE_HEADER, header),
        NLATTR_DESC_BOOL(ETHTOOL_A_LINKSTATE_LINK),
+       NLATTR_DESC_U32(ETHTOOL_A_LINKSTATE_SQI),
+       NLATTR_DESC_U32(ETHTOOL_A_LINKSTATE_SQI_MAX),
 };
 
 static const struct pretty_nla_desc __debug_desc[] = {
diff --git a/netlink/settings.c b/netlink/settings.c
index 8be5a22..a6b2fba 100644
--- a/netlink/settings.c
+++ b/netlink/settings.c
@@ -604,6 +604,22 @@ int linkstate_reply_cb(const struct nlmsghdr *nlhdr, void 
*data)
                printf("\tLink detected: %s\n", val ? "yes" : "no");
        }
 
+       if (tb[ETHTOOL_A_LINKSTATE_SQI]) {
+               uint32_t val = mnl_attr_get_u32(tb[ETHTOOL_A_LINKSTATE_SQI]);
+
+               print_banner(nlctx);
+               printf("\tSQI: %u", val);
+
+               if (tb[ETHTOOL_A_LINKSTATE_SQI_MAX]) {
+                       uint32_t max;
+
+                       max = mnl_attr_get_u32(tb[ETHTOOL_A_LINKSTATE_SQI_MAX]);
+                       printf("/%u\n", max);
+               } else {
+                       printf("\n");
+               }
+       }
+
        return MNL_CB_OK;
 }
 
diff --git a/uapi/linux/ethtool_netlink.h b/uapi/linux/ethtool_netlink.h
index ad6d3a0..98e236c 100644
--- a/uapi/linux/ethtool_netlink.h
+++ b/uapi/linux/ethtool_netlink.h
@@ -197,6 +197,8 @@ enum {
        ETHTOOL_A_LINKSTATE_UNSPEC,
        ETHTOOL_A_LINKSTATE_HEADER,             /* nest - _A_HEADER_* */
        ETHTOOL_A_LINKSTATE_LINK,               /* u8 */
+       ETHTOOL_A_LINKSTATE_SQI,                /* u32 */
+       ETHTOOL_A_LINKSTATE_SQI_MAX,            /* u32 */
 
        /* add new constants above here */
        __ETHTOOL_A_LINKSTATE_CNT,
-- 
2.26.2

Reply via email to