if ((ifp = if_findindex(ctx->ifaces, ifm->ifm_index)) == NULL)
return;
- /* If we get LINK_STATE_UNKNOWN here, it means the interface
- * doesn't support reporting carrier state.
- * As such, we need to rely on IFF_UP.
- * Even if LINK_STATE_UP is reported, we also need IFF_UP as well
- * so for dhcpcd they are equivalent and we only need to check
- * LINK_STATE_DOWN. */
- if (ifm->ifm_data.ifi_link_state == LINK_STATE_DOWN)
- link_state = LINK_DOWN;
- else
+ switch (ifm->ifm_data.ifi_link_state) {
+ case LINK_STATE_UNKNOWN:
+ if (ifp->media_valid) {
+ link_state = LINK_DOWN;
+ break;
+ }
+ /* Interface does not report media state, so we have
+ * to rely on IFF_UP. */
+ /* FALLTHROUGH */
+ case LINK_STATE_UP:
link_state = ifm->ifm_flags & IFF_UP ? LINK_UP : LINK_DOWN;
+ break;
+ default:
+ link_state = LINK_DOWN;
+ break;
+ }
dhcpcd_handlecarrier(ctx, link_state,
(unsigned int)ifm->ifm_flags, ifp->name);
strlcpy(ifmr.ifm_name, ifp->name, sizeof(ifmr.ifm_name));
if (ioctl(ifp->ctx->pf_inet_fd, SIOCGIFMEDIA, &ifmr) != -1 &&
ifmr.ifm_status & IFM_AVALID)
+ {
+ ifp->media_valid = true;
r = (ifmr.ifm_status & IFM_ACTIVE) ? LINK_UP : LINK_DOWN;
- else
+ } else {
+ ifp->media_valid = false;
r = ifr.ifr_flags & IFF_RUNNING ? LINK_UP : LINK_UNKNOWN;
+ }
#else
r = ifr.ifr_flags & IFF_RUNNING ? LINK_UP : LINK_DOWN;
#endif
* we can work them out. */
ifp->metric = 200 + ifp->index;
if (if_getssid(ifp) != -1) {
- ifp->wireless = 1;
+ ifp->wireless = true;
ifp->metric += 100;
}
#endif