3 Copyright (C) Dean Camera, 2010.
5 dean [at] fourwalledcubicle [dot] com
6 www.fourwalledcubicle.com
10 Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
12 Permission to use, copy, modify, distribute, and sell this
13 software and its documentation for any purpose is hereby granted
14 without fee, provided that the above copyright notice appear in
15 all copies and that both that the copyright notice and this
16 permission notice and warranty disclaimer appear in supporting
17 documentation, and that the name of the author not be used in
18 advertising or publicity pertaining to distribution of the
19 software without specific, written prior permission.
21 The author disclaim all warranties with regard to this
22 software, including all implied warranties of merchantability
23 and fitness. In no event shall the author be liable for any
24 special, indirect or consequential damages or any damages
25 whatsoever resulting from loss of use, data or profits, whether
26 in an action of contract, negligence or other tortious action,
27 arising out of or in connection with the use or performance of
31 #define INCLUDE_FROM_BLUETOOTH_ACLPACKETS_C
32 #include "BluetoothACLPackets.h"
34 void Bluetooth_ACLTask(void)
36 Bluetooth_ProcessACLPackets();
38 for (uint8_t i
= 0; i
< BLUETOOTH_MAX_OPEN_CHANNELS
; i
++)
40 Bluetooth_Channel_t
* ChannelData
= &Bluetooth_Connection
.Channels
[i
];
42 bool MustSendConfigReq
= true;
44 switch (ChannelData
->State
)
46 case Channel_Config_WaitConfig
:
47 ChannelData
->State
= Channel_Config_WaitReqResp
;
49 case Channel_Config_WaitSendConfig
:
50 ChannelData
->State
= Channel_Config_WaitResp
;
53 MustSendConfigReq
= false;
57 if (MustSendConfigReq
)
61 BT_Signal_Header_t SignalCommandHeader
;
62 BT_Signal_ConfigurationReq_t ConfigurationRequest
;
66 BT_Config_Option_Header_t Header
;
71 PacketData
.SignalCommandHeader
.Code
= BT_SIGNAL_CONFIGURATION_REQUEST
;
72 PacketData
.SignalCommandHeader
.Identifier
= ++Bluetooth_Connection
.SignallingIdentifier
;
73 PacketData
.SignalCommandHeader
.Length
= sizeof(PacketData
.ConfigurationRequest
) +
74 sizeof(PacketData
.Option_LocalMTU
);
75 PacketData
.ConfigurationRequest
.DestinationChannel
= ChannelData
->RemoteNumber
;
76 PacketData
.ConfigurationRequest
.Flags
= 0;
77 PacketData
.Option_LocalMTU
.Header
.Type
= BT_CONFIG_OPTION_MTU
;
78 PacketData
.Option_LocalMTU
.Header
.Length
= sizeof(PacketData
.Option_LocalMTU
.Value
);
79 PacketData
.Option_LocalMTU
.Value
= ChannelData
->LocalMTU
;
81 Bluetooth_SendPacket(&PacketData
, sizeof(PacketData
), NULL
);
83 BT_ACL_DEBUG(1, ">> L2CAP Configuration Request", NULL
);
84 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", PacketData
.ConfigurationRequest
.DestinationChannel
);
89 static void Bluetooth_ProcessACLPackets(void)
91 BT_ACL_Header_t ACLPacketHeader
;
92 BT_DataPacket_Header_t DataHeader
;
94 Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE
);
97 if (!(Pipe_IsReadWriteAllowed()))
103 Pipe_Read_Stream_LE(&ACLPacketHeader
, sizeof(ACLPacketHeader
));
104 Pipe_Read_Stream_LE(&DataHeader
, sizeof(DataHeader
));
106 BT_ACL_DEBUG(2, "", NULL
);
107 BT_ACL_DEBUG(2, "Packet Received", NULL
);
108 BT_ACL_DEBUG(2, "-- Connection Handle: 0x%04X", (ACLPacketHeader
.ConnectionHandle
& 0x0FFF));
109 BT_ACL_DEBUG(2, "-- Data Length: 0x%04X", ACLPacketHeader
.DataLength
);
110 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DataHeader
.DestinationChannel
);
111 BT_ACL_DEBUG(2, "-- Payload Length: 0x%04X", DataHeader
.PayloadLength
);
113 if (DataHeader
.DestinationChannel
== BT_CHANNEL_SIGNALING
)
115 BT_Signal_Header_t SignalCommandHeader
;
116 Pipe_Read_Stream_LE(&SignalCommandHeader
, sizeof(SignalCommandHeader
));
118 switch (SignalCommandHeader
.Code
)
120 case BT_SIGNAL_CONNECTION_REQUEST
:
121 Bluetooth_Signal_ConnectionReq(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
123 case BT_SIGNAL_CONNECTION_RESPONSE
:
124 Bluetooth_Signal_ConnectionResp(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
126 case BT_SIGNAL_CONFIGURATION_REQUEST
:
127 Bluetooth_Signal_ConfigurationReq(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
129 case BT_SIGNAL_CONFIGURATION_RESPONSE
:
130 Bluetooth_Signal_ConfigurationResp(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
132 case BT_SIGNAL_DISCONNECTION_REQUEST
:
133 Bluetooth_Signal_DisconnectionReq(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
135 case BT_SIGNAL_DISCONNECTION_RESPONSE
:
136 Bluetooth_Signal_DisconnectionResp(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
138 case BT_SIGNAL_ECHO_REQUEST
:
139 Bluetooth_Signal_EchoReq(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
141 case BT_SIGNAL_INFORMATION_REQUEST
:
142 Bluetooth_Signal_InformationReq(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
145 BT_ACL_DEBUG(1, "<< Unknown Signaling Command 0x%02X", SignalCommandHeader
.Code
);
147 Pipe_Discard_Stream(ACLPacketHeader
.DataLength
);
155 Bluetooth_PacketReceived(&DataHeader
.PayloadLength
, Bluetooth_GetChannelData(DataHeader
.DestinationChannel
, false));
157 Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE
);
158 Pipe_Discard_Stream(DataHeader
.PayloadLength
);
164 uint8_t Bluetooth_SendPacket(void* Data
, uint16_t DataLen
, Bluetooth_Channel_t
* Channel
)
166 BT_ACL_Header_t ACLPacketHeader
;
167 BT_DataPacket_Header_t DataHeader
;
169 if (!(Bluetooth_Connection
.IsConnected
))
170 return BT_SENDPACKET_NotConnected
;
172 if ((Channel
!= NULL
) && (Channel
->State
!= Channel_Open
))
173 return BT_SENDPACKET_ChannelNotOpen
;
175 // TODO: Add packet fragmentation here after retrieving the device's signal channel MTU
177 ACLPacketHeader
.ConnectionHandle
= (Bluetooth_Connection
.ConnectionHandle
| BT_ACL_FIRST_AUTOFLUSH
);
178 ACLPacketHeader
.DataLength
= sizeof(DataHeader
) + DataLen
;
179 DataHeader
.PayloadLength
= DataLen
;
180 DataHeader
.DestinationChannel
= (Channel
== NULL
) ? BT_CHANNEL_SIGNALING
: Channel
->RemoteNumber
;
182 Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE
);
185 Pipe_Write_Stream_LE(&ACLPacketHeader
, sizeof(ACLPacketHeader
));
186 Pipe_Write_Stream_LE(&DataHeader
, sizeof(DataHeader
));
187 Pipe_Write_Stream_LE(Data
, DataLen
);
192 BT_ACL_DEBUG(2, "", NULL
);
193 BT_ACL_DEBUG(2, "Packet Sent", NULL
);
194 BT_ACL_DEBUG(2, "-- Connection Handle: 0x%04X", (ACLPacketHeader
.ConnectionHandle
& 0x0FFF));
195 BT_ACL_DEBUG(2, "-- Data Length: 0x%04X", ACLPacketHeader
.DataLength
);
196 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DataHeader
.DestinationChannel
);
197 BT_ACL_DEBUG(2, "-- Payload Length: 0x%04X", DataHeader
.PayloadLength
);
199 return BT_SENDPACKET_NoError
;
202 Bluetooth_Channel_t
* Bluetooth_OpenChannel(uint16_t PSM
)
204 Bluetooth_Channel_t
* ChannelData
= NULL
;
206 for (uint8_t i
= 0; i
< BLUETOOTH_MAX_OPEN_CHANNELS
; i
++)
208 if (Bluetooth_Connection
.Channels
[i
].State
== Channel_Closed
)
210 ChannelData
= &Bluetooth_Connection
.Channels
[i
];
211 ChannelData
->LocalNumber
= (BLUETOOTH_CHANNELNUMBER_BASEOFFSET
+ i
);
216 if (ChannelData
== NULL
)
219 ChannelData
->RemoteNumber
= 0;
220 ChannelData
->PSM
= PSM
;
221 ChannelData
->LocalMTU
= MAXIMUM_CHANNEL_MTU
;
222 ChannelData
->State
= Channel_Config_WaitConfig
;
226 BT_Signal_Header_t SignalCommandHeader
;
227 BT_Signal_ConnectionReq_t ConnectionRequest
;
230 PacketData
.SignalCommandHeader
.Code
= BT_SIGNAL_CONNECTION_REQUEST
;
231 PacketData
.SignalCommandHeader
.Identifier
= ++Bluetooth_Connection
.SignallingIdentifier
;
232 PacketData
.SignalCommandHeader
.Length
= sizeof(PacketData
.ConnectionRequest
);
233 PacketData
.ConnectionRequest
.PSM
= PSM
;
234 PacketData
.ConnectionRequest
.SourceChannel
= ChannelData
->LocalNumber
;
236 Bluetooth_SendPacket(&PacketData
, sizeof(PacketData
), NULL
);
238 BT_ACL_DEBUG(1, ">> L2CAP Connection Request", NULL
);
239 BT_ACL_DEBUG(2, "-- PSM 0x%04X", PacketData
.ConnectionRequest
.PSM
);
240 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", PacketData
.ConnectionRequest
.SourceChannel
);
245 void Bluetooth_CloseChannel(Bluetooth_Channel_t
* Channel
)
247 if ((Channel
== NULL
) || (Channel
->State
== Channel_Closed
))
250 Channel
->State
= Channel_WaitDisconnect
;
254 BT_Signal_Header_t SignalCommandHeader
;
255 BT_Signal_DisconnectionReq_t DisconnectionRequest
;
258 PacketData
.SignalCommandHeader
.Code
= BT_SIGNAL_DISCONNECTION_REQUEST
;
259 PacketData
.SignalCommandHeader
.Identifier
= ++Bluetooth_Connection
.SignallingIdentifier
;
260 PacketData
.SignalCommandHeader
.Length
= sizeof(PacketData
.DisconnectionRequest
);
261 PacketData
.DisconnectionRequest
.DestinationChannel
= Channel
->RemoteNumber
;
262 PacketData
.DisconnectionRequest
.SourceChannel
= Channel
->LocalNumber
;
264 Bluetooth_SendPacket(&PacketData
, sizeof(PacketData
), NULL
);
266 BT_ACL_DEBUG(1, ">> L2CAP Disconnection Request", NULL
);
267 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", PacketData
.DisconnectionRequest
.DestinationChannel
);
268 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", PacketData
.DisconnectionRequest
.SourceChannel
);
271 static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t
* ACLPacketHeader
,
272 BT_DataPacket_Header_t
* DataHeader
,
273 BT_Signal_Header_t
* SignalCommandHeader
)
275 BT_Signal_ConnectionReq_t ConnectionRequest
;
277 Pipe_Read_Stream_LE(&ConnectionRequest
, sizeof(ConnectionRequest
));
282 BT_ACL_DEBUG(1, "<< L2CAP Connection Request", NULL
);
283 BT_ACL_DEBUG(2, "-- PSM: 0x%04X", ConnectionRequest
.PSM
);
284 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionRequest
.SourceChannel
);
286 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(ConnectionRequest
.SourceChannel
, true);
288 if (ChannelData
== NULL
)
290 for (uint8_t i
= 0; i
< BLUETOOTH_MAX_OPEN_CHANNELS
; i
++)
292 if (Bluetooth_Connection
.Channels
[i
].State
== Channel_Closed
)
294 ChannelData
= &Bluetooth_Connection
.Channels
[i
];
295 ChannelData
->LocalNumber
= (BLUETOOTH_CHANNELNUMBER_BASEOFFSET
+ i
);
301 if (ChannelData
!= NULL
)
303 ChannelData
->RemoteNumber
= ConnectionRequest
.SourceChannel
;
304 ChannelData
->PSM
= ConnectionRequest
.PSM
;
305 ChannelData
->LocalMTU
= MAXIMUM_CHANNEL_MTU
;
306 ChannelData
->State
= Channel_Config_WaitConfig
;
311 BT_Signal_Header_t SignalCommandHeader
;
312 BT_Signal_ConnectionResp_t ConnectionResponse
;
315 ResponsePacket
.SignalCommandHeader
.Code
= BT_SIGNAL_CONNECTION_RESPONSE
;
316 ResponsePacket
.SignalCommandHeader
.Identifier
= SignalCommandHeader
->Identifier
;
317 ResponsePacket
.SignalCommandHeader
.Length
= sizeof(ResponsePacket
.ConnectionResponse
);
318 ResponsePacket
.ConnectionResponse
.Result
= (ChannelData
== NULL
) ? BT_CONNECTION_REFUSED_RESOURCES
: BT_CONNECTION_SUCCESSFUL
;
319 ResponsePacket
.ConnectionResponse
.DestinationChannel
= ChannelData
->RemoteNumber
;
320 ResponsePacket
.ConnectionResponse
.SourceChannel
= ChannelData
->LocalNumber
;
321 ResponsePacket
.ConnectionResponse
.Status
= 0x00;
323 Bluetooth_SendPacket(&ResponsePacket
, sizeof(ResponsePacket
), NULL
);
325 BT_ACL_DEBUG(1, ">> L2CAP Connection Response", NULL
);
326 BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket
.ConnectionResponse
.Result
);
327 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket
.ConnectionResponse
.DestinationChannel
);
328 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket
.ConnectionResponse
.SourceChannel
);
331 static inline void Bluetooth_Signal_ConnectionResp(BT_ACL_Header_t
* ACLPacketHeader
,
332 BT_DataPacket_Header_t
* DataHeader
,
333 BT_Signal_Header_t
* SignalCommandHeader
)
335 BT_Signal_ConnectionResp_t ConnectionResponse
;
337 Pipe_Read_Stream_LE(&ConnectionResponse
, sizeof(ConnectionResponse
));
342 BT_ACL_DEBUG(1, "<< L2CAP Connection Response", NULL
);
343 BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConnectionResponse
.Result
);
344 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionResponse
.SourceChannel
);
345 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConnectionResponse
.DestinationChannel
);
347 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(ConnectionResponse
.DestinationChannel
, false);
349 if (ChannelData
!= NULL
)
351 ChannelData
->RemoteNumber
= ConnectionResponse
.SourceChannel
;
352 ChannelData
->State
= (ConnectionResponse
.Result
== BT_CONNECTION_SUCCESSFUL
) ?
353 Channel_Config_WaitConfig
: Channel_Closed
;
358 static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t
* ACLPacketHeader
,
359 BT_DataPacket_Header_t
* DataHeader
,
360 BT_Signal_Header_t
* SignalCommandHeader
)
362 BT_Signal_ConfigurationReq_t ConfigurationRequest
;
365 Pipe_Read_Stream_LE(&ConfigurationRequest
, sizeof(ConfigurationRequest
));
366 OptionsLen
= (DataHeader
->PayloadLength
- sizeof(*SignalCommandHeader
));
368 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(ConfigurationRequest
.DestinationChannel
, false);
372 BT_Config_Option_Header_t OptionHeader
;
374 Pipe_Read_Stream_LE(&OptionHeader
, sizeof(OptionHeader
));
376 if ((OptionHeader
.Type
== BT_CONFIG_OPTION_MTU
) && (ChannelData
!= NULL
))
377 Pipe_Read_Stream_LE(&ChannelData
->RemoteMTU
, sizeof(ChannelData
->RemoteMTU
));
379 Pipe_Discard_Stream(OptionHeader
.Length
);
381 OptionsLen
-= (sizeof(OptionHeader
) + OptionHeader
.Length
);
387 BT_ACL_DEBUG(1, "<< L2CAP Configuration Request", NULL
);
388 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConfigurationRequest
.DestinationChannel
);
389 BT_ACL_DEBUG(2, "-- Options Len: 0x%04X", (DataHeader
->PayloadLength
- sizeof(*SignalCommandHeader
)));
390 BT_ACL_DEBUG(2, "-- Remote MTU: 0x%04X", ChannelData
->RemoteMTU
);
394 BT_Signal_Header_t SignalCommandHeader
;
395 BT_Signal_ConfigurationResp_t ConfigurationResponse
;
398 ResponsePacket
.SignalCommandHeader
.Code
= BT_SIGNAL_CONFIGURATION_RESPONSE
;
399 ResponsePacket
.SignalCommandHeader
.Identifier
= SignalCommandHeader
->Identifier
;
400 ResponsePacket
.SignalCommandHeader
.Length
= sizeof(ResponsePacket
.ConfigurationResponse
);
401 ResponsePacket
.ConfigurationResponse
.SourceChannel
= ChannelData
->RemoteNumber
;
402 ResponsePacket
.ConfigurationResponse
.Flags
= 0x00;
403 ResponsePacket
.ConfigurationResponse
.Result
= (ChannelData
!= NULL
) ? BT_CONFIGURATION_SUCCESSFUL
: BT_CONFIGURATION_REJECTED
;
405 Bluetooth_SendPacket(&ResponsePacket
, sizeof(ResponsePacket
), NULL
);
407 if (ChannelData
!= NULL
)
409 switch (ChannelData
->State
)
411 case Channel_Config_WaitConfig
:
412 ChannelData
->State
= Channel_Config_WaitSendConfig
;
414 case Channel_Config_WaitReqResp
:
415 ChannelData
->State
= Channel_Config_WaitResp
;
417 case Channel_Config_WaitReq
:
418 ChannelData
->State
= Channel_Open
;
423 BT_ACL_DEBUG(1, ">> L2CAP Configuration Response", NULL
);
424 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket
.ConfigurationResponse
.SourceChannel
);
425 BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket
.ConfigurationResponse
.Result
);
428 static inline void Bluetooth_Signal_ConfigurationResp(BT_ACL_Header_t
* ACLPacketHeader
,
429 BT_DataPacket_Header_t
* DataHeader
,
430 BT_Signal_Header_t
* SignalCommandHeader
)
432 BT_Signal_ConfigurationResp_t ConfigurationResponse
;
434 Pipe_Read_Stream_LE(&ConfigurationResponse
, sizeof(ConfigurationResponse
));
439 BT_ACL_DEBUG(1, "<< L2CAP Configuration Response", NULL
);
440 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConfigurationResponse
.SourceChannel
);
441 BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConfigurationResponse
.Result
);
443 if (ConfigurationResponse
.Result
== BT_CONFIGURATION_SUCCESSFUL
)
445 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(ConfigurationResponse
.SourceChannel
, true);
447 if (ChannelData
!= NULL
)
449 switch (ChannelData
->State
)
451 case Channel_Config_WaitReqResp
:
452 ChannelData
->State
= Channel_Config_WaitReq
;
454 case Channel_Config_WaitResp
:
455 ChannelData
->State
= Channel_Open
;
462 static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t
* ACLPacketHeader
,
463 BT_DataPacket_Header_t
* DataHeader
,
464 BT_Signal_Header_t
* SignalCommandHeader
)
466 BT_Signal_DisconnectionReq_t DisconnectionRequest
;
468 Pipe_Read_Stream_LE(&DisconnectionRequest
, sizeof(DisconnectionRequest
));
470 BT_ACL_DEBUG(1, "<< L2CAP Disconnection Request", NULL
);
471 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DisconnectionRequest
.DestinationChannel
);
472 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", DisconnectionRequest
.SourceChannel
);
477 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(DisconnectionRequest
.SourceChannel
, true);
481 BT_Signal_Header_t SignalCommandHeader
;
482 BT_Signal_DisconnectionResp_t DisconnectionResponse
;
485 ResponsePacket
.SignalCommandHeader
.Code
= BT_SIGNAL_DISCONNECTION_RESPONSE
;
486 ResponsePacket
.SignalCommandHeader
.Identifier
= SignalCommandHeader
->Identifier
;
487 ResponsePacket
.SignalCommandHeader
.Length
= sizeof(ResponsePacket
.DisconnectionResponse
);
488 ResponsePacket
.DisconnectionResponse
.DestinationChannel
= ChannelData
->RemoteNumber
;
489 ResponsePacket
.DisconnectionResponse
.SourceChannel
= ChannelData
->LocalNumber
;
491 Bluetooth_SendPacket(&ResponsePacket
, sizeof(ResponsePacket
), NULL
);
493 if (ChannelData
!= NULL
)
494 ChannelData
->State
= Channel_Closed
;
496 BT_ACL_DEBUG(1, ">> L2CAP Disconnection Response", NULL
);
497 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket
.DisconnectionResponse
.SourceChannel
);
498 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket
.DisconnectionResponse
.DestinationChannel
);
501 static inline void Bluetooth_Signal_DisconnectionResp(BT_ACL_Header_t
* ACLPacketHeader
,
502 BT_DataPacket_Header_t
* DataHeader
,
503 BT_Signal_Header_t
* SignalCommandHeader
)
505 BT_Signal_DisconnectionResp_t DisconnectionResponse
;
507 Pipe_Read_Stream_LE(&DisconnectionResponse
, sizeof(DisconnectionResponse
));
509 BT_ACL_DEBUG(1, "<< L2CAP Disconnection Response", NULL
);
510 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DisconnectionResponse
.DestinationChannel
);
511 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", DisconnectionResponse
.SourceChannel
);
516 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(DisconnectionResponse
.SourceChannel
, true);
518 if (ChannelData
->State
== Channel_WaitDisconnect
)
519 ChannelData
->State
= Channel_Closed
;
522 static inline void Bluetooth_Signal_EchoReq(BT_ACL_Header_t
* ACLPacketHeader
,
523 BT_DataPacket_Header_t
* DataHeader
,
524 BT_Signal_Header_t
* SignalCommandHeader
)
526 BT_ACL_DEBUG(1, "<< L2CAP Echo Request", NULL
);
533 BT_Signal_Header_t SignalCommandHeader
;
536 ResponsePacket
.SignalCommandHeader
.Code
= BT_SIGNAL_ECHO_RESPONSE
;
537 ResponsePacket
.SignalCommandHeader
.Identifier
= SignalCommandHeader
->Identifier
;
538 ResponsePacket
.SignalCommandHeader
.Length
= 0;
540 Bluetooth_SendPacket(&ResponsePacket
, sizeof(ResponsePacket
), NULL
);
542 BT_ACL_DEBUG(1, ">> L2CAP Echo Response", NULL
);
545 static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t
* ACLPacketHeader
,
546 BT_DataPacket_Header_t
* DataHeader
,
547 BT_Signal_Header_t
* SignalCommandHeader
)
549 BT_Signal_InformationReq_t InformationRequest
;
551 Pipe_Read_Stream_LE(&InformationRequest
, sizeof(InformationRequest
));
553 BT_ACL_DEBUG(1, "<< L2CAP Information Request", NULL
);
554 BT_ACL_DEBUG(2, "-- Info Type: 0x%04X", InformationRequest
.InfoType
);
561 BT_Signal_Header_t SignalCommandHeader
;
562 BT_Signal_InformationResp_t InformationResponse
;
569 switch (InformationRequest
.InfoType
)
572 ResponsePacket
.InformationResponse
.Result
= BT_INFORMATION_SUCCESSFUL
;
575 *((uint16_t*)&ResponsePacket
.Data
) = MAXIMUM_CHANNEL_MTU
;
577 case BT_INFOREQ_EXTENDEDFEATURES
:
578 ResponsePacket
.InformationResponse
.Result
= BT_INFORMATION_SUCCESSFUL
;
581 *((uint32_t*)&ResponsePacket
.Data
) = 0;
584 ResponsePacket
.InformationResponse
.Result
= BT_INFORMATION_NOTSUPPORTED
;
589 ResponsePacket
.SignalCommandHeader
.Code
= BT_SIGNAL_INFORMATION_RESPONSE
;
590 ResponsePacket
.SignalCommandHeader
.Identifier
= SignalCommandHeader
->Identifier
;
591 ResponsePacket
.SignalCommandHeader
.Length
= sizeof(ResponsePacket
.InformationResponse
) + DataLen
;
593 Bluetooth_SendPacket(&ResponsePacket
, (sizeof(ResponsePacket
) - sizeof(ResponsePacket
.Data
) + DataLen
), NULL
);
595 BT_ACL_DEBUG(1, ">> L2CAP Information Response", NULL
);
596 BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket
.InformationResponse
.Result
);