Commit 51ea22b0 authored by Michal Kubecek's avatar Michal Kubecek Committed by David S. Miller
Browse files

ethtool: provide WoL settings with WOL_GET request



Implement WOL_GET request to get wake-on-lan settings for a device,
traditionally available via ETHTOOL_GWOL ioctl request.

As part of the implementation, provide symbolic names for wake-on-line
modes as ETH_SS_WOL_MODES string set.

Signed-off-by: default avatarMichal Kubecek <mkubecek@suse.cz>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0bda7af3
Loading
Loading
Loading
Loading
+29 −1
Original line number Original line Diff line number Diff line
@@ -187,6 +187,7 @@ Userspace to kernel:
  ``ETHTOOL_MSG_LINKSTATE_GET``         get link state
  ``ETHTOOL_MSG_LINKSTATE_GET``         get link state
  ``ETHTOOL_MSG_DEBUG_GET``             get debugging settings
  ``ETHTOOL_MSG_DEBUG_GET``             get debugging settings
  ``ETHTOOL_MSG_DEBUG_SET``             set debugging settings
  ``ETHTOOL_MSG_DEBUG_SET``             set debugging settings
  ``ETHTOOL_MSG_WOL_GET``               get wake-on-lan settings
  ===================================== ================================
  ===================================== ================================


Kernel to userspace:
Kernel to userspace:
@@ -200,6 +201,7 @@ Kernel to userspace:
  ``ETHTOOL_MSG_LINKSTATE_GET_REPLY``   link state info
  ``ETHTOOL_MSG_LINKSTATE_GET_REPLY``   link state info
  ``ETHTOOL_MSG_DEBUG_GET_REPLY``       debugging settings
  ``ETHTOOL_MSG_DEBUG_GET_REPLY``       debugging settings
  ``ETHTOOL_MSG_DEBUG_NTF``             debugging settings notification
  ``ETHTOOL_MSG_DEBUG_NTF``             debugging settings notification
  ``ETHTOOL_MSG_WOL_GET_REPLY``         wake-on-lan settings
  ===================================== ================================
  ===================================== ================================


``GET`` requests are sent by userspace applications to retrieve device
``GET`` requests are sent by userspace applications to retrieve device
@@ -474,6 +476,32 @@ Request contents:
enabled debugging message types for the device.
enabled debugging message types for the device.




WOL_GET
=======

Query device wake-on-lan settings. Unlike most "GET" type requests,
``ETHTOOL_MSG_WOL_GET`` requires (netns) ``CAP_NET_ADMIN`` privileges as it
(potentially) provides SecureOn(tm) password which is confidential.

Request contents:

  ====================================  ======  ==========================
  ``ETHTOOL_A_WOL_HEADER``              nested  request header
  ====================================  ======  ==========================

Kernel response contents:

  ====================================  ======  ==========================
  ``ETHTOOL_A_WOL_HEADER``              nested  reply header
  ``ETHTOOL_A_WOL_MODES``               bitset  mask of enabled WoL modes
  ``ETHTOOL_A_WOL_SOPASS``              binary  SecureOn(tm) password
  ====================================  ======  ==========================

In reply, ``ETHTOOL_A_WOL_MODES`` mask consists of modes supported by the
device, value of modes which are enabled. ``ETHTOOL_A_WOL_SOPASS`` is only
included in reply if ``WAKE_MAGICSECURE`` mode is supported.


Request translation
Request translation
===================
===================


@@ -490,7 +518,7 @@ have their netlink replacement yet.
                                      ``ETHTOOL_MSG_LINKMODES_SET``
                                      ``ETHTOOL_MSG_LINKMODES_SET``
  ``ETHTOOL_GDRVINFO``                n/a
  ``ETHTOOL_GDRVINFO``                n/a
  ``ETHTOOL_GREGS``                   n/a
  ``ETHTOOL_GREGS``                   n/a
  ``ETHTOOL_GWOL``                    n/a
  ``ETHTOOL_GWOL``                    ``ETHTOOL_MSG_WOL_GET``
  ``ETHTOOL_SWOL``                    n/a
  ``ETHTOOL_SWOL``                    n/a
  ``ETHTOOL_GMSGLVL``                 ``ETHTOOL_MSG_DEBUG_GET``
  ``ETHTOOL_GMSGLVL``                 ``ETHTOOL_MSG_DEBUG_GET``
  ``ETHTOOL_SMSGLVL``                 ``ETHTOOL_MSG_DEBUG_SET``
  ``ETHTOOL_SMSGLVL``                 ``ETHTOOL_MSG_DEBUG_SET``
+4 −0
Original line number Original line Diff line number Diff line
@@ -595,6 +595,7 @@ struct ethtool_pauseparam {
 * @ETH_SS_PHY_TUNABLES: PHY tunable names
 * @ETH_SS_PHY_TUNABLES: PHY tunable names
 * @ETH_SS_LINK_MODES: link mode names
 * @ETH_SS_LINK_MODES: link mode names
 * @ETH_SS_MSG_CLASSES: debug message class names
 * @ETH_SS_MSG_CLASSES: debug message class names
 * @ETH_SS_WOL_MODES: wake-on-lan modes
 */
 */
enum ethtool_stringset {
enum ethtool_stringset {
	ETH_SS_TEST		= 0,
	ETH_SS_TEST		= 0,
@@ -608,6 +609,7 @@ enum ethtool_stringset {
	ETH_SS_PHY_TUNABLES,
	ETH_SS_PHY_TUNABLES,
	ETH_SS_LINK_MODES,
	ETH_SS_LINK_MODES,
	ETH_SS_MSG_CLASSES,
	ETH_SS_MSG_CLASSES,
	ETH_SS_WOL_MODES,


	/* add new constants above here */
	/* add new constants above here */
	ETH_SS_COUNT
	ETH_SS_COUNT
@@ -1695,6 +1697,8 @@ static inline int ethtool_validate_duplex(__u8 duplex)
#define WAKE_MAGICSECURE	(1 << 6) /* only meaningful if WAKE_MAGIC */
#define WAKE_MAGICSECURE	(1 << 6) /* only meaningful if WAKE_MAGIC */
#define WAKE_FILTER		(1 << 7)
#define WAKE_FILTER		(1 << 7)


#define WOL_MODE_COUNT		8

/* L2-L4 network traffic flow types */
/* L2-L4 network traffic flow types */
#define	TCP_V4_FLOW	0x01	/* hash or spec (tcp_ip4_spec) */
#define	TCP_V4_FLOW	0x01	/* hash or spec (tcp_ip4_spec) */
#define	UDP_V4_FLOW	0x02	/* hash or spec (udp_ip4_spec) */
#define	UDP_V4_FLOW	0x02	/* hash or spec (udp_ip4_spec) */
+15 −0
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ enum {
	ETHTOOL_MSG_LINKSTATE_GET,
	ETHTOOL_MSG_LINKSTATE_GET,
	ETHTOOL_MSG_DEBUG_GET,
	ETHTOOL_MSG_DEBUG_GET,
	ETHTOOL_MSG_DEBUG_SET,
	ETHTOOL_MSG_DEBUG_SET,
	ETHTOOL_MSG_WOL_GET,


	/* add new constants above here */
	/* add new constants above here */
	__ETHTOOL_MSG_USER_CNT,
	__ETHTOOL_MSG_USER_CNT,
@@ -39,6 +40,7 @@ enum {
	ETHTOOL_MSG_LINKSTATE_GET_REPLY,
	ETHTOOL_MSG_LINKSTATE_GET_REPLY,
	ETHTOOL_MSG_DEBUG_GET_REPLY,
	ETHTOOL_MSG_DEBUG_GET_REPLY,
	ETHTOOL_MSG_DEBUG_NTF,
	ETHTOOL_MSG_DEBUG_NTF,
	ETHTOOL_MSG_WOL_GET_REPLY,


	/* add new constants above here */
	/* add new constants above here */
	__ETHTOOL_MSG_KERNEL_CNT,
	__ETHTOOL_MSG_KERNEL_CNT,
@@ -211,6 +213,19 @@ enum {
	ETHTOOL_A_DEBUG_MAX = __ETHTOOL_A_DEBUG_CNT - 1
	ETHTOOL_A_DEBUG_MAX = __ETHTOOL_A_DEBUG_CNT - 1
};
};


/* WOL */

enum {
	ETHTOOL_A_WOL_UNSPEC,
	ETHTOOL_A_WOL_HEADER,			/* nest - _A_HEADER_* */
	ETHTOOL_A_WOL_MODES,			/* bitset */
	ETHTOOL_A_WOL_SOPASS,			/* binary */

	/* add new constants above here */
	__ETHTOOL_A_WOL_CNT,
	ETHTOOL_A_WOL_MAX = __ETHTOOL_A_WOL_CNT - 1
};

/* generic netlink info */
/* generic netlink info */
#define ETHTOOL_GENL_NAME "ethtool"
#define ETHTOOL_GENL_NAME "ethtool"
#define ETHTOOL_GENL_VERSION 1
#define ETHTOOL_GENL_VERSION 1
+1 −1
Original line number Original line Diff line number Diff line
@@ -5,4 +5,4 @@ obj-y += ioctl.o common.o
obj-$(CONFIG_ETHTOOL_NETLINK)	+= ethtool_nl.o
obj-$(CONFIG_ETHTOOL_NETLINK)	+= ethtool_nl.o


ethtool_nl-y	:= netlink.o bitset.o strset.o linkinfo.o linkmodes.o \
ethtool_nl-y	:= netlink.o bitset.o strset.o linkinfo.o linkmodes.o \
		   linkstate.o debug.o
		   linkstate.o debug.o wol.o
+12 −0
Original line number Original line Diff line number Diff line
@@ -190,6 +190,18 @@ const char netif_msg_class_names[][ETH_GSTRING_LEN] = {
};
};
static_assert(ARRAY_SIZE(netif_msg_class_names) == NETIF_MSG_CLASS_COUNT);
static_assert(ARRAY_SIZE(netif_msg_class_names) == NETIF_MSG_CLASS_COUNT);


const char wol_mode_names[][ETH_GSTRING_LEN] = {
	[const_ilog2(WAKE_PHY)]		= "phy",
	[const_ilog2(WAKE_UCAST)]	= "ucast",
	[const_ilog2(WAKE_MCAST)]	= "mcast",
	[const_ilog2(WAKE_BCAST)]	= "bcast",
	[const_ilog2(WAKE_ARP)]		= "arp",
	[const_ilog2(WAKE_MAGIC)]	= "magic",
	[const_ilog2(WAKE_MAGICSECURE)]	= "magicsecure",
	[const_ilog2(WAKE_FILTER)]	= "filter",
};
static_assert(ARRAY_SIZE(wol_mode_names) == WOL_MODE_COUNT);

/* return false if legacy contained non-0 deprecated fields
/* return false if legacy contained non-0 deprecated fields
 * maxtxpkt/maxrxpkt. rest of ksettings always updated
 * maxtxpkt/maxrxpkt. rest of ksettings always updated
 */
 */
Loading