Skip to content

Commit

Permalink
RDKE-352 - Fixed WPS issue with EPG on factory reset (rdkcentral#54)
Browse files Browse the repository at this point in the history
* RDKE-352 - Fixed WPS issue with EPG on factory reset

Reason for change: Fixed WPS issue with EPG on factory reset
Test Procedure: Verify the WPS functionality with EPG on factory reset
Risks: Medium
Priority: P0
Signed-off-by: Gururaaja ESR <[email protected]>
  • Loading branch information
gururaajar authored and karuna2git committed Dec 11, 2024
1 parent d98437c commit 1185adf
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 45 deletions.
5 changes: 5 additions & 0 deletions NetworkManagerGnomeProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,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

0 comments on commit 1185adf

Please sign in to comment.