1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef AVDTP_MESSAGE_H
17 #define AVDTP_MESSAGE_H
18 
19 #include "avdtp_int.h"
20 
21 /**
22  * Buffer size
23  */
24 #define AVDT_BUFFER_CMD_MAX 660      // Mtu 672 ,L2CAP Header:12
25 #define AVDT_BUFFER_SINGLE 2         // Single message header
26 #define AVDT_BUFFER_START 3          // Fragment message, start
27 #define AVDT_BUFFER_REJECT 3         // reject message
28 #define AVDT_BUFFER_REJECT_4 4       // reject message
29 #define AVDT_BUFFER_GENERAL_REJ 2    // general reject
30 #define AVDT_BUFFER_END 1            // Fragment message,continue or end
31 #define AVDT_BUFFER_ERR_CODE 1       // Error code
32 #define AVDT_BUFFER_SEID 1           // Each seid size
33 #define AVDT_BUFFER_HEADER_MAX 5     // Max size of message header
34 #define AVDT_BUFFER_DISCOVER_RSP 30  //
35 #define AVDT_BUFFER_ALLCAP_RSP 128   //
36 
37 /**
38  * 0x00 – Forbidden 0x01 – 0x3E valid SEID values 0x3F – RFD
39  */
40 #define AVDT_SEID_MIN 0x01
41 #define AVDT_SEID_MAX 0x3E
42 #define AVDT_SEID_FORBID 0x00
43 #define AVDT_SEID_INVLID 0x3F
44 
45 /**
46  * Packet type
47  */
48 #define AVDT_PKT_TYPE_SINGLE 0    // Single packet
49 #define AVDT_PKT_TYPE_START 1     // Start packet
50 #define AVDT_PKT_TYPE_CONTINUE 2  // Continue packet
51 #define AVDT_PKT_TYPE_END 3       // End packet
52 
53 /**
54  * Message type
55  */
56 #define AVDT_MSG_TYPE_CMD 0  // Command
57 #define AVDT_MSG_TYPE_GRJ 1  // General reject
58 #define AVDT_MSG_TYPE_RSP 2  // Response accept
59 #define AVDT_MSG_TYPE_REJ 3  // Response reject
60 
61 /**
62  * Signaling command
63  */
64 #define AVDT_SIG_INVALID 0x00     // Invalid signal
65 #define AVDT_SIG_DISCOVER 0x01    // Discover
66 #define AVDT_SIG_GETCAP 0x02      // Get capabilities
67 #define AVDT_SIG_SETCONFIG 0x03   // Set configuration
68 #define AVDT_SIG_GETCONFIG 0x04   // Get configuration
69 #define AVDT_SIG_RECONFIG 0x05    // Reconfigure
70 #define AVDT_SIG_OPEN 0x06        // Open
71 #define AVDT_SIG_START 0x07       // Start
72 #define AVDT_SIG_CLOSE 0x08       // Close
73 #define AVDT_SIG_SUSPEND 0x09     // Suspend
74 #define AVDT_SIG_ABORT 0x0A       // Abort
75 #define AVDT_SIG_SECURITY 0x0B    // Security control
76 #define AVDT_SIG_GET_ALLCAP 0x0C  // Get all capabilities
77 #define AVDT_SIG_DELAY_RPT 0x0D   // Delay report
78 
79 /**
80  * Maximum signal value
81  */
82 #define AVDT_SIG_MAX AVDT_SIG_DELAY_RPT
83 
84 /**
85  * Profile Service Category
86  */
87 #define AVDT_PSC_TRANS 1      // Media Transport
88 #define AVDT_PSC_REPORT 2     // Reporting
89 #define AVDT_PSC_RECOV 3      // Recovery
90 #define AVDT_PSC_PROTECT 4    // Content Protection
91 #define AVDT_PSC_HDRCMP 5     // Header Compression
92 #define AVDT_PSC_MUX 6        // Multiplexing
93 #define AVDT_PSC_CODEC 7      // Media Codec
94 #define AVDT_PSC_DELAY_RPT 8  // Delay Reporting
95 #define AVDT_PSC_MAX_CUR AVDT_PSC_DELAY_RPT
96 
97 #define MOVE_4BIT 4
98 #define MOVE_2BIT 2
99 
100 /**
101  * Channel types
102  */
103 enum {
104     AVDT_CH_TYPE_SIG,     // Signaling channel
105     AVDT_CH_TYPE_STREAM,  // Streaming Media channel
106     AVDT_CH_TYPE_NUM_TYPES
107 };
108 
109 /**
110  * Function declarations
111  */
112 /* Msg function declarations */
113 extern void AvdtSendSig(AvdtSigCtrl *sigCtrl);
114 extern void AvdtMsgSendCmd(AvdtSigCtrl *sigCtrl, AvdtStreamCtrl *streamCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
115 extern void AvdtMsgSendRsp(AvdtSigCtrl *sigCtrl, AvdtStreamCtrl *streamCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
116 extern void AvdtMsgSendRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
117 extern void AvdtMsgSendGeneralRej(AvdtSigCtrl *sigCtrl, uint8_t sigId);
118 
119 /**
120  * Inner function declaration
121  */
122 /**
123  * Build command
124  */
125 void AvdtBuildSingleHeader(uint8_t *data, uint8_t label, uint8_t pktType, uint8_t msgType);
126 void AvdtBuildSignal(uint8_t *data, uint8_t signal);
127 void AvdtBuildSignalSeid(uint8_t *data, uint8_t seid);
128 void AvdtBuildDelayCmd(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
129 void AvdtBuildDiscoverCmd(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
130 void AvdtBuildSingleCmd(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
131 void AvdtBuildSetConfigureCmd(
132     AvdtSigCtrl *sigCtrl, AvdtStreamCtrl *streamCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
133 void AvdtBuildReconfigureCmd(
134     AvdtSigCtrl *sigCtrl, AvdtStreamCtrl *streamCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
135 void AvdtSendFragPacket(uint16_t lcid, Packet *pkt, uint16_t peerMtu);
136 uint16_t AvdtBuildCapability(const Packet *pkt, const AvdtSepConfig *cfg, uint8_t off, uint8_t sigId);
137 uint16_t AvdtSendFragStart(uint16_t lcid, Packet *fragmentPacket, uint8_t signal, uint8_t number, uint8_t msgType,
138     uint8_t label, uint16_t peerMtu);
139 uint16_t AvdtSendFragContinueEnd(
140     uint16_t lcid, Packet *fragmentPacket, uint8_t pktType, uint8_t msgType, uint8_t label, uint16_t peerMtu);
141 /**
142  * Build respond
143  */
144 void AvdtBuildGetCapRsp(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
145 void AvdtBuildDiscoverRsp(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
146 void AvdtBuildSingleRsp(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
147 void AvdtBuildGetConfigureRsp(
148     AvdtSigCtrl *sigCtrl, AvdtStreamCtrl *streamCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData);
149 void AvdtBuildSeps(const Packet *pkt, const AvdtMsg *avdtMsgData);
150 
151 /**
152  * Build reject
153  */
154 void AvdtBuildCommonRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t errCode);
155 void AvdtBuildConfigureRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t category, uint8_t errCode);
156 void AvdtSignalGeneralRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t label);
157 /**
158  * Parse indication message
159  */
160 void AvdtParseMsg(AvdtSigCtrl *sigCtrl, Packet *pkt);
161 void AvdtParseSingleMsg(AvdtSigCtrl *sigCtrl, Packet *pkt, uint8_t transLabel, uint8_t messageType);
162 void AvdtParseSignalInd(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t label, const Packet *pkt);
163 void AvdtParseCommonInd(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t label, const Packet *pkt, uint8_t event);
164 void AvdtParseReconfigInd(AvdtSigCtrl *sigCtrl, uint8_t label, const Packet *pkt, uint8_t event);
165 void AvdtParseSetconfigInd(AvdtSigCtrl *sigCtrl, uint8_t label, const Packet *pkt, uint8_t event);
166 void AvdtParseDelayRptInd(AvdtSigCtrl *sigCtrl, uint8_t label, const Packet *pkt, uint8_t event);
167 void AvdtParseSignalRsp(AvdtSigCtrl *sigCtrl, uint8_t sigId, const Packet *pkt);
168 void AvdtAssembleMsg(AvdtSigCtrl *sigCtrl, uint8_t msgType, uint8_t pktType, Packet *pkt);
169 void AvdtParseSignalRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t label, Packet *pkt);
170 void AvdtParseSetconfig(uint16_t streamHandle, const Packet *pkt, uint16_t off, uint8_t *errCode, uint8_t *errParam);
171 void AvdtParseReconfig(uint16_t streamHandle, const Packet *pkt, uint16_t off, uint8_t *errCode, uint8_t *errParam);
172 uint8_t AvdtGetEventBySigidInd(uint8_t sigId);
173 uint8_t AvdtParseTransLabel(uint8_t header);
174 uint8_t AvdtParsePacketType(uint8_t header);
175 uint8_t AvdtParseMessageType(uint8_t header);
176 uint8_t AvdtParseSignal(uint8_t header);
177 uint8_t AvdtParseSeid(uint8_t data);
178 uint16_t AvdtParseDelayValue(uint8_t maxSB, uint8_t lowSB);
179 
180 /**
181  * Parse confirm message
182  */
183 void AvdtParseGetCapRsp(AvdtCtrlData *data, const Packet *pkt);
184 void AvdtParseGetConfigRsp(AvdtCtrlData *data, const Packet *pkt);
185 void AvdtParseDiscoverRsp(AvdtSigCtrl *sigCtrl, AvdtCtrlData *data, const Packet *pkt);
186 void AvdtParseMsgAssembled(AvdtSigCtrl *sigCtrl, Packet *pkt);
187 
188 uint8_t AvdtIndPktLenCheck(AvdtSigCtrl *sigCtrl, uint8_t sigId, const Packet *pkt);
189 void AvdtMakeRejMsg(uint8_t sigId, uint8_t errCode, uint8_t errParam, AvdtMsg *msg);
190 uint8_t AvdtIndSeidCheck(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t data);
191 uint8_t AvdtServiceCapCheck(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t data);
192 void AvdtIndReject(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t errCode, uint8_t errParam);
193 uint8_t AvdtCheckSignal(uint8_t sigId);
194 uint8_t AvdtParseCategoryCodec(AvdtSepConfig *sepConfig, const Packet *pkt, uint16_t offset);
195 uint8_t AvdtParseCategoryTrans(AvdtSepConfig *sepConfig, const Packet *pkt, uint16_t offset, uint8_t *data);
196 uint8_t AvdtParseCategoryDelay(AvdtSepConfig *sepConfig, const Packet *pkt, uint16_t offset, uint8_t *data);
197 uint8_t AvdtParseCategorySkip(const Packet *pkt, uint16_t offset);
198 void AvdtParseCategory(AvdtCtrlData *data, const Packet *pkt);
199 
200 #endif /* AVDTP_MESSAGE_H */
201