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