netstar pushed a commit to branch master. http://git.enlightenment.org/apps/evisum.git/commit/?id=ff4a80bd8713347d26fb75741dae30d156e0da4e
commit ff4a80bd8713347d26fb75741dae30d156e0da4e Author: Alastair Poole <nets...@gmail.com> Date: Fri Jul 10 15:04:06 2020 +0100 network: handle multiple addresses on same interface. --- src/bin/system/machine.h | 4 ++-- src/bin/system/machine/network.bogox | 27 ++++++++++++++++++--------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/bin/system/machine.h b/src/bin/system/machine.h index 862e8d4..96728df 100644 --- a/src/bin/system/machine.h +++ b/src/bin/system/machine.h @@ -54,8 +54,8 @@ typedef struct typedef struct { - unsigned long incoming; - unsigned long outgoing; + uint64_t incoming; + uint64_t outgoing; } network_t; typedef struct Sys_Info Sys_Info; diff --git a/src/bin/system/machine/network.bogox b/src/bin/system/machine/network.bogox index 688547e..c81d844 100644 --- a/src/bin/system/machine/network.bogox +++ b/src/bin/system/machine/network.bogox @@ -16,8 +16,8 @@ #if defined(__MacOS__) || defined(__FreeBSD__) || defined(__DragonFly__) static void -_freebsd_generic_network_status(unsigned long int *in, - unsigned long int *out) +_freebsd_generic_network_status(uint64_t *in, + uint64_t *out) { struct ifmibdata *ifmd; size_t len; @@ -50,8 +50,8 @@ _freebsd_generic_network_status(unsigned long int *in, #if defined(__OpenBSD__) static void -_openbsd_generic_network_status(unsigned long int *in, - unsigned long int *out) +_openbsd_generic_network_status(uint64_t *in, + uint64_t *out) { struct ifaddrs *interfaces, *ifa; @@ -66,12 +66,21 @@ _openbsd_generic_network_status(unsigned long int *in, struct ifreq ifreq; struct if_data if_data; + // TBC: Interfaces can have multiple addresses. + // Using this netmask check we should be obtaining + // the overall interface data across addresses. + + if (ifa->ifa_netmask != 0) continue; + ifreq.ifr_data = (void *)&if_data; strncpy(ifreq.ifr_name, ifa->ifa_name, IFNAMSIZ - 1); if (ioctl(sock, SIOCGIFDATA, &ifreq) < 0) return; - struct if_data *const ifi = &if_data; + const struct if_data *ifi = &if_data; + if (!LINK_STATE_IS_UP(ifi->ifi_link_state)) + continue; + if (ifi->ifi_type == IFT_ETHER || ifi->ifi_type == IFT_FASTETHER || ifi->ifi_type == IFT_GIGABITETHERNET || @@ -92,8 +101,8 @@ _openbsd_generic_network_status(unsigned long int *in, #if defined(__linux__) static void -_linux_generic_network_status(unsigned long int *in, - unsigned long int *out) +_linux_generic_network_status(uint64_t *in, + uint64_t *out) { FILE *f; char buf[4096], dummy_s[256]; @@ -123,8 +132,8 @@ _linux_generic_network_status(unsigned long int *in, void system_network_transfer_get(network_t *usage) { - unsigned long first_in = 0, first_out = 0; - unsigned long last_in = 0, last_out = 0; + uint64_t first_in = 0, first_out = 0; + uint64_t last_in = 0, last_out = 0; #if defined(__linux__) _linux_generic_network_status(&first_in, &first_out); usleep(1000000); --