configure_interface1(iface);
}
-static void
-handle_carrier(const char *ifname)
+void
+handle_carrier(int action, int flags, const char *ifname)
{
struct interface *iface;
int carrier;
for (iface = ifaces; iface; iface = iface->next)
if (strcmp(iface->name, ifname) == 0)
break;
- if (!iface || !(iface->state->options->options & DHCPCD_LINK))
+ if (!iface) {
+ if (options & DHCPCD_LINK)
+ handle_interface(1, ifname);
+ return;
+ }
+ if (!(iface->state->options->options & DHCPCD_LINK))
return;
- carrier = carrier_status(iface);
+ if (action == 0)
+ carrier = carrier_status(iface);
+ else {
+ carrier = action == 1 ? 1 : 0;
+ iface->flags = flags;
+ }
if (carrier == -1)
syslog(LOG_ERR, "%s: carrier_status: %m", ifname);
else if (carrier == 0 || !(iface->flags & IFF_RUNNING)) {
uint32_t l;
int nolease;
- handle_carrier(iface->name);
+ handle_carrier(0, 0, iface->name);
if (iface->carrier == LINK_DOWN) {
syslog(LOG_INFO, "%s: waiting for carrier", iface->name);
return;
if (ifp != NULL)
stop_interface(ifp);
return;
- } else if (action == 0) {
- handle_carrier(ifname);
- return;
}
/* If running off an interface list, check it's in it. */
ts.tv_nsec = 0;
nanosleep(&ts, NULL);
for (iface = ifaces; iface; iface = iface->next) {
- handle_carrier(iface->name);
+ handle_carrier(0, 0, iface->name);
if (iface->carrier != LINK_DOWN) {
opt = 1;
break;
/*
* dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2010 Roy Marples <roy@marples.name>
+ * Copyright (c) 2006-2011 Roy Marples <roy@marples.name>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
struct interface *find_interface(const char *);
int handle_args(struct fd_list *, int, char **);
+void handle_carrier(int, int, const char *);
void handle_interface(int, const char *);
void handle_hwaddr(const char *, unsigned char *, size_t);
void handle_ifa(int, const char *,
case RTM_IFINFO:
ifm = (struct if_msghdr *)(void *)p;
memset(ifname, 0, sizeof(ifname));
- if (if_indextoname(ifm->ifm_index, ifname))
- handle_interface(0, ifname);
+ if (!(if_indextoname(ifm->ifm_index, ifname)))
+ break;
+ switch (ifm->ifm_data.ifi_link_state) {
+ case LINK_STATE_DOWN:
+ len = 1;
+ break;
+ case LINK_STATE_UP:
+ len = -1;
+ break;
+ default:
+ len = ifm->ifm_flags & IFF_RUNNING
+ ? 1 : -1;
+ break;
+ }
+ handle_carrier(len, ifm->ifm_flags, ifname);
break;
case RTM_DELETE:
if (!(rtm->rtm_addrs & RTA_DST) ||
/*
* dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2010 Roy Marples <roy@marples.name>
+ * Copyright (c) 2006-2011 Roy Marples <roy@marples.name>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
}
rta = RTA_NEXT(rta, len);
}
- if (nlm->nlmsg_type == RTM_NEWLINK)
- len = ifi->ifi_change == ~0U ? 1 : 0;
- else
- len = -1;
- handle_interface(len, ifn);
+
+ if (nlm->nlmsg_type == RTM_DELLINK) {
+ handle_interface(-1, ifn);
+ return 1;
+ }
+
+ handle_carrier(ifi->ifi_flags & IFF_RUNNING ? 1 : -1,
+ ifi->ifi_flags, ifn);
return 1;
}