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