Much faster attribute range lookup - look through short list of attributes and compare to range, rather than looking up by each possible value within the range.

Cleanups to SDP code. Add missing RFCOMM language base ID offset attribute. Fix incorrect definition of the SWAPENDIAN_32() macro.
pull/1469/head
Dean Camera 15 years ago
parent cb52e4371e
commit 3f3fdb01a9

@ -55,12 +55,12 @@ const struct
{ {
uint8_t Header; uint8_t Header;
uint8_t Size; uint8_t Size;
Item16Bit_t VersionList[]; Item16Bit_t OffsetList[];
} PROGMEM SDP_Attribute_Version = } PROGMEM SDP_Attribute_LangOffset =
{ {
.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit), .Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
.Size = (sizeof(Item16Bit_t) * 1), .Size = (sizeof(Item16Bit_t) * 1),
.VersionList = .OffsetList =
{ {
{.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)} {.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)}
} }
@ -70,12 +70,12 @@ const struct
{ {
uint8_t Header; uint8_t Header;
uint8_t Size; uint8_t Size;
Item16Bit_t OffsetList[]; Item16Bit_t VersionList[];
} PROGMEM SDP_Attribute_LangOffset = } PROGMEM SDP_Attribute_Version =
{ {
.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit), .Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
.Size = (sizeof(Item16Bit_t) * 1), .Size = (sizeof(Item16Bit_t) * 1),
.OffsetList = .VersionList =
{ {
{.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)} {.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)}
} }
@ -110,8 +110,8 @@ const ServiceAttributeTable_t SDP_Attribute_Table[] PROGMEM =
{ {
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &SDP_Attribute_ServiceHandle }, {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &SDP_Attribute_ServiceHandle },
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &SDP_Attribute_ServiceClassIDs }, {.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_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_SERVICENAME, .Data = &SDP_Attribute_ServiceName },
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &SDP_Attribute_ServiceDescription }, {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &SDP_Attribute_ServiceDescription },
@ -139,6 +139,21 @@ const struct
} }
}; };
const struct
{
uint8_t Header;
uint8_t Size;
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 const struct
{ {
uint8_t Header; uint8_t Header;
@ -167,6 +182,7 @@ const ServiceAttributeTable_t RFCOMM_Attribute_Table[] PROGMEM =
{ {
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &RFCOMM_Attribute_ServiceHandle }, {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &RFCOMM_Attribute_ServiceHandle },
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &RFCOMM_Attribute_ServiceClassIDs }, {.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_SERVICENAME, .Data = &RFCOMM_Attribute_ServiceName },
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &RFCOMM_Attribute_ServiceDescription }, {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &RFCOMM_Attribute_ServiceDescription },

@ -49,13 +49,13 @@
#define SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE 0x0000 #define SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE 0x0000
#define SDP_ATTRIBUTE_ID_SERVICECLASSIDS 0x0001 #define SDP_ATTRIBUTE_ID_SERVICECLASSIDS 0x0001
#define SDP_ATTRIBUTE_ID_LANGIDOFFSET 0x0006 #define SDP_ATTRIBUTE_ID_LANGIDOFFSET 0x0006
#define SDP_ATTRIBUTE_ID_AVAILABILITY 0x0008
#define SDP_ATTRIBUTE_ID_VERSION 0x0200 #define SDP_ATTRIBUTE_ID_VERSION 0x0200
#define SDP_ATTRIBUTE_ID_SERVICENAME 0x0100 #define SDP_ATTRIBUTE_ID_SERVICENAME 0x0100
#define SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION 0x0101 #define SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION 0x0101
#define SWAPENDIAN_16(x) ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8)) #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. */ /** Terminator for a service attribute table of type \ref ServiceAttributeTable_t. */
#define SERVICE_ATTRIBUTE_TABLE_TERMINATOR {.Data = NULL} #define SERVICE_ATTRIBUTE_TABLE_TERMINATOR {.Data = NULL}

@ -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 */ /* Search through the list of UUIDs one at a time looking for matching search Attributes */
for (uint8_t CurrUUIDItem = 0; CurrUUIDItem < TotalUUIDs; CurrUUIDItem++) for (uint8_t CurrUUIDItem = 0; CurrUUIDItem < TotalUUIDs; CurrUUIDItem++)
{ {
/* Retrieve the attribute table of the current search UUID from the global UUID table if it exists */ ServiceAttributeTable_t* AttributeTable;
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 */ /* Retrieve the attribute table of the current search UUID from the global UUID table if it exists */
if (AttributeTable == NULL) if ((AttributeTable = SDP_GetAttributeTable(UUIDList[CurrUUIDItem])) == NULL)
continue; continue;
BT_SDP_DEBUG(2, " -- Found UUID %d in table", CurrUUIDItem); BT_SDP_DEBUG(2, " -- Found UUID %d in table", CurrUUIDItem);
@ -217,8 +216,11 @@ static void SDP_ProcessServiceAttribute(const SDP_PDUHeader_t* const SDPHeader,
uint8_t AttrHeaderSize; uint8_t AttrHeaderSize;
SDP_GetLocalAttributeContainerSize(ServiceRecord, &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 */ /* 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, *TotalResponseSize += SDP_AddListedAttributesToResponse(CurrAttributeTable, AttributeList, TotalAttributes,
&CurrResponsePos); &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 */ /* Search through the list of UUIDs one at a time looking for matching search Attributes */
for (uint8_t CurrUUIDItem = 0; CurrUUIDItem < TotalUUIDs; CurrUUIDItem++) for (uint8_t CurrUUIDItem = 0; CurrUUIDItem < TotalUUIDs; CurrUUIDItem++)
{ {
/* Retrieve the attribute table of the current search UUID from the global UUID table if it exists */ ServiceAttributeTable_t* AttributeTable;
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 */ /* Retrieve the attribute table of the current search UUID from the global UUID table if it exists */
if (AttributeTable == NULL) if ((AttributeTable = SDP_GetAttributeTable(UUIDList[CurrUUIDItem])) == NULL)
continue; continue;
BT_SDP_DEBUG(2, " -- Found UUID %d in table", CurrUUIDItem); 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, *TotalResponseSize += SDP_AddListedAttributesToResponse(AttributeTable, AttributeList, TotalAttributes,
&CurrResponsePos); &CurrResponsePos);
} }
@ -361,23 +363,26 @@ static uint16_t SDP_AddListedAttributesToResponse(const ServiceAttributeTable_t*
for (uint8_t CurrAttribute = 0; CurrAttribute < TotalAttributes; CurrAttribute++) for (uint8_t CurrAttribute = 0; CurrAttribute < TotalAttributes; CurrAttribute++)
{ {
uint16_t* AttributeIDRange = AttributeList[CurrAttribute]; uint16_t* AttributeIDRange = AttributeList[CurrAttribute];
void* AttributeValue;
/* Look in the current Attribute Range for a matching Attribute ID in the UUID's Attribute table */ /* Look through the current service's attribute list, examining all the attributes */
for (uint32_t CurrAttributeID = AttributeIDRange[0]; CurrAttributeID <= AttributeIDRange[1]; CurrAttributeID++) 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 */ /* Get the current Attribute's ID from the current attribute table entry */
const void* AttributeValue = SDP_GetAttributeValue(AttributeTable, CurrAttributeID); uint16_t CurrAttributeID = pgm_read_word(&AttributeTable->AttributeID);
/* If the Attribute does not exist in the current UUID's Attribute table, continue to the next Attribute ID */
if (AttributeValue == NULL)
continue;
/* 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); BT_SDP_DEBUG(2, " -- Add Attribute 0x%04X", CurrAttributeID);
/* Increment the current UUID's returned Attribute container size by the number of added bytes */ /* Increment the current UUID's returned Attribute container size by the number of added bytes */
*AttributeListSize += SDP_AddAttributeToResponse(CurrAttributeID, AttributeValue, BufferPos); *AttributeListSize += SDP_AddAttributeToResponse(CurrAttributeID, AttributeValue, BufferPos);
} }
AttributeTable++;
}
/* Increment the outer container size by the number of added bytes */ /* Increment the outer container size by the number of added bytes */
TotalResponseSize += 3 + *AttributeListSize; TotalResponseSize += 3 + *AttributeListSize;
} }
@ -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 */ /* Copy over the base UUID value to the free UUID slot in the list */
memcpy_P(CurrentUUID, &BaseUUID, sizeof(BaseUUID)); 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 /* Copy over UUID from the container to the free slot */
4 bytes of the base UUID, otherwise it replaces the UUID completely */
if (UUIDLength <= 4)
memcpy(&CurrentUUID[UUID_SIZE_BYTES - UUIDLength], *CurrentParameter, UUIDLength); memcpy(&CurrentUUID[UUID_SIZE_BYTES - UUIDLength], *CurrentParameter, UUIDLength);
else
memcpy(&CurrentUUID[0], *CurrentParameter, UUIDLength);
BT_SDP_DEBUG(2, "-- UUID (%d): %02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", BT_SDP_DEBUG(2, "-- UUID (%d): %02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X",
UUIDLength, UUIDLength,

Loading…
Cancel
Save