]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ethtool: add LINKMODES_NTF notification
authorMichal Kubecek <mkubecek@suse.cz>
Fri, 27 Dec 2019 14:56:18 +0000 (15:56 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 28 Dec 2019 00:40:02 +0000 (16:40 -0800)
Send ETHTOOL_MSG_LINKMODES_NTF notification message whenever device link
settings or advertised modes are modified using ETHTOOL_MSG_LINKMODES_SET
netlink message or ETHTOOL_SLINKSETTINGS or ETHTOOL_SSET ioctl commands.

The notification message has the same format as reply to LINKMODES_GET
request. ETHTOOL_MSG_LINKMODES_SET netlink request only triggers the
notification if there is a change but the ioctl command handlers do not
check if there is an actual change and trigger the notification whenever
the commands are executed.

As all work is done by ethnl_default_notify() handler and callback
functions introduced to handle LINKMODES_GET requests, all that remains is
adding entries for ETHTOOL_MSG_LINKMODES_NTF into ethnl_notify_handlers and
ethnl_default_notify_ops lookup tables and calls to ethtool_notify() where
needed.

Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/ethtool-netlink.rst
include/uapi/linux/ethtool_netlink.h
net/ethtool/ioctl.c
net/ethtool/linkmodes.c
net/ethtool/netlink.c

index 625c8018356306aaa556fbaab80c0758d3b6759c..9d96d51e936050413617aef65a70f6369113510e 100644 (file)
@@ -193,6 +193,7 @@ Kernel to userspace:
   ``ETHTOOL_MSG_LINKINFO_GET_REPLY``    link settings
   ``ETHTOOL_MSG_LINKINFO_NTF``          link settings notification
   ``ETHTOOL_MSG_LINKMODES_GET_REPLY``   link modes info
+  ``ETHTOOL_MSG_LINKMODES_NTF``         link modes notification
   ===================================== ================================
 
 ``GET`` requests are sent by userspace applications to retrieve device
index cddf978b98df14009c142f30d9aefa74d741a94a..35948df6d6e3a662644fbbdcb2be440cf7a38630 100644 (file)
@@ -32,6 +32,7 @@ enum {
        ETHTOOL_MSG_LINKINFO_GET_REPLY,
        ETHTOOL_MSG_LINKINFO_NTF,
        ETHTOOL_MSG_LINKMODES_GET_REPLY,
+       ETHTOOL_MSG_LINKMODES_NTF,
 
        /* add new constants above here */
        __ETHTOOL_MSG_KERNEL_CNT,
index 11a467294a332d9c3672ac9e64ca54e5de32a957..36e2ef2d900d9e6967780c185092b19257144560 100644 (file)
@@ -573,8 +573,10 @@ static int ethtool_set_link_ksettings(struct net_device *dev,
                return -EINVAL;
 
        err = dev->ethtool_ops->set_link_ksettings(dev, &link_ksettings);
-       if (err >= 0)
+       if (err >= 0) {
                ethtool_notify(dev, ETHTOOL_MSG_LINKINFO_NTF, NULL);
+               ethtool_notify(dev, ETHTOOL_MSG_LINKMODES_NTF, NULL);
+       }
        return err;
 }
 
@@ -638,8 +640,10 @@ static int ethtool_set_settings(struct net_device *dev, void __user *useraddr)
        link_ksettings.base.link_mode_masks_nwords =
                __ETHTOOL_LINK_MODE_MASK_NU32;
        ret = dev->ethtool_ops->set_link_ksettings(dev, &link_ksettings);
-       if (ret >= 0)
+       if (ret >= 0) {
                ethtool_notify(dev, ETHTOOL_MSG_LINKINFO_NTF, NULL);
+               ethtool_notify(dev, ETHTOOL_MSG_LINKMODES_NTF, NULL);
+       }
        return ret;
 }
 
index 790b60771d0ead59e377e18d30eb4624ebdc31c9..0b99f494ad3b6bc6f065f162b051b0ade027d690 100644 (file)
@@ -364,6 +364,8 @@ int ethnl_set_linkmodes(struct sk_buff *skb, struct genl_info *info)
                ret = dev->ethtool_ops->set_link_ksettings(dev, &ksettings);
                if (ret < 0)
                        GENL_SET_ERR_MSG(info, "link settings update failed");
+               else
+                       ethtool_notify(dev, ETHTOOL_MSG_LINKMODES_NTF, NULL);
        }
 
 out_ops:
index 5f28f3cb022d9f03c0250148888f3094f89ecbf2..1b5e1bd2650425ed19d544a8bfd5cf10b629cbf8 100644 (file)
@@ -511,6 +511,7 @@ static int ethnl_default_done(struct netlink_callback *cb)
 static const struct ethnl_request_ops *
 ethnl_default_notify_ops[ETHTOOL_MSG_KERNEL_MAX + 1] = {
        [ETHTOOL_MSG_LINKINFO_NTF]      = &ethnl_linkinfo_request_ops,
+       [ETHTOOL_MSG_LINKMODES_NTF]     = &ethnl_linkmodes_request_ops,
 };
 
 /* default notification handler */
@@ -592,6 +593,7 @@ typedef void (*ethnl_notify_handler_t)(struct net_device *dev, unsigned int cmd,
 
 static const ethnl_notify_handler_t ethnl_notify_handlers[] = {
        [ETHTOOL_MSG_LINKINFO_NTF]      = ethnl_default_notify,
+       [ETHTOOL_MSG_LINKMODES_NTF]     = ethnl_default_notify,
 };
 
 void ethtool_notify(struct net_device *dev, unsigned int cmd, const void *data)