Skip to content

Commit

Permalink
Merge branch 'rdkcentral:develop' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
cmuhammedrafi authored Dec 6, 2024
2 parents 36d3660 + bf871b9 commit 4d34123
Show file tree
Hide file tree
Showing 8 changed files with 271 additions and 65 deletions.
25 changes: 23 additions & 2 deletions LegacyPlugin_WiFiManagerAPIs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -544,13 +544,31 @@ namespace WPEFramework
returnJson(rc);
}

uint32_t WiFiManager::startScan(const JsonObject& parameters, JsonObject& response)
uint32_t WiFiManager::startScan(const JsonObject& parameters, JsonObject& response)
{
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();

if (parameters.HasLabel("ssid"))
{
string inputSSID = parameters["ssid"].String();
string ssid{};
vector<string> inputSSIDlist;
stringstream ssidStream(inputSSID);
while (getline(ssidStream, ssid, '|'))
{
inputSSIDlist.push_back(ssid);
}

ssids = (Core::Service<RPC::StringIterator>::Create<RPC::IStringIterator>(inputSSIDlist));
}

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

if (ssids)
ssids->Release();

returnJson(rc);
}

Expand Down
5 changes: 1 addition & 4 deletions NetworkManagerGnomeEvents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -617,7 +617,6 @@ namespace WPEFramework
return;
}
JsonArray ssidList = JsonArray();
string ssidListJson;
NMAccessPoint *ap = nullptr;
const GPtrArray *accessPoints = nm_device_wifi_get_access_points(wifiDevice);
for (guint i = 0; i < accessPoints->len; i++)
Expand All @@ -628,13 +627,11 @@ namespace WPEFramework
ssidList.Add(ssidObj);
}

ssidList.ToString(ssidListJson);
NMLOG_INFO("No of AP Available = %d", static_cast<int>(accessPoints->len));
//NMLOG_DEBUG("Scanned APIs are = %s",ssidListJson.c_str());

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

Expand Down
28 changes: 26 additions & 2 deletions NetworkManagerGnomeProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -528,10 +528,29 @@ 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
m_filterSsidslist.clear();
m_filterfrequency.clear();

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

if (!frequency.empty())
{
m_filterfrequency = frequency;
NMLOG_DEBUG("Scan SSIDs of frequency %s", m_filterfrequency.c_str());
}

nmEvent->setwifiScanOptions(true);
if(wifi->wifiScanRequest(frequency))
if(wifi->wifiScanRequest(m_filterfrequency))
rc = Core::ERROR_NONE;
return rc;
}
Expand Down Expand Up @@ -669,6 +688,11 @@ namespace WPEFramework
uint32_t NetworkManagerImplementation::StartWPS(const WiFiWPS& method /* @in */, const string& wps_pin /* @in */)
{
uint32_t rc = Core::ERROR_NONE;
if(method == WIFI_WPS_SERIALIZED_PIN || method == WIFI_WPS_PIN)
{
NMLOG_ERROR("WPS PIN method is not supported as of now");
return Core::ERROR_RPC_CALL_FAILED;
}
if(wifi->initiateWPS())
NMLOG_INFO ("startWPS success");
else
Expand Down
147 changes: 102 additions & 45 deletions NetworkManagerGnomeWIFI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -948,7 +948,6 @@ namespace WPEFramework
void wifiManager::wpsAction()
{
FILE *fp = nullptr;
std::ifstream configFile(WPA_SUPPLICANT_CONF);
std::string line = "";
std::string securityPattern = "key_mgmt=";
std::string ssidPattern = "ssid=";
Expand All @@ -960,16 +959,53 @@ namespace WPEFramework
gboolean wpsConnect = false;
struct timespec startTime = {}, endTime = {};
long timeDiff = 0;
int count = 0;
bool scanResult = false;
bool ssidFound = false;
const char* bssid = nullptr;
gboolean pbcFound = false;
const GPtrArray *aps;

if (!g_main_context_acquire(wpsContext))

if (!wpsContext || !g_main_context_acquire(wpsContext))
{
NMLOG_ERROR("Failed to acquire wpsContext");
return;
}

g_main_context_push_thread_default(wpsContext);

std::string wpaCliCommand = "wpa_cli -i " + std::string(nmUtils::wlanIface()) + " wps_pbc";
do{
sleep(10);
loop = g_main_loop_new(wpsContext, FALSE);
scanResult = wifiScanRequest("");
loop = g_main_loop_new(nmContext, FALSE);
if(scanResult)
{
aps = nm_device_wifi_get_access_points(NM_DEVICE_WIFI(getWifiDevice()));
for (guint i = 0; i < aps->len; i++) {
NMAccessPoint *ap = static_cast<NMAccessPoint *>(g_ptr_array_index(aps, i));
guint32 flags = nm_access_point_get_flags(ap);

if (flags & NM_802_11_AP_FLAGS_WPS_PBC)
{
bssid = nm_access_point_get_bssid(ap);
pbcFound = true;
break;
}
}
}
count++;
}while(count < 10 && !pbcFound && !wpsStop.load());

if(!pbcFound || wpsStop.load())
{
g_main_context_pop_thread_default(wpsContext);
g_main_context_release(wpsContext);
return;
}

std::string wpaCliCommand = "wpa_cli disconnect && wpa_cli -i " + std::string(nmUtils::wlanIface()) + " abort_scan && wpa_cli -i " + std::string(nmUtils::wlanIface()) + " bss_flush 0 && wpa_cli -i " + std::string(nmUtils::wlanIface()) + " wps_pbc " + std::string(bssid);
fp = popen(wpaCliCommand.c_str(), "r");
if (fp == nullptr)
{
Expand All @@ -993,13 +1029,16 @@ namespace WPEFramework
{
wpaCliResult += buffer.data();
}
pclose(fp);
wpsConnect = (wpaCliResult.find("wpa_state=COMPLETED") != std::string::npos);
clock_gettime(CLOCK_MONOTONIC, &endTime);
timeDiff = (endTime.tv_sec - startTime.tv_sec);
NMLOG_DEBUG("Time elapsed before getting wifi connected = %ld", timeDiff);
if(wpsConnect || timeDiff > 120)
if(wpsConnect || timeDiff > 20)
{
NMLOG_WARNING("WPS Connect status = %d; took %ld seconds", wpsConnect, (100 + timeDiff));
break;
pclose(fp);
}
sleep(5);
}

Expand All @@ -1010,7 +1049,10 @@ namespace WPEFramework
return;
}

count = 0;
while(count < 2 && !ssidFound)
{
std::ifstream configFile(WPA_SUPPLICANT_CONF);
if (!configFile.is_open())
{
NMLOG_ERROR("WPS connected with an SSID but not able to fetch IP address");
Expand All @@ -1021,22 +1063,9 @@ namespace WPEFramework

while (std::getline(configFile, line))
{
NMLOG_DEBUG("Attempting to read the configuration to populate SSID specific information");
size_t pos;

// Fetch security value
pos = line.find(securityPattern);
if (pos != std::string::npos)
{
pos += securityPattern.length();
size_t end = line.find(' ', pos);
if (end == std::string::npos)
{
end = line.length();
}
security = line.substr(pos, end - pos);
continue;
}

// Fetch ssid value
pos = line.find(ssidPattern);
if (pos != std::string::npos)
Expand All @@ -1048,37 +1077,64 @@ namespace WPEFramework
end = line.length();
}
ssid = line.substr(pos + 1, end - pos - 1);
ssidFound = true;
NMLOG_DEBUG("SSID found");
continue;
}

// Fetch passphare value
pos = line.find(passphrasePattern);
if (pos != std::string::npos)
{
pos += passphrasePattern.length();
size_t end = line.find('"', pos + 1);
if (end == std::string::npos)
if (ssidFound) {
// Fetch security value
pos = line.find(securityPattern);
if (pos != std::string::npos)
{
end = line.length();
pos += securityPattern.length();
size_t end = line.find(' ', pos);
if (end == std::string::npos)
{
end = line.length();
}
security = line.substr(pos, end - pos);
continue;
}
passphrase = line.substr(pos + 1, end - pos - 1);
continue;

// Fetch passphare value
pos = line.find(passphrasePattern);
if (pos != std::string::npos)
{
pos += passphrasePattern.length();
size_t end = line.find('"', pos + 1);
if (end == std::string::npos)
{
end = line.length();
}
passphrase = line.substr(pos + 1, end - pos - 1);
}
NMLOG_DEBUG("Fetched SSID = %s, security = %s", ssid.c_str(), security.c_str());
}
}

configFile.close();
wifiData.ssid = ssid;
wifiData.passphrase = passphrase;
if(security == "WPA-PSK")
wifiData.security = Exchange::INetworkManager::WIFISecurityMode::WIFI_SECURITY_WPA_PSK_AES;
else if(security == "WPA2-PSK")
wifiData.security = Exchange::INetworkManager::WIFISecurityMode::WIFI_SECURITY_WPA2_PSK_AES;
}
if(this->wifiConnect(wifiData))
NMLOG_INFO("WPS connected successfully");
else
NMLOG_ERROR("WPS connect failed");/* TODO: Need to disconnect the wpa_cli connection, as the libnm is not aware of the connection created by wpa_cli */

if(ssid.empty())
{
count++;
NMLOG_INFO("connected successfully; attempting to retrive SSID info to persist");
sleep(5);
}
else
{
wifiData.ssid = ssid;
wifiData.passphrase = passphrase;
if(security == "WPA-PSK")
wifiData.security = Exchange::INetworkManager::WIFISecurityMode::WIFI_SECURITY_WPA_PSK_AES;
else if(security == "WPA2-PSK")
wifiData.security = Exchange::INetworkManager::WIFISecurityMode::WIFI_SECURITY_WPA2_PSK_AES;
loop = g_main_loop_new(wpsContext, FALSE);
if(this->wifiConnect(wifiData))
NMLOG_INFO("NetworkManager updated with WPS status - connected successfully");
else
NMLOG_ERROR("NetworkManager is not able to sync up with underneath wpa_supplicant/hal regarding the WPS connect"); /* TODO: Need to disconnect the wpa_cli connection, as the libnm is not aware of the connection created by wpa_cli */
loop = g_main_loop_new(nmContext, FALSE);
}
}
g_main_context_pop_thread_default(wpsContext);
g_main_context_release(wpsContext);
if (wpsContext) {
Expand All @@ -1090,14 +1146,15 @@ namespace WPEFramework

bool wifiManager::initiateWPS()
{
if (!createClientNewConnection())
return false;

if(!wpsContext){
if (wpsThread.joinable()) {
wpsThread.join();
}
wpsContext = g_main_context_new();
if (!wpsContext) {
NMLOG_ERROR("Failed to create new main context for WPS");
return false;
}
wpsThread = std::thread(&wifiManager::wpsAction, this);
}
else
Expand Down
Loading

0 comments on commit 4d34123

Please sign in to comment.