Skip to content

Commit 1e9f9b2

Browse files
LuDudamarkaj-nordic
authored andcommitted
[nrf noup] Fix various Wi-Fi issues with error code handling
This commit handles a few issues with Wi-Fi connection or scanning: - Use wifi_status structure instead of incompatible WiFiRequestStatus - On connect error value > 2 do not report success - On scan error value > 1 do not report success - Provide value of mandatory LastConnectErrorValue attribute Signed-off-by: Łukasz Duda <lukasz.duda@nordicsemi.no>
1 parent abb645f commit 1e9f9b2

File tree

4 files changed

+31
-42
lines changed

4 files changed

+31
-42
lines changed

src/platform/nrfconnect/wifi/NrfWiFiDriver.cpp

+11-11
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,7 @@ CHIP_ERROR NrfWiFiDriver::Init(NetworkStatusChangeCallback * networkStatusChange
103103

104104
if (mStagingNetwork.IsConfigured())
105105
{
106-
WiFiManager::ConnectionHandling handling{ [] { Instance().OnNetworkStatusChanged(Status::kSuccess); },
107-
[] { Instance().OnNetworkStatusChanged(Status::kUnknownError); },
106+
WiFiManager::ConnectionHandling handling{ [](int connStatus) { Instance().OnNetworkStatusChanged(connStatus); },
108107
System::Clock::Seconds32{ kWiFiConnectNetworkTimeoutSeconds } };
109108
ReturnErrorOnFailure(
110109
WiFiManager::Instance().Connect(mStagingNetwork.GetSsidSpan(), mStagingNetwork.GetPassSpan(), handling));
@@ -113,8 +112,10 @@ CHIP_ERROR NrfWiFiDriver::Init(NetworkStatusChangeCallback * networkStatusChange
113112
return CHIP_NO_ERROR;
114113
}
115114

116-
void NrfWiFiDriver::OnNetworkStatusChanged(Status status)
115+
void NrfWiFiDriver::OnNetworkStatusChanged(int connStatus)
117116
{
117+
Status status = connStatus ? Status::kUnknownError : Status::kSuccess;
118+
118119
if (status == Status::kSuccess)
119120
{
120121
ConnectivityMgr().SetWiFiStationMode(ConnectivityManager::kWiFiStationMode_Enabled);
@@ -127,7 +128,8 @@ void NrfWiFiDriver::OnNetworkStatusChanged(Status status)
127128
if (CHIP_NO_ERROR == WiFiManager::Instance().GetWiFiInfo(wifiInfo))
128129
{
129130
mpNetworkStatusChangeCallback->OnNetworkingStatusChange(status,
130-
MakeOptional(ByteSpan(wifiInfo.mSsid, wifiInfo.mSsidLen)), NullOptional);
131+
MakeOptional(ByteSpan(wifiInfo.mSsid, wifiInfo.mSsidLen)),
132+
connStatus ? MakeOptional(connStatus) : NullOptional);
131133
}
132134
}
133135

@@ -170,8 +172,7 @@ CHIP_ERROR NrfWiFiDriver::RevertConfiguration()
170172

171173
if (mStagingNetwork.IsConfigured())
172174
{
173-
WiFiManager::ConnectionHandling handling{ [] { Instance().OnNetworkStatusChanged(Status::kSuccess); },
174-
[] { Instance().OnNetworkStatusChanged(Status::kUnknownError); },
175+
WiFiManager::ConnectionHandling handling{ [](int connStatus) { Instance().OnNetworkStatusChanged(connStatus); },
175176
System::Clock::Seconds32{ kWiFiConnectNetworkTimeoutSeconds } };
176177
ReturnErrorOnFailure(
177178
WiFiManager::Instance().Connect(mStagingNetwork.GetSsidSpan(), mStagingNetwork.GetPassSpan(), handling));
@@ -224,8 +225,7 @@ Status NrfWiFiDriver::ReorderNetwork(ByteSpan networkId, uint8_t index, MutableC
224225
void NrfWiFiDriver::ConnectNetwork(ByteSpan networkId, ConnectCallback * callback)
225226
{
226227
Status status = Status::kSuccess;
227-
WiFiManager::ConnectionHandling handling{ [] { Instance().OnNetworkStatusChanged(Status::kSuccess); },
228-
[] { Instance().OnNetworkStatusChanged(Status::kUnknownError); },
228+
WiFiManager::ConnectionHandling handling{ [](int connStatus) { Instance().OnNetworkStatusChanged(connStatus); },
229229
System::Clock::Seconds32{ kWiFiConnectNetworkTimeoutSeconds } };
230230

231231
VerifyOrExit(mpConnectCallback == nullptr, status = Status::kUnknownError);
@@ -255,10 +255,10 @@ void NrfWiFiDriver::LoadFromStorage()
255255
mStagingNetwork = network;
256256
}
257257

258-
void NrfWiFiDriver::OnScanWiFiNetworkDone(WiFiManager::WiFiRequestStatus status)
258+
void NrfWiFiDriver::OnScanWiFiNetworkDone(const wifi_status & status)
259259
{
260260
VerifyOrReturn(mScanCallback != nullptr);
261-
mScanCallback->OnFinished(status == WiFiManager::WiFiRequestStatus::SUCCESS ? Status::kSuccess : Status::kUnknownError,
261+
mScanCallback->OnFinished(status.status ? Status::kUnknownError : Status::kSuccess,
262262
CharSpan(), &mScanResponseIterator);
263263
mScanCallback = nullptr;
264264
}
@@ -273,7 +273,7 @@ void NrfWiFiDriver::ScanNetworks(ByteSpan ssid, WiFiDriver::ScanCallback * callb
273273
mScanCallback = callback;
274274
CHIP_ERROR error = WiFiManager::Instance().Scan(
275275
ssid, [](const WiFiScanResponse & response) { Instance().OnScanWiFiNetworkResult(response); },
276-
[](WiFiManager::WiFiRequestStatus status) { Instance().OnScanWiFiNetworkDone(status); });
276+
[](const wifi_status & status) { Instance().OnScanWiFiNetworkDone(status); });
277277

278278
if (error != CHIP_NO_ERROR)
279279
{

src/platform/nrfconnect/wifi/NrfWiFiDriver.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ class NrfWiFiDriver final : public WiFiDriver
9393
return sInstance;
9494
}
9595

96-
void OnNetworkStatusChanged(Status status);
96+
void OnNetworkStatusChanged(int status);
9797
void OnScanWiFiNetworkResult(const WiFiScanResponse & result);
98-
void OnScanWiFiNetworkDone(WiFiManager::WiFiRequestStatus status);
98+
void OnScanWiFiNetworkDone(const wifi_status & status);
9999

100100
private:
101101
void LoadFromStorage();

src/platform/nrfconnect/wifi/WiFiManager.cpp

+15-18
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,8 @@ CHIP_ERROR WiFiManager::Connect(const ByteSpan & ssid, const ByteSpan & credenti
210210
{
211211
ChipLogDetail(DeviceLayer, "Connecting to WiFi network: %*s", ssid.size(), ssid.data());
212212

213-
mHandling.mOnConnectionSuccess = handling.mOnConnectionSuccess;
214-
mHandling.mOnConnectionFailed = handling.mOnConnectionFailed;
215-
mHandling.mConnectionTimeout = handling.mConnectionTimeout;
213+
mHandling.mOnConnectionDone = handling.mOnConnectionDone;
214+
mHandling.mConnectionTimeout = handling.mConnectionTimeout;
216215

217216
mWiFiState = WIFI_STATE_ASSOCIATING;
218217

@@ -343,11 +342,10 @@ void WiFiManager::ScanDoneHandler(Platform::UniquePtr<uint8_t> data)
343342
{
344343
CHIP_ERROR err = SystemLayer().ScheduleLambda([capturedData = data.get()] {
345344
Platform::UniquePtr<uint8_t> safePtr(capturedData);
346-
uint8_t * rawData = safePtr.get();
347-
const wifi_status * status = reinterpret_cast<const wifi_status *>(rawData);
348-
WiFiRequestStatus requestStatus = static_cast<WiFiRequestStatus>(status->status);
345+
uint8_t * rawData = safePtr.get();
346+
const wifi_status * status = reinterpret_cast<const wifi_status *>(rawData);
349347

350-
if (requestStatus == WiFiRequestStatus::FAILURE)
348+
if (status->status)
351349
{
352350
ChipLogError(DeviceLayer, "Wi-Fi scan finalization failure (%d)", status->status);
353351
}
@@ -358,7 +356,7 @@ void WiFiManager::ScanDoneHandler(Platform::UniquePtr<uint8_t> data)
358356

359357
if (Instance().mScanDoneCallback && !Instance().mInternalScan)
360358
{
361-
Instance().mScanDoneCallback(requestStatus);
359+
Instance().mScanDoneCallback(*status);
362360
// restore the connection state from before the scan request was issued
363361
Instance().mWiFiState = Instance().mCachedWiFiState;
364362
return;
@@ -379,13 +377,13 @@ void WiFiManager::ScanDoneHandler(Platform::UniquePtr<uint8_t> data)
379377

380378
Instance().mWiFiState = WIFI_STATE_ASSOCIATING;
381379

382-
if (net_mgmt(NET_REQUEST_WIFI_CONNECT, Instance().mNetIf, &(Instance().mWiFiParams.mParams),
383-
sizeof(wifi_connect_req_params)))
380+
if (int connStatus = net_mgmt(NET_REQUEST_WIFI_CONNECT, Instance().mNetIf, &(Instance().mWiFiParams.mParams),
381+
sizeof(wifi_connect_req_params)))
384382
{
385383
ChipLogError(DeviceLayer, "Connection request failed");
386-
if (Instance().mHandling.mOnConnectionFailed)
384+
if (Instance().mHandling.mOnConnectionDone)
387385
{
388-
Instance().mHandling.mOnConnectionFailed();
386+
Instance().mHandling.mOnConnectionDone(connStatus);
389387
}
390388
Instance().mWiFiState = WIFI_STATE_DISCONNECTED;
391389
return;
@@ -424,15 +422,14 @@ void WiFiManager::ConnectHandler(Platform::UniquePtr<uint8_t> data)
424422
Platform::UniquePtr<uint8_t> safePtr(capturedData);
425423
uint8_t * rawData = safePtr.get();
426424
const wifi_status * status = reinterpret_cast<const wifi_status *>(rawData);
427-
WiFiRequestStatus requestStatus = static_cast<WiFiRequestStatus>(status->status);
428425

429-
if (requestStatus == WiFiRequestStatus::FAILURE || requestStatus == WiFiRequestStatus::TERMINATED)
426+
if (status->status)
430427
{
431428
ChipLogProgress(DeviceLayer, "Connection to WiFi network failed or was terminated by another request");
432429
Instance().mWiFiState = WIFI_STATE_DISCONNECTED;
433-
if (Instance().mHandling.mOnConnectionFailed)
430+
if (Instance().mHandling.mOnConnectionDone)
434431
{
435-
Instance().mHandling.mOnConnectionFailed();
432+
Instance().mHandling.mOnConnectionDone(status->status);
436433
}
437434
}
438435
else // The connection has been established successfully.
@@ -444,9 +441,9 @@ void WiFiManager::ConnectHandler(Platform::UniquePtr<uint8_t> data)
444441

445442
ChipLogProgress(DeviceLayer, "Connected to WiFi network");
446443
Instance().mWiFiState = WIFI_STATE_COMPLETED;
447-
if (Instance().mHandling.mOnConnectionSuccess)
444+
if (Instance().mHandling.mOnConnectionDone)
448445
{
449-
Instance().mHandling.mOnConnectionSuccess();
446+
Instance().mHandling.mOnConnectionDone(status->status);
450447
}
451448
Instance().PostConnectivityStatusChange(kConnectivity_Established);
452449

src/platform/nrfconnect/wifi/WiFiManager.h

+3-11
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,9 @@ class Map
8888
class WiFiManager
8989
{
9090
public:
91-
enum WiFiRequestStatus : int
92-
{
93-
SUCCESS = 0,
94-
FAILURE = 1,
95-
TERMINATED = 2
96-
};
97-
9891
using ScanResultCallback = void (*)(const NetworkCommissioning::WiFiScanResponse &);
99-
using ScanDoneCallback = void (*)(WiFiRequestStatus);
100-
using ConnectionCallback = void (*)();
92+
using ScanDoneCallback = void (*)(const wifi_status &);
93+
using ConnectionCallback = void (*)(int);
10194

10295
enum class StationStatus : uint8_t
10396
{
@@ -120,8 +113,7 @@ class WiFiManager
120113

121114
struct ConnectionHandling
122115
{
123-
ConnectionCallback mOnConnectionSuccess{};
124-
ConnectionCallback mOnConnectionFailed{};
116+
ConnectionCallback mOnConnectionDone{};
125117
System::Clock::Seconds32 mConnectionTimeout{};
126118
};
127119

0 commit comments

Comments
 (0)