* [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.