diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index bdd91ac09..9dfea2537 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -172,403 +172,416 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) if (ifAddrStruct) freeifaddrs(ifAddrStruct); - FF_AUTO_CLOSE_FD int sockfd = socket(AF_INET, SOCK_DGRAM, 0); - if (sockfd > 0) + if ((options->showType & FF_LOCALIP_TYPE_MTU_BIT) || (options->showType & FF_LOCALIP_TYPE_SPEED_BIT) + #ifdef __sun + || (options->showType & FF_LOCALIP_TYPE_MAC_BIT) + #endif + ) { - FF_LIST_FOR_EACH(FFLocalIpResult, iface, *results) + FF_AUTO_CLOSE_FD int sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (sockfd > 0) { - struct ifreq ifr; - strncpy(ifr.ifr_name, iface->name.chars, IFNAMSIZ - 1); - - if (ioctl(sockfd, SIOCGIFMTU, &ifr) == 0) - iface->mtu = (int32_t) ifr.ifr_mtu; - - #ifdef __linux__ - struct ethtool_cmd edata = { .cmd = ETHTOOL_GSET }; - ifr.ifr_data = (void*) &edata; - if (ioctl(sockfd, SIOCETHTOOL, &ifr) == 0) - iface->speed = (edata.speed_hi << 16) | edata.speed; // ethtool_cmd_speed is not available on Android - #elif __FreeBSD__ || __APPLE__ - struct ifmediareq ifmr = {}; - strncpy(ifmr.ifm_name, iface->name.chars, IFNAMSIZ - 1); - if (ioctl(sockfd, SIOCGIFMEDIA, &ifmr) == 0) + FF_LIST_FOR_EACH(FFLocalIpResult, iface, *results) { - switch (IFM_SUBTYPE(ifmr.ifm_active)) + struct ifreq ifr; + strncpy(ifr.ifr_name, iface->name.chars, IFNAMSIZ - 1); + + if (options->showType & FF_LOCALIP_TYPE_MTU_BIT) { - #ifdef IFM_HPNA_1 - case IFM_HPNA_1: - #endif - iface->speed = 1; break; - #ifdef IFM_1000_CX - case IFM_1000_CX: - #endif - #ifdef IFM_1000_CX_SGMII - case IFM_1000_CX_SGMII: - #endif - #ifdef IFM_1000_KX - case IFM_1000_KX: - #endif - #ifdef IFM_1000_LX - case IFM_1000_LX: - #endif - #ifdef IFM_1000_SGMII - case IFM_1000_SGMII: - #endif - #ifdef IFM_1000_SX - case IFM_1000_SX: - #endif - #ifdef IFM_1000_T - case IFM_1000_T: - #endif - iface->speed = 1000; break; - #ifdef IFM_100G_AUI2 - case IFM_100G_AUI2: - #endif - #ifdef IFM_100G_AUI2_AC - case IFM_100G_AUI2_AC: - #endif - #ifdef IFM_100G_AUI4 - case IFM_100G_AUI4: - #endif - #ifdef IFM_100G_AUI4_AC - case IFM_100G_AUI4_AC: - #endif - #ifdef IFM_100G_CAUI2 - case IFM_100G_CAUI2: - #endif - #ifdef IFM_100G_CAUI2_AC - case IFM_100G_CAUI2_AC: - #endif - #ifdef IFM_100G_CAUI4 - case IFM_100G_CAUI4: - #endif - #ifdef IFM_100G_CAUI4_AC - case IFM_100G_CAUI4_AC: - #endif - #ifdef IFM_100G_CP2 - case IFM_100G_CP2: - #endif - #ifdef IFM_100G_CR4 - case IFM_100G_CR4: - #endif - #ifdef IFM_100G_CR_PAM4 - case IFM_100G_CR_PAM4: - #endif - #ifdef IFM_100G_DR - case IFM_100G_DR: - #endif - #ifdef IFM_100G_KR2_PAM4 - case IFM_100G_KR2_PAM4: - #endif - #ifdef IFM_100G_KR4 - case IFM_100G_KR4: - #endif - #ifdef IFM_100G_KR_PAM4 - case IFM_100G_KR_PAM4: - #endif - #ifdef IFM_100G_LR4 - case IFM_100G_LR4: - #endif - #ifdef IFM_100G_SR2 - case IFM_100G_SR2: - #endif - #ifdef IFM_100G_SR4 - case IFM_100G_SR4: - #endif - iface->speed = 100000; break; - #ifdef IFM_100_FX - case IFM_100_FX: - #endif - #ifdef IFM_100_SGMII - case IFM_100_SGMII: - #endif - #ifdef IFM_100_T - case IFM_100_T: - #endif - #ifdef IFM_100_T2 - case IFM_100_T2: - #endif - #ifdef IFM_100_T4 - case IFM_100_T4: - #endif - #ifdef IFM_100_TX - case IFM_100_TX: - #endif - #ifdef IFM_100_VG - case IFM_100_VG: - #endif - iface->speed = 100; break; - #ifdef IFM_10G_AOC - case IFM_10G_AOC: - #endif - #ifdef IFM_10G_CR1 - case IFM_10G_CR1: - #endif - #ifdef IFM_10G_CX4 - case IFM_10G_CX4: - #endif - #ifdef IFM_10G_ER - case IFM_10G_ER: - #endif - #ifdef IFM_10G_KR - case IFM_10G_KR: - #endif - #ifdef IFM_10G_KX4 - case IFM_10G_KX4: - #endif - #ifdef IFM_10G_LR - case IFM_10G_LR: - #endif - #ifdef IFM_10G_LRM - case IFM_10G_LRM: - #endif - #ifdef IFM_10G_SFI - case IFM_10G_SFI: - #endif - #ifdef IFM_10G_SR - case IFM_10G_SR: - #endif - #ifdef IFM_10G_T - case IFM_10G_T: - #endif - #ifdef IFM_10G_TWINAX - case IFM_10G_TWINAX: - #endif - #ifdef IFM_10G_TWINAX_LONG - case IFM_10G_TWINAX_LONG: - #endif - iface->speed = 10000; break; - #ifdef IFM_10_2 - case IFM_10_2: - #endif - #ifdef IFM_10_5 - case IFM_10_5: - #endif - #ifdef IFM_10_FL - case IFM_10_FL: - #endif - #ifdef IFM_10_STP - case IFM_10_STP: - #endif - #ifdef IFM_10_T - case IFM_10_T: - #endif - iface->speed = 10; break; - #ifdef IFM_200G_AUI4 - case IFM_200G_AUI4: - #endif - #ifdef IFM_200G_AUI4_AC - case IFM_200G_AUI4_AC: - #endif - #ifdef IFM_200G_AUI8 - case IFM_200G_AUI8: - #endif - #ifdef IFM_200G_AUI8_AC - case IFM_200G_AUI8_AC: - #endif - #ifdef IFM_200G_CR4_PAM4 - case IFM_200G_CR4_PAM4: - #endif - #ifdef IFM_200G_DR4 - case IFM_200G_DR4: - #endif - #ifdef IFM_200G_FR4 - case IFM_200G_FR4: - #endif - #ifdef IFM_200G_KR4_PAM4 - case IFM_200G_KR4_PAM4: - #endif - #ifdef IFM_200G_LR4 - case IFM_200G_LR4: - #endif - #ifdef IFM_200G_SR4 - case IFM_200G_SR4: - #endif - iface->speed = 200000; break; - #ifdef IFM_20G_KR2 - case IFM_20G_KR2: - #endif - iface->speed = 20000; break; - #ifdef IFM_2500_KX - case IFM_2500_KX: - #endif - #ifdef IFM_2500_SX - case IFM_2500_SX: - #endif - #ifdef IFM_2500_T - case IFM_2500_T: - #endif - #ifdef IFM_2500_X - case IFM_2500_X: - #endif - iface->speed = 2500; break; - #ifdef IFM_25G_ACC - case IFM_25G_ACC: - #endif - #ifdef IFM_25G_AOC - case IFM_25G_AOC: - #endif - #ifdef IFM_25G_AUI - case IFM_25G_AUI: - #endif - #ifdef IFM_25G_CR - case IFM_25G_CR: - #endif - #ifdef IFM_25G_CR1 - case IFM_25G_CR1: - #endif - #ifdef IFM_25G_CR_S - case IFM_25G_CR_S: - #endif - #ifdef IFM_25G_KR - case IFM_25G_KR: - #endif - #ifdef IFM_25G_KR1 - case IFM_25G_KR1: - #endif - #ifdef IFM_25G_KR_S - case IFM_25G_KR_S: - #endif - #ifdef IFM_25G_LR - case IFM_25G_LR: - #endif - #ifdef IFM_25G_PCIE - case IFM_25G_PCIE: - #endif - #ifdef IFM_25G_SR - case IFM_25G_SR: - #endif - #ifdef IFM_25G_T - case IFM_25G_T: - #endif - iface->speed = 25000; break; - #ifdef IFM_400G_AUI8 - case IFM_400G_AUI8: - #endif - #ifdef IFM_400G_AUI8_AC - case IFM_400G_AUI8_AC: - #endif - #ifdef IFM_400G_DR4 - case IFM_400G_DR4: - #endif - #ifdef IFM_400G_FR8 - case IFM_400G_FR8: - #endif - #ifdef IFM_400G_LR8 - case IFM_400G_LR8: - #endif - iface->speed = 400000; break; - #ifdef IFM_40G_CR4 - case IFM_40G_CR4: - #endif - #ifdef IFM_40G_ER4 - case IFM_40G_ER4: - #endif - #ifdef IFM_40G_KR4 - case IFM_40G_KR4: - #endif - #ifdef IFM_40G_LR4 - case IFM_40G_LR4: - #endif - #ifdef IFM_40G_SR4 - case IFM_40G_SR4: - #endif - #ifdef IFM_40G_XLAUI - case IFM_40G_XLAUI: - #endif - #ifdef IFM_40G_XLAUI_AC - case IFM_40G_XLAUI_AC: - #endif - #ifdef IFM_40G_XLPPI - case IFM_40G_XLPPI: - #endif - #ifdef IFM_40G_LM4 - case IFM_40G_LM4: - #endif - iface->speed = 40000; break; - #ifdef IFM_5000_KR - case IFM_5000_KR: - #endif - #ifdef IFM_5000_KR1 - case IFM_5000_KR1: - #endif - #ifdef IFM_5000_KR_S - case IFM_5000_KR_S: - #endif - #ifdef IFM_5000_T - case IFM_5000_T: - #endif - iface->speed = 5000; break; - #ifdef IFM_50G_AUI1 - case IFM_50G_AUI1: - #endif - #ifdef IFM_50G_AUI1_AC - case IFM_50G_AUI1_AC: - #endif - #ifdef IFM_50G_AUI2 - case IFM_50G_AUI2: - #endif - #ifdef IFM_50G_AUI2_AC - case IFM_50G_AUI2_AC: - #endif - #ifdef IFM_50G_CP - case IFM_50G_CP: - #endif - #ifdef IFM_50G_CR2 - case IFM_50G_CR2: - #endif - #ifdef IFM_50G_FR - case IFM_50G_FR: - #endif - #ifdef IFM_50G_KR2 - case IFM_50G_KR2: - #endif - #ifdef IFM_50G_KR_PAM4 - case IFM_50G_KR_PAM4: - #endif - #ifdef IFM_50G_LAUI2 - case IFM_50G_LAUI2: - #endif - #ifdef IFM_50G_LAUI2_AC - case IFM_50G_LAUI2_AC: - #endif - #ifdef IFM_50G_LR - case IFM_50G_LR: - #endif - #ifdef IFM_50G_LR2 - case IFM_50G_LR2: - #endif - #ifdef IFM_50G_PCIE - case IFM_50G_PCIE: - #endif - #ifdef IFM_50G_SR - case IFM_50G_SR: - #endif - #ifdef IFM_50G_SR2 - case IFM_50G_SR2: - #endif - #ifdef IFM_50G_KR4 - case IFM_50G_KR4: - #endif - iface->speed = 50000; break; - #ifdef IFM_56G_R4 - case IFM_56G_R4: - #endif - iface->speed = 56000; break; - default: - iface->speed = -1; + if (ioctl(sockfd, SIOCGIFMTU, &ifr) == 0) + iface->mtu = (int32_t) ifr.ifr_mtu; } - } - #endif - #ifdef __sun - if ((options->showType & FF_LOCALIP_TYPE_MAC_BIT) && ioctl(sockfd, SIOCGIFHWADDR, &ifr) == 0) - { - const uint8_t* ptr = (uint8_t*) ifr.ifr_addr.sa_data; // NOT ifr_enaddr - ffStrbufSetF(&iface->mac, "%02x:%02x:%02x:%02x:%02x:%02x", - ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); + if (options->showType & FF_LOCALIP_TYPE_SPEED_BIT) + { + #ifdef __linux__ + struct ethtool_cmd edata = { .cmd = ETHTOOL_GSET }; + ifr.ifr_data = (void*) &edata; + if (ioctl(sockfd, SIOCETHTOOL, &ifr) == 0) + iface->speed = (edata.speed_hi << 16) | edata.speed; // ethtool_cmd_speed is not available on Android + #elif __FreeBSD__ || __APPLE__ + struct ifmediareq ifmr = {}; + strncpy(ifmr.ifm_name, iface->name.chars, IFNAMSIZ - 1); + if (ioctl(sockfd, SIOCGIFMEDIA, &ifmr) == 0) + { + switch (IFM_SUBTYPE(ifmr.ifm_active)) + { + #ifdef IFM_HPNA_1 + case IFM_HPNA_1: + #endif + iface->speed = 1; break; + #ifdef IFM_1000_CX + case IFM_1000_CX: + #endif + #ifdef IFM_1000_CX_SGMII + case IFM_1000_CX_SGMII: + #endif + #ifdef IFM_1000_KX + case IFM_1000_KX: + #endif + #ifdef IFM_1000_LX + case IFM_1000_LX: + #endif + #ifdef IFM_1000_SGMII + case IFM_1000_SGMII: + #endif + #ifdef IFM_1000_SX + case IFM_1000_SX: + #endif + #ifdef IFM_1000_T + case IFM_1000_T: + #endif + iface->speed = 1000; break; + #ifdef IFM_100G_AUI2 + case IFM_100G_AUI2: + #endif + #ifdef IFM_100G_AUI2_AC + case IFM_100G_AUI2_AC: + #endif + #ifdef IFM_100G_AUI4 + case IFM_100G_AUI4: + #endif + #ifdef IFM_100G_AUI4_AC + case IFM_100G_AUI4_AC: + #endif + #ifdef IFM_100G_CAUI2 + case IFM_100G_CAUI2: + #endif + #ifdef IFM_100G_CAUI2_AC + case IFM_100G_CAUI2_AC: + #endif + #ifdef IFM_100G_CAUI4 + case IFM_100G_CAUI4: + #endif + #ifdef IFM_100G_CAUI4_AC + case IFM_100G_CAUI4_AC: + #endif + #ifdef IFM_100G_CP2 + case IFM_100G_CP2: + #endif + #ifdef IFM_100G_CR4 + case IFM_100G_CR4: + #endif + #ifdef IFM_100G_CR_PAM4 + case IFM_100G_CR_PAM4: + #endif + #ifdef IFM_100G_DR + case IFM_100G_DR: + #endif + #ifdef IFM_100G_KR2_PAM4 + case IFM_100G_KR2_PAM4: + #endif + #ifdef IFM_100G_KR4 + case IFM_100G_KR4: + #endif + #ifdef IFM_100G_KR_PAM4 + case IFM_100G_KR_PAM4: + #endif + #ifdef IFM_100G_LR4 + case IFM_100G_LR4: + #endif + #ifdef IFM_100G_SR2 + case IFM_100G_SR2: + #endif + #ifdef IFM_100G_SR4 + case IFM_100G_SR4: + #endif + iface->speed = 100000; break; + #ifdef IFM_100_FX + case IFM_100_FX: + #endif + #ifdef IFM_100_SGMII + case IFM_100_SGMII: + #endif + #ifdef IFM_100_T + case IFM_100_T: + #endif + #ifdef IFM_100_T2 + case IFM_100_T2: + #endif + #ifdef IFM_100_T4 + case IFM_100_T4: + #endif + #ifdef IFM_100_TX + case IFM_100_TX: + #endif + #ifdef IFM_100_VG + case IFM_100_VG: + #endif + iface->speed = 100; break; + #ifdef IFM_10G_AOC + case IFM_10G_AOC: + #endif + #ifdef IFM_10G_CR1 + case IFM_10G_CR1: + #endif + #ifdef IFM_10G_CX4 + case IFM_10G_CX4: + #endif + #ifdef IFM_10G_ER + case IFM_10G_ER: + #endif + #ifdef IFM_10G_KR + case IFM_10G_KR: + #endif + #ifdef IFM_10G_KX4 + case IFM_10G_KX4: + #endif + #ifdef IFM_10G_LR + case IFM_10G_LR: + #endif + #ifdef IFM_10G_LRM + case IFM_10G_LRM: + #endif + #ifdef IFM_10G_SFI + case IFM_10G_SFI: + #endif + #ifdef IFM_10G_SR + case IFM_10G_SR: + #endif + #ifdef IFM_10G_T + case IFM_10G_T: + #endif + #ifdef IFM_10G_TWINAX + case IFM_10G_TWINAX: + #endif + #ifdef IFM_10G_TWINAX_LONG + case IFM_10G_TWINAX_LONG: + #endif + iface->speed = 10000; break; + #ifdef IFM_10_2 + case IFM_10_2: + #endif + #ifdef IFM_10_5 + case IFM_10_5: + #endif + #ifdef IFM_10_FL + case IFM_10_FL: + #endif + #ifdef IFM_10_STP + case IFM_10_STP: + #endif + #ifdef IFM_10_T + case IFM_10_T: + #endif + iface->speed = 10; break; + #ifdef IFM_200G_AUI4 + case IFM_200G_AUI4: + #endif + #ifdef IFM_200G_AUI4_AC + case IFM_200G_AUI4_AC: + #endif + #ifdef IFM_200G_AUI8 + case IFM_200G_AUI8: + #endif + #ifdef IFM_200G_AUI8_AC + case IFM_200G_AUI8_AC: + #endif + #ifdef IFM_200G_CR4_PAM4 + case IFM_200G_CR4_PAM4: + #endif + #ifdef IFM_200G_DR4 + case IFM_200G_DR4: + #endif + #ifdef IFM_200G_FR4 + case IFM_200G_FR4: + #endif + #ifdef IFM_200G_KR4_PAM4 + case IFM_200G_KR4_PAM4: + #endif + #ifdef IFM_200G_LR4 + case IFM_200G_LR4: + #endif + #ifdef IFM_200G_SR4 + case IFM_200G_SR4: + #endif + iface->speed = 200000; break; + #ifdef IFM_20G_KR2 + case IFM_20G_KR2: + #endif + iface->speed = 20000; break; + #ifdef IFM_2500_KX + case IFM_2500_KX: + #endif + #ifdef IFM_2500_SX + case IFM_2500_SX: + #endif + #ifdef IFM_2500_T + case IFM_2500_T: + #endif + #ifdef IFM_2500_X + case IFM_2500_X: + #endif + iface->speed = 2500; break; + #ifdef IFM_25G_ACC + case IFM_25G_ACC: + #endif + #ifdef IFM_25G_AOC + case IFM_25G_AOC: + #endif + #ifdef IFM_25G_AUI + case IFM_25G_AUI: + #endif + #ifdef IFM_25G_CR + case IFM_25G_CR: + #endif + #ifdef IFM_25G_CR1 + case IFM_25G_CR1: + #endif + #ifdef IFM_25G_CR_S + case IFM_25G_CR_S: + #endif + #ifdef IFM_25G_KR + case IFM_25G_KR: + #endif + #ifdef IFM_25G_KR1 + case IFM_25G_KR1: + #endif + #ifdef IFM_25G_KR_S + case IFM_25G_KR_S: + #endif + #ifdef IFM_25G_LR + case IFM_25G_LR: + #endif + #ifdef IFM_25G_PCIE + case IFM_25G_PCIE: + #endif + #ifdef IFM_25G_SR + case IFM_25G_SR: + #endif + #ifdef IFM_25G_T + case IFM_25G_T: + #endif + iface->speed = 25000; break; + #ifdef IFM_400G_AUI8 + case IFM_400G_AUI8: + #endif + #ifdef IFM_400G_AUI8_AC + case IFM_400G_AUI8_AC: + #endif + #ifdef IFM_400G_DR4 + case IFM_400G_DR4: + #endif + #ifdef IFM_400G_FR8 + case IFM_400G_FR8: + #endif + #ifdef IFM_400G_LR8 + case IFM_400G_LR8: + #endif + iface->speed = 400000; break; + #ifdef IFM_40G_CR4 + case IFM_40G_CR4: + #endif + #ifdef IFM_40G_ER4 + case IFM_40G_ER4: + #endif + #ifdef IFM_40G_KR4 + case IFM_40G_KR4: + #endif + #ifdef IFM_40G_LR4 + case IFM_40G_LR4: + #endif + #ifdef IFM_40G_SR4 + case IFM_40G_SR4: + #endif + #ifdef IFM_40G_XLAUI + case IFM_40G_XLAUI: + #endif + #ifdef IFM_40G_XLAUI_AC + case IFM_40G_XLAUI_AC: + #endif + #ifdef IFM_40G_XLPPI + case IFM_40G_XLPPI: + #endif + #ifdef IFM_40G_LM4 + case IFM_40G_LM4: + #endif + iface->speed = 40000; break; + #ifdef IFM_5000_KR + case IFM_5000_KR: + #endif + #ifdef IFM_5000_KR1 + case IFM_5000_KR1: + #endif + #ifdef IFM_5000_KR_S + case IFM_5000_KR_S: + #endif + #ifdef IFM_5000_T + case IFM_5000_T: + #endif + iface->speed = 5000; break; + #ifdef IFM_50G_AUI1 + case IFM_50G_AUI1: + #endif + #ifdef IFM_50G_AUI1_AC + case IFM_50G_AUI1_AC: + #endif + #ifdef IFM_50G_AUI2 + case IFM_50G_AUI2: + #endif + #ifdef IFM_50G_AUI2_AC + case IFM_50G_AUI2_AC: + #endif + #ifdef IFM_50G_CP + case IFM_50G_CP: + #endif + #ifdef IFM_50G_CR2 + case IFM_50G_CR2: + #endif + #ifdef IFM_50G_FR + case IFM_50G_FR: + #endif + #ifdef IFM_50G_KR2 + case IFM_50G_KR2: + #endif + #ifdef IFM_50G_KR_PAM4 + case IFM_50G_KR_PAM4: + #endif + #ifdef IFM_50G_LAUI2 + case IFM_50G_LAUI2: + #endif + #ifdef IFM_50G_LAUI2_AC + case IFM_50G_LAUI2_AC: + #endif + #ifdef IFM_50G_LR + case IFM_50G_LR: + #endif + #ifdef IFM_50G_LR2 + case IFM_50G_LR2: + #endif + #ifdef IFM_50G_PCIE + case IFM_50G_PCIE: + #endif + #ifdef IFM_50G_SR + case IFM_50G_SR: + #endif + #ifdef IFM_50G_SR2 + case IFM_50G_SR2: + #endif + #ifdef IFM_50G_KR4 + case IFM_50G_KR4: + #endif + iface->speed = 50000; break; + #ifdef IFM_56G_R4 + case IFM_56G_R4: + #endif + iface->speed = 56000; break; + default: + iface->speed = -1; + } + } + #endif + } + + #ifdef __sun + if ((options->showType & FF_LOCALIP_TYPE_MAC_BIT) && ioctl(sockfd, SIOCGIFHWADDR, &ifr) == 0) + { + const uint8_t* ptr = (uint8_t*) ifr.ifr_addr.sa_data; // NOT ifr_enaddr + ffStrbufSetF(&iface->mac, "%02x:%02x:%02x:%02x:%02x:%02x", + ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); + } + #endif } - #endif } } diff --git a/src/detection/localip/localip_windows.c b/src/detection/localip/localip_windows.c index c378100f9..a24d38591 100644 --- a/src/detection/localip/localip_windows.c +++ b/src/detection/localip/localip_windows.c @@ -153,8 +153,10 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) if (!newIp) { FFLocalIpResult* result = FF_LIST_GET(FFLocalIpResult, *results, results->length - 1); - result->speed = (int32_t) (adapter->ReceiveLinkSpeed / 1000); - result->mtu = (int32_t) adapter->Mtu; + if (options->showType & FF_LOCALIP_TYPE_SPEED_BIT) + result->speed = (int32_t) (adapter->ReceiveLinkSpeed / 1000); + if (options->showType & FF_LOCALIP_TYPE_MTU_BIT) + result->mtu = (int32_t) adapter->Mtu; } } diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index da9440610..0ca38374f 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -54,6 +54,28 @@ static void printIp(FFLocalIpResult* ip, bool markDefaultRoute) printf(" (%s)", ip->mac.chars); else ffStrbufWriteTo(&ip->mac, stdout); + flag = true; + } + if (ip->mtu > 0 || ip->speed > 0) + { + if (flag) + fputs(" [", stdout); + if (ip->speed > 0) + { + if (ip->speed >= 1000000) + printf("%g Tbps", ip->speed / 1000000.0); + else if (ip->speed >= 1000) + printf("Speed %g Gbps", ip->speed / 1000.0); + else + printf("Speed %u Mbps", (unsigned) ip->speed); + + if (ip->mtu > 0) + fputs(" / ", stdout); + } + if (ip->mtu > 0) + printf("MTU %u", (unsigned) ip->mtu); + putchar(']'); + flag = true; } if (markDefaultRoute && flag && ip->defaultRoute) fputs(" *", stdout); @@ -114,7 +136,9 @@ void ffPrintLocalIp(FFLocalIpOptions* options) FF_STRBUF_AUTO_DESTROY speedStr = ffStrbufCreate(); if (ip->speed > 0) { - if (ip->speed >= 1000) + if (ip->speed >= 1000000) + ffStrbufSetF(&speedStr, "%g Tbps", ip->speed / 1000000.0); + else if (ip->speed >= 1000) ffStrbufSetF(&speedStr, "%g Gbps", ip->speed / 1000.0); else ffStrbufSetF(&speedStr, "%u Mbps", (unsigned) ip->speed); @@ -194,6 +218,24 @@ bool ffParseLocalIpCommandOptions(FFLocalIpOptions* options, const char* key, co return true; } + if (ffStrEqualsIgnCase(subKey, "show-mtu")) + { + if (ffOptionParseBoolean(value)) + options->showType |= FF_LOCALIP_TYPE_MTU_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_MTU_BIT; + return true; + } + + if (ffStrEqualsIgnCase(subKey, "show-speed")) + { + if (ffOptionParseBoolean(value)) + options->showType |= FF_LOCALIP_TYPE_SPEED_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_SPEED_BIT; + return true; + } + if(ffStrEqualsIgnCase(subKey, "compact")) { if (ffOptionParseBoolean(value)) @@ -288,6 +330,24 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } + if (ffStrEqualsIgnCase(key, "showMtu")) + { + if (yyjson_get_bool(val)) + options->showType |= FF_LOCALIP_TYPE_MTU_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_MTU_BIT; + continue; + } + + if (ffStrEqualsIgnCase(key, "showSpeed")) + { + if (yyjson_get_bool(val)) + options->showType |= FF_LOCALIP_TYPE_SPEED_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_SPEED_BIT; + continue; + } + if (ffStrEqualsIgnCase(key, "compact")) { if (yyjson_get_bool(val)) @@ -349,6 +409,12 @@ void ffGenerateLocalIpJsonConfig(FFLocalIpOptions* options, yyjson_mut_doc* doc, if (options->showType & FF_LOCALIP_TYPE_PREFIX_LEN_BIT) yyjson_mut_obj_add_bool(doc, module, "showPrefixLen", true); + if (options->showType & FF_LOCALIP_TYPE_MTU_BIT) + yyjson_mut_obj_add_bool(doc, module, "showMtu", true); + + if (options->showType & FF_LOCALIP_TYPE_SPEED_BIT) + yyjson_mut_obj_add_bool(doc, module, "showSpeed", true); + if (options->showType & FF_LOCALIP_TYPE_COMPACT_BIT) yyjson_mut_obj_add_bool(doc, module, "compact", true); diff --git a/src/modules/localip/option.h b/src/modules/localip/option.h index 55b9192cd..1a0161152 100644 --- a/src/modules/localip/option.h +++ b/src/modules/localip/option.h @@ -12,6 +12,8 @@ typedef enum FFLocalIpType FF_LOCALIP_TYPE_IPV6_BIT = 1 << 2, FF_LOCALIP_TYPE_MAC_BIT = 1 << 3, FF_LOCALIP_TYPE_PREFIX_LEN_BIT = 1 << 4, + FF_LOCALIP_TYPE_MTU_BIT = 1 << 5, + FF_LOCALIP_TYPE_SPEED_BIT = 1 << 6, FF_LOCALIP_TYPE_COMPACT_BIT = 1 << 10, FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT = 1 << 11,