From 841cd0ce3f6b97fbf77e12a6018a2c4a633eba89 Mon Sep 17 00:00:00 2001 From: Andoni Zarate Date: Fri, 23 Apr 2021 12:32:47 +0200 Subject: On collision rename my name to a temporal one letting others got my name... Signed-off-by: Anthony G. Basile --- src/udev/udev-event.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index 4120c04f2..64cc69cbc 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -826,6 +826,7 @@ static int rename_netif_dev_fromname_toname(struct udev_device *dev,const char * #ifdef ENABLE_RULE_GENERATOR int loop; + struct ifreq ifr_tmp; if (r == 0) { log_info("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname); @@ -835,6 +836,16 @@ static int rename_netif_dev_fromname_toname(struct udev_device *dev,const char * log_debug("collision on rename of network interface %s to %s , retrying until timeout\n", ifr.ifr_name, ifr.ifr_newname); + /* there has been a collision so rename my name to a temporal name, letting other one to rename to my name, freeying its name... */ + memzero(&ifr_tmp, sizeof(struct ifreq)); + strscpy(ifr_tmp.ifr_name, IFNAMSIZ, oldname); + snprintf(ifr_tmp.ifr_newname, IFNAMSIZ, "rename_%s", oldname); + r = ioctl(sk, SIOCSIFNAME, &ifr_tmp); + log_info("Temporarily renamed network interface %s to %s\n", ifr_tmp.ifr_name, ifr_tmp.ifr_newname); + + /* we have changed our name so in subsequents tries i should rename my temporal name to the wanted one */ + strscpy(ifr.ifr_name, IFNAMSIZ, ifr_tmp.ifr_newname); + r = -errno; if (r != -EEXIST) goto out; -- cgit v1.2.3-65-gdbad