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