722 lines
18 KiB
Plaintext
722 lines
18 KiB
Plaintext
little_endian_packets
|
|
|
|
checksum Fcs : 16 "l2cap/"
|
|
|
|
packet BasicFrame {
|
|
_size_(_payload_) : 16,
|
|
channel_id : 16,
|
|
_payload_,
|
|
}
|
|
|
|
packet BasicFrameWithFcs {
|
|
_checksum_start_(fcs),
|
|
_size_(_payload_) : 16,
|
|
channel_id : 16,
|
|
_payload_ : [+2*8], // Include Fcs in the _size_
|
|
fcs : Fcs,
|
|
}
|
|
|
|
enum Continuation : 1 {
|
|
END = 0,
|
|
CONTINUE = 1,
|
|
}
|
|
|
|
// ChannelId 2 is connectionless
|
|
packet GroupFrame : BasicFrame (channel_id = 0x02) {
|
|
psm : 16,
|
|
_payload_,
|
|
}
|
|
|
|
enum FrameType : 1 {
|
|
I_FRAME = 0,
|
|
S_FRAME = 1,
|
|
}
|
|
|
|
enum SupervisoryFunction : 2 {
|
|
RECEIVER_READY = 0,
|
|
REJECT = 1,
|
|
RECEIVER_NOT_READY = 2,
|
|
SELECT_REJECT = 3,
|
|
}
|
|
|
|
enum RetransmissionDisable : 1 {
|
|
NORMAL = 0,
|
|
DISABLE = 1,
|
|
}
|
|
|
|
enum SegmentationAndReassembly : 2 {
|
|
UNSEGMENTED = 0,
|
|
START = 1,
|
|
END = 2,
|
|
CONTINUATION = 3,
|
|
}
|
|
|
|
packet StandardFrame : BasicFrame {
|
|
frame_type : FrameType,
|
|
_body_,
|
|
}
|
|
|
|
packet StandardFrameWithFcs : BasicFrameWithFcs {
|
|
frame_type : FrameType,
|
|
_body_,
|
|
}
|
|
|
|
group StandardSupervisoryControl {
|
|
_fixed_ = 0 : 1,
|
|
s : SupervisoryFunction,
|
|
_reserved_ : 3,
|
|
r : RetransmissionDisable,
|
|
req_seq : 6,
|
|
_reserved_ : 2,
|
|
}
|
|
|
|
group StandardInformationControl {
|
|
tx_seq : 6,
|
|
r : RetransmissionDisable,
|
|
req_seq : 6,
|
|
sar : SegmentationAndReassembly,
|
|
}
|
|
|
|
packet StandardSupervisoryFrame : StandardFrame (frame_type = S_FRAME) {
|
|
StandardSupervisoryControl,
|
|
}
|
|
|
|
packet StandardSupervisoryFrameWithFcs : StandardFrameWithFcs (frame_type = S_FRAME) {
|
|
StandardSupervisoryControl,
|
|
}
|
|
|
|
packet StandardInformationFrame : StandardFrame (frame_type = I_FRAME) {
|
|
StandardInformationControl,
|
|
_payload_,
|
|
}
|
|
|
|
packet StandardInformationFrameWithFcs : StandardFrameWithFcs (frame_type = I_FRAME) {
|
|
StandardInformationControl,
|
|
_payload_,
|
|
}
|
|
|
|
packet StandardInformationStartFrame : StandardInformationFrame (sar = START) {
|
|
l2cap_sdu_length : 16,
|
|
_payload_,
|
|
}
|
|
|
|
packet StandardInformationStartFrameWithFcs : StandardInformationFrameWithFcs (sar = START) {
|
|
l2cap_sdu_length : 16,
|
|
_payload_,
|
|
}
|
|
|
|
enum Poll : 1 {
|
|
NOT_SET = 0,
|
|
POLL = 1,
|
|
}
|
|
|
|
enum Final : 1 {
|
|
NOT_SET = 0,
|
|
POLL_RESPONSE = 1,
|
|
}
|
|
|
|
group EnhancedSupervisoryControl {
|
|
_fixed_ = 0 : 1,
|
|
s : SupervisoryFunction,
|
|
p : Poll,
|
|
_reserved_ : 2,
|
|
f : Final,
|
|
req_seq : 6,
|
|
_reserved_ : 2,
|
|
}
|
|
|
|
group EnhancedInformationControl {
|
|
tx_seq : 6,
|
|
f : Final,
|
|
req_seq : 6,
|
|
sar : SegmentationAndReassembly,
|
|
}
|
|
|
|
packet EnhancedSupervisoryFrame : StandardFrame (frame_type = S_FRAME) {
|
|
EnhancedSupervisoryControl,
|
|
}
|
|
|
|
packet EnhancedSupervisoryFrameWithFcs : StandardFrameWithFcs (frame_type = S_FRAME) {
|
|
EnhancedSupervisoryControl,
|
|
}
|
|
|
|
packet EnhancedInformationFrame : StandardFrame (frame_type = I_FRAME) {
|
|
EnhancedInformationControl,
|
|
_payload_,
|
|
}
|
|
|
|
packet EnhancedInformationFrameWithFcs : StandardFrameWithFcs (frame_type = I_FRAME) {
|
|
EnhancedInformationControl,
|
|
_payload_,
|
|
}
|
|
|
|
packet EnhancedInformationStartFrame : EnhancedInformationFrame (sar = START) {
|
|
l2cap_sdu_length : 16,
|
|
_payload_,
|
|
}
|
|
|
|
packet EnhancedInformationStartFrameWithFcs : EnhancedInformationFrameWithFcs (sar = START) {
|
|
l2cap_sdu_length : 16,
|
|
_payload_,
|
|
}
|
|
|
|
group ExtendedSupervisoryControl {
|
|
f : Final,
|
|
req_seq : 14,
|
|
s : SupervisoryFunction,
|
|
p : Poll,
|
|
_reserved_ : 5,
|
|
_reserved_ : 8,
|
|
}
|
|
|
|
group ExtendedInformationControl {
|
|
f : Final,
|
|
req_seq : 14,
|
|
sar : SegmentationAndReassembly,
|
|
tx_seq : 14,
|
|
}
|
|
|
|
packet ExtendedSupervisoryFrame : StandardFrame (frame_type = S_FRAME) {
|
|
ExtendedSupervisoryControl,
|
|
}
|
|
|
|
packet ExtendedSupervisoryFrameWithFcs : StandardFrameWithFcs (frame_type = S_FRAME) {
|
|
ExtendedSupervisoryControl,
|
|
}
|
|
|
|
packet ExtendedInformationFrame : StandardFrame (frame_type = I_FRAME) {
|
|
ExtendedInformationControl,
|
|
_payload_,
|
|
}
|
|
|
|
packet ExtendedInformationFrameWithFcs : StandardFrameWithFcs (frame_type = I_FRAME) {
|
|
ExtendedInformationControl,
|
|
_payload_,
|
|
}
|
|
|
|
packet ExtendedInformationStartFrame : ExtendedInformationFrame (sar = START) {
|
|
l2cap_sdu_length : 16,
|
|
_payload_,
|
|
}
|
|
|
|
packet ExtendedInformationStartFrameWithFcs : ExtendedInformationFrameWithFcs (sar = START) {
|
|
l2cap_sdu_length : 16,
|
|
_payload_,
|
|
}
|
|
|
|
packet FirstLeInformationFrame : BasicFrame {
|
|
l2cap_sdu_length : 16,
|
|
_payload_,
|
|
}
|
|
|
|
enum CommandCode : 8 {
|
|
COMMAND_REJECT = 0x01,
|
|
CONNECTION_REQUEST = 0x02,
|
|
CONNECTION_RESPONSE = 0x03,
|
|
CONFIGURATION_REQUEST = 0x04,
|
|
CONFIGURATION_RESPONSE = 0x05,
|
|
DISCONNECTION_REQUEST = 0x06,
|
|
DISCONNECTION_RESPONSE = 0x07,
|
|
ECHO_REQUEST = 0x08,
|
|
ECHO_RESPONSE = 0x09,
|
|
INFORMATION_REQUEST = 0x0A,
|
|
INFORMATION_RESPONSE = 0x0B,
|
|
CREATE_CHANNEL_REQUEST = 0x0C,
|
|
CREATE_CHANNEL_RESPONSE = 0x0D,
|
|
MOVE_CHANNEL_REQUEST = 0x0E,
|
|
MOVE_CHANNEL_RESPONSE = 0x0F,
|
|
MOVE_CHANNEL_CONFIRMATION_REQUEST = 0x10,
|
|
MOVE_CHANNEL_CONFIRMATION_RESPONSE = 0x11,
|
|
FLOW_CONTROL_CREDIT = 0x16, // Core 5.2 COC
|
|
CREDIT_BASED_CONNECTION_REQUEST = 0x17,
|
|
CREDIT_BASED_CONNECTION_RESPONSE = 0x18,
|
|
CREDIT_BASED_RECONFIGURE_REQUEST = 0x19,
|
|
CREDIT_BASED_RECONFIGURE_RESPONSE = 0x1A,
|
|
}
|
|
|
|
packet ControlFrame : BasicFrame (channel_id = 0x0001) {
|
|
_payload_,
|
|
}
|
|
|
|
packet Control {
|
|
code : CommandCode,
|
|
identifier : 8,
|
|
_size_(_payload_) : 16,
|
|
_payload_,
|
|
}
|
|
|
|
enum CommandRejectReason : 16 {
|
|
COMMAND_NOT_UNDERSTOOD = 0x0000,
|
|
SIGNALING_MTU_EXCEEDED = 0x0001,
|
|
INVALID_CID_IN_REQUEST = 0x0002,
|
|
}
|
|
|
|
packet CommandReject : Control (code = COMMAND_REJECT) {
|
|
reason : CommandRejectReason,
|
|
_body_,
|
|
}
|
|
|
|
packet CommandRejectNotUnderstood : CommandReject (reason = COMMAND_NOT_UNDERSTOOD) {
|
|
}
|
|
|
|
packet CommandRejectMtuExceeded : CommandReject (reason = SIGNALING_MTU_EXCEEDED) {
|
|
actual_mtu : 16,
|
|
}
|
|
|
|
packet CommandRejectInvalidCid : CommandReject (reason = INVALID_CID_IN_REQUEST) {
|
|
local_channel : 16, // Relative to the sender of the CommandReject
|
|
remote_channel : 16,
|
|
}
|
|
|
|
packet ConnectionRequest : Control (code = CONNECTION_REQUEST) {
|
|
psm : 16,
|
|
source_cid : 16,
|
|
}
|
|
|
|
enum ConnectionResponseResult : 16 {
|
|
SUCCESS = 0x0000,
|
|
PENDING = 0x0001,
|
|
PSM_NOT_SUPPORTED = 0x0002,
|
|
SECURITY_BLOCK = 0x0003,
|
|
NO_RESOURCES_AVAILABLE = 0x0004,
|
|
INVALID_CID = 0x0006,
|
|
SOURCE_CID_ALREADY_ALLOCATED = 0x0007,
|
|
}
|
|
|
|
enum ConnectionResponseStatus : 16 {
|
|
NO_FURTHER_INFORMATION_AVAILABLE = 0x0000,
|
|
AUTHENTICATION_PENDING = 0x0001,
|
|
AUTHORIZATION_PENDING = 0x0002,
|
|
}
|
|
|
|
packet ConnectionResponse : Control (code = CONNECTION_RESPONSE) {
|
|
destination_cid : 16,
|
|
source_cid : 16,
|
|
result : ConnectionResponseResult,
|
|
status : ConnectionResponseStatus,
|
|
}
|
|
|
|
enum ConfigurationOptionType : 7 {
|
|
MTU = 0x01,
|
|
FLUSH_TIMEOUT = 0x02,
|
|
QUALITY_OF_SERVICE = 0x03,
|
|
RETRANSMISSION_AND_FLOW_CONTROL = 0x04,
|
|
FRAME_CHECK_SEQUENCE = 0x05,
|
|
EXTENDED_FLOW_SPECIFICATION = 0x06,
|
|
EXTENDED_WINDOW_SIZE = 0x07,
|
|
}
|
|
|
|
enum ConfigurationOptionIsHint : 1 {
|
|
OPTION_MUST_BE_RECOGNIZED = 0,
|
|
OPTION_IS_A_HINT = 1,
|
|
}
|
|
|
|
struct ConfigurationOption {
|
|
type : ConfigurationOptionType,
|
|
is_hint : ConfigurationOptionIsHint,
|
|
_size_(_body_) : 8,
|
|
_body_,
|
|
}
|
|
|
|
struct MtuConfigurationOption : ConfigurationOption (type = MTU) {
|
|
mtu : 16,
|
|
}
|
|
|
|
struct FlushTimeoutConfigurationOption : ConfigurationOption (type = FLUSH_TIMEOUT) {
|
|
flush_timeout : 16,
|
|
}
|
|
|
|
enum QosServiceType : 8 {
|
|
NO_TRAFFIC = 0x00,
|
|
BEST_EFFORT = 0x01, // Default
|
|
GUARANTEED = 0x02,
|
|
}
|
|
|
|
struct QualityOfServiceConfigurationOption : ConfigurationOption (type = QUALITY_OF_SERVICE) {
|
|
_reserved_ : 8, // Flags
|
|
service_type : QosServiceType,
|
|
token_rate : 32, // 0 = ignore, 0xffffffff = max available
|
|
token_bucket_size : 32, // 0 = ignore, 0xffffffff = max available
|
|
peak_bandwidth : 32, // Octets/second 0 = ignore
|
|
latency : 32, // microseconds 0xffffffff = ignore
|
|
delay_variation : 32, // microseconds 0xffffffff = ignore
|
|
}
|
|
|
|
enum RetransmissionAndFlowControlModeOption : 8 {
|
|
L2CAP_BASIC = 0x00,
|
|
RETRANSMISSION = 0x01,
|
|
FLOW_CONTROL = 0x02,
|
|
ENHANCED_RETRANSMISSION = 0x03,
|
|
STREAMING = 0x04,
|
|
}
|
|
|
|
|
|
struct RetransmissionAndFlowControlConfigurationOption : ConfigurationOption (type = RETRANSMISSION_AND_FLOW_CONTROL) {
|
|
mode : RetransmissionAndFlowControlModeOption,
|
|
tx_window_size : 8, // 1-32 for Flow Control and Retransmission, 1-63 for Enhanced
|
|
max_transmit : 8,
|
|
retransmission_time_out : 16,
|
|
monitor_time_out : 16,
|
|
maximum_pdu_size : 16,
|
|
}
|
|
|
|
enum FcsType : 8 {
|
|
NO_FCS = 0,
|
|
DEFAULT = 1, // 16-bit FCS
|
|
}
|
|
|
|
struct FrameCheckSequenceOption : ConfigurationOption (type = FRAME_CHECK_SEQUENCE) {
|
|
fcs_type : FcsType,
|
|
}
|
|
|
|
|
|
struct ExtendedFlowSpecificationOption : ConfigurationOption (type = EXTENDED_FLOW_SPECIFICATION) {
|
|
identifier : 8, // Default 0x01, must be 0x01 for Extended Flow-Best-Effort
|
|
service_type : QosServiceType,
|
|
maximum_sdu_size : 16, // Octets
|
|
sdu_interarrival_time : 32, // in microseconds
|
|
access_latency : 32, // in microseconds, without HCI and stack overheads
|
|
flush_timeout : 32, // in microseconds 0x0 = no retransmissions 0xFFFFFFFF = never flushed
|
|
}
|
|
|
|
struct ExtendedWindowSizeOption : ConfigurationOption (type = EXTENDED_WINDOW_SIZE) {
|
|
max_window_size : 16, // 0x0000 = Valid for streaming, 0x0001-0x3FFF Valid for Enhanced Retransmission
|
|
}
|
|
|
|
packet ConfigurationRequest : Control (code = CONFIGURATION_REQUEST) {
|
|
destination_cid : 16,
|
|
continuation : Continuation,
|
|
_reserved_ : 15,
|
|
config : ConfigurationOption[],
|
|
}
|
|
|
|
enum ConfigurationResponseResult : 16 {
|
|
SUCCESS = 0x0000,
|
|
UNACCEPTABLE_PARAMETERS = 0x0001,
|
|
REJECTED = 0x0002,
|
|
UNKNOWN_OPTIONS = 0x0003,
|
|
PENDING = 0x0004,
|
|
FLOW_SPEC_REJECTED = 0x0005,
|
|
}
|
|
|
|
packet ConfigurationResponse : Control (code = CONFIGURATION_RESPONSE) {
|
|
source_cid : 16,
|
|
continuation : Continuation,
|
|
_reserved_ : 15,
|
|
result : ConfigurationResponseResult,
|
|
config : ConfigurationOption[],
|
|
}
|
|
|
|
packet DisconnectionRequest : Control (code = DISCONNECTION_REQUEST) {
|
|
destination_cid : 16,
|
|
source_cid : 16,
|
|
}
|
|
|
|
packet DisconnectionResponse : Control (code = DISCONNECTION_RESPONSE) {
|
|
destination_cid : 16,
|
|
source_cid : 16,
|
|
}
|
|
|
|
packet EchoRequest : Control (code = ECHO_REQUEST) {
|
|
_payload_, // Optional and implementation specific
|
|
}
|
|
|
|
packet EchoResponse : Control (code = ECHO_RESPONSE) {
|
|
_payload_, // Optional and implementation specific
|
|
}
|
|
|
|
enum InformationRequestInfoType : 16 {
|
|
CONNECTIONLESS_MTU = 0x0001,
|
|
EXTENDED_FEATURES_SUPPORTED = 0x0002,
|
|
FIXED_CHANNELS_SUPPORTED = 0x0003,
|
|
}
|
|
|
|
packet InformationRequest : Control (code = INFORMATION_REQUEST) {
|
|
info_type : InformationRequestInfoType,
|
|
}
|
|
|
|
enum InformationRequestResult : 16 {
|
|
SUCCESS = 0x0000,
|
|
NOT_SUPPORTED = 0x0001,
|
|
}
|
|
|
|
packet InformationResponse : Control (code = INFORMATION_RESPONSE) {
|
|
info_type : InformationRequestInfoType,
|
|
result : InformationRequestResult,
|
|
_body_,
|
|
}
|
|
|
|
packet InformationResponseConnectionlessMtu : InformationResponse (info_type = CONNECTIONLESS_MTU) {
|
|
connectionless_mtu : 16,
|
|
}
|
|
|
|
packet InformationResponseExtendedFeatures : InformationResponse (info_type = EXTENDED_FEATURES_SUPPORTED) {
|
|
// ExtendedFeatureMask : 32,
|
|
flow_control_mode : 1,
|
|
retransmission_mode : 1,
|
|
bi_directional_qoS : 1,
|
|
enhanced_retransmission_mode : 1,
|
|
streaming_mode : 1,
|
|
fcs_option : 1,
|
|
extended_flow_specification_for_br_edr : 1,
|
|
fixed_channels : 1,
|
|
extended_window_size : 1,
|
|
unicast_connectionless_data_reception : 1,
|
|
enhanced_credit_based_flow_control_mode : 1,
|
|
_reserved_ : 21,
|
|
}
|
|
|
|
packet InformationResponseFixedChannels : InformationResponse (info_type = FIXED_CHANNELS_SUPPORTED) {
|
|
fixed_channels : 64, // bit 0 must be 0, bit 1 must be 1, all others 1 = supported
|
|
}
|
|
|
|
packet CreateChannelRequest : Control (code = CREATE_CHANNEL_REQUEST) {
|
|
psm : 16,
|
|
source_cid : 16,
|
|
controller_id : 8,
|
|
}
|
|
|
|
enum CreateChannelResponseResult : 16 {
|
|
SUCCESS = 0x0000,
|
|
PENDING = 0x0001,
|
|
PSM_NOT_SUPPORTED = 0x0002,
|
|
SECURITY_BLOCK = 0x0003,
|
|
NO_RESOURCES_AVAILABLE = 0x0004,
|
|
CONTROLLER_ID_NOT_SUPPORTED = 0x0005,
|
|
INVALID_CID = 0x0006,
|
|
SOURCE_CID_ALREADY_ALLOCATED = 0x0007,
|
|
}
|
|
|
|
enum CreateChannelResponseStatus : 16 {
|
|
NO_FURTHER_INFORMATION_AVAILABLE = 0x0000,
|
|
AUTHENTICATION_PENDING = 0x0001,
|
|
AUTHORIZATION_PENDING = 0x0002,
|
|
}
|
|
|
|
packet CreateChannelResponse : Control (code = CREATE_CHANNEL_RESPONSE) {
|
|
destination_cid : 16,
|
|
source_cid : 16,
|
|
result : CreateChannelResponseResult,
|
|
status : CreateChannelResponseStatus,
|
|
}
|
|
|
|
// AMP Only ?
|
|
packet MoveChannelRequest : Control (code = MOVE_CHANNEL_REQUEST) {
|
|
initiator_cid : 16,
|
|
dest_controller_id : 8,
|
|
}
|
|
|
|
enum MoveChannelResponseResult : 16 {
|
|
SUCCESS = 0x0000,
|
|
PENDING = 0x0001,
|
|
CONTROLLER_ID_NOT_SUPPORTED = 0x0002,
|
|
NEW_CONTROLLER_ID_IS_SAME = 0x0003,
|
|
CONFIGURATION_NOT_SUPPORTED = 0x0004,
|
|
CHANNEL_COLLISION = 0x0005,
|
|
CHANNEL_NOT_ALLOWED_TO_BE_MOVED = 0x0006,
|
|
}
|
|
|
|
packet MoveChannelResponse : Control (code = MOVE_CHANNEL_RESPONSE) {
|
|
initiator_cid : 16,
|
|
result : MoveChannelResponseResult,
|
|
}
|
|
|
|
enum MoveChannelConfirmationResult : 16 {
|
|
SUCCESS = 0x0000,
|
|
FAILURE = 0x0001,
|
|
}
|
|
|
|
packet MoveChannelConfirmationRequest : Control (code = MOVE_CHANNEL_CONFIRMATION_REQUEST) {
|
|
initiator_cid : 16,
|
|
result : MoveChannelConfirmationResult,
|
|
}
|
|
|
|
packet MoveChannelConfirmationResponse : Control (code = MOVE_CHANNEL_CONFIRMATION_RESPONSE) {
|
|
initiator_cid : 16,
|
|
}
|
|
|
|
// Core 5.2 COC
|
|
|
|
packet FlowControlCredit : Control (code = FLOW_CONTROL_CREDIT) {
|
|
cid : 16, // Receiver's destination CID
|
|
credits : 16,
|
|
}
|
|
|
|
packet CreditBasedConnectionRequest : Control (code = CREDIT_BASED_CONNECTION_REQUEST) {
|
|
spsm : 16,
|
|
mtu : 16,
|
|
mps : 16,
|
|
initial_credits : 16,
|
|
source_cid : 16[],
|
|
}
|
|
|
|
enum CreditBasedConnectionResponseResult : 16 {
|
|
SUCCESS = 0x0000,
|
|
SPSM_NOT_SUPPORTED = 0x0002,
|
|
SOME_REFUSED_NO_RESOURCES_AVAILABLE = 0x0004,
|
|
ALL_REFUSED_INSUFFICIENT_AUTHENTICATION = 0x0005,
|
|
ALL_REFUSED_INSUFFICIENT_AUTHORIZATION = 0x0006,
|
|
ALL_REFUSED_INSUFFICIENT_ENCRYPTION_KEY_SIZE = 0x0007,
|
|
ALL_REFUSED_INSUFFICIENT_ENCRYPTION = 0x0008,
|
|
SOME_REFUSED_INVALID_SOURCE_CID = 0x0009,
|
|
SOME_REFUSED_SOURCE_CID_ALREADY_ALLOCATED = 0x000A,
|
|
ALL_REFUSED_UNACCEPTABLE_PARAMETERS = 0x000B,
|
|
ALL_REFUSED_INVALID_PARAMETERS = 0x000C,
|
|
}
|
|
|
|
packet CreditBasedConnectionResponse : Control (code = CREDIT_BASED_CONNECTION_RESPONSE) {
|
|
mtu : 16,
|
|
mps : 16,
|
|
initial_credits : 16,
|
|
result : CreditBasedConnectionResponseResult,
|
|
destination_cid : 16[],
|
|
}
|
|
|
|
packet CreditBasedReconfigureRequest : Control (code = CREDIT_BASED_RECONFIGURE_REQUEST) {
|
|
mtu : 16,
|
|
mps : 16,
|
|
destination_cid : 16[],
|
|
}
|
|
|
|
enum CreditBasedReconfigureResponseResult : 16 {
|
|
SUCCESS = 0x0000,
|
|
MTU_NOT_ALLOWED = 0x01,
|
|
MPS_NOT_ALLOWED = 0x02,
|
|
INVALID_DESTINATION_CID = 0x03,
|
|
UNACCEPTABLE_PARAMETERS = 0x04,
|
|
}
|
|
|
|
packet CreditBasedReconfigureResponse : Control (code = CREDIT_BASED_RECONFIGURE_RESPONSE) {
|
|
result: CreditBasedReconfigureResponseResult,
|
|
}
|
|
|
|
enum LeCommandCode : 8 {
|
|
COMMAND_REJECT = 0x01,
|
|
DISCONNECTION_REQUEST = 0x06,
|
|
DISCONNECTION_RESPONSE = 0x07,
|
|
CONNECTION_PARAMETER_UPDATE_REQUEST = 0x12,
|
|
CONNECTION_PARAMETER_UPDATE_RESPONSE = 0x13,
|
|
LE_CREDIT_BASED_CONNECTION_REQUEST = 0x14,
|
|
LE_CREDIT_BASED_CONNECTION_RESPONSE = 0x15,
|
|
LE_FLOW_CONTROL_CREDIT = 0x16,
|
|
CREDIT_BASED_CONNECTION_REQUEST = 0x17, // Core 5.2 COC
|
|
CREDIT_BASED_CONNECTION_RESPONSE = 0x18,
|
|
CREDIT_BASED_RECONFIGURE_REQUEST = 0x19,
|
|
CREDIT_BASED_RECONFIGURE_RESPONSE = 0x1A,
|
|
}
|
|
|
|
packet LeControlFrame : BasicFrame (channel_id = 0x0005) {
|
|
_payload_,
|
|
}
|
|
|
|
packet LeControl {
|
|
code : LeCommandCode,
|
|
identifier : 8, // Must be non-zero
|
|
_size_(_payload_) : 16,
|
|
_payload_,
|
|
}
|
|
|
|
|
|
packet LeCommandReject : LeControl (code = COMMAND_REJECT) {
|
|
reason : CommandRejectReason,
|
|
_payload_,
|
|
}
|
|
|
|
packet LeCommandRejectNotUnderstood : LeCommandReject (reason = COMMAND_NOT_UNDERSTOOD) {
|
|
}
|
|
|
|
packet LeCommandRejectMtuExceeded : LeCommandReject (reason = SIGNALING_MTU_EXCEEDED) {
|
|
actual_mtu : 16,
|
|
}
|
|
|
|
packet LeCommandRejectInvalidCid : LeCommandReject (reason = INVALID_CID_IN_REQUEST) {
|
|
local_channel : 16, // Relative to the sender of the CommandReject
|
|
remote_channel : 16,
|
|
}
|
|
|
|
packet LeDisconnectionRequest : LeControl (code = DISCONNECTION_REQUEST) {
|
|
destination_cid : 16,
|
|
source_cid : 16,
|
|
}
|
|
|
|
packet LeDisconnectionResponse : LeControl (code = DISCONNECTION_RESPONSE) {
|
|
destination_cid : 16,
|
|
source_cid : 16,
|
|
}
|
|
|
|
packet ConnectionParameterUpdateRequest : LeControl (code = CONNECTION_PARAMETER_UPDATE_REQUEST) {
|
|
interval_min : 16,
|
|
interval_max : 16,
|
|
peripheral_latency : 16,
|
|
timeout_multiplier : 16,
|
|
}
|
|
|
|
enum ConnectionParameterUpdateResponseResult : 16 {
|
|
ACCEPTED = 0,
|
|
REJECTED = 1,
|
|
}
|
|
|
|
packet ConnectionParameterUpdateResponse : LeControl (code = CONNECTION_PARAMETER_UPDATE_RESPONSE) {
|
|
result : ConnectionParameterUpdateResponseResult,
|
|
}
|
|
|
|
packet LeCreditBasedConnectionRequest : LeControl (code = LE_CREDIT_BASED_CONNECTION_REQUEST) {
|
|
le_psm : 16, // 0x0001-0x007F Fixed, 0x0080-0x00FF Dynamic
|
|
source_cid : 16,
|
|
mtu : 16,
|
|
mps : 16,
|
|
initial_credits : 16,
|
|
}
|
|
|
|
enum LeCreditBasedConnectionResponseResult : 16 {
|
|
SUCCESS = 0x0000,
|
|
LE_PSM_NOT_SUPPORTED = 0x0002,
|
|
NO_RESOURCES_AVAILABLE = 0x0004,
|
|
INSUFFICIENT_AUTHENTICATION = 0x0005,
|
|
INSUFFICIENT_AUTHORIZATION = 0x0006,
|
|
INSUFFICIENT_ENCRYPTION_KEY_SIZE = 0x0007,
|
|
INSUFFICIENT_ENCRYPTION = 0x0008,
|
|
INVALID_SOURCE_CID = 0x0009,
|
|
SOURCE_CID_ALREADY_ALLOCATED = 0x000A,
|
|
UNACCEPTABLE_PARAMETERS = 0x000B,
|
|
}
|
|
|
|
packet LeCreditBasedConnectionResponse : LeControl (code = LE_CREDIT_BASED_CONNECTION_RESPONSE) {
|
|
destination_cid : 16,
|
|
mtu : 16,
|
|
mps : 16,
|
|
initial_credits : 16,
|
|
result : LeCreditBasedConnectionResponseResult,
|
|
}
|
|
|
|
packet LeFlowControlCredit : LeControl (code = LE_FLOW_CONTROL_CREDIT) {
|
|
cid : 16, // Receiver's destination CID
|
|
credits : 16,
|
|
}
|
|
|
|
packet LeEnhancedCreditBasedConnectionRequest : LeControl (code = CREDIT_BASED_CONNECTION_REQUEST) {
|
|
spsm : 16,
|
|
mtu : 16,
|
|
mps : 16,
|
|
initial_credits : 16,
|
|
source_cid : 16[],
|
|
}
|
|
|
|
packet LeEnhancedCreditBasedConnectionResponse : LeControl (code = CREDIT_BASED_CONNECTION_RESPONSE) {
|
|
mtu : 16,
|
|
mps : 16,
|
|
initial_credits : 16,
|
|
result : CreditBasedConnectionResponseResult,
|
|
destination_cid : 16[],
|
|
}
|
|
|
|
packet LeEnhancedCreditBasedReconfigureRequest : LeControl (code = CREDIT_BASED_RECONFIGURE_REQUEST) {
|
|
mtu : 16,
|
|
mps : 16,
|
|
destination_cid : 16[],
|
|
}
|
|
|
|
packet LeEnhancedCreditBasedReconfigureResponse : LeControl (code = CREDIT_BASED_RECONFIGURE_RESPONSE) {
|
|
result: CreditBasedReconfigureResponseResult,
|
|
}
|