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