+ if (retval != 0) {
+ int loop;
+
+ /* see if the destination interface name already exists */
+ if (errno != EEXIST) {
+ err("error changing netif name %s to %s: %s", ifr.ifr_name, ifr.ifr_newname, strerror(errno));
+ goto exit;
+ }
+
+ /* free our own name, another process may wait for us */
+ strlcpy(ifr.ifr_newname, udev->dev->kernel, IFNAMSIZ);
+ strlcat(ifr.ifr_newname, "_rename", IFNAMSIZ);
+ retval = ioctl(sk, SIOCSIFNAME, &ifr);
+ if (retval != 0) {
+ err("error changing netif name %s to %s: %s", ifr.ifr_name, ifr.ifr_newname, strerror(errno));
+ goto exit;
+ }
+
+ /* wait 30 seconds for our target to become available */
+ strlcpy(ifr.ifr_name, ifr.ifr_newname, IFNAMSIZ);
+ strlcpy(ifr.ifr_newname, udev->name, IFNAMSIZ);
+ loop = 30 * 20;
+ while (loop--) {
+ retval = ioctl(sk, SIOCSIFNAME, &ifr);
+ if (retval != 0) {
+ if (errno != EEXIST) {
+ err("error changing net interface name %s to %s: %s",
+ ifr.ifr_name, ifr.ifr_newname, strerror(errno));
+ break;
+ }
+ dbg("wait for netif '%s' to become free, loop=%i", udev->name, (30 * 20) - loop);
+ usleep(1000 * 1000 / 20);
+ }
+ }
+ }