void RFCOMM_ProcessControlCommand(const uint8_t* Command,
                                  Bluetooth_Channel_t* const ACLChannel)
{
	const RFCOMM_Command_t* CommandHeader  = (const RFCOMM_Command_t*)Command;
	const uint8_t*          CommandData    = (const uint8_t*)Command + sizeof(RFCOMM_Command_t);
	uint8_t                 CommandDataLen = RFCOMM_GetVariableFieldValue(&CommandData);

	switch (CommandHeader->Command)
	{
		case RFCOMM_Control_Test:
			RFCOMM_ProcessTestCommand(CommandHeader, CommandDataLen, CommandData, ACLChannel);
			break;
		case RFCOMM_Control_FlowControlEnable:
			RFCOMM_ProcessFCECommand(CommandHeader, CommandData, ACLChannel);
			break;
		case RFCOMM_Control_FlowControlDisable:
			RFCOMM_ProcessFCDCommand(CommandHeader, CommandData, ACLChannel);
			break;
		case RFCOMM_Control_ModemStatus:
			RFCOMM_ProcessMSCCommand(CommandHeader, CommandDataLen, CommandData, ACLChannel);
			break;
		case RFCOMM_Control_RemotePortNegotiation:
			RFCOMM_ProcessRPNCommand(CommandHeader, CommandData, ACLChannel);
			break;
		case RFCOMM_Control_RemoteLineStatus:
			RFCOMM_ProcessRLSCommand(CommandHeader, CommandData, ACLChannel);
			break;
		case RFCOMM_Control_DLCParameterNegotiation:
			RFCOMM_ProcessDPNCommand(CommandHeader, CommandData, ACLChannel);
			break;
		default:
			BT_RFCOMM_DEBUG(1, "<< Unknown Command");		
			break;
	}
}
/** Processes an incoming RFCOMM packet on an ACL channel which has been previously opened between the local and
 *  a remote device to handle RFCOMM traffic.
 *
 *  \param[in] Data        Incoming packet data containing the RFCOMM packet
 *  \param[in] ACLChannel  ACL channel the request was issued to by the remote device
 */
void RFCOMM_ProcessPacket(void* Data,
                          Bluetooth_Channel_t* const ACLChannel)
{
	const RFCOMM_Header_t* FrameHeader  = (const RFCOMM_Header_t*)Data;
	const uint8_t*         FrameData    = (const uint8_t*)Data + sizeof(RFCOMM_Header_t);
	uint16_t               FrameDataLen = RFCOMM_GetVariableFieldValue(&FrameData);

	/* Decode the RFCOMM frame type from the header */
	switch (FrameHeader->Control & ~FRAME_POLL_FINAL)
	{
		case RFCOMM_Frame_DM:
			RFCOMM_ProcessDM(&FrameHeader->Address, ACLChannel);
			break;
		case RFCOMM_Frame_DISC:
			RFCOMM_ProcessDISC(&FrameHeader->Address, ACLChannel);
			break;
		case RFCOMM_Frame_SABM:
			RFCOMM_ProcessSABM(&FrameHeader->Address, ACLChannel);
			break;
		case RFCOMM_Frame_UA:
			RFCOMM_ProcessUA(&FrameHeader->Address, ACLChannel);
			break;
		case RFCOMM_Frame_UIH:
			RFCOMM_ProcessUIH(&FrameHeader->Address, FrameDataLen, FrameData, ACLChannel);
			break;
		default:
			BT_RFCOMM_DEBUG(1, "<< Unknown Frame Received");
			break;
	}
}