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

2017-09-28 Thread Martin Schiller
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 
---
 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)
-- 
2.11.0


___
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev


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

2017-09-28 Thread Philip Prindeville
Inline…


> On Sep 28, 2017, at 2:32 AM, Martin Schiller  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 
> ---
> 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


___
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev


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

2017-09-28 Thread Martin Schiller

On 2017-09-29 00:36, Philip Prindeville wrote:

Inline…



On Sep 28, 2017, at 2:32 AM, Martin Schiller  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 
---
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?


I can't see any reason why the logic would get confused here:

After the "ip link set eth0 name _eth0", the eth0 device would be set to 
"NOT-present".
And after "ip link set _eth7 name eth0", the eth0 device would be set to 
"present" again.


Martin.


___
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev


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

2017-10-06 Thread Hans Dedecker
On Thu, Sep 28, 2017 at 10:32 AM, Martin Schiller  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 
Acked-by: Hans Dedecker 
> ---
>  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)
> --
> 2.11.0
>
>
> ___
> Lede-dev mailing list
> Lede-dev@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/lede-dev

___
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev