| /* |
| * Copyright (C) 2020 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // This file was automatically generated by chre_api_to_chpp.py |
| // Date: 2022-02-03 23:05:30 UTC |
| // Source: chre_api/include/chre_api/chre/wwan.h @ commit b5a92e457 |
| |
| // DO NOT modify this file directly, as those changes will be lost the next |
| // time the script is executed |
| |
| #include "chpp/common/wwan_types.h" |
| #include "chpp/macros.h" |
| #include "chpp/memory.h" |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| #include <string.h> |
| |
| // Encoding (CHRE --> CHPP) size functions |
| |
| //! @return number of bytes required to represent the given |
| //! chreWwanCellInfoResult along with the CHPP header as |
| //! struct ChppWwanCellInfoResultWithHeader |
| static size_t chppWwanSizeOfCellInfoResultFromChre( |
| const struct chreWwanCellInfoResult *cellInfoResult) { |
| size_t encodedSize = sizeof(struct ChppWwanCellInfoResultWithHeader); |
| encodedSize += |
| cellInfoResult->cellInfoCount * sizeof(struct ChppWwanCellInfo); |
| return encodedSize; |
| } |
| |
| // Encoding (CHRE --> CHPP) conversion functions |
| |
| static void chppWwanConvertCellIdentityCdmaFromChre( |
| const struct chreWwanCellIdentityCdma *in, |
| struct ChppWwanCellIdentityCdma *out) { |
| out->networkId = in->networkId; |
| out->systemId = in->systemId; |
| out->basestationId = in->basestationId; |
| out->longitude = in->longitude; |
| out->latitude = in->latitude; |
| } |
| |
| static void chppWwanConvertSignalStrengthCdmaFromChre( |
| const struct chreWwanSignalStrengthCdma *in, |
| struct ChppWwanSignalStrengthCdma *out) { |
| out->dbm = in->dbm; |
| out->ecio = in->ecio; |
| } |
| |
| static void chppWwanConvertSignalStrengthEvdoFromChre( |
| const struct chreWwanSignalStrengthEvdo *in, |
| struct ChppWwanSignalStrengthEvdo *out) { |
| out->dbm = in->dbm; |
| out->ecio = in->ecio; |
| out->signalNoiseRatio = in->signalNoiseRatio; |
| } |
| |
| static void chppWwanConvertCellInfoCdmaFromChre( |
| const struct chreWwanCellInfoCdma *in, struct ChppWwanCellInfoCdma *out) { |
| chppWwanConvertCellIdentityCdmaFromChre(&in->cellIdentityCdma, |
| &out->cellIdentityCdma); |
| chppWwanConvertSignalStrengthCdmaFromChre(&in->signalStrengthCdma, |
| &out->signalStrengthCdma); |
| chppWwanConvertSignalStrengthEvdoFromChre(&in->signalStrengthEvdo, |
| &out->signalStrengthEvdo); |
| } |
| |
| static void chppWwanConvertCellIdentityGsmFromChre( |
| const struct chreWwanCellIdentityGsm *in, |
| struct ChppWwanCellIdentityGsm *out) { |
| out->mcc = in->mcc; |
| out->mnc = in->mnc; |
| out->lac = in->lac; |
| out->cid = in->cid; |
| out->arfcn = in->arfcn; |
| out->bsic = in->bsic; |
| memset(&out->reserved, 0, sizeof(out->reserved)); |
| } |
| |
| static void chppWwanConvertSignalStrengthGsmFromChre( |
| const struct chreWwanSignalStrengthGsm *in, |
| struct ChppWwanSignalStrengthGsm *out) { |
| out->signalStrength = in->signalStrength; |
| out->bitErrorRate = in->bitErrorRate; |
| out->timingAdvance = in->timingAdvance; |
| } |
| |
| static void chppWwanConvertCellInfoGsmFromChre( |
| const struct chreWwanCellInfoGsm *in, struct ChppWwanCellInfoGsm *out) { |
| chppWwanConvertCellIdentityGsmFromChre(&in->cellIdentityGsm, |
| &out->cellIdentityGsm); |
| chppWwanConvertSignalStrengthGsmFromChre(&in->signalStrengthGsm, |
| &out->signalStrengthGsm); |
| } |
| |
| static void chppWwanConvertCellIdentityLteFromChre( |
| const struct chreWwanCellIdentityLte *in, |
| struct ChppWwanCellIdentityLte *out) { |
| out->mcc = in->mcc; |
| out->mnc = in->mnc; |
| out->ci = in->ci; |
| out->pci = in->pci; |
| out->tac = in->tac; |
| out->earfcn = in->earfcn; |
| } |
| |
| static void chppWwanConvertSignalStrengthLteFromChre( |
| const struct chreWwanSignalStrengthLte *in, |
| struct ChppWwanSignalStrengthLte *out) { |
| out->signalStrength = in->signalStrength; |
| out->rsrp = in->rsrp; |
| out->rsrq = in->rsrq; |
| out->rssnr = in->rssnr; |
| out->cqi = in->cqi; |
| out->timingAdvance = in->timingAdvance; |
| } |
| |
| static void chppWwanConvertCellInfoLteFromChre( |
| const struct chreWwanCellInfoLte *in, struct ChppWwanCellInfoLte *out) { |
| chppWwanConvertCellIdentityLteFromChre(&in->cellIdentityLte, |
| &out->cellIdentityLte); |
| chppWwanConvertSignalStrengthLteFromChre(&in->signalStrengthLte, |
| &out->signalStrengthLte); |
| } |
| |
| static void chppWwanConvertCellIdentityNrFromChre( |
| const struct chreWwanCellIdentityNr *in, |
| struct ChppWwanCellIdentityNr *out) { |
| out->mcc = in->mcc; |
| out->mnc = in->mnc; |
| out->nci0 = in->nci0; |
| out->nci1 = in->nci1; |
| out->pci = in->pci; |
| out->tac = in->tac; |
| out->nrarfcn = in->nrarfcn; |
| } |
| |
| static void chppWwanConvertSignalStrengthNrFromChre( |
| const struct chreWwanSignalStrengthNr *in, |
| struct ChppWwanSignalStrengthNr *out) { |
| out->ssRsrp = in->ssRsrp; |
| out->ssRsrq = in->ssRsrq; |
| out->ssSinr = in->ssSinr; |
| out->csiRsrp = in->csiRsrp; |
| out->csiRsrq = in->csiRsrq; |
| out->csiSinr = in->csiSinr; |
| } |
| |
| static void chppWwanConvertCellInfoNrFromChre( |
| const struct chreWwanCellInfoNr *in, struct ChppWwanCellInfoNr *out) { |
| chppWwanConvertCellIdentityNrFromChre(&in->cellIdentityNr, |
| &out->cellIdentityNr); |
| chppWwanConvertSignalStrengthNrFromChre(&in->signalStrengthNr, |
| &out->signalStrengthNr); |
| } |
| |
| static void chppWwanConvertCellIdentityTdscdmaFromChre( |
| const struct chreWwanCellIdentityTdscdma *in, |
| struct ChppWwanCellIdentityTdscdma *out) { |
| out->mcc = in->mcc; |
| out->mnc = in->mnc; |
| out->lac = in->lac; |
| out->cid = in->cid; |
| out->cpid = in->cpid; |
| } |
| |
| static void chppWwanConvertSignalStrengthTdscdmaFromChre( |
| const struct chreWwanSignalStrengthTdscdma *in, |
| struct ChppWwanSignalStrengthTdscdma *out) { |
| out->rscp = in->rscp; |
| } |
| |
| static void chppWwanConvertCellInfoTdscdmaFromChre( |
| const struct chreWwanCellInfoTdscdma *in, |
| struct ChppWwanCellInfoTdscdma *out) { |
| chppWwanConvertCellIdentityTdscdmaFromChre(&in->cellIdentityTdscdma, |
| &out->cellIdentityTdscdma); |
| chppWwanConvertSignalStrengthTdscdmaFromChre(&in->signalStrengthTdscdma, |
| &out->signalStrengthTdscdma); |
| } |
| |
| static void chppWwanConvertCellIdentityWcdmaFromChre( |
| const struct chreWwanCellIdentityWcdma *in, |
| struct ChppWwanCellIdentityWcdma *out) { |
| out->mcc = in->mcc; |
| out->mnc = in->mnc; |
| out->lac = in->lac; |
| out->cid = in->cid; |
| out->psc = in->psc; |
| out->uarfcn = in->uarfcn; |
| } |
| |
| static void chppWwanConvertSignalStrengthWcdmaFromChre( |
| const struct chreWwanSignalStrengthWcdma *in, |
| struct ChppWwanSignalStrengthWcdma *out) { |
| out->signalStrength = in->signalStrength; |
| out->bitErrorRate = in->bitErrorRate; |
| } |
| |
| static void chppWwanConvertCellInfoWcdmaFromChre( |
| const struct chreWwanCellInfoWcdma *in, struct ChppWwanCellInfoWcdma *out) { |
| chppWwanConvertCellIdentityWcdmaFromChre(&in->cellIdentityWcdma, |
| &out->cellIdentityWcdma); |
| chppWwanConvertSignalStrengthWcdmaFromChre(&in->signalStrengthWcdma, |
| &out->signalStrengthWcdma); |
| } |
| |
| static void chppWwanConvertCellInfoFromChre(const struct chreWwanCellInfo *in, |
| struct ChppWwanCellInfo *out) { |
| out->timeStamp = in->timeStamp; |
| out->cellInfoType = in->cellInfoType; |
| out->timeStampType = in->timeStampType; |
| out->registered = in->registered; |
| out->reserved = 0; |
| memset(&out->CellInfo, 0, sizeof(out->CellInfo)); |
| switch (in->cellInfoType) { |
| case CHRE_WWAN_CELL_INFO_TYPE_GSM: |
| chppWwanConvertCellInfoGsmFromChre(&in->CellInfo.gsm, &out->CellInfo.gsm); |
| break; |
| case CHRE_WWAN_CELL_INFO_TYPE_CDMA: |
| chppWwanConvertCellInfoCdmaFromChre(&in->CellInfo.cdma, |
| &out->CellInfo.cdma); |
| break; |
| case CHRE_WWAN_CELL_INFO_TYPE_LTE: |
| chppWwanConvertCellInfoLteFromChre(&in->CellInfo.lte, &out->CellInfo.lte); |
| break; |
| case CHRE_WWAN_CELL_INFO_TYPE_WCDMA: |
| chppWwanConvertCellInfoWcdmaFromChre(&in->CellInfo.wcdma, |
| &out->CellInfo.wcdma); |
| break; |
| case CHRE_WWAN_CELL_INFO_TYPE_TD_SCDMA: |
| chppWwanConvertCellInfoTdscdmaFromChre(&in->CellInfo.tdscdma, |
| &out->CellInfo.tdscdma); |
| break; |
| case CHRE_WWAN_CELL_INFO_TYPE_NR: |
| chppWwanConvertCellInfoNrFromChre(&in->CellInfo.nr, &out->CellInfo.nr); |
| break; |
| default: |
| CHPP_ASSERT(false); |
| } |
| } |
| |
| static void chppWwanConvertCellInfoResultFromChre( |
| const struct chreWwanCellInfoResult *in, struct ChppWwanCellInfoResult *out, |
| uint8_t *payload, size_t payloadSize, uint16_t *vlaOffset) { |
| out->version = CHRE_WWAN_CELL_INFO_RESULT_VERSION; |
| out->errorCode = in->errorCode; |
| out->cellInfoCount = in->cellInfoCount; |
| out->reserved = 0; |
| out->cookie = 0; |
| |
| struct ChppWwanCellInfo *cells = |
| (struct ChppWwanCellInfo *)&payload[*vlaOffset]; |
| out->cells.length = |
| (uint16_t)(in->cellInfoCount * sizeof(struct ChppWwanCellInfo)); |
| CHPP_ASSERT((size_t)(*vlaOffset + out->cells.length) <= payloadSize); |
| if (out->cells.length > 0 && *vlaOffset + out->cells.length <= payloadSize) { |
| for (size_t i = 0; i < in->cellInfoCount; i++) { |
| chppWwanConvertCellInfoFromChre(&in->cells[i], &cells[i]); |
| } |
| out->cells.offset = *vlaOffset; |
| *vlaOffset += out->cells.length; |
| } else { |
| out->cells.offset = 0; |
| } |
| } |
| |
| // Encoding (CHRE --> CHPP) top-level functions |
| |
| bool chppWwanCellInfoResultFromChre( |
| const struct chreWwanCellInfoResult *in, |
| struct ChppWwanCellInfoResultWithHeader **out, size_t *outSize) { |
| CHPP_NOT_NULL(out); |
| CHPP_NOT_NULL(outSize); |
| |
| size_t payloadSize = chppWwanSizeOfCellInfoResultFromChre(in); |
| *out = chppMalloc(payloadSize); |
| if (*out != NULL) { |
| uint8_t *payload = (uint8_t *)&(*out)->payload; |
| uint16_t vlaOffset = sizeof(struct ChppWwanCellInfoResult); |
| chppWwanConvertCellInfoResultFromChre(in, &(*out)->payload, payload, |
| payloadSize, &vlaOffset); |
| *outSize = payloadSize; |
| return true; |
| } |
| return false; |
| } |
| |
| // Decoding (CHPP --> CHRE) conversion functions |
| |
| static bool chppWwanConvertCellIdentityCdmaToChre( |
| const struct ChppWwanCellIdentityCdma *in, |
| struct chreWwanCellIdentityCdma *out) { |
| out->networkId = in->networkId; |
| out->systemId = in->systemId; |
| out->basestationId = in->basestationId; |
| out->longitude = in->longitude; |
| out->latitude = in->latitude; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertSignalStrengthCdmaToChre( |
| const struct ChppWwanSignalStrengthCdma *in, |
| struct chreWwanSignalStrengthCdma *out) { |
| out->dbm = in->dbm; |
| out->ecio = in->ecio; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertSignalStrengthEvdoToChre( |
| const struct ChppWwanSignalStrengthEvdo *in, |
| struct chreWwanSignalStrengthEvdo *out) { |
| out->dbm = in->dbm; |
| out->ecio = in->ecio; |
| out->signalNoiseRatio = in->signalNoiseRatio; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellInfoCdmaToChre( |
| const struct ChppWwanCellInfoCdma *in, struct chreWwanCellInfoCdma *out) { |
| if (!chppWwanConvertCellIdentityCdmaToChre(&in->cellIdentityCdma, |
| &out->cellIdentityCdma)) { |
| return false; |
| } |
| if (!chppWwanConvertSignalStrengthCdmaToChre(&in->signalStrengthCdma, |
| &out->signalStrengthCdma)) { |
| return false; |
| } |
| if (!chppWwanConvertSignalStrengthEvdoToChre(&in->signalStrengthEvdo, |
| &out->signalStrengthEvdo)) { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellIdentityGsmToChre( |
| const struct ChppWwanCellIdentityGsm *in, |
| struct chreWwanCellIdentityGsm *out) { |
| out->mcc = in->mcc; |
| out->mnc = in->mnc; |
| out->lac = in->lac; |
| out->cid = in->cid; |
| out->arfcn = in->arfcn; |
| out->bsic = in->bsic; |
| memset(&out->reserved, 0, sizeof(out->reserved)); |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertSignalStrengthGsmToChre( |
| const struct ChppWwanSignalStrengthGsm *in, |
| struct chreWwanSignalStrengthGsm *out) { |
| out->signalStrength = in->signalStrength; |
| out->bitErrorRate = in->bitErrorRate; |
| out->timingAdvance = in->timingAdvance; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellInfoGsmToChre( |
| const struct ChppWwanCellInfoGsm *in, struct chreWwanCellInfoGsm *out) { |
| if (!chppWwanConvertCellIdentityGsmToChre(&in->cellIdentityGsm, |
| &out->cellIdentityGsm)) { |
| return false; |
| } |
| if (!chppWwanConvertSignalStrengthGsmToChre(&in->signalStrengthGsm, |
| &out->signalStrengthGsm)) { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellIdentityLteToChre( |
| const struct ChppWwanCellIdentityLte *in, |
| struct chreWwanCellIdentityLte *out) { |
| out->mcc = in->mcc; |
| out->mnc = in->mnc; |
| out->ci = in->ci; |
| out->pci = in->pci; |
| out->tac = in->tac; |
| out->earfcn = in->earfcn; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertSignalStrengthLteToChre( |
| const struct ChppWwanSignalStrengthLte *in, |
| struct chreWwanSignalStrengthLte *out) { |
| out->signalStrength = in->signalStrength; |
| out->rsrp = in->rsrp; |
| out->rsrq = in->rsrq; |
| out->rssnr = in->rssnr; |
| out->cqi = in->cqi; |
| out->timingAdvance = in->timingAdvance; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellInfoLteToChre( |
| const struct ChppWwanCellInfoLte *in, struct chreWwanCellInfoLte *out) { |
| if (!chppWwanConvertCellIdentityLteToChre(&in->cellIdentityLte, |
| &out->cellIdentityLte)) { |
| return false; |
| } |
| if (!chppWwanConvertSignalStrengthLteToChre(&in->signalStrengthLte, |
| &out->signalStrengthLte)) { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellIdentityNrToChre( |
| const struct ChppWwanCellIdentityNr *in, |
| struct chreWwanCellIdentityNr *out) { |
| out->mcc = in->mcc; |
| out->mnc = in->mnc; |
| out->nci0 = in->nci0; |
| out->nci1 = in->nci1; |
| out->pci = in->pci; |
| out->tac = in->tac; |
| out->nrarfcn = in->nrarfcn; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertSignalStrengthNrToChre( |
| const struct ChppWwanSignalStrengthNr *in, |
| struct chreWwanSignalStrengthNr *out) { |
| out->ssRsrp = in->ssRsrp; |
| out->ssRsrq = in->ssRsrq; |
| out->ssSinr = in->ssSinr; |
| out->csiRsrp = in->csiRsrp; |
| out->csiRsrq = in->csiRsrq; |
| out->csiSinr = in->csiSinr; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellInfoNrToChre(const struct ChppWwanCellInfoNr *in, |
| struct chreWwanCellInfoNr *out) { |
| if (!chppWwanConvertCellIdentityNrToChre(&in->cellIdentityNr, |
| &out->cellIdentityNr)) { |
| return false; |
| } |
| if (!chppWwanConvertSignalStrengthNrToChre(&in->signalStrengthNr, |
| &out->signalStrengthNr)) { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellIdentityTdscdmaToChre( |
| const struct ChppWwanCellIdentityTdscdma *in, |
| struct chreWwanCellIdentityTdscdma *out) { |
| out->mcc = in->mcc; |
| out->mnc = in->mnc; |
| out->lac = in->lac; |
| out->cid = in->cid; |
| out->cpid = in->cpid; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertSignalStrengthTdscdmaToChre( |
| const struct ChppWwanSignalStrengthTdscdma *in, |
| struct chreWwanSignalStrengthTdscdma *out) { |
| out->rscp = in->rscp; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellInfoTdscdmaToChre( |
| const struct ChppWwanCellInfoTdscdma *in, |
| struct chreWwanCellInfoTdscdma *out) { |
| if (!chppWwanConvertCellIdentityTdscdmaToChre(&in->cellIdentityTdscdma, |
| &out->cellIdentityTdscdma)) { |
| return false; |
| } |
| if (!chppWwanConvertSignalStrengthTdscdmaToChre( |
| &in->signalStrengthTdscdma, &out->signalStrengthTdscdma)) { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellIdentityWcdmaToChre( |
| const struct ChppWwanCellIdentityWcdma *in, |
| struct chreWwanCellIdentityWcdma *out) { |
| out->mcc = in->mcc; |
| out->mnc = in->mnc; |
| out->lac = in->lac; |
| out->cid = in->cid; |
| out->psc = in->psc; |
| out->uarfcn = in->uarfcn; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertSignalStrengthWcdmaToChre( |
| const struct ChppWwanSignalStrengthWcdma *in, |
| struct chreWwanSignalStrengthWcdma *out) { |
| out->signalStrength = in->signalStrength; |
| out->bitErrorRate = in->bitErrorRate; |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellInfoWcdmaToChre( |
| const struct ChppWwanCellInfoWcdma *in, struct chreWwanCellInfoWcdma *out) { |
| if (!chppWwanConvertCellIdentityWcdmaToChre(&in->cellIdentityWcdma, |
| &out->cellIdentityWcdma)) { |
| return false; |
| } |
| if (!chppWwanConvertSignalStrengthWcdmaToChre(&in->signalStrengthWcdma, |
| &out->signalStrengthWcdma)) { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellInfoToChre(const struct ChppWwanCellInfo *in, |
| struct chreWwanCellInfo *out) { |
| out->timeStamp = in->timeStamp; |
| out->cellInfoType = in->cellInfoType; |
| out->timeStampType = in->timeStampType; |
| out->registered = in->registered; |
| out->reserved = 0; |
| memset(&out->CellInfo, 0, sizeof(out->CellInfo)); |
| switch (in->cellInfoType) { |
| case CHRE_WWAN_CELL_INFO_TYPE_GSM: |
| if (!chppWwanConvertCellInfoGsmToChre(&in->CellInfo.gsm, |
| &out->CellInfo.gsm)) { |
| return false; |
| } |
| break; |
| case CHRE_WWAN_CELL_INFO_TYPE_CDMA: |
| if (!chppWwanConvertCellInfoCdmaToChre(&in->CellInfo.cdma, |
| &out->CellInfo.cdma)) { |
| return false; |
| } |
| break; |
| case CHRE_WWAN_CELL_INFO_TYPE_LTE: |
| if (!chppWwanConvertCellInfoLteToChre(&in->CellInfo.lte, |
| &out->CellInfo.lte)) { |
| return false; |
| } |
| break; |
| case CHRE_WWAN_CELL_INFO_TYPE_WCDMA: |
| if (!chppWwanConvertCellInfoWcdmaToChre(&in->CellInfo.wcdma, |
| &out->CellInfo.wcdma)) { |
| return false; |
| } |
| break; |
| case CHRE_WWAN_CELL_INFO_TYPE_TD_SCDMA: |
| if (!chppWwanConvertCellInfoTdscdmaToChre(&in->CellInfo.tdscdma, |
| &out->CellInfo.tdscdma)) { |
| return false; |
| } |
| break; |
| case CHRE_WWAN_CELL_INFO_TYPE_NR: |
| if (!chppWwanConvertCellInfoNrToChre(&in->CellInfo.nr, |
| &out->CellInfo.nr)) { |
| return false; |
| } |
| break; |
| default: |
| CHPP_ASSERT(false); |
| } |
| |
| return true; |
| } |
| |
| static bool chppWwanConvertCellInfoResultToChre( |
| const struct ChppWwanCellInfoResult *in, struct chreWwanCellInfoResult *out, |
| size_t inSize) { |
| out->version = CHRE_WWAN_CELL_INFO_RESULT_VERSION; |
| out->errorCode = in->errorCode; |
| out->cellInfoCount = in->cellInfoCount; |
| out->reserved = 0; |
| out->cookie = 0; |
| |
| if (in->cells.length == 0) { |
| out->cells = NULL; |
| } else { |
| if (in->cells.offset + in->cells.length > inSize || |
| in->cells.length != |
| in->cellInfoCount * sizeof(struct ChppWwanCellInfo)) { |
| return false; |
| } |
| |
| const struct ChppWwanCellInfo *cellsIn = (const struct ChppWwanCellInfo *)&( |
| (const uint8_t *)in)[in->cells.offset]; |
| |
| struct chreWwanCellInfo *cellsOut = |
| chppMalloc(in->cellInfoCount * sizeof(struct chreWwanCellInfo)); |
| if (cellsOut == NULL) { |
| return false; |
| } |
| |
| for (size_t i = 0; i < in->cellInfoCount; i++) { |
| if (!chppWwanConvertCellInfoToChre(&cellsIn[i], &cellsOut[i])) { |
| return false; |
| } |
| } |
| out->cells = cellsOut; |
| } |
| |
| return true; |
| } |
| |
| // Decoding (CHPP --> CHRE) top-level functions |
| |
| struct chreWwanCellInfoResult *chppWwanCellInfoResultToChre( |
| const struct ChppWwanCellInfoResult *in, size_t inSize) { |
| struct chreWwanCellInfoResult *out = NULL; |
| |
| if (inSize >= sizeof(struct ChppWwanCellInfoResult)) { |
| out = chppMalloc(sizeof(struct chreWwanCellInfoResult)); |
| if (out != NULL) { |
| if (!chppWwanConvertCellInfoResultToChre(in, out, inSize)) { |
| CHPP_FREE_AND_NULLIFY(out); |
| } |
| } |
| } |
| |
| return out; |
| } |