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

Martin Schiller ms at dev.tdt.de
Thu Sep 28 01:32:28 PDT 2017


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)
-- 
2.11.0




More information about the Lede-dev mailing list