From ac459fb34f5549f236d2c06f65ffa4b56a57736d Mon Sep 17 00:00:00 2001 From: Jesper Schmitz Mouridsen Date: Sat, 10 Sep 2022 19:57:36 +0200 Subject: [PATCH 1/4] Network info on FreeBSD --- plugins/network/CMakeLists.txt | 4 +- plugins/network/NetworkPlugin.cpp | 7 +- plugins/network/SysctlBackend.cpp | 188 ++++++++++++++++++++++++++++++ plugins/network/SysctlBackend.h | 58 +++++++++ 4 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 plugins/network/SysctlBackend.cpp create mode 100644 plugins/network/SysctlBackend.h diff --git a/plugins/network/CMakeLists.txt b/plugins/network/CMakeLists.txt index 625d5db..259699d 100644 --- a/plugins/network/CMakeLists.txt +++ b/plugins/network/CMakeLists.txt @@ -26,5 +26,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") target_link_libraries(ksystemstats_plugin_network PRIVATE ${NL_LIBRARIES} Qt::Network) target_include_directories(ksystemstats_plugin_network PRIVATE ${NL_INCLUDE_DIRS}) endif() - +if (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_sources(ksystemstats_plugin_network PRIVATE SysctlBackend.cpp) +endif() install(TARGETS ksystemstats_plugin_network DESTINATION ${KSYSTEMSTATS_PLUGIN_INSTALL_DIR}) diff --git a/plugins/network/NetworkPlugin.cpp b/plugins/network/NetworkPlugin.cpp index 6919d93..7907673 100644 --- a/plugins/network/NetworkPlugin.cpp +++ b/plugins/network/NetworkPlugin.cpp @@ -23,7 +23,9 @@ #ifdef Q_OS_LINUX #include "RtNetlinkBackend.h" #endif - +#ifdef Q_OS_FREEBSD +#include "SysctlBackend.h" +#endif class NetworkPrivate { public: @@ -51,6 +53,9 @@ NetworkPlugin::NetworkPlugin(QObject *parent, const QVariantList &args) #endif #ifdef Q_OS_LINUX backendFunctions.emplace_back([](NetworkPlugin *parent) -> NetworkBackend* {return new RtNetlinkBackend(parent);}); +#endif +#ifdef Q_OS_FREEBSD + backendFunctions.emplace_back([](NetworkPlugin *parent) -> NetworkBackend* {return new SysctlBackend(parent);}); #endif for (auto func : backendFunctions) { auto backend = func(this); diff --git a/plugins/network/SysctlBackend.cpp b/plugins/network/SysctlBackend.cpp new file mode 100644 index 0000000..ddf7b03 --- /dev/null +++ b/plugins/network/SysctlBackend.cpp @@ -0,0 +1,188 @@ +/* + * SPDX-FileCopyrightText: 2020 Arjen Hiemstra + * SPDX-FileCopyrightText: 2020 David Redondo + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +#include "SysctlBackend.h" + +#include +#include +#include +#include +#include + + + + +SysctlNetDevice::SysctlNetDevice(const QString &id,const QString &name) + : NetworkDevice(id, name) +{ + // Even though we have no sensor, we need to have a name for the grouped text on the front page + // of plasma-systemmonitor + m_networkSensor->setValue(id); + std::vector statisticSensors{m_downloadSensor, m_downloadBitsSensor, m_totalDownloadSensor, m_uploadSensor, m_uploadBitsSensor, m_totalUploadSensor}; + auto resetStatistics = [this, statisticSensors]() { + if (std::none_of(statisticSensors.begin(), statisticSensors.end(), [](auto property) {return property->isSubscribed();})) { + m_totalDownloadSensor->setValue(0); + m_totalUploadSensor->setValue(0); + } + }; + for (auto property : statisticSensors) { + connect(property, &KSysGuard::SensorProperty::subscribedChanged, this, resetStatistics); + } + m_statisticsTimer = std::make_unique(); + m_statisticsTimer->setInterval(UpdateRate); + connect(m_statisticsTimer.get(), &QTimer::timeout, this, [this]() { + struct ifmibdata ifmd; + bzero(&ifmd,sizeof(ifmd)); + size_t len = sizeof(ifmd); + if (sysctl(m_sysctl_name, 6, &ifmd, &len, NULL, 0) == 0) { + const qulonglong newDownload = ifmd.ifmd_data.ifi_ibytes; + const qulonglong previousDownload = m_totalDownloadSensor->value().toULongLong(); + if (previousDownload > 0) { + m_downloadSensor->setValue((newDownload - previousDownload) * 1000 / UpdateRate); + m_downloadBitsSensor->setValue(((newDownload - previousDownload) * 1000 / UpdateRate)*8); + } + m_totalDownloadSensor->setValue(newDownload); + + const qulonglong newUpload = ifmd.ifmd_data.ifi_obytes; + const qulonglong previousUpload = m_totalUploadSensor->value().toULongLong(); + if (previousUpload > 0) { + m_uploadSensor->setValue((newUpload - previousUpload) * 1000 / UpdateRate); + m_uploadBitsSensor->setValue(((newUpload - previousUpload) * 1000 / UpdateRate)* 8); + } + m_totalUploadSensor->setValue(newUpload); + } + }); + + for (auto property : statisticSensors) { + connect(property, &KSysGuard::SensorProperty::subscribedChanged, this, [this, statisticSensors](bool subscribed) { + if (subscribed && !m_statisticsTimer->isActive()) { + m_statisticsTimer->start(); + } else if (std::none_of(statisticSensors.begin(), statisticSensors.end(), [](auto property) { return property->isSubscribed(); })) { + m_statisticsTimer->stop(); + m_totalDownloadSensor->setValue(0); + m_totalUploadSensor->setValue(0); + } + }); + } + m_statisticsTimer->start(); + +} +void SysctlNetDevice::update() { + char addr_buf[NI_MAXHOST]; + QStringList ipv4_addrs; + QStringList ipv6_addrs; + struct sockaddr_in *sin; + + + ipv4_addrs.clear(); + ipv6_addrs.clear(); + for(struct sockaddr* ifaddr : m_ifaddrs) { + sin=reinterpret_cast(ifaddr); + if (sin == NULL) + return; + + + + + getnameinfo((struct sockaddr *)sin, sin->sin_len, addr_buf,sizeof(addr_buf), NULL, 0, NI_NUMERICHOST); + + + if(sin->sin_family == AF_INET) { + ipv4_addrs << QString::fromStdString(addr_buf); + } + if(sin->sin_family == AF_INET6) { + ipv6_addrs << QString::fromStdString(addr_buf); + } + } + m_ipv4Sensor->setValue(ipv4_addrs.join("\n")); + m_ipv6Sensor->setValue(ipv6_addrs.join("\n")); + + +} + +SysctlNetDevice::~SysctlNetDevice() +{ + + +} +SysctlBackend::SysctlBackend(QObject *parent) + : NetworkBackend(parent) +{ + + +} + +SysctlBackend::~SysctlBackend() +{ + qDeleteAll(m_devices); +} + +bool SysctlBackend::isSupported() +{ + return true; +} + +void SysctlBackend::start() +{ + int count,i; + size_t len; + int ifcnt_name[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_SYSTEM, IFMIB_IFCOUNT }; + len = sizeof(int); + if (sysctl(ifcnt_name, 5, &count, &len, NULL, 0) < 0) { + return; + } + + for(i=1;im_sysctl_name[4]=i; // finish the sysctl name + m_devices.insert(QByteArray(ifmd.ifmd_name),device); + emit deviceAdded(device); + } + } +} + +void SysctlBackend::stop() +{ +} + +void SysctlBackend::update() +{ + struct ifaddrs *ifap; + bzero(&ifap,sizeof(ifap)); + getifaddrs(&ifap); + struct ifaddrs *tmp = ifap; + while(tmp!=NULL) { + QHashIterator iter(m_devices); + while(iter.hasNext()) { + iter.next(); + if(iter.key() == QByteArray(tmp->ifa_name)) { + iter.value()->m_ifaddrs.append(tmp->ifa_addr); + } + + } + + tmp = tmp->ifa_next; + } + + QHashIterator iter(m_devices); + while(iter.hasNext()) { + iter.next(); + iter.value()->update(); + iter.value()->m_ifaddrs.clear(); + } + +} diff --git a/plugins/network/SysctlBackend.h b/plugins/network/SysctlBackend.h new file mode 100644 index 0000000..8583e07 --- /dev/null +++ b/plugins/network/SysctlBackend.h @@ -0,0 +1,58 @@ +/* + * SPDX-FileCopyrightText: 2020 David Redondo + * + * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + */ + +#pragma once + +#include "NetworkBackend.h" +#include "NetworkDevice.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +static const int UpdateRate = 500; +class SysctlNetDevice : public NetworkDevice +{ + Q_OBJECT + +public: + SysctlNetDevice(const QString &id, const QString &name); + ~SysctlNetDevice() override; + int m_sysctl_name[6] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, 0, IFDATA_GENERAL }; + void update(); + bool isConnected() const; + std::unique_ptr m_statisticsTimer; + QList m_ifaddrs; +}; + + +class SysctlBackend : public NetworkBackend +{ +public: + SysctlBackend(QObject *parent); + ~SysctlBackend() override; + bool isSupported() override; + void start() override; + void stop() override; + void update() override; + +private: + QHash m_devices; + QElapsedTimer m_updateTimer; + +}; -- GitLab From 1290fd1f3e3ca07d7e6a280066cc1862c09e55af Mon Sep 17 00:00:00 2001 From: Jesper Schmitz Mouridsen Date: Fri, 16 Sep 2022 17:18:27 +0200 Subject: [PATCH 2/4] fix format includes and copyright --- plugins/network/SysctlBackend.cpp | 165 +++++++++++++++--------------- plugins/network/SysctlBackend.h | 24 +---- 2 files changed, 86 insertions(+), 103 deletions(-) diff --git a/plugins/network/SysctlBackend.cpp b/plugins/network/SysctlBackend.cpp index ddf7b03..2f88561 100644 --- a/plugins/network/SysctlBackend.cpp +++ b/plugins/network/SysctlBackend.cpp @@ -1,30 +1,37 @@ /* - * SPDX-FileCopyrightText: 2020 Arjen Hiemstra - * SPDX-FileCopyrightText: 2020 David Redondo + * SPDX-FileCopyrightText: 2022 Jesper Schmitz Mouridsen * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ #include "SysctlBackend.h" - -#include -#include -#include -#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include - - - -SysctlNetDevice::SysctlNetDevice(const QString &id,const QString &name) +SysctlNetDevice::SysctlNetDevice(const QString &id, const QString &name) : NetworkDevice(id, name) { // Even though we have no sensor, we need to have a name for the grouped text on the front page // of plasma-systemmonitor m_networkSensor->setValue(id); - std::vector statisticSensors{m_downloadSensor, m_downloadBitsSensor, m_totalDownloadSensor, m_uploadSensor, m_uploadBitsSensor, m_totalUploadSensor}; + std::vector statisticSensors{m_downloadSensor, + m_downloadBitsSensor, + m_totalDownloadSensor, + m_uploadSensor, + m_uploadBitsSensor, + m_totalUploadSensor}; auto resetStatistics = [this, statisticSensors]() { - if (std::none_of(statisticSensors.begin(), statisticSensors.end(), [](auto property) {return property->isSubscribed();})) { + if (std::none_of(statisticSensors.begin(), statisticSensors.end(), [](auto property) { + return property->isSubscribed(); + })) { m_totalDownloadSensor->setValue(0); m_totalUploadSensor->setValue(0); } @@ -35,85 +42,76 @@ SysctlNetDevice::SysctlNetDevice(const QString &id,const QString &name) m_statisticsTimer = std::make_unique(); m_statisticsTimer->setInterval(UpdateRate); connect(m_statisticsTimer.get(), &QTimer::timeout, this, [this]() { - struct ifmibdata ifmd; - bzero(&ifmd,sizeof(ifmd)); - size_t len = sizeof(ifmd); - if (sysctl(m_sysctl_name, 6, &ifmd, &len, NULL, 0) == 0) { - const qulonglong newDownload = ifmd.ifmd_data.ifi_ibytes; - const qulonglong previousDownload = m_totalDownloadSensor->value().toULongLong(); - if (previousDownload > 0) { - m_downloadSensor->setValue((newDownload - previousDownload) * 1000 / UpdateRate); - m_downloadBitsSensor->setValue(((newDownload - previousDownload) * 1000 / UpdateRate)*8); - } - m_totalDownloadSensor->setValue(newDownload); + struct ifmibdata ifmd; + bzero(&ifmd, sizeof(ifmd)); + size_t len = sizeof(ifmd); + if (sysctl(m_sysctl_name, 6, &ifmd, &len, NULL, 0) == 0) { + const qulonglong newDownload = ifmd.ifmd_data.ifi_ibytes; + const qulonglong previousDownload = m_totalDownloadSensor->value().toULongLong(); + if (previousDownload > 0) { + m_downloadSensor->setValue((newDownload - previousDownload) * 1000 / UpdateRate); + m_downloadBitsSensor->setValue(((newDownload - previousDownload) * 1000 / UpdateRate) * 8); + } + m_totalDownloadSensor->setValue(newDownload); - const qulonglong newUpload = ifmd.ifmd_data.ifi_obytes; - const qulonglong previousUpload = m_totalUploadSensor->value().toULongLong(); - if (previousUpload > 0) { - m_uploadSensor->setValue((newUpload - previousUpload) * 1000 / UpdateRate); - m_uploadBitsSensor->setValue(((newUpload - previousUpload) * 1000 / UpdateRate)* 8); + const qulonglong newUpload = ifmd.ifmd_data.ifi_obytes; + const qulonglong previousUpload = m_totalUploadSensor->value().toULongLong(); + if (previousUpload > 0) { + m_uploadSensor->setValue((newUpload - previousUpload) * 1000 / UpdateRate); + m_uploadBitsSensor->setValue(((newUpload - previousUpload) * 1000 / UpdateRate) * 8); + } + m_totalUploadSensor->setValue(newUpload); } - m_totalUploadSensor->setValue(newUpload); - } }); for (auto property : statisticSensors) { connect(property, &KSysGuard::SensorProperty::subscribedChanged, this, [this, statisticSensors](bool subscribed) { if (subscribed && !m_statisticsTimer->isActive()) { m_statisticsTimer->start(); - } else if (std::none_of(statisticSensors.begin(), statisticSensors.end(), [](auto property) { return property->isSubscribed(); })) { + } else if (std::none_of(statisticSensors.begin(), statisticSensors.end(), [](auto property) { + return property->isSubscribed(); + })) { m_statisticsTimer->stop(); m_totalDownloadSensor->setValue(0); m_totalUploadSensor->setValue(0); } }); } - m_statisticsTimer->start(); - + m_statisticsTimer->start(); } -void SysctlNetDevice::update() { - char addr_buf[NI_MAXHOST]; - QStringList ipv4_addrs; - QStringList ipv6_addrs; - struct sockaddr_in *sin; - - - ipv4_addrs.clear(); - ipv6_addrs.clear(); - for(struct sockaddr* ifaddr : m_ifaddrs) { - sin=reinterpret_cast(ifaddr); +void SysctlNetDevice::update() +{ + char addr_buf[NI_MAXHOST]; + QStringList ipv4_addrs; + QStringList ipv6_addrs; + struct sockaddr_in *sin; + + ipv4_addrs.clear(); + ipv6_addrs.clear(); + for (struct sockaddr *ifaddr : m_ifaddrs) { + sin = reinterpret_cast(ifaddr); if (sin == NULL) - return; - + return; + getnameinfo((struct sockaddr *)sin, sin->sin_len, addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST); - - getnameinfo((struct sockaddr *)sin, sin->sin_len, addr_buf,sizeof(addr_buf), NULL, 0, NI_NUMERICHOST); - - - if(sin->sin_family == AF_INET) { - ipv4_addrs << QString::fromStdString(addr_buf); - } - if(sin->sin_family == AF_INET6) { - ipv6_addrs << QString::fromStdString(addr_buf); - } + if (sin->sin_family == AF_INET) { + ipv4_addrs << QString::fromStdString(addr_buf); } - m_ipv4Sensor->setValue(ipv4_addrs.join("\n")); - m_ipv6Sensor->setValue(ipv6_addrs.join("\n")); - - + if (sin->sin_family == AF_INET6) { + ipv6_addrs << QString::fromStdString(addr_buf); + } + } + m_ipv4Sensor->setValue(ipv4_addrs.join("\n")); + m_ipv6Sensor->setValue(ipv6_addrs.join("\n")); } SysctlNetDevice::~SysctlNetDevice() { - - } SysctlBackend::SysctlBackend(QObject *parent) : NetworkBackend(parent) { - - } SysctlBackend::~SysctlBackend() @@ -128,28 +126,31 @@ bool SysctlBackend::isSupported() void SysctlBackend::start() { - int count,i; + int count, i, j; size_t len; - int ifcnt_name[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_SYSTEM, IFMIB_IFCOUNT }; + int ifcnt_name[] = {CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_SYSTEM, IFMIB_IFCOUNT}; len = sizeof(int); if (sysctl(ifcnt_name, 5, &count, &len, NULL, 0) < 0) { return; } - for(i=1;im_sysctl_name[4]=i; // finish the sysctl name - m_devices.insert(QByteArray(ifmd.ifmd_name),device); + auto device = new SysctlNetDevice(QString::fromStdString(ifmd.ifmd_name), QString::fromStdString(ifmd.ifmd_name)); + + for (j = 0; j < 6; j++) { + device->m_sysctl_name[j] = sname[j]; + } + m_devices.insert(QByteArray(ifmd.ifmd_name), device); emit deviceAdded(device); } } @@ -162,27 +163,25 @@ void SysctlBackend::stop() void SysctlBackend::update() { struct ifaddrs *ifap; - bzero(&ifap,sizeof(ifap)); + bzero(&ifap, sizeof(ifap)); getifaddrs(&ifap); struct ifaddrs *tmp = ifap; - while(tmp!=NULL) { - QHashIterator iter(m_devices); - while(iter.hasNext()) { + while (tmp != NULL) { + QHashIterator iter(m_devices); + while (iter.hasNext()) { iter.next(); - if(iter.key() == QByteArray(tmp->ifa_name)) { + if (iter.key() == QByteArray(tmp->ifa_name)) { iter.value()->m_ifaddrs.append(tmp->ifa_addr); } - } - tmp = tmp->ifa_next; + tmp = tmp->ifa_next; } - QHashIterator iter(m_devices); - while(iter.hasNext()) { + QHashIterator iter(m_devices); + while (iter.hasNext()) { iter.next(); iter.value()->update(); iter.value()->m_ifaddrs.clear(); } - } diff --git a/plugins/network/SysctlBackend.h b/plugins/network/SysctlBackend.h index 8583e07..74629e8 100644 --- a/plugins/network/SysctlBackend.h +++ b/plugins/network/SysctlBackend.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020 David Redondo + * SPDX-FileCopyrightText: 2022 Jesper Schmitz Mouridsen * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ @@ -8,23 +8,9 @@ #include "NetworkBackend.h" #include "NetworkDevice.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include + static const int UpdateRate = 500; class SysctlNetDevice : public NetworkDevice { @@ -33,14 +19,13 @@ class SysctlNetDevice : public NetworkDevice public: SysctlNetDevice(const QString &id, const QString &name); ~SysctlNetDevice() override; - int m_sysctl_name[6] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, 0, IFDATA_GENERAL }; + int m_sysctl_name[6]; void update(); bool isConnected() const; std::unique_ptr m_statisticsTimer; - QList m_ifaddrs; + QList m_ifaddrs; }; - class SysctlBackend : public NetworkBackend { public: @@ -54,5 +39,4 @@ public: private: QHash m_devices; QElapsedTimer m_updateTimer; - }; -- GitLab From d464731e157d749f70bf93869b720e82ae865b55 Mon Sep 17 00:00:00 2001 From: Jesper Schmitz Mouridsen Date: Fri, 21 Oct 2022 21:22:06 +0200 Subject: [PATCH 3/4] Clean up duplicate connect and change call to getifaddrs --- plugins/network/SysctlBackend.cpp | 104 +++++++++++------------------- plugins/network/SysctlBackend.h | 6 +- 2 files changed, 41 insertions(+), 69 deletions(-) diff --git a/plugins/network/SysctlBackend.cpp b/plugins/network/SysctlBackend.cpp index 2f88561..37c27f6 100644 --- a/plugins/network/SysctlBackend.cpp +++ b/plugins/network/SysctlBackend.cpp @@ -16,24 +16,24 @@ #include #include -SysctlNetDevice::SysctlNetDevice(const QString &id, const QString &name) +SysctlNetDevice::SysctlNetDevice(const QString &id, const QString &name, int ifnumber) : NetworkDevice(id, name) { + m_sysctlName = {CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, ifnumber, IFDATA_GENERAL}; // Even though we have no sensor, we need to have a name for the grouped text on the front page // of plasma-systemmonitor m_networkSensor->setValue(id); - std::vector statisticSensors{m_downloadSensor, - m_downloadBitsSensor, - m_totalDownloadSensor, - m_uploadSensor, - m_uploadBitsSensor, - m_totalUploadSensor}; + std::array statisticSensors = + {m_downloadSensor, m_downloadBitsSensor, m_totalDownloadSensor, m_uploadSensor, m_uploadBitsSensor, m_totalUploadSensor}; auto resetStatistics = [this, statisticSensors]() { if (std::none_of(statisticSensors.begin(), statisticSensors.end(), [](auto property) { return property->isSubscribed(); })) { m_totalDownloadSensor->setValue(0); m_totalUploadSensor->setValue(0); + m_statisticsTimer->stop(); + } else if (!m_statisticsTimer->isActive()) { + m_statisticsTimer->start(); } }; for (auto property : statisticSensors) { @@ -42,42 +42,28 @@ SysctlNetDevice::SysctlNetDevice(const QString &id, const QString &name) m_statisticsTimer = std::make_unique(); m_statisticsTimer->setInterval(UpdateRate); connect(m_statisticsTimer.get(), &QTimer::timeout, this, [this]() { - struct ifmibdata ifmd; - bzero(&ifmd, sizeof(ifmd)); + ifmibdata ifmd{}; size_t len = sizeof(ifmd); - if (sysctl(m_sysctl_name, 6, &ifmd, &len, NULL, 0) == 0) { + if (sysctl(m_sysctlName.data(), 6, &ifmd, &len, NULL, 0) == 0) { const qulonglong newDownload = ifmd.ifmd_data.ifi_ibytes; const qulonglong previousDownload = m_totalDownloadSensor->value().toULongLong(); + const qulonglong deltaDownload = newDownload - previousDownload; if (previousDownload > 0) { - m_downloadSensor->setValue((newDownload - previousDownload) * 1000 / UpdateRate); - m_downloadBitsSensor->setValue(((newDownload - previousDownload) * 1000 / UpdateRate) * 8); + m_downloadSensor->setValue(deltaDownload * 1000 / UpdateRate); + m_downloadBitsSensor->setValue((deltaDownload * 1000 / UpdateRate) * 8); } m_totalDownloadSensor->setValue(newDownload); const qulonglong newUpload = ifmd.ifmd_data.ifi_obytes; const qulonglong previousUpload = m_totalUploadSensor->value().toULongLong(); + const qulonglong deltaUpload = newUpload - previousUpload; if (previousUpload > 0) { - m_uploadSensor->setValue((newUpload - previousUpload) * 1000 / UpdateRate); - m_uploadBitsSensor->setValue(((newUpload - previousUpload) * 1000 / UpdateRate) * 8); + m_uploadSensor->setValue(deltaUpload * 1000 / UpdateRate); + m_uploadBitsSensor->setValue((deltaUpload * 1000 / UpdateRate) * 8); } m_totalUploadSensor->setValue(newUpload); } }); - - for (auto property : statisticSensors) { - connect(property, &KSysGuard::SensorProperty::subscribedChanged, this, [this, statisticSensors](bool subscribed) { - if (subscribed && !m_statisticsTimer->isActive()) { - m_statisticsTimer->start(); - } else if (std::none_of(statisticSensors.begin(), statisticSensors.end(), [](auto property) { - return property->isSubscribed(); - })) { - m_statisticsTimer->stop(); - m_totalDownloadSensor->setValue(0); - m_totalUploadSensor->setValue(0); - } - }); - } - m_statisticsTimer->start(); } void SysctlNetDevice::update() { @@ -88,22 +74,28 @@ void SysctlNetDevice::update() ipv4_addrs.clear(); ipv6_addrs.clear(); - for (struct sockaddr *ifaddr : m_ifaddrs) { - sin = reinterpret_cast(ifaddr); - if (sin == NULL) - return; + ifaddrs *ifap; + bzero(&ifap, sizeof(ifap)); + for (getifaddrs(&ifap); ifap != nullptr; ifap = ifap->ifa_next) { + if (name() == QString::fromLatin1(ifap->ifa_name)) { + sin = reinterpret_cast(ifap->ifa_addr); + if (sin == NULL) + return; - getnameinfo((struct sockaddr *)sin, sin->sin_len, addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST); + getnameinfo(ifap->ifa_addr, sin->sin_len, addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST); - if (sin->sin_family == AF_INET) { - ipv4_addrs << QString::fromStdString(addr_buf); - } - if (sin->sin_family == AF_INET6) { - ipv6_addrs << QString::fromStdString(addr_buf); + if (sin->sin_family == AF_INET) { + ipv4_addrs << QString::fromStdString(addr_buf); + } + if (sin->sin_family == AF_INET6) { + ipv6_addrs << QString::fromStdString(addr_buf); + } + + m_ipv4Sensor->setValue(ipv4_addrs.join("\n")); + m_ipv6Sensor->setValue(ipv6_addrs.join("\n")); } } - m_ipv4Sensor->setValue(ipv4_addrs.join("\n")); - m_ipv6Sensor->setValue(ipv6_addrs.join("\n")); + freeifaddrs(ifap); } SysctlNetDevice::~SysctlNetDevice() @@ -126,7 +118,7 @@ bool SysctlBackend::isSupported() void SysctlBackend::start() { - int count, i, j; + int count, i; size_t len; int ifcnt_name[] = {CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_SYSTEM, IFMIB_IFCOUNT}; len = sizeof(int); @@ -135,8 +127,8 @@ void SysctlBackend::start() } for (i = 1; i <= count; i++) { - struct ifmibdata ifmd; - bzero(&ifmd, sizeof(ifmd)); + struct ifmibdata ifmd { + }; size_t len = sizeof(ifmd); int sname[6] = {CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, i, IFDATA_GENERAL}; @@ -145,13 +137,10 @@ void SysctlBackend::start() } if ((ifmd.ifmd_data.ifi_type == IFT_ETHER) || (ifmd.ifmd_data.ifi_type == IFT_IEEE80211)) { - auto device = new SysctlNetDevice(QString::fromStdString(ifmd.ifmd_name), QString::fromStdString(ifmd.ifmd_name)); + auto device = new SysctlNetDevice(QString::fromStdString(ifmd.ifmd_name), QString::fromStdString(ifmd.ifmd_name), i); - for (j = 0; j < 6; j++) { - device->m_sysctl_name[j] = sname[j]; - } m_devices.insert(QByteArray(ifmd.ifmd_name), device); - emit deviceAdded(device); + Q_EMIT deviceAdded(device); } } } @@ -162,26 +151,9 @@ void SysctlBackend::stop() void SysctlBackend::update() { - struct ifaddrs *ifap; - bzero(&ifap, sizeof(ifap)); - getifaddrs(&ifap); - struct ifaddrs *tmp = ifap; - while (tmp != NULL) { - QHashIterator iter(m_devices); - while (iter.hasNext()) { - iter.next(); - if (iter.key() == QByteArray(tmp->ifa_name)) { - iter.value()->m_ifaddrs.append(tmp->ifa_addr); - } - } - - tmp = tmp->ifa_next; - } - QHashIterator iter(m_devices); while (iter.hasNext()) { iter.next(); iter.value()->update(); - iter.value()->m_ifaddrs.clear(); } } diff --git a/plugins/network/SysctlBackend.h b/plugins/network/SysctlBackend.h index 74629e8..a6d52fb 100644 --- a/plugins/network/SysctlBackend.h +++ b/plugins/network/SysctlBackend.h @@ -8,6 +8,7 @@ #include "NetworkBackend.h" #include "NetworkDevice.h" +#include #include #include @@ -17,9 +18,9 @@ class SysctlNetDevice : public NetworkDevice Q_OBJECT public: - SysctlNetDevice(const QString &id, const QString &name); + SysctlNetDevice(const QString &id, const QString &name,int ifnumber); ~SysctlNetDevice() override; - int m_sysctl_name[6]; + std::array m_sysctlName; void update(); bool isConnected() const; std::unique_ptr m_statisticsTimer; @@ -38,5 +39,4 @@ public: private: QHash m_devices; - QElapsedTimer m_updateTimer; }; -- GitLab From 9dcddd1bd73e1927760a78f2fbdfb535bf4d3d2b Mon Sep 17 00:00:00 2001 From: Jesper Schmitz Mouridsen Date: Fri, 21 Oct 2022 21:55:42 +0200 Subject: [PATCH 4/4] Use fromLatin1 and check return of getnameinfo --- plugins/network/SysctlBackend.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/plugins/network/SysctlBackend.cpp b/plugins/network/SysctlBackend.cpp index 37c27f6..4cd363c 100644 --- a/plugins/network/SysctlBackend.cpp +++ b/plugins/network/SysctlBackend.cpp @@ -82,19 +82,20 @@ void SysctlNetDevice::update() if (sin == NULL) return; - getnameinfo(ifap->ifa_addr, sin->sin_len, addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST); + if(getnameinfo(ifap->ifa_addr, sin->sin_len, addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST)==0) { - if (sin->sin_family == AF_INET) { - ipv4_addrs << QString::fromStdString(addr_buf); - } - if (sin->sin_family == AF_INET6) { - ipv6_addrs << QString::fromStdString(addr_buf); - } + if (sin->sin_family == AF_INET) { + ipv4_addrs << QString::fromLatin1(addr_buf); + } + if (sin->sin_family == AF_INET6) { + ipv6_addrs << QString::fromLatin1(addr_buf); + } + } - m_ipv4Sensor->setValue(ipv4_addrs.join("\n")); - m_ipv6Sensor->setValue(ipv6_addrs.join("\n")); } } + m_ipv4Sensor->setValue(ipv4_addrs.join("\n")); + m_ipv6Sensor->setValue(ipv6_addrs.join("\n")); freeifaddrs(ifap); } @@ -137,7 +138,7 @@ void SysctlBackend::start() } if ((ifmd.ifmd_data.ifi_type == IFT_ETHER) || (ifmd.ifmd_data.ifi_type == IFT_IEEE80211)) { - auto device = new SysctlNetDevice(QString::fromStdString(ifmd.ifmd_name), QString::fromStdString(ifmd.ifmd_name), i); + auto device = new SysctlNetDevice(QString::fromLatin1(ifmd.ifmd_name), QString::fromLatin1(ifmd.ifmd_name), i); m_devices.insert(QByteArray(ifmd.ifmd_name), device); Q_EMIT deviceAdded(device); -- GitLab