The idea here is simple. The vcan and the dummy network devices
currently do not set the operational state of the interface.
The result is that the interface state will be UNKNOWN.
The kernel considers the unknown state to be the same as up:
https://elixir.bootlin.com/linux/latest/source/include/linux/netdevice.h#L4125
However for users this creates confusion:
https://serverfault.com/questions/629676/dummy-network-interface-in-linux
The change in this patch is very simple. When the interface is set up, the
operational state is set to IF_OPER_UP.
Signed-off-by: Kaarel Pärtel <[email protected]>
---
drivers/net/can/vcan.c | 1 +
drivers/net/dummy.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c
index a15619d883ec..79768f9d4294 100644
--- a/drivers/net/can/vcan.c
+++ b/drivers/net/can/vcan.c
@@ -162,6 +162,7 @@ static void vcan_setup(struct net_device *dev)
dev->netdev_ops = &vcan_netdev_ops;
dev->needs_free_netdev = true;
+ dev->operstate = IF_OPER_UP;
}
static struct rtnl_link_ops vcan_link_ops __read_mostly = {
diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c
index f82ad7419508..ab128f66de00 100644
--- a/drivers/net/dummy.c
+++ b/drivers/net/dummy.c
@@ -133,6 +133,7 @@ static void dummy_setup(struct net_device *dev)
dev->min_mtu = 0;
dev->max_mtu = 0;
+ dev->operstate = IF_OPER_UP;
}
static int dummy_validate(struct nlattr *tb[], struct nlattr *data[],
--
2.25.1
On Thu, 2 Jun 2022 11:19:29 +0300 Kaarel Pärtel wrote:
> The idea here is simple. The vcan and the dummy network devices
> currently do not set the operational state of the interface.
> The result is that the interface state will be UNKNOWN.
>
> The kernel considers the unknown state to be the same as up:
> https://elixir.bootlin.com/linux/latest/source/include/linux/netdevice.h#L4125
>
> However for users this creates confusion:
> https://serverfault.com/questions/629676/dummy-network-interface-in-linux
>
> The change in this patch is very simple. When the interface is set up, the
> operational state is set to IF_OPER_UP.
>
> Signed-off-by: Kaarel Pärtel <[email protected]>
You can change the carrier state from user space on a dummy device,
that will inform the kernel of the operstate:
# ip link add type dummy
# ip link show dev dummy0
8: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 8e:35:15:22:e3:d7 brd ff:ff:ff:ff:ff:ff
# ip link set dev dummy0 up
# ip link show dev dummy0
8: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 8e:35:15:22:e3:d7 brd ff:ff:ff:ff:ff:ff
# ip link set dev dummy0 carrier off
# ip link set dev dummy0 carrier on
# ip link show dev dummy0
8: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 8e:35:15:22:e3:d7 brd ff:ff:ff:ff:ff:ff
Flipping all soft devices which don't have a lower or don't expect user
space management to UP is fine but doing it one by one feels icky.
Yet another random thing a driver author has to know to flip.
If people are confused about seeing UNKNOWN in ip link output maybe we
should move displaying that under the -d flag (detailed output)?
Saves space, and nobody will get confused.
On Thu, 2 Jun 2022 11:19:29 +0300
Kaarel Pärtel <[email protected]> wrote:
> The idea here is simple. The vcan and the dummy network devices
> currently do not set the operational state of the interface.
> The result is that the interface state will be UNKNOWN.
>
> The kernel considers the unknown state to be the same as up:
> https://elixir.bootlin.com/linux/latest/source/include/linux/netdevice.h#L4125
>
> However for users this creates confusion:
> https://serverfault.com/questions/629676/dummy-network-interface-in-linux
>
> The change in this patch is very simple. When the interface is set up, the
> operational state is set to IF_OPER_UP.
>
> Signed-off-by: Kaarel Pärtel <[email protected]>
> ---
> drivers/net/can/vcan.c | 1 +
> drivers/net/dummy.c | 1 +
> 2 files changed, 2 insertions(+)
>
> diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c
> index a15619d883ec..79768f9d4294 100644
> --- a/drivers/net/can/vcan.c
> +++ b/drivers/net/can/vcan.c
> @@ -162,6 +162,7 @@ static void vcan_setup(struct net_device *dev)
>
> dev->netdev_ops = &vcan_netdev_ops;
> dev->needs_free_netdev = true;
> + dev->operstate = IF_OPER_UP;
> }
>
> static struct rtnl_link_ops vcan_link_ops __read_mostly = {
> diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c
> index f82ad7419508..ab128f66de00 100644
> --- a/drivers/net/dummy.c
> +++ b/drivers/net/dummy.c
> @@ -133,6 +133,7 @@ static void dummy_setup(struct net_device *dev)
>
> dev->min_mtu = 0;
> dev->max_mtu = 0;
> + dev->operstate = IF_OPER_UP;
> }
>
> static int dummy_validate(struct nlattr *tb[], struct nlattr *data[],
Normally carrier state is propogated to operstate by linkwatch.
You may need to add a call for that.