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

1089 lines
37 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:31 UTC
// Source: chre_api/include/chre_api/chre/wifi.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/wifi_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
//! chreWifiScanEvent along with the CHPP header as
//! struct ChppWifiScanEventWithHeader
static size_t chppWifiSizeOfScanEventFromChre(
const struct chreWifiScanEvent *scanEvent) {
size_t encodedSize = sizeof(struct ChppWifiScanEventWithHeader);
encodedSize += scanEvent->scannedFreqListLen * sizeof(uint32_t);
encodedSize += scanEvent->resultCount * sizeof(struct ChppWifiScanResult);
return encodedSize;
}
//! @return number of bytes required to represent the given
//! chreWifiScanParams along with the CHPP header as
//! struct ChppWifiScanParamsWithHeader
static size_t chppWifiSizeOfScanParamsFromChre(
const struct chreWifiScanParams *scanParams) {
size_t encodedSize = sizeof(struct ChppWifiScanParamsWithHeader);
encodedSize += scanParams->frequencyListLen * sizeof(uint32_t);
encodedSize += scanParams->ssidListLen * sizeof(struct ChppWifiSsidListItem);
return encodedSize;
}
//! @return number of bytes required to represent the given
//! chreWifiRangingEvent along with the CHPP header as
//! struct ChppWifiRangingEventWithHeader
static size_t chppWifiSizeOfRangingEventFromChre(
const struct chreWifiRangingEvent *rangingEvent) {
size_t encodedSize = sizeof(struct ChppWifiRangingEventWithHeader);
encodedSize +=
rangingEvent->resultCount * sizeof(struct ChppWifiRangingResult);
return encodedSize;
}
//! @return number of bytes required to represent the given
//! chreWifiRangingParams along with the CHPP header as
//! struct ChppWifiRangingParamsWithHeader
static size_t chppWifiSizeOfRangingParamsFromChre(
const struct chreWifiRangingParams *rangingParams) {
size_t encodedSize = sizeof(struct ChppWifiRangingParamsWithHeader);
encodedSize +=
rangingParams->targetListLen * sizeof(struct ChppWifiRangingTarget);
return encodedSize;
}
//! @return number of bytes required to represent the given
//! chreWifiNanSubscribeConfig along with the CHPP header as
//! struct ChppWifiNanSubscribeConfigWithHeader
static size_t chppWifiSizeOfNanSubscribeConfigFromChre(
const struct chreWifiNanSubscribeConfig *nanSubscribeConfig) {
size_t encodedSize = sizeof(struct ChppWifiNanSubscribeConfigWithHeader);
if (nanSubscribeConfig->service != NULL) {
encodedSize += strlen(nanSubscribeConfig->service) + 1;
}
encodedSize += nanSubscribeConfig->serviceSpecificInfoSize * sizeof(uint8_t);
encodedSize += nanSubscribeConfig->matchFilterLength * sizeof(uint8_t);
return encodedSize;
}
//! @return number of bytes required to represent the given
//! chreWifiNanDiscoveryEvent along with the CHPP header as
//! struct ChppWifiNanDiscoveryEventWithHeader
static size_t chppWifiSizeOfNanDiscoveryEventFromChre(
const struct chreWifiNanDiscoveryEvent *nanDiscoveryEvent) {
size_t encodedSize = sizeof(struct ChppWifiNanDiscoveryEventWithHeader);
encodedSize += nanDiscoveryEvent->serviceSpecificInfoSize * sizeof(uint8_t);
return encodedSize;
}
// Encoding (CHRE --> CHPP) conversion functions
static void chppWifiConvertScanResultFromChre(
const struct chreWifiScanResult *in, struct ChppWifiScanResult *out) {
out->ageMs = in->ageMs;
out->capabilityInfo = in->capabilityInfo;
out->ssidLen = in->ssidLen;
memcpy(out->ssid, in->ssid, sizeof(out->ssid));
memcpy(out->bssid, in->bssid, sizeof(out->bssid));
out->flags = in->flags;
out->rssi = in->rssi;
out->band = in->band;
out->primaryChannel = in->primaryChannel;
out->centerFreqPrimary = in->centerFreqPrimary;
out->centerFreqSecondary = in->centerFreqSecondary;
out->channelWidth = in->channelWidth;
out->securityMode = in->securityMode;
out->radioChain = in->radioChain;
out->rssiChain0 = in->rssiChain0;
out->rssiChain1 = in->rssiChain1;
memset(&out->reserved, 0, sizeof(out->reserved));
}
static void chppWifiConvertScanEventFromChre(const struct chreWifiScanEvent *in,
struct ChppWifiScanEvent *out,
uint8_t *payload,
size_t payloadSize,
uint16_t *vlaOffset) {
out->version = CHRE_WIFI_SCAN_EVENT_VERSION;
out->resultCount = in->resultCount;
out->resultTotal = in->resultTotal;
out->eventIndex = in->eventIndex;
out->scanType = in->scanType;
out->ssidSetSize = in->ssidSetSize;
out->scannedFreqListLen = in->scannedFreqListLen;
out->referenceTime = in->referenceTime;
out->scannedFreqList.length =
(uint16_t)(in->scannedFreqListLen * sizeof(uint32_t));
CHPP_ASSERT((size_t)(*vlaOffset + out->scannedFreqList.length) <=
payloadSize);
if (out->scannedFreqList.length > 0 &&
*vlaOffset + out->scannedFreqList.length <= payloadSize) {
memcpy(&payload[*vlaOffset], in->scannedFreqList,
in->scannedFreqListLen * sizeof(uint32_t));
out->scannedFreqList.offset = *vlaOffset;
*vlaOffset += out->scannedFreqList.length;
} else {
out->scannedFreqList.offset = 0;
}
struct ChppWifiScanResult *results =
(struct ChppWifiScanResult *)&payload[*vlaOffset];
out->results.length =
(uint16_t)(in->resultCount * sizeof(struct ChppWifiScanResult));
CHPP_ASSERT((size_t)(*vlaOffset + out->results.length) <= payloadSize);
if (out->results.length > 0 &&
*vlaOffset + out->results.length <= payloadSize) {
for (size_t i = 0; i < in->resultCount; i++) {
chppWifiConvertScanResultFromChre(&in->results[i], &results[i]);
}
out->results.offset = *vlaOffset;
*vlaOffset += out->results.length;
} else {
out->results.offset = 0;
}
out->radioChainPref = in->radioChainPref;
}
static void chppWifiConvertSsidListItemFromChre(
const struct chreWifiSsidListItem *in, struct ChppWifiSsidListItem *out) {
out->ssidLen = in->ssidLen;
memcpy(out->ssid, in->ssid, sizeof(out->ssid));
}
static void chppWifiConvertScanParamsFromChre(
const struct chreWifiScanParams *in, struct ChppWifiScanParams *out,
uint8_t *payload, size_t payloadSize, uint16_t *vlaOffset) {
out->scanType = in->scanType;
out->maxScanAgeMs = in->maxScanAgeMs;
out->frequencyListLen = in->frequencyListLen;
out->frequencyList.length =
(uint16_t)(in->frequencyListLen * sizeof(uint32_t));
CHPP_ASSERT((size_t)(*vlaOffset + out->frequencyList.length) <= payloadSize);
if (out->frequencyList.length > 0 &&
*vlaOffset + out->frequencyList.length <= payloadSize) {
memcpy(&payload[*vlaOffset], in->frequencyList,
in->frequencyListLen * sizeof(uint32_t));
out->frequencyList.offset = *vlaOffset;
*vlaOffset += out->frequencyList.length;
} else {
out->frequencyList.offset = 0;
}
out->ssidListLen = in->ssidListLen;
struct ChppWifiSsidListItem *ssidList =
(struct ChppWifiSsidListItem *)&payload[*vlaOffset];
out->ssidList.length =
(uint16_t)(in->ssidListLen * sizeof(struct ChppWifiSsidListItem));
CHPP_ASSERT((size_t)(*vlaOffset + out->ssidList.length) <= payloadSize);
if (out->ssidList.length > 0 &&
*vlaOffset + out->ssidList.length <= payloadSize) {
for (size_t i = 0; i < in->ssidListLen; i++) {
chppWifiConvertSsidListItemFromChre(&in->ssidList[i], &ssidList[i]);
}
out->ssidList.offset = *vlaOffset;
*vlaOffset += out->ssidList.length;
} else {
out->ssidList.offset = 0;
}
out->radioChainPref = in->radioChainPref;
out->channelSet = in->channelSet;
}
static void chppWifiConvertLciFromChre(const struct chreWifiLci *in,
struct ChppWifiLci *out) {
out->latitude = in->latitude;
out->longitude = in->longitude;
out->altitude = in->altitude;
out->latitudeUncertainty = in->latitudeUncertainty;
out->longitudeUncertainty = in->longitudeUncertainty;
out->altitudeType = in->altitudeType;
out->altitudeUncertainty = in->altitudeUncertainty;
}
static void chppWifiConvertRangingResultFromChre(
const struct chreWifiRangingResult *in, struct ChppWifiRangingResult *out) {
out->timestamp = in->timestamp;
memcpy(out->macAddress, in->macAddress, sizeof(out->macAddress));
out->status = in->status;
out->rssi = in->rssi;
out->distance = in->distance;
out->distanceStdDev = in->distanceStdDev;
chppWifiConvertLciFromChre(&in->lci, &out->lci);
out->flags = in->flags;
memset(&out->reserved, 0, sizeof(out->reserved));
}
static void chppWifiConvertRangingEventFromChre(
const struct chreWifiRangingEvent *in, struct ChppWifiRangingEvent *out,
uint8_t *payload, size_t payloadSize, uint16_t *vlaOffset) {
out->version = CHRE_WIFI_RANGING_EVENT_VERSION;
out->resultCount = in->resultCount;
memset(&out->reserved, 0, sizeof(out->reserved));
struct ChppWifiRangingResult *results =
(struct ChppWifiRangingResult *)&payload[*vlaOffset];
out->results.length =
(uint16_t)(in->resultCount * sizeof(struct ChppWifiRangingResult));
CHPP_ASSERT((size_t)(*vlaOffset + out->results.length) <= payloadSize);
if (out->results.length > 0 &&
*vlaOffset + out->results.length <= payloadSize) {
for (size_t i = 0; i < in->resultCount; i++) {
chppWifiConvertRangingResultFromChre(&in->results[i], &results[i]);
}
out->results.offset = *vlaOffset;
*vlaOffset += out->results.length;
} else {
out->results.offset = 0;
}
}
static void chppWifiConvertRangingTargetFromChre(
const struct chreWifiRangingTarget *in, struct ChppWifiRangingTarget *out) {
memcpy(out->macAddress, in->macAddress, sizeof(out->macAddress));
out->primaryChannel = in->primaryChannel;
out->centerFreqPrimary = in->centerFreqPrimary;
out->centerFreqSecondary = in->centerFreqSecondary;
out->channelWidth = in->channelWidth;
memset(&out->reserved, 0, sizeof(out->reserved));
}
static void chppWifiConvertRangingParamsFromChre(
const struct chreWifiRangingParams *in, struct ChppWifiRangingParams *out,
uint8_t *payload, size_t payloadSize, uint16_t *vlaOffset) {
out->targetListLen = in->targetListLen;
struct ChppWifiRangingTarget *targetList =
(struct ChppWifiRangingTarget *)&payload[*vlaOffset];
out->targetList.length =
(uint16_t)(in->targetListLen * sizeof(struct ChppWifiRangingTarget));
CHPP_ASSERT((size_t)(*vlaOffset + out->targetList.length) <= payloadSize);
if (out->targetList.length > 0 &&
*vlaOffset + out->targetList.length <= payloadSize) {
for (size_t i = 0; i < in->targetListLen; i++) {
chppWifiConvertRangingTargetFromChre(&in->targetList[i], &targetList[i]);
}
out->targetList.offset = *vlaOffset;
*vlaOffset += out->targetList.length;
} else {
out->targetList.offset = 0;
}
}
static void chppWifiConvertNanSubscribeConfigFromChre(
const struct chreWifiNanSubscribeConfig *in,
struct ChppWifiNanSubscribeConfig *out, uint8_t *payload,
size_t payloadSize, uint16_t *vlaOffset) {
out->subscribeType = in->subscribeType;
if (in->service != NULL) {
size_t strSize = strlen(in->service) + 1;
memcpy(&payload[*vlaOffset], in->service, strSize);
out->service.length = (uint16_t)(strSize);
out->service.offset = *vlaOffset;
*vlaOffset += out->service.length;
} else {
out->service.length = 0;
out->service.offset = 0;
}
out->serviceSpecificInfo.length =
(uint16_t)(in->serviceSpecificInfoSize * sizeof(uint8_t));
CHPP_ASSERT((size_t)(*vlaOffset + out->serviceSpecificInfo.length) <=
payloadSize);
if (out->serviceSpecificInfo.length > 0 &&
*vlaOffset + out->serviceSpecificInfo.length <= payloadSize) {
memcpy(&payload[*vlaOffset], in->serviceSpecificInfo,
in->serviceSpecificInfoSize * sizeof(uint8_t));
out->serviceSpecificInfo.offset = *vlaOffset;
*vlaOffset += out->serviceSpecificInfo.length;
} else {
out->serviceSpecificInfo.offset = 0;
}
out->serviceSpecificInfoSize = in->serviceSpecificInfoSize;
out->matchFilter.length = (uint16_t)(in->matchFilterLength * sizeof(uint8_t));
CHPP_ASSERT((size_t)(*vlaOffset + out->matchFilter.length) <= payloadSize);
if (out->matchFilter.length > 0 &&
*vlaOffset + out->matchFilter.length <= payloadSize) {
memcpy(&payload[*vlaOffset], in->matchFilter,
in->matchFilterLength * sizeof(uint8_t));
out->matchFilter.offset = *vlaOffset;
*vlaOffset += out->matchFilter.length;
} else {
out->matchFilter.offset = 0;
}
out->matchFilterLength = in->matchFilterLength;
}
static void chppWifiConvertNanDiscoveryEventFromChre(
const struct chreWifiNanDiscoveryEvent *in,
struct ChppWifiNanDiscoveryEvent *out, uint8_t *payload, size_t payloadSize,
uint16_t *vlaOffset) {
out->subscribeId = in->subscribeId;
out->publishId = in->publishId;
memcpy(out->publisherAddress, in->publisherAddress,
sizeof(out->publisherAddress));
out->serviceSpecificInfo.length =
(uint16_t)(in->serviceSpecificInfoSize * sizeof(uint8_t));
CHPP_ASSERT((size_t)(*vlaOffset + out->serviceSpecificInfo.length) <=
payloadSize);
if (out->serviceSpecificInfo.length > 0 &&
*vlaOffset + out->serviceSpecificInfo.length <= payloadSize) {
memcpy(&payload[*vlaOffset], in->serviceSpecificInfo,
in->serviceSpecificInfoSize * sizeof(uint8_t));
out->serviceSpecificInfo.offset = *vlaOffset;
*vlaOffset += out->serviceSpecificInfo.length;
} else {
out->serviceSpecificInfo.offset = 0;
}
out->serviceSpecificInfoSize = in->serviceSpecificInfoSize;
}
static void chppWifiConvertNanSessionLostEventFromChre(
const struct chreWifiNanSessionLostEvent *in,
struct ChppWifiNanSessionLostEvent *out) {
out->id = in->id;
out->peerId = in->peerId;
}
static void chppWifiConvertNanSessionTerminatedEventFromChre(
const struct chreWifiNanSessionTerminatedEvent *in,
struct ChppWifiNanSessionTerminatedEvent *out) {
out->id = in->id;
out->reason = in->reason;
memcpy(out->reserved, in->reserved, sizeof(out->reserved));
}
static void chppWifiConvertNanRangingParamsFromChre(
const struct chreWifiNanRangingParams *in,
struct ChppWifiNanRangingParams *out) {
memcpy(out->macAddress, in->macAddress, sizeof(out->macAddress));
}
// Encoding (CHRE --> CHPP) top-level functions
bool chppWifiScanEventFromChre(const struct chreWifiScanEvent *in,
struct ChppWifiScanEventWithHeader **out,
size_t *outSize) {
CHPP_NOT_NULL(out);
CHPP_NOT_NULL(outSize);
size_t payloadSize = chppWifiSizeOfScanEventFromChre(in);
*out = chppMalloc(payloadSize);
if (*out != NULL) {
uint8_t *payload = (uint8_t *)&(*out)->payload;
uint16_t vlaOffset = sizeof(struct ChppWifiScanEvent);
chppWifiConvertScanEventFromChre(in, &(*out)->payload, payload, payloadSize,
&vlaOffset);
*outSize = payloadSize;
return true;
}
return false;
}
bool chppWifiScanParamsFromChre(const struct chreWifiScanParams *in,
struct ChppWifiScanParamsWithHeader **out,
size_t *outSize) {
CHPP_NOT_NULL(out);
CHPP_NOT_NULL(outSize);
size_t payloadSize = chppWifiSizeOfScanParamsFromChre(in);
*out = chppMalloc(payloadSize);
if (*out != NULL) {
uint8_t *payload = (uint8_t *)&(*out)->payload;
uint16_t vlaOffset = sizeof(struct ChppWifiScanParams);
chppWifiConvertScanParamsFromChre(in, &(*out)->payload, payload,
payloadSize, &vlaOffset);
*outSize = payloadSize;
return true;
}
return false;
}
bool chppWifiRangingEventFromChre(const struct chreWifiRangingEvent *in,
struct ChppWifiRangingEventWithHeader **out,
size_t *outSize) {
CHPP_NOT_NULL(out);
CHPP_NOT_NULL(outSize);
size_t payloadSize = chppWifiSizeOfRangingEventFromChre(in);
*out = chppMalloc(payloadSize);
if (*out != NULL) {
uint8_t *payload = (uint8_t *)&(*out)->payload;
uint16_t vlaOffset = sizeof(struct ChppWifiRangingEvent);
chppWifiConvertRangingEventFromChre(in, &(*out)->payload, payload,
payloadSize, &vlaOffset);
*outSize = payloadSize;
return true;
}
return false;
}
bool chppWifiRangingParamsFromChre(const struct chreWifiRangingParams *in,
struct ChppWifiRangingParamsWithHeader **out,
size_t *outSize) {
CHPP_NOT_NULL(out);
CHPP_NOT_NULL(outSize);
size_t payloadSize = chppWifiSizeOfRangingParamsFromChre(in);
*out = chppMalloc(payloadSize);
if (*out != NULL) {
uint8_t *payload = (uint8_t *)&(*out)->payload;
uint16_t vlaOffset = sizeof(struct ChppWifiRangingParams);
chppWifiConvertRangingParamsFromChre(in, &(*out)->payload, payload,
payloadSize, &vlaOffset);
*outSize = payloadSize;
return true;
}
return false;
}
bool chppWifiNanSubscribeConfigFromChre(
const struct chreWifiNanSubscribeConfig *in,
struct ChppWifiNanSubscribeConfigWithHeader **out, size_t *outSize) {
CHPP_NOT_NULL(out);
CHPP_NOT_NULL(outSize);
size_t payloadSize = chppWifiSizeOfNanSubscribeConfigFromChre(in);
*out = chppMalloc(payloadSize);
if (*out != NULL) {
uint8_t *payload = (uint8_t *)&(*out)->payload;
uint16_t vlaOffset = sizeof(struct ChppWifiNanSubscribeConfig);
chppWifiConvertNanSubscribeConfigFromChre(in, &(*out)->payload, payload,
payloadSize, &vlaOffset);
*outSize = payloadSize;
return true;
}
return false;
}
bool chppWifiNanDiscoveryEventFromChre(
const struct chreWifiNanDiscoveryEvent *in,
struct ChppWifiNanDiscoveryEventWithHeader **out, size_t *outSize) {
CHPP_NOT_NULL(out);
CHPP_NOT_NULL(outSize);
size_t payloadSize = chppWifiSizeOfNanDiscoveryEventFromChre(in);
*out = chppMalloc(payloadSize);
if (*out != NULL) {
uint8_t *payload = (uint8_t *)&(*out)->payload;
uint16_t vlaOffset = sizeof(struct ChppWifiNanDiscoveryEvent);
chppWifiConvertNanDiscoveryEventFromChre(in, &(*out)->payload, payload,
payloadSize, &vlaOffset);
*outSize = payloadSize;
return true;
}
return false;
}
bool chppWifiNanSessionLostEventFromChre(
const struct chreWifiNanSessionLostEvent *in,
struct ChppWifiNanSessionLostEventWithHeader **out, size_t *outSize) {
CHPP_NOT_NULL(out);
CHPP_NOT_NULL(outSize);
size_t payloadSize = sizeof(struct ChppWifiNanSessionLostEventWithHeader);
*out = chppMalloc(payloadSize);
if (*out != NULL) {
chppWifiConvertNanSessionLostEventFromChre(in, &(*out)->payload);
*outSize = payloadSize;
return true;
}
return false;
}
bool chppWifiNanSessionTerminatedEventFromChre(
const struct chreWifiNanSessionTerminatedEvent *in,
struct ChppWifiNanSessionTerminatedEventWithHeader **out, size_t *outSize) {
CHPP_NOT_NULL(out);
CHPP_NOT_NULL(outSize);
size_t payloadSize =
sizeof(struct ChppWifiNanSessionTerminatedEventWithHeader);
*out = chppMalloc(payloadSize);
if (*out != NULL) {
chppWifiConvertNanSessionTerminatedEventFromChre(in, &(*out)->payload);
*outSize = payloadSize;
return true;
}
return false;
}
bool chppWifiNanRangingParamsFromChre(
const struct chreWifiNanRangingParams *in,
struct ChppWifiNanRangingParamsWithHeader **out, size_t *outSize) {
CHPP_NOT_NULL(out);
CHPP_NOT_NULL(outSize);
size_t payloadSize = sizeof(struct ChppWifiNanRangingParamsWithHeader);
*out = chppMalloc(payloadSize);
if (*out != NULL) {
chppWifiConvertNanRangingParamsFromChre(in, &(*out)->payload);
*outSize = payloadSize;
return true;
}
return false;
}
// Decoding (CHPP --> CHRE) conversion functions
static bool chppWifiConvertScanResultToChre(const struct ChppWifiScanResult *in,
struct chreWifiScanResult *out) {
out->ageMs = in->ageMs;
out->capabilityInfo = in->capabilityInfo;
out->ssidLen = in->ssidLen;
memcpy(out->ssid, in->ssid, sizeof(out->ssid));
memcpy(out->bssid, in->bssid, sizeof(out->bssid));
out->flags = in->flags;
out->rssi = in->rssi;
out->band = in->band;
out->primaryChannel = in->primaryChannel;
out->centerFreqPrimary = in->centerFreqPrimary;
out->centerFreqSecondary = in->centerFreqSecondary;
out->channelWidth = in->channelWidth;
out->securityMode = in->securityMode;
out->radioChain = in->radioChain;
out->rssiChain0 = in->rssiChain0;
out->rssiChain1 = in->rssiChain1;
memset(&out->reserved, 0, sizeof(out->reserved));
return true;
}
static bool chppWifiConvertScanEventToChre(const struct ChppWifiScanEvent *in,
struct chreWifiScanEvent *out,
size_t inSize) {
out->version = CHRE_WIFI_SCAN_EVENT_VERSION;
out->resultCount = in->resultCount;
out->resultTotal = in->resultTotal;
out->eventIndex = in->eventIndex;
out->scanType = in->scanType;
out->ssidSetSize = in->ssidSetSize;
out->scannedFreqListLen = in->scannedFreqListLen;
out->referenceTime = in->referenceTime;
if (in->scannedFreqList.length == 0) {
out->scannedFreqList = NULL;
} else {
if (in->scannedFreqList.offset + in->scannedFreqList.length > inSize ||
in->scannedFreqList.length !=
in->scannedFreqListLen * sizeof(uint32_t)) {
return false;
}
uint32_t *scannedFreqListOut =
chppMalloc(in->scannedFreqListLen * sizeof(uint32_t));
if (scannedFreqListOut == NULL) {
return false;
}
memcpy(scannedFreqListOut,
&((const uint8_t *)in)[in->scannedFreqList.offset],
in->scannedFreqListLen * sizeof(uint32_t));
out->scannedFreqList = scannedFreqListOut;
}
if (in->results.length == 0) {
out->results = NULL;
} else {
if (in->results.offset + in->results.length > inSize ||
in->results.length !=
in->resultCount * sizeof(struct ChppWifiScanResult)) {
return false;
}
const struct ChppWifiScanResult *resultsIn =
(const struct ChppWifiScanResult *)&(
(const uint8_t *)in)[in->results.offset];
struct chreWifiScanResult *resultsOut =
chppMalloc(in->resultCount * sizeof(struct chreWifiScanResult));
if (resultsOut == NULL) {
return false;
}
for (size_t i = 0; i < in->resultCount; i++) {
if (!chppWifiConvertScanResultToChre(&resultsIn[i], &resultsOut[i])) {
return false;
}
}
out->results = resultsOut;
}
out->radioChainPref = in->radioChainPref;
return true;
}
static bool chppWifiConvertSsidListItemToChre(
const struct ChppWifiSsidListItem *in, struct chreWifiSsidListItem *out) {
out->ssidLen = in->ssidLen;
memcpy(out->ssid, in->ssid, sizeof(out->ssid));
return true;
}
static bool chppWifiConvertScanParamsToChre(const struct ChppWifiScanParams *in,
struct chreWifiScanParams *out,
size_t inSize) {
out->scanType = in->scanType;
out->maxScanAgeMs = in->maxScanAgeMs;
out->frequencyListLen = in->frequencyListLen;
if (in->frequencyList.length == 0) {
out->frequencyList = NULL;
} else {
if (in->frequencyList.offset + in->frequencyList.length > inSize ||
in->frequencyList.length != in->frequencyListLen * sizeof(uint32_t)) {
return false;
}
uint32_t *frequencyListOut =
chppMalloc(in->frequencyListLen * sizeof(uint32_t));
if (frequencyListOut == NULL) {
return false;
}
memcpy(frequencyListOut, &((const uint8_t *)in)[in->frequencyList.offset],
in->frequencyListLen * sizeof(uint32_t));
out->frequencyList = frequencyListOut;
}
out->ssidListLen = in->ssidListLen;
if (in->ssidList.length == 0) {
out->ssidList = NULL;
} else {
if (in->ssidList.offset + in->ssidList.length > inSize ||
in->ssidList.length !=
in->ssidListLen * sizeof(struct ChppWifiSsidListItem)) {
return false;
}
const struct ChppWifiSsidListItem *ssidListIn =
(const struct ChppWifiSsidListItem *)&(
(const uint8_t *)in)[in->ssidList.offset];
struct chreWifiSsidListItem *ssidListOut =
chppMalloc(in->ssidListLen * sizeof(struct chreWifiSsidListItem));
if (ssidListOut == NULL) {
return false;
}
for (size_t i = 0; i < in->ssidListLen; i++) {
if (!chppWifiConvertSsidListItemToChre(&ssidListIn[i], &ssidListOut[i])) {
return false;
}
}
out->ssidList = ssidListOut;
}
out->radioChainPref = in->radioChainPref;
out->channelSet = in->channelSet;
return true;
}
static bool chppWifiConvertLciToChre(const struct ChppWifiLci *in,
struct chreWifiLci *out) {
out->latitude = in->latitude;
out->longitude = in->longitude;
out->altitude = in->altitude;
out->latitudeUncertainty = in->latitudeUncertainty;
out->longitudeUncertainty = in->longitudeUncertainty;
out->altitudeType = in->altitudeType;
out->altitudeUncertainty = in->altitudeUncertainty;
return true;
}
static bool chppWifiConvertRangingResultToChre(
const struct ChppWifiRangingResult *in, struct chreWifiRangingResult *out) {
out->timestamp = in->timestamp;
memcpy(out->macAddress, in->macAddress, sizeof(out->macAddress));
out->status = in->status;
out->rssi = in->rssi;
out->distance = in->distance;
out->distanceStdDev = in->distanceStdDev;
if (!chppWifiConvertLciToChre(&in->lci, &out->lci)) {
return false;
}
out->flags = in->flags;
memset(&out->reserved, 0, sizeof(out->reserved));
return true;
}
static bool chppWifiConvertRangingEventToChre(
const struct ChppWifiRangingEvent *in, struct chreWifiRangingEvent *out,
size_t inSize) {
out->version = CHRE_WIFI_RANGING_EVENT_VERSION;
out->resultCount = in->resultCount;
memset(&out->reserved, 0, sizeof(out->reserved));
if (in->results.length == 0) {
out->results = NULL;
} else {
if (in->results.offset + in->results.length > inSize ||
in->results.length !=
in->resultCount * sizeof(struct ChppWifiRangingResult)) {
return false;
}
const struct ChppWifiRangingResult *resultsIn =
(const struct ChppWifiRangingResult *)&(
(const uint8_t *)in)[in->results.offset];
struct chreWifiRangingResult *resultsOut =
chppMalloc(in->resultCount * sizeof(struct chreWifiRangingResult));
if (resultsOut == NULL) {
return false;
}
for (size_t i = 0; i < in->resultCount; i++) {
if (!chppWifiConvertRangingResultToChre(&resultsIn[i], &resultsOut[i])) {
return false;
}
}
out->results = resultsOut;
}
return true;
}
static bool chppWifiConvertRangingTargetToChre(
const struct ChppWifiRangingTarget *in, struct chreWifiRangingTarget *out) {
memcpy(out->macAddress, in->macAddress, sizeof(out->macAddress));
out->primaryChannel = in->primaryChannel;
out->centerFreqPrimary = in->centerFreqPrimary;
out->centerFreqSecondary = in->centerFreqSecondary;
out->channelWidth = in->channelWidth;
memset(&out->reserved, 0, sizeof(out->reserved));
return true;
}
static bool chppWifiConvertRangingParamsToChre(
const struct ChppWifiRangingParams *in, struct chreWifiRangingParams *out,
size_t inSize) {
out->targetListLen = in->targetListLen;
if (in->targetList.length == 0) {
out->targetList = NULL;
} else {
if (in->targetList.offset + in->targetList.length > inSize ||
in->targetList.length !=
in->targetListLen * sizeof(struct ChppWifiRangingTarget)) {
return false;
}
const struct ChppWifiRangingTarget *targetListIn =
(const struct ChppWifiRangingTarget *)&(
(const uint8_t *)in)[in->targetList.offset];
struct chreWifiRangingTarget *targetListOut =
chppMalloc(in->targetListLen * sizeof(struct chreWifiRangingTarget));
if (targetListOut == NULL) {
return false;
}
for (size_t i = 0; i < in->targetListLen; i++) {
if (!chppWifiConvertRangingTargetToChre(&targetListIn[i],
&targetListOut[i])) {
return false;
}
}
out->targetList = targetListOut;
}
return true;
}
static bool chppWifiConvertNanSubscribeConfigToChre(
const struct ChppWifiNanSubscribeConfig *in,
struct chreWifiNanSubscribeConfig *out, size_t inSize) {
out->subscribeType = in->subscribeType;
if (in->service.length == 0) {
out->service = NULL;
} else {
char *serviceOut = chppMalloc(in->service.length);
if (serviceOut == NULL) {
return false;
}
memcpy(serviceOut, &((const uint8_t *)in)[in->service.offset],
in->service.length);
out->service = serviceOut;
}
if (in->serviceSpecificInfo.length == 0) {
out->serviceSpecificInfo = NULL;
} else {
if (in->serviceSpecificInfo.offset + in->serviceSpecificInfo.length >
inSize ||
in->serviceSpecificInfo.length !=
in->serviceSpecificInfoSize * sizeof(uint8_t)) {
return false;
}
uint8_t *serviceSpecificInfoOut =
chppMalloc(in->serviceSpecificInfoSize * sizeof(uint8_t));
if (serviceSpecificInfoOut == NULL) {
return false;
}
memcpy(serviceSpecificInfoOut,
&((const uint8_t *)in)[in->serviceSpecificInfo.offset],
in->serviceSpecificInfoSize * sizeof(uint8_t));
out->serviceSpecificInfo = serviceSpecificInfoOut;
}
out->serviceSpecificInfoSize = in->serviceSpecificInfoSize;
if (in->matchFilter.length == 0) {
out->matchFilter = NULL;
} else {
if (in->matchFilter.offset + in->matchFilter.length > inSize ||
in->matchFilter.length != in->matchFilterLength * sizeof(uint8_t)) {
return false;
}
uint8_t *matchFilterOut =
chppMalloc(in->matchFilterLength * sizeof(uint8_t));
if (matchFilterOut == NULL) {
return false;
}
memcpy(matchFilterOut, &((const uint8_t *)in)[in->matchFilter.offset],
in->matchFilterLength * sizeof(uint8_t));
out->matchFilter = matchFilterOut;
}
out->matchFilterLength = in->matchFilterLength;
return true;
}
static bool chppWifiConvertNanDiscoveryEventToChre(
const struct ChppWifiNanDiscoveryEvent *in,
struct chreWifiNanDiscoveryEvent *out, size_t inSize) {
out->subscribeId = in->subscribeId;
out->publishId = in->publishId;
memcpy(out->publisherAddress, in->publisherAddress,
sizeof(out->publisherAddress));
if (in->serviceSpecificInfo.length == 0) {
out->serviceSpecificInfo = NULL;
} else {
if (in->serviceSpecificInfo.offset + in->serviceSpecificInfo.length >
inSize ||
in->serviceSpecificInfo.length !=
in->serviceSpecificInfoSize * sizeof(uint8_t)) {
return false;
}
uint8_t *serviceSpecificInfoOut =
chppMalloc(in->serviceSpecificInfoSize * sizeof(uint8_t));
if (serviceSpecificInfoOut == NULL) {
return false;
}
memcpy(serviceSpecificInfoOut,
&((const uint8_t *)in)[in->serviceSpecificInfo.offset],
in->serviceSpecificInfoSize * sizeof(uint8_t));
out->serviceSpecificInfo = serviceSpecificInfoOut;
}
out->serviceSpecificInfoSize = in->serviceSpecificInfoSize;
return true;
}
static bool chppWifiConvertNanSessionLostEventToChre(
const struct ChppWifiNanSessionLostEvent *in,
struct chreWifiNanSessionLostEvent *out) {
out->id = in->id;
out->peerId = in->peerId;
return true;
}
static bool chppWifiConvertNanSessionTerminatedEventToChre(
const struct ChppWifiNanSessionTerminatedEvent *in,
struct chreWifiNanSessionTerminatedEvent *out) {
out->id = in->id;
out->reason = in->reason;
memcpy(out->reserved, in->reserved, sizeof(out->reserved));
return true;
}
static bool chppWifiConvertNanRangingParamsToChre(
const struct ChppWifiNanRangingParams *in,
struct chreWifiNanRangingParams *out) {
memcpy(out->macAddress, in->macAddress, sizeof(out->macAddress));
return true;
}
// Decoding (CHPP --> CHRE) top-level functions
struct chreWifiScanEvent *chppWifiScanEventToChre(
const struct ChppWifiScanEvent *in, size_t inSize) {
struct chreWifiScanEvent *out = NULL;
if (inSize >= sizeof(struct ChppWifiScanEvent)) {
out = chppMalloc(sizeof(struct chreWifiScanEvent));
if (out != NULL) {
if (!chppWifiConvertScanEventToChre(in, out, inSize)) {
CHPP_FREE_AND_NULLIFY(out);
}
}
}
return out;
}
struct chreWifiScanParams *chppWifiScanParamsToChre(
const struct ChppWifiScanParams *in, size_t inSize) {
struct chreWifiScanParams *out = NULL;
if (inSize >= sizeof(struct ChppWifiScanParams)) {
out = chppMalloc(sizeof(struct chreWifiScanParams));
if (out != NULL) {
if (!chppWifiConvertScanParamsToChre(in, out, inSize)) {
CHPP_FREE_AND_NULLIFY(out);
}
}
}
return out;
}
struct chreWifiRangingEvent *chppWifiRangingEventToChre(
const struct ChppWifiRangingEvent *in, size_t inSize) {
struct chreWifiRangingEvent *out = NULL;
if (inSize >= sizeof(struct ChppWifiRangingEvent)) {
out = chppMalloc(sizeof(struct chreWifiRangingEvent));
if (out != NULL) {
if (!chppWifiConvertRangingEventToChre(in, out, inSize)) {
CHPP_FREE_AND_NULLIFY(out);
}
}
}
return out;
}
struct chreWifiRangingParams *chppWifiRangingParamsToChre(
const struct ChppWifiRangingParams *in, size_t inSize) {
struct chreWifiRangingParams *out = NULL;
if (inSize >= sizeof(struct ChppWifiRangingParams)) {
out = chppMalloc(sizeof(struct chreWifiRangingParams));
if (out != NULL) {
if (!chppWifiConvertRangingParamsToChre(in, out, inSize)) {
CHPP_FREE_AND_NULLIFY(out);
}
}
}
return out;
}
struct chreWifiNanSubscribeConfig *chppWifiNanSubscribeConfigToChre(
const struct ChppWifiNanSubscribeConfig *in, size_t inSize) {
struct chreWifiNanSubscribeConfig *out = NULL;
if (inSize >= sizeof(struct ChppWifiNanSubscribeConfig)) {
out = chppMalloc(sizeof(struct chreWifiNanSubscribeConfig));
if (out != NULL) {
if (!chppWifiConvertNanSubscribeConfigToChre(in, out, inSize)) {
CHPP_FREE_AND_NULLIFY(out);
}
}
}
return out;
}
struct chreWifiNanDiscoveryEvent *chppWifiNanDiscoveryEventToChre(
const struct ChppWifiNanDiscoveryEvent *in, size_t inSize) {
struct chreWifiNanDiscoveryEvent *out = NULL;
if (inSize >= sizeof(struct ChppWifiNanDiscoveryEvent)) {
out = chppMalloc(sizeof(struct chreWifiNanDiscoveryEvent));
if (out != NULL) {
if (!chppWifiConvertNanDiscoveryEventToChre(in, out, inSize)) {
CHPP_FREE_AND_NULLIFY(out);
}
}
}
return out;
}
struct chreWifiNanSessionLostEvent *chppWifiNanSessionLostEventToChre(
const struct ChppWifiNanSessionLostEvent *in, size_t inSize) {
struct chreWifiNanSessionLostEvent *out = NULL;
if (inSize >= sizeof(struct ChppWifiNanSessionLostEvent)) {
out = chppMalloc(sizeof(struct chreWifiNanSessionLostEvent));
if (out != NULL) {
if (!chppWifiConvertNanSessionLostEventToChre(in, out)) {
CHPP_FREE_AND_NULLIFY(out);
}
}
}
return out;
}
struct chreWifiNanSessionTerminatedEvent *
chppWifiNanSessionTerminatedEventToChre(
const struct ChppWifiNanSessionTerminatedEvent *in, size_t inSize) {
struct chreWifiNanSessionTerminatedEvent *out = NULL;
if (inSize >= sizeof(struct ChppWifiNanSessionTerminatedEvent)) {
out = chppMalloc(sizeof(struct chreWifiNanSessionTerminatedEvent));
if (out != NULL) {
if (!chppWifiConvertNanSessionTerminatedEventToChre(in, out)) {
CHPP_FREE_AND_NULLIFY(out);
}
}
}
return out;
}
struct chreWifiNanRangingParams *chppWifiNanRangingParamsToChre(
const struct ChppWifiNanRangingParams *in, size_t inSize) {
struct chreWifiNanRangingParams *out = NULL;
if (inSize >= sizeof(struct ChppWifiNanRangingParams)) {
out = chppMalloc(sizeof(struct chreWifiNanRangingParams));
if (out != NULL) {
if (!chppWifiConvertNanRangingParamsToChre(in, out)) {
CHPP_FREE_AND_NULLIFY(out);
}
}
}
return out;
}