From 74caa8d3c3df1217b2fcdf76e3153a7cc0943bc4 Mon Sep 17 00:00:00 2001 From: RAFI <103924677+cmuhammedrafi@users.noreply.github.com> Date: Tue, 11 Nov 2025 21:51:16 +0530 Subject: [PATCH 01/15] RDKEMW-9930: After reboot with WiFi toggle OFF, device fails to scan (#244) * RDKEMW-9930: After reboot with WiFi toggle OFF, device fails to scan Signed-off-by: Muhammed Rafi c --- plugin/gnome/NetworkManagerGnomeEvents.cpp | 32 ++++++++++++++-------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/plugin/gnome/NetworkManagerGnomeEvents.cpp b/plugin/gnome/NetworkManagerGnomeEvents.cpp index 39db2ca5..dea7c5ef 100644 --- a/plugin/gnome/NetworkManagerGnomeEvents.cpp +++ b/plugin/gnome/NetworkManagerGnomeEvents.cpp @@ -335,9 +335,11 @@ namespace WPEFramework std::string ifname = nm_device_get_iface(device); if(ifname == nmUtils::wlanIface()) { GnomeNetworkManagerEvents::onInterfaceStateChangeCb(Exchange::INetworkManager::INTERFACE_ADDED, nmUtils::wlanIface()); + NMLOG_INFO("WIFI device added: %s", ifname.c_str()); } else if(ifname == nmUtils::ethIface()) { GnomeNetworkManagerEvents::onInterfaceStateChangeCb(Exchange::INetworkManager::INTERFACE_ADDED, nmUtils::ethIface()); + NMLOG_INFO("ETHERNET device added: %s", ifname.c_str()); } /* ip events added only for eth0 and wlan0 */ @@ -376,10 +378,12 @@ namespace WPEFramework if(ifname == nmUtils::wlanIface()) { GnomeNetworkManagerEvents::onInterfaceStateChangeCb(Exchange::INetworkManager::INTERFACE_REMOVED, nmUtils::wlanIface()); g_signal_handlers_disconnect_by_func(device, (gpointer)GnomeNetworkManagerEvents::deviceStateChangeCb, nmEvents); + NMLOG_INFO("WIFI device removed: %s", ifname.c_str()); } else if(ifname == nmUtils::ethIface()) { GnomeNetworkManagerEvents::onInterfaceStateChangeCb(Exchange::INetworkManager::INTERFACE_REMOVED, nmUtils::ethIface()); g_signal_handlers_disconnect_by_func(device, (gpointer)GnomeNetworkManagerEvents::deviceStateChangeCb, nmEvents); + NMLOG_INFO("ETHERNET device removed: %s", ifname.c_str()); } } @@ -445,35 +449,41 @@ namespace WPEFramework if((ifname == nmUtils::ethIface()) || (ifname == nmUtils::wlanIface())) { NMDeviceState devState = nm_device_get_state(device); - // NM_DEVICE_STATE_UNAVAILABLE can occur for an Ethernet interface when it is disconnected (e.g., no cable connected). - bool isDeviceEnabled = devState >= NM_DEVICE_STATE_UNAVAILABLE && devState <= NM_DEVICE_STATE_ACTIVATED; - if(!isDeviceEnabled) + + if(devState > NM_DEVICE_STATE_DISCONNECTED && devState <= NM_DEVICE_STATE_ACTIVATED) { - NMLOG_WARNING("device %s is not enabled, So no event monitor", ifname.c_str()); - continue; + // posting device state change event if interface already connected + GnomeNetworkManagerEvents::deviceStateChangeCb(device, nullptr, nullptr); } - GnomeNetworkManagerEvents::deviceStateChangeCb(device, nullptr, nullptr); //posting event if interface already connected + + /* Register device state change event */ g_signal_connect(device, "notify::" NM_DEVICE_STATE, G_CALLBACK(GnomeNetworkManagerEvents::deviceStateChangeCb), nmEvents); + if(NM_IS_DEVICE_WIFI(device)) { + nmEvents->wifiDevice = NM_DEVICE_WIFI(device); + g_signal_connect(nmEvents->wifiDevice, "notify::" NM_DEVICE_WIFI_LAST_SCAN, G_CALLBACK(GnomeNetworkManagerEvents::onAvailableSSIDsCb), nmEvents); + } + NMIPConfig *ipv4Config = nm_device_get_ip4_config(device); NMIPConfig *ipv6Config = nm_device_get_ip6_config(device); if (ipv4Config) { ip4ChangedCb(ipv4Config, NULL, device); // posting event if interface already connected g_signal_connect(ipv4Config, "notify::addresses", G_CALLBACK(ip4ChangedCb), device); } + else + NMLOG_WARNING("IPv4 config is null for device: %s, No IPv4 monitor", ifname.c_str()); if (ipv6Config) { ip6ChangedCb(ipv6Config, NULL, device); g_signal_connect(ipv6Config, "notify::addresses", G_CALLBACK(ip6ChangedCb), device); } - - if(NM_IS_DEVICE_WIFI(device)) { - nmEvents->wifiDevice = NM_DEVICE_WIFI(device); - g_signal_connect(nmEvents->wifiDevice, "notify::" NM_DEVICE_WIFI_LAST_SCAN, G_CALLBACK(GnomeNetworkManagerEvents::onAvailableSSIDsCb), nmEvents); - } + else + NMLOG_WARNING("IPv6 config is null for device: %s, No IPv6 monitor", ifname.c_str()); } else NMLOG_DEBUG("device type not eth/wifi %s", ifname.c_str()); } + else + NMLOG_WARNING("device error null"); } NMLOG_INFO("registered all networkmnager dbus events"); From d29dad22c49d04eb3a3039507151c5b484cb4df4 Mon Sep 17 00:00:00 2001 From: gururaajar <83449026+gururaajar@users.noreply.github.com> Date: Thu, 13 Nov 2025 09:07:50 -0500 Subject: [PATCH 02/15] RDKEMW-9254 - Request MfrMgr to Persist WiFi Settings from NetworkManager Plugin (#251) Reason for change: To save the wifi credentials to MfrMgr when the wifi connection is successful and remove the same when removeKnownSSID is called So that when migrating from RDKE to RDKV we will have the wifi configuration to connect Test Procedure: CDL upgrade to RDKV from RDKE and check the wifi connection persist Priority:P1 Risks: Medium Signed-off-by: Gururaaja ESR --- plugin/gnome/NetworkManagerGnomeWIFI.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugin/gnome/NetworkManagerGnomeWIFI.cpp b/plugin/gnome/NetworkManagerGnomeWIFI.cpp index f842f9ed..5c5dba0c 100644 --- a/plugin/gnome/NetworkManagerGnomeWIFI.cpp +++ b/plugin/gnome/NetworkManagerGnomeWIFI.cpp @@ -338,13 +338,6 @@ namespace WPEFramework NMLOG_WARNING("no active access point!; wifi device state: (%d)", deviceState); deleteClientConnection(); -#ifdef ENABLE_MIGRATION_MFRMGR_SUPPORT - NetworkManagerMfrManager* mfrManager = NetworkManagerMfrManager::getInstance(); - if (mfrManager != nullptr) - { - mfrManager->clearWiFiSettingsFromMfr(); - } -#endif return true; } @@ -1185,6 +1178,13 @@ namespace WPEFramework } deleteClientConnection(); +#ifdef ENABLE_MIGRATION_MFRMGR_SUPPORT + NetworkManagerMfrManager* mfrManager = NetworkManagerMfrManager::getInstance(); + if (mfrManager != nullptr) + { + mfrManager->clearWiFiSettingsFromMfr(); + } +#endif // ssid is specified and connection is not found return false // all other case return true, even if no wificonnection is found return((ssidSpecified && !connectionFound)? false : true); From d3d414b7f821678db253c910f44856827c868b6a Mon Sep 17 00:00:00 2001 From: gururaajar <83449026+gururaajar@users.noreply.github.com> Date: Thu, 13 Nov 2025 16:18:54 -0500 Subject: [PATCH 03/15] RDKEMW-10336 : Update GetWiFiSignalQuality to use SIGNAL_POLL (#254) * RDKEMW-10336 - Update GetWiFiSignalQuality to use BSS SIGNAL_POLL Reason for change: Update GetWiFiSignalQuality to use SIGNAL_POLL instead of BSS Test Procedure: Check the GetWiFiSignalQuality curl command Priority:P1 Risks: Medium Signed-off-by: Muhammed Rafi C --- plugin/NetworkManagerImplementation.cpp | 126 +++++++++++++-------- tests/l2Test/rdk/l2_test_rdkproxy.cpp | 51 ++++----- tests/l2Test/rdk/l2_test_rdkproxyEvent.cpp | 13 ++- 3 files changed, 109 insertions(+), 81 deletions(-) diff --git a/plugin/NetworkManagerImplementation.cpp b/plugin/NetworkManagerImplementation.cpp index 69b018bb..7634038a 100644 --- a/plugin/NetworkManagerImplementation.cpp +++ b/plugin/NetworkManagerImplementation.cpp @@ -26,7 +26,7 @@ using namespace NetworkManagerLogger; #define CIDR_NETMASK_IP_LEN 32 #define SSID_COMMAND "wpa_cli status" -#define BSS_COMMAND "wpa_cli bss" +#define SIGNAL_POLL_COMMAND "wpa_cli signal_poll" namespace WPEFramework { @@ -841,116 +841,152 @@ namespace WPEFramework /* The below implementation of GetWiFiSignalQuality is a temporary mitigation. Need to be revisited */ uint32_t NetworkManagerImplementation::GetWiFiSignalQuality(string& ssid /* @out */, string& strength /* @out */, string& noise /* @out */, string& snr /* @out */, WiFiSignalQuality& quality /* @out */) { - uint32_t rc = Core::ERROR_RPC_CALL_FAILED; - int16_t readSnr = 0; - - std::string key, value; - int16_t readNoise = 0; - string bssid{}; + std::string key{}, value{}, bssid{}, band{}; char buff[512] = {'\0'}; - FILE *fp = NULL; - /* SSID */ + /* Get BSSID and SSID from wpa_cli status */ fp = popen(SSID_COMMAND, "r"); if (!fp) { - NMLOG_ERROR("Failed in getting output from command %s",SSID_COMMAND); - return Core::ERROR_RPC_CALL_FAILED; + NMLOG_ERROR("Failed in getting output from command %s", SSID_COMMAND); + return Core::ERROR_GENERAL; } - while ((!feof(fp)) && (fgets(buff, sizeof (buff), fp) != NULL)) { + + while ((!feof(fp)) && (fgets(buff, sizeof (buff), fp) != NULL)) + { std::istringstream mystream(buff); if(std::getline(std::getline(mystream, key, '=') >> std::ws, value)) { - if (key == "bssid") { + if (key == "ssid") { + ssid = value; + } + else if (key == "bssid") { bssid = value; - break; } + if (!ssid.empty() && !bssid.empty()) + break; } } pclose(fp); - /* Noise n RSSI */ - std::string bssCommand = std::string(BSS_COMMAND) + " " + bssid; - fp = popen(bssCommand.c_str(), "r"); + /* If BSSID is empty, WiFi is disconnected */ + if (bssid.empty()) { + NMLOG_WARNING("WiFi is disconnected (BSSID is empty)"); + quality = WiFiSignalQuality::WIFI_SIGNAL_DISCONNECTED; + ssid = ""; + strength = "0"; + noise = "0"; + snr = "0"; + return Core::ERROR_NONE; + } + + /*Get real-time signal data from wpa_cli signal_poll */ + fp = popen(SIGNAL_POLL_COMMAND, "r"); if (!fp) { - NMLOG_ERROR("Failed in getting output from command %s",BSS_COMMAND); - return Core::ERROR_RPC_CALL_FAILED; + NMLOG_ERROR("Failed in getting output from command %s", SIGNAL_POLL_COMMAND); + return Core::ERROR_GENERAL; } + while ((!feof(fp)) && (fgets(buff, sizeof (buff), fp) != NULL)) { std::istringstream mystream(buff); if(std::getline(std::getline(mystream, key, '=') >> std::ws, value)) { - if (key == "level") { + if (key == "RSSI") { strength = value; } - else if (key == "noise") { + else if (key == "NOISE") { noise = value; } - else if (key == "ssid") { - ssid = value; + else if (key == "AVG_RSSI") { // if RSSI is not available + if (strength.empty()) + strength = value; } - else if (key == "snr") { - snr = value; + else if (key == "FREQUENCY") + { + if (!value.empty()) + { + int freq = std::stoi(value); + if (freq >= 2400 && freq < 5000) + band = "2.4GHz"; + else if (freq >= 5000 && freq < 6000) + band = "5GHz"; + else if (freq >= 6000) + band = "6GHz"; + else + band = "not known"; + } } - if (!strength.empty() && !noise.empty() && !ssid.empty() && !snr.empty()) - break; } } pclose(fp); - /* NOTE: The std::stoi() will throw exception if the string input is empty; so set to 0 */ if (noise.empty()) - noise= "0"; - if (snr.empty()) - snr = "0"; + noise = "0"; if (strength.empty()) strength = "0"; - readNoise = std::stoi(noise); - readSnr = std::stoi(snr); + int16_t readRssi = std::stoi(strength); + int16_t readNoise = std::stoi(noise); + + /* Check the RSSI is within range between -10 and -100 dbm*/ + if (readRssi >= 0 || readRssi < -100) { + NMLOG_WARNING("Received RSSI (%d dBm) is out of valid range (-10 to -100 dBm); Resetting to default", readRssi); + if (readRssi >= 0) { + readRssi = -10; + } + else if (readRssi < -100) { + readRssi = -100; + } + } /* Check the Noise is within range between 0 and -96 dbm*/ if((readNoise >= 0) || (readNoise < DEFAULT_NOISE)) { NMLOG_DEBUG("Received Noise (%d) from wifi driver is not valid; so clamping it", readNoise); if (readNoise >= 0) { + readNoise = 0; noise = std::to_string(0); } else if (readNoise < DEFAULT_NOISE) { + readNoise = DEFAULT_NOISE; noise = std::to_string(DEFAULT_NOISE); } } + /*Calculate SNR = RSSI - Noise */ + int16_t calculatedSnr = readRssi - readNoise; + snr = std::to_string(calculatedSnr); + /* mapping rssi value when the SNR value is not proper */ - if(!(readSnr > 0 && readSnr <= MAX_SNR_VALUE)) + if(!(calculatedSnr > 0 && calculatedSnr <= MAX_SNR_VALUE)) { - NMLOG_WARNING("Received SNR (%d) from wifi driver is not valid; Lets map with RSSI (%s)", readSnr, strength.c_str()); - readSnr = std::stoi(strength); + NMLOG_WARNING("calculated SNR (%d) is not valid; Lets map with RSSI (%s)", calculatedSnr, strength.c_str()); + calculatedSnr = std::stoi(strength); /* Take the absolute value */ - readSnr = (readSnr < 0) ? -readSnr : readSnr; + calculatedSnr = (calculatedSnr < 0) ? -calculatedSnr : calculatedSnr; - snr = std::to_string(readSnr); + snr = std::to_string(calculatedSnr); } - NMLOG_INFO("RSSI: %s dBm; Noise: %s dBm; SNR: %s dBm", strength.c_str(), noise.c_str(), snr.c_str()); + NMLOG_INFO("ssid=%s, bssid=%s, band=%s, rssi=%s, noise=%s, snr=%s", ssid.c_str(), bssid.c_str(), band.c_str(), strength.c_str(), noise.c_str(), snr.c_str()); - if (readSnr == 0) + if (calculatedSnr == 0) { quality = WiFiSignalQuality::WIFI_SIGNAL_DISCONNECTED; strength = "0"; } - else if (readSnr > 0 && readSnr < NM_WIFI_SNR_THRESHOLD_FAIR) + else if (calculatedSnr > 0 && calculatedSnr < NM_WIFI_SNR_THRESHOLD_FAIR) { quality = WiFiSignalQuality::WIFI_SIGNAL_WEAK; } - else if (readSnr > NM_WIFI_SNR_THRESHOLD_FAIR && readSnr < NM_WIFI_SNR_THRESHOLD_GOOD) + else if (calculatedSnr >= NM_WIFI_SNR_THRESHOLD_FAIR && calculatedSnr < NM_WIFI_SNR_THRESHOLD_GOOD) { quality = WiFiSignalQuality::WIFI_SIGNAL_FAIR; } - else if (readSnr > NM_WIFI_SNR_THRESHOLD_GOOD && readSnr < NM_WIFI_SNR_THRESHOLD_EXCELLENT) + else if (calculatedSnr >= NM_WIFI_SNR_THRESHOLD_GOOD && calculatedSnr < NM_WIFI_SNR_THRESHOLD_EXCELLENT) { quality = WiFiSignalQuality::WIFI_SIGNAL_GOOD; } @@ -959,9 +995,7 @@ namespace WPEFramework quality = WiFiSignalQuality::WIFI_SIGNAL_EXCELLENT; } - rc = Core::ERROR_NONE; - - return rc; + return Core::ERROR_NONE; } void NetworkManagerImplementation::processMonitor(uint16_t interval) diff --git a/tests/l2Test/rdk/l2_test_rdkproxy.cpp b/tests/l2Test/rdk/l2_test_rdkproxy.cpp index a0845dbf..d1b97ca9 100644 --- a/tests/l2Test/rdk/l2_test_rdkproxy.cpp +++ b/tests/l2Test/rdk/l2_test_rdkproxy.cpp @@ -1313,7 +1313,7 @@ TEST_F(NetworkManagerTest, GetWiFiSignalQualityWpa_cliFailed) TEST_F(NetworkManagerTest, GetWiFiSignalQualityDisconnected2) { EXPECT_CALL(*p_wrapsImplMock, popen(::testing::_, ::testing::_)) - .Times(2) + .Times(1) .WillOnce(::testing::Invoke( [&](const char* command, const char* type) -> FILE* { EXPECT_THAT(string(command), ::testing::MatchesRegex("wpa_cli status")); @@ -1328,16 +1328,6 @@ TEST_F(NetworkManagerTest, GetWiFiSignalQualityDisconnected2) rewind(tempFile); } return tempFile; - })) - .WillOnce(::testing::Invoke( - [&](const char* command, const char* type) -> FILE* { - EXPECT_THAT(string(command), ::testing::MatchesRegex("wpa_cli bss ")); - FILE* tempFile = tmpfile(); - if (tempFile) { - fputs("driver error", tempFile); - rewind(tempFile); - } - return tempFile; })); EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("GetWiFiSignalQuality"), _T("{}"), response)); @@ -1364,21 +1354,22 @@ TEST_F(NetworkManagerTest, GetWiFiSignalQualityConnected) })) .WillOnce(::testing::Invoke( [&](const char* command, const char* type) -> FILE* { - EXPECT_THAT(string(command), ::testing::MatchesRegex("wpa_cli bss aa:bb:cc:dd:ee:ff")); + EXPECT_THAT(string(command), ::testing::MatchesRegex("wpa_cli signal_poll")); FILE* tempFile = tmpfile(); if (tempFile) { fputs("Selected interface 'wlan0'\n" - "ssid=dummySSID\n" - "noise=-117\n" - "level=-49\n" - "snr=65\n", tempFile); + "RSSI=-30\n" + "LINKSPEED=300\n" + "NOISE=-114\n" + "FREQUENCY=2417\n" + "AVG_RSSI=-30\n", tempFile); rewind(tempFile); } return tempFile; })); EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("GetWiFiSignalQuality"), _T("{}"), response)); - EXPECT_EQ(response, _T("{\"ssid\":\"dummySSID\",\"quality\":\"Excellent\",\"snr\":\"65\",\"strength\":\"-49\",\"noise\":\"-96\",\"success\":true}")); + EXPECT_EQ(response, _T("{\"ssid\":\"dummySSID\",\"quality\":\"Excellent\",\"snr\":\"66\",\"strength\":\"-30\",\"noise\":\"-96\",\"success\":true}")); } TEST_F(NetworkManagerTest, GetWiFiSignalQualityConnectedGood) @@ -1401,21 +1392,22 @@ TEST_F(NetworkManagerTest, GetWiFiSignalQualityConnectedGood) })) .WillOnce(::testing::Invoke( [&](const char* command, const char* type) -> FILE* { - EXPECT_THAT(string(command), ::testing::MatchesRegex("wpa_cli bss aa:bb:cc:dd:ee:ff")); + EXPECT_THAT(string(command), ::testing::MatchesRegex("wpa_cli signal_poll")); FILE* tempFile = tmpfile(); if (tempFile) { fputs("Selected interface 'wlan0'\n" - "ssid=dummySSID\n" - "noise=-30\n" - "level=-90\n" - "snr=33\n", tempFile); + "RSSI=\n" + "LINKSPEED=300\n" + "NOISE=-114\n" + "FREQUENCY=2417\n" + "AVG_RSSI=-90\n", tempFile); rewind(tempFile); } return tempFile; })); EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("GetWiFiSignalQuality"), _T("{}"), response)); - EXPECT_EQ(response, _T("{\"ssid\":\"dummySSID\",\"quality\":\"Good\",\"snr\":\"33\",\"strength\":\"-90\",\"noise\":\"-30\",\"success\":true}")); + EXPECT_EQ(response, _T("{\"ssid\":\"dummySSID\",\"quality\":\"Weak\",\"snr\":\"6\",\"strength\":\"-90\",\"noise\":\"-96\",\"success\":true}")); } TEST_F(NetworkManagerTest, GetWiFiSignalQualityConnectedLowBad) @@ -1438,21 +1430,22 @@ TEST_F(NetworkManagerTest, GetWiFiSignalQualityConnectedLowBad) })) .WillOnce(::testing::Invoke( [&](const char* command, const char* type) -> FILE* { - EXPECT_THAT(string(command), ::testing::MatchesRegex("wpa_cli bss aa:bb:cc:dd:ee:ff")); + EXPECT_THAT(string(command), ::testing::MatchesRegex("wpa_cli signal_poll")); FILE* tempFile = tmpfile(); if (tempFile) { fputs("Selected interface 'wlan0'\n" - "ssid=dummySSID\n" - "noise=9999\n" - "level=-120\n" - "snr=33\n", tempFile); + "RSSI=\n" + "LINKSPEED=300\n" + "NOISE=9999\n" + "FREQUENCY=5462\n" + "AVG_RSSI=-120\n", tempFile); rewind(tempFile); } return tempFile; })); EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("GetWiFiSignalQuality"), _T("{}"), response)); - EXPECT_EQ(response, _T("{\"ssid\":\"dummySSID\",\"quality\":\"Good\",\"snr\":\"33\",\"strength\":\"-120\",\"noise\":\"0\",\"success\":true}")); + EXPECT_EQ(response, _T("{\"ssid\":\"dummySSID\",\"quality\":\"Excellent\",\"snr\":\"120\",\"strength\":\"-120\",\"noise\":\"0\",\"success\":true}")); } TEST_F(NetworkManagerTest, Trace_Success_ipv4) diff --git a/tests/l2Test/rdk/l2_test_rdkproxyEvent.cpp b/tests/l2Test/rdk/l2_test_rdkproxyEvent.cpp index 1b174a0b..89be4686 100644 --- a/tests/l2Test/rdk/l2_test_rdkproxyEvent.cpp +++ b/tests/l2Test/rdk/l2_test_rdkproxyEvent.cpp @@ -293,7 +293,7 @@ TEST_F(NetworkManagerEventTest, onWiFiStateChange) if (tempFile) { fputs("Selected interface 'wlan0'\n" "bssid=aa:bb:cc:dd:ee:ff\n" - "freq=5462\n" + "freq=2462\n" "ssid=dummySSID\n", tempFile); rewind(tempFile); } @@ -301,14 +301,15 @@ TEST_F(NetworkManagerEventTest, onWiFiStateChange) })) .WillOnce(::testing::Invoke( [&](const char* command, const char* type) -> FILE* { - EXPECT_THAT(string(command), ::testing::MatchesRegex("wpa_cli bss aa:bb:cc:dd:ee:ff")); + EXPECT_THAT(string(command), ::testing::MatchesRegex("wpa_cli signal_poll")); FILE* tempFile = tmpfile(); if (tempFile) { fputs("Selected interface 'wlan0'\n" - "ssid=dummySSID\n" - "noise=-114\n" - "level=-90\n" - "snr=33\n", tempFile); + "RSSI=-30\n" + "LINKSPEED=300\n" + "NOISE=-114\n" + "FREQUENCY=2417\n" + "AVG_RSSI=-30\n", tempFile); rewind(tempFile); } return tempFile; From 3aa52e19e2cabdcc400fd17bbaf4ce4d4612ceab Mon Sep 17 00:00:00 2001 From: Karunakaran A Date: Thu, 13 Nov 2025 16:30:20 -0500 Subject: [PATCH 04/15] Release of 1.7.0 Release of 1.7.0 --- CHANGELOG.md | 6 ++++++ CMakeLists.txt | 2 +- definition/NetworkManager.json | 2 +- docs/NetworkManagerPlugin.md | 4 ++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cf9af89..d35758df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,12 @@ All notable changes to this RDK Service will be documented in this file. * Changes in CHANGELOG should be updated when commits are added to the main or release branches. There should be one CHANGELOG entry per JIRA Ticket. This is not enforced on sprint branches since there could be multiple changes for the same JIRA ticket during development. +## [1.7.0] - 2025-11-13 +### Fixed +- Fixed bug MfrMgr Integration +- Subscribed to WiFi Events even when the device boots with wifi disabled +- Fixed the WiFi signal monitoring as the reporred RSSI was stale data + ## [1.6.0] - 2025-10-31 ### Added - Integrated MfrMgr to persist WiFi Credential for DRI & Rollback to RDK-V Backend diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ea85ed5..ad7109ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ find_package(WPEFramework) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") set(VERSION_MAJOR 1) -set(VERSION_MINOR 6) +set(VERSION_MINOR 7) set(VERSION_PATCH 0) add_compile_definitions(NETWORKMANAGER_MAJOR_VERSION=${VERSION_MAJOR}) diff --git a/definition/NetworkManager.json b/definition/NetworkManager.json index 7b819ffc..bec40206 100644 --- a/definition/NetworkManager.json +++ b/definition/NetworkManager.json @@ -9,7 +9,7 @@ "status": "production", "description": "A Unified `NetworkManager` plugin that allows you to manage Ethernet and Wifi interfaces on the device.", "sourcelocation": "https://github.com/rdkcentral/networkmanager/blob/main/definition/NetworkManager.json", - "version": "1.6.0" + "version": "1.7.0" }, "definitions": { "success": { diff --git a/docs/NetworkManagerPlugin.md b/docs/NetworkManagerPlugin.md index 5764c645..74329490 100644 --- a/docs/NetworkManagerPlugin.md +++ b/docs/NetworkManagerPlugin.md @@ -2,7 +2,7 @@ # NetworkManager Plugin -**Version: 1.6.0** +**Version: 1.7.0** **Status: :black_circle::black_circle::black_circle:** @@ -23,7 +23,7 @@ org.rdk.NetworkManager interface for Thunder framework. ## Scope -This document describes purpose and functionality of the org.rdk.NetworkManager interface (version 1.6.0). It includes detailed specification about its methods provided and notifications sent. +This document describes purpose and functionality of the org.rdk.NetworkManager interface (version 1.7.0). It includes detailed specification about its methods provided and notifications sent. ## Case Sensitivity From ff027620fd1307c8c566091d2e7089570b9d6145 Mon Sep 17 00:00:00 2001 From: gururaajar <83449026+gururaajar@users.noreply.github.com> Date: Fri, 14 Nov 2025 14:08:21 -0500 Subject: [PATCH 05/15] RDKEMW-10529 : Do not Print Personal information about WIFI (#255) Reason for change: Removed printing of wifi password from mfr migration changes Test Procedure: Check the log for wifi credentials Priority:P1 Risks: Medium Signed-off-by: Gururaaja ESR --- plugin/gnome/NetworkManagerGnomeMfrMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/gnome/NetworkManagerGnomeMfrMgr.cpp b/plugin/gnome/NetworkManagerGnomeMfrMgr.cpp index b9e5cc29..0a2d0d20 100644 --- a/plugin/gnome/NetworkManagerGnomeMfrMgr.cpp +++ b/plugin/gnome/NetworkManagerGnomeMfrMgr.cpp @@ -282,7 +282,7 @@ namespace WPEFramework setParam.wifiCredentials.iSecurityMode = securityMode; setParam.requestType = WIFI_SET_CREDENTIALS; - NMLOG_INFO(" Set Params param.requestType = %d, param.wifiCredentials.cSSID = %s, param.wifiCredentials.cPassword = %s, param.wifiCredentials.iSecurityMode = %d", setParam.requestType, setParam.wifiCredentials.cSSID, setParam.wifiCredentials.cPassword, setParam.wifiCredentials.iSecurityMode); + NMLOG_INFO(" Set Params param.requestType = %d, param.wifiCredentials.cSSID = %s, param.wifiCredentials.iSecurityMode = %d", setParam.requestType, setParam.wifiCredentials.cSSID, setParam.wifiCredentials.iSecurityMode); // Make IARM Bus call to save credentials ret = IARM_Bus_Call(IARM_BUS_MFRLIB_NAME, IARM_BUS_MFRLIB_API_WIFI_Credentials, (void*)&setParam, sizeof(setParam)); From d5ec98e98ee7110c52d0eb634617756885f31a74 Mon Sep 17 00:00:00 2001 From: Karunakaran A Date: Fri, 14 Nov 2025 14:11:27 -0500 Subject: [PATCH 06/15] Release of 1.8.0 Release of 1.8.0 --- CHANGELOG.md | 4 ++++ CMakeLists.txt | 2 +- definition/NetworkManager.json | 2 +- docs/NetworkManagerPlugin.md | 4 ++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d35758df..9354b7c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ All notable changes to this RDK Service will be documented in this file. * Changes in CHANGELOG should be updated when commits are added to the main or release branches. There should be one CHANGELOG entry per JIRA Ticket. This is not enforced on sprint branches since there could be multiple changes for the same JIRA ticket during development. +## [1.8.0] - 2025-11-14 +### Fixed +- Removed logging of WiFi PII information + ## [1.7.0] - 2025-11-13 ### Fixed - Fixed bug MfrMgr Integration diff --git a/CMakeLists.txt b/CMakeLists.txt index ad7109ff..9f8e3e91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ find_package(WPEFramework) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") set(VERSION_MAJOR 1) -set(VERSION_MINOR 7) +set(VERSION_MINOR 8) set(VERSION_PATCH 0) add_compile_definitions(NETWORKMANAGER_MAJOR_VERSION=${VERSION_MAJOR}) diff --git a/definition/NetworkManager.json b/definition/NetworkManager.json index bec40206..b3e40bcb 100644 --- a/definition/NetworkManager.json +++ b/definition/NetworkManager.json @@ -9,7 +9,7 @@ "status": "production", "description": "A Unified `NetworkManager` plugin that allows you to manage Ethernet and Wifi interfaces on the device.", "sourcelocation": "https://github.com/rdkcentral/networkmanager/blob/main/definition/NetworkManager.json", - "version": "1.7.0" + "version": "1.8.0" }, "definitions": { "success": { diff --git a/docs/NetworkManagerPlugin.md b/docs/NetworkManagerPlugin.md index 74329490..17eb8d9b 100644 --- a/docs/NetworkManagerPlugin.md +++ b/docs/NetworkManagerPlugin.md @@ -2,7 +2,7 @@ # NetworkManager Plugin -**Version: 1.7.0** +**Version: 1.8.0** **Status: :black_circle::black_circle::black_circle:** @@ -23,7 +23,7 @@ org.rdk.NetworkManager interface for Thunder framework. ## Scope -This document describes purpose and functionality of the org.rdk.NetworkManager interface (version 1.7.0). It includes detailed specification about its methods provided and notifications sent. +This document describes purpose and functionality of the org.rdk.NetworkManager interface (version 1.8.0). It includes detailed specification about its methods provided and notifications sent. ## Case Sensitivity From daace3f1ca91262140c9f616ccbbff4f35d718a1 Mon Sep 17 00:00:00 2001 From: DevikaJaladi <155776845+DevikaJaladi@users.noreply.github.com> Date: Wed, 19 Nov 2025 10:39:42 -0500 Subject: [PATCH 07/15] RDKEMW-10660: Adding T1 logging for ap_info_split details (#258) Reason for change: Added temporary log line for T1 to get ap_info details Test Procedure: Run grep for "bssid=" in wpeframework.log and check format should be "bssid=7a:9c:8e:13:7c:ac,ssid=Modukuru7205,rssi=-49,phyrate=1200,noise=-114,Band=5GHz" Priority:P1 Risks: Medium --- plugin/NetworkManagerImplementation.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugin/NetworkManagerImplementation.cpp b/plugin/NetworkManagerImplementation.cpp index 7634038a..ef3165a4 100644 --- a/plugin/NetworkManagerImplementation.cpp +++ b/plugin/NetworkManagerImplementation.cpp @@ -889,6 +889,7 @@ namespace WPEFramework return Core::ERROR_GENERAL; } + std::string linkSpeed; while ((!feof(fp)) && (fgets(buff, sizeof (buff), fp) != NULL)) { std::istringstream mystream(buff); @@ -918,6 +919,10 @@ namespace WPEFramework else band = "not known"; } + } + else if (key == "LINKSPEED") + { + linkSpeed = value; } } } @@ -971,7 +976,8 @@ namespace WPEFramework snr = std::to_string(calculatedSnr); } - NMLOG_INFO("ssid=%s, bssid=%s, band=%s, rssi=%s, noise=%s, snr=%s", ssid.c_str(), bssid.c_str(), band.c_str(), strength.c_str(), noise.c_str(), snr.c_str()); + NMLOG_INFO("SSID:%s, BSSID:%s, Band:%s, RSSI:%s, Noise:%s, SNR:%s", ssid.c_str(), bssid.c_str(), band.c_str(), strength.c_str(), noise.c_str(), snr.c_str()); + NMLOG_INFO("bssid=%s,ssid=%s,rssi=%s,phyrate=%s,noise=%s,Band=%s", bssid.c_str(), ssid.c_str(), strength.c_str(), linkSpeed.c_str(), noise.c_str(), band.c_str()); if (calculatedSnr == 0) { From d9f2ffcad2271ecbce135d8f60ef16983bfedc64 Mon Sep 17 00:00:00 2001 From: Karunakaran A Date: Fri, 21 Nov 2025 11:27:11 -0500 Subject: [PATCH 08/15] Release of 1.9.0 Release of 1.9.0 --- CHANGELOG.md | 4 ++++ CMakeLists.txt | 2 +- definition/NetworkManager.json | 4 ++-- docs/NetworkManagerPlugin.md | 10 +++++----- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9354b7c9..191f03f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ All notable changes to this RDK Service will be documented in this file. * Changes in CHANGELOG should be updated when commits are added to the main or release branches. There should be one CHANGELOG entry per JIRA Ticket. This is not enforced on sprint branches since there could be multiple changes for the same JIRA ticket during development. +## [1.9.0] - 2025-11-21 +### Added +- Added shortterm solution to print the AP Info + ## [1.8.0] - 2025-11-14 ### Fixed - Removed logging of WiFi PII information diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f8e3e91..078d7f65 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ find_package(WPEFramework) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") set(VERSION_MAJOR 1) -set(VERSION_MINOR 8) +set(VERSION_MINOR 9) set(VERSION_PATCH 0) add_compile_definitions(NETWORKMANAGER_MAJOR_VERSION=${VERSION_MAJOR}) diff --git a/definition/NetworkManager.json b/definition/NetworkManager.json index b3e40bcb..cb42e31a 100644 --- a/definition/NetworkManager.json +++ b/definition/NetworkManager.json @@ -9,7 +9,7 @@ "status": "production", "description": "A Unified `NetworkManager` plugin that allows you to manage Ethernet and Wifi interfaces on the device.", "sourcelocation": "https://github.com/rdkcentral/networkmanager/blob/main/definition/NetworkManager.json", - "version": "1.8.0" + "version": "1.9.0" }, "definitions": { "success": { @@ -135,7 +135,7 @@ "noise":{ "summary": "The WiFi Signal Noise detected in dBm", "type": "string", - "example": "-106" + "example": "-96" }, "snr":{ "summary": "Signal to Noise Ratio(SNR) in dBm", diff --git a/docs/NetworkManagerPlugin.md b/docs/NetworkManagerPlugin.md index 17eb8d9b..961a86ad 100644 --- a/docs/NetworkManagerPlugin.md +++ b/docs/NetworkManagerPlugin.md @@ -2,7 +2,7 @@ # NetworkManager Plugin -**Version: 1.8.0** +**Version: 1.9.0** **Status: :black_circle::black_circle::black_circle:** @@ -23,7 +23,7 @@ org.rdk.NetworkManager interface for Thunder framework. ## Scope -This document describes purpose and functionality of the org.rdk.NetworkManager interface (version 1.8.0). It includes detailed specification about its methods provided and notifications sent. +This document describes purpose and functionality of the org.rdk.NetworkManager interface (version 1.9.0). It includes detailed specification about its methods provided and notifications sent. ## Case Sensitivity @@ -1398,7 +1398,7 @@ This method takes no parameters. "strength": "-32", "frequency": "2.4420", "rate": "144", - "noise": "-106", + "noise": "-96", "success": true } } @@ -1552,7 +1552,7 @@ This method takes no parameters. "quality": "Excellent", "snr": "74", "strength": "-32", - "noise": "-106", + "noise": "-96", "success": true } } @@ -1947,7 +1947,7 @@ Triggered when WIFI Signal quality changed which is decided based on SNR value w "quality": "Excellent", "snr": "74", "strength": "-32", - "noise": "-106" + "noise": "-96" } } ``` From 359c3a645ea32584d8efa1c4986201108e5cd4c4 Mon Sep 17 00:00:00 2001 From: gururaajar <83449026+gururaajar@users.noreply.github.com> Date: Fri, 28 Nov 2025 12:56:29 -0500 Subject: [PATCH 09/15] RDKEMW-9249 - Request MfrMgr to Persist WiFi Settings from NetworkManager Plugin (#260) * RDKEMW-9249 - Request MfrMgr to Persist WiFi Settings from NetworkManager Plugin Reason for change: To save the wifi credentials to MfrMgr when the wifi connection is successful and remove the same when removeKnownSSID is called So that when migrating from RDKE to RDKV we will have the wifi configuration to connect. This checkin as the implementation to use gdbus call instead of popen to retrieve the SSID Test Procedure: CDL upgrade to RDKV from RDKE and check the wifi connection persist Priority:P1 Risks: Medium Signed-off-by: Gururaaja ESR * RDKEMW-9249 - Request MfrMgr to Persist WiFi Settings from NetworkManager Plugin Reason for change: To save the wifi credentials to MfrMgr when the wifi connection is successful and remove the same when removeKnownSSID is called So that when migrating from RDKE to RDKV we will have the wifi configuration to connect. This checkin as the implementation to use gdbus call instead of popen to retrieve the SSID Test Procedure: CDL upgrade to RDKV from RDKE and check the wifi connection persist Priority:P1 Risks: Medium Signed-off-by: Gururaaja ESR --------- Signed-off-by: Gururaaja ESR Co-authored-by: Karunakaran A <48997923+karuna2git@users.noreply.github.com> --- plugin/CMakeLists.txt | 2 + plugin/gnome/NetworkManagerGnomeMfrMgr.cpp | 353 +++++++++++++++------ 2 files changed, 254 insertions(+), 101 deletions(-) diff --git a/plugin/CMakeLists.txt b/plugin/CMakeLists.txt index bd50eef6..a24b6bf6 100644 --- a/plugin/CMakeLists.txt +++ b/plugin/CMakeLists.txt @@ -104,6 +104,8 @@ if(ENABLE_GNOME_NETWORKMANAGER) if(ENABLE_MIGRATION_MFRMGR_SUPPORT) target_sources(${MODULE_IMPL_NAME} PRIVATE gnome/NetworkManagerGnomeMfrMgr.cpp + gnome/gdbus/NetworkManagerGdbusMgr.cpp + gnome/gdbus/NetworkManagerGdbusUtils.cpp ) endif() if(ENABLE_MIGRATION_MFRMGR_SUPPORT) diff --git a/plugin/gnome/NetworkManagerGnomeMfrMgr.cpp b/plugin/gnome/NetworkManagerGnomeMfrMgr.cpp index 0a2d0d20..12a4368d 100644 --- a/plugin/gnome/NetworkManagerGnomeMfrMgr.cpp +++ b/plugin/gnome/NetworkManagerGnomeMfrMgr.cpp @@ -21,10 +21,14 @@ #include "NetworkManagerLogger.h" #include "NetworkManagerImplementation.h" #include "INetworkManager.h" +#include "NetworkManagerGnomeUtils.h" +#include "gdbus/NetworkManagerGdbusMgr.h" +#include "gdbus/NetworkManagerGdbusUtils.h" #include "mfrMgr.h" #include #include +#include #include "libIBus.h" namespace WPEFramework @@ -39,139 +43,286 @@ namespace WPEFramework static bool ensureIARMConnection() { std::lock_guard lock(iarm_mutex); - + if (!iarm_initialized) { IARM_Result_t ret = IARM_Bus_Init("NetworkMfrMgr"); if (ret != IARM_RESULT_SUCCESS) { NMLOG_ERROR("IARM_Bus_Init failed: %d", ret); return false; } - + ret = IARM_Bus_Connect(); if (ret != IARM_RESULT_SUCCESS) { NMLOG_ERROR("IARM_Bus_Connect failed: %d", ret); return false; } - + iarm_initialized = true; NMLOG_DEBUG("IARM Bus connection established for MfrMgr"); } return true; } - // Helper function to retrieve current WiFi connection details using nmcli and connection files + // Helper function to retrieve current WiFi connection details using GDBus utilities static bool getCurrentWiFiConnectionDetails(std::string& ssid, std::string& passphrase, int& security) { - // Use nmcli to get current WiFi connection info - FILE* pipe = popen("nmcli device wifi show-password 2>/dev/null", "r"); - if (!pipe) { - NMLOG_ERROR("Failed to execute nmcli command"); + GError *error = NULL; + GDBusProxy *connection_proxy = NULL; + GDBusProxy *device_proxy = NULL; + bool result = false; + + NMLOG_DEBUG("Retrieving WiFi connection details using GDBus utilities"); + + // Create DbusMgr instance for proxy management + DbusMgr dbusMgr; + + // Get WiFi device information using existing utility + deviceInfo devInfo; + if (!GnomeUtils::getDeviceInfoByIfname(dbusMgr, nmUtils::wlanIface(), devInfo)) { + NMLOG_ERROR("WiFi device '%s' not found", nmUtils::wlanIface()); return false; } - char buffer[1024]; - std::string nmcliOutput; - - // Read nmcli output - while (fgets(buffer, sizeof(buffer), pipe) != nullptr) { - nmcliOutput += buffer; - } - - int exitCode = pclose(pipe); - if (exitCode != 0) { - NMLOG_ERROR("nmcli command failed with exit code: %d", exitCode); + NMLOG_DEBUG("Found WiFi device at path: %s", devInfo.path.c_str()); + + // Create device proxy to check state and refresh ActiveConnection property + device_proxy = dbusMgr.getNetworkManagerDeviceProxy(devInfo.path.c_str()); + if (!device_proxy) { + NMLOG_ERROR("Failed to create device proxy"); return false; } - // Parse SSID from nmcli output - size_t ssidPos = nmcliOutput.find("SSID:"); - if (ssidPos == std::string::npos) { - NMLOG_ERROR("SSID not found in nmcli output"); + // Check device state first + GVariant *state_variant = g_dbus_proxy_get_cached_property(device_proxy, "State"); + if (state_variant) { + guint32 device_state = g_variant_get_uint32(state_variant); + NMLOG_DEBUG("WiFi device state: %u (100=activated, 30=disconnected)", device_state); + g_variant_unref(state_variant); + + // NM_DEVICE_STATE_ACTIVATED = 100 + if (device_state != NM_DEVICE_STATE_ACTIVATED) { + NMLOG_WARNING("WiFi device not in activated state (state=%u)", device_state); + } + } + + // Force refresh ActiveConnection property from D-Bus instead of using cached value + std::string active_conn_path; + error = NULL; + GVariant *props_variant = g_dbus_proxy_call_sync(device_proxy, + "org.freedesktop.DBus.Properties.Get", + g_variant_new("(ss)", + "org.freedesktop.NetworkManager.Device", + "ActiveConnection"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (!props_variant) { + NMLOG_ERROR("Failed to get ActiveConnection property: %s", error ? error->message : "unknown"); + if (error) g_error_free(error); + g_object_unref(device_proxy); return false; } - - size_t ssidStart = nmcliOutput.find_first_not_of(" \t", ssidPos + 5); - size_t ssidEnd = nmcliOutput.find_first_of("\n\r", ssidStart); - if (ssidStart == std::string::npos || ssidEnd == std::string::npos) { - NMLOG_ERROR("Failed to parse SSID from nmcli output"); + + GVariant *active_conn_variant = NULL; + g_variant_get(props_variant, "(v)", &active_conn_variant); + + if (!active_conn_variant) { + NMLOG_ERROR("ActiveConnection property variant is NULL"); + g_variant_unref(props_variant); + g_object_unref(device_proxy); return false; } - - ssid = nmcliOutput.substr(ssidStart, ssidEnd - ssidStart); - NMLOG_DEBUG("Parsed SSID from nmcli: %s", ssid.c_str()); - // Construct connection file path - std::string connectionFile = "/etc/NetworkManager/system-connections/" + ssid + ".nmconnection"; + const gchar *active_conn_path_str = g_variant_get_string(active_conn_variant, NULL); - // Try to open the connection file - std::ifstream file(connectionFile); - if (!file.is_open()) { - NMLOG_ERROR("Failed to open NetworkManager connection file: %s", connectionFile.c_str()); + if (active_conn_path_str) { + active_conn_path = active_conn_path_str; + } + + g_variant_unref(active_conn_variant); + g_variant_unref(props_variant); + g_object_unref(device_proxy); + + NMLOG_DEBUG("ActiveConnection path: %s", active_conn_path.c_str()); + + // Check if device has an active connection + if (active_conn_path.empty() || active_conn_path == "/") { + NMLOG_ERROR("No active connection on WiFi device (path: %s)", active_conn_path.c_str()); return false; } - // Read entire file into string buffer - more efficient than line-by-line - std::string content((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + // Create active connection proxy using DbusMgr + GDBusProxy *active_conn_proxy = dbusMgr.getNetworkManagerActiveConnProxy(active_conn_path.c_str()); + if (!active_conn_proxy) { + NMLOG_ERROR("Failed to create active connection proxy"); + return false; + } - // Find [wifi-security] section using string search - size_t sectionStart = content.find("[wifi-security]"); - if (sectionStart == std::string::npos) { - NMLOG_DEBUG("No [wifi-security] section found in connection file"); - file.close(); + // Get connection path from active connection + GVariant *conn_path_variant = g_dbus_proxy_get_cached_property(active_conn_proxy, "Connection"); + if (!conn_path_variant) { + NMLOG_ERROR("Failed to get connection path from active connection"); + g_object_unref(active_conn_proxy); return false; } - - // Find the end of the wifi-security section (next section or end of file) - size_t sectionEnd = content.find("\n[", sectionStart + 15); // 15 = length of "[wifi-security]" - if (sectionEnd == std::string::npos) { - sectionEnd = content.length(); + + const gchar *connection_path = g_variant_get_string(conn_path_variant, NULL); + if (connection_path == NULL) { + NMLOG_ERROR("Connection path variant did not contain a valid string"); + g_variant_unref(conn_path_variant); + g_object_unref(active_conn_proxy); + return false; } + NMLOG_DEBUG("Connection settings path: %s", connection_path); - // Extract just the wifi-security section - std::string wifiSection = content.substr(sectionStart, sectionEnd - sectionStart); + // Create connection proxy using DbusMgr + connection_proxy = dbusMgr.getNetworkManagerSettingsConnectionProxy(connection_path); + g_variant_unref(conn_path_variant); + g_object_unref(active_conn_proxy); - std::string keyMgmt; + if (!connection_proxy) { + NMLOG_ERROR("Failed to create connection proxy"); + return false; + } - // Use regex or direct string search for key-mgmt - size_t keyMgmtPos = wifiSection.find("key-mgmt="); - if (keyMgmtPos != std::string::npos) { - size_t valueStart = keyMgmtPos + 9; // Skip "key-mgmt=" - size_t valueEnd = wifiSection.find_first_of("\r\n", valueStart); - if (valueEnd == std::string::npos) valueEnd = wifiSection.length(); - keyMgmt = wifiSection.substr(valueStart, valueEnd - valueStart); - NMLOG_DEBUG("Found key-mgmt: %s", keyMgmt.c_str()); + // Get connection settings (without secrets) + GVariant *settings_variant = g_dbus_proxy_call_sync(connection_proxy, + "GetSettings", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (!settings_variant) { + NMLOG_ERROR("Failed to get connection settings: %s", error ? error->message : "unknown"); + if (error) g_error_free(error); + g_object_unref(connection_proxy); + return false; } - // Use direct string search for psk - size_t pskPos = wifiSection.find("psk="); - if (pskPos != std::string::npos) { - size_t valueStart = pskPos + 4; // Skip "psk=" - size_t valueEnd = wifiSection.find_first_of("\r\n", valueStart); - if (valueEnd == std::string::npos) valueEnd = wifiSection.length(); - passphrase = wifiSection.substr(valueStart, valueEnd - valueStart); - NMLOG_DEBUG("Found psk in connection file"); + // Parse settings to get SSID and security type + GVariantIter *settings_iter; + g_variant_get(settings_variant, "(a{sa{sv}})", &settings_iter); + + gchar *setting_name; + GVariant *setting_dict; + security = NET_WIFI_SECURITY_NONE; + bool has_wireless_security = false; + + while (g_variant_iter_loop(settings_iter, "{s@a{sv}}", &setting_name, &setting_dict)) { + if (g_strcmp0(setting_name, "802-11-wireless") == 0) { + // Extract SSID + GVariant *ssid_variant = g_variant_lookup_value(setting_dict, "ssid", G_VARIANT_TYPE_BYTESTRING); + if (ssid_variant) { + gsize ssid_len; + const guint8 *ssid_data = static_cast(g_variant_get_fixed_array(ssid_variant, &ssid_len, sizeof(guint8))); + ssid = std::string(reinterpret_cast(ssid_data), ssid_len); + NMLOG_DEBUG("Retrieved SSID: %s", ssid.c_str()); + g_variant_unref(ssid_variant); + } + } else if (g_strcmp0(setting_name, "802-11-wireless-security") == 0) { + has_wireless_security = true; + // Extract key-mgmt + GVariant *key_mgmt_variant = g_variant_lookup_value(setting_dict, "key-mgmt", G_VARIANT_TYPE_STRING); + if (key_mgmt_variant) { + const gchar *key_mgmt = g_variant_get_string(key_mgmt_variant, NULL); + NMLOG_DEBUG("Key management: %s", key_mgmt); + + if (g_strcmp0(key_mgmt, "sae") == 0) { + security = NET_WIFI_SECURITY_WPA3_SAE; + } else if (g_strcmp0(key_mgmt, "wpa-psk") == 0) { + security = NET_WIFI_SECURITY_WPA2_PSK_AES; + } else if (g_strcmp0(key_mgmt, "wpa-eap") == 0) { + security = NET_WIFI_SECURITY_WPA2_ENTERPRISE_AES; + } else if (g_strcmp0(key_mgmt, "none") == 0) { + security = NET_WIFI_SECURITY_NONE; + } else { + security = NET_WIFI_SECURITY_WPA2_PSK_AES; + } + + g_variant_unref(key_mgmt_variant); + } + } } - file.close(); + g_variant_iter_free(settings_iter); + g_variant_unref(settings_variant); + + // Request secrets if PSK-based security + if (has_wireless_security && (security == NET_WIFI_SECURITY_WPA2_PSK_AES || security == NET_WIFI_SECURITY_WPA3_SAE)) { + NMLOG_DEBUG("Requesting secrets for PSK-based connection"); + + // Use synchronous call instead of async to avoid cancellation complexity + error = NULL; + GVariant *secrets = g_dbus_proxy_call_sync(connection_proxy, + "GetSecrets", + g_variant_new("(s)", "802-11-wireless-security"), + G_DBUS_CALL_FLAGS_NONE, + 5000, // 5 second timeout + NULL, + &error); + + if (error) { + NMLOG_WARNING("Failed to get secrets: %s", error->message); + g_error_free(error); + result = false; + } else if (secrets) { + // Parse the returned secrets + // GetSecrets returns (a{sa{sv}}) - dict of dicts + GVariantIter *iter; + g_variant_get(secrets, "(a{sa{sv}})", &iter); + + gchar *setting_name_key; + GVariant *setting_dict_value; + bool found_psk = false; + // Iterate through settings + while (g_variant_iter_loop(iter, "{s@a{sv}}", &setting_name_key, &setting_dict_value)) { + if (g_strcmp0(setting_name_key, "802-11-wireless-security") == 0) { + // Found wireless security settings + GVariantIter *setting_iter; + g_variant_get(setting_dict_value, "a{sv}", &setting_iter); - // Map key management to security type - if (keyMgmt.empty()) { - security = NET_WIFI_SECURITY_NONE; - } else if (keyMgmt == "none") { - security = NET_WIFI_SECURITY_NONE; - } else if (keyMgmt == "wpa-psk") { - security = NET_WIFI_SECURITY_WPA2_PSK_AES; - } else if (keyMgmt == "sae") { - security = NET_WIFI_SECURITY_WPA3_SAE; + gchar *key; + GVariant *value; + + // Look for psk key + while (g_variant_iter_loop(setting_iter, "{sv}", &key, &value)) { + if (g_strcmp0(key, "psk") == 0) { + const gchar *psk = g_variant_get_string(value, NULL); + if (psk) { + passphrase = psk; + NMLOG_DEBUG("Successfully retrieved PSK"); + found_psk = true; + } + break; + } + } + g_variant_iter_free(setting_iter); + break; + } + } + + g_variant_iter_free(iter); + g_variant_unref(secrets); + result = found_psk; + } else { + NMLOG_WARNING("GetSecrets returned NULL"); + result = false; + } } else { - // Default to WPA PSK for unknown key management - security = NET_WIFI_SECURITY_WPA2_PSK_AES; + // No secrets needed for open networks + result = true; } - NMLOG_DEBUG("Retrieved WiFi connection details - SSID: %s, Security: %d, Key-mgmt: %s", - ssid.c_str(), security, keyMgmt.c_str()); - return true; + // Cleanup + g_object_unref(connection_proxy); + + NMLOG_INFO("Retrieved WiFi connection details - SSID: %s, Security: %d, Has Passphrase: %s", + ssid.c_str(), security, passphrase.empty() ? "no" : "yes"); + + return result && !ssid.empty(); } NetworkManagerMfrManager* NetworkManagerMfrManager::getInstance() @@ -206,14 +357,14 @@ namespace WPEFramework std::thread saveThread([this]() { std::string ssid, passphrase; int security; - + if (!getCurrentWiFiConnectionDetails(ssid, passphrase, security)) { NMLOG_ERROR("Failed to retrieve current WiFi connection details for MfrMgr save"); return; } - + NMLOG_INFO("Retrieved current WiFi connection details for MfrMgr save - SSID: %s, Security: %d", ssid.c_str(), security); - + // Save the retrieved details synchronously bool result = this->saveWiFiSettingsToMfrSync(ssid, passphrase, security); if (result) { @@ -222,10 +373,10 @@ namespace WPEFramework NMLOG_ERROR("Background WiFi connection details retrieval and save failed for SSID: %s", ssid.c_str()); } }); - + // Detach the thread to run independently saveThread.detach(); - + NMLOG_DEBUG("WiFi connection details retrieval and save operation queued for background execution"); return true; // Return immediately, actual retrieval and save happens asynchronously } @@ -237,15 +388,15 @@ namespace WPEFramework NMLOG_ERROR("IARM connection not available for saving WiFi settings"); return false; } - + NMLOG_INFO("Saving WiFi settings to MfrMgr via IARM - SSID: %s, Security: %d", ssid.c_str(), security); - + IARM_BUS_MFRLIB_API_WIFI_Credentials_Param_t param{0}; IARM_BUS_MFRLIB_API_WIFI_Credentials_Param_t setParam{0}; IARM_Result_t ret; param.requestType = WIFI_GET_CREDENTIALS; ret = IARM_Bus_Call(IARM_BUS_MFRLIB_NAME, IARM_BUS_MFRLIB_API_WIFI_Credentials, - (void*)¶m, sizeof(param)); + (void*)¶m, sizeof(param)); if(security == Exchange::INetworkManager::WIFISecurityMode::WIFI_SECURITY_NONE) securityMode = NET_WIFI_SECURITY_NONE; else if(security == Exchange::INetworkManager::WIFISecurityMode::WIFI_SECURITY_SAE) @@ -280,12 +431,12 @@ namespace WPEFramework } setParam.wifiCredentials.iSecurityMode = securityMode; - + setParam.requestType = WIFI_SET_CREDENTIALS; NMLOG_INFO(" Set Params param.requestType = %d, param.wifiCredentials.cSSID = %s, param.wifiCredentials.iSecurityMode = %d", setParam.requestType, setParam.wifiCredentials.cSSID, setParam.wifiCredentials.iSecurityMode); // Make IARM Bus call to save credentials ret = IARM_Bus_Call(IARM_BUS_MFRLIB_NAME, IARM_BUS_MFRLIB_API_WIFI_Credentials, - (void*)&setParam, sizeof(setParam)); + (void*)&setParam, sizeof(setParam)); if(ret == IARM_RESULT_SUCCESS) { memset(¶m,0,sizeof(param)); @@ -301,10 +452,10 @@ namespace WPEFramework if (ret == IARM_RESULT_SUCCESS) { if ((strcmp (param.wifiCredentials.cSSID, ssid.c_str()) == 0) && - (strcmp (param.wifiCredentials.cPassword, passphrase.c_str()) == 0) && - (param.wifiCredentials.iSecurityMode == securityMode)) + (strcmp (param.wifiCredentials.cPassword, passphrase.c_str()) == 0) && + (param.wifiCredentials.iSecurityMode == securityMode)) { - NMLOG_INFO("Successfully stored the credentails and verified stored ssid %s current ssid %s and security_mode %d", param.wifiCredentials.cSSID, ssid.c_str(), param.wifiCredentials.iSecurityMode); + NMLOG_INFO("Successfully stored the credentials and verified stored ssid %s current ssid %s and security_mode %d", param.wifiCredentials.cSSID, ssid.c_str(), param.wifiCredentials.iSecurityMode); return true; } else @@ -318,7 +469,7 @@ namespace WPEFramework NMLOG_ERROR("IARM Bus call failed for WiFi credentials save: %d", ret); return false; } - + NMLOG_INFO("Successfully saved WiFi settings to MfrMgr via IARM - SSID: %s, Security: %d", ssid.c_str(), security); return true; } @@ -329,16 +480,16 @@ namespace WPEFramework NMLOG_ERROR("IARM connection not available for clearing WiFi settings"); return false; } - + NMLOG_DEBUG("Clearing WiFi settings from MfrMgr via IARM"); - + // Make IARM Bus call to clear credentials IARM_Result_t ret = IARM_Bus_Call(IARM_BUS_MFRLIB_NAME,IARM_BUS_MFRLIB_API_WIFI_EraseAllData,0,0); if (ret != IARM_RESULT_SUCCESS) { NMLOG_ERROR("IARM Bus call failed for WiFi credentials clear: %d", ret); return false; - } - + } + NMLOG_INFO("Successfully cleared WiFi settings from MfrMgr via IARM"); return true; } From 07f76408784c24019f999d83fab85fae4aae81e2 Mon Sep 17 00:00:00 2001 From: gururaajar <83449026+gururaajar@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:17:12 -0500 Subject: [PATCH 10/15] RDKEMW-9855 : Add PR summary validation workflow (#242) * RDKEMW-9855 : Add PR summary validation workflow Reason for change: Added workflow for PR summary validation Test Procedure: check whether workflow passed Priority:P2 Risks: Medium Signed-off-by: Gururaaja ESR --- .github/workflows/validate_pr_desc.yml | 82 ++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 .github/workflows/validate_pr_desc.yml diff --git a/.github/workflows/validate_pr_desc.yml b/.github/workflows/validate_pr_desc.yml new file mode 100644 index 00000000..b6249ff7 --- /dev/null +++ b/.github/workflows/validate_pr_desc.yml @@ -0,0 +1,82 @@ +name: PR Title Validation +permissions: + contents: read +on: + pull_request: + branches: [develop, main, 'support/**', 'hotfix/**', 'topic/**'] + types: [opened, edited, synchronize] + +jobs: + validate-pr-title: + runs-on: ubuntu-latest + steps: + - name: Validate PR Title Only + env: + PR_TITLE: ${{ github.event.pull_request.title }} + run: | + # Define valid ticket IDs + VALID_TICKET_IDS=("RDKEMW") + + # Function to validate ticket format and ID + validate_ticket() { + local text="$1" + + echo "Validating PR title: $text" + + # Check if text matches the pattern - : + if [[ ! "$text" =~ ^[A-Z0-9]+-[0-9]+[[:space:]]*:[[:space:]]*.+ ]]; then + echo "ERROR: PR title format is invalid." + echo "Expected format: - : " + echo "Example: RDKEMW-123 : Fix playbook issue" + echo "" + echo "Valid ticket IDs are:" + printf "%s\n" "${VALID_TICKET_IDS[@]}" + return 1 + fi + + # Extract ticket ID from the text + local ticket_prefix=$(echo "$text" | sed -n 's/^\([A-Z0-9]\+\)-[0-9]\+[[:space:]]*:.*$/\1/p') + + if [ -z "$ticket_prefix" ]; then + echo "ERROR: Could not extract ticket ID from PR title." + echo "Expected format: - : " + echo "" + echo "Valid ticket IDs are:" + printf "%s\n" "${VALID_TICKET_IDS[@]}" + return 1 + fi + + # Check if extracted ticket ID is in the valid list + local valid=false + for valid_id in "${VALID_TICKET_IDS[@]}"; do + if [ "$ticket_prefix" = "$valid_id" ]; then + valid=true + break + fi + done + + if [ "$valid" = false ]; then + echo "ERROR: Invalid ticket ID '$ticket_prefix' in PR title" + echo "" + echo "Valid ticket IDs are:" + printf "%s\n" "${VALID_TICKET_IDS[@]}" + echo "" + echo "Your PR title should start with one of the above ticket IDs followed by a number." + echo "Example: RDKEMW-123 : Fix playbook issue" + return 1 + fi + + echo "PR title validation passed! Ticket ID: $ticket_prefix" + return 0 + } + + # Validate PR Title Only + echo "=== Validating PR Title ===" + if ! validate_ticket "$PR_TITLE"; then + echo "" + echo "VALIDATION FAILED: PR title must contain valid ticket ID from the approved list." + exit 1 + fi + + echo "" + echo "🎉 PR TITLE VALIDATION PASSED! Title contains valid ticket ID." From fff773304dbb63f95430418b3ee05341a3895782 Mon Sep 17 00:00:00 2001 From: gururaajar <83449026+gururaajar@users.noreply.github.com> Date: Thu, 4 Dec 2025 13:42:47 -0500 Subject: [PATCH 11/15] RDKEMW-11239 : VG is not being announced during and after FSR journey (#261) RDKEMW-11239 : VG is not being announced during and after FSR journey Reason for change: Updating the address structure with all the details from network manager only when IARM returned error code is NETWORK_IPADDRESS_ACQUIRED. So that we can avoid assigning and returning partial data Test Procedure: Check GetIPSettings is only populated when the error code is returned as NETWORK_IPADDRESS_ACQUIRED from NetSrvMgr Priority:P0 Risks: Medium Signed-off-by: Gururaaja ESR Co-authored-by: Karunakaran A <48997923+karuna2git@users.noreply.github.com> --- plugin/rdk/NetworkManagerRDKProxy.cpp | 77 +++++++++++++++------------ 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/plugin/rdk/NetworkManagerRDKProxy.cpp b/plugin/rdk/NetworkManagerRDKProxy.cpp index 01885969..608d22d7 100644 --- a/plugin/rdk/NetworkManagerRDKProxy.cpp +++ b/plugin/rdk/NetworkManagerRDKProxy.cpp @@ -750,48 +750,55 @@ namespace WPEFramework if (IARM_RESULT_SUCCESS == IARM_Bus_Call (IARM_BUS_NM_SRV_MGR_NAME, IARM_BUS_NETSRVMGR_API_getIPSettings, (void *)&iarmData, sizeof(iarmData))) { - address.autoconfig = iarmData.autoconfig; - address.dhcpserver = string(iarmData.dhcpserver); - address.ula = string(""); - address.ipaddress = string(iarmData.ipaddress); - address.gateway = string(iarmData.gateway); - address.primarydns = string(iarmData.primarydns); - address.secondarydns = string(iarmData.secondarydns); - if (0 == strcasecmp("ipv4", iarmData.ipversion)) + if(iarmData.errCode == NETWORK_IPADDRESS_ACQUIRED) { - address.ipversion = string ("IPv4"); - address.prefix = NetmaskToPrefix(iarmData.netmask); - if("eth0" == interface) - m_ethIPv4Address = address; - else if("wlan0" == interface) - m_wlanIPv4Address = address; - } - else if (0 == strcasecmp("ipv6", iarmData.ipversion)) - { - address.ipversion = string ("IPv6"); - address.prefix = std::atoi(iarmData.netmask); - if("eth0" == interface) - m_ethIPv6Address = address; - else if("wlan0" == interface) - m_wlanIPv6Address = address; - } + address.autoconfig = iarmData.autoconfig; + address.dhcpserver = string(iarmData.dhcpserver); + address.ula = string(""); + address.ipaddress = string(iarmData.ipaddress); + address.gateway = string(iarmData.gateway); + address.primarydns = string(iarmData.primarydns); + address.secondarydns = string(iarmData.secondarydns); + if (0 == strcasecmp("ipv4", iarmData.ipversion)) + { + address.ipversion = string ("IPv4"); + address.prefix = NetmaskToPrefix(iarmData.netmask); + if("eth0" == interface) + m_ethIPv4Address = address; + else if("wlan0" == interface) + m_wlanIPv4Address = address; + } + else if (0 == strcasecmp("ipv6", iarmData.ipversion)) + { + address.ipversion = string ("IPv6"); + address.prefix = std::atoi(iarmData.netmask); + if("eth0" == interface) + m_ethIPv6Address = address; + else if("wlan0" == interface) + m_wlanIPv6Address = address; + } - rc = Core::ERROR_NONE; - /* Return the default interface information */ - if (interface.empty()) + rc = Core::ERROR_NONE; + /* Return the default interface information */ + if (interface.empty()) + { + string tmpInterface = string(iarmData.interface); + if ("ETHERNET" == tmpInterface) + interface = "eth0"; + else if ("WIFI" == tmpInterface) + interface = "wlan0"; + else + rc = Core::ERROR_BAD_REQUEST; + } + } + else { - string tmpInterface = string(iarmData.interface); - if ("ETHERNET" == tmpInterface) - interface = "eth0"; - else if ("WIFI" == tmpInterface) - interface = "wlan0"; - else - rc = Core::ERROR_BAD_REQUEST; + NMLOG_WARNING("IP Address is not ready to use yet; err = %d", iarmData.errCode); } } else { - NMLOG_ERROR("NetworkManagerImplementation::GetIPSettings - Calling IARM Failed"); + NMLOG_ERROR("GetIPSettings - Calling IARM Failed"); } return rc; From 5164f1c4bc286d161966feb216bd63d669e24b67 Mon Sep 17 00:00:00 2001 From: Karunakaran A Date: Fri, 5 Dec 2025 09:50:35 -0500 Subject: [PATCH 12/15] Release of 1.10.0 Release of 1.10.0 --- CHANGELOG.md | 5 +++++ CMakeLists.txt | 2 +- definition/NetworkManager.json | 2 +- docs/NetworkManagerPlugin.md | 4 ++-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 191f03f8..fc32eb2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ All notable changes to this RDK Service will be documented in this file. * Changes in CHANGELOG should be updated when commits are added to the main or release branches. There should be one CHANGELOG entry per JIRA Ticket. This is not enforced on sprint branches since there could be multiple changes for the same JIRA ticket during development. +## [1.10.0] - 2025-12-05 +### Fixed +- Fixed the GetIPSettings for RDK Backend to return only when all the information like DNS info retrieved +- Fixed the retrieval of psk to pass it to MfrMgr. + ## [1.9.0] - 2025-11-21 ### Added - Added shortterm solution to print the AP Info diff --git a/CMakeLists.txt b/CMakeLists.txt index 078d7f65..3117b54f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ find_package(WPEFramework) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") set(VERSION_MAJOR 1) -set(VERSION_MINOR 9) +set(VERSION_MINOR 10) set(VERSION_PATCH 0) add_compile_definitions(NETWORKMANAGER_MAJOR_VERSION=${VERSION_MAJOR}) diff --git a/definition/NetworkManager.json b/definition/NetworkManager.json index cb42e31a..83a08551 100644 --- a/definition/NetworkManager.json +++ b/definition/NetworkManager.json @@ -9,7 +9,7 @@ "status": "production", "description": "A Unified `NetworkManager` plugin that allows you to manage Ethernet and Wifi interfaces on the device.", "sourcelocation": "https://github.com/rdkcentral/networkmanager/blob/main/definition/NetworkManager.json", - "version": "1.9.0" + "version": "1.10.0" }, "definitions": { "success": { diff --git a/docs/NetworkManagerPlugin.md b/docs/NetworkManagerPlugin.md index 961a86ad..2b1c5130 100644 --- a/docs/NetworkManagerPlugin.md +++ b/docs/NetworkManagerPlugin.md @@ -2,7 +2,7 @@ # NetworkManager Plugin -**Version: 1.9.0** +**Version: 1.10.0** **Status: :black_circle::black_circle::black_circle:** @@ -23,7 +23,7 @@ org.rdk.NetworkManager interface for Thunder framework. ## Scope -This document describes purpose and functionality of the org.rdk.NetworkManager interface (version 1.9.0). It includes detailed specification about its methods provided and notifications sent. +This document describes purpose and functionality of the org.rdk.NetworkManager interface (version 1.10.0). It includes detailed specification about its methods provided and notifications sent. ## Case Sensitivity From e3247606505ce6671f95d8a8203752110dc8a70d Mon Sep 17 00:00:00 2001 From: Karunakaran A <48997923+karuna2git@users.noreply.github.com> Date: Thu, 11 Dec 2025 10:41:57 -0500 Subject: [PATCH 13/15] RDKEMW-11453 : Cleanup the component to be compatible with Thunder-R5.3 (#263) Reason for change: Cleanup the component to be compatible with Thunder-R5.3 Test Procedure: Verify Thunder-R5.3 build Risks: Low Signed-off-by: Karunakaran A --- CMakeLists.txt | 16 +++++++++++++++- plugin/CMakeLists.txt | 2 +- plugin/NetworkManager.h | 8 -------- tests/l2Test/CMakeLists.txt | 1 - 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3117b54f..50371004 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,21 @@ cmake_minimum_required(VERSION 3.3) project(NetworkManager) -find_package(WPEFramework) + +# Try WPEFramework first +find_package(WPEFramework QUIET CONFIG) + +# If WPEFramework isn't found, try Thunder +if (NOT WPEFramework_FOUND) + find_package(Thunder QUIET CONFIG) +endif() + +# Error out if neither is found +if (NOT WPEFramework_FOUND AND NOT Thunder_FOUND) + message(FATAL_ERROR + "Neither WPEFramework nor Thunder could be found.\n" + "Install one of them and ensure its CMake package is discoverable via CMAKE_PREFIX_PATH or default locations.") +endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") set(VERSION_MAJOR 1) diff --git a/plugin/CMakeLists.txt b/plugin/CMakeLists.txt index a24b6bf6..abfd9998 100644 --- a/plugin/CMakeLists.txt +++ b/plugin/CMakeLists.txt @@ -56,7 +56,7 @@ add_definitions(-DPLUGIN_BUILD_REFERENCE=${PLUGIN_BUILD_REFERENCE}) include_directories(${PROJECT_SOURCE_DIR}/interface) include_directories(${PROJECT_SOURCE_DIR}/plugin) -# Build the main plugin that runs inside the WPEFramework daemon +# Build the main plugin that runs inside the daemon add_library(${MODULE_NAME} SHARED NetworkManager.cpp NetworkManagerJsonRpc.cpp diff --git a/plugin/NetworkManager.h b/plugin/NetworkManager.h index eb1dec58..6529e058 100644 --- a/plugin/NetworkManager.h +++ b/plugin/NetworkManager.h @@ -132,14 +132,6 @@ namespace WPEFramework void Deinitialize(PluginHost::IShell *service) override; string Information() const override; - //override Subscribe from IDispatcher - uint32_t Subscribe(const uint32_t channel, const string& event, const string& designator) override - { - NMLOG_DEBUG("Subscription received for %s event from channelID (%u) with designator as %s", event.c_str(), channel, designator.c_str()); - JSONRPC::Subscribe(channel, event, designator); - return Core::ERROR_NONE; - } - // Do not allow copy/move constructors NetworkManager(const NetworkManager &) = delete; NetworkManager &operator=(const NetworkManager &) = delete; diff --git a/tests/l2Test/CMakeLists.txt b/tests/l2Test/CMakeLists.txt index f9cfa948..74c150bf 100644 --- a/tests/l2Test/CMakeLists.txt +++ b/tests/l2Test/CMakeLists.txt @@ -20,7 +20,6 @@ cmake_minimum_required(VERSION 3.3) message ("building Networkmanager plugin l2 tests") find_package(CURL) -find_package(WPEFramework) find_package(PkgConfig REQUIRED) find_package(${NAMESPACE}Core REQUIRED) find_package(${NAMESPACE}Plugins REQUIRED) From 0557c2a4bbcb832c915a6c38895f506612e971c6 Mon Sep 17 00:00:00 2001 From: Karunakaran A <48997923+karuna2git@users.noreply.github.com> Date: Wed, 17 Dec 2025 17:24:54 -0500 Subject: [PATCH 14/15] RDKEMW-11453 : Cleanup the component to be compatible with Thunder-R5.3.0 (#265) Reason for change: Cleanup the component to be compatible with Thunder-R5.3.0 Test Procedure: Verify Thunder-R5.3.0 build Risks: Low Signed-off-by: Karunakaran A --- definition/NetworkManager.json | 1 - legacy/LegacyNetworkAPIs.cpp | 2 +- legacy/LegacyWiFiManagerAPIs.cpp | 2 +- .../l2_test_LegacyPlugin_NetworkAPIs.cpp | 40 ++++++++--------- .../l2_test_LegacyPlugin_WiFiManagerAPIs.cpp | 44 +++++++++---------- 5 files changed, 44 insertions(+), 45 deletions(-) diff --git a/definition/NetworkManager.json b/definition/NetworkManager.json index 83a08551..0ad45e2d 100644 --- a/definition/NetworkManager.json +++ b/definition/NetworkManager.json @@ -5,7 +5,6 @@ "title": "NetworkManager Plugin", "class": "NetworkManager", "callsign": "org.rdk.NetworkManager", - "locator": "libWPEFrameworkNetworkManager.so", "status": "production", "description": "A Unified `NetworkManager` plugin that allows you to manage Ethernet and Wifi interfaces on the device.", "sourcelocation": "https://github.com/rdkcentral/networkmanager/blob/main/definition/NetworkManager.json", diff --git a/legacy/LegacyNetworkAPIs.cpp b/legacy/LegacyNetworkAPIs.cpp index bc0a669e..7bf3b941 100644 --- a/legacy/LegacyNetworkAPIs.cpp +++ b/legacy/LegacyNetworkAPIs.cpp @@ -25,7 +25,7 @@ using namespace WPEFramework::Plugin; #define API_VERSION_NUMBER_MAJOR 2 #define API_VERSION_NUMBER_MINOR 0 #define API_VERSION_NUMBER_PATCH 0 -#define NETWORK_MANAGER_CALLSIGN "org.rdk.NetworkManager.1" +#define NETWORK_MANAGER_CALLSIGN "org.rdk.NetworkManager" #define SUBSCRIPTION_TIMEOUT_IN_MILLISECONDS 500 #define DEFAULT_PING_PACKETS 15 diff --git a/legacy/LegacyWiFiManagerAPIs.cpp b/legacy/LegacyWiFiManagerAPIs.cpp index dc032dc8..a075e43e 100644 --- a/legacy/LegacyWiFiManagerAPIs.cpp +++ b/legacy/LegacyWiFiManagerAPIs.cpp @@ -26,7 +26,7 @@ using namespace WPEFramework::Plugin; #define API_VERSION_NUMBER_MAJOR 2 #define API_VERSION_NUMBER_MINOR 0 #define API_VERSION_NUMBER_PATCH 0 -#define NETWORK_MANAGER_CALLSIGN "org.rdk.NetworkManager.1" +#define NETWORK_MANAGER_CALLSIGN "org.rdk.NetworkManager" #define SUBSCRIPTION_TIMEOUT_IN_MILLISECONDS 500 #define WPA_SUPPLICANT_CONF "/opt/secure/wifi/wpa_supplicant.conf" diff --git a/tests/l2Test/legacy/l2_test_LegacyPlugin_NetworkAPIs.cpp b/tests/l2Test/legacy/l2_test_LegacyPlugin_NetworkAPIs.cpp index 16231583..d55de392 100644 --- a/tests/l2Test/legacy/l2_test_LegacyPlugin_NetworkAPIs.cpp +++ b/tests/l2Test/legacy/l2_test_LegacyPlugin_NetworkAPIs.cpp @@ -77,7 +77,7 @@ class NetworkTest : public ::testing::Test{ })) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); m_subsIfaceStateChange = true; m_subsActIfaceChange = true; m_subsIPAddrChange = true; @@ -128,7 +128,7 @@ TEST_F(NetworkTest, getInterfaces) .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, GetAvailableInterfaces(::testing::_)) @@ -183,7 +183,7 @@ TEST_F(NetworkTest, setStunEndpoint) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, SetStunEndpoint(::testing::_, ::testing::_, ::testing::_, ::testing::_)) @@ -210,7 +210,7 @@ TEST_F(NetworkTest, setInterfaceEnabled){ .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -234,7 +234,7 @@ TEST_F(NetworkTest, getDefaultInterface) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -279,7 +279,7 @@ TEST_F(NetworkTest, setIPSettings) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -309,7 +309,7 @@ TEST_F(NetworkTest, getIPSettings) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -350,7 +350,7 @@ TEST_F(NetworkTest, getIPSettingsIPv6) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -391,7 +391,7 @@ TEST_F(NetworkTest, getIPSettingsErrorEmptyString) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -428,7 +428,7 @@ TEST_F(NetworkTest, getIPSettings2) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -468,7 +468,7 @@ TEST_F(NetworkTest, isConnectedToInternet) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -501,7 +501,7 @@ TEST_F(NetworkTest, getInternetConnectionState) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -532,7 +532,7 @@ TEST_F(NetworkTest, doPing) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -578,7 +578,7 @@ TEST_F(NetworkTest, doTrace) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -627,7 +627,7 @@ TEST_F(NetworkTest, getPublicIP) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -659,7 +659,7 @@ TEST_F(NetworkTest, isInterfaceEnabled) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -700,7 +700,7 @@ TEST_F(NetworkTest, setConnectivityTestEndpoints) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -773,7 +773,7 @@ TEST_F(NetworkTest, getCaptivePortalURI) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -811,7 +811,7 @@ TEST_F(NetworkTest, getStbIp) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, GetIPSettings(::testing::_, ::testing::_, ::testing::_)) @@ -846,7 +846,7 @@ TEST_F(NetworkTest, getSTBIPFamily) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, GetIPSettings(::testing::_, ::testing::_, ::testing::_)) diff --git a/tests/l2Test/legacy/l2_test_LegacyPlugin_WiFiManagerAPIs.cpp b/tests/l2Test/legacy/l2_test_LegacyPlugin_WiFiManagerAPIs.cpp index aa2c8a56..aa90be47 100644 --- a/tests/l2Test/legacy/l2_test_LegacyPlugin_WiFiManagerAPIs.cpp +++ b/tests/l2Test/legacy/l2_test_LegacyPlugin_WiFiManagerAPIs.cpp @@ -68,7 +68,7 @@ class WiFiManagerTest : public ::testing::Test { })) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockShell); })); m_service = service; @@ -114,7 +114,7 @@ TEST_F(WiFiManagerTest, cancelWPSPairing) .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, StopWPS()) @@ -134,7 +134,7 @@ TEST_F(WiFiManagerTest, clearSSID) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, RemoveKnownSSID(::testing::_)) @@ -153,7 +153,7 @@ TEST_F(WiFiManagerTest, connect) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, WiFiConnect(::testing::_)) @@ -182,7 +182,7 @@ TEST_F(WiFiManagerTest, getConnectedSSID) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); Exchange::INetworkManager::WiFiSSIDInfo ssidInfo{}; @@ -215,7 +215,7 @@ TEST_F(WiFiManagerTest, getConnectedSSIDSAE) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); Exchange::INetworkManager::WiFiSSIDInfo ssidInfo{}; @@ -248,7 +248,7 @@ TEST_F(WiFiManagerTest, getConnectedSSIDEAP) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); Exchange::INetworkManager::WiFiSSIDInfo ssidInfo{}; @@ -281,7 +281,7 @@ TEST_F(WiFiManagerTest, getCurrentState) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); Exchange::INetworkManager::WiFiState state = Exchange::INetworkManager::WiFiState::WIFI_STATE_CONNECTED; @@ -309,7 +309,7 @@ TEST_F(WiFiManagerTest, getCurrentStateFailed1) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); Exchange::INetworkManager::WiFiState state = Exchange::INetworkManager::WiFiState::WIFI_STATE_ERROR; @@ -337,7 +337,7 @@ TEST_F(WiFiManagerTest, getCurrentStateFailed2) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); Exchange::INetworkManager::WiFiState state = Exchange::INetworkManager::WiFiState::WIFI_STATE_CONNECTION_INTERRUPTED; @@ -365,7 +365,7 @@ TEST_F(WiFiManagerTest, getCurrentStateDisconnected) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); Exchange::INetworkManager::WiFiState state = Exchange::INetworkManager::WiFiState::WIFI_STATE_DISCONNECTED; @@ -393,7 +393,7 @@ TEST_F(WiFiManagerTest, getCurrentStateConnected) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); Exchange::INetworkManager::WiFiState state = Exchange::INetworkManager::WiFiState::WIFI_STATE_CONNECTED; @@ -421,7 +421,7 @@ TEST_F(WiFiManagerTest, getPairedSSIDInfo) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); Exchange::INetworkManager::WiFiSSIDInfo ssidInfo{}; @@ -459,7 +459,7 @@ TEST_F(WiFiManagerTest, saveSSID) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); Exchange::INetworkManager::WiFiConnectTo ssid{}; @@ -496,7 +496,7 @@ TEST_F(WiFiManagerTest, disconnect) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, WiFiDisconnect()) @@ -519,7 +519,7 @@ TEST_F(WiFiManagerTest, initiateWPSPairing) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, StartWPS(::testing::_, ::testing::_)) @@ -549,7 +549,7 @@ TEST_F(WiFiManagerTest, startScan) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, StartWiFiScan(::testing::_, ::testing::_)) @@ -579,7 +579,7 @@ TEST_F(WiFiManagerTest, stopScan) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, StopWiFiScan()) @@ -603,7 +603,7 @@ TEST_F(WiFiManagerTest, stopScan_Error) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); EXPECT_CALL(*mockNetworkManager, StopWiFiScan()) @@ -715,7 +715,7 @@ TEST_F(WiFiManagerTest, getPairedSSID) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -751,7 +751,7 @@ TEST_F(WiFiManagerTest, isPaired) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); @@ -787,7 +787,7 @@ TEST_F(WiFiManagerTest, isPairedNoSSID) { .Times(1) .WillOnce(::testing::Invoke( [&](const uint32_t, const string& name) -> void* { - EXPECT_EQ(name, string(_T("org.rdk.NetworkManager.1"))); + EXPECT_EQ(name, string(_T("org.rdk.NetworkManager"))); return static_cast(mockNetworkManager); })); From eadaff161de9cd19b8a063f3f0d6062b08089b93 Mon Sep 17 00:00:00 2001 From: Karunakaran A Date: Fri, 19 Dec 2025 11:52:28 -0500 Subject: [PATCH 15/15] Release of 1.11.0 Release of 1.11.0 --- CHANGELOG.md | 4 ++++ CMakeLists.txt | 2 +- definition/NetworkManager.json | 2 +- docs/NetworkManagerPlugin.md | 4 ++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc32eb2c..37b74361 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ All notable changes to this RDK Service will be documented in this file. * Changes in CHANGELOG should be updated when commits are added to the main or release branches. There should be one CHANGELOG entry per JIRA Ticket. This is not enforced on sprint branches since there could be multiple changes for the same JIRA ticket during development. +## [1.11.0] - 2025-12-19 +### Added +- Added support to build for Thunder R5.x + ## [1.10.0] - 2025-12-05 ### Fixed - Fixed the GetIPSettings for RDK Backend to return only when all the information like DNS info retrieved diff --git a/CMakeLists.txt b/CMakeLists.txt index 50371004..69be7c5b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,7 @@ endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") set(VERSION_MAJOR 1) -set(VERSION_MINOR 10) +set(VERSION_MINOR 11) set(VERSION_PATCH 0) add_compile_definitions(NETWORKMANAGER_MAJOR_VERSION=${VERSION_MAJOR}) diff --git a/definition/NetworkManager.json b/definition/NetworkManager.json index 0ad45e2d..93f03d45 100644 --- a/definition/NetworkManager.json +++ b/definition/NetworkManager.json @@ -8,7 +8,7 @@ "status": "production", "description": "A Unified `NetworkManager` plugin that allows you to manage Ethernet and Wifi interfaces on the device.", "sourcelocation": "https://github.com/rdkcentral/networkmanager/blob/main/definition/NetworkManager.json", - "version": "1.10.0" + "version": "1.11.0" }, "definitions": { "success": { diff --git a/docs/NetworkManagerPlugin.md b/docs/NetworkManagerPlugin.md index 2b1c5130..17276b3f 100644 --- a/docs/NetworkManagerPlugin.md +++ b/docs/NetworkManagerPlugin.md @@ -2,7 +2,7 @@ # NetworkManager Plugin -**Version: 1.10.0** +**Version: 1.11.0** **Status: :black_circle::black_circle::black_circle:** @@ -23,7 +23,7 @@ org.rdk.NetworkManager interface for Thunder framework. ## Scope -This document describes purpose and functionality of the org.rdk.NetworkManager interface (version 1.10.0). It includes detailed specification about its methods provided and notifications sent. +This document describes purpose and functionality of the org.rdk.NetworkManager interface (version 1.11.0). It includes detailed specification about its methods provided and notifications sent. ## Case Sensitivity