diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c index 537c81f0a3..2530231aeb 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c @@ -38,8 +38,8 @@ const struct const struct { - uint8_t Header; - uint16_t Size; + uint8_t Header; + uint16_t Size; ItemUUID_t UUIDList[]; } PROGMEM SDP_Attribute_ServiceClassIDs = { @@ -50,32 +50,32 @@ const struct {.Header = (SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), .UUID = {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00}},} } }; - + const struct { uint8_t Header; uint8_t Size; - Item16Bit_t VersionList[]; -} PROGMEM SDP_Attribute_Version = + Item16Bit_t OffsetList[]; +} PROGMEM SDP_Attribute_LangOffset = { .Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit), .Size = (sizeof(Item16Bit_t) * 1), - .VersionList = + .OffsetList = { {.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)} } - }; + }; const struct { uint8_t Header; uint8_t Size; - Item16Bit_t OffsetList[]; -} PROGMEM SDP_Attribute_LangOffset = + Item16Bit_t VersionList[]; +} PROGMEM SDP_Attribute_Version = { .Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit), .Size = (sizeof(Item16Bit_t) * 1), - .OffsetList = + .VersionList = { {.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)} } @@ -83,9 +83,9 @@ const struct const struct { - uint8_t Header; - uint8_t Size; - char Text[]; + uint8_t Header; + uint8_t Size; + char Text[]; } PROGMEM SDP_Attribute_ServiceName = { .Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit), @@ -95,9 +95,9 @@ const struct const struct { - uint8_t Header; - uint8_t Size; - char Text[]; + uint8_t Header; + uint8_t Size; + char Text[]; } PROGMEM SDP_Attribute_ServiceDescription = { .Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit), @@ -110,8 +110,8 @@ const ServiceAttributeTable_t SDP_Attribute_Table[] PROGMEM = { {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &SDP_Attribute_ServiceHandle }, {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &SDP_Attribute_ServiceClassIDs }, - {.AttributeID = SDP_ATTRIBUTE_ID_VERSION, .Data = &SDP_Attribute_Version }, {.AttributeID = SDP_ATTRIBUTE_ID_LANGIDOFFSET, .Data = &SDP_Attribute_LangOffset }, + {.AttributeID = SDP_ATTRIBUTE_ID_VERSION, .Data = &SDP_Attribute_Version }, {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &SDP_Attribute_ServiceName }, {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &SDP_Attribute_ServiceDescription }, @@ -126,8 +126,8 @@ const struct const struct { - uint8_t Header; - uint16_t Size; + uint8_t Header; + uint16_t Size; ItemUUID_t UUIDList[]; } PROGMEM RFCOMM_Attribute_ServiceClassIDs = { @@ -143,7 +143,22 @@ const struct { uint8_t Header; uint8_t Size; - char Text[]; + Item16Bit_t OffsetList[]; +} PROGMEM RFCOMM_Attribute_LangOffset = + { + .Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit), + .Size = (sizeof(Item16Bit_t) * 1), + .OffsetList = + { + {.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)} + } + }; + +const struct +{ + uint8_t Header; + uint8_t Size; + char Text[]; } PROGMEM RFCOMM_Attribute_ServiceName = { .Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit), @@ -153,9 +168,9 @@ const struct const struct { - uint8_t Header; - uint8_t Size; - char Text[]; + uint8_t Header; + uint8_t Size; + char Text[]; } PROGMEM RFCOMM_Attribute_ServiceDescription = { .Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit), @@ -167,6 +182,7 @@ const ServiceAttributeTable_t RFCOMM_Attribute_Table[] PROGMEM = { {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &RFCOMM_Attribute_ServiceHandle }, {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &RFCOMM_Attribute_ServiceClassIDs }, + {.AttributeID = SDP_ATTRIBUTE_ID_LANGIDOFFSET, .Data = &RFCOMM_Attribute_LangOffset }, {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &RFCOMM_Attribute_ServiceName }, {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &RFCOMM_Attribute_ServiceDescription }, diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h index 92fe226bc7..0fd0aa4eda 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h @@ -49,13 +49,13 @@ #define SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE 0x0000 #define SDP_ATTRIBUTE_ID_SERVICECLASSIDS 0x0001 #define SDP_ATTRIBUTE_ID_LANGIDOFFSET 0x0006 - #define SDP_ATTRIBUTE_ID_AVAILABILITY 0x0008 #define SDP_ATTRIBUTE_ID_VERSION 0x0200 #define SDP_ATTRIBUTE_ID_SERVICENAME 0x0100 #define SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION 0x0101 #define SWAPENDIAN_16(x) ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8)) - #define SWAPENDIAN_32(x) (SWAPENDIAN_16(((x) & 0xFFFF0000) >> 16) | SWAPENDIAN_16(((x) & 0x0000FFFF) << 16)) + #define SWAPENDIAN_32(x) ((((x) & 0xFF000000) >> 24) | (((x) & 0x00FF0000) >> 8) | \ + (((x) & 0x0000FF00) << 8) | (((x) & 0x000000FF) << 24)) /** Terminator for a service attribute table of type \ref ServiceAttributeTable_t. */ #define SERVICE_ATTRIBUTE_TABLE_TERMINATOR {.Data = NULL} diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c b/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c index 82cb60e291..3731e1f381 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c @@ -116,11 +116,10 @@ static void SDP_ProcessServiceSearch(const SDP_PDUHeader_t* const SDPHeader, Blu /* Search through the list of UUIDs one at a time looking for matching search Attributes */ for (uint8_t CurrUUIDItem = 0; CurrUUIDItem < TotalUUIDs; CurrUUIDItem++) { + ServiceAttributeTable_t* AttributeTable; + /* Retrieve the attribute table of the current search UUID from the global UUID table if it exists */ - ServiceAttributeTable_t* AttributeTable = SDP_GetAttributeTable(UUIDList[CurrUUIDItem]); - - /* If the UUID does not exist in the global UUID table, continue on to the next search UUID */ - if (AttributeTable == NULL) + if ((AttributeTable = SDP_GetAttributeTable(UUIDList[CurrUUIDItem])) == NULL) continue; BT_SDP_DEBUG(2, " -- Found UUID %d in table", CurrUUIDItem); @@ -216,9 +215,12 @@ static void SDP_ProcessServiceAttribute(const SDP_PDUHeader_t* const SDPHeader, /* Get the size of the header for the Service Record Handle */ uint8_t AttrHeaderSize; SDP_GetLocalAttributeContainerSize(ServiceRecord, &AttrHeaderSize); - + + /* Retrieve the endian-swapped service handle of the current service being examined */ + uint32_t CurrServiceHandle = SwapEndian_32(pgm_read_dword(ServiceRecord + AttrHeaderSize)); + /* Check if the current service in the service table has the requested service handle */ - if (memcmp_P(ServiceRecord + AttrHeaderSize, &ServiceHandle, sizeof(uint32_t)) == 0) + if (ServiceHandle == CurrServiceHandle) { *TotalResponseSize += SDP_AddListedAttributesToResponse(CurrAttributeTable, AttributeList, TotalAttributes, &CurrResponsePos); @@ -300,15 +302,15 @@ static void SDP_ProcessServiceSearchAttribute(const SDP_PDUHeader_t* const SDPHe /* Search through the list of UUIDs one at a time looking for matching search Attributes */ for (uint8_t CurrUUIDItem = 0; CurrUUIDItem < TotalUUIDs; CurrUUIDItem++) { + ServiceAttributeTable_t* AttributeTable; + /* Retrieve the attribute table of the current search UUID from the global UUID table if it exists */ - ServiceAttributeTable_t* AttributeTable = SDP_GetAttributeTable(UUIDList[CurrUUIDItem]); - - /* If the UUID does not exist in the global UUID table, continue on to the next search UUID */ - if (AttributeTable == NULL) + if ((AttributeTable = SDP_GetAttributeTable(UUIDList[CurrUUIDItem])) == NULL) continue; BT_SDP_DEBUG(2, " -- Found UUID %d in table", CurrUUIDItem); + /* Add the listed attributes for the found UUID to the response */ *TotalResponseSize += SDP_AddListedAttributesToResponse(AttributeTable, AttributeList, TotalAttributes, &CurrResponsePos); } @@ -361,21 +363,24 @@ static uint16_t SDP_AddListedAttributesToResponse(const ServiceAttributeTable_t* for (uint8_t CurrAttribute = 0; CurrAttribute < TotalAttributes; CurrAttribute++) { uint16_t* AttributeIDRange = AttributeList[CurrAttribute]; - - /* Look in the current Attribute Range for a matching Attribute ID in the UUID's Attribute table */ - for (uint32_t CurrAttributeID = AttributeIDRange[0]; CurrAttributeID <= AttributeIDRange[1]; CurrAttributeID++) + void* AttributeValue; + + /* Look through the current service's attribute list, examining all the attributes */ + while ((AttributeValue = (void*)pgm_read_word(&AttributeTable->Data)) != NULL) { - /* Retrieve a PROGMEM pointer to the value of the current Attribute ID, if it exists in the UUID's Attribute table */ - const void* AttributeValue = SDP_GetAttributeValue(AttributeTable, CurrAttributeID); - - /* If the Attribute does not exist in the current UUID's Attribute table, continue to the next Attribute ID */ - if (AttributeValue == NULL) - continue; - - BT_SDP_DEBUG(2, " -- Add Attribute 0x%04X", CurrAttributeID); + /* Get the current Attribute's ID from the current attribute table entry */ + uint16_t CurrAttributeID = pgm_read_word(&AttributeTable->AttributeID); + + /* Check if the current Attribute's ID is within the current Attribute range */ + if ((CurrAttributeID >= AttributeIDRange[0]) && (CurrAttributeID <= AttributeIDRange[1])) + { + BT_SDP_DEBUG(2, " -- Add Attribute 0x%04X", CurrAttributeID); - /* Increment the current UUID's returned Attribute container size by the number of added bytes */ - *AttributeListSize += SDP_AddAttributeToResponse(CurrAttributeID, AttributeValue, BufferPos); + /* Increment the current UUID's returned Attribute container size by the number of added bytes */ + *AttributeListSize += SDP_AddAttributeToResponse(CurrAttributeID, AttributeValue, BufferPos); + } + + AttributeTable++; } /* Increment the outer container size by the number of added bytes */ @@ -551,12 +556,8 @@ static uint8_t SDP_GetUUIDList(uint8_t UUIDList[][UUID_SIZE_BYTES], const void** /* Copy over the base UUID value to the free UUID slot in the list */ memcpy_P(CurrentUUID, &BaseUUID, sizeof(BaseUUID)); - /* Copy over UUID from the container to the free slot - if a short UUID (<= 4 bytes) it replaces the lower - 4 bytes of the base UUID, otherwise it replaces the UUID completely */ - if (UUIDLength <= 4) - memcpy(&CurrentUUID[UUID_SIZE_BYTES - UUIDLength], *CurrentParameter, UUIDLength); - else - memcpy(&CurrentUUID[0], *CurrentParameter, UUIDLength); + /* Copy over UUID from the container to the free slot */ + memcpy(&CurrentUUID[UUID_SIZE_BYTES - UUIDLength], *CurrentParameter, UUIDLength); BT_SDP_DEBUG(2, "-- UUID (%d): %02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", UUIDLength,