xref: /aosp_15_r20/system/chre/platform/linux/pal_wwan.cc (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2020 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 "chre/pal/wwan.h"
18*84e33947SAndroid Build Coastguard Worker 
19*84e33947SAndroid Build Coastguard Worker #include "chre/platform/linux/task_util/task_manager.h"
20*84e33947SAndroid Build Coastguard Worker 
21*84e33947SAndroid Build Coastguard Worker #include "chre/util/memory.h"
22*84e33947SAndroid Build Coastguard Worker #include "chre/util/unique_ptr.h"
23*84e33947SAndroid Build Coastguard Worker 
24*84e33947SAndroid Build Coastguard Worker #include <chrono>
25*84e33947SAndroid Build Coastguard Worker #include <cinttypes>
26*84e33947SAndroid Build Coastguard Worker 
27*84e33947SAndroid Build Coastguard Worker /**
28*84e33947SAndroid Build Coastguard Worker  * A simulated implementation of the WWAN PAL for the linux platform.
29*84e33947SAndroid Build Coastguard Worker  */
30*84e33947SAndroid Build Coastguard Worker namespace {
31*84e33947SAndroid Build Coastguard Worker 
32*84e33947SAndroid Build Coastguard Worker using ::chre::TaskManagerSingleton;
33*84e33947SAndroid Build Coastguard Worker 
34*84e33947SAndroid Build Coastguard Worker const struct chrePalSystemApi *gSystemApi = nullptr;
35*84e33947SAndroid Build Coastguard Worker const struct chrePalWwanCallbacks *gCallbacks = nullptr;
36*84e33947SAndroid Build Coastguard Worker 
37*84e33947SAndroid Build Coastguard Worker //! Task to deliver asynchronous WWAN cell info results after a CHRE request.
38*84e33947SAndroid Build Coastguard Worker std::optional<uint32_t> gCellInfosTaskId;
39*84e33947SAndroid Build Coastguard Worker 
sendCellInfoResult()40*84e33947SAndroid Build Coastguard Worker void sendCellInfoResult() {
41*84e33947SAndroid Build Coastguard Worker   auto result = chre::MakeUniqueZeroFill<struct chreWwanCellInfoResult>();
42*84e33947SAndroid Build Coastguard Worker   auto cell = chre::MakeUniqueZeroFill<struct chreWwanCellInfo>();
43*84e33947SAndroid Build Coastguard Worker   cell->timeStamp = gSystemApi->getCurrentTime();
44*84e33947SAndroid Build Coastguard Worker   cell->cellInfoType = CHRE_WWAN_CELL_INFO_TYPE_GSM;
45*84e33947SAndroid Build Coastguard Worker   // INT*_MAX == unknown
46*84e33947SAndroid Build Coastguard Worker   cell->CellInfo.gsm.cellIdentityGsm.mcc = INT32_MAX;
47*84e33947SAndroid Build Coastguard Worker   cell->CellInfo.gsm.cellIdentityGsm.mnc = INT32_MAX;
48*84e33947SAndroid Build Coastguard Worker   cell->CellInfo.gsm.cellIdentityGsm.lac = INT32_MAX;
49*84e33947SAndroid Build Coastguard Worker   cell->CellInfo.gsm.cellIdentityGsm.cid = INT32_MAX;
50*84e33947SAndroid Build Coastguard Worker   cell->CellInfo.gsm.cellIdentityGsm.arfcn = INT32_MAX;
51*84e33947SAndroid Build Coastguard Worker   cell->CellInfo.gsm.cellIdentityGsm.bsic = INT8_MAX;
52*84e33947SAndroid Build Coastguard Worker   cell->CellInfo.gsm.signalStrengthGsm.signalStrength = INT32_MAX;
53*84e33947SAndroid Build Coastguard Worker   cell->CellInfo.gsm.signalStrengthGsm.signalStrength = INT32_MAX;
54*84e33947SAndroid Build Coastguard Worker   cell->CellInfo.gsm.signalStrengthGsm.signalStrength = INT32_MAX;
55*84e33947SAndroid Build Coastguard Worker 
56*84e33947SAndroid Build Coastguard Worker   result->cellInfoCount = 1;
57*84e33947SAndroid Build Coastguard Worker   result->errorCode = CHRE_ERROR_NONE;
58*84e33947SAndroid Build Coastguard Worker   result->cells = cell.release();
59*84e33947SAndroid Build Coastguard Worker 
60*84e33947SAndroid Build Coastguard Worker   gCallbacks->cellInfoResultCallback(result.release());
61*84e33947SAndroid Build Coastguard Worker }
62*84e33947SAndroid Build Coastguard Worker 
stopCellInfoTask()63*84e33947SAndroid Build Coastguard Worker void stopCellInfoTask() {
64*84e33947SAndroid Build Coastguard Worker   if (gCellInfosTaskId.has_value()) {
65*84e33947SAndroid Build Coastguard Worker     TaskManagerSingleton::get()->cancelTask(*gCellInfosTaskId);
66*84e33947SAndroid Build Coastguard Worker     gCellInfosTaskId.reset();
67*84e33947SAndroid Build Coastguard Worker   }
68*84e33947SAndroid Build Coastguard Worker }
69*84e33947SAndroid Build Coastguard Worker 
chrePalWwanGetCapabilities()70*84e33947SAndroid Build Coastguard Worker uint32_t chrePalWwanGetCapabilities() {
71*84e33947SAndroid Build Coastguard Worker   return CHRE_WWAN_GET_CELL_INFO;
72*84e33947SAndroid Build Coastguard Worker }
73*84e33947SAndroid Build Coastguard Worker 
chrePalWwanRequestCellInfo()74*84e33947SAndroid Build Coastguard Worker bool chrePalWwanRequestCellInfo() {
75*84e33947SAndroid Build Coastguard Worker   stopCellInfoTask();
76*84e33947SAndroid Build Coastguard Worker   gCellInfosTaskId = TaskManagerSingleton::get()->addTask(sendCellInfoResult);
77*84e33947SAndroid Build Coastguard Worker   return gCellInfosTaskId.has_value();
78*84e33947SAndroid Build Coastguard Worker }
79*84e33947SAndroid Build Coastguard Worker 
chrePalWwanReleaseCellInfoResult(struct chreWwanCellInfoResult * result)80*84e33947SAndroid Build Coastguard Worker void chrePalWwanReleaseCellInfoResult(struct chreWwanCellInfoResult *result) {
81*84e33947SAndroid Build Coastguard Worker   for (uint8_t i = 0; i < result->cellInfoCount; i++) {
82*84e33947SAndroid Build Coastguard Worker     chre::memoryFree(const_cast<struct chreWwanCellInfo *>(&result->cells[i]));
83*84e33947SAndroid Build Coastguard Worker   }
84*84e33947SAndroid Build Coastguard Worker   chre::memoryFree(result);
85*84e33947SAndroid Build Coastguard Worker }
86*84e33947SAndroid Build Coastguard Worker 
chrePalWwanApiClose()87*84e33947SAndroid Build Coastguard Worker void chrePalWwanApiClose() {
88*84e33947SAndroid Build Coastguard Worker   stopCellInfoTask();
89*84e33947SAndroid Build Coastguard Worker }
90*84e33947SAndroid Build Coastguard Worker 
chrePalWwanApiOpen(const struct chrePalSystemApi * systemApi,const struct chrePalWwanCallbacks * callbacks)91*84e33947SAndroid Build Coastguard Worker bool chrePalWwanApiOpen(const struct chrePalSystemApi *systemApi,
92*84e33947SAndroid Build Coastguard Worker                         const struct chrePalWwanCallbacks *callbacks) {
93*84e33947SAndroid Build Coastguard Worker   chrePalWwanApiClose();
94*84e33947SAndroid Build Coastguard Worker 
95*84e33947SAndroid Build Coastguard Worker   bool success = false;
96*84e33947SAndroid Build Coastguard Worker   if (systemApi != nullptr && callbacks != nullptr) {
97*84e33947SAndroid Build Coastguard Worker     gSystemApi = systemApi;
98*84e33947SAndroid Build Coastguard Worker     gCallbacks = callbacks;
99*84e33947SAndroid Build Coastguard Worker     success = true;
100*84e33947SAndroid Build Coastguard Worker   }
101*84e33947SAndroid Build Coastguard Worker 
102*84e33947SAndroid Build Coastguard Worker   return success;
103*84e33947SAndroid Build Coastguard Worker }
104*84e33947SAndroid Build Coastguard Worker 
105*84e33947SAndroid Build Coastguard Worker }  // anonymous namespace
106*84e33947SAndroid Build Coastguard Worker 
chrePalWwanGetApi(uint32_t requestedApiVersion)107*84e33947SAndroid Build Coastguard Worker const struct chrePalWwanApi *chrePalWwanGetApi(uint32_t requestedApiVersion) {
108*84e33947SAndroid Build Coastguard Worker   static const struct chrePalWwanApi kApi = {
109*84e33947SAndroid Build Coastguard Worker       .moduleVersion = CHRE_PAL_WWAN_API_CURRENT_VERSION,
110*84e33947SAndroid Build Coastguard Worker       .open = chrePalWwanApiOpen,
111*84e33947SAndroid Build Coastguard Worker       .close = chrePalWwanApiClose,
112*84e33947SAndroid Build Coastguard Worker       .getCapabilities = chrePalWwanGetCapabilities,
113*84e33947SAndroid Build Coastguard Worker       .requestCellInfo = chrePalWwanRequestCellInfo,
114*84e33947SAndroid Build Coastguard Worker       .releaseCellInfoResult = chrePalWwanReleaseCellInfoResult,
115*84e33947SAndroid Build Coastguard Worker   };
116*84e33947SAndroid Build Coastguard Worker 
117*84e33947SAndroid Build Coastguard Worker   if (!CHRE_PAL_VERSIONS_ARE_COMPATIBLE(kApi.moduleVersion,
118*84e33947SAndroid Build Coastguard Worker                                         requestedApiVersion)) {
119*84e33947SAndroid Build Coastguard Worker     return nullptr;
120*84e33947SAndroid Build Coastguard Worker   } else {
121*84e33947SAndroid Build Coastguard Worker     return &kApi;
122*84e33947SAndroid Build Coastguard Worker   }
123*84e33947SAndroid Build Coastguard Worker }
124