diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index ebaa10b97..a36e27c42 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -34,6 +34,16 @@ #if defined(__sun) || defined(__HAIKU__) #include #endif +#if defined(__sun) +#include + +static inline void kstatFreeWrap(kstat_ctl_t** pkc) +{ + assert(pkc); + if (*pkc) + kstat_close(*pkc); +} +#endif #define FF_LOCALIP_NIFLAG(name) { IFF_##name, #name } @@ -769,6 +779,24 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) 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) + { + __attribute__((__cleanup__(kstatFreeWrap))) kstat_ctl_t* kc = kstat_open(); + for (kstat_t* ks = kc->kc_chain; ks; ks = ks->ks_next) + { + if (!ffStrEquals(ks->ks_class, "net") || !ffStrEquals(ks->ks_module, "link")) continue; + if (ffStrbufEqualS(&iface->name, ks->ks_name)) + { + if (kstat_read(kc, ks, NULL) >= 0) + { + kstat_named_t* ifspeed = (kstat_named_t*) kstat_data_lookup(ks, "ifspeed"); + if (ifspeed) + iface->speed = (int32_t) (ifspeed->value.ui64 / 1000 / 1000); + } + break; + } + } + } #endif } }