Skip to content

Commit

Permalink
DELIA-66222,DELIA-66509: onAvailableSSIDs event not functioning corre…
Browse files Browse the repository at this point in the history
…ctly in the WiFi plugin

Reason for change: Added the SsidList & frequency filter logic during WifiStartScan
Test Procedure: Verify in custom build
Risks: None
Signed-off-by: Thamim Razith [email protected]
  • Loading branch information
tabbas651 committed Nov 27, 2024
1 parent 84ab5a6 commit 95978bd
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 14 deletions.
27 changes: 26 additions & 1 deletion LegacyPlugin_WiFiManagerAPIs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -546,9 +546,31 @@ namespace WPEFramework
{
LOG_INPARAM();
uint32_t rc = Core::ERROR_GENERAL;
string frequency = parameters["frequency"].String();
string frequency{};
Exchange::INetworkManager::IStringIterator* ssids = NULL;


if (parameters.HasLabel("frequency"))
{
frequency = parameters["frequency"].String();
NMLOG_INFO("Received frequency string : %s", frequency.c_str());
}
else
{
NMLOG_INFO("No frequency provided. Proceeding without frequency filtering.");
}

if (parameters.HasLabel("ssid"))
{
string tmpssid = parameters["ssid"].String();
NMLOG_INFO("Provided SSID value : %s", tmpssid.c_str());
ssids = (Core::Service<RPC::StringIterator>::Create<RPC::IStringIterator>(tmpssid));
}
else
{
NMLOG_INFO("No SSIDs provided. Proceeding without SSID filtering.");
}

auto _nwmgr = m_service->QueryInterfaceByCallsign<Exchange::INetworkManager>(NETWORK_MANAGER_CALLSIGN);
if (_nwmgr)
{
Expand All @@ -558,6 +580,9 @@ namespace WPEFramework
else
rc = Core::ERROR_UNAVAILABLE;

if (ssids)
ssids->Release();

returnJson(rc);
}

Expand Down
2 changes: 1 addition & 1 deletion NetworkManagerGnomeEvents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -634,7 +634,7 @@ namespace WPEFramework

if(_nmEventInstance->doScanNotify) {
_nmEventInstance->doScanNotify = false;
_instance->ReportAvailableSSIDs(ssidListJson);
_instance->ReportAvailableSSIDs(ssidList);
}
}

Expand Down
26 changes: 24 additions & 2 deletions NetworkManagerGnomeProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -650,10 +650,32 @@ namespace WPEFramework
uint32_t NetworkManagerImplementation::StartWiFiScan(const string& frequency /* @in */, IStringIterator* const ssids/* @in */)
{
uint32_t rc = Core::ERROR_RPC_CALL_FAILED;
(void) ssids;

//Cleared the Existing Store filterred SSID list
scanForSsidslist.clear();

if(ssids)
{
string tmpssidlist{};
while (ssids->Next(tmpssidlist) == true)
{
scanForSsidslist.push_back(tmpssidlist.c_str());
}
}

if (frequency.empty())
{
NMLOG_INFO("No frequency provided. Proceeding without frequency filtering.");
scanForFreq.clear();
}
else
{
scanForFreq = frequency;
NMLOG_INFO("Frequency set for scanning: %s", scanForFreq.c_str());
}

nmEvent->setwifiScanOptions(true);
if(wifi->wifiScanRequest(frequency))
if(wifi->wifiScanRequest(scanForFreq))
rc = Core::ERROR_NONE;
return rc;
}
Expand Down
63 changes: 62 additions & 1 deletion NetworkManagerImplementation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,61 @@ namespace WPEFramework
return;
}


void NetworkManagerImplementation::filterScanResults(JsonArray &ssids)
{
JsonArray result;
double inputFreq = 0.0;
std::unordered_set<std::string> scanForSsidsSet(scanForSsidslist.begin(), scanForSsidslist.end());

NMLOG_INFO("User Provided Frequency: %s\n", scanForFreq.c_str());

// If neither SSID list nor frequency is provided, exit
if (scanForSsidslist.empty() && scanForFreq.empty())
{
NMLOG_INFO("Neither SSID nor Frequency is provided. Exiting function.");
return;
}

// Convert user-provided scanForFreq to double for comparison
if (!scanForFreq.empty())
{
inputFreq = std::stod(scanForFreq);
NMLOG_INFO("Frequency provided: %lf\n", inputFreq);
}

NMLOG_INFO(" Frequency: %s\n", scanForFreq.c_str());

for (int i = 0; i < ssids.Length(); i++)
{
JsonObject object = ssids[i].Object();
string ssid = object["ssid"].String();
string frequency = object["frequency"].String();

NMLOG_INFO("Processing SSID: %s, Frequency: %s\n", ssid.c_str(), frequency.c_str());

double frequencyValue = std::stod(frequency);

//Debug to print log
NMLOG_INFO("Processing Frequency after double conversion: %lf\n", frequencyValue);

bool ssidMatches = scanForSsidsSet.empty() || scanForSsidsSet.find(ssid) != scanForSsidsSet.end();
bool freqMatches = scanForFreq.empty() || (inputFreq == frequencyValue);

if (ssidMatches && freqMatches)
{
result.Add(object);
NMLOG_INFO("Match found: SSID = %s, Frequency = %lf\n", ssid.c_str(), frequencyValue);
}
else
{
NMLOG_INFO("No match: SSID = %s, Frequency = %lf\n", ssid.c_str(), frequencyValue);
}
}
ssids = result;
NMLOG_INFO("Filtered %d SSIDs.", ssids.Length());
}

// WiFi Specific Methods
/* @brief Initiate a WIFI Scan; This is Async method and returns the scan results as Event */
uint32_t NetworkManagerImplementation::GetSupportedSecurityModes(ISecurityModeIterator*& securityModes /* @out */) const
Expand Down Expand Up @@ -570,9 +625,15 @@ namespace WPEFramework
_notificationLock.Unlock();
}

void NetworkManagerImplementation::ReportAvailableSSIDs(const string jsonOfWiFiScanResults)
void NetworkManagerImplementation::ReportAvailableSSIDs(JsonArray &arrayofWiFiScanResults)
{
_notificationLock.Lock();

string jsonOfWiFiScanResults;
filterScanResults(arrayofWiFiScanResults);

arrayofWiFiScanResults.ToString(jsonOfWiFiScanResults);

NMLOG_INFO("Posting onAvailableSSIDs result is, %s", jsonOfWiFiScanResults.c_str());
for (const auto callback : _notificationCallbacks) {
callback->onAvailableSSIDs(jsonOfWiFiScanResults);
Expand Down
8 changes: 6 additions & 2 deletions NetworkManagerImplementation.h
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ namespace WPEFramework
void ReportActiveInterfaceChange(const string prevActiveInterface, const string currentActiveinterface);
void ReportIPAddressChange(const string interface, const string ipversion, const string ipaddress, const Exchange::INetworkManager::IPStatus status);
void ReportInternetStatusChange(const Exchange::INetworkManager::InternetStatus prevState, const Exchange::INetworkManager::InternetStatus currState);
void ReportAvailableSSIDs(const string jsonOfScanResults);
void ReportAvailableSSIDs(JsonArray &arrayofWiFiScanResults);
void ReportWiFiStateChange(const Exchange::INetworkManager::WiFiState state);
void ReportWiFiSignalStrengthChange(const string ssid, const string strength, const Exchange::INetworkManager::WiFiSignalQuality quality);

Expand All @@ -227,6 +227,7 @@ namespace WPEFramework
void retryIarmEventRegistration();
void threadEventRegistration();
void executeExternally(NetworkEvents event, const string commandToExecute, string& response);
void filterScanResults(JsonArray &ssids);

private:
std::list<Exchange::INetworkManager::INotification *> _notificationCallbacks;
Expand All @@ -239,7 +240,10 @@ namespace WPEFramework
uint16_t m_stunBindTimeout;
uint16_t m_stunCacheTimeout;
std::thread m_registrationThread;
public:
string scanForFreq;
std::vector<std::string> scanForSsidslist;

public:
WiFiSignalStrengthMonitor m_wifiSignalMonitor;
mutable ConnectivityMonitor connectivityMonitor;
};
Expand Down
43 changes: 41 additions & 2 deletions NetworkManagerJsonRpc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -670,14 +670,53 @@ namespace WPEFramework
{
LOG_INPARAM();
uint32_t rc = Core::ERROR_GENERAL;
string frequency = parameters["frequency"].String();
Exchange::INetworkManager::IStringIterator* ssids = NULL;
string frequency{};
Exchange::INetworkManager::IStringIterator* ssids = NULL;

if (parameters.HasLabel("frequency"))
{
frequency = parameters["frequency"].String();
NMLOG_INFO("Received frequency string : %s", frequency.c_str());
}
else
{
NMLOG_INFO("No frequency provided. Proceeding without frequency filtering.");
}

if (parameters.HasLabel("ssids"))
{
JsonArray array = parameters["ssids"].Array();
std::vector<std::string> tmpssidslist;
JsonArray::Iterator index(array.Elements());

while (index.Next() == true)
{
if (Core::JSON::Variant::type::STRING == index.Current().Content())
{
tmpssidslist.push_back(index.Current().String().c_str());
}
else
{
NMLOG_DEBUG("Unexpected variant type in SSID array.");
returnJson(rc);
}
}
ssids = (Core::Service<RPC::StringIterator>::Create<RPC::IStringIterator>(tmpssidslist));
}
else
{
NMLOG_INFO("No SSIDs provided. Proceeding without SSID filtering.");
}

if (_networkManager)
rc = _networkManager->StartWiFiScan(frequency, ssids);
else
rc = Core::ERROR_UNAVAILABLE;

if (ssids)
ssids->Release();


returnJson(rc);
}

Expand Down
29 changes: 24 additions & 5 deletions NetworkManagerRDKProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -505,10 +505,8 @@ namespace WPEFramework
}

JsonArray ssids = eventDocument["getAvailableSSIDs"].Array();
string json;
ssids.ToString(json);

::_instance->ReportAvailableSSIDs(json);
::_instance->ReportAvailableSSIDs(ssids);
break;
}
case IARM_BUS_WIFI_MGR_EVENT_onWIFIStateChanged:
Expand Down Expand Up @@ -1027,8 +1025,29 @@ const string CIDR_PREFIXES[CIDR_NETMASK_IP_LEN+1] = {
IARM_Bus_WiFiSrvMgr_SsidList_Param_t param;
IARM_Result_t retVal = IARM_RESULT_SUCCESS;

(void)ssids;
(void) frequency;
//Cleared the Existing Store filterred SSID list
scanForSsidslist.clear();

if(ssids)
{
string tmpssidlist{};
while (ssids->Next(tmpssidlist) == true)
{
scanForSsidslist.push_back(tmpssidlist.c_str());
NMLOG_INFO("SSID added to scanForSsidslist: %s", tmpssidlist.c_str());
}
}

if (frequency.empty())
{
NMLOG_INFO("No frequency provided. Proceeding without frequency filtering.");
scanForFreq.clear();
}
else
{
scanForFreq = frequency;
NMLOG_INFO("Frequency set for scanning: %s", scanForFreq.c_str());
}

memset(&param, 0, sizeof(param));

Expand Down

0 comments on commit 95978bd

Please sign in to comment.