2024-11-15 14:35:25 +08:00
|
|
|
#include "netio.h"
|
|
|
|
|
|
2026-01-06 09:48:38 +08:00
|
|
|
#include "common/netif.h"
|
|
|
|
|
#include "common/mallocHelper.h"
|
2024-11-15 14:35:25 +08:00
|
|
|
|
|
|
|
|
#include <net/if.h>
|
|
|
|
|
#include <net/if_mib.h>
|
|
|
|
|
#include <sys/sysctl.h>
|
|
|
|
|
|
2026-03-29 09:28:49 +08:00
|
|
|
const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options) {
|
2026-03-30 10:27:23 +08:00
|
|
|
int mib[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, options->defaultRouteOnly ? IFMIB_IFDATA : IFMIB_IFALLDATA, options->defaultRouteOnly ? (int) ffNetifGetDefaultRouteV4()->ifIndex : 0, IFDATA_GENERAL };
|
2024-11-15 14:35:25 +08:00
|
|
|
|
|
|
|
|
size_t bufSize = 0;
|
2026-07-10 18:08:04 +08:00
|
|
|
if (sysctl(mib, ARRAY_SIZE(mib), nullptr, &bufSize, 0, 0) < 0) {
|
|
|
|
|
return "sysctl(mib, ARRAY_SIZE(mib), nullptr, &bufSize, 0, 0) failed";
|
2026-03-29 09:28:49 +08:00
|
|
|
}
|
2024-11-15 14:35:25 +08:00
|
|
|
|
|
|
|
|
assert(bufSize % sizeof(struct ifmibdata) == 0);
|
|
|
|
|
|
|
|
|
|
FF_AUTO_FREE struct ifmibdata* buf = (struct ifmibdata*) malloc(bufSize);
|
2026-03-29 09:28:49 +08:00
|
|
|
if (sysctl(mib, ARRAY_SIZE(mib), buf, &bufSize, 0, 0) < 0) {
|
2024-11-15 14:35:25 +08:00
|
|
|
return "sysctl(mib, ARRAY_SIZE(mib), buf, &bufSize, 0, 0) failed";
|
2026-03-29 09:28:49 +08:00
|
|
|
}
|
2024-11-15 14:35:25 +08:00
|
|
|
|
|
|
|
|
size_t ifCount = bufSize / sizeof(struct ifmibdata);
|
|
|
|
|
|
2025-08-07 16:35:42 +08:00
|
|
|
const char* defaultRouteIfName = ffNetifGetDefaultRouteV4()->ifName;
|
2024-11-15 14:35:25 +08:00
|
|
|
|
2026-03-29 09:28:49 +08:00
|
|
|
for (size_t i = 0; i < ifCount; i++) {
|
2024-11-15 14:35:25 +08:00
|
|
|
struct ifmibdata* mibdata = &buf[i];
|
2026-03-29 09:28:49 +08:00
|
|
|
if (!(mibdata->ifmd_flags & IFF_RUNNING) || (mibdata->ifmd_flags & IFF_NOARP)) {
|
2024-11-15 14:35:25 +08:00
|
|
|
continue;
|
2026-03-29 09:28:49 +08:00
|
|
|
}
|
2024-11-15 14:35:25 +08:00
|
|
|
|
2026-03-29 09:28:49 +08:00
|
|
|
if (options->namePrefix.length && strncmp(mibdata->ifmd_name, options->namePrefix.chars, options->namePrefix.length) != 0) {
|
2024-11-15 14:35:25 +08:00
|
|
|
continue;
|
2026-03-29 09:28:49 +08:00
|
|
|
}
|
2024-11-15 14:35:25 +08:00
|
|
|
|
2026-04-14 10:41:18 +08:00
|
|
|
FFNetIOResult* counters = FF_LIST_ADD(FFNetIOResult, *result);
|
2024-11-15 14:35:25 +08:00
|
|
|
*counters = (FFNetIOResult) {
|
|
|
|
|
.name = ffStrbufCreateS(mibdata->ifmd_name),
|
|
|
|
|
.txBytes = mibdata->ifmd_data.ifi_obytes,
|
|
|
|
|
.rxBytes = mibdata->ifmd_data.ifi_ibytes,
|
|
|
|
|
.txPackets = mibdata->ifmd_data.ifi_opackets,
|
|
|
|
|
.rxPackets = mibdata->ifmd_data.ifi_ipackets,
|
|
|
|
|
.txErrors = mibdata->ifmd_data.ifi_oerrors,
|
|
|
|
|
.rxErrors = mibdata->ifmd_data.ifi_ierrors,
|
|
|
|
|
.txDrops = mibdata->ifmd_snd_drops,
|
|
|
|
|
.rxDrops = mibdata->ifmd_data.ifi_iqdrops,
|
|
|
|
|
.defaultRoute = strncmp(mibdata->ifmd_name, defaultRouteIfName, IFNAMSIZ) == 0,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-10 18:08:04 +08:00
|
|
|
return nullptr;
|
2024-11-15 14:35:25 +08:00
|
|
|
}
|