119e95205Sopenharmony_ci/* 219e95205Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 319e95205Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 419e95205Sopenharmony_ci * you may not use this file except in compliance with the License. 519e95205Sopenharmony_ci * You may obtain a copy of the License at 619e95205Sopenharmony_ci * 719e95205Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 819e95205Sopenharmony_ci * 919e95205Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1019e95205Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1119e95205Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1219e95205Sopenharmony_ci * See the License for the specific language governing permissions and 1319e95205Sopenharmony_ci * limitations under the License. 1419e95205Sopenharmony_ci */ 1519e95205Sopenharmony_ci 1619e95205Sopenharmony_ci/** 1719e95205Sopenharmony_ci * @addtogroup Bluetooth 1819e95205Sopenharmony_ci * @{ 1919e95205Sopenharmony_ci * 2019e95205Sopenharmony_ci * @brief Bluetooth Basic tool library, This file is part of BTStack. 2119e95205Sopenharmony_ci * Data Struct packet declarations. 2219e95205Sopenharmony_ci * 2319e95205Sopenharmony_ci * @since 1.0 2419e95205Sopenharmony_ci * @version 1.0 2519e95205Sopenharmony_ci */ 2619e95205Sopenharmony_ci 2719e95205Sopenharmony_ci#ifndef PACKET_H 2819e95205Sopenharmony_ci#define PACKET_H 2919e95205Sopenharmony_ci 3019e95205Sopenharmony_ci#include "buffer.h" 3119e95205Sopenharmony_ci 3219e95205Sopenharmony_ci#ifdef __cplusplus 3319e95205Sopenharmony_ciextern "C" { 3419e95205Sopenharmony_ci#endif 3519e95205Sopenharmony_ci 3619e95205Sopenharmony_citypedef struct Packet Packet; 3719e95205Sopenharmony_citypedef uint16_t (*CalCrc16)(uint8_t data, uint16_t preCrc); 3819e95205Sopenharmony_ci 3919e95205Sopenharmony_ci/** 4019e95205Sopenharmony_ci * @brief Create new specified size(headsize, tailsize, payloadsize) packet. 4119e95205Sopenharmony_ci * Packet is Buffer type linked list. 4219e95205Sopenharmony_ci * 4319e95205Sopenharmony_ci * @param headSize Packet headSize, could be 0 or positive integer. 4419e95205Sopenharmony_ci * @param tailSize Packet tailSize, could be 0 or positive integer. 4519e95205Sopenharmony_ci * @param payloadSize Packet payloadSize, could be 0 or positive integer. 4619e95205Sopenharmony_ci * @return Packet pointer. 4719e95205Sopenharmony_ci * @since 1.0 4819e95205Sopenharmony_ci * @version 1.0 4919e95205Sopenharmony_ci */ 5019e95205Sopenharmony_ciBTSTACK_API Packet *PacketMalloc(uint16_t headSize, uint16_t tailSize, uint32_t payloadSize); 5119e95205Sopenharmony_ci 5219e95205Sopenharmony_ci/** 5319e95205Sopenharmony_ci * @brief Copy malloc new packet by Existing packet. Do not copy data. 5419e95205Sopenharmony_ci * 5519e95205Sopenharmony_ci * @param pkt Existing packet pointer. 5619e95205Sopenharmony_ci * @return Packet pointer. 5719e95205Sopenharmony_ci * @since 1.0 5819e95205Sopenharmony_ci * @version 1.0 5919e95205Sopenharmony_ci */ 6019e95205Sopenharmony_ciBTSTACK_API Packet *PacketRefMalloc(const Packet *pkt); 6119e95205Sopenharmony_ci 6219e95205Sopenharmony_ci/** 6319e95205Sopenharmony_ci * @brief Inherit malloc new packet by Existing packet. 6419e95205Sopenharmony_ci * headSize and tailSize are added. 6519e95205Sopenharmony_ci * Used in data downstream. 6619e95205Sopenharmony_ci * 6719e95205Sopenharmony_ci * @param pkt Packet pointer. 6819e95205Sopenharmony_ci * @param headSize Packet headSize, could be 0 or positive integer. 6919e95205Sopenharmony_ci * @param tailSize Packet tailSize, could be 0 or positive integer. 7019e95205Sopenharmony_ci * @return Packet pointer. 7119e95205Sopenharmony_ci * @since 1.0 7219e95205Sopenharmony_ci * @version 1.0 7319e95205Sopenharmony_ci */ 7419e95205Sopenharmony_ciBTSTACK_API Packet *PacketInheritMalloc(const Packet *pkt, uint16_t headSize, uint16_t tailSize); 7519e95205Sopenharmony_ci 7619e95205Sopenharmony_ci/** 7719e95205Sopenharmony_ci * @brief Release Packet. 7819e95205Sopenharmony_ci * 7919e95205Sopenharmony_ci * @param pkt Packet pointer. 8019e95205Sopenharmony_ci * @since 1.0 8119e95205Sopenharmony_ci * @version 1.0 8219e95205Sopenharmony_ci */ 8319e95205Sopenharmony_ciBTSTACK_API void PacketFree(Packet *pkt); 8419e95205Sopenharmony_ci 8519e95205Sopenharmony_ci/** 8619e95205Sopenharmony_ci * @brief Get Packet head buffer. 8719e95205Sopenharmony_ci * 8819e95205Sopenharmony_ci * @param pkt Packet pointer. 8919e95205Sopenharmony_ci * @return Packet head buffer. 9019e95205Sopenharmony_ci * @since 1.0 9119e95205Sopenharmony_ci * @version 1.0 9219e95205Sopenharmony_ci */ 9319e95205Sopenharmony_ciBTSTACK_API Buffer *PacketHead(const Packet *pkt); 9419e95205Sopenharmony_ci 9519e95205Sopenharmony_ci/** 9619e95205Sopenharmony_ci * @brief Get Packet head buffer. 9719e95205Sopenharmony_ci * 9819e95205Sopenharmony_ci * @param pkt Packet pointer. 9919e95205Sopenharmony_ci * @return Packet head buffer. 10019e95205Sopenharmony_ci * @since 1.0 10119e95205Sopenharmony_ci * @version 1.0 10219e95205Sopenharmony_ci */ 10319e95205Sopenharmony_ciBTSTACK_API Buffer *PacketTail(const Packet *pkt); 10419e95205Sopenharmony_ci 10519e95205Sopenharmony_ci/** 10619e95205Sopenharmony_ci * @brief Get Packet payload buffer. 10719e95205Sopenharmony_ci * Payload might be discontinuous, connect payload and return a continuous buffer. 10819e95205Sopenharmony_ci * 10919e95205Sopenharmony_ci * @param pkt Packet pointer. 11019e95205Sopenharmony_ci * @return Buffer pointer. 11119e95205Sopenharmony_ci * @since 1.0 11219e95205Sopenharmony_ci * @version 1.0 11319e95205Sopenharmony_ci */ 11419e95205Sopenharmony_ciBTSTACK_API Buffer *PacketContinuousPayload(Packet *pkt); 11519e95205Sopenharmony_ci 11619e95205Sopenharmony_ci/** 11719e95205Sopenharmony_ci * @brief Get Packet payload size. 11819e95205Sopenharmony_ci * 11919e95205Sopenharmony_ci * @param pkt Packet pointer. 12019e95205Sopenharmony_ci * @return Packet payload size. 12119e95205Sopenharmony_ci * @since 1.0 12219e95205Sopenharmony_ci * @version 1.0 12319e95205Sopenharmony_ci */ 12419e95205Sopenharmony_ciBTSTACK_API uint32_t PacketPayloadSize(const Packet *pkt); 12519e95205Sopenharmony_ci 12619e95205Sopenharmony_ci/** 12719e95205Sopenharmony_ci * @brief Read data from Packet payload. 12819e95205Sopenharmony_ci * 12919e95205Sopenharmony_ci * @param pkt Packet pointer. 13019e95205Sopenharmony_ci * @param dst Data destination. 13119e95205Sopenharmony_ci * @param offset Offset is relative to Packet's payload. 13219e95205Sopenharmony_ci * @param size Read size. 13319e95205Sopenharmony_ci * @return Success read size. 13419e95205Sopenharmony_ci * @since 1.0 13519e95205Sopenharmony_ci * @version 1.0 13619e95205Sopenharmony_ci */ 13719e95205Sopenharmony_ciBTSTACK_API uint32_t PacketPayloadRead(const Packet *pkt, uint8_t *dst, uint32_t offset, uint32_t size); 13819e95205Sopenharmony_ci 13919e95205Sopenharmony_ci/** 14019e95205Sopenharmony_ci * @brief Write data to Packet payload. 14119e95205Sopenharmony_ci * 14219e95205Sopenharmony_ci * @param pkt Packet pointer. 14319e95205Sopenharmony_ci * @param src Data source. 14419e95205Sopenharmony_ci * @param offset Offset is relative to Packet's payload. 14519e95205Sopenharmony_ci * @param size Write size. 14619e95205Sopenharmony_ci * @return Success write size. 14719e95205Sopenharmony_ci * @since 1.0 14819e95205Sopenharmony_ci * @version 1.0 14919e95205Sopenharmony_ci */ 15019e95205Sopenharmony_ciBTSTACK_API uint32_t PacketPayloadWrite(const Packet *pkt, const uint8_t *src, uint32_t offset, uint32_t size); 15119e95205Sopenharmony_ci 15219e95205Sopenharmony_ci/** 15319e95205Sopenharmony_ci * @brief Add one buffer block to Packet's payload last. (Before packet's tail) 15419e95205Sopenharmony_ci * 15519e95205Sopenharmony_ci * @param pkt Packet pointer. 15619e95205Sopenharmony_ci * @param buf Add buffer pointer. 15719e95205Sopenharmony_ci * @since 1.0 15819e95205Sopenharmony_ci * @version 1.0 15919e95205Sopenharmony_ci */ 16019e95205Sopenharmony_ciBTSTACK_API void PacketPayloadAddLast(const Packet *pkt, const Buffer *buf); 16119e95205Sopenharmony_ci 16219e95205Sopenharmony_ci/** 16319e95205Sopenharmony_ci * @brief Get Packet size. 16419e95205Sopenharmony_ci * 16519e95205Sopenharmony_ci * @param pkt Packet pointer. 16619e95205Sopenharmony_ci * @return Packet size. 16719e95205Sopenharmony_ci * @since 1.0 16819e95205Sopenharmony_ci * @version 1.0 16919e95205Sopenharmony_ci */ 17019e95205Sopenharmony_ciBTSTACK_API uint32_t PacketSize(const Packet *pkt); 17119e95205Sopenharmony_ci 17219e95205Sopenharmony_ci/** 17319e95205Sopenharmony_ci * @brief Read data from whole Packet. 17419e95205Sopenharmony_ci * 17519e95205Sopenharmony_ci * @param pkt Packet pointer. 17619e95205Sopenharmony_ci * @param dst Data destination. 17719e95205Sopenharmony_ci * @param offset Offset is relative to whole Packet. 17819e95205Sopenharmony_ci * @param size Read size. 17919e95205Sopenharmony_ci * @return Success read size. 18019e95205Sopenharmony_ci * @since 1.0 18119e95205Sopenharmony_ci * @version 1.0 18219e95205Sopenharmony_ci */ 18319e95205Sopenharmony_ciBTSTACK_API uint32_t PacketRead(const Packet *pkt, uint8_t *dst, uint32_t offset, uint32_t size); 18419e95205Sopenharmony_ci 18519e95205Sopenharmony_ci/** 18619e95205Sopenharmony_ci * @brief Extract Packet head from payload. 18719e95205Sopenharmony_ci * Used in data upstream. 18819e95205Sopenharmony_ci * 18919e95205Sopenharmony_ci * @param pkt Packet pointer. 19019e95205Sopenharmony_ci * @param data Data destination. 19119e95205Sopenharmony_ci * @param size Extract size. 19219e95205Sopenharmony_ci * @since 1.0 19319e95205Sopenharmony_ci * @version 1.0 19419e95205Sopenharmony_ci */ 19519e95205Sopenharmony_ciBTSTACK_API void PacketExtractHead(Packet *pkt, uint8_t *data, uint32_t size); 19619e95205Sopenharmony_ci 19719e95205Sopenharmony_ci/** 19819e95205Sopenharmony_ci * @brief Extract Packet tail from payload. 19919e95205Sopenharmony_ci * Used in data upstream. 20019e95205Sopenharmony_ci * 20119e95205Sopenharmony_ci * @param pkt Packet pointer. 20219e95205Sopenharmony_ci * @param data Data destination. 20319e95205Sopenharmony_ci * @param size Extract size. 20419e95205Sopenharmony_ci * @since 1.0 20519e95205Sopenharmony_ci * @version 1.0 20619e95205Sopenharmony_ci */ 20719e95205Sopenharmony_ciBTSTACK_API void PacketExtractTail(const Packet *pkt, uint8_t *data, uint32_t size); 20819e95205Sopenharmony_ci 20919e95205Sopenharmony_ci/** 21019e95205Sopenharmony_ci * @brief Fragment packet by fragLen. 21119e95205Sopenharmony_ci * This operation will change the metadata in uplayer packet. 21219e95205Sopenharmony_ci * If necessary, execute PacketRefMalloc before. 21319e95205Sopenharmony_ci * Return uplayer packet remain length. 21419e95205Sopenharmony_ci * Used in data downstream. 21519e95205Sopenharmony_ci * 21619e95205Sopenharmony_ci * @param uplayer Uplayer packet(Packet be fragmented). 21719e95205Sopenharmony_ci * @param downlayer Downlayer packet(Fragmented results packet). 21819e95205Sopenharmony_ci * @param fragLen Fragment length. 21919e95205Sopenharmony_ci * @return Uplayer packet remain length. 22019e95205Sopenharmony_ci * @since 1.0 22119e95205Sopenharmony_ci * @version 1.0 22219e95205Sopenharmony_ci */ 22319e95205Sopenharmony_ciBTSTACK_API uint32_t PacketFragment(Packet *uplayer, const Packet *downlayer, uint32_t fragLen); 22419e95205Sopenharmony_ci 22519e95205Sopenharmony_ci/** 22619e95205Sopenharmony_ci * @brief Reassemble data packet. 22719e95205Sopenharmony_ci * Used in data upstream. 22819e95205Sopenharmony_ci * 22919e95205Sopenharmony_ci * @param uplayer Uplayer packet(Packet assemble destination). 23019e95205Sopenharmony_ci * @param downlayer Downlayer packet(Packet assemble source). 23119e95205Sopenharmony_ci * @since 1.0 23219e95205Sopenharmony_ci * @version 1.0 23319e95205Sopenharmony_ci */ 23419e95205Sopenharmony_ciBTSTACK_API void PacketAssemble(const Packet *uplayer, const Packet *downlayer); 23519e95205Sopenharmony_ci 23619e95205Sopenharmony_ci/** 23719e95205Sopenharmony_ci * @brief Packet calculate crc16. 23819e95205Sopenharmony_ci * 23919e95205Sopenharmony_ci * @param calCrc16 CalCrc16 algorithm. 24019e95205Sopenharmony_ci * @return Computing result. 24119e95205Sopenharmony_ci * @since 1.0 24219e95205Sopenharmony_ci * @version 1.0 24319e95205Sopenharmony_ci */ 24419e95205Sopenharmony_ciBTSTACK_API uint16_t PacketCalCrc16(const Packet *pkt, CalCrc16 calCrc16); 24519e95205Sopenharmony_ci 24619e95205Sopenharmony_ci/** 24719e95205Sopenharmony_ci * @brief Packet verification crc16. 24819e95205Sopenharmony_ci * 24919e95205Sopenharmony_ci * @param calCrc16 CalCrc16 algorithm. 25019e95205Sopenharmony_ci * @param crcVal Verification data. 25119e95205Sopenharmony_ci * @return 0:success -1:failed 25219e95205Sopenharmony_ci * @since 1.0 25319e95205Sopenharmony_ci * @version 1.0 25419e95205Sopenharmony_ci */ 25519e95205Sopenharmony_ciBTSTACK_API int32_t PacketVerCrc16(const Packet *pkt, CalCrc16 calCrc16, uint16_t crcVal); 25619e95205Sopenharmony_ci 25719e95205Sopenharmony_ci#ifdef __cplusplus 25819e95205Sopenharmony_ci} 25919e95205Sopenharmony_ci#endif 26019e95205Sopenharmony_ci 26119e95205Sopenharmony_ci#endif // PACKET_H