From a4e4f4da458b81ca7c94899ec9c43bd037298e9f Mon Sep 17 00:00:00 2001 From: Karunakaran A Date: Mon, 29 Jun 2026 02:15:15 +0000 Subject: [PATCH] RDKEMW-20646 : Using Thread::WorkerPool to send the events Reason for change: All the NetworkManager Events are published from the calling thread context; somethings are from NMEvent, NMThread, somethings are from Connectivity thread and WiFiQualityMonitoring thread. When consumer is not responding properly, this will lead to extended lock & Sometimes Gnome NetworkManager Crash. To avoid this, all the events are sent thro Thread::WorkerPool that is default created by the Thunder. Test Procedure: Verify All the Networking Events Risks: Medium Signed-off-by: Karunakaran A --- legacy/CMakeLists.txt | 3 + legacy/LegacyNetworkAPIs.conf.in | 2 +- legacy/LegacyNetworkAPIs.config | 4 - legacy/LegacyWiFiManagerAPIs.conf.in | 2 +- legacy/LegacyWiFiManagerAPIs.config | 4 - plugin/CMakeLists.txt | 5 +- plugin/NetworkManager.conf.in | 2 +- plugin/NetworkManager.config | 27 ---- plugin/NetworkManagerImplementation.cpp | 202 +++++++++++++++++++----- plugin/NetworkManagerImplementation.h | 52 ++++-- plugin/NetworkManagerLogger.h | 2 +- 11 files changed, 216 insertions(+), 89 deletions(-) delete mode 100644 legacy/LegacyNetworkAPIs.config delete mode 100644 legacy/LegacyWiFiManagerAPIs.config delete mode 100644 plugin/NetworkManager.config 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..e8605e13 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,13 +598,14 @@ 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) { + LOG_ENTRY_FUNCTION(); JsonArray result; double filterFreq = 0.0; std::unordered_set scanForSsidsSet(m_filterSsidslist.begin(), m_filterSsidslist.end()); @@ -667,6 +674,92 @@ 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); + _notificationLock.Lock(); + 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 : _notificationCallbacks) { + callback->onInterfaceStateChange(state, interface); + } + } + break; + case NM_ON_ACTIVEINTERFACE_CHANGE: + { + string prevActiveInterface = parameters["prevActiveInterface"].String(); + string currentActiveinterface = parameters["currentActiveInterface"].String(); + for (const auto callback : _notificationCallbacks) { + callback->onActiveInterfaceChange(prevActiveInterface, currentActiveinterface); + } + } + 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 : _notificationCallbacks) { + callback->onIPAddressChange(interface, ipversion, ipaddress, status); + } + } + 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 : _notificationCallbacks) { + callback->onInternetStatusChange(prevState, currState, interface); + } + } + break; + case NM_ON_AVAILABLESSIDS: + { + string jsonOfFilterScanResults; + parameters.ToString(jsonOfFilterScanResults); + for (const auto callback : _notificationCallbacks) { + callback->onAvailableSSIDs(jsonOfFilterScanResults); + } + } + break; + case NM_ON_WIFISTATE_CHANGE: + { + Exchange::INetworkManager::WiFiState state = static_cast (parameters["state"].Number()); + for (const auto callback : _notificationCallbacks) { + callback->onWiFiStateChange(state); + } + } + 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 : _notificationCallbacks) { + callback->onWiFiSignalQualityChange(ssid, strength, noise, snr, quality); + } + } + break; + } + _notificationLock.Unlock(); + } + void NetworkManagerImplementation::ReportInterfaceStateChange(const Exchange::INetworkManager::InterfaceState state, const string interface) { LOG_ENTRY_FUNCTION(); @@ -728,18 +821,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(); - NMLOG_INFO("Posting onActiveInterfaceChange %s", currentActiveinterface.c_str()); + LOG_ENTRY_FUNCTION(); if(currentActiveinterface == "eth0") { @@ -752,17 +847,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(); } void NetworkManagerImplementation::ReportIPAddressChange(const string interface, const string ipversion, const string ipaddress, const Exchange::INetworkManager::IPStatus status) @@ -798,19 +894,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 +923,27 @@ 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 +963,7 @@ namespace WPEFramework void NetworkManagerImplementation::ReportAvailableSSIDs(const JsonArray &arrayofWiFiScanResults) { - _notificationLock.Lock(); + LOG_ENTRY_FUNCTION(); string jsonOfWiFiScanResults; string jsonOfFilterScanResults; JsonArray filterResult = arrayofWiFiScanResults; @@ -870,14 +978,16 @@ namespace WPEFramework 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 +1003,7 @@ namespace WPEFramework void NetworkManagerImplementation::stopWiFiSignalQualityMonitor() { + LOG_ENTRY_FUNCTION(); if (!m_isRunning.load()) return; // No thread to stop @@ -1077,6 +1188,7 @@ namespace WPEFramework void NetworkManagerImplementation::processMonitor(uint16_t interval) { + LOG_ENTRY_FUNCTION(); pid_t pid = getpid(); string path = "/proc/"; @@ -1128,6 +1240,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) @@ -1165,6 +1278,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 +1291,40 @@ 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 +1339,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 +1422,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 +1554,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..5daa6710 100644 --- a/plugin/NetworkManagerImplementation.h +++ b/plugin/NetworkManagerImplementation.h @@ -209,21 +209,49 @@ 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() { + m_jobNWImpl->Dispatch(_event, _params); + } private: - function _work; - }; + NetworkManagerImplementation *m_jobNWImpl; + const NMPublishEvents _event; + const JsonObject _params; + }; // class EXTERNAL Job public: NetworkManagerImplementation(); @@ -344,6 +372,8 @@ namespace WPEFramework 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; @@ -409,6 +439,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