1little_endian_packets
2
3enum AttOpcode : 8 {
4  ERROR_RESPONSE = 0x01,
5
6  EXCHANGE_MTU_REQUEST = 0x02,
7  EXCHANGE_MTU_RESPONSE = 0x03,
8
9  FIND_INFORMATION_REQUEST = 0x04,
10  FIND_INFORMATION_RESPONSE = 0x05,
11
12  FIND_BY_TYPE_VALUE_REQUEST = 0x06,
13  FIND_BY_TYPE_VALUE_RESPONSE = 0x07,
14
15  READ_BY_TYPE_REQUEST = 0x08,
16  READ_BY_TYPE_RESPONSE = 0x09,
17
18  READ_REQUEST = 0x0A,
19  READ_RESPONSE = 0x0B,
20
21  READ_BLOB_REQUEST = 0x0C,
22  READ_BLOB_RESPONSE = 0x0D,
23
24  READ_MULTIPLE_REQUEST = 0x0E,
25  READ_MULTIPLE_RESPONSE = 0x0F,
26
27  READ_BY_GROUP_TYPE_REQUEST = 0x10,
28  READ_BY_GROUP_TYPE_RESPONSE = 0x11,
29
30  WRITE_REQUEST = 0x12,
31  WRITE_RESPONSE = 0x13,
32
33  WRITE_COMMAND = 0x52,
34
35  PREPARE_WRITE_REQUEST = 0x16,
36  PREPARE_WRITE_RESPONSE = 0x17,
37  EXECUTE_WRITE_REQUEST = 0x18,
38  EXECUTE_WRITE_RESPONSE = 0x19,
39
40  READ_MULTIPLE_VARIABLE_REQUEST = 0x20,
41  READ_MULTIPLE_VARIABLE_RESPONSE = 0x21,
42
43  HANDLE_VALUE_NOTIFICATION = 0x1B,
44
45  HANDLE_VALUE_INDICATION = 0x1D,
46  HANDLE_VALUE_CONFIRMATION = 0x1E,
47
48  SIGNED_WRITE_COMMAND = 0xD2,
49}
50
51packet Att {
52  opcode : AttOpcode,
53  _payload_,
54}
55
56// TODO(aryarahul) - add support for profile-specific error codes
57// So probably this enum will need to move out of PDL
58enum AttErrorCode : 8 {
59  INVALID_HANDLE = 0x01,
60  READ_NOT_PERMITTED = 0x02,
61  WRITE_NOT_PERMITTED = 0x03,
62  INVALID_PDU = 0x04,
63  INSUFFICIENT_AUTHENTICATION = 0x05,
64  REQUEST_NOT_SUPPORTED = 0x06,
65  ATTRIBUTE_NOT_FOUND = 0x0A,
66  ATTRIBUTE_NOT_LONG = 0x0B,
67  UNLIKELY_ERROR = 0x0E,
68  UNSUPPORTED_GROUP_TYPE = 0x10,
69  APPLICATION_ERROR = 0x80,
70  WRITE_REQUEST_REJECTED = 0xFC,
71  CLIENT_CHARACTERISTIC_CONFIGURATION_DESCRIPTOR_IMPROPERLY_CONFIGURED = 0xFD,
72  PROCEDURE_ALREADY_IN_PROGRESS = 0xFE,
73  OUT_OF_RANGE = 0xFF,
74}
75
76struct AttHandle {
77  handle : 16,
78}
79
80packet AttFindInformationRequest : Att(opcode = FIND_INFORMATION_REQUEST) {
81  starting_handle : AttHandle,
82  ending_handle : AttHandle,
83}
84
85struct Uuid {
86  data: 8[],
87}
88
89struct Uuid16 {
90  data: 16,
91}
92
93struct Uuid128 {
94  data: 8[16],
95}
96
97enum AttFindInformationResponseFormat : 8 {
98  SHORT = 0x01,
99  LONG = 0x02,
100}
101
102struct AttFindInformationResponseShortEntry {
103  handle : AttHandle,
104  uuid : Uuid16,
105}
106
107struct AttFindInformationResponseLongEntry {
108  handle : AttHandle,
109  uuid : Uuid128,
110}
111
112packet AttFindInformationResponse : Att(opcode = FIND_INFORMATION_RESPONSE) {
113  format : AttFindInformationResponseFormat,
114  _payload_,
115}
116
117packet AttFindInformationShortResponse : AttFindInformationResponse(format = SHORT) {
118  data: AttFindInformationResponseShortEntry[],
119}
120
121packet AttFindInformationLongResponse : AttFindInformationResponse(format = LONG) {
122  data: AttFindInformationResponseLongEntry[],
123}
124
125struct GattCharacteristicProperties {
126  broadcast: 1,
127  read: 1,
128  write_without_response: 1,
129  write: 1,
130  notify: 1,
131  indicate: 1,
132  authenticated_signed_writes: 1,
133  extended_properties: 1,
134}
135
136struct GattCharacteristicDeclarationValue {
137  properties: GattCharacteristicProperties,
138  handle: AttHandle,
139  uuid: Uuid,
140}
141
142struct GattServiceDeclarationValue {
143  uuid: Uuid,
144}
145
146struct GattClientCharacteristicConfiguration {
147  notification: 1,
148  indication: 1,
149  _reserved_: 14,
150}
151
152struct GattServiceChanged {
153  start_handle: AttHandle,
154  end_handle: AttHandle,
155}
156
157struct UuidAsAttData {
158  uuid: Uuid,
159}
160
161packet AttFindByTypeValueRequest : Att(opcode = FIND_BY_TYPE_VALUE_REQUEST) {
162  starting_handle : AttHandle,
163  ending_handle : AttHandle,
164  attribute_type : Uuid16,
165  attribute_value : 8[],
166}
167
168struct AttributeHandleRange {
169  found_attribute_handle : AttHandle,
170  group_end_handle : AttHandle,
171}
172
173packet AttFindByTypeValueResponse : Att(opcode = FIND_BY_TYPE_VALUE_RESPONSE) {
174  handles_info : AttributeHandleRange[],
175}
176
177packet AttReadByGroupTypeRequest : Att(opcode = READ_BY_GROUP_TYPE_REQUEST) {
178  starting_handle : AttHandle,
179  ending_handle : AttHandle,
180  attribute_group_type : Uuid,
181}
182
183struct AttReadByGroupTypeDataElement {
184  handle : AttHandle,
185  end_group_handle : AttHandle,
186  value : 8[],
187}
188
189packet AttReadByGroupTypeResponse : Att(opcode = READ_BY_GROUP_TYPE_RESPONSE) {
190  _elementsize_(data) : 8,
191  data: AttReadByGroupTypeDataElement[],
192}
193
194packet AttReadByTypeRequest : Att(opcode = READ_BY_TYPE_REQUEST) {
195  starting_handle : AttHandle,
196  ending_handle : AttHandle,
197  attribute_type : Uuid,
198}
199
200struct AttReadByTypeDataElement {
201  handle : AttHandle,
202  value : 8[],
203}
204
205packet AttReadByTypeResponse : Att(opcode = READ_BY_TYPE_RESPONSE) {
206  _elementsize_(data) : 8,
207  data: AttReadByTypeDataElement[],
208}
209
210packet AttReadRequest : Att(opcode = READ_REQUEST) {
211  attribute_handle : AttHandle,
212}
213
214packet AttReadResponse : Att(opcode = READ_RESPONSE) {
215  value: 8[],
216}
217
218packet AttWriteRequest : Att(opcode = WRITE_REQUEST) {
219  handle : AttHandle,
220  value : 8[],
221}
222
223packet AttWriteResponse : Att(opcode = WRITE_RESPONSE) {}
224
225packet AttErrorResponse : Att(opcode = ERROR_RESPONSE) {
226  opcode_in_error: AttOpcode,
227  handle_in_error: AttHandle,
228  error_code: AttErrorCode,
229}
230
231packet AttHandleValueIndication : Att(opcode = HANDLE_VALUE_INDICATION) {
232  handle: AttHandle,
233  value: 8[],
234}
235
236packet AttHandleValueConfirmation : Att(opcode = HANDLE_VALUE_CONFIRMATION) {}
237
238packet AttExchangeMtuRequest : Att(opcode = EXCHANGE_MTU_REQUEST) {
239  mtu: 16,
240}
241
242packet AttExchangeMtuResponse : Att(opcode = EXCHANGE_MTU_RESPONSE) {
243  mtu: 16,
244}
245
246packet AttWriteCommand : Att(opcode = WRITE_COMMAND) {
247  handle : AttHandle,
248  value : 8[],
249}
250