It allows inspecting link parameters using ethtool.

Signed-off-by: Igor Ryzhov <iryz...@nfware.com>
---
 kernel/linux/kni/kni_net.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c
index 611719b5ee27..931b9daf104f 100644
--- a/kernel/linux/kni/kni_net.c
+++ b/kernel/linux/kni/kni_net.c
@@ -820,9 +820,34 @@ static void kni_get_drvinfo(struct net_device *dev,
        strlcpy(info->driver, "kni", sizeof(info->driver));
 }
 
+#ifdef ETHTOOL_GLINKSETTINGS
+static int kni_get_link_ksettings(struct net_device *dev,
+                                 struct ethtool_link_ksettings *settings)
+{
+       struct kni_dev *kni = netdev_priv(dev);
+
+       settings->base.port = PORT_OTHER;
+
+       if (netif_carrier_ok(dev)) {
+               settings->base.speed = kni->speed;
+               settings->base.duplex = kni->duplex;
+               settings->base.autoneg = kni->autoneg;
+       } else {
+               settings->base.speed = SPEED_UNKNOWN;
+               settings->base.duplex = DUPLEX_UNKNOWN;
+               settings->base.autoneg = AUTONEG_ENABLE;
+       }
+
+       return 0;
+}
+#endif
+
 static const struct ethtool_ops kni_net_ethtool_ops = {
        .get_drvinfo    = kni_get_drvinfo,
        .get_link       = ethtool_op_get_link,
+#ifdef ETHTOOL_GLINKSETTINGS
+       .get_link_ksettings     = kni_get_link_ksettings,
+#endif
 };
 
 void
-- 
2.33.0

Reply via email to