little_endian_packets enum AttOpcode : 8 { ERROR_RESPONSE = 0x01, EXCHANGE_MTU_REQUEST = 0x02, EXCHANGE_MTU_RESPONSE = 0x03, FIND_INFORMATION_REQUEST = 0x04, FIND_INFORMATION_RESPONSE = 0x05, FIND_BY_TYPE_VALUE_REQUEST = 0x06, FIND_BY_TYPE_VALUE_RESPONSE = 0x07, READ_BY_TYPE_REQUEST = 0x08, READ_BY_TYPE_RESPONSE = 0x09, READ_REQUEST = 0x0A, READ_RESPONSE = 0x0B, READ_BLOB_REQUEST = 0x0C, READ_BLOB_RESPONSE = 0x0D, READ_MULTIPLE_REQUEST = 0x0E, READ_MULTIPLE_RESPONSE = 0x0F, READ_BY_GROUP_TYPE_REQUEST = 0x10, READ_BY_GROUP_TYPE_RESPONSE = 0x11, WRITE_REQUEST = 0x12, WRITE_RESPONSE = 0x13, WRITE_COMMAND = 0x52, PREPARE_WRITE_REQUEST = 0x16, PREPARE_WRITE_RESPONSE = 0x17, EXECUTE_WRITE_REQUEST = 0x18, EXECUTE_WRITE_RESPONSE = 0x19, READ_MULTIPLE_VARIABLE_REQUEST = 0x20, READ_MULTIPLE_VARIABLE_RESPONSE = 0x21, HANDLE_VALUE_NOTIFICATION = 0x1B, HANDLE_VALUE_INDICATION = 0x1D, HANDLE_VALUE_CONFIRMATION = 0x1E, SIGNED_WRITE_COMMAND = 0xD2, } packet Att { opcode : AttOpcode, _payload_, } // TODO(aryarahul) - add support for profile-specific error codes // So probably this enum will need to move out of PDL enum AttErrorCode : 8 { INVALID_HANDLE = 0x01, READ_NOT_PERMITTED = 0x02, WRITE_NOT_PERMITTED = 0x03, INVALID_PDU = 0x04, INSUFFICIENT_AUTHENTICATION = 0x05, REQUEST_NOT_SUPPORTED = 0x06, ATTRIBUTE_NOT_FOUND = 0x0A, ATTRIBUTE_NOT_LONG = 0x0B, UNLIKELY_ERROR = 0x0E, UNSUPPORTED_GROUP_TYPE = 0x10, APPLICATION_ERROR = 0x80, WRITE_REQUEST_REJECTED = 0xFC, CLIENT_CHARACTERISTIC_CONFIGURATION_DESCRIPTOR_IMPROPERLY_CONFIGURED = 0xFD, PROCEDURE_ALREADY_IN_PROGRESS = 0xFE, OUT_OF_RANGE = 0xFF, } struct AttHandle { handle : 16, } packet AttFindInformationRequest : Att(opcode = FIND_INFORMATION_REQUEST) { starting_handle : AttHandle, ending_handle : AttHandle, } struct Uuid { data: 8[], } struct Uuid16 { data: 16, } struct Uuid128 { data: 8[16], } enum AttFindInformationResponseFormat : 8 { SHORT = 0x01, LONG = 0x02, } struct AttFindInformationResponseShortEntry { handle : AttHandle, uuid : Uuid16, } struct AttFindInformationResponseLongEntry { handle : AttHandle, uuid : Uuid128, } packet AttFindInformationResponse : Att(opcode = FIND_INFORMATION_RESPONSE) { format : AttFindInformationResponseFormat, _payload_, } packet AttFindInformationShortResponse : AttFindInformationResponse(format = SHORT) { data: AttFindInformationResponseShortEntry[], } packet AttFindInformationLongResponse : AttFindInformationResponse(format = LONG) { data: AttFindInformationResponseLongEntry[], } struct GattCharacteristicProperties { broadcast: 1, read: 1, write_without_response: 1, write: 1, notify: 1, indicate: 1, authenticated_signed_writes: 1, extended_properties: 1, } struct GattCharacteristicDeclarationValue : AttAttributeData { properties: GattCharacteristicProperties, handle: AttHandle, uuid: Uuid, } struct GattServiceDeclarationValue : AttAttributeData { uuid: Uuid, } struct GattClientCharacteristicConfiguration : AttAttributeData { notification: 1, indication: 1, _reserved_: 14, } struct GattServiceChanged : AttAttributeData { start_handle: AttHandle, end_handle: AttHandle, } struct UuidAsAttData : AttAttributeData { uuid: Uuid, } struct AttAttributeData { _payload_ } packet AttFindByTypeValueRequest : Att(opcode = FIND_BY_TYPE_VALUE_REQUEST) { starting_handle : AttHandle, ending_handle : AttHandle, attribute_type : Uuid16, attribute_value : AttAttributeData, } struct AttributeHandleRange { found_attribute_handle : AttHandle, group_end_handle : AttHandle, } packet AttFindByTypeValueResponse : Att(opcode = FIND_BY_TYPE_VALUE_RESPONSE) { handles_info : AttributeHandleRange[], } packet AttReadByGroupTypeRequest : Att(opcode = READ_BY_GROUP_TYPE_REQUEST) { starting_handle : AttHandle, ending_handle : AttHandle, attribute_group_type : Uuid, } struct AttReadByGroupTypeDataElement { handle : AttHandle, end_group_handle : AttHandle, value : AttAttributeData, } packet AttReadByGroupTypeResponse : Att(opcode = READ_BY_GROUP_TYPE_RESPONSE) { _elementsize_(data) : 8, data: AttReadByGroupTypeDataElement[], } packet AttReadByTypeRequest : Att(opcode = READ_BY_TYPE_REQUEST) { starting_handle : AttHandle, ending_handle : AttHandle, attribute_type : Uuid, } struct AttReadByTypeDataElement { handle : AttHandle, value : AttAttributeData, } packet AttReadByTypeResponse : Att(opcode = READ_BY_TYPE_RESPONSE) { _elementsize_(data) : 8, data: AttReadByTypeDataElement[], } packet AttReadRequest : Att(opcode = READ_REQUEST) { attribute_handle : AttHandle, } packet AttReadResponse : Att(opcode = READ_RESPONSE) { value: AttAttributeData, } packet AttWriteRequest : Att(opcode = WRITE_REQUEST) { handle : AttHandle, value : AttAttributeData, } packet AttWriteResponse : Att(opcode = WRITE_RESPONSE) {} packet AttErrorResponse : Att(opcode = ERROR_RESPONSE) { opcode_in_error: AttOpcode, handle_in_error: AttHandle, error_code: AttErrorCode, } packet AttHandleValueIndication : Att(opcode = HANDLE_VALUE_INDICATION) { handle: AttHandle, value: AttAttributeData, } packet AttHandleValueConfirmation : Att(opcode = HANDLE_VALUE_CONFIRMATION) {} packet AttExchangeMtuRequest : Att(opcode = EXCHANGE_MTU_REQUEST) { mtu: 16, } packet AttExchangeMtuResponse : Att(opcode = EXCHANGE_MTU_RESPONSE) { mtu: 16, } packet AttWriteCommand : Att(opcode = WRITE_COMMAND) { handle : AttHandle, value : AttAttributeData, }