ifo->options &= ~(DHCPCD_ARP | DHCPCD_IPV4LL);
if (!(ifp->flags & (IFF_POINTOPOINT | IFF_LOOPBACK | IFF_MULTICAST)))
ifo->options &= ~DHCPCD_IPV6RS;
- if (ifo->options & DHCPCD_LINK && carrier_status(ifp) == -1)
+ if (ifo->options & DHCPCD_LINK && carrier_status(ifp) == LINK_UNKNOWN)
ifo->options &= ~DHCPCD_LINK;
if (ifo->metric != -1)
}
void
-handle_carrier(int action, int flags, const char *ifname)
+handle_carrier(int carrier, int flags, const char *ifname)
{
struct interface *ifp;
- int carrier;
if (!(options & DHCPCD_LINK))
return;
if (!(ifp->options->options & DHCPCD_LINK))
return;
- if (action) {
- carrier = action == 1 ? 1 : 0;
+ if (carrier == LINK_UNKNOWN)
+ carrier = carrier_status(ifp); /* will set ifp->flags */
+ else
ifp->flags = flags;
- } else
- carrier = carrier_status(ifp);
- if (carrier == -1)
+ if (carrier == LINK_UNKNOWN)
syslog(LOG_ERR, "%s: carrier_status: %m", ifname);
- else if (carrier == 0 ||
- (ifp->flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING))
- {
+ /* IFF_RUNNING is checked, if needed, earlier and is OS dependant */
+ else if (carrier == LINK_DOWN || (ifp->flags & IFF_UP) == 0) {
if (ifp->carrier != LINK_DOWN) {
ifp->carrier = LINK_DOWN;
syslog(LOG_INFO, "%s: carrier lost", ifp->name);
ipv6_free(ifp);
dhcp_drop(ifp, "NOCARRIER");
}
- } else if (carrier == 1 &&
- (ifp->flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
- {
+ } else if (carrier == LINK_UP && ifp->flags & IFF_UP) {
if (ifp->carrier != LINK_UP) {
ifp->carrier = LINK_UP;
syslog(LOG_INFO, "%s: carrier acquired", ifp->name);
struct if_options *ifo = ifp->options;
int nolease;
- handle_carrier(0, 0, ifp->name);
+ handle_carrier(LINK_UNKNOWN, 0, ifp->name);
if (ifp->carrier == LINK_DOWN) {
syslog(LOG_INFO, "%s: waiting for carrier", ifp->name);
return;
ts.tv_nsec = 0;
nanosleep(&ts, NULL);
TAILQ_FOREACH(ifp, ifaces, next) {
- handle_carrier(0, 0, ifp->name);
+ handle_carrier(LINK_UNKNOWN, 0, ifp->name);
if (ifp->carrier != LINK_DOWN) {
opt = 1;
break;
return -1;
iface->flags = ifr.ifr_flags;
- ret = -1;
+ ret = LINK_UNKNOWN;
#ifdef SIOCGIFMEDIA
memset(&ifmr, 0, sizeof(ifmr));
strlcpy(ifmr.ifm_name, iface->name, sizeof(ifmr.ifm_name));
if (ioctl(socket_afnet, SIOCGIFMEDIA, &ifmr) != -1 &&
ifmr.ifm_status & IFM_AVALID)
- ret = (ifmr.ifm_status & IFM_ACTIVE) ? 1 : 0;
+ ret = (ifmr.ifm_status & IFM_ACTIVE) ? LINK_UP : LINK_DOWN;
#endif
- if (ret == -1)
- ret = (ifr.ifr_flags & IFF_RUNNING) ? 1 : 0;
+ if (ret == LINK_UNKNOWN)
+ ret = (ifr.ifr_flags & IFF_RUNNING) ? LINK_UP : LINK_DOWN;
return ret;
}