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