xref: /aosp_15_r20/system/chre/apps/wifi_offload/utility.cc (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker  *
4*84e33947SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker  *
8*84e33947SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker  *
10*84e33947SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker  * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker  */
16*84e33947SAndroid Build Coastguard Worker 
17*84e33947SAndroid Build Coastguard Worker #include <algorithm>
18*84e33947SAndroid Build Coastguard Worker #include <cctype>
19*84e33947SAndroid Build Coastguard Worker 
20*84e33947SAndroid Build Coastguard Worker #include "chre/apps/wifi_offload/utility.h"
21*84e33947SAndroid Build Coastguard Worker #include "chre/apps/wifi_offload/wifi_offload.h"
22*84e33947SAndroid Build Coastguard Worker 
23*84e33947SAndroid Build Coastguard Worker namespace wifi_offload {
24*84e33947SAndroid Build Coastguard Worker namespace utility {
25*84e33947SAndroid Build Coastguard Worker namespace {
26*84e33947SAndroid Build Coastguard Worker 
27*84e33947SAndroid Build Coastguard Worker // The length of a string SSID with null-terminator.
28*84e33947SAndroid Build Coastguard Worker constexpr size_t kMaxSsidStrLen = CHRE_WIFI_SSID_MAX_LEN + 1;
29*84e33947SAndroid Build Coastguard Worker // The length of a formatted BSSID string in XX:XX:XX:XX:XX:XX\0 format.
30*84e33947SAndroid Build Coastguard Worker constexpr size_t kBssidStrLen = 18;
31*84e33947SAndroid Build Coastguard Worker 
ParseSsidToStr(const uint8_t * ssid,size_t ssid_len,char * ssid_str,size_t ssid_str_len)32*84e33947SAndroid Build Coastguard Worker bool ParseSsidToStr(const uint8_t *ssid, size_t ssid_len, char *ssid_str,
33*84e33947SAndroid Build Coastguard Worker                     size_t ssid_str_len) {
34*84e33947SAndroid Build Coastguard Worker   if (ssid_str_len < ssid_len + 1) {
35*84e33947SAndroid Build Coastguard Worker     return false;
36*84e33947SAndroid Build Coastguard Worker   }
37*84e33947SAndroid Build Coastguard Worker   // Verify that the ssid is entirely printable characters and ASCII spaces.
38*84e33947SAndroid Build Coastguard Worker   for (uint8_t i = 0; i < ssid_len; i++) {
39*84e33947SAndroid Build Coastguard Worker     if (!std::isgraph(ssid[i]) && ssid[i] != ' ') {
40*84e33947SAndroid Build Coastguard Worker       return false;
41*84e33947SAndroid Build Coastguard Worker     }
42*84e33947SAndroid Build Coastguard Worker   }
43*84e33947SAndroid Build Coastguard Worker 
44*84e33947SAndroid Build Coastguard Worker   std::memcpy(ssid_str, ssid, ssid_len);
45*84e33947SAndroid Build Coastguard Worker   ssid_str[ssid_len] = '\0';
46*84e33947SAndroid Build Coastguard Worker   return true;
47*84e33947SAndroid Build Coastguard Worker }
48*84e33947SAndroid Build Coastguard Worker 
ParseBssidToStr(const uint8_t bssid[CHRE_WIFI_BSSID_LEN],char * bssid_str,size_t bssid_str_len)49*84e33947SAndroid Build Coastguard Worker bool ParseBssidToStr(const uint8_t bssid[CHRE_WIFI_BSSID_LEN], char *bssid_str,
50*84e33947SAndroid Build Coastguard Worker                      size_t bssid_str_len) {
51*84e33947SAndroid Build Coastguard Worker   if (bssid_str_len < kBssidStrLen) {
52*84e33947SAndroid Build Coastguard Worker     return false;
53*84e33947SAndroid Build Coastguard Worker   }
54*84e33947SAndroid Build Coastguard Worker 
55*84e33947SAndroid Build Coastguard Worker   const char *kFormat = "%02" PRIx8 ":%02" PRIx8 ":%02" PRIx8 ":%02" PRIx8
56*84e33947SAndroid Build Coastguard Worker                         ":%02" PRIx8 ":%02" PRIx8;
57*84e33947SAndroid Build Coastguard Worker   std::snprintf(bssid_str, bssid_str_len, kFormat, bssid[0], bssid[1], bssid[2],
58*84e33947SAndroid Build Coastguard Worker                 bssid[3], bssid[4], bssid[5]);
59*84e33947SAndroid Build Coastguard Worker   return true;
60*84e33947SAndroid Build Coastguard Worker }
61*84e33947SAndroid Build Coastguard Worker 
ParseChreWifiBand(uint8_t band)62*84e33947SAndroid Build Coastguard Worker const char *ParseChreWifiBand(uint8_t band) {
63*84e33947SAndroid Build Coastguard Worker   switch (band) {
64*84e33947SAndroid Build Coastguard Worker     case CHRE_WIFI_BAND_2_4_GHZ:
65*84e33947SAndroid Build Coastguard Worker       return "2.4GHz";
66*84e33947SAndroid Build Coastguard Worker     case CHRE_WIFI_BAND_5_GHZ:
67*84e33947SAndroid Build Coastguard Worker       return "5GHz";
68*84e33947SAndroid Build Coastguard Worker     default:
69*84e33947SAndroid Build Coastguard Worker       return "<invalid>";
70*84e33947SAndroid Build Coastguard Worker   }
71*84e33947SAndroid Build Coastguard Worker }
72*84e33947SAndroid Build Coastguard Worker 
73*84e33947SAndroid Build Coastguard Worker }  // namespace
74*84e33947SAndroid Build Coastguard Worker 
Ieee80211FrequencyToChannel(int freq)75*84e33947SAndroid Build Coastguard Worker int Ieee80211FrequencyToChannel(int freq) {
76*84e33947SAndroid Build Coastguard Worker   /* see 802.11-2007 17.3.8.3.2 and Annex J */
77*84e33947SAndroid Build Coastguard Worker   if (freq == 2484)
78*84e33947SAndroid Build Coastguard Worker     return 14;
79*84e33947SAndroid Build Coastguard Worker   else if (freq < 2484)
80*84e33947SAndroid Build Coastguard Worker     return (freq - 2407) / 5;
81*84e33947SAndroid Build Coastguard Worker   else if (freq >= 4910 && freq <= 4980)
82*84e33947SAndroid Build Coastguard Worker     return (freq - 4000) / 5;
83*84e33947SAndroid Build Coastguard Worker   else if (freq <= 45000) /* DMG band lower limit */
84*84e33947SAndroid Build Coastguard Worker     return (freq - 5000) / 5;
85*84e33947SAndroid Build Coastguard Worker   else if (freq >= 58320 && freq <= 64800)
86*84e33947SAndroid Build Coastguard Worker     return (freq - 56160) / 2160;
87*84e33947SAndroid Build Coastguard Worker   else
88*84e33947SAndroid Build Coastguard Worker     return 0;
89*84e33947SAndroid Build Coastguard Worker }
90*84e33947SAndroid Build Coastguard Worker 
LogSsid(const uint8_t * ssid,uint8_t ssid_len)91*84e33947SAndroid Build Coastguard Worker void LogSsid(const uint8_t *ssid, uint8_t ssid_len) {
92*84e33947SAndroid Build Coastguard Worker   const char *ssid_str = "<non-printable>";
93*84e33947SAndroid Build Coastguard Worker   char
94*84e33947SAndroid Build Coastguard Worker       ssid_buffer[std::max<size_t>(kMaxSsidStrLen, CHRE_WIFI_SSID_MAX_LEN * 3)];
95*84e33947SAndroid Build Coastguard Worker   if (ssid_len == 0) {
96*84e33947SAndroid Build Coastguard Worker     ssid_str = "<empty>";
97*84e33947SAndroid Build Coastguard Worker   } else if (ParseSsidToStr(ssid, ssid_len, ssid_buffer, kMaxSsidStrLen)) {
98*84e33947SAndroid Build Coastguard Worker     ssid_str = ssid_buffer;
99*84e33947SAndroid Build Coastguard Worker   } else {
100*84e33947SAndroid Build Coastguard Worker     // ssid has non-printable ASCII chars, parse in hex format
101*84e33947SAndroid Build Coastguard Worker     char *buf_ptr = ssid_buffer;
102*84e33947SAndroid Build Coastguard Worker     for (size_t i = 0; i < ssid_len; i++) {
103*84e33947SAndroid Build Coastguard Worker       buf_ptr += std::sprintf(buf_ptr, "%02" PRIx8 ":", ssid[i]);
104*84e33947SAndroid Build Coastguard Worker     }
105*84e33947SAndroid Build Coastguard Worker     buf_ptr[-1] = '\0';
106*84e33947SAndroid Build Coastguard Worker     ssid_str = ssid_buffer;
107*84e33947SAndroid Build Coastguard Worker   }
108*84e33947SAndroid Build Coastguard Worker   LOGI("  ssid: %s", ssid_str);
109*84e33947SAndroid Build Coastguard Worker }
110*84e33947SAndroid Build Coastguard Worker 
LogBssid(const uint8_t * bssid)111*84e33947SAndroid Build Coastguard Worker void LogBssid(const uint8_t *bssid) {
112*84e33947SAndroid Build Coastguard Worker   const char *bssid_str = "<non-printable>";
113*84e33947SAndroid Build Coastguard Worker   char bssidBuffer[kBssidStrLen];
114*84e33947SAndroid Build Coastguard Worker   if (ParseBssidToStr(bssid, bssidBuffer, kBssidStrLen)) {
115*84e33947SAndroid Build Coastguard Worker     bssid_str = bssidBuffer;
116*84e33947SAndroid Build Coastguard Worker   }
117*84e33947SAndroid Build Coastguard Worker   LOGI("  bssid: %s", bssid_str);
118*84e33947SAndroid Build Coastguard Worker }
119*84e33947SAndroid Build Coastguard Worker 
LogChreScanResult(const chreWifiScanResult & result)120*84e33947SAndroid Build Coastguard Worker void LogChreScanResult(const chreWifiScanResult &result) {
121*84e33947SAndroid Build Coastguard Worker   LOGI("chreWifiScanResult:");
122*84e33947SAndroid Build Coastguard Worker   LogSsid(result.ssid, result.ssidLen);
123*84e33947SAndroid Build Coastguard Worker   LOGI("  age (ms): %" PRIu32, result.ageMs);
124*84e33947SAndroid Build Coastguard Worker   LOGI("  capability info: 0x%" PRIx16, result.capabilityInfo);
125*84e33947SAndroid Build Coastguard Worker   LogBssid(result.bssid);
126*84e33947SAndroid Build Coastguard Worker   LOGI("  flags: 0x%" PRIx8, result.flags);
127*84e33947SAndroid Build Coastguard Worker   LOGI("  rssi: %" PRId8 "dBm", result.rssi);
128*84e33947SAndroid Build Coastguard Worker   LOGI("  band: %s (%" PRIu8 ")", ParseChreWifiBand(result.band), result.band);
129*84e33947SAndroid Build Coastguard Worker   LOGI("  primary channel: %" PRIu32, result.primaryChannel);
130*84e33947SAndroid Build Coastguard Worker   LOGI("  center frequency primary: %" PRIu32, result.centerFreqPrimary);
131*84e33947SAndroid Build Coastguard Worker   LOGI("  center frequency secondary: %" PRIu32, result.centerFreqSecondary);
132*84e33947SAndroid Build Coastguard Worker   LOGI("  channel width: %" PRIu8, result.channelWidth);
133*84e33947SAndroid Build Coastguard Worker   LOGI("  security mode: %" PRIu8, result.securityMode);
134*84e33947SAndroid Build Coastguard Worker }
135*84e33947SAndroid Build Coastguard Worker 
GetErrorCodeName(ErrorCode error_code)136*84e33947SAndroid Build Coastguard Worker const char *GetErrorCodeName(ErrorCode error_code) {
137*84e33947SAndroid Build Coastguard Worker   switch (error_code) {
138*84e33947SAndroid Build Coastguard Worker     case SUCCESS:
139*84e33947SAndroid Build Coastguard Worker       return "SUCCESS";
140*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_ALLOCATE_MESSAGE_BUFFER:
141*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_ALLOCATE_MESSAGE_BUFFER";
142*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_SERIALIZE_MESSAGE:
143*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_SERIALIZE_MESSAGE";
144*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_SEND_MESSAGE:
145*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_SEND_MESSAGE";
146*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_DESERIALIZE_SCAN_CONFIG:
147*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_DESERIALIZE_SCAN_CONFIG";
148*84e33947SAndroid Build Coastguard Worker     case INVALID_SUBSCRIBE_MESSAGE_SIZE:
149*84e33947SAndroid Build Coastguard Worker       return "INVALID_SUBSCRIBE_MESSAGE_SIZE";
150*84e33947SAndroid Build Coastguard Worker     case SCAN_CONFIG_NOT_INITIALIZED:
151*84e33947SAndroid Build Coastguard Worker       return "SCAN_CONFIG_NOT_INITIALIZED";
152*84e33947SAndroid Build Coastguard Worker     case UNSPECIFIED_HOST_ENDPOINT:
153*84e33947SAndroid Build Coastguard Worker       return "UNSPECIFIED_HOST_ENDPOINT";
154*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_SEND_SCAN_RESULTS:
155*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_SEND_SCAN_RESULTS";
156*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_SEND_SCAN_STATS:
157*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_SEND_SCAN_STATS";
158*84e33947SAndroid Build Coastguard Worker     case SCAN_MONITORING_NOT_SUPPORTED:
159*84e33947SAndroid Build Coastguard Worker       return "SCAN_MONITORING_NOT_SUPPORTED";
160*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_START_SCAN_MONITORING:
161*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_START_SCAN_MONITORING";
162*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_STOP_SCAN_MONITORING:
163*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_STOP_SCAN_MONITORING";
164*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_CONFIGURE_SCAN_MONITORING_ASYNC:
165*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_CONFIGURE_SCAN_MONITORING_ASYNC";
166*84e33947SAndroid Build Coastguard Worker     case ONDEMAND_SCAN_NOT_SUPPORTED:
167*84e33947SAndroid Build Coastguard Worker       return "ONDEMAND_SCAN_NOT_SUPPORTED";
168*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_SEND_ONDEMAND_SCAN_REQUEST:
169*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_SEND_ONDEMAND_SCAN_REQUEST";
170*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_SEND_ONDEMAND_SCAN_REQUEST_ASYNC:
171*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_SEND_ONDEMAND_SCAN_REQUEST_ASYNC";
172*84e33947SAndroid Build Coastguard Worker     case OUT_OF_ORDER_SCAN_RESULTS:
173*84e33947SAndroid Build Coastguard Worker       return "OUT_OF_ORDER_SCAN_RESULTS";
174*84e33947SAndroid Build Coastguard Worker     case INCOMPLETE_SCAN_RESULTS_BEFORE_SCAN_REQUEST:
175*84e33947SAndroid Build Coastguard Worker       return "INCOMPLETE_SCAN_RESULTS_BEFORE_SCAN_REQUEST";
176*84e33947SAndroid Build Coastguard Worker     case FAILED_TO_SET_SCAN_TIMER:
177*84e33947SAndroid Build Coastguard Worker       return "FAILED_TO_SET_SCAN_TIMER";
178*84e33947SAndroid Build Coastguard Worker     default:
179*84e33947SAndroid Build Coastguard Worker       return "UNKNOWN_ERROR";
180*84e33947SAndroid Build Coastguard Worker   }
181*84e33947SAndroid Build Coastguard Worker }
182*84e33947SAndroid Build Coastguard Worker 
183*84e33947SAndroid Build Coastguard Worker }  // namespace utility
184*84e33947SAndroid Build Coastguard Worker }  // namespace wifi_offload
185