diff --git a/legacy/CMakeLists.txt b/legacy/CMakeLists.txt index e3b11dd7..bcf93988 100644 --- a/legacy/CMakeLists.txt +++ b/legacy/CMakeLists.txt @@ -27,6 +27,9 @@ set(PLUGIN_LEGACY_WIFI ${NAMESPACE}WiFiManager) set(PLUGIN_LEGACY_NW_STARTUPORDER "35" CACHE STRING "To configure startup order of Legacy Network plugin") set(PLUGIN_LEGACY_WIFI_STARTUPORDER "35" CACHE STRING "To configure startup order of Legacy WiFi plugin") +set(PLUGIN_LEGACY_NW_AUTOSTART "false" CACHE STRING "The autostart of Legacy Network plugin") +set(PLUGIN_LEGACY_WIFI_AUTOSTART "false" CACHE STRING "The autostart of Legacy WiFi plugin") + set(PLUGIN_BUILD_REFERENCE ${PROJECT_VERSION} CACHE STRING "To Set the Hash for the plugin") add_definitions(-DPLUGIN_BUILD_REFERENCE=${PLUGIN_BUILD_REFERENCE}) diff --git a/legacy/LegacyNetworkAPIs.conf.in b/legacy/LegacyNetworkAPIs.conf.in index 39cf67b9..70bef4cd 100644 --- a/legacy/LegacyNetworkAPIs.conf.in +++ b/legacy/LegacyNetworkAPIs.conf.in @@ -1,4 +1,4 @@ precondition = ["Platform"] callsign = "org.rdk.Network" -autostart = "false" +autostart = "@PLUGIN_LEGACY_NW_AUTOSTART@" startuporder = "@PLUGIN_LEGACY_NW_STARTUPORDER@" diff --git a/legacy/LegacyNetworkAPIs.config b/legacy/LegacyNetworkAPIs.config deleted file mode 100644 index 34c60c67..00000000 --- a/legacy/LegacyNetworkAPIs.config +++ /dev/null @@ -1,4 +0,0 @@ -set (autostart false) -set (preconditions Platform) -set (callsign "org.rdk.Network") -set (startuporder ${PLUGIN_LEGACY_NW_STARTUPORDER}) diff --git a/legacy/LegacyWiFiManagerAPIs.conf.in b/legacy/LegacyWiFiManagerAPIs.conf.in index 02f46112..92beadbb 100644 --- a/legacy/LegacyWiFiManagerAPIs.conf.in +++ b/legacy/LegacyWiFiManagerAPIs.conf.in @@ -1,4 +1,4 @@ precondition = ["Platform"] callsign = "org.rdk.Wifi" -autostart = "false" +autostart = "@PLUGIN_LEGACY_WIFI_AUTOSTART@" startuporder = "@PLUGIN_LEGACY_WIFI_STARTUPORDER@" diff --git a/legacy/LegacyWiFiManagerAPIs.config b/legacy/LegacyWiFiManagerAPIs.config deleted file mode 100644 index 7aa4dfb3..00000000 --- a/legacy/LegacyWiFiManagerAPIs.config +++ /dev/null @@ -1,4 +0,0 @@ -set (autostart false) -set (preconditions Platform) -set (callsign "org.rdk.Wifi") -set (startuporder ${PLUGIN_LEGACY_WIFI_STARTUPORDER}) diff --git a/plugin/CMakeLists.txt b/plugin/CMakeLists.txt index 6090b8f1..a6199887 100644 --- a/plugin/CMakeLists.txt +++ b/plugin/CMakeLists.txt @@ -52,6 +52,7 @@ endif () set(PLUGIN_NETWORKMANAGER_LOGLEVEL "5" CACHE STRING "To configure default loglevel NetworkManager plugin") set(PLUGIN_NETWORKMANAGER_STARTUPORDER "25" CACHE STRING "To configure startup order of Unified NetworkManager plugin") +set(PLUGIN_NETWORKMANAGER_AUTOSTART "false" CACHE STRING "Set the default AutoStart of NetworkManager Plugin") set(PLUGIN_BUILD_REFERENCE ${PROJECT_VERSION} CACHE STRING "To Set the Hash for the plugin") add_definitions(-DPLUGIN_BUILD_REFERENCE=${PLUGIN_BUILD_REFERENCE}) @@ -71,7 +72,7 @@ target_link_libraries(${MODULE_NAME} PRIVATE ) set_target_properties(${MODULE_NAME} PROPERTIES - CXX_STANDARD 11 + CXX_STANDARD 17 CXX_STANDARD_REQUIRED YES FRAMEWORK FALSE) @@ -128,7 +129,7 @@ else() endif() set_target_properties(${MODULE_IMPL_NAME} PROPERTIES - CXX_STANDARD 11 + CXX_STANDARD 17 CXX_STANDARD_REQUIRED YES FRAMEWORK FALSE) diff --git a/plugin/NetworkManager.conf.in b/plugin/NetworkManager.conf.in index b4876296..ac3127cc 100644 --- a/plugin/NetworkManager.conf.in +++ b/plugin/NetworkManager.conf.in @@ -1,6 +1,6 @@ callsign= "org.rdk.NetworkManager" startuporder = "@PLUGIN_NETWORKMANAGER_STARTUPORDER@" -autostart = "false" +autostart = "@PLUGIN_NETWORKMANAGER_AUTOSTART@" process= JSON() process.add("outofprocess", "true") diff --git a/plugin/NetworkManager.config b/plugin/NetworkManager.config deleted file mode 100644 index 59563509..00000000 --- a/plugin/NetworkManager.config +++ /dev/null @@ -1,27 +0,0 @@ -set(callsign "org.rdk.NetworkManager") -set (startuporder ${PLUGIN_NETWORKMANAGER_STARTUPORDER}) -set (autostart false) - -map() - key(root) - map() - kv(outofprocess true) - end() - key(connectivity) - map() - kv(endpoint_1 ${PLUGIN_NETWORKMANAGER_CONN_ENDPOINT_1}) - kv(endpoint_2 ${PLUGIN_NETWORKMANAGER_CONN_ENDPOINT_2}) - kv(endpoint_3 ${PLUGIN_NETWORKMANAGER_CONN_ENDPOINT_3}) - kv(endpoint_4 ${PLUGIN_NETWORKMANAGER_CONN_ENDPOINT_4}) - kv(endpoint_5 ${PLUGIN_NETWORKMANAGER_CONN_ENDPOINT_5}) - kv(interval, @PLUGIN_NETWORKMANAGER_CONN_MONITOR_INTERVAL@) - end() - key(stun) - map() - kv(endpoint, ${PLUGIN_NETWORKMANAGER_STUN_ENDPOINT}) - kv(port, PLUGIN_NETWORKMANAGER_STUN_PORT) - kv(interval, 30) - end() - kv(loglevel, 3) -end() -ans(configuration) diff --git a/plugin/NetworkManagerImplementation.cpp b/plugin/NetworkManagerImplementation.cpp index b10b375b..ae7d3490 100644 --- a/plugin/NetworkManagerImplementation.cpp +++ b/plugin/NetworkManagerImplementation.cpp @@ -338,6 +338,7 @@ namespace WPEFramework /* @brief Get the active Interface used for external world communication */ uint32_t NetworkManagerImplementation::GetPrimaryInterface (string& interface /* @out */) { + LOG_ENTRY_FUNCTION(); if(m_ethEnabled.load() && m_ethConnected.load()) interface = "eth0"; else if(m_wlanEnabled.load() && m_wlanConnected.load()) @@ -397,6 +398,7 @@ namespace WPEFramework /* @brief Set the network manager plugin log level */ uint32_t NetworkManagerImplementation::SetLogLevel(const Logging& level /* @in */) { + LOG_ENTRY_FUNCTION(); NetworkManagerLogger::SetLevel(static_cast(level)); platform_logging(static_cast(level)); NMLOG_DEBUG("loglevel %d", level); @@ -406,6 +408,7 @@ namespace WPEFramework /* @brief Get the network manager plugin log level */ uint32_t NetworkManagerImplementation::GetLogLevel(Logging& level /* @out */) { + LOG_ENTRY_FUNCTION(); LogLevel inLevel; NetworkManagerLogger::GetLevel(inLevel); @@ -416,6 +419,7 @@ namespace WPEFramework /* @brief Request for ping and get the response in as event. The GUID used in the request will be returned in the event. */ uint32_t NetworkManagerImplementation::Ping (const string ipversion /* @in */, const string endpoint /* @in */, const uint32_t noOfRequest /* @in */, const uint16_t timeOutInSeconds /* @in */, const string guid /* @in */, string& response /* @out */) { + LOG_ENTRY_FUNCTION(); char cmd[100] = ""; string tempResult = ""; if (endpoint.empty() || (ipversion != "IPv4" && ipversion != "IPv6")) @@ -447,6 +451,7 @@ namespace WPEFramework /* @brief Request for trace get the response in as event. The GUID used in the request will be returned in the event. */ uint32_t NetworkManagerImplementation::Trace (const string ipversion /* @in */, const string endpoint /* @in */, const uint32_t noOfRequest /* @in */, const string guid /* @in */, string& response /* @out */) { + LOG_ENTRY_FUNCTION(); char cmd[256] = ""; string tempResult = ""; if (endpoint.empty() || (ipversion != "IPv4" && ipversion != "IPv6")) @@ -477,6 +482,7 @@ namespace WPEFramework void NetworkManagerImplementation::executeExternally(NetworkEvents event, const string commandToExecute, string& response) { + LOG_ENTRY_FUNCTION(); FILE *pipe = NULL; string output{}; char buffer[1024]; @@ -574,7 +580,7 @@ namespace WPEFramework } pingResult.ToString(response); - NMLOG_INFO("Response is, %s", response.c_str()); + NMLOG_DEBUG("Response is, %s", response.c_str()); } else if (NETMGR_TRACE == event) { @@ -592,19 +598,22 @@ namespace WPEFramework pclose(pipe); list.ToString(response); - NMLOG_INFO("Response is, %s", response.c_str()); + NMLOG_DEBUG("Response is, %s", response.c_str()); } return; } - void NetworkManagerImplementation::filterScanResults(JsonArray &ssids) + void NetworkManagerImplementation::filterScanResults(JsonArray &ssids, + const std::vector& filterSsidslist, + const std::vector& filterFrequencies) { + LOG_ENTRY_FUNCTION(); JsonArray result; double filterFreq = 0.0; - std::unordered_set scanForSsidsSet(m_filterSsidslist.begin(), m_filterSsidslist.end()); + std::unordered_set scanForSsidsSet(filterSsidslist.begin(), filterSsidslist.end()); // If neither SSID list nor frequency is provided, exit - if (m_filterSsidslist.empty() && m_filterFrequencies.empty()) + if (filterSsidslist.empty() && filterFrequencies.empty()) { NMLOG_DEBUG("Neither SSID nor Frequency is provided. Exiting function."); return; @@ -618,10 +627,10 @@ namespace WPEFramework double frequencyValue = std::stod(frequency); bool ssidMatches = scanForSsidsSet.empty() || scanForSsidsSet.find(ssid) != scanForSsidsSet.end(); - bool freqMatches = m_filterFrequencies.empty(); + bool freqMatches = filterFrequencies.empty(); if (!freqMatches) { - for (const auto& selectedFrequency : m_filterFrequencies) + for (const auto& selectedFrequency : filterFrequencies) { if (selectedFrequency == "ALL") { @@ -667,6 +676,109 @@ namespace WPEFramework return Core::ERROR_NONE; } + + void NetworkManagerImplementation::dispatchEvent(NMPublishEvents event, const JsonObject ¶meters) + { + LOG_ENTRY_FUNCTION(); + Core::IWorkerPool::Instance().Submit(Job::Create(this, event, parameters)); + } + + void NetworkManagerImplementation::Dispatch(NMPublishEvents event, const JsonObject ¶meters) + { + LOG_ENTRY_FUNCTION(); + NMLOG_INFO("Posting %d Event\n", event); + std::list callbacks; + /* + * Fix: holding of _notificationLock lock until the all the subscribers being notified n returning is expensive and could lead to deadlock. + * So, Acquire the mutex, increase the ref count n release it. We Can release the ref after callback invocation. This is safer + */ + _notificationLock.Lock(); + for (auto* tmpCB : _notificationCallbacks) { + tmpCB->AddRef(); + callbacks.push_back(tmpCB); + } + _notificationLock.Unlock(); + + switch(event) + { + case NM_ON_INTERFACESTATE_CHANGE: + { + Exchange::INetworkManager::InterfaceState state = static_cast (parameters["state"].Number()); + string interface = parameters["interface"].String(); + for (const auto callback : callbacks) { + callback->onInterfaceStateChange(state, interface); + callback->Release(); + } + } + break; + case NM_ON_ACTIVEINTERFACE_CHANGE: + { + string prevActiveInterface = parameters["prevActiveInterface"].String(); + string currentActiveinterface = parameters["currentActiveInterface"].String(); + for (const auto callback : callbacks) { + callback->onActiveInterfaceChange(prevActiveInterface, currentActiveinterface); + callback->Release(); + } + } + break; + case NM_ON_IPADDRESS_CHANGE: + { + string interface = parameters["interface"].String(); + string ipversion = parameters["ipversion"].String(); + string ipaddress = parameters["ipaddress"].String(); + Exchange::INetworkManager::IPStatus status = static_cast (parameters["state"].Number()); + for (const auto callback : callbacks) { + callback->onIPAddressChange(interface, ipversion, ipaddress, status); + callback->Release(); + } + } + break; + case NM_ON_INTERNETSTATUS_CHANGE: + { + Exchange::INetworkManager::InternetStatus prevState = static_cast (parameters["prevState"].Number()); + Exchange::INetworkManager::InternetStatus currState = static_cast (parameters["Currstate"].Number()); + string interface = parameters["interface"].String(); + for (const auto callback : callbacks) { + callback->onInternetStatusChange(prevState, currState, interface); + callback->Release(); + } + } + break; + case NM_ON_AVAILABLESSIDS: + { + string jsonOfFilterScanResults; + parameters.ToString(jsonOfFilterScanResults); + for (const auto callback : callbacks) { + callback->onAvailableSSIDs(jsonOfFilterScanResults); + callback->Release(); + } + } + break; + case NM_ON_WIFISTATE_CHANGE: + { + Exchange::INetworkManager::WiFiState state = static_cast (parameters["state"].Number()); + for (const auto callback : callbacks) { + callback->onWiFiStateChange(state); + callback->Release(); + } + } + break; + case NM_ON_WIFISIGNALQUALITY_CHANGE: + { + string ssid = parameters["ssid"].String(); + Exchange::INetworkManager::WiFiSignalQuality quality = static_cast (parameters["quality"].Number()); + int snr = parameters["snr"].Number(); + int strength = parameters["strength"].Number(); + int noise = parameters["noise"].Number(); + for (const auto callback : callbacks) { + callback->onWiFiSignalQualityChange(ssid, strength, noise, snr, quality); + callback->Release(); + } + } + break; + } + } + void NetworkManagerImplementation::ReportInterfaceStateChange(const Exchange::INetworkManager::InterfaceState state, const string interface) { LOG_ENTRY_FUNCTION(); @@ -728,17 +840,20 @@ namespace WPEFramework m_wlanEnabled.store(true); } - _notificationLock.Lock(); - NMLOG_INFO("Posting onInterfaceChange %s - %u", interface.c_str(), (unsigned)state); - for (const auto callback : _notificationCallbacks) { - callback->onInterfaceStateChange(state, interface); + { + Core::JSON::EnumType iState{state}; + JsonObject parameters; + parameters["state"] = JsonValue(state); + parameters["interface"] = interface; + NMLOG_INFO("Posting onInterfaceChange %s - %u", interface.c_str(), (unsigned)state); + dispatchEvent(NM_ON_INTERFACESTATE_CHANGE, parameters); } - _notificationLock.Unlock(); + return; } void NetworkManagerImplementation::ReportActiveInterfaceChange(const string prevActiveInterface, const string currentActiveinterface) { - _notificationLock.Lock(); + LOG_ENTRY_FUNCTION(); NMLOG_INFO("Posting onActiveInterfaceChange %s", currentActiveinterface.c_str()); if(currentActiveinterface == "eth0") @@ -752,17 +867,18 @@ namespace WPEFramework m_wlanEnabled.store(true); } - // FIXME : This could be the place to define `m_defaultInterface` to incoming `currentActiveinterface`. - // m_defaultInterface = currentActiveinterface; + { + JsonObject parameters; + parameters["prevActiveInterface"] = prevActiveInterface; + parameters["currentActiveInterface"] = currentActiveinterface; - for (const auto callback : _notificationCallbacks) { - callback->onActiveInterfaceChange(prevActiveInterface, currentActiveinterface); + NMLOG_INFO("Posting onActiveInterfaceChange %s", currentActiveinterface.c_str()); + dispatchEvent(NM_ON_ACTIVEINTERFACE_CHANGE, parameters); } #if USE_TELEMETRY NMLOG_INFO("NM_INTERFACE_STATUS = Interface changed to %s", currentActiveinterface.c_str()); logTelemetry("NM_INTERFACE_STATUS", "Interface changed to " + currentActiveinterface); -#endif - _notificationLock.Unlock(); +#endif } void NetworkManagerImplementation::ReportIPAddressChange(const string interface, const string ipversion, const string ipaddress, const Exchange::INetworkManager::IPStatus status) @@ -798,19 +914,23 @@ namespace WPEFramework NMLOG_DEBUG("No need to trigger connectivity monitor interface is %s", interface.c_str()); } - _notificationLock.Lock(); - NMLOG_INFO("Posting onIPAddressChange %s: %s %s %s", - (Exchange::INetworkManager::IP_ACQUIRED == status) ? "IP acquired" : "IP lost", - interface.c_str(), ipversion.c_str(), ipaddress.c_str()); - for (const auto callback : _notificationCallbacks) { - callback->onIPAddressChange(interface, ipversion, ipaddress, status); + { + Core::JSON::EnumType iStatus{status}; + JsonObject parameters; + parameters["interface"] = interface; + parameters["ipversion"] = ipversion; + parameters["ipaddress"] = ipaddress; + parameters["state"] = JsonValue(status); + + NMLOG_INFO("Posting onIPAddressChange %s: %s %s %s", (Exchange::INetworkManager::IP_ACQUIRED == status) ? "IP acquired" : "IP lost", + interface.c_str(), ipversion.c_str(), ipaddress.c_str()); + dispatchEvent(NM_ON_IPADDRESS_CHANGE, parameters); } - _notificationLock.Unlock(); } void NetworkManagerImplementation::ReportInternetStatusChange(const Exchange::INetworkManager::InternetStatus prevState, const Exchange::INetworkManager::InternetStatus currState, const string interface) { - _notificationLock.Lock(); + LOG_ENTRY_FUNCTION(); NMLOG_INFO("Posting onInternetStatusChange with current state as %u", (unsigned)currState); #if USE_TELEMETRY // Log error only when ethernet is up and there's no internet @@ -823,19 +943,26 @@ namespace WPEFramework logTelemetry("NM_ETHERNET_CONNECTIVITY", "Ethernet connectivity failed"); } #endif - for (const auto callback : _notificationCallbacks) { - callback->onInternetStatusChange(prevState, currState, interface); + { + JsonObject parameters; + Core::JSON::EnumType prevStatus(prevState); + Core::JSON::EnumType currStatus(currState); + parameters["prevState"] = JsonValue(prevState); + parameters["Currstate"] = JsonValue(currState); + parameters["interface"] = interface; + dispatchEvent(NM_ON_INTERNETSTATUS_CHANGE, parameters); } + #if USE_TELEMETRY string stateStr = Core::EnumerateType(currState).Data(); NMLOG_INFO("NM_INTERNET_STATUS = %s", stateStr.c_str()); logTelemetry("NM_INTERNET_STATUS", stateStr); #endif - _notificationLock.Unlock(); } int32_t NetworkManagerImplementation::logSSIDs(Logging level, const JsonArray &ssids) { + LOG_ENTRY_FUNCTION(); Logging inLevel; GetLogLevel(inLevel); if (level > inLevel) @@ -855,7 +982,7 @@ namespace WPEFramework void NetworkManagerImplementation::ReportAvailableSSIDs(const JsonArray &arrayofWiFiScanResults) { - _notificationLock.Lock(); + LOG_ENTRY_FUNCTION(); string jsonOfWiFiScanResults; string jsonOfFilterScanResults; JsonArray filterResult = arrayofWiFiScanResults; @@ -864,20 +991,32 @@ namespace WPEFramework NMLOG_DEBUG("Discovered %d SSIDs before filtering as,", filterResult.Length()); logSSIDs(LOG_LEVEL_DEBUG, filterResult); - filterScanResults(filterResult); + // Snapshot filter vectors under lock, then release before calling filterScanResults + // to ensure exception-safety (std::stod can throw). + std::vector ssidsSnapshot; + std::vector frequenciesSnapshot; + m_filterVectorsLock.Lock(); + ssidsSnapshot = m_filterSsidslist; + frequenciesSnapshot = m_filterFrequencies; + m_filterVectorsLock.Unlock(); + + // Call filterScanResults outside the lock with snapshots (exception-safe) + filterScanResults(filterResult, ssidsSnapshot, frequenciesSnapshot); filterResult.ToString(jsonOfFilterScanResults); NMLOG_INFO("Posting onAvailableSSIDs event with %d SSIDs as,", filterResult.Length()); logSSIDs(LOG_LEVEL_INFO, filterResult); - for (const auto callback : _notificationCallbacks) { - callback->onAvailableSSIDs(jsonOfFilterScanResults); + { + JsonObject parameters; + parameters.FromString(jsonOfFilterScanResults); + dispatchEvent(NM_ON_AVAILABLESSIDS, parameters); } - _notificationLock.Unlock(); } void NetworkManagerImplementation::startWiFiSignalQualityMonitor(int interval) { + LOG_ENTRY_FUNCTION(); if (m_isRunning.load()) { NMLOG_INFO("WiFiSignalQualityMonitor Thread is already running."); return; @@ -893,6 +1032,7 @@ namespace WPEFramework void NetworkManagerImplementation::stopWiFiSignalQualityMonitor() { + LOG_ENTRY_FUNCTION(); if (!m_isRunning.load()) return; // No thread to stop @@ -1077,6 +1217,7 @@ namespace WPEFramework void NetworkManagerImplementation::processMonitor(uint16_t interval) { + LOG_ENTRY_FUNCTION(); pid_t pid = getpid(); string path = "/proc/"; @@ -1128,6 +1269,7 @@ namespace WPEFramework void NetworkManagerImplementation::monitorThreadFunction(int interval) { + LOG_ENTRY_FUNCTION(); static Exchange::INetworkManager::WiFiSignalQuality oldSignalQuality = Exchange::INetworkManager::WIFI_SIGNAL_DISCONNECTED; NMLOG_INFO("WiFiSignalQualityMonitor thread started ! (%d)", interval); while (true) @@ -1140,7 +1282,8 @@ namespace WPEFramework GetWiFiSignalQuality(ssid, strength, noise, snr, newSignalQuality); - m_lastConnectedSSID = ssid; // last connected ssid used in wifiConnect + if (!ssid.empty()) + m_lastConnectedSSID = ssid; // last connected ssid used in wifiConnect if (oldSignalQuality != newSignalQuality) { oldSignalQuality = newSignalQuality; @@ -1165,6 +1308,7 @@ namespace WPEFramework void NetworkManagerImplementation::ReportWiFiStateChange(const Exchange::INetworkManager::WiFiState state) { + LOG_ENTRY_FUNCTION(); /* start signal strength monitor when wifi connected */ if(INetworkManager::WiFiState::WIFI_STATE_CONNECTED == state) { @@ -1177,31 +1321,39 @@ namespace WPEFramework m_wlanConnected.store(false); /* Any other state is considered as WiFi not connected. */ } - _notificationLock.Lock(); NMLOG_INFO("Posting onWiFiStateChange (%d)", state); #if USE_TELEMETRY string stateStr = Core::EnumerateType(state).Data(); NMLOG_INFO("NM_WIFI_STATUS = %s", stateStr.c_str()); logTelemetry("NM_WIFI_STATUS", stateStr); #endif - for (const auto callback : _notificationCallbacks) { - callback->onWiFiStateChange(state); + { + JsonObject parameters; + Core::JSON::EnumType iState{state}; + parameters["state"] = JsonValue(state); + dispatchEvent(NM_ON_WIFISTATE_CHANGE, parameters); } - _notificationLock.Unlock(); } void NetworkManagerImplementation::ReportWiFiSignalQualityChange(const string ssid, const int strength, const int noise, const int snr, const Exchange::INetworkManager::WiFiSignalQuality quality) { - _notificationLock.Lock(); - NMLOG_INFO("Posting onWiFiSignalQualityChange %d", strength); - for (const auto callback : _notificationCallbacks) { - callback->onWiFiSignalQualityChange(ssid, strength, noise, snr, quality); + LOG_ENTRY_FUNCTION(); + { + JsonObject parameters; + parameters["ssid"] = ssid; + parameters["quality"] = JsonValue(quality); + parameters["snr"] = snr; + parameters["strength"] = strength; + parameters["noise"] = noise; + + NMLOG_INFO("Posting onWiFiSignalQualityChange %d", strength); + dispatchEvent(NM_ON_WIFISIGNALQUALITY_CHANGE, parameters); } - _notificationLock.Unlock(); } void NetworkManagerImplementation::logTelemetry(const std::string& eventName, const std::string& message) { + LOG_ENTRY_FUNCTION(); #if USE_TELEMETRY T2ERROR t2error = t2_event_s(eventName.c_str(), const_cast(message.c_str())); if (t2error != T2ERROR_SUCCESS) { @@ -1216,6 +1368,7 @@ namespace WPEFramework const Exchange::IPowerManager::PowerState newState, std::function sendAck) { + LOG_ENTRY_FUNCTION(); // Called from NetworkManagerPowerClient's power thread. NMLOG_DEBUG("OnPowerModePreChange: current=%d new=%d", static_cast(currentState), static_cast(newState)); @@ -1298,6 +1451,7 @@ namespace WPEFramework const Exchange::IPowerManager::PowerState currentState, const Exchange::IPowerManager::PowerState newState) { + LOG_ENTRY_FUNCTION(); NMLOG_INFO("OnPowerModeChanged: current=%d new=%d", static_cast(currentState), static_cast(newState)); if (currentState == Exchange::IPowerManager::PowerState::POWER_STATE_STANDBY_DEEP_SLEEP) { @@ -1429,6 +1583,7 @@ namespace WPEFramework Exchange::INetworkManager::IPAddress IpFamilyCache::toIPAddress() const { + LOG_ENTRY_FUNCTION(); Exchange::INetworkManager::IPAddress addr{}; /* Detect IP version from any available address. */ bool isIPv6 = false; diff --git a/plugin/NetworkManagerImplementation.h b/plugin/NetworkManagerImplementation.h index 65baa0b1..1d4408bb 100644 --- a/plugin/NetworkManagerImplementation.h +++ b/plugin/NetworkManagerImplementation.h @@ -209,21 +209,51 @@ namespace WPEFramework Core::JSON::DecUInt32 loglevel; }; + enum NMPublishEvents { + NM_ON_INTERFACESTATE_CHANGE = 0, + NM_ON_ACTIVEINTERFACE_CHANGE, + NM_ON_IPADDRESS_CHANGE, + NM_ON_INTERNETSTATUS_CHANGE, + NM_ON_AVAILABLESSIDS, + NM_ON_WIFISTATE_CHANGE, + NM_ON_WIFISIGNALQUALITY_CHANGE + }; - class Job : public Core::IDispatch { - public: - Job(function work) - : _work(work) - { + class EXTERNAL Job : public Core::IDispatch { + protected: + Job(NetworkManagerImplementation *NetworkManagerImplementation, NMPublishEvents event, JsonObject ¶ms) + : m_jobNWImpl(NetworkManagerImplementation) + , _event(event) + , _params(params) { + if (m_jobNWImpl != nullptr) { + m_jobNWImpl->AddRef(); + } } - void Dispatch() override - { - _work(); + + public: + Job() = delete; + Job(const Job&) = delete; + Job& operator=(const Job&) = delete; + ~Job() { + if (m_jobNWImpl != nullptr) { + m_jobNWImpl->Release(); + } } + public: + static Core::ProxyType Create(NetworkManagerImplementation *pNWImpl, NMPublishEvents event, JsonObject params) { + return (Core::ProxyType(Core::ProxyType::Create(pNWImpl, event, params))); + } + virtual void Dispatch() { + if (m_jobNWImpl != nullptr) { + m_jobNWImpl->Dispatch(_event, _params); + } + } private: - function _work; - }; + NetworkManagerImplementation *m_jobNWImpl; + const NMPublishEvents _event; + const JsonObject _params; + }; // class EXTERNAL Job public: NetworkManagerImplementation(); @@ -338,16 +368,19 @@ namespace WPEFramework void getInitialConnectionState(void); void executeExternally(NetworkEvents event, const string commandToExecute, string& response); void threadEventRegistration(bool iarmInit, bool iarmConnect); - void filterScanResults(JsonArray &ssids); + void filterScanResults(JsonArray &ssids, const std::vector& filterSsidslist, const std::vector& filterFrequencies); void startWiFiSignalQualityMonitor(int interval); void stopWiFiSignalQualityMonitor(); void monitorThreadFunction(int interval); int32_t logSSIDs(Logging level, const JsonArray &ssids); void processMonitor(uint16_t interval); + void dispatchEvent(NMPublishEvents event, const JsonObject& params); + void Dispatch(NMPublishEvents event, const JsonObject& params); private: std::list _notificationCallbacks; Core::CriticalSection _notificationLock; + Core::CriticalSection m_filterVectorsLock; string m_publicIP; stun::client stunClient; string m_stunEndpoint; @@ -409,6 +442,8 @@ namespace WPEFramework mutable std::mutex m_defaultInterfaceMutex; std::map, IpFamilyCache> m_ipCacheMap; mutable std::mutex m_ipCacheMutex; + + friend class Job; }; } } diff --git a/plugin/NetworkManagerLogger.h b/plugin/NetworkManagerLogger.h index 4c35f1ab..b5484c35 100644 --- a/plugin/NetworkManagerLogger.h +++ b/plugin/NetworkManagerLogger.h @@ -70,7 +70,7 @@ void logPrint(LogLevel level, const char* file, const char* func, int line, cons #define NMLOG_ERROR(FMT, ...) logPrint(NetworkManagerLogger::ERROR_LEVEL, __FILE__, __func__, __LINE__, FMT, ##__VA_ARGS__) #define NMLOG_FATAL(FMT, ...) logPrint(NetworkManagerLogger::FATAL_LEVEL, __FILE__,__func__, __LINE__, FMT, ##__VA_ARGS__) -#define LOG_ENTRY_FUNCTION() { NMLOG_DEBUG("Entering"); } +#define LOG_ENTRY_FUNCTION() { NMLOG_INFO("Entering %s", __func__); } } // namespace NetworkManagerLogger diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index 932dd9a8..30d065e8 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -762,9 +762,8 @@ namespace WPEFramework { uint32_t rc = Core::ERROR_RPC_CALL_FAILED; - //Cleared the Existing Store filterred SSID list - m_filterSsidslist.clear(); - m_filterFrequencies.clear(); + std::vector filteredSsids; + std::vector filteredFrequencies; if(ssids) { @@ -773,7 +772,7 @@ namespace WPEFramework { if (!tmpssidlist.empty()) { - m_filterSsidslist.push_back(tmpssidlist.c_str()); + filteredSsids.push_back(tmpssidlist); NMLOG_DEBUG("%s added to SSID filtering", tmpssidlist.c_str()); } else @@ -795,7 +794,7 @@ namespace WPEFramework const string normalizedFrequency = parsedFrequency.Data(); if ((!normalizedFrequency.empty()) && (normalizedFrequency == frequency)) { - m_filterFrequencies.push_back(normalizedFrequency); + filteredFrequencies.push_back(normalizedFrequency); NMLOG_DEBUG("Frequency %s added to scan filtering", normalizedFrequency.c_str()); } else @@ -811,8 +810,16 @@ namespace WPEFramework } } + m_filterVectorsLock.Lock(); + // Replace existing stored filters only after successful parsing/validation. + m_filterSsidslist.clear(); + m_filterFrequencies.clear(); + m_filterSsidslist = filteredSsids; + m_filterFrequencies = filteredFrequencies; + m_filterVectorsLock.Unlock(); + nmEvent->setwifiScanOptions(true); - if(wifi->wifiScanRequest(m_filterSsidslist)) + if(wifi->wifiScanRequest(filteredSsids)) rc = Core::ERROR_NONE; return rc; } diff --git a/plugin/rdk/NetworkManagerRDKProxy.cpp b/plugin/rdk/NetworkManagerRDKProxy.cpp index b163ae3c..b6b70e1a 100644 --- a/plugin/rdk/NetworkManagerRDKProxy.cpp +++ b/plugin/rdk/NetworkManagerRDKProxy.cpp @@ -973,6 +973,7 @@ const string CIDR_PREFIXES[CIDR_NETMASK_IP_LEN+1] = { IARM_Result_t retVal = IARM_RESULT_SUCCESS; //Cleared the Existing Store filterred SSID list + m_filterVectorsLock.Lock(); m_filterSsidslist.clear(); m_filterFrequencies.clear(); if(ssids) @@ -994,6 +995,7 @@ const string CIDR_PREFIXES[CIDR_NETMASK_IP_LEN+1] = { NMLOG_DEBUG("%s added to Frequency filtering", frequencyList.c_str()); } } + m_filterVectorsLock.Unlock(); memset(¶m, 0, sizeof(param));