diff --git a/Include/Aurora/IO/Net/INetAdapter.hpp b/Include/Aurora/IO/Net/INetAdapter.hpp index ec185147..3c0fd5f3 100644 --- a/Include/Aurora/IO/Net/INetAdapter.hpp +++ b/Include/Aurora/IO/Net/INetAdapter.hpp @@ -9,6 +9,9 @@ namespace Aurora::IO::Net { + AUE_DEFINE_VA(ENetworkAdapterStatus, eUp, eDown); + AUE_DEFINE_VA(ENetworkAdapterType, eUnknown, eOther, eIPGRE, eTunnel, eLoopback, eEthernet, eIEEE80211, eMobileNetwork, eTokenRing); + struct INetAdapter { virtual const AuString &ToName() = 0; @@ -16,6 +19,9 @@ namespace Aurora::IO::Net virtual AuUInt16 GetIndex() = 0; + virtual ENetworkAdapterType ToNetworkType() = 0; + virtual ENetworkAdapterStatus ToStatus() = 0; + virtual EIPProtocol ToFamily() = 0; virtual IPAddress ToAddress() = 0; diff --git a/Source/IO/Net/AuNetAdapter.Linux.cpp b/Source/IO/Net/AuNetAdapter.Linux.cpp index 7499da72..abcdada4 100644 --- a/Source/IO/Net/AuNetAdapter.Linux.cpp +++ b/Source/IO/Net/AuNetAdapter.Linux.cpp @@ -8,10 +8,10 @@ #include "Networking.hpp" #include "AuNetAdapter.hpp" #include "AuNetEndpoint.hpp" - #include #include #include +#include #include namespace Aurora::IO::Net @@ -439,6 +439,43 @@ namespace Aurora::IO::Net continue; } + adapter.eNetworkStatus = ifa->ifi_flags & IFF_RUNNING ? + ENetworkAdapterStatus::eUp : + ENetworkAdapterStatus::eDown; + + { + switch (ifa->ifi_type) + { + case ARPHRD_ETHER: + case ARPHRD_EETHER: + adapter.eNetworkType = ENetworkAdapterType::eEthernet; + break; + case ARPHRD_IEEE802: + case ARPHRD_IEEE802_TR: + case ARPHRD_IEEE80211: + case ARPHRD_IEEE80211_PRISM: + case ARPHRD_IEEE80211_RADIOTAP: + case ARPHRD_IEEE802154: + case ARPHRD_IEEE802154_MONITOR: + define + adapter.eNetworkType = ENetworkAdapterType::eIEEE80211; + break; + case ARPHRD_PRONET: + adapter.eNetworkType = ENetworkAdapterType::eTokenRing; + break; + case ARPHRD_LOOPBACK: + adapter.eNetworkType = ENetworkAdapterType::eLoopback; + break; + case ARPHRD_TUNNEL: + case ARPHRD_TUNNEL6: + adapter.eNetworkType = ENetworkAdapterType::eTunnel; + break; + case ARPHRD_IPGRE: + adapter.eNetworkType = ENetworkAdapterType::eIPGRE; + break; + } + } + auto attr = IFLA_RTA(ifa); auto attrlen = hdr->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)); diff --git a/Source/IO/Net/AuNetAdapter.NT.cpp b/Source/IO/Net/AuNetAdapter.NT.cpp index 57e3c8e7..418f55dd 100644 --- a/Source/IO/Net/AuNetAdapter.NT.cpp +++ b/Source/IO/Net/AuNetAdapter.NT.cpp @@ -178,6 +178,34 @@ namespace Aurora::IO::Net adapter.broadcast = ep.ip; } + { + switch (pCurrAddresses->IfType) + { + case IF_TYPE_OTHER: + adapter.eNetworkType = ENetworkAdapterType::eOther; + break; + case IF_TYPE_ETHERNET_CSMACD: + adapter.eNetworkType = ENetworkAdapterType::eEthernet; + break; + case IF_TYPE_IEEE80211: + adapter.eNetworkType = ENetworkAdapterType::eIEEE80211; + break; + case IF_TYPE_ISO88025_TOKENRING: + adapter.eNetworkType = ENetworkAdapterType::eTokenRing; + break; + case IF_TYPE_SOFTWARE_LOOPBACK: + adapter.eNetworkType = ENetworkAdapterType::eLoopback; + break; + case IF_TYPE_TUNNEL: + adapter.eNetworkType = ENetworkAdapterType::eTunnel; + break; + } + } + + adapter.eNetworkStatus = pCurrAddresses->OperStatus == IfOperStatusUp ? + ENetworkAdapterStatus::eUp : + ENetworkAdapterStatus::eDown; + auto pAnycast = pCurrAddresses->FirstAnycastAddress; if (pAnycast) { diff --git a/Source/IO/Net/AuNetAdapter.cpp b/Source/IO/Net/AuNetAdapter.cpp index a84b5f38..a9307f43 100644 --- a/Source/IO/Net/AuNetAdapter.cpp +++ b/Source/IO/Net/AuNetAdapter.cpp @@ -38,6 +38,16 @@ namespace Aurora::IO::Net return this->device; } + ENetworkAdapterType NetAdapter::ToNetworkType() + { + return this->eNetworkType; + } + + ENetworkAdapterStatus NetAdapter::ToStatus() + { + return this->eNetworkStatus; + } + EIPProtocol NetAdapter::ToFamily() { return this->address.ip; diff --git a/Source/IO/Net/AuNetAdapter.hpp b/Source/IO/Net/AuNetAdapter.hpp index 893f4b8d..8a8c063a 100644 --- a/Source/IO/Net/AuNetAdapter.hpp +++ b/Source/IO/Net/AuNetAdapter.hpp @@ -18,6 +18,9 @@ namespace Aurora::IO::Net EIPProtocol ToFamily() override; + ENetworkAdapterType ToNetworkType() override; + ENetworkAdapterStatus ToStatus() override; + IPAddress ToAddress() override; IPAddress ToBroadcastAddress() override; IPAddress ToAnycastAddress() override; @@ -46,6 +49,8 @@ namespace Aurora::IO::Net IPAddress anycast; IPAddress subnet; IPAddress gateway; + ENetworkAdapterType eNetworkType { ENetworkAdapterType::eUnknown }; + ENetworkAdapterStatus eNetworkStatus { ENetworkAdapterStatus::eUp }; bool dhcp {}; AuArray mac; AuUInt32 mtu;