Split RFCOMM channel signals into Remote and Local pairs. Use memcpy() to copy over...
authorDean Camera <dean@fourwalledcubicle.com>
Wed, 23 Jun 2010 08:10:21 +0000 (08:10 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Wed, 23 Jun 2010 08:10:21 +0000 (08:10 +0000)
Ensure that only the valid parameter bytes are sent back in response to MSC commands.

Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c
Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.h
Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMMControl.c
Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMMControl.h

index 994a24b..7c39cb0 100644 (file)
@@ -232,12 +232,14 @@ static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, Bluet
                /* If the channel's DLCI is zero, the channel state entry is free */
                if (!(CurrRFCOMMChannel->DLCI))
                {
-                       CurrRFCOMMChannel->DLCI         = FrameAddress->DLCI;
-                       CurrRFCOMMChannel->State        = RFCOMM_Channel_Open;
-                       CurrRFCOMMChannel->Priority     = 7 + (CurrRFCOMMChannel->DLCI >> 3) + ((CurrRFCOMMChannel->DLCI >> 3) * 7);
-                       CurrRFCOMMChannel->MTU          = 0xFFFF;
-                       CurrRFCOMMChannel->Signals      = 0;
-                       CurrRFCOMMChannel->BreakSignals = 0;
+                       CurrRFCOMMChannel->DLCI     = FrameAddress->DLCI;
+                       CurrRFCOMMChannel->State    = RFCOMM_Channel_Open;
+                       CurrRFCOMMChannel->Priority = 7 + (CurrRFCOMMChannel->DLCI >> 3) + ((CurrRFCOMMChannel->DLCI >> 3) * 7);
+                       CurrRFCOMMChannel->MTU      = 0xFFFF;
+                       CurrRFCOMMChannel->Remote.Signals     = 0 | (1 << 0);
+                       CurrRFCOMMChannel->Remote.BreakSignal = 0 | (1 << 0);
+                       CurrRFCOMMChannel->Local.Signals      = RFCOMM_SIGNAL_RTC | RFCOMM_SIGNAL_RTR | RFCOMM_SIGNAL_DV | (1 << 0);
+                       CurrRFCOMMChannel->Local.BreakSignal  = 0 | (1 << 0);
                
                        BT_RFCOMM_DEBUG(1, ">> UA Sent");
                        RFCOMM_SendFrame(FrameAddress->DLCI, true, (RFCOMM_Frame_UA | FRAME_POLL_FINAL), 0, NULL, Channel);
index d37c068..7b1f45b 100644 (file)
                        uint8_t  State;
                        uint8_t  Priority;
                        uint16_t MTU;
-                       uint8_t  StatusFlags;
-                       uint8_t  Signals;
-                       uint8_t  BreakSignals;
+                       struct
+                       {
+                               uint8_t  Signals;
+                               uint8_t  BreakSignal;
+                       } Remote;
+                       struct
+                       {
+                               uint8_t  Signals;
+                               uint8_t  BreakSignal;
+                       } Local;
                } RFCOMM_Channel_t;
                
        /* External Variables: */
index 1d18633..01fab78 100644 (file)
@@ -88,7 +88,7 @@ static void RFCOMM_ProcessTestCommand(const RFCOMM_Command_t* const CommandHeade
        } TestResponse;\r
 \r
        /* Fill out the Test response data */\r
-       TestResponse.CommandHeader = (RFCOMM_Command_t){.Command = RFCOMM_Control_Test, .EA = true};\r
+       TestResponse.CommandHeader = (RFCOMM_Command_t){.Command = RFCOMM_Control_Test, .EA = true, .CR = false};\r
        TestResponse.Length        = (CommandDataLen << 1) | 0x01;\r
        memcpy(TestResponse.TestData, Params, CommandDataLen);\r
        \r
@@ -130,11 +130,11 @@ static void RFCOMM_ProcessMSCommand(const RFCOMM_Command_t* const CommandHeader,
          return;\r
          \r
        /* Save the new channel signals to the channel state structure */\r
-       RFCOMMChannel->Signals = Params->Signals;\r
+       RFCOMMChannel->Remote.Signals = Params->Signals;\r
        \r
        /* If the command contains the optional break signals field, store the value */\r
        if (CommandDataLen == sizeof(RFCOMM_MS_Parameters_t))\r
-         RFCOMMChannel->BreakSignals = Params->BreakSignals;\r
+         RFCOMMChannel->Remote.BreakSignal = Params->BreakSignal;\r
          \r
        struct\r
        {\r
@@ -144,14 +144,15 @@ static void RFCOMM_ProcessMSCommand(const RFCOMM_Command_t* const CommandHeader,
        } MSResponse;\r
 \r
        /* Fill out the MS response data */\r
-       MSResponse.CommandHeader = (RFCOMM_Command_t){.Command = RFCOMM_Control_ModemStatus, .EA = true};\r
-       MSResponse.Length        = (CommandDataLen << 1) | 0x01;\r
-       MSResponse.Params        = *Params;\r
+       MSResponse.CommandHeader  = (RFCOMM_Command_t){.Command = RFCOMM_Control_ModemStatus, .EA = true, .CR = false};\r
+       MSResponse.Length         = (CommandDataLen << 1) | 0x01;\r
+       memcpy(&MSResponse.Params, Params, sizeof(RFCOMM_MS_Parameters_t));\r
        \r
        BT_RFCOMM_DEBUG(1, ">> MS Response");\r
 \r
        /* Send the PDN response to acknowledge the command */\r
-       RFCOMM_SendFrame(RFCOMM_CONTROL_DLCI, false, RFCOMM_Frame_UIH, sizeof(MSResponse), &MSResponse, Channel);\r
+       RFCOMM_SendFrame(RFCOMM_CONTROL_DLCI, false, RFCOMM_Frame_UIH,\r
+                        (sizeof(MSResponse) - sizeof(MSResponse.Params) + CommandDataLen), &MSResponse, Channel);\r
 }\r
 \r
 static void RFCOMM_ProcessRPNCommand(const RFCOMM_Command_t* const CommandHeader, const uint8_t* CommandData,\r
@@ -190,10 +191,13 @@ static void RFCOMM_ProcessDPNCommand(const RFCOMM_Command_t* const CommandHeader
                        /* If the channel's DLCI is zero, the channel state entry is free */\r
                        if (!(RFCOMM_Channels[i].DLCI))\r
                        {\r
-                               RFCOMMChannel               = &RFCOMM_Channels[i];\r
-                               RFCOMMChannel->DLCI         = Params->DLCI;\r
-                               RFCOMMChannel->Signals      = 0;\r
-                               RFCOMMChannel->BreakSignals = 0;\r
+                               RFCOMMChannel       = &RFCOMM_Channels[i];\r
+                               RFCOMMChannel->DLCI = Params->DLCI;\r
+                               RFCOMMChannel->MTU  = 0xFFFF;\r
+                               RFCOMMChannel->Remote.Signals     = 0 | (1 << 0);\r
+                               RFCOMMChannel->Remote.BreakSignal = 0 | (1 << 0);\r
+                               RFCOMMChannel->Local.Signals      = RFCOMM_SIGNAL_RTC | RFCOMM_SIGNAL_RTR | RFCOMM_SIGNAL_DV | (1 << 0);\r
+                               RFCOMMChannel->Local.BreakSignal  = 0 | (1 << 0);\r
                                break;\r
                        }\r
                }\r
@@ -207,9 +211,9 @@ static void RFCOMM_ProcessDPNCommand(const RFCOMM_Command_t* const CommandHeader
        }\r
        \r
        /* Save the new channel configuration */\r
-       RFCOMMChannel->State       = RFCOMM_Channel_Open;\r
-       RFCOMMChannel->Priority    = Params->Priority;\r
-       RFCOMMChannel->MTU         = Params->MaximumFrameSize;\r
+       RFCOMMChannel->State    = RFCOMM_Channel_Open;\r
+       RFCOMMChannel->Priority = Params->Priority;\r
+       RFCOMMChannel->MTU      = Params->MaximumFrameSize;\r
        \r
        struct\r
        {\r
@@ -219,9 +223,9 @@ static void RFCOMM_ProcessDPNCommand(const RFCOMM_Command_t* const CommandHeader
        } DPNResponse;\r
        \r
        /* Fill out the DPN response data */\r
-       DPNResponse.CommandHeader           = (RFCOMM_Command_t){.Command = RFCOMM_Control_DLCParameterNegotiation, .EA = true};\r
+       DPNResponse.CommandHeader           = (RFCOMM_Command_t){.Command = RFCOMM_Control_DLCParameterNegotiation, .EA = true, .CR = false};\r
        DPNResponse.Length                  = (sizeof(DPNResponse.Params) << 1) | 0x01;\r
-       DPNResponse.Params                  = *Params;\r
+       memcpy(&DPNResponse.Params, Params, sizeof(RFCOMM_DPN_Parameters_t));\r
        DPNResponse.Params.ConvergenceLayer = 0x00; // TODO: Enable credit based transaction support\r
        \r
        BT_RFCOMM_DEBUG(1, ">> DPN Response");\r
index b992c27..adad433 100644 (file)
                #include "RFCOMM.h"\r
                \r
        /* Macros: */\r
-               #define RFCOMM_STATUSFLAG_FC     (1 << 1)\r
-               #define RFCOMM_STATUSFLAG_RTC    (1 << 2)\r
-               #define RFCOMM_STATUSFLAG_RTR    (1 << 3)\r
-               #define RFCOMM_STATUSFLAG_IC     (1 << 6)\r
-               #define RFCOMM_STATUSFLAG_DV     (1 << 7)\r
+               #define RFCOMM_SIGNAL_FC     (1 << 1)\r
+               #define RFCOMM_SIGNAL_RTC    (1 << 2)\r
+               #define RFCOMM_SIGNAL_RTR    (1 << 3)\r
+               #define RFCOMM_SIGNAL_IC     (1 << 6)\r
+               #define RFCOMM_SIGNAL_DV     (1 << 7)\r
 \r
        /* Enums: */\r
                enum RFCOMM_Control_Commands_t\r
                {\r
                        RFCOMM_Address_t Channel;\r
                        uint8_t          Signals;\r
-                       uint8_t          BreakSignals;\r
+                       uint8_t          BreakSignal;\r
                } RFCOMM_MS_Parameters_t;\r
 \r
        /* Function Prototypes: */\r