* Copyright (C) 2021 Huawei Device Co., Ltd.
* 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.
*/
* @addtogroup Bluetooth
* @{
*
* @brief Bluetooth Basic tool library, This file is part of BTStack.
* Data Struct packet declarations.
*
* @since 1.0
* @version 1.0
*/
#ifndef PACKET_H
#define PACKET_H
#include "buffer.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct Packet Packet;
typedef uint16_t (*CalCrc16)(uint8_t data, uint16_t preCrc);
* @brief Create new specified size(headsize, tailsize, payloadsize) packet.
* Packet is Buffer type linked list.
*
* @param headSize Packet headSize, could be 0 or positive integer.
* @param tailSize Packet tailSize, could be 0 or positive integer.
* @param payloadSize Packet payloadSize, could be 0 or positive integer.
* @return Packet pointer.
* @since 1.0
* @version 1.0
*/
BTSTACK_API Packet *PacketMalloc(uint16_t headSize, uint16_t tailSize, uint32_t payloadSize);
* @brief Copy malloc new packet by Existing packet. Do not copy data.
*
* @param pkt Existing packet pointer.
* @return Packet pointer.
* @since 1.0
* @version 1.0
*/
BTSTACK_API Packet *PacketRefMalloc(const Packet *pkt);
* @brief Inherit malloc new packet by Existing packet.
* headSize and tailSize are added.
* Used in data downstream.
*
* @param pkt Packet pointer.
* @param headSize Packet headSize, could be 0 or positive integer.
* @param tailSize Packet tailSize, could be 0 or positive integer.
* @return Packet pointer.
* @since 1.0
* @version 1.0
*/
BTSTACK_API Packet *PacketInheritMalloc(const Packet *pkt, uint16_t headSize, uint16_t tailSize);
* @brief Release Packet.
*
* @param pkt Packet pointer.
* @since 1.0
* @version 1.0
*/
BTSTACK_API void PacketFree(Packet *pkt);
* @brief Get Packet head buffer.
*
* @param pkt Packet pointer.
* @return Packet head buffer.
* @since 1.0
* @version 1.0
*/
BTSTACK_API Buffer *PacketHead(const Packet *pkt);
* @brief Get Packet head buffer.
*
* @param pkt Packet pointer.
* @return Packet head buffer.
* @since 1.0
* @version 1.0
*/
BTSTACK_API Buffer *PacketTail(const Packet *pkt);
* @brief Get Packet payload buffer.
* Payload might be discontinuous, connect payload and return a continuous buffer.
*
* @param pkt Packet pointer.
* @return Buffer pointer.
* @since 1.0
* @version 1.0
*/
BTSTACK_API Buffer *PacketContinuousPayload(Packet *pkt);
* @brief Get Packet payload size.
*
* @param pkt Packet pointer.
* @return Packet payload size.
* @since 1.0
* @version 1.0
*/
BTSTACK_API uint32_t PacketPayloadSize(const Packet *pkt);
* @brief Read data from Packet payload.
*
* @param pkt Packet pointer.
* @param dst Data destination.
* @param offset Offset is relative to Packet's payload.
* @param size Read size.
* @return Success read size.
* @since 1.0
* @version 1.0
*/
BTSTACK_API uint32_t PacketPayloadRead(const Packet *pkt, uint8_t *dst, uint32_t offset, uint32_t size);
* @brief Write data to Packet payload.
*
* @param pkt Packet pointer.
* @param src Data source.
* @param offset Offset is relative to Packet's payload.
* @param size Write size.
* @return Success write size.
* @since 1.0
* @version 1.0
*/
BTSTACK_API uint32_t PacketPayloadWrite(const Packet *pkt, const uint8_t *src, uint32_t offset, uint32_t size);
* @brief Add one buffer block to Packet's payload last. (Before packet's tail)
*
* @param pkt Packet pointer.
* @param buf Add buffer pointer.
* @since 1.0
* @version 1.0
*/
BTSTACK_API void PacketPayloadAddLast(const Packet *pkt, const Buffer *buf);
* @brief Get Packet size.
*
* @param pkt Packet pointer.
* @return Packet size.
* @since 1.0
* @version 1.0
*/
BTSTACK_API uint32_t PacketSize(const Packet *pkt);
* @brief Read data from whole Packet.
*
* @param pkt Packet pointer.
* @param dst Data destination.
* @param offset Offset is relative to whole Packet.
* @param size Read size.
* @return Success read size.
* @since 1.0
* @version 1.0
*/
BTSTACK_API uint32_t PacketRead(const Packet *pkt, uint8_t *dst, uint32_t offset, uint32_t size);
* @brief Extract Packet head from payload.
* Used in data upstream.
*
* @param pkt Packet pointer.
* @param data Data destination.
* @param size Extract size.
* @since 1.0
* @version 1.0
*/
BTSTACK_API void PacketExtractHead(Packet *pkt, uint8_t *data, uint32_t size);
* @brief Extract Packet tail from payload.
* Used in data upstream.
*
* @param pkt Packet pointer.
* @param data Data destination.
* @param size Extract size.
* @since 1.0
* @version 1.0
*/
BTSTACK_API void PacketExtractTail(const Packet *pkt, uint8_t *data, uint32_t size);
* @brief Fragment packet by fragLen.
* This operation will change the metadata in uplayer packet.
* If necessary, execute PacketRefMalloc before.
* Return uplayer packet remain length.
* Used in data downstream.
*
* @param uplayer Uplayer packet(Packet be fragmented).
* @param downlayer Downlayer packet(Fragmented results packet).
* @param fragLen Fragment length.
* @return Uplayer packet remain length.
* @since 1.0
* @version 1.0
*/
BTSTACK_API uint32_t PacketFragment(Packet *uplayer, const Packet *downlayer, uint32_t fragLen);
* @brief Reassemble data packet.
* Used in data upstream.
*
* @param uplayer Uplayer packet(Packet assemble destination).
* @param downlayer Downlayer packet(Packet assemble source).
* @since 1.0
* @version 1.0
*/
BTSTACK_API void PacketAssemble(const Packet *uplayer, const Packet *downlayer);
* @brief Packet calculate crc16.
*
* @param calCrc16 CalCrc16 algorithm.
* @return Computing result.
* @since 1.0
* @version 1.0
*/
BTSTACK_API uint16_t PacketCalCrc16(const Packet *pkt, CalCrc16 calCrc16);
* @brief Packet verification crc16.
*
* @param calCrc16 CalCrc16 algorithm.
* @param crcVal Verification data.
* @return 0:success -1:failed
* @since 1.0
* @version 1.0
*/
BTSTACK_API int32_t PacketVerCrc16(const Packet *pkt, CalCrc16 calCrc16, uint16_t crcVal);
#ifdef __cplusplus
}
#endif
#endif