diff --git a/Include/Aurora/IO/Net/INetAdapter.hpp b/Include/Aurora/IO/Net/INetAdapter.hpp index 3c0fd5f3..7d7e6dde 100644 --- a/Include/Aurora/IO/Net/INetAdapter.hpp +++ b/Include/Aurora/IO/Net/INetAdapter.hpp @@ -35,6 +35,8 @@ namespace Aurora::IO::Net virtual bool HasDHCP() = 0; virtual AuUInt32 GetMTU() = 0; + virtual AuUInt64 GetTransmitBytesPerSec() = 0; + virtual AuUInt64 GetReceiveBytesPerSec() = 0; virtual AuList GetDNS() = 0; }; diff --git a/Source/IO/Net/AuNetAdapter.Linux.cpp b/Source/IO/Net/AuNetAdapter.Linux.cpp index abcdada4..b69f1200 100644 --- a/Source/IO/Net/AuNetAdapter.Linux.cpp +++ b/Source/IO/Net/AuNetAdapter.Linux.cpp @@ -9,10 +9,15 @@ #include "AuNetAdapter.hpp" #include "AuNetEndpoint.hpp" #include +#include +#include +#include #include #include #include -#include +#include +#include +#include namespace Aurora::IO::Net { @@ -375,6 +380,45 @@ namespace Aurora::IO::Net return ret; } + static void PatchAdapterSpeed(int family, NetAdapter &adapter) + { + struct ethtool_cmd edata; + int iSocket {}; + + { + iSocket = ::socket(PF_INET, + SOCK_DGRAM | SOCK_CLOEXEC, + IPPROTO_IP); + if (iSocket < 0) + { + return; + } + } + + { + struct ifreq ifr; + strncpy(ifr.ifr_name, adapter.device.c_str(), sizeof(ifr.ifr_name)); + ifr.ifr_data = &edata; + edata.cmd = ETHTOOL_GSET; + auto iRet = ::ioctl(sock, SIOCETHTOOL, &ifr); + if (iRet < 0) + { + ::close(iSocket); + return; + } + } + + { + auto uBytesPerSecond = + ((AuUInt)(ethtool_cmd_speed(&edata))) * 1000 / 8; + + adapter.uTransmitBytesPerSec = uBytesPerSecond; + adapter.uReceiveBytesPerSec = uBytesPerSecond; + } + + ::close(iSocket); + } + void NetlinkDevice::UpdateAdapterInfo(int family, NetAdapter &adapter) { static const auto kAddrBufferSize = 12 * 1024; @@ -487,20 +531,32 @@ namespace Aurora::IO::Net { adapter.device = (const char *)RTA_DATA(attr); } - - if (attr->rta_type == IFLA_MTU) + else if (attr->rta_type == IFLA_MTU) { adapter.mtu = *(unsigned int *)RTA_DATA(attr); } - - if (attr->rta_type == IFLA_ADDRESS) + else if (attr->rta_type == IFLA_ADDRESS) { if (dstlen <= adapter.mac.size()) { AuMemcpy(adapter.mac.begin(), (const char *)RTA_DATA(attr), dstlen); } } + #if 0 + else if (attr->rta_type == IFLA_STATS) + { + auto pStats = (struct rtnl_link_stats *)RTA_DATA(attr); + adapter.uTransmitBytesPerSec = pStats->tx_bytes; + adapter.uReceiveBytesPerSec = pStats->rx_bytes; + } + else if (attr->rta_type == IFLA_STATS64) + { + auto pStats64 = (struct rtnl_link_stats64 *)RTA_DATA(attr); + adapter.uTransmitBytesPerSec = pStats64->tx_bytes; + adapter.uReceiveBytesPerSec = pStats64->rx_bytes; + } } + #endif } } } @@ -557,6 +613,7 @@ namespace Aurora::IO::Net continue; } + PatchAdapterSpeed(family, *pAdapter.get()); ret.push_back(pAdapter); } diff --git a/Source/IO/Net/AuNetAdapter.NT.cpp b/Source/IO/Net/AuNetAdapter.NT.cpp index 418f55dd..7f849b1a 100644 --- a/Source/IO/Net/AuNetAdapter.NT.cpp +++ b/Source/IO/Net/AuNetAdapter.NT.cpp @@ -235,6 +235,8 @@ namespace Aurora::IO::Net } adapter.dhcp = pCurrAddresses->Dhcpv4Enabled; + adapter.uTransmitBytesPerSec = pCurrAddresses->TransmitLinkSpeed / 8; + adapter.uReceiveBytesPerSec = pCurrAddresses->ReceiveLinkSpeed / 8; } if (adapter.address.ip == EIPProtocol::eIPProtocolV4) diff --git a/Source/IO/Net/AuNetAdapter.cpp b/Source/IO/Net/AuNetAdapter.cpp index a9307f43..2d490002 100644 --- a/Source/IO/Net/AuNetAdapter.cpp +++ b/Source/IO/Net/AuNetAdapter.cpp @@ -87,4 +87,14 @@ namespace Aurora::IO::Net { return this->mtu; } + + AuUInt64 NetAdapter::GetTransmitBytesPerSec() + { + return this->uTransmitBytesPerSec; + } + + AuUInt64 NetAdapter::GetReceiveBytesPerSec() + { + return this->uReceiveBytesPerSec; + } } \ No newline at end of file diff --git a/Source/IO/Net/AuNetAdapter.hpp b/Source/IO/Net/AuNetAdapter.hpp index 8a8c063a..0251909b 100644 --- a/Source/IO/Net/AuNetAdapter.hpp +++ b/Source/IO/Net/AuNetAdapter.hpp @@ -34,6 +34,8 @@ namespace Aurora::IO::Net bool HasDHCP() override; AuUInt32 GetMTU() override; + AuUInt64 GetTransmitBytesPerSec() override; + AuUInt64 GetReceiveBytesPerSec() override; // FriendlyName @@ -53,6 +55,8 @@ namespace Aurora::IO::Net ENetworkAdapterStatus eNetworkStatus { ENetworkAdapterStatus::eUp }; bool dhcp {}; AuArray mac; + AuUInt64 uTransmitBytesPerSec { 10 * 1000 * 1000 / 8 }; + AuUInt64 uReceiveBytesPerSec { 10 * 1000 * 1000 / 8 }; AuUInt32 mtu; AuList dns;