diff --git a/src/hostif/profiles/wifi/Device_WiFi_EndPoint.cpp b/src/hostif/profiles/wifi/Device_WiFi_EndPoint.cpp index 72dfd8c58..de2011eeb 100644 --- a/src/hostif/profiles/wifi/Device_WiFi_EndPoint.cpp +++ b/src/hostif/profiles/wifi/Device_WiFi_EndPoint.cpp @@ -326,6 +326,7 @@ int hostIf_WiFi_EndPoint::refreshCache() int hostIf_WiFi_EndPoint::refreshCache() { LOG_ENTRY_EXIT; + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 1] refreshCache start\n", __FUNCTION__); static time_t time_of_last_successful_query = 0; static int last_call_status = NOK; @@ -336,39 +337,73 @@ int hostIf_WiFi_EndPoint::refreshCache() // Using a 1-second cache. if ((last_call_status == OK ) && (time (0) <= time_of_last_successful_query + 1)) { + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 2] Cache still valid, returning cached values\n", __FUNCTION__); RDK_LOG (RDK_LOG_DEBUG, LOG_TR69HOSTIF, "[%s] Cache not stale. last call status is SUCCESS, Refresh not required.\n", __FUNCTION__); return OK; } - + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 3] Fetching WifiState from NetworkManager\n", __FUNCTION__); std::string postData = "{\"jsonrpc\":\"2.0\",\"id\":\"42\",\"method\": \"org.rdk.NetworkManager.GetWifiState\"}"; string response = getJsonRPCData(std::move(postData)); + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 4] WifiState RPC returned\n", __FUNCTION__); if(response.c_str()) { RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "%s: curl response string = %s\n", __FUNCTION__, response.c_str()); cJSON* root = cJSON_Parse(response.c_str()); + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 5] WifiState JSON parse attempted\n", __FUNCTION__); if(root) { cJSON* jsonObj = cJSON_GetObjectItem(root, "result"); + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 6] WifiState result object lookup done\n", __FUNCTION__); if (jsonObj) { cJSON *interfaces = cJSON_GetObjectItem(jsonObj, "interfaces"); cJSON *interface = nullptr, *interfaceType; - for (int i = 0; i < cJSON_GetArraySize(interfaces); i++) { - interface = cJSON_GetArrayItem(interfaces, i); - interfaceType = cJSON_GetObjectItem(interface, "type"); - if (strcmp(interfaceType->valuestring, "WIFI") == 0) - break; - } + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 7] Iterating interfaces to find WIFI\n", __FUNCTION__); + if (cJSON_IsArray(interfaces)) + { + for (int i = 0; i < cJSON_GetArraySize(interfaces); i++) { + interface = cJSON_GetArrayItem(interfaces, i); + interfaceType = cJSON_GetObjectItem(interface, "type"); + if (cJSON_IsString(interfaceType) && interfaceType->valuestring && (strcmp(interfaceType->valuestring, "WIFI") == 0)) + break; + } + } + else + { + RDK_LOG (RDK_LOG_WARN, LOG_TR69HOSTIF, "[%s][STEP 7-WARN] WifiState response has no interfaces array\n", __FUNCTION__); + } //ASSIGN TO OP HERE - cJSON *result = cJSON_GetObjectItem(interface, "enabled"); - Enable = result->type; + if (interface) + { + cJSON *result = cJSON_GetObjectItem(interface, "enabled"); + if (cJSON_IsBool(result)) + { + Enable = cJSON_IsTrue(result); + } + else if (cJSON_IsNumber(result)) + { + Enable = (0 != result->valueint); + } + } + else + { + RDK_LOG (RDK_LOG_WARN, LOG_TR69HOSTIF, "[%s][STEP 8-WARN] WIFI interface not found, keeping existing Enable value\n", __FUNCTION__); + } + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 8] Enable parsed from WifiState\n", __FUNCTION__); cJSON *state = cJSON_GetObjectItem(jsonObj, "state"); - int res = state->valueint; + if (!cJSON_IsNumber(state)) + { + RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "[%s][STEP 9-FAIL] WifiState result missing numeric state\n", __FUNCTION__); + cJSON_Delete(root); + return NOK; + } + int res = state->valueint; + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 9] Endpoint state value received: %d\n", __FUNCTION__, res); switch (res) { case 0: strncpy(Status, "UNINSTALLED", BUFF_LENGTH_64); @@ -412,10 +447,15 @@ int hostIf_WiFi_EndPoint::refreshCache() case 13: strncpy(Status, "ERROR", BUFF_LENGTH_64); break; + default: + strncpy(Status, "ERROR", BUFF_LENGTH_64); + break; } + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 10] Status mapping completed: %s\n", __FUNCTION__, Status); } else { + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 6-FAIL] WifiState result object missing\n", __FUNCTION__); RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "[%s] json parse error, no \"result\" in the output from Thunder plugin\n", __FUNCTION__); cJSON_Delete(root); return NOK; @@ -424,36 +464,60 @@ int hostIf_WiFi_EndPoint::refreshCache() } else { + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 5-FAIL] WifiState JSON parse failed\n", __FUNCTION__); RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "%s: json parse error\n", __FUNCTION__); return NOK; } } else { + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 4-FAIL] WifiState RPC returned empty/null response\n", __FUNCTION__); RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "%s: curl init failed\n", __FUNCTION__); return NOK; } + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 11] Fetching ConnectedSSID from NetworkManager\n", __FUNCTION__); postData = "{\"jsonrpc\":\"2.0\",\"id\":\"42\",\"method\": \"org.rdk.NetworkManager.GetConnectedSSID\"}"; response = getJsonRPCData(postData); + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 12] ConnectedSSID RPC returned\n", __FUNCTION__); if(response.c_str()) { RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "%s: curl response string = %s\n", __FUNCTION__, response.c_str()); cJSON* root = cJSON_Parse(response.c_str()); + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 13] ConnectedSSID JSON parse attempted\n", __FUNCTION__); if(root) { cJSON* jsonObj = cJSON_GetObjectItem(root, "result"); + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 14] ConnectedSSID result object lookup done\n", __FUNCTION__); if (jsonObj) { cJSON *ssid = cJSON_GetObjectItem(jsonObj, "ssid"); + cJSON *strength = cJSON_GetObjectItem(jsonObj, "strength"); + if (!(cJSON_IsString(ssid) && ssid->valuestring)) + { + RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "[%s][STEP 15-FAIL] ConnectedSSID result missing ssid string\n", __FUNCTION__); + cJSON_Delete(root); + return NOK; + } //ASSIGN TO OP HERE strncpy (SSIDReference, ssid->valuestring, BUFF_LENGTH_256); SSIDReference[BUFF_LENGTH_256 - 1] = '\0'; + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 15] SSIDReference parsed: %s\n", __FUNCTION__, SSIDReference); + if (cJSON_IsNumber(strength)) + { + stats.SignalStrength = strength->valueint; + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 15A] Signal strength fallback parsed from ConnectedSSID: %d\n", __FUNCTION__, stats.SignalStrength); + } + else + { + RDK_LOG (RDK_LOG_WARN, LOG_TR69HOSTIF, "[%s][STEP 15A-WARN] ConnectedSSID result missing numeric strength, keeping existing value: %d\n", __FUNCTION__, stats.SignalStrength); + } } else { + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 14-FAIL] ConnectedSSID result object missing\n", __FUNCTION__); RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "[%s] json parse error, no \"result\" in the output from Thunder plugin\n", __FUNCTION__); cJSON_Delete(root); return NOK; @@ -462,54 +526,22 @@ int hostIf_WiFi_EndPoint::refreshCache() } else { + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 13-FAIL] ConnectedSSID JSON parse failed\n", __FUNCTION__); RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "%s: json parse error\n", __FUNCTION__); return NOK; } } else { + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 12-FAIL] ConnectedSSID RPC returned empty/null response\n", __FUNCTION__); RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "%s: curl init failed\n", __FUNCTION__); return NOK; } - - postData = "{\"jsonrpc\":\"2.0\",\"id\":\"42\",\"method\": \"org.rdk.NetworkManager.GetWiFiSignalStrength\"}"; - response = getJsonRPCData(std::move(postData)); - if(response.c_str()) - { - RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "%s: curl response string = %s\n", __FUNCTION__, response.c_str()); - cJSON* root = cJSON_Parse(response.c_str()); - if(root) - { - cJSON* jsonObj = cJSON_GetObjectItem(root, "result"); - - if (jsonObj) - { - cJSON *sigstr = cJSON_GetObjectItem(jsonObj, "signalStrength"); - //ASSIGN TO OP HERE - stats.SignalStrength = sigstr->valueint; - } - else - { - RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "[%s] json parse error, no \"result\" in the output from Thunder plugin\n", __FUNCTION__); - cJSON_Delete(root); - return NOK; - } - cJSON_Delete(root); - } - else - { - RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "%s: json parse error\n", __FUNCTION__); - return NOK; - } - } - else - { - RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "%s: curl init failed\n", __FUNCTION__); - return NOK; - } + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 16] SignalStrength is sourced from ConnectedSSID RPC\n", __FUNCTION__); time_of_last_successful_query = time (0); + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 21] Cache timestamp updated\n", __FUNCTION__); //strncpy (Alias, param.data.endPointInfo.alias, BUFF_LENGTH_64); //strncpy (ProfileReference, param.data.endPointInfo.ProfileReference, BUFF_LENGTH_256); @@ -519,10 +551,12 @@ int hostIf_WiFi_EndPoint::refreshCache() if (false == Enable) // "Disabled" endpoint { + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 22] Endpoint disabled path hit\n", __FUNCTION__); RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF, "[%s] EndPoint is disabled\n", __FUNCTION__); last_call_status = NOK; return OK; } + RDK_LOG (RDK_LOG_INFO, LOG_TR69HOSTIF, "[%s][STEP 23] refreshCache completed successfully\n", __FUNCTION__); last_call_status = OK; return OK; } diff --git a/src/hostif/src/gtest/gtest_src.cpp b/src/hostif/src/gtest/gtest_src.cpp index 639b3f0a8..3f175c559 100644 --- a/src/hostif/src/gtest/gtest_src.cpp +++ b/src/hostif/src/gtest/gtest_src.cpp @@ -49,7 +49,7 @@ extern "C" using namespace std; #ifdef GTEST_ENABLE -extern size_t (*getWriteCurlResponse(void))(void *ptr, size_t size, size_t nmemb, std::string stream); +extern size_t (*getWriteCurlResponse(void))(void *ptr, size_t size, size_t nmemb, void *userdata); #endif XRFCStore* m_rfcStore; @@ -306,7 +306,7 @@ TEST(srcTest, writeCurlResponse) { size_t size = 1; size_t nmemb = strlen(input); std::string response; - size_t written = getWriteCurlResponse()((void*)input, size, nmemb, response); + size_t written = getWriteCurlResponse()((void*)input, size, nmemb, &response); EXPECT_EQ(written, nmemb); } diff --git a/src/hostif/src/hostIf_utils.cpp b/src/hostif/src/hostIf_utils.cpp index 68627f913..c8a6d5278 100644 --- a/src/hostif/src/hostIf_utils.cpp +++ b/src/hostif/src/hostIf_utils.cpp @@ -554,12 +554,17 @@ std::string get_security_token() { return sToken; } -size_t static writeCurlResponse(void *ptr, size_t size, size_t nmemb, string stream); -size_t static writeCurlResponse(void *ptr, size_t size, size_t nmemb, string stream) +size_t static writeCurlResponse(void *ptr, size_t size, size_t nmemb, void *userdata); +size_t static writeCurlResponse(void *ptr, size_t size, size_t nmemb, void *userdata) { size_t realsize = size * nmemb; - string temp(static_cast(ptr), realsize); - stream.append(temp); + if ((NULL == ptr) || (NULL == userdata)) + { + return 0; + } + + string* stream = static_cast(userdata); + stream->append(static_cast(ptr), realsize); return realsize; } @@ -644,7 +649,7 @@ string getJsonRPCData(std::string postData) } #ifdef GTEST_ENABLE -size_t (*getWriteCurlResponse(void))(void *ptr, size_t size, size_t nmemb, std::string stream) { +size_t (*getWriteCurlResponse(void))(void *ptr, size_t size, size_t nmemb, void *userdata) { return &writeCurlResponse; } #endif