configure_interface1(ifp);
}
+int
+handle_rename(unsigned int index, const char *ifname)
+{
+ struct interface *ifp;
+
+ TAILQ_FOREACH(ifp, ifaces, next) {
+ if (ifp->index == index && strcmp(ifp->name, ifname)) {
+ syslog(LOG_INFO, "%s: rename to %s", ifp->name, ifname);
+ strlcpy(ifp->name, ifname, sizeof(ifp->name));
+ return 1;
+ }
+ }
+ return 0;
+}
+
void
handle_carrier(int carrier, int flags, const char *ifname)
{
struct interface *ifp;
- if (!(options & DHCPCD_LINK))
- return;
ifp = find_interface(ifname);
- if (ifp == NULL) {
- handle_interface(1, ifname);
- return;
- }
- if (!(ifp->options->options & DHCPCD_LINK))
+ if (ifp == NULL || !(ifp->options->options & DHCPCD_LINK))
return;
if (carrier == LINK_UNKNOWN)
int handle_args(struct fd_list *, int, char **);
void handle_carrier(int, int, const char *);
void handle_interface(int, const char *);
+int handle_rename(unsigned int, const char *);
void handle_hwaddr(const char *, const unsigned char *, size_t);
void drop_interface(struct interface *, const char *);
int select_profile(struct interface *, const char *);
struct rtattr *rta, *hwaddr;
struct ifinfomsg *ifi;
char ifn[IF_NAMESIZE + 1];
-
-#ifdef LIBUDEV
- if (nlm->nlmsg_type == RTM_NEWLINK || nlm->nlmsg_type == RTM_DELLINK) {
- if (libudev_listening())
- return 1;
- }
-#endif
+ struct interface *ifp;
len = link_route(nlm);
if (len != 0)
len = NLMSG_PAYLOAD(nlm, sizeof(*ifi));
*ifn = '\0';
hwaddr = NULL;
+
while (RTA_OK(rta, len)) {
switch (rta->rta_type) {
case IFLA_WIRELESS:
return 1;
}
+ /* Check for interface name change */
+ if (handle_rename(ifi->ifi_index, ifn))
+ return 1;
+
+ /* Check for a new interface */
+ ifp = find_interface(ifn);
+ if (ifp == NULL) {
+#ifdef LIBUDEV
+ /* Let udev announce the interface for renaming */
+ if (libudev_listening())
+ return 1;
+#endif
+ handle_interface(1, ifn);
+ return 1;
+ }
+
/* Re-read hardware address and friends */
if (!(ifi->ifi_flags & IFF_UP) && hwaddr) {
len = l2addr_len(ifi->ifi_type);