All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/3] RFC 2863 Testing Oper status
@ 2020-04-17 23:03 Andrew Lunn
  2020-04-17 23:03 ` [PATCH net-next 1/3] net: Add IF_OPER_TESTING Andrew Lunn
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Andrew Lunn @ 2020-04-17 23:03 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Andrew Lunn

This patchset add support for RFC 2863 Oper status testing.  An
interface is placed into this state when a self test is performed
using ethtool.

Andrew Lunn (3):
  net: Add IF_OPER_TESTING
  net: Add testing sysfs attribute
  net: ethtool: self_test: Mark interface in testing operative status

 Documentation/ABI/testing/sysfs-class-net | 13 +++++++
 include/linux/netdevice.h                 | 41 +++++++++++++++++++++++
 include/uapi/linux/if.h                   |  1 +
 net/core/dev.c                            |  5 +++
 net/core/link_watch.c                     | 12 +++++--
 net/core/net-sysfs.c                      | 15 ++++++++-
 net/core/rtnetlink.c                      |  9 ++++-
 net/ethtool/ioctl.c                       |  2 ++
 8 files changed, 94 insertions(+), 4 deletions(-)

-- 
2.26.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH net-next 1/3] net: Add IF_OPER_TESTING
  2020-04-17 23:03 [PATCH net-next 0/3] RFC 2863 Testing Oper status Andrew Lunn
@ 2020-04-17 23:03 ` Andrew Lunn
  2020-04-17 23:03 ` [PATCH net-next 2/3] net: Add testing sysfs attribute Andrew Lunn
  2020-04-17 23:03 ` [PATCH net-next 3/3] net: ethtool: self_test: Mark interface in testing operative status Andrew Lunn
  2 siblings, 0 replies; 7+ messages in thread
From: Andrew Lunn @ 2020-04-17 23:03 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Andrew Lunn

RFC 2863 defines the operational state testing. Add support for this
state, both as a IF_LINK_MODE_ and __LINK_STATE_.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
 include/linux/netdevice.h | 41 +++++++++++++++++++++++++++++++++++++++
 include/uapi/linux/if.h   |  1 +
 net/core/dev.c            |  5 +++++
 net/core/link_watch.c     | 12 ++++++++++--
 net/core/rtnetlink.c      |  9 ++++++++-
 5 files changed, 65 insertions(+), 3 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 130a668049ab..0750b54b3765 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -288,6 +288,7 @@ enum netdev_state_t {
 	__LINK_STATE_NOCARRIER,
 	__LINK_STATE_LINKWATCH_PENDING,
 	__LINK_STATE_DORMANT,
+	__LINK_STATE_TESTING,
 };
 
 
@@ -3907,6 +3908,46 @@ static inline bool netif_dormant(const struct net_device *dev)
 }
 
 
+/**
+ *	netif_testing_on - mark device as under test.
+ *	@dev: network device
+ *
+ * Mark device as under test (as per RFC2863).
+ *
+ * The testing state indicates that some test(s) must be performed on
+ * the interface. After completion, of the test, the interface state
+ * will change to up, dormant, or down, as appropriate.
+ */
+static inline void netif_testing_on(struct net_device *dev)
+{
+	if (!test_and_set_bit(__LINK_STATE_TESTING, &dev->state))
+		linkwatch_fire_event(dev);
+}
+
+/**
+ *	netif_testing_off - set device as not under test.
+ *	@dev: network device
+ *
+ * Device is not in testing state.
+ */
+static inline void netif_testing_off(struct net_device *dev)
+{
+	if (test_and_clear_bit(__LINK_STATE_TESTING, &dev->state))
+		linkwatch_fire_event(dev);
+}
+
+/**
+ *	netif_testing - test if device is under test
+ *	@dev: network device
+ *
+ * Check if device is under test
+ */
+static inline bool netif_testing(const struct net_device *dev)
+{
+	return test_bit(__LINK_STATE_TESTING, &dev->state);
+}
+
+
 /**
  *	netif_oper_up - test if device is operational
  *	@dev: network device
diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h
index be714cd8c826..797ba2c1562a 100644
--- a/include/uapi/linux/if.h
+++ b/include/uapi/linux/if.h
@@ -178,6 +178,7 @@ enum {
 enum {
 	IF_LINK_MODE_DEFAULT,
 	IF_LINK_MODE_DORMANT,	/* limit upward transition to dormant */
+	IF_LINK_MODE_TESTING,	/* limit upward transition to testing */
 };
 
 /*
diff --git a/net/core/dev.c b/net/core/dev.c
index 522288177bbd..fb61522b1ce1 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -9136,6 +9136,11 @@ void netif_stacked_transfer_operstate(const struct net_device *rootdev,
 	else
 		netif_dormant_off(dev);
 
+	if (rootdev->operstate == IF_OPER_TESTING)
+		netif_testing_on(dev);
+	else
+		netif_testing_off(dev);
+
 	if (netif_carrier_ok(rootdev))
 		netif_carrier_on(dev);
 	else
diff --git a/net/core/link_watch.c b/net/core/link_watch.c
index f153e0601838..75431ca9300f 100644
--- a/net/core/link_watch.c
+++ b/net/core/link_watch.c
@@ -34,6 +34,9 @@ static DEFINE_SPINLOCK(lweventlist_lock);
 
 static unsigned char default_operstate(const struct net_device *dev)
 {
+	if (netif_testing(dev))
+		return IF_OPER_TESTING;
+
 	if (!netif_carrier_ok(dev))
 		return (dev->ifindex != dev_get_iflink(dev) ?
 			IF_OPER_LOWERLAYERDOWN : IF_OPER_DOWN);
@@ -55,11 +58,15 @@ static void rfc2863_policy(struct net_device *dev)
 	write_lock_bh(&dev_base_lock);
 
 	switch(dev->link_mode) {
+	case IF_LINK_MODE_TESTING:
+		if (operstate == IF_OPER_UP)
+			operstate = IF_OPER_TESTING;
+		break;
+
 	case IF_LINK_MODE_DORMANT:
 		if (operstate == IF_OPER_UP)
 			operstate = IF_OPER_DORMANT;
 		break;
-
 	case IF_LINK_MODE_DEFAULT:
 	default:
 		break;
@@ -74,7 +81,8 @@ static void rfc2863_policy(struct net_device *dev)
 void linkwatch_init_dev(struct net_device *dev)
 {
 	/* Handle pre-registration link state changes */
-	if (!netif_carrier_ok(dev) || netif_dormant(dev))
+	if (!netif_carrier_ok(dev) || netif_dormant(dev) ||
+	    netif_testing(dev))
 		rfc2863_policy(dev);
 }
 
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 709ebbf8ab5b..d6f4f4a9e8ba 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -829,11 +829,18 @@ static void set_operstate(struct net_device *dev, unsigned char transition)
 	switch (transition) {
 	case IF_OPER_UP:
 		if ((operstate == IF_OPER_DORMANT ||
+		     operstate == IF_OPER_TESTING ||
 		     operstate == IF_OPER_UNKNOWN) &&
-		    !netif_dormant(dev))
+		    !netif_dormant(dev) && !netif_testing(dev))
 			operstate = IF_OPER_UP;
 		break;
 
+	case IF_OPER_TESTING:
+		if (operstate == IF_OPER_UP ||
+		    operstate == IF_OPER_UNKNOWN)
+			operstate = IF_OPER_TESTING;
+		break;
+
 	case IF_OPER_DORMANT:
 		if (operstate == IF_OPER_UP ||
 		    operstate == IF_OPER_UNKNOWN)
-- 
2.26.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net-next 2/3] net: Add testing sysfs attribute
  2020-04-17 23:03 [PATCH net-next 0/3] RFC 2863 Testing Oper status Andrew Lunn
  2020-04-17 23:03 ` [PATCH net-next 1/3] net: Add IF_OPER_TESTING Andrew Lunn
@ 2020-04-17 23:03 ` Andrew Lunn
  2020-04-17 23:49   ` Florian Fainelli
  2020-04-17 23:03 ` [PATCH net-next 3/3] net: ethtool: self_test: Mark interface in testing operative status Andrew Lunn
  2 siblings, 1 reply; 7+ messages in thread
From: Andrew Lunn @ 2020-04-17 23:03 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Andrew Lunn

Similar to speed, duplex and dorment, report the testing status
in sysfs.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
 Documentation/ABI/testing/sysfs-class-net | 13 +++++++++++++
 net/core/net-sysfs.c                      | 15 ++++++++++++++-
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/Documentation/ABI/testing/sysfs-class-net b/Documentation/ABI/testing/sysfs-class-net
index 664a8f6a634f..5e8b09743e04 100644
--- a/Documentation/ABI/testing/sysfs-class-net
+++ b/Documentation/ABI/testing/sysfs-class-net
@@ -124,6 +124,19 @@ Description:
 		authentication is performed (e.g: 802.1x). 'link_mode' attribute
 		will also reflect the dormant state.
 
+What:		/sys/class/net/<iface>/testing
+Date:		Jun 2019
+KernelVersion:	5.2
+Contact:	netdev@vger.kernel.org
+Description:
+		Indicates whether the interface is under test. Possible
+		values are:
+		0: interface is not being tested
+		1: interface is being tested
+
+		When an interface is under test, it cannot be expected
+		to pass packets as normal.
+
 What:		/sys/clas/net/<iface>/duplex
 Date:		October 2009
 KernelVersion:	2.6.33
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 4773ad6ec111..0d9e46de205e 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -243,6 +243,18 @@ static ssize_t duplex_show(struct device *dev,
 }
 static DEVICE_ATTR_RO(duplex);
 
+static ssize_t testing_show(struct device *dev,
+			    struct device_attribute *attr, char *buf)
+{
+	struct net_device *netdev = to_net_dev(dev);
+
+	if (netif_running(netdev))
+		return sprintf(buf, fmt_dec, !!netif_testing(netdev));
+
+	return -EINVAL;
+}
+static DEVICE_ATTR_RO(testing);
+
 static ssize_t dormant_show(struct device *dev,
 			    struct device_attribute *attr, char *buf)
 {
@@ -260,7 +272,7 @@ static const char *const operstates[] = {
 	"notpresent", /* currently unused */
 	"down",
 	"lowerlayerdown",
-	"testing", /* currently unused */
+	"testing",
 	"dormant",
 	"up"
 };
@@ -524,6 +536,7 @@ static struct attribute *net_class_attrs[] __ro_after_init = {
 	&dev_attr_speed.attr,
 	&dev_attr_duplex.attr,
 	&dev_attr_dormant.attr,
+	&dev_attr_testing.attr,
 	&dev_attr_operstate.attr,
 	&dev_attr_carrier_changes.attr,
 	&dev_attr_ifalias.attr,
-- 
2.26.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net-next 3/3] net: ethtool: self_test: Mark interface in testing operative status
  2020-04-17 23:03 [PATCH net-next 0/3] RFC 2863 Testing Oper status Andrew Lunn
  2020-04-17 23:03 ` [PATCH net-next 1/3] net: Add IF_OPER_TESTING Andrew Lunn
  2020-04-17 23:03 ` [PATCH net-next 2/3] net: Add testing sysfs attribute Andrew Lunn
@ 2020-04-17 23:03 ` Andrew Lunn
  2020-04-17 23:53   ` Florian Fainelli
  2 siblings, 1 reply; 7+ messages in thread
From: Andrew Lunn @ 2020-04-17 23:03 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Andrew Lunn

When an interface is executing a self test, put the interface into
operative status testing.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
 net/ethtool/ioctl.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 89d0b1827aaf..593fa665f820 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1746,7 +1746,9 @@ static int ethtool_self_test(struct net_device *dev, char __user *useraddr)
 	if (!data)
 		return -ENOMEM;
 
+	netif_testing_on(dev);
 	ops->self_test(dev, &test, data);
+	netif_testing_off(dev);
 
 	ret = -EFAULT;
 	if (copy_to_user(useraddr, &test, sizeof(test)))
-- 
2.26.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 2/3] net: Add testing sysfs attribute
  2020-04-17 23:03 ` [PATCH net-next 2/3] net: Add testing sysfs attribute Andrew Lunn
@ 2020-04-17 23:49   ` Florian Fainelli
  2020-04-17 23:54     ` Andrew Lunn
  0 siblings, 1 reply; 7+ messages in thread
From: Florian Fainelli @ 2020-04-17 23:49 UTC (permalink / raw)
  To: Andrew Lunn, David Miller; +Cc: netdev



On 4/17/2020 4:03 PM, Andrew Lunn wrote:
> Similar to speed, duplex and dorment, report the testing status
> in sysfs.
> 
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> ---
>   Documentation/ABI/testing/sysfs-class-net | 13 +++++++++++++
>   net/core/net-sysfs.c                      | 15 ++++++++++++++-
>   2 files changed, 27 insertions(+), 1 deletion(-)
> 
> diff --git a/Documentation/ABI/testing/sysfs-class-net b/Documentation/ABI/testing/sysfs-class-net
> index 664a8f6a634f..5e8b09743e04 100644
> --- a/Documentation/ABI/testing/sysfs-class-net
> +++ b/Documentation/ABI/testing/sysfs-class-net
> @@ -124,6 +124,19 @@ Description:
>   		authentication is performed (e.g: 802.1x). 'link_mode' attribute
>   		will also reflect the dormant state.
>   
> +What:		/sys/class/net/<iface>/testing
> +Date:		Jun 2019
> +KernelVersion:	5.2

This should probably be 5.8 now, other than that:

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 3/3] net: ethtool: self_test: Mark interface in testing operative status
  2020-04-17 23:03 ` [PATCH net-next 3/3] net: ethtool: self_test: Mark interface in testing operative status Andrew Lunn
@ 2020-04-17 23:53   ` Florian Fainelli
  0 siblings, 0 replies; 7+ messages in thread
From: Florian Fainelli @ 2020-04-17 23:53 UTC (permalink / raw)
  To: Andrew Lunn, David Miller; +Cc: netdev



On 4/17/2020 4:03 PM, Andrew Lunn wrote:
> When an interface is executing a self test, put the interface into
> operative status testing.
> 
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 2/3] net: Add testing sysfs attribute
  2020-04-17 23:49   ` Florian Fainelli
@ 2020-04-17 23:54     ` Andrew Lunn
  0 siblings, 0 replies; 7+ messages in thread
From: Andrew Lunn @ 2020-04-17 23:54 UTC (permalink / raw)
  To: Florian Fainelli; +Cc: David Miller, netdev

On Fri, Apr 17, 2020 at 04:49:23PM -0700, Florian Fainelli wrote:
> 
> 
> On 4/17/2020 4:03 PM, Andrew Lunn wrote:
> > Similar to speed, duplex and dorment, report the testing status
> > in sysfs.
> > 
> > Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> > ---
> >   Documentation/ABI/testing/sysfs-class-net | 13 +++++++++++++
> >   net/core/net-sysfs.c                      | 15 ++++++++++++++-
> >   2 files changed, 27 insertions(+), 1 deletion(-)
> > 
> > diff --git a/Documentation/ABI/testing/sysfs-class-net b/Documentation/ABI/testing/sysfs-class-net
> > index 664a8f6a634f..5e8b09743e04 100644
> > --- a/Documentation/ABI/testing/sysfs-class-net
> > +++ b/Documentation/ABI/testing/sysfs-class-net
> > @@ -124,6 +124,19 @@ Description:
> >   		authentication is performed (e.g: 802.1x). 'link_mode' attribute
> >   		will also reflect the dormant state.
> > +What:		/sys/class/net/<iface>/testing
> > +Date:		Jun 2019
> > +KernelVersion:	5.2
> 
> This should probably be 5.8 now, other than that:

Ah, yes. Shows how long this has been sat in my tree.

> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>

Thanks
	Andrew

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-04-17 23:55 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-17 23:03 [PATCH net-next 0/3] RFC 2863 Testing Oper status Andrew Lunn
2020-04-17 23:03 ` [PATCH net-next 1/3] net: Add IF_OPER_TESTING Andrew Lunn
2020-04-17 23:03 ` [PATCH net-next 2/3] net: Add testing sysfs attribute Andrew Lunn
2020-04-17 23:49   ` Florian Fainelli
2020-04-17 23:54     ` Andrew Lunn
2020-04-17 23:03 ` [PATCH net-next 3/3] net: ethtool: self_test: Mark interface in testing operative status Andrew Lunn
2020-04-17 23:53   ` Florian Fainelli

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.