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