this software.
*/
+/** \file
+ *
+ * Bluetooth L2CAP layer management code. This module managed the creation,
+ * configuration and teardown of L2CAP channels, and manages packet reception
+ * and sending to and from other Bluetooth devices.
+ */
+
/*
TODO: Make SendPacket respect receiver's MTU
TODO: Make ReceivePacket stitch together MTU fragments (?)
/* Check if we are in a channel state which requires a configuration request to be sent */
switch (ChannelData->State)
{
- case Channel_Config_WaitConfig:
- ChannelData->State = Channel_Config_WaitReqResp;
+ case BT_Channel_Config_WaitConfig:
+ ChannelData->State = BT_Channel_Config_WaitReqResp;
break;
- case Channel_Config_WaitSendConfig:
- ChannelData->State = Channel_Config_WaitResp;
+ case BT_Channel_Config_WaitSendConfig:
+ ChannelData->State = BT_Channel_Config_WaitResp;
break;
default:
MustSendConfigReq = false;
Pipe_Read_Stream_LE(PacketData, DataHeader.PayloadLength);
Pipe_ClearIN();
Pipe_Freeze();
-
+
Bluetooth_PacketReceived(PacketData, DataHeader.PayloadLength,
Bluetooth_GetChannelData(DataHeader.DestinationChannel, CHANNEL_SEARCH_LOCALNUMBER));
}
return BT_SENDPACKET_NotConnected;
/* If the destination channel is not the signalling channel and it is not currently fully open, abort */
- if ((Channel != NULL) && (Channel->State != Channel_Open))
+ if ((Channel != NULL) && (Channel->State != BT_Channel_Open))
return BT_SENDPACKET_ChannelNotOpen;
/* Fill out the packet's header from the remote device connection information structure */
DataHeader.DestinationChannel = (Channel == NULL) ? BT_CHANNEL_SIGNALING : Channel->RemoteNumber;
Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE);
+
+ Pipe_WaitUntilReady();
Pipe_Unfreeze();
-
+
/* Write the packet contents to the pipe so that it can be sent to the remote device */
Pipe_Write_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader));
Pipe_Write_Stream_LE(&DataHeader, sizeof(DataHeader));
return BT_SENDPACKET_NoError;
}
-/** Opens a bluetooth channel to the currently connected remote device, so that data can be exchanged.
+/** Opens a Bluetooth channel to the currently connected remote device, so that data can be exchanged.
*
* \note The channel is not immediately opened when this function returns - it must undergo a two way
* connection and configuration process first as the main Bluetooth stack processing task is
/* Search through the channel information list for a free channel item */
for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)
{
- if (Bluetooth_Connection.Channels[i].State == Channel_Closed)
+ if (Bluetooth_Connection.Channels[i].State == BT_Channel_Closed)
{
ChannelData = &Bluetooth_Connection.Channels[i];
ChannelData->RemoteNumber = 0;
ChannelData->PSM = PSM;
ChannelData->LocalMTU = MAXIMUM_CHANNEL_MTU;
- ChannelData->State = Channel_WaitConnectRsp;
+ ChannelData->State = BT_Channel_WaitConnectRsp;
struct
{
return ChannelData;
}
-/** Closes a bluetooth channel that is open to the currently connected remote device, so that no further data
+/** Closes a Bluetooth channel that is open to the currently connected remote device, so that no further data
* can be exchanged.
*
* \note The channel is not immediately closed when this function returns - it must undergo an asynchronous
void Bluetooth_CloseChannel(Bluetooth_Channel_t* const Channel)
{
/* Don't try to close a non-existing or already closed channel */
- if ((Channel == NULL) || (Channel->State == Channel_Closed))
+ if ((Channel == NULL) || (Channel->State == BT_Channel_Closed))
return;
/* Set the channel's state to the start of the teardown process */
- Channel->State = Channel_WaitDisconnect;
+ Channel->State = BT_Channel_WaitDisconnect;
struct
{
Pipe_ClearIN();
Pipe_Freeze();
-
+
BT_ACL_DEBUG(1, "<< L2CAP Connection Request");
BT_ACL_DEBUG(2, "-- PSM: 0x%04X", ConnectionRequest.PSM);
BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionRequest.SourceChannel);
-
+
/* Try to retrieve the existing channel's information structure if it exists */
Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConnectionRequest.SourceChannel, CHANNEL_SEARCH_REMOTENUMBER);
/* Look through the channel information list for a free entry */
for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)
{
- if (Bluetooth_Connection.Channels[i].State == Channel_Closed)
+ if (Bluetooth_Connection.Channels[i].State == BT_Channel_Closed)
{
ChannelData = &Bluetooth_Connection.Channels[i];
ChannelData->RemoteNumber = ConnectionRequest.SourceChannel;
ChannelData->PSM = ConnectionRequest.PSM;
ChannelData->LocalMTU = MAXIMUM_CHANNEL_MTU;
- ChannelData->State = Channel_Config_WaitConfig;
+ ChannelData->State = BT_Channel_Config_WaitConfig;
ChannelStatus = BT_CONNECTION_SUCCESSFUL;
}
/* Set the channel structure's remote channel number to the channel allocated on the remote device */
ChannelData->RemoteNumber = ConnectionResponse.SourceChannel;
ChannelData->State = (ConnectionResponse.Result == BT_CONNECTION_SUCCESSFUL) ?
- Channel_Config_WaitConfig : Channel_Closed;
+ BT_Channel_Config_WaitConfig : BT_Channel_Closed;
}
}
BT_ACL_DEBUG(1, "<< L2CAP Configuration Request");
BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConfigurationRequest.DestinationChannel);
- BT_ACL_DEBUG(2, "-- Remote MTU: 0x%04X", ChannelData->RemoteMTU);
BT_ACL_DEBUG(2, "-- Options Len: 0x%04X", OptionsLen);
/* Only look at the channel configuration options if a valid channel entry for the local channel number was found */
{
switch (ChannelData->State)
{
- case Channel_Config_WaitConfig:
- ChannelData->State = Channel_Config_WaitSendConfig;
+ case BT_Channel_Config_WaitConfig:
+ ChannelData->State = BT_Channel_Config_WaitSendConfig;
break;
- case Channel_Config_WaitReqResp:
- ChannelData->State = Channel_Config_WaitResp;
+ case BT_Channel_Config_WaitReqResp:
+ ChannelData->State = BT_Channel_Config_WaitResp;
break;
- case Channel_Config_WaitReq:
- ChannelData->State = Channel_Open;
+ case BT_Channel_Config_WaitReq:
+ ChannelData->State = BT_Channel_Open;
break;
}
}
{
switch (ChannelData->State)
{
- case Channel_Config_WaitReqResp:
- ChannelData->State = Channel_Config_WaitReq;
+ case BT_Channel_Config_WaitReqResp:
+ ChannelData->State = BT_Channel_Config_WaitReq;
break;
- case Channel_Config_WaitResp:
- ChannelData->State = Channel_Open;
+ case BT_Channel_Config_WaitResp:
+ ChannelData->State = BT_Channel_Open;
break;
}
}
else
{
/* Configuration failed - close the channel */
- ChannelData->State = Channel_Closed;
+ ChannelData->State = BT_Channel_Closed;
}
}
}
/* If the channel was found in the channel list, close it */
if (ChannelData != NULL)
- ChannelData->State = Channel_Closed;
+ ChannelData->State = BT_Channel_Closed;
BT_ACL_DEBUG(1, ">> L2CAP Disconnection Response");
BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket.DisconnectionResponse.SourceChannel);
/* If the channel was found in the channel list, close it */
if (ChannelData != NULL)
- ChannelData->State = Channel_Closed;
+ ChannelData->State = BT_Channel_Closed;
}
/** Internal Bluetooth stack Signal Command processing routine for an Echo Request command.