39d8477c创建于 2023年6月27日历史提交
/*
 * 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  // PACKET_H