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


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

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

Reply via email to