All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFC 0/3] RFC 2863 Testing Oper status
@ 2019-06-12 15:44 Andrew Lunn
  2019-06-12 15:44 ` [PATCH RFC 1/3] net: Add IF_OPER_TESTING Andrew Lunn
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Andrew Lunn @ 2019-06-12 15:44 UTC (permalink / raw)
  To: netdev; +Cc: Florian Fainelli, 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/ethtool.c                        |  2 ++
 net/core/link_watch.c                     | 12 +++++--
 net/core/net-sysfs.c                      | 15 ++++++++-
 net/core/rtnetlink.c                      |  9 ++++-
 8 files changed, 94 insertions(+), 4 deletions(-)

-- 
2.20.1


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

* [PATCH RFC 1/3] net: Add IF_OPER_TESTING
  2019-06-12 15:44 [PATCH RFC 0/3] RFC 2863 Testing Oper status Andrew Lunn
@ 2019-06-12 15:44 ` Andrew Lunn
  2019-06-12 15:44 ` [PATCH RFC 2/3] net: Add testing sysfs attribute Andrew Lunn
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Andrew Lunn @ 2019-06-12 15:44 UTC (permalink / raw)
  To: netdev; +Cc: Florian Fainelli, 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 eeacebd7debb..b1e8e2e2f9f0 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -284,6 +284,7 @@ enum netdev_state_t {
 	__LINK_STATE_NOCARRIER,
 	__LINK_STATE_LINKWATCH_PENDING,
 	__LINK_STATE_DORMANT,
+	__LINK_STATE_TESTING,
 };
 
 
@@ -3809,6 +3810,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 7fea0fd7d6f5..ca8aa4127894 100644
--- a/include/uapi/linux/if.h
+++ b/include/uapi/linux/if.h
@@ -177,6 +177,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 eb7fb6daa1ef..df583040dca4 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -8483,6 +8483,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 04fdc9535772..cee61e52944b 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 cec60583931f..8ff7363690f2 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -825,11 +825,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.20.1


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

* [PATCH RFC 2/3] net: Add testing sysfs attribute
  2019-06-12 15:44 [PATCH RFC 0/3] RFC 2863 Testing Oper status Andrew Lunn
  2019-06-12 15:44 ` [PATCH RFC 1/3] net: Add IF_OPER_TESTING Andrew Lunn
@ 2019-06-12 15:44 ` Andrew Lunn
  2019-06-12 15:44 ` [PATCH RFC 3/3] net: ethtool: self_test: Mark interface in testing operative status Andrew Lunn
  2019-06-13  3:12 ` [PATCH RFC 0/3] RFC 2863 Testing Oper status Florian Fainelli
  3 siblings, 0 replies; 5+ messages in thread
From: Andrew Lunn @ 2019-06-12 15:44 UTC (permalink / raw)
  To: netdev; +Cc: Florian Fainelli, 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 865ba6ca16eb..cab26358e347 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.20.1


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

* [PATCH RFC 3/3] net: ethtool: self_test: Mark interface in testing operative status
  2019-06-12 15:44 [PATCH RFC 0/3] RFC 2863 Testing Oper status Andrew Lunn
  2019-06-12 15:44 ` [PATCH RFC 1/3] net: Add IF_OPER_TESTING Andrew Lunn
  2019-06-12 15:44 ` [PATCH RFC 2/3] net: Add testing sysfs attribute Andrew Lunn
@ 2019-06-12 15:44 ` Andrew Lunn
  2019-06-13  3:12 ` [PATCH RFC 0/3] RFC 2863 Testing Oper status Florian Fainelli
  3 siblings, 0 replies; 5+ messages in thread
From: Andrew Lunn @ 2019-06-12 15:44 UTC (permalink / raw)
  To: netdev; +Cc: Florian Fainelli, 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/core/ethtool.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index d08b1e19ce9c..f86070effd61 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -1765,7 +1765,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.20.1


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

* Re: [PATCH RFC 0/3] RFC 2863 Testing Oper status
  2019-06-12 15:44 [PATCH RFC 0/3] RFC 2863 Testing Oper status Andrew Lunn
                   ` (2 preceding siblings ...)
  2019-06-12 15:44 ` [PATCH RFC 3/3] net: ethtool: self_test: Mark interface in testing operative status Andrew Lunn
@ 2019-06-13  3:12 ` Florian Fainelli
  3 siblings, 0 replies; 5+ messages in thread
From: Florian Fainelli @ 2019-06-13  3:12 UTC (permalink / raw)
  To: Andrew Lunn, netdev



On 6/12/2019 8:44 AM, Andrew Lunn wrote:
> 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.

LGTM!

> 
> 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/ethtool.c                        |  2 ++
>  net/core/link_watch.c                     | 12 +++++--
>  net/core/net-sysfs.c                      | 15 ++++++++-
>  net/core/rtnetlink.c                      |  9 ++++-
>  8 files changed, 94 insertions(+), 4 deletions(-)
> 

-- 
Florian

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

end of thread, other threads:[~2019-06-13 16:52 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-12 15:44 [PATCH RFC 0/3] RFC 2863 Testing Oper status Andrew Lunn
2019-06-12 15:44 ` [PATCH RFC 1/3] net: Add IF_OPER_TESTING Andrew Lunn
2019-06-12 15:44 ` [PATCH RFC 2/3] net: Add testing sysfs attribute Andrew Lunn
2019-06-12 15:44 ` [PATCH RFC 3/3] net: ethtool: self_test: Mark interface in testing operative status Andrew Lunn
2019-06-13  3:12 ` [PATCH RFC 0/3] RFC 2863 Testing Oper status 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.