Add L2CAP service attribute table. Fix up ProtocolDescriptorList attributes, and...
authorDean Camera <dean@fourwalledcubicle.com>
Wed, 2 Jun 2010 04:36:46 +0000 (04:36 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Wed, 2 Jun 2010 04:36:46 +0000 (04:36 +0000)
Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c
Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h
Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c

index 28b9d77..96401c0 100644 (file)
@@ -30,6 +30,8 @@
 \r
 #include "SDPServices.h"\r
 \r
+/* ------------------------------ SDP SERVICE ATTRIBUTES  ------------------------------ */\r
+\r
 const struct\r
 {\r
        uint8_t  Header;\r
@@ -50,25 +52,7 @@ const struct
                (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
                SWAPENDIAN_16(sizeof(ItemUUID_t) * 1),\r
                {\r
-                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00}}}\r
-               }\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t        Header;\r
-       uint16_t       Size;\r
-       ItemProtocol_t ProtocolList[];\r
-} PROGMEM SDP_Attribute_ProtocolDescriptor =\r
-       {\r
-               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
-               SWAPENDIAN_16(sizeof(ItemProtocol_t) * 1),\r
-               {\r
-                       {\r
-                               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
-                               sizeof(UUID_t),\r
-                               {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x01, 0x00}}},\r
-                       }\r
+                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SDP_CLASS_UUID}\r
                }\r
        };\r
 \r
@@ -115,7 +99,6 @@ const ServiceAttributeTable_t SDP_Attribute_Table[] PROGMEM =
        {\r
                {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE,    .Data = &SDP_Attribute_ServiceHandle      },\r
                {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,        .Data = &SDP_Attribute_ServiceClassIDs    },\r
-//             {.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &SDP_Attribute_ProtocolDescriptor },\r
                {.AttributeID = SDP_ATTRIBUTE_ID_VERSION,                .Data = &SDP_Attribute_Version            },\r
                {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,            .Data = &SDP_Attribute_ServiceName        },\r
                {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,     .Data = &SDP_Attribute_ServiceDescription },\r
@@ -123,6 +106,10 @@ const ServiceAttributeTable_t SDP_Attribute_Table[] PROGMEM =
                SERVICE_ATTRIBUTE_TABLE_TERMINATOR\r
        };\r
 \r
+\r
+/* ------------------------------ RFCOMM SERVICE ATTRIBUTES  ------------------------------ */\r
+\r
+\r
 const struct\r
 {\r
        uint8_t  Header;\r
@@ -143,21 +130,35 @@ const struct
                (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
                SWAPENDIAN_16(sizeof(ItemUUID_t) * 1),\r
                {\r
-                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x11, 0x01}}}\r
+                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SP_CLASS_UUID}\r
                }\r
        };\r
 \r
 const struct\r
 {\r
-       uint8_t     Header;\r
-       uint8_t     Size;\r
-       Item16Bit_t OffsetList[];\r
-} PROGMEM RFCOMM_Attribute_LangOffset =\r
+       uint8_t        Header;\r
+       uint16_t       Size;\r
+\r
+       ItemProtocol_t ProtocolList[];\r
+} PROGMEM RFCOMM_Attribute_ProtocolDescriptor =\r
        {\r
-               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
-               (sizeof(Item16Bit_t) * 1),\r
+               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
+               SWAPENDIAN_16(sizeof(ItemProtocol_t) * 2),\r
                {\r
-                       {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x0100)}\r
+                       {\r
+                               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
+                               sizeof(UUID_t),\r
+                               {\r
+                                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), L2CAP_UUID},\r
+                               }\r
+                       },\r
+                       {\r
+                               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
+                               sizeof(UUID_t),\r
+                               {\r
+                                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), RFCOMM_UUID},\r
+                               }\r
+                       }\r
                }\r
        };\r
 \r
@@ -189,8 +190,101 @@ const ServiceAttributeTable_t RFCOMM_Attribute_Table[] PROGMEM =
        {\r
                {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE,    .Data = &RFCOMM_Attribute_ServiceHandle      },\r
                {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,        .Data = &RFCOMM_Attribute_ServiceClassIDs    },\r
+               {.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &RFCOMM_Attribute_ProtocolDescriptor },\r
                {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,            .Data = &RFCOMM_Attribute_ServiceName        },\r
                {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,     .Data = &RFCOMM_Attribute_ServiceDescription },\r
 \r
                SERVICE_ATTRIBUTE_TABLE_TERMINATOR\r
        };\r
+\r
+\r
+/* ------------------------------ L2CAP SERVICE ATTRIBUTES  ------------------------------ */\r
+\r
+\r
+const struct\r
+{\r
+       uint8_t  Header;\r
+       uint32_t Data;\r
+} PROGMEM L2CAP_Attribute_ServiceHandle =\r
+       {\r
+               (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit),\r
+               SWAPENDIAN_32(0x00010002),\r
+       };\r
+\r
+const struct\r
+{\r
+       uint8_t    Header;\r
+       uint16_t   Size;\r
+       ItemUUID_t UUIDList[];\r
+} PROGMEM L2CAP_Attribute_ServiceClassIDs =\r
+       {\r
+               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
+               SWAPENDIAN_16(sizeof(ItemUUID_t) * 2),\r
+               {\r
+                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SDP_CLASS_UUID },\r
+                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SP_CLASS_UUID  },\r
+               }\r
+       };\r
+\r
+const struct\r
+{\r
+       uint8_t        Header;\r
+       uint16_t       Size;\r
+\r
+       ItemProtocol_t ProtocolList[];\r
+} PROGMEM L2CAP_Attribute_ProtocolDescriptor =\r
+       {\r
+               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
+               SWAPENDIAN_16(sizeof(ItemProtocol_t) * 2),\r
+               {\r
+                       {\r
+                               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
+                               sizeof(UUID_t),\r
+                               {\r
+                                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), L2CAP_UUID},\r
+                               }\r
+                       },\r
+                       {\r
+                               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
+                               sizeof(UUID_t),\r
+                               {\r
+                                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), RFCOMM_UUID},\r
+                               }\r
+                       }\r
+               }\r
+       };\r
+       \r
+const struct\r
+{\r
+       uint8_t Header;\r
+       uint8_t Size;\r
+       char    Text[];\r
+} PROGMEM L2CAP_Attribute_ServiceName =\r
+       {\r
+               (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),\r
+               sizeof("L2CAP") - 1,\r
+               "L2CAP",\r
+       };\r
+\r
+const struct\r
+{\r
+       uint8_t Header;\r
+       uint8_t Size;\r
+       char    Text[];\r
+} PROGMEM L2CAP_Attribute_ServiceDescription =\r
+       {\r
+               (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),\r
+               sizeof("Logical Link Layer") - 1,\r
+               "Logical Link Layer",\r
+       };\r
+\r
+const ServiceAttributeTable_t L2CAP_Attribute_Table[] PROGMEM =\r
+       {\r
+               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE,    .Data = &L2CAP_Attribute_ServiceHandle      },\r
+               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,        .Data = &L2CAP_Attribute_ServiceClassIDs    },\r
+               {.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &L2CAP_Attribute_ProtocolDescriptor },\r
+               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,            .Data = &L2CAP_Attribute_ServiceName        },\r
+               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,     .Data = &L2CAP_Attribute_ServiceDescription },\r
+               \r
+               SERVICE_ATTRIBUTE_TABLE_TERMINATOR\r
+       };\r
index 61fd593..a11850d 100644 (file)
                /** First 80 bits common to all standardized Bluetooth services. */\r
                #define BASE_80BIT_UUID                         SWAPENDIAN_32(0xFB349B5F), SWAPENDIAN_16(0x8000), SWAPENDIAN_16(0x0080), SWAPENDIAN_16(0x0010)\r
                \r
+               #define SDP_UUID                                {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}\r
+               #define RFCOMM_UUID                             {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}}\r
+               #define L2CAP_UUID                              {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x01, 0x00}}\r
+               #define UPNP_UUID                               {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x00, 0x10}}\r
+               #define SDP_CLASS_UUID                          {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00}}\r
+               #define SP_CLASS_UUID                           {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x11, 0x01}}\r
+               #define UPNP_CLASS_UUID                         {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x12, 0x00}}\r
+               \r
                #define SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE    0x0000\r
                #define SDP_ATTRIBUTE_ID_SERVICECLASSIDS        0x0001\r
                #define SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST 0x0004\r
                        uint8_t     Header; /**< Data Element header, should be (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit) */\r
                        uint8_t     Size; /**< Size of the inner Data Element sequence */\r
                        \r
-                       ItemUUID_t  UUID; /**< UUID to store in the protocol list Data Element sequence */\r
+                       struct\r
+                       {\r
+                               ItemUUID_t UUID; /**< UUID to store in the protocol list Data Element sequence */\r
+                       } Protocol;\r
                } ItemProtocol_t;\r
                \r
        /* External Variables: */\r
                extern const ServiceAttributeTable_t SDP_Attribute_Table[];\r
                extern const ServiceAttributeTable_t RFCOMM_Attribute_Table[];\r
+               extern const ServiceAttributeTable_t L2CAP_Attribute_Table[];\r
                \r
 #endif\r
index 6bb35f6..c6b3948 100644 (file)
  */
 const ServiceTable_t SDP_Services_Table[] PROGMEM =
        {
-               {   // 128-bit UUID for the SDP service
-                       .UUID  = {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
-                       .AttributeTable = SDP_Attribute_Table,
-               },
-               {   // 128-bit UUID for the RFCOMM service
-                       .UUID  = {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}},
-                       .AttributeTable = RFCOMM_Attribute_Table,
-               },
+               { .UUID  = SDP_UUID   , .AttributeTable = SDP_Attribute_Table     },
+               { .UUID  = RFCOMM_UUID, .AttributeTable = RFCOMM_Attribute_Table  },
+               { .UUID  = L2CAP_UUID , .AttributeTable = L2CAP_Attribute_Table   },
        };
 
 /** Base UUID value common to all standardized Bluetooth services */