Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update the ResetWifiNetworkDiagnosticsCounts method in ConnectivityMan… #10197

Merged
merged 1 commit into from
Oct 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 108 additions & 9 deletions src/platform/Linux/ConnectivityManagerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,11 @@ CHIP_ERROR ConnectivityManagerImpl::_Init()
ChipLogError(DeviceLayer, "Failed to get WiFi interface");
mWiFiIfName[0] = '\0';
}

if (ResetWiFiStatsCount() != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "Failed to reset WiFi statistic counts");
}
#endif

return CHIP_NO_ERROR;
Expand Down Expand Up @@ -1165,6 +1170,7 @@ CHIP_ERROR ConnectivityManagerImpl::_GetWiFiRssi(int8_t & rssi)
CHIP_ERROR ConnectivityManagerImpl::_GetWiFiBeaconLostCount(uint32_t & beaconLostCount)
{
int skfd;
uint32_t count;

if (mWiFiIfName[0] == '\0')
{
Expand All @@ -1177,7 +1183,11 @@ CHIP_ERROR ConnectivityManagerImpl::_GetWiFiBeaconLostCount(uint32_t & beaconLos
return CHIP_ERROR_OPEN_FAILED;
}

return ConnectivityUtils::GetWiFiBeaconLostCount(skfd, mWiFiIfName, beaconLostCount);
ReturnErrorOnFailure(ConnectivityUtils::GetWiFiBeaconLostCount(skfd, mWiFiIfName, count));
VerifyOrReturnError(count >= mBeaconLostCount, CHIP_ERROR_INVALID_INTEGER_VALUE);
beaconLostCount = count - mBeaconLostCount;

return CHIP_NO_ERROR;
}

CHIP_ERROR ConnectivityManagerImpl::_GetWiFiCurrentMaxRate(uint64_t & currentMaxRate)
Expand All @@ -1201,37 +1211,126 @@ CHIP_ERROR ConnectivityManagerImpl::_GetWiFiCurrentMaxRate(uint64_t & currentMax
CHIP_ERROR ConnectivityManagerImpl::_GetWiFiPacketMulticastRxCount(uint32_t & packetMulticastRxCount)
{
uint64_t count;
return GetWiFiStatsCount(WiFiStatsCountType::kWiFiMulticastPacketRxCount, count);

ReturnErrorOnFailure(GetWiFiStatsCount(WiFiStatsCountType::kWiFiMulticastPacketRxCount, count));
VerifyOrReturnError(count >= mPacketMulticastRxCount, CHIP_ERROR_INVALID_INTEGER_VALUE);

count -= mPacketMulticastRxCount;
VerifyOrReturnError(count <= UINT32_MAX, CHIP_ERROR_INVALID_INTEGER_VALUE);

packetMulticastRxCount = static_cast<uint32_t>(count);

return CHIP_NO_ERROR;
}

CHIP_ERROR ConnectivityManagerImpl::_GetWiFiPacketMulticastTxCount(uint32_t & packetMulticastTxCount)
{
uint64_t count;
return GetWiFiStatsCount(WiFiStatsCountType::kWiFiMulticastPacketTxCount, count);

ReturnErrorOnFailure(GetWiFiStatsCount(WiFiStatsCountType::kWiFiMulticastPacketTxCount, count));
VerifyOrReturnError(count >= mPacketMulticastTxCount, CHIP_ERROR_INVALID_INTEGER_VALUE);

count -= mPacketMulticastTxCount;
VerifyOrReturnError(count <= UINT32_MAX, CHIP_ERROR_INVALID_INTEGER_VALUE);

packetMulticastTxCount = static_cast<uint32_t>(count);

return CHIP_NO_ERROR;
}

CHIP_ERROR ConnectivityManagerImpl::_GetWiFiPacketUnicastRxCount(uint32_t & packetUnicastRxCount)
{
uint64_t count;
return GetWiFiStatsCount(WiFiStatsCountType::kWiFiUnicastPacketRxCount, count);

ReturnErrorOnFailure(GetWiFiStatsCount(WiFiStatsCountType::kWiFiUnicastPacketRxCount, count));
VerifyOrReturnError(count >= mPacketUnicastRxCount, CHIP_ERROR_INVALID_INTEGER_VALUE);

count -= mPacketUnicastRxCount;
VerifyOrReturnError(count <= UINT32_MAX, CHIP_ERROR_INVALID_INTEGER_VALUE);

packetUnicastRxCount = static_cast<uint32_t>(count);

return CHIP_NO_ERROR;
}

CHIP_ERROR ConnectivityManagerImpl::_GetWiFiPacketUnicastTxCount(uint32_t & packetUnicastTxCount)
{
uint64_t count;
return GetWiFiStatsCount(WiFiStatsCountType::kWiFiUnicastPacketTxCount, count);

ReturnErrorOnFailure(GetWiFiStatsCount(WiFiStatsCountType::kWiFiUnicastPacketTxCount, count));
VerifyOrReturnError(count >= mPacketUnicastTxCount, CHIP_ERROR_INVALID_INTEGER_VALUE);

count -= mPacketUnicastTxCount;
VerifyOrReturnError(count <= UINT32_MAX, CHIP_ERROR_INVALID_INTEGER_VALUE);

packetUnicastTxCount = static_cast<uint32_t>(count);

return CHIP_NO_ERROR;
}

CHIP_ERROR ConnectivityManagerImpl::_GetWiFiOverrunCount(uint64_t & overrunCount)
{
return GetWiFiStatsCount(WiFiStatsCountType::kWiFiOverrunCount, overrunCount);
uint64_t count;

ReturnErrorOnFailure(GetWiFiStatsCount(WiFiStatsCountType::kWiFiOverrunCount, count));
VerifyOrReturnError(count >= mOverrunCount, CHIP_ERROR_INVALID_INTEGER_VALUE);

overrunCount = count - mOverrunCount;

return CHIP_NO_ERROR;
}

CHIP_ERROR ConnectivityManagerImpl::_ResetWiFiNetworkDiagnosticsCounts()
{
// On Linux simulation, the packet statistic informations are shared by all running programs,
// the current running program does not have permission to reset those counts.
return CHIP_NO_ERROR;
return ResetWiFiStatsCount();
}

CHIP_ERROR ConnectivityManagerImpl::ResetWiFiStatsCount()
{
CHIP_ERROR ret = CHIP_ERROR_READ_FAILED;
struct ifaddrs * ifaddr = nullptr;

ReturnErrorOnFailure(_GetWiFiBeaconLostCount(mBeaconLostCount));

if (getifaddrs(&ifaddr) == -1)
{
ChipLogError(DeviceLayer, "Failed to get network interfaces");
}
else
{
struct ifaddrs * ifa = nullptr;

/* Walk through linked list, maintaining head pointer so we
can free list later */
for (ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next)
{
if (ConnectivityUtils::GetInterfaceConnectionType(ifa->ifa_name) == ConnectionType::kConnectionWiFi)
{
ChipLogProgress(DeviceLayer, "Found the primary WiFi interface:%s", ifa->ifa_name);
break;
}
}

if (ifa != nullptr)
{
if (ifa->ifa_addr->sa_family == AF_PACKET && ifa->ifa_data != nullptr)
{
struct rtnl_link_stats * stats = (struct rtnl_link_stats *) ifa->ifa_data;

mPacketMulticastRxCount = stats->multicast;
mPacketMulticastTxCount = 0;
mPacketUnicastRxCount = stats->rx_packets;
mPacketUnicastTxCount = stats->tx_packets;
mOverrunCount = stats->rx_over_errors;

ret = CHIP_NO_ERROR;
}
}

freeifaddrs(ifaddr);
}

return ret;
}

#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI
Expand Down
10 changes: 10 additions & 0 deletions src/platform/Linux/ConnectivityManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,10 @@ class ConnectivityManagerImpl final : public ConnectivityManager,

CHIP_ERROR ResetEthernetStatsCount();

#if CHIP_DEVICE_CONFIG_ENABLE_WIFI
CHIP_ERROR ResetWiFiStatsCount();
#endif

#if CHIP_DEVICE_CONFIG_ENABLE_WPA
void DriveAPState();
CHIP_ERROR ConfigureWiFiAP();
Expand Down Expand Up @@ -206,6 +210,12 @@ class ConnectivityManagerImpl final : public ConnectivityManager,
#endif

#if CHIP_DEVICE_CONFIG_ENABLE_WIFI
uint32_t mBeaconLostCount = 0;
uint32_t mPacketMulticastRxCount = 0;
uint32_t mPacketMulticastTxCount = 0;
uint32_t mPacketUnicastRxCount = 0;
uint32_t mPacketUnicastTxCount = 0;
uint64_t mOverrunCount = 0;
char mWiFiIfName[IFNAMSIZ];
#endif
};
Expand Down