You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
680 lines
23 KiB
680 lines
23 KiB
/*
|
|
* 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: 2021-05-24 15:46:25 UTC
|
|
// Source: chre_api/include/chre_api/chre/wifi.h @ commit 833a6241
|
|
|
|
// 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;
|
|
}
|
|
|
|
// 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 = 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 = 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 = 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 = 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 = 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 =
|
|
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;
|
|
}
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|
|
// 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;
|
|
}
|