diff options
author | Christian Göttsche <cgzones@googlemail.com> | 2020-10-08 16:34:54 +0200 |
---|---|---|
committer | cgzones <cgzones@googlemail.com> | 2020-10-16 20:00:14 +0200 |
commit | 7cd093ce95c1f59cfc1ee2786578457ea6fa1559 (patch) | |
tree | 6f86c845bed7b5ce58e222e8000e53d80756578c /freebsd | |
parent | a8029612862e6ef6ab55b2f7adc2c8b4ac554cee (diff) |
Add NetworkIOMeter
Diffstat (limited to 'freebsd')
-rw-r--r-- | freebsd/Platform.c | 51 | ||||
-rw-r--r-- | freebsd/Platform.h | 5 |
2 files changed, 56 insertions, 0 deletions
diff --git a/freebsd/Platform.c b/freebsd/Platform.c index 2288d2f2..7827d521 100644 --- a/freebsd/Platform.c +++ b/freebsd/Platform.c @@ -18,11 +18,14 @@ in the source distribution for its full text. #include "DateMeter.h" #include "DateTimeMeter.h" #include "HostnameMeter.h" +#include "NetworkIOMeter.h" #include "zfs/ZfsArcMeter.h" #include "zfs/ZfsCompressedArcMeter.h" #include "FreeBSDProcess.h" #include "FreeBSDProcessList.h" +#include <net/if.h> +#include <net/if_mib.h> #include <sys/types.h> #include <sys/sysctl.h> #include <sys/time.h> @@ -107,6 +110,7 @@ const MeterClass* const Platform_meterTypes[] = { &BlankMeter_class, &ZfsArcMeter_class, &ZfsCompressedArcMeter_class, + &NetworkIOMeter_class, NULL }; @@ -230,3 +234,50 @@ void Platform_getDiskIO(unsigned long int *bytesRead, unsigned long int *bytesWr // TODO *bytesRead = *bytesWrite = *msTimeSpend = 0; } + +void Platform_getNetworkIO(unsigned long int *bytesReceived, + unsigned long int *packetsReceived, + unsigned long int *bytesTransmitted, + unsigned long int *packetsTransmitted) { + int r; + + // get number of interfaces + int count; + size_t countLen = sizeof(count); + const int countMib[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_SYSTEM, IFMIB_IFCOUNT }; + + r = sysctl(countMib, ARRAYSIZE(countMib), &count, &countLen, NULL, 0); + if (r < 0) { + *bytesReceived = 0; + *packetsReceived = 0; + *bytesTransmitted = 0; + *packetsTransmitted = 0; + return; + } + + unsigned long int bytesReceivedSum = 0, packetsReceivedSum = 0, bytesTransmittedSum = 0, packetsTransmittedSum = 0; + + for (int i = 1; i <= count; i++) { + struct ifmibdata ifmd; + size_t ifmdLen = sizeof(ifmd); + + const int dataMib[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, i, IFDATA_GENERAL }; + + r = sysctl(dataMib, ARRAYSIZE(dataMib), &ifmd, &ifmdLen, NULL, 0); + if (r < 0) + continue; + + if (ifmd.ifmd_flags & IFF_LOOPBACK) + continue; + + bytesReceivedSum += ifmd.ifmd_data.ifi_ibytes; + packetsReceivedSum += ifmd.ifmd_data.ifi_ipackets; + bytesTransmittedSum += ifmd.ifmd_data.ifi_obytes; + packetsTransmittedSum += ifmd.ifmd_data.ifi_opackets; + } + + *bytesReceived = bytesReceivedSum; + *packetsReceived = packetsReceivedSum; + *bytesTransmitted = bytesTransmittedSum; + *packetsTransmitted = packetsTransmittedSum; +} diff --git a/freebsd/Platform.h b/freebsd/Platform.h index feda7416..bd1a38ef 100644 --- a/freebsd/Platform.h +++ b/freebsd/Platform.h @@ -47,4 +47,9 @@ char* Platform_getProcessEnv(pid_t pid); void Platform_getDiskIO(unsigned long int *bytesRead, unsigned long int *bytesWrite, unsigned long int *msTimeSpend); +void Platform_getNetworkIO(unsigned long int *bytesReceived, + unsigned long int *packetsReceived, + unsigned long int *bytesTransmitted, + unsigned long int *packetsTransmitted); + #endif |