Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 1 | little_endian_packets |
| 2 | |
Myles Watson | 9ad9dfd | 2019-04-16 17:05:10 -0700 | [diff] [blame] | 3 | checksum Fcs : 16 "l2cap/" |
| 4 | |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 5 | packet BasicFrame { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 6 | _size_(_payload_) : 16, |
| 7 | channel_id : 16, |
| 8 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 9 | } |
| 10 | |
Myles Watson | 9ad9dfd | 2019-04-16 17:05:10 -0700 | [diff] [blame] | 11 | packet BasicFrameWithFcs { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 12 | _checksum_start_(fcs), |
| 13 | _size_(_payload_) : 16, |
| 14 | channel_id : 16, |
| 15 | _payload_ : [+2*8], // Include Fcs in the _size_ |
| 16 | fcs : Fcs, |
Myles Watson | 9ad9dfd | 2019-04-16 17:05:10 -0700 | [diff] [blame] | 17 | } |
| 18 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 19 | enum Continuation : 1 { |
| 20 | END = 0, |
| 21 | CONTINUE = 1, |
| 22 | } |
| 23 | |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 24 | // ChannelId 2 is connectionless |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 25 | packet GroupFrame : BasicFrame (channel_id = 0x02) { |
| 26 | psm : 16, |
| 27 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 28 | } |
| 29 | |
| 30 | enum FrameType : 1 { |
| 31 | I_FRAME = 0, |
| 32 | S_FRAME = 1, |
| 33 | } |
| 34 | |
| 35 | enum SupervisoryFunction : 2 { |
| 36 | RECEIVER_READY = 0, |
| 37 | REJECT = 1, |
| 38 | RECEIVER_NOT_READY = 2, |
| 39 | SELECT_REJECT = 3, |
| 40 | } |
| 41 | |
| 42 | enum RetransmissionDisable : 1 { |
| 43 | NORMAL = 0, |
| 44 | DISABLE = 1, |
| 45 | } |
| 46 | |
| 47 | enum SegmentationAndReassembly : 2 { |
| 48 | UNSEGMENTED = 0, |
| 49 | START = 1, |
| 50 | END = 2, |
| 51 | CONTINUATION = 3, |
| 52 | } |
| 53 | |
| 54 | packet StandardFrame : BasicFrame { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 55 | frame_type : FrameType, |
| 56 | _body_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 57 | } |
| 58 | |
Myles Watson | 9ad9dfd | 2019-04-16 17:05:10 -0700 | [diff] [blame] | 59 | packet StandardFrameWithFcs : BasicFrameWithFcs { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 60 | frame_type : FrameType, |
| 61 | _body_, |
Myles Watson | 9ad9dfd | 2019-04-16 17:05:10 -0700 | [diff] [blame] | 62 | } |
| 63 | |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 64 | group StandardSupervisoryControl { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 65 | _fixed_ = 0 : 1, |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 66 | s : SupervisoryFunction, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 67 | _reserved_ : 3, |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 68 | r : RetransmissionDisable, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 69 | req_seq : 6, |
| 70 | _reserved_ : 2, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 71 | } |
| 72 | |
| 73 | group StandardInformationControl { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 74 | tx_seq : 6, |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 75 | r : RetransmissionDisable, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 76 | req_seq : 6, |
| 77 | sar : SegmentationAndReassembly, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 78 | } |
| 79 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 80 | packet StandardSupervisoryFrame : StandardFrame (frame_type = S_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 81 | StandardSupervisoryControl, |
| 82 | } |
| 83 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 84 | packet StandardSupervisoryFrameWithFcs : StandardFrameWithFcs (frame_type = S_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 85 | StandardSupervisoryControl, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 86 | } |
| 87 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 88 | packet StandardInformationFrame : StandardFrame (frame_type = I_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 89 | StandardInformationControl, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 90 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 91 | } |
| 92 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 93 | packet StandardInformationFrameWithFcs : StandardFrameWithFcs (frame_type = I_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 94 | StandardInformationControl, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 95 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 96 | } |
| 97 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 98 | packet StandardInformationStartFrame : StandardInformationFrame (sar = START) { |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 99 | l2cap_sdu_length : 16, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 100 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 101 | } |
| 102 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 103 | packet StandardInformationStartFrameWithFcs : StandardInformationFrameWithFcs (sar = START) { |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 104 | l2cap_sdu_length : 16, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 105 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 106 | } |
| 107 | |
| 108 | enum Poll : 1 { |
| 109 | NOT_SET = 0, |
| 110 | POLL = 1, |
| 111 | } |
| 112 | |
| 113 | enum Final : 1 { |
| 114 | NOT_SET = 0, |
| 115 | POLL_RESPONSE = 1, |
| 116 | } |
| 117 | |
| 118 | group EnhancedSupervisoryControl { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 119 | _fixed_ = 0 : 1, |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 120 | s : SupervisoryFunction, |
| 121 | p : Poll, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 122 | _reserved_ : 2, |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 123 | f : Final, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 124 | req_seq : 6, |
| 125 | _reserved_ : 2, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 126 | } |
| 127 | |
| 128 | group EnhancedInformationControl { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 129 | tx_seq : 6, |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 130 | f : Final, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 131 | req_seq : 6, |
| 132 | sar : SegmentationAndReassembly, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 133 | } |
| 134 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 135 | packet EnhancedSupervisoryFrame : StandardFrame (frame_type = S_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 136 | EnhancedSupervisoryControl, |
| 137 | } |
| 138 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 139 | packet EnhancedSupervisoryFrameWithFcs : StandardFrameWithFcs (frame_type = S_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 140 | EnhancedSupervisoryControl, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 141 | } |
| 142 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 143 | packet EnhancedInformationFrame : StandardFrame (frame_type = I_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 144 | EnhancedInformationControl, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 145 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 146 | } |
| 147 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 148 | packet EnhancedInformationFrameWithFcs : StandardFrameWithFcs (frame_type = I_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 149 | EnhancedInformationControl, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 150 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 151 | } |
| 152 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 153 | packet EnhancedInformationStartFrame : EnhancedInformationFrame (sar = START) { |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 154 | l2cap_sdu_length : 16, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 155 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 156 | } |
| 157 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 158 | packet EnhancedInformationStartFrameWithFcs : EnhancedInformationFrameWithFcs (sar = START) { |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 159 | l2cap_sdu_length : 16, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 160 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 161 | } |
| 162 | |
| 163 | group ExtendedSupervisoryControl { |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 164 | f : Final, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 165 | req_seq : 14, |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 166 | s : SupervisoryFunction, |
| 167 | p : Poll, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 168 | _reserved_ : 5, |
| 169 | _reserved_ : 8, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 170 | } |
| 171 | |
| 172 | group ExtendedInformationControl { |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 173 | f : Final, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 174 | req_seq : 14, |
| 175 | sar : SegmentationAndReassembly, |
| 176 | tx_seq : 14, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 177 | } |
| 178 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 179 | packet ExtendedSupervisoryFrame : StandardFrame (frame_type = S_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 180 | ExtendedSupervisoryControl, |
| 181 | } |
| 182 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 183 | packet ExtendedSupervisoryFrameWithFcs : StandardFrameWithFcs (frame_type = S_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 184 | ExtendedSupervisoryControl, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 185 | } |
| 186 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 187 | packet ExtendedInformationFrame : StandardFrame (frame_type = I_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 188 | ExtendedInformationControl, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 189 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 190 | } |
| 191 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 192 | packet ExtendedInformationFrameWithFcs : StandardFrameWithFcs (frame_type = I_FRAME) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 193 | ExtendedInformationControl, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 194 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 195 | } |
| 196 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 197 | packet ExtendedInformationStartFrame : ExtendedInformationFrame (sar = START) { |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 198 | l2cap_sdu_length : 16, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 199 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 200 | } |
| 201 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 202 | packet ExtendedInformationStartFrameWithFcs : ExtendedInformationFrameWithFcs (sar = START) { |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 203 | l2cap_sdu_length : 16, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 204 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 205 | } |
| 206 | |
| 207 | packet FirstLeInformationFrame : BasicFrame { |
Myles Watson | d68d6ce | 2019-05-22 10:52:49 -0700 | [diff] [blame] | 208 | l2cap_sdu_length : 16, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 209 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 210 | } |
| 211 | |
| 212 | enum CommandCode : 8 { |
| 213 | COMMAND_REJECT = 0x01, |
| 214 | CONNECTION_REQUEST = 0x02, |
| 215 | CONNECTION_RESPONSE = 0x03, |
| 216 | CONFIGURATION_REQUEST = 0x04, |
| 217 | CONFIGURATION_RESPONSE = 0x05, |
| 218 | DISCONNECTION_REQUEST = 0x06, |
| 219 | DISCONNECTION_RESPONSE = 0x07, |
| 220 | ECHO_REQUEST = 0x08, |
| 221 | ECHO_RESPONSE = 0x09, |
| 222 | INFORMATION_REQUEST = 0x0A, |
| 223 | INFORMATION_RESPONSE = 0x0B, |
| 224 | CREATE_CHANNEL_REQUEST = 0x0C, |
| 225 | CREATE_CHANNEL_RESPONSE = 0x0D, |
| 226 | MOVE_CHANNEL_REQUEST = 0x0E, |
| 227 | MOVE_CHANNEL_RESPONSE = 0x0F, |
| 228 | MOVE_CHANNEL_CONFIRMATION_REQUEST = 0x10, |
| 229 | MOVE_CHANNEL_CONFIRMATION_RESPONSE = 0x11, |
| 230 | } |
| 231 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 232 | packet ControlFrame : BasicFrame (channel_id = 0x0001) { |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 233 | _payload_, |
| 234 | } |
| 235 | |
| 236 | packet Control { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 237 | code : CommandCode, |
| 238 | identifier : 8, |
| 239 | _size_(_payload_) : 16, |
| 240 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 241 | } |
| 242 | |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 243 | enum CommandRejectReason : 16 { |
| 244 | COMMAND_NOT_UNDERSTOOD = 0x0000, |
| 245 | SIGNALING_MTU_EXCEEDED = 0x0001, |
| 246 | INVALID_CID_IN_REQUEST = 0x0002, |
| 247 | } |
| 248 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 249 | packet CommandReject : Control (code = COMMAND_REJECT) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 250 | reason : CommandRejectReason, |
| 251 | _body_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 252 | } |
| 253 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 254 | packet CommandRejectNotUnderstood : CommandReject (reason = COMMAND_NOT_UNDERSTOOD) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 255 | } |
| 256 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 257 | packet CommandRejectMtuExceeded : CommandReject (reason = SIGNALING_MTU_EXCEEDED) { |
| 258 | actual_mtu : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 259 | } |
| 260 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 261 | packet CommandRejectInvalidCid : CommandReject (reason = INVALID_CID_IN_REQUEST) { |
| 262 | local_channel : 16, // Relative to the sender of the CommandReject |
| 263 | remote_channel : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 264 | } |
| 265 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 266 | packet ConnectionRequest : Control (code = CONNECTION_REQUEST) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 267 | psm : 16, |
| 268 | source_cid : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 269 | } |
| 270 | |
| 271 | enum ConnectionResponseResult : 16 { |
Myles Watson | a6b27a5 | 2019-05-15 07:18:18 -0700 | [diff] [blame] | 272 | SUCCESS = 0x0000, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 273 | PENDING = 0x0001, |
| 274 | PSM_NOT_SUPPORTED = 0x0002, |
| 275 | SECURITY_BLOCK = 0x0003, |
| 276 | NO_RESOURCES_AVAILABLE = 0x0004, |
| 277 | INVALID_CID = 0x0006, |
| 278 | SOURCE_CID_ALREADY_ALLOCATED = 0x0007, |
| 279 | } |
| 280 | |
| 281 | enum ConnectionResponseStatus : 16 { |
| 282 | NO_FURTHER_INFORMATION_AVAILABLE = 0x0000, |
| 283 | AUTHENTICATION_PENDING = 0x0001, |
| 284 | AUTHORIZATION_PENDING = 0x0002, |
| 285 | } |
| 286 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 287 | packet ConnectionResponse : Control (code = CONNECTION_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 288 | destination_cid : 16, |
| 289 | source_cid : 16, |
| 290 | result : ConnectionResponseResult, |
| 291 | status : ConnectionResponseStatus, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 292 | } |
| 293 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 294 | enum ConfigurationOptionType : 7 { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 295 | MTU = 0x01, |
| 296 | FLUSH_TIMEOUT = 0x02, |
| 297 | QUALITY_OF_SERVICE = 0x03, |
| 298 | RETRANSMISSION_AND_FLOW_CONTROL = 0x04, |
| 299 | FRAME_CHECK_SEQUENCE = 0x05, |
| 300 | EXTENDED_FLOW_SPECIFICATION = 0x06, |
| 301 | EXTENDED_WINDOW_SIZE = 0x07, |
| 302 | } |
| 303 | |
| 304 | enum ConfigurationOptionIsHint : 1 { |
| 305 | OPTION_MUST_BE_RECOGNIZED = 0, |
| 306 | OPTION_IS_A_HINT = 1, |
| 307 | } |
| 308 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 309 | struct ConfigurationOption { |
| 310 | type : ConfigurationOptionType, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 311 | is_hint : ConfigurationOptionIsHint, |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 312 | length : 8, |
| 313 | _body_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 314 | } |
| 315 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 316 | struct MtuConfigurationOption : ConfigurationOption (type = MTU, length = 2) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 317 | mtu : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 318 | } |
| 319 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 320 | struct FlushTimeoutConfigurationOption : ConfigurationOption (type = FLUSH_TIMEOUT, length = 2) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 321 | flush_timeout : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 322 | } |
| 323 | |
| 324 | enum QosServiceType : 8 { |
| 325 | NO_TRAFFIC = 0x00, |
| 326 | BEST_EFFORT = 0x01, // Default |
| 327 | GUARANTEED = 0x02, |
| 328 | } |
| 329 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 330 | struct QualityOfServiceConfigurationOption : ConfigurationOption (type = QUALITY_OF_SERVICE, length = 22) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 331 | _reserved_ : 8, // Flags |
| 332 | service_type : QosServiceType, |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 333 | token_rate : 32, // 0 = ignore, 0xffffffff = max available |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 334 | token_bucket_size : 32, // 0 = ignore, 0xffffffff = max available |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 335 | peak_bandwidth : 32, // Octets/second 0 = ignore |
| 336 | latency : 32, // microseconds 0xffffffff = ignore |
| 337 | delay_variation : 32, // microseconds 0xffffffff = ignore |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 338 | } |
| 339 | |
| 340 | enum RetransmissionAndFlowControlModeOption : 8 { |
| 341 | L2CAP_BASIC = 0x00, |
| 342 | RETRANSMISSION = 0x01, |
| 343 | FLOW_CONTROL = 0x02, |
| 344 | ENHANCED_RETRANSMISSION = 0x03, |
| 345 | STREAMING = 0x04, |
| 346 | } |
| 347 | |
| 348 | |
Hansong Zhang | a631253 | 2019-11-19 14:01:36 -0800 | [diff] [blame] | 349 | struct RetransmissionAndFlowControlConfigurationOption : ConfigurationOption (type = RETRANSMISSION_AND_FLOW_CONTROL, length = 9) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 350 | mode : RetransmissionAndFlowControlModeOption, |
| 351 | tx_window_size : 8, // 1-32 for Flow Control and Retransmission, 1-63 for Enhanced |
| 352 | max_transmit : 8, |
Hansong Zhang | a631253 | 2019-11-19 14:01:36 -0800 | [diff] [blame] | 353 | retransmission_time_out : 16, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 354 | monitor_time_out : 16, |
| 355 | maximum_pdu_size : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 356 | } |
| 357 | |
| 358 | enum FcsType : 8 { |
| 359 | NO_FCS = 0, |
| 360 | DEFAULT = 1, // 16-bit FCS |
| 361 | } |
| 362 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 363 | struct FrameCheckSequenceOption : ConfigurationOption (type = FRAME_CHECK_SEQUENCE, length = 1) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 364 | fcs_type : FcsType, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 365 | } |
| 366 | |
| 367 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 368 | struct ExtendedFlowSpecificationOption : ConfigurationOption (type = EXTENDED_FLOW_SPECIFICATION, length = 16) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 369 | identifier : 8, // Default 0x01, must be 0x01 for Extended Flow-Best-Effort |
| 370 | service_type : QosServiceType, |
| 371 | maximum_sdu_size : 16, // Octets |
| 372 | sdu_interarrival_time : 32, // in microseconds |
| 373 | access_latency : 32, // in microseconds, without HCI and stack overheads |
| 374 | flush_timeout : 32, // in microseconds 0x0 = no retransmissions 0xFFFFFFFF = never flushed |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 375 | } |
| 376 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 377 | struct ExtendedWindowSizeOption : ConfigurationOption (type = EXTENDED_WINDOW_SIZE, length = 2) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 378 | max_window_size : 16, // 0x0000 = Valid for streaming, 0x0001-0x3FFF Valid for Enhanced Retransmission |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 379 | } |
| 380 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 381 | packet ConfigurationRequest : Control (code = CONFIGURATION_REQUEST) { |
| 382 | destination_cid : 16, |
| 383 | continuation : Continuation, |
| 384 | _reserved_ : 15, |
| 385 | config : ConfigurationOption[], |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 386 | } |
| 387 | |
| 388 | enum ConfigurationResponseResult : 16 { |
| 389 | SUCCESS = 0x0000, |
| 390 | UNACCEPTABLE_PARAMETERS = 0x0001, |
| 391 | REJECTED = 0x0002, |
| 392 | UNKNOWN_OPTIONS = 0x0003, |
| 393 | PENDING = 0x0004, |
| 394 | FLOW_SPEC_REJECTED = 0x0005, |
| 395 | } |
| 396 | |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 397 | packet ConfigurationResponse : Control (code = CONFIGURATION_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 398 | source_cid : 16, |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 399 | continuation : Continuation, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 400 | _reserved_ : 15, |
| 401 | result : ConfigurationResponseResult, |
Myles Watson | 2df6703 | 2019-07-11 16:17:05 -0700 | [diff] [blame] | 402 | config : ConfigurationOption[], |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 403 | } |
| 404 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 405 | packet DisconnectionRequest : Control (code = DISCONNECTION_REQUEST) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 406 | destination_cid : 16, |
| 407 | source_cid : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 408 | } |
| 409 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 410 | packet DisconnectionResponse : Control (code = DISCONNECTION_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 411 | destination_cid : 16, |
| 412 | source_cid : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 413 | } |
| 414 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 415 | packet EchoRequest : Control (code = ECHO_REQUEST) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 416 | _payload_, // Optional and implementation specific |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 417 | } |
| 418 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 419 | packet EchoResponse : Control (code = ECHO_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 420 | _payload_, // Optional and implementation specific |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 421 | } |
| 422 | |
| 423 | enum InformationRequestInfoType : 16 { |
| 424 | CONNECTIONLESS_MTU = 0x0001, |
| 425 | EXTENDED_FEATURES_SUPPORTED = 0x0002, |
| 426 | FIXED_CHANNELS_SUPPORTED = 0x0003, |
| 427 | } |
| 428 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 429 | packet InformationRequest : Control (code = INFORMATION_REQUEST) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 430 | info_type : InformationRequestInfoType, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 431 | } |
| 432 | |
| 433 | enum InformationRequestResult : 16 { |
| 434 | SUCCESS = 0x0000, |
| 435 | NOT_SUPPORTED = 0x0001, |
| 436 | } |
| 437 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 438 | packet InformationResponse : Control (code = INFORMATION_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 439 | info_type : InformationRequestInfoType, |
| 440 | result : InformationRequestResult, |
| 441 | _body_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 442 | } |
| 443 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 444 | packet InformationResponseConnectionlessMtu : InformationResponse (info_type = CONNECTIONLESS_MTU) { |
| 445 | connectionless_mtu : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 446 | } |
| 447 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 448 | packet InformationResponseExtendedFeatures : InformationResponse (info_type = EXTENDED_FEATURES_SUPPORTED) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 449 | // ExtendedFeatureMask : 32, |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 450 | flow_control_mode : 1, |
| 451 | retransmission_mode : 1, |
| 452 | bi_directional_qoS : 1, |
| 453 | enhanced_retransmission_mode : 1, |
| 454 | streaming_mode : 1, |
| 455 | fcs_option : 1, |
| 456 | extended_flow_specification_for_br_edr : 1, |
| 457 | fixed_channels : 1, |
| 458 | extended_window_size : 1, |
| 459 | unicast_connectionless_data_reception : 1, |
| 460 | _reserved_ : 22, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 461 | } |
| 462 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 463 | packet InformationResponseFixedChannels : InformationResponse (info_type = FIXED_CHANNELS_SUPPORTED) { |
| 464 | fixed_channels : 64, // bit 0 must be 0, bit 1 must be 1, all others 1 = supported |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 465 | } |
| 466 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 467 | packet CreateChannelRequest : Control (code = CREATE_CHANNEL_REQUEST) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 468 | psm : 16, |
| 469 | source_cid : 16, |
| 470 | controller_id : 8, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 471 | } |
| 472 | |
| 473 | enum CreateChannelResponseResult : 16 { |
Myles Watson | a6b27a5 | 2019-05-15 07:18:18 -0700 | [diff] [blame] | 474 | SUCCESS = 0x0000, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 475 | PENDING = 0x0001, |
| 476 | PSM_NOT_SUPPORTED = 0x0002, |
| 477 | SECURITY_BLOCK = 0x0003, |
| 478 | NO_RESOURCES_AVAILABLE = 0x0004, |
| 479 | CONTROLLER_ID_NOT_SUPPORTED = 0x0005, |
| 480 | INVALID_CID = 0x0006, |
| 481 | SOURCE_CID_ALREADY_ALLOCATED = 0x0007, |
| 482 | } |
| 483 | |
| 484 | enum CreateChannelResponseStatus : 16 { |
| 485 | NO_FURTHER_INFORMATION_AVAILABLE = 0x0000, |
| 486 | AUTHENTICATION_PENDING = 0x0001, |
| 487 | AUTHORIZATION_PENDING = 0x0002, |
| 488 | } |
| 489 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 490 | packet CreateChannelResponse : Control (code = CREATE_CHANNEL_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 491 | destination_cid : 16, |
| 492 | source_cid : 16, |
| 493 | result : CreateChannelResponseResult, |
| 494 | status : CreateChannelResponseStatus, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 495 | } |
| 496 | |
| 497 | // AMP Only ? |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 498 | packet MoveChannelRequest : Control (code = MOVE_CHANNEL_REQUEST) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 499 | initiator_cid : 16, |
| 500 | dest_controller_id : 8, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 501 | } |
| 502 | |
| 503 | enum MoveChannelResponseResult : 16 { |
| 504 | SUCCESS = 0x0000, |
| 505 | PENDING = 0x0001, |
| 506 | CONTROLLER_ID_NOT_SUPPORTED = 0x0002, |
| 507 | NEW_CONTROLLER_ID_IS_SAME = 0x0003, |
| 508 | CONFIGURATION_NOT_SUPPORTED = 0x0004, |
| 509 | CHANNEL_COLLISION = 0x0005, |
| 510 | CHANNEL_NOT_ALLOWED_TO_BE_MOVED = 0x0006, |
| 511 | } |
| 512 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 513 | packet MoveChannelResponse : Control (code = MOVE_CHANNEL_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 514 | initiator_cid : 16, |
| 515 | result : MoveChannelResponseResult, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 516 | } |
| 517 | |
| 518 | enum MoveChannelConfirmationResult : 16 { |
| 519 | SUCCESS = 0x0000, |
| 520 | FAILURE = 0x0001, |
| 521 | } |
| 522 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 523 | packet MoveChannelConfirmationRequest : Control (code = MOVE_CHANNEL_CONFIRMATION_REQUEST) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 524 | initiator_cid : 16, |
| 525 | result : MoveChannelConfirmationResult, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 526 | } |
| 527 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 528 | packet MoveChannelConfirmationResponse : Control (code = MOVE_CHANNEL_CONFIRMATION_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 529 | initiator_cid : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 530 | } |
| 531 | |
| 532 | enum LeCommandCode : 8 { |
| 533 | COMMAND_REJECT = 0x01, |
| 534 | DISCONNECTION_REQUEST = 0x06, |
| 535 | DISCONNECTION_RESPONSE = 0x07, |
| 536 | CONNECTION_PARAMETER_UPDATE_REQUEST = 0x12, |
| 537 | CONNECTION_PARAMETER_UPDATE_RESPONSE = 0x13, |
| 538 | LE_CREDIT_BASED_CONNECTION_REQUEST = 0x14, |
| 539 | LE_CREDIT_BASED_CONNECTION_RESPONSE = 0x15, |
| 540 | LE_FLOW_CONTROL_CREDIT = 0x16, |
| 541 | } |
| 542 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 543 | packet LeControlFrame : BasicFrame (channel_id = 0x0005) { |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 544 | _payload_, |
| 545 | } |
| 546 | |
| 547 | packet LeControl { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 548 | code : LeCommandCode, |
| 549 | identifier : 8, // Must be non-zero |
| 550 | _size_(_payload_) : 16, |
| 551 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 552 | } |
| 553 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 554 | |
| 555 | packet LeCommandReject : LeControl (code = COMMAND_REJECT) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 556 | reason : CommandRejectReason, |
| 557 | _payload_, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 558 | } |
| 559 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 560 | packet LeCommandRejectNotUnderstood : LeCommandReject (reason = COMMAND_NOT_UNDERSTOOD) { |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 561 | } |
| 562 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 563 | packet LeCommandRejectMtuExceeded : LeCommandReject (reason = SIGNALING_MTU_EXCEEDED) { |
| 564 | actual_mtu : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 565 | } |
| 566 | |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 567 | packet LeCommandRejectInvalidCid : LeCommandReject (reason = INVALID_CID_IN_REQUEST) { |
| 568 | local_channel : 16, // Relative to the sender of the CommandReject |
| 569 | remote_channel : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 570 | } |
| 571 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 572 | packet LeDisconnectionRequest : LeControl (code = DISCONNECTION_REQUEST) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 573 | destination_cid : 16, |
| 574 | source_cid : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 575 | } |
| 576 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 577 | packet LeDisconnectionResponse : LeControl (code = DISCONNECTION_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 578 | destination_cid : 16, |
| 579 | source_cid : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 580 | } |
| 581 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 582 | packet ConnectionParameterUpdateRequest : LeControl (code = CONNECTION_PARAMETER_UPDATE_REQUEST) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 583 | interval_min : 16, |
| 584 | interval_max : 16, |
| 585 | slave_latency : 16, |
| 586 | timeout_multiplier : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 587 | } |
| 588 | |
| 589 | enum ConnectionParameterUpdateResponseResult : 16 { |
| 590 | ACCEPTED = 0, |
| 591 | REJECTED = 1, |
| 592 | } |
| 593 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 594 | packet ConnectionParameterUpdateResponse : LeControl (code = CONNECTION_PARAMETER_UPDATE_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 595 | result : ConnectionParameterUpdateResponseResult, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 596 | } |
| 597 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 598 | packet LeCreditBasedConnectionRequest : LeControl (code = LE_CREDIT_BASED_CONNECTION_REQUEST) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 599 | le_psm : 16, // 0x0001-0x007F Fixed, 0x0080-0x00FF Dynamic |
| 600 | source_cid : 16, |
| 601 | mtu : 16, |
| 602 | mps : 16, |
| 603 | initial_credits : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 604 | } |
| 605 | |
| 606 | enum LeCreditBasedConnectionResponseResult : 16 { |
| 607 | SUCCESS = 0x0000, |
| 608 | LE_PSM_NOT_SUPPORTED = 0x0002, |
| 609 | NO_RESOURCES_AVAILABLE = 0x0004, |
| 610 | INSUFFICIENT_AUTHENTICATION = 0x0005, |
| 611 | INSUFFICIENT_AUTHORIZATION = 0x0006, |
| 612 | INSUFFICIENT_ENCRYPTION_KEY_SIZE = 0x0007, |
| 613 | INSUFFICIENT_ENCRYPTION = 0x0008, |
| 614 | INVALID_SOURCE_CID = 0x0009, |
| 615 | SOURCE_CID_ALREADY_ALLOCATED = 0x000A, |
| 616 | UNACCEPTABLE_PARAMETERS = 0x000B, |
| 617 | } |
| 618 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 619 | packet LeCreditBasedConnectionResponse : LeControl (code = LE_CREDIT_BASED_CONNECTION_RESPONSE) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 620 | destination_cid : 16, |
| 621 | mtu : 16, |
| 622 | mps : 16, |
| 623 | initial_credits : 16, |
| 624 | result : LeCreditBasedConnectionResponseResult, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 625 | } |
| 626 | |
Chris Manton | 3360b8d | 2019-07-17 11:37:27 -0700 | [diff] [blame] | 627 | packet LeFlowControlCredit : LeControl (code = LE_FLOW_CONTROL_CREDIT) { |
Myles Watson | 1d8aa28 | 2019-04-22 14:16:41 -0700 | [diff] [blame] | 628 | cid : 16, // Receiver's destination CID |
| 629 | credits : 16, |
Myles Watson | a4cd53c | 2019-03-25 15:25:08 -0700 | [diff] [blame] | 630 | } |
| 631 | |