summaryrefslogtreecommitdiffstats
path: root/freebsd
diff options
context:
space:
mode:
authorChristian Göttsche <cgzones@googlemail.com>2020-10-08 16:34:54 +0200
committercgzones <cgzones@googlemail.com>2020-10-16 20:00:14 +0200
commit7cd093ce95c1f59cfc1ee2786578457ea6fa1559 (patch)
tree6f86c845bed7b5ce58e222e8000e53d80756578c /freebsd
parenta8029612862e6ef6ab55b2f7adc2c8b4ac554cee (diff)
Add NetworkIOMeter
Diffstat (limited to 'freebsd')
-rw-r--r--freebsd/Platform.c51
-rw-r--r--freebsd/Platform.h5
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

© 2014-2024 Faster IT GmbH | imprint | privacy policy