13f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh/* 23f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * Copyright (C) 2017 The Android Open Source Project 33f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * 43f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * Licensed under the Apache License, Version 2.0 (the "License"); 53f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * you may not use this file except in compliance with the License. 63f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * You may obtain a copy of the License at 73f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * 83f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * http://www.apache.org/licenses/LICENSE-2.0 93f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * 103f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * Unless required by applicable law or agreed to in writing, software 113f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * distributed under the License is distributed on an "AS IS" BASIS, 123f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * See the License for the specific language governing permissions and 143f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * limitations under the License. 153f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh */ 163f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 173f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh#include <algorithm> 183f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh#include <cctype> 193f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 203f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh#include "chre/apps/wifi_offload/utility.h" 213f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh#include "chre/apps/wifi_offload/wifi_offload.h" 223f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 233f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehnamespace wifi_offload { 243f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehnamespace utility { 253f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehnamespace { 263f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 273f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh// The length of a string SSID with null-terminator. 283f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehconstexpr size_t kMaxSsidStrLen = CHRE_WIFI_SSID_MAX_LEN + 1; 293f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh// The length of a formatted BSSID string in XX:XX:XX:XX:XX:XX\0 format. 303f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehconstexpr size_t kBssidStrLen = 18; 313f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 323f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehbool ParseSsidToStr(const uint8_t *ssid, size_t ssid_len, char *ssid_str, 333f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh size_t ssid_str_len) { 343f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh if (ssid_str_len < ssid_len + 1) { 353f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return false; 363f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } 373f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh // Verify that the ssid is entirely printable characters and ASCII spaces. 383f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh for (uint8_t i = 0; i < ssid_len; i++) { 393f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh if (!std::isgraph(ssid[i]) && ssid[i] != ' ') { 403f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return false; 413f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } 423f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } 433f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 443f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh std::memcpy(ssid_str, ssid, ssid_len); 453f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh ssid_str[ssid_len] = '\0'; 463f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return true; 473f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} 483f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 493f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehbool ParseBssidToStr(const uint8_t bssid[CHRE_WIFI_BSSID_LEN], char *bssid_str, 503f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh size_t bssid_str_len) { 513f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh if (bssid_str_len < kBssidStrLen) { 523f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return false; 533f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } 543f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 553f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh const char *kFormat = "%02" PRIx8 ":%02" PRIx8 ":%02" PRIx8 ":%02" PRIx8 563f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh ":%02" PRIx8 ":%02" PRIx8; 573f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh std::snprintf(bssid_str, bssid_str_len, kFormat, bssid[0], bssid[1], bssid[2], 583f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh bssid[3], bssid[4], bssid[5]); 593f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return true; 603f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} 613f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 623f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehconst char *ParseChreWifiBand(uint8_t band) { 633f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh switch (band) { 643f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case CHRE_WIFI_BAND_2_4_GHZ: 653f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "2.4GHz"; 663f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case CHRE_WIFI_BAND_5_GHZ: 673f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "5GHz"; 683f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh default: 693f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "<invalid>"; 703f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } 713f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} 723f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 733f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} // namespace 743f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 753f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehint Ieee80211FrequencyToChannel(int freq) { 763f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh /* see 802.11-2007 17.3.8.3.2 and Annex J */ 773f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh if (freq == 2484) 783f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return 14; 793f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh else if (freq < 2484) 803f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return (freq - 2407) / 5; 813f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh else if (freq >= 4910 && freq <= 4980) 823f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return (freq - 4000) / 5; 833f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh else if (freq <= 45000) /* DMG band lower limit */ 843f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return (freq - 5000) / 5; 853f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh else if (freq >= 58320 && freq <= 64800) 863f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return (freq - 56160) / 2160; 873f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh else 883f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return 0; 893f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} 903f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 913f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehvoid LogSsid(const uint8_t *ssid, uint8_t ssid_len) { 923f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh const char *ssid_str = "<non-printable>"; 933f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh char ssid_buffer[kMaxSsidStrLen]; 943f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh if (ssid_len == 0) { 953f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh ssid_str = "<empty>"; 963f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } else if (ParseSsidToStr(ssid, ssid_len, ssid_buffer, kMaxSsidStrLen)) { 973f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh ssid_str = ssid_buffer; 983f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } else { 993f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh // ssid has non-printable ASCII chars, parse in hex format 1003f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh char ssid_hex_buffer[CHRE_WIFI_SSID_MAX_LEN * 3]; 1013f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh char *buf_ptr = ssid_hex_buffer; 1023f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh for (size_t i = 0; i < ssid_len; i++) { 1033f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh buf_ptr += std::sprintf(buf_ptr, "%02" PRIx8 ":", ssid[i]); 1043f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } 1053f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh buf_ptr[-1] = '\0'; 1063f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh ssid_str = ssid_hex_buffer; 1073f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } 1083f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" ssid: %s", ssid_str); 1093f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} 1103f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 1113f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehvoid LogBssid(const uint8_t *bssid) { 1123f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh const char *bssid_str = "<non-printable>"; 1133f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh char bssidBuffer[kBssidStrLen]; 1143f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh if (ParseBssidToStr(bssid, bssidBuffer, kBssidStrLen)) { 1153f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh bssid_str = bssidBuffer; 1163f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } 1173f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" bssid: %s", bssid_str); 1183f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} 1193f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 1203f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehvoid LogChreScanResult(const chreWifiScanResult &result) { 1213f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI("chreWifiScanResult:"); 1223f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LogSsid(result.ssid, result.ssidLen); 1233f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" age (ms): %" PRIu32, result.ageMs); 1243f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" capability info: 0x%" PRIx16, result.capabilityInfo); 1253f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LogBssid(result.bssid); 1263f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" flags: 0x%" PRIx8, result.flags); 1273f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" rssi: %" PRId8 "dBm", result.rssi); 1283f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" band: %s (%" PRIu8 ")", ParseChreWifiBand(result.band), result.band); 1293f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" primary channel: %" PRIu32, result.primaryChannel); 1303f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" center frequency primary: %" PRIu32, result.centerFreqPrimary); 1313f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" center frequency secondary: %" PRIu32, result.centerFreqSecondary); 1323f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" channel width: %" PRIu8, result.channelWidth); 1333f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh LOGI(" security mode: %" PRIu8, result.securityMode); 1343f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} 1353f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 1363f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehconst char *GetErrorCodeName(ErrorCode error_code) { 1373f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh switch (error_code) { 1383f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case SUCCESS: 1393f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "SUCCESS"; 1403f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_ALLOCATE_MESSAGE_BUFFER: 1413f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_ALLOCATE_MESSAGE_BUFFER"; 1423f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_SERIALIZE_MESSAGE: 1433f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_SERIALIZE_MESSAGE"; 1443f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_SEND_MESSAGE: 1453f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_SEND_MESSAGE"; 1463f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_DESERIALIZE_SCAN_CONFIG: 1473f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_DESERIALIZE_SCAN_CONFIG"; 1483f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case INVALID_SUBSCRIBE_MESSAGE_SIZE: 1493f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "INVALID_SUBSCRIBE_MESSAGE_SIZE"; 1503f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case SCAN_CONFIG_NOT_INITIALIZED: 1513f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "SCAN_CONFIG_NOT_INITIALIZED"; 1523f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case UNSPECIFIED_HOST_ENDPOINT: 1533f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "UNSPECIFIED_HOST_ENDPOINT"; 1543f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_SEND_SCAN_RESULTS: 1553f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_SEND_SCAN_RESULTS"; 1563f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_SEND_SCAN_STATS: 1573f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_SEND_SCAN_STATS"; 1583f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case SCAN_MONITORING_NOT_SUPPORTED: 1593f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "SCAN_MONITORING_NOT_SUPPORTED"; 1603f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_START_SCAN_MONITORING: 1613f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_START_SCAN_MONITORING"; 1623f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_STOP_SCAN_MONITORING: 1633f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_STOP_SCAN_MONITORING"; 1643f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_CONFIGURE_SCAN_MONITORING_ASYNC: 1653f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_CONFIGURE_SCAN_MONITORING_ASYNC"; 1663f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case ONDEMAND_SCAN_NOT_SUPPORTED: 1673f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "ONDEMAND_SCAN_NOT_SUPPORTED"; 1683f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_SEND_ONDEMAND_SCAN_REQUEST: 1693f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_SEND_ONDEMAND_SCAN_REQUEST"; 1703f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_SEND_ONDEMAND_SCAN_REQUEST_ASYNC: 1713f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_SEND_ONDEMAND_SCAN_REQUEST_ASYNC"; 1723f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case OUT_OF_ORDER_SCAN_RESULTS: 1733f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "OUT_OF_ORDER_SCAN_RESULTS"; 1743f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case INCOMPLETE_SCAN_RESULTS_BEFORE_SCAN_REQUEST: 1753f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "INCOMPLETE_SCAN_RESULTS_BEFORE_SCAN_REQUEST"; 1763f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh case FAILED_TO_SET_SCAN_TIMER: 1773f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "FAILED_TO_SET_SCAN_TIMER"; 1783f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh default: 1793f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh return "UNKNOWN_ERROR"; 1803f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh } 1813f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} 1823f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh 1833f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} // namespace utility 1843f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh} // namespace wifi_offload 185