[LEDE-DEV] [PATCH netifd] system-linux: add support for hotplug event 'move'

Philip Prindeville philipp_subx at redfish-solutions.com
Thu Sep 28 15:36:16 PDT 2017


Inline…


> On Sep 28, 2017, at 2:32 AM, Martin Schiller <ms at dev.tdt.de> wrote:
> 
> If you rename a network interface, there is a move uevent
> invoked instead of remove/add.
> 
> This patch adds support for this kind of event.
> 
> Signed-off-by: Martin Schiller <ms at dev.tdt.de>
> ---
> system-linux.c | 31 ++++++++++++++++++++++++++++---
> 1 file changed, 28 insertions(+), 3 deletions(-)
> 
> diff --git a/system-linux.c b/system-linux.c
> index 6d97a02..e2017d0 100644
> --- a/system-linux.c
> +++ b/system-linux.c
> @@ -543,16 +543,20 @@ out:
> static void
> handle_hotplug_msg(char *data, int size)
> {
> -	const char *subsystem = NULL, *interface = NULL;
> +	const char *subsystem = NULL, *interface = NULL, *interface_old = NULL;
> 	char *cur, *end, *sep;
> 	struct device *dev;
> 	int skip;
> -	bool add;
> +	bool add, move = false;
> 
> 	if (!strncmp(data, "add@", 4))
> 		add = true;
> 	else if (!strncmp(data, "remove@", 7))
> 		add = false;
> +	else if (!strncmp(data, "move@", 5)) {
> +		add = true;
> +		move = true;
> +	}
> 	else
> 		return;
> 
> @@ -574,11 +578,32 @@ handle_hotplug_msg(char *data, int size)
> 			if (strcmp(subsystem, "net") != 0)
> 				return;
> 		}
> -		if (subsystem && interface)
> +		else if (!strcmp(cur, "DEVPATH_OLD")) {
> +			interface_old = strrchr(sep + 1, '/');
> +			if (interface_old)
> +				interface_old++;
> +		}
> +	}
> +
> +	if (subsystem && interface) {
> +		if (move && interface_old)
> +			goto move;
> +		else
> 			goto found;
> 	}
> +
> 	return;
> 
> +move:
> +	dev = device_find(interface_old);
> +	if (!dev)
> +		goto found;
> +
> +	if (dev->type != &simple_device_type)
> +		goto found;
> +
> +	device_set_present(dev, false);
> +
> found:
> 	dev = device_find(interface);
> 	if (!dev)
> 


I’m a little unclear about how all of this would work.

We have a platform where the kernel always detects certain devices (mostly i210 and i350 Intel NICs) in the wrong order, so early on (S19) we run an init.d script which looks at their PCI bus information and then depending on whether it matches the pattern of the devices which get mis-numbered, we do the following:

ip link set eth0 name _eth0
ip link set eth1 name _eth1
...
ip link set eth7 name _eth7

ip link set _eth7 name eth0
ip link set _eth6 name eth1
...
ip link set _eth0 name eth7

so it seems to me that your logic would get confused by the “old” instance of “eth0” and the new one.

Am I missing anything?

And yes, we do this as a work-around to not having udev rules to handle the naming for us.

-Philip




More information about the Lede-dev mailing list