android13/system/chre/chpp/common/wwan_convert.c

651 lines
20 KiB
C

/*
* 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;
}