static void maybe_up_new_iface(void) { if (!(option_mask32 & FLAG_NO_AUTO)) up_iface(); #if 0 /* bloat */ struct ifreq ifrequest; struct ethtool_drvinfo driver_info; set_ifreq_to_ifname(&ifrequest); driver_info.cmd = ETHTOOL_GDRVINFO; ifrequest.ifr_data = &driver_info; if (network_ioctl(SIOCETHTOOL, &ifrequest, NULL) == 0) { char buf[sizeof("/xx:xx:xx:xx:xx:xx")]; /* Get MAC */ buf[0] = '\0'; set_ifreq_to_ifname(&ifrequest); if (network_ioctl(SIOCGIFHWADDR, &ifrequest, NULL) == 0) { sprintf(buf, "/%02X:%02X:%02X:%02X:%02X:%02X", (uint8_t)(ifrequest.ifr_hwaddr.sa_data[0]), (uint8_t)(ifrequest.ifr_hwaddr.sa_data[1]), (uint8_t)(ifrequest.ifr_hwaddr.sa_data[2]), (uint8_t)(ifrequest.ifr_hwaddr.sa_data[3]), (uint8_t)(ifrequest.ifr_hwaddr.sa_data[4]), (uint8_t)(ifrequest.ifr_hwaddr.sa_data[5])); } bb_error_msg("using interface %s%s with driver<%s> (version: %s)", G.iface, buf, driver_info.driver, driver_info.version); } #endif if (G.api_mode[0] == 'a') G.api_method_num = API_AUTO; }
static smallint detect_link(void) { smallint status; if (!G.iface_exists) return (option_mask32 & FLAG_MONITOR) ? IFSTATUS_DOWN : IFSTATUS_ERR; /* Some drivers can't detect link status when the interface is down. * I imagine detect_link_iff() is the most vulnerable. * That's why -a "noauto" in an option, not a hardwired behavior. */ if (!(option_mask32 & FLAG_NO_AUTO)) up_iface(); if (G.api_method_num == API_AUTO) { int i; smallint sv_logmode; sv_logmode = logmode; for (i = 0; i < ARRAY_SIZE(method_table); i++) { logmode = LOGMODE_NONE; status = method_table[i].func(); logmode = sv_logmode; if (status != IFSTATUS_ERR) { G.api_method_num = i; bb_error_msg("using %s detection mode", method_table[i].name); break; } } } else { status = method_table[G.api_method_num].func(); } if (status == IFSTATUS_ERR) { if (option_mask32 & FLAG_IGNORE_FAIL) status = IFSTATUS_DOWN; else if (option_mask32 & FLAG_IGNORE_FAIL_POSITIVE) status = IFSTATUS_UP; else if (G.api_mode[0] == 'a') bb_error_msg("can't detect link status"); } if (status != G.iface_last_status) { G.iface_prev_status = G.iface_last_status; G.iface_last_status = status; } return status; }
static smallint detect_link(void) { smallint status; if (!G.iface_exists) return (option_mask32 & FLAG_MONITOR) ? IFSTATUS_DOWN : IFSTATUS_ERR; /* Some drivers can't detect link status when the interface is down. * I imagine detect_link_iff() is the most vulnerable. * That's why -a "noauto" in an option, not a hardwired behavior. */ if (!(option_mask32 & FLAG_NO_AUTO)) up_iface(); status = G.detect_link_func(); if (status == IFSTATUS_ERR) { if (option_mask32 & FLAG_IGNORE_FAIL) status = IFSTATUS_DOWN; if (option_mask32 & FLAG_IGNORE_FAIL_POSITIVE) status = IFSTATUS_UP; } if (status == IFSTATUS_ERR && G.detect_link_func == detect_link_auto ) { bb_error_msg("failed to detect link status"); } if (status != G.iface_last_status) { //TODO: is it safe to repeatedly do this? setenv(IFPLUGD_ENV_PREVIOUS, strstatus(G.iface_last_status), 1); setenv(IFPLUGD_ENV_CURRENT, strstatus(status), 1); G.iface_last_status = status; } return status; }