|
|
@ -199,8 +199,7 @@ static void SDP_ProcessServiceAttribute(const SDP_PDUHeader_t* const SDPHeader, |
|
|
|
if (MaxAttributeSize > sizeof(ResponsePacket.ResponseData)) |
|
|
|
if (MaxAttributeSize > sizeof(ResponsePacket.ResponseData)) |
|
|
|
MaxAttributeSize = sizeof(ResponsePacket.ResponseData); |
|
|
|
MaxAttributeSize = sizeof(ResponsePacket.ResponseData); |
|
|
|
|
|
|
|
|
|
|
|
/* Add the outer Data Element Sequence header for all of the retrieved Attributes */ |
|
|
|
uint16_t TotalResponseSize = 0; |
|
|
|
uint16_t* TotalResponseSize = SDP_AddDataElementHeader16(&CurrResponsePos, SDP_DATATYPE_Sequence); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Search through the global UUID list an item at a time */ |
|
|
|
/* Search through the global UUID list an item at a time */ |
|
|
|
for (uint8_t CurrTableItem = 0; CurrTableItem < (sizeof(SDP_Services_Table) / sizeof(ServiceTable_t)); CurrTableItem++) |
|
|
|
for (uint8_t CurrTableItem = 0; CurrTableItem < (sizeof(SDP_Services_Table) / sizeof(ServiceTable_t)); CurrTableItem++) |
|
|
@ -222,8 +221,8 @@ static void SDP_ProcessServiceAttribute(const SDP_PDUHeader_t* const SDPHeader, |
|
|
|
if (ServiceHandle == CurrServiceHandle) |
|
|
|
if (ServiceHandle == CurrServiceHandle) |
|
|
|
{ |
|
|
|
{ |
|
|
|
/* Add the listed attributes for the found UUID to the response */ |
|
|
|
/* Add the listed attributes for the found UUID to the response */ |
|
|
|
*TotalResponseSize += SDP_AddListedAttributesToResponse(CurrAttributeTable, AttributeList, TotalAttributes, |
|
|
|
TotalResponseSize = SDP_AddListedAttributesToResponse(CurrAttributeTable, AttributeList, TotalAttributes, |
|
|
|
&CurrResponsePos); |
|
|
|
&CurrResponsePos); |
|
|
|
|
|
|
|
|
|
|
|
/* Requested service found, abort the search through the service table */ |
|
|
|
/* Requested service found, abort the search through the service table */ |
|
|
|
break; |
|
|
|
break; |
|
|
@ -234,22 +233,17 @@ static void SDP_ProcessServiceAttribute(const SDP_PDUHeader_t* const SDPHeader, |
|
|
|
SDP_WriteData8(&CurrResponsePos, 0); |
|
|
|
SDP_WriteData8(&CurrResponsePos, 0); |
|
|
|
|
|
|
|
|
|
|
|
/* Set the total response list size to the size of the outer container plus its header size and continuation state */ |
|
|
|
/* Set the total response list size to the size of the outer container plus its header size and continuation state */ |
|
|
|
ResponsePacket.AttributeListByteCount = SwapEndian_16(3 + *TotalResponseSize); |
|
|
|
ResponsePacket.AttributeListByteCount = SwapEndian_16(TotalResponseSize); |
|
|
|
|
|
|
|
|
|
|
|
/* Calculate the total parameter length that is to be sent, including the fixed return parameters, the created attribute
|
|
|
|
/* Calculate the total parameter length that is to be sent, including the fixed return parameters, the created attribute
|
|
|
|
value list and the SDP continuation state */ |
|
|
|
value list and the SDP continuation state */ |
|
|
|
uint16_t ParamLength = (sizeof(ResponsePacket.AttributeListByteCount) +
|
|
|
|
uint16_t ParamLength = (sizeof(ResponsePacket.AttributeListByteCount) + TotalResponseSize + sizeof(uint8_t)); |
|
|
|
(3 + *TotalResponseSize) + |
|
|
|
|
|
|
|
sizeof(uint8_t)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Fill in the response packet's header */ |
|
|
|
/* Fill in the response packet's header */ |
|
|
|
ResponsePacket.SDPHeader.PDU = SDP_PDU_SERVICEATTRIBUTERESPONSE; |
|
|
|
ResponsePacket.SDPHeader.PDU = SDP_PDU_SERVICEATTRIBUTERESPONSE; |
|
|
|
ResponsePacket.SDPHeader.TransactionID = SDPHeader->TransactionID; |
|
|
|
ResponsePacket.SDPHeader.TransactionID = SDPHeader->TransactionID; |
|
|
|
ResponsePacket.SDPHeader.ParameterLength = SwapEndian_16(ParamLength); |
|
|
|
ResponsePacket.SDPHeader.ParameterLength = SwapEndian_16(ParamLength); |
|
|
|
|
|
|
|
|
|
|
|
/* Flip the endianness of the container's size */ |
|
|
|
|
|
|
|
*TotalResponseSize = SwapEndian_16(*TotalResponseSize); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BT_SDP_DEBUG(1, ">> Service Attribute Response"); |
|
|
|
BT_SDP_DEBUG(1, ">> Service Attribute Response"); |
|
|
|
BT_SDP_DEBUG(2, "-- Param Len 0x%04X", ParamLength); |
|
|
|
BT_SDP_DEBUG(2, "-- Param Len 0x%04X", ParamLength); |
|
|
|
|
|
|
|
|
|
|
@ -327,14 +321,14 @@ static void SDP_ProcessServiceSearchAttribute(const SDP_PDUHeader_t* const SDPHe |
|
|
|
(3 + *TotalResponseSize) + |
|
|
|
(3 + *TotalResponseSize) + |
|
|
|
sizeof(uint8_t)); |
|
|
|
sizeof(uint8_t)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Flip the endianness of the container's size */ |
|
|
|
|
|
|
|
*TotalResponseSize = SwapEndian_16(*TotalResponseSize); |
|
|
|
|
|
|
|
|
|
|
|
/* Fill in the response packet's header */ |
|
|
|
/* Fill in the response packet's header */ |
|
|
|
ResponsePacket.SDPHeader.PDU = SDP_PDU_SERVICESEARCHATTRIBUTERESPONSE; |
|
|
|
ResponsePacket.SDPHeader.PDU = SDP_PDU_SERVICESEARCHATTRIBUTERESPONSE; |
|
|
|
ResponsePacket.SDPHeader.TransactionID = SDPHeader->TransactionID; |
|
|
|
ResponsePacket.SDPHeader.TransactionID = SDPHeader->TransactionID; |
|
|
|
ResponsePacket.SDPHeader.ParameterLength = SwapEndian_16(ParamLength); |
|
|
|
ResponsePacket.SDPHeader.ParameterLength = SwapEndian_16(ParamLength); |
|
|
|
|
|
|
|
|
|
|
|
/* Flip the endianness of the container's size */ |
|
|
|
|
|
|
|
*TotalResponseSize = SwapEndian_16(*TotalResponseSize); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BT_SDP_DEBUG(1, ">> Service Search Attribute Response"); |
|
|
|
BT_SDP_DEBUG(1, ">> Service Search Attribute Response"); |
|
|
|
BT_SDP_DEBUG(2, "-- Param Len 0x%04X", ParamLength); |
|
|
|
BT_SDP_DEBUG(2, "-- Param Len 0x%04X", ParamLength); |
|
|
|
|
|
|
|
|
|
|
@ -354,7 +348,7 @@ static void SDP_ProcessServiceSearchAttribute(const SDP_PDUHeader_t* const SDPHe |
|
|
|
static uint16_t SDP_AddListedAttributesToResponse(const ServiceAttributeTable_t* AttributeTable, uint16_t AttributeList[][2], |
|
|
|
static uint16_t SDP_AddListedAttributesToResponse(const ServiceAttributeTable_t* AttributeTable, uint16_t AttributeList[][2], |
|
|
|
const uint8_t TotalAttributes, void** const BufferPos) |
|
|
|
const uint8_t TotalAttributes, void** const BufferPos) |
|
|
|
{ |
|
|
|
{ |
|
|
|
uint16_t TotalResponseSize = 0; |
|
|
|
uint16_t TotalResponseSize; |
|
|
|
|
|
|
|
|
|
|
|
/* Add an inner Data Element Sequence header for the current services's found Attributes */ |
|
|
|
/* Add an inner Data Element Sequence header for the current services's found Attributes */ |
|
|
|
uint16_t* AttributeListSize = SDP_AddDataElementHeader16(BufferPos, SDP_DATATYPE_Sequence); |
|
|
|
uint16_t* AttributeListSize = SDP_AddDataElementHeader16(BufferPos, SDP_DATATYPE_Sequence); |
|
|
@ -374,19 +368,17 @@ static uint16_t SDP_AddListedAttributesToResponse(const ServiceAttributeTable_t* |
|
|
|
/* Check if the current Attribute's ID is within the current Attribute range */ |
|
|
|
/* Check if the current Attribute's ID is within the current Attribute range */ |
|
|
|
if ((CurrAttributeID >= AttributeIDRange[0]) && (CurrAttributeID <= AttributeIDRange[1])) |
|
|
|
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 */ |
|
|
|
/* 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++; |
|
|
|
AttributeTable++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Increment the outer container size by the number of added bytes */ |
|
|
|
|
|
|
|
TotalResponseSize += 3 + *AttributeListSize; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Record the total number of added bytes to the buffer */ |
|
|
|
|
|
|
|
TotalResponseSize = 3 + *AttributeListSize; |
|
|
|
|
|
|
|
|
|
|
|
/* Fix endianness of the added attribute data element sequence */ |
|
|
|
/* Fix endianness of the added attribute data element sequence */ |
|
|
|
*AttributeListSize = SwapEndian_16(*AttributeListSize); |
|
|
|
*AttributeListSize = SwapEndian_16(*AttributeListSize); |
|
|
|
|
|
|
|
|
|
|
@ -405,8 +397,10 @@ static uint16_t SDP_AddAttributeToResponse(const uint16_t AttributeID, const voi |
|
|
|
{ |
|
|
|
{ |
|
|
|
/* Retrieve the size of the attribute value from its container header */ |
|
|
|
/* Retrieve the size of the attribute value from its container header */ |
|
|
|
uint8_t AttributeHeaderLength; |
|
|
|
uint8_t AttributeHeaderLength; |
|
|
|
uint32_t AttributeValueLength = SDP_GetLocalAttributeContainerSize(AttributeValue, &AttributeHeaderLength); |
|
|
|
uint16_t AttributeValueLength = SDP_GetLocalAttributeContainerSize(AttributeValue, &AttributeHeaderLength); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BT_SDP_DEBUG(2, " -- Add Attribute (0x%04X) 0x%04X", (AttributeHeaderLength + AttributeValueLength), AttributeID); |
|
|
|
|
|
|
|
|
|
|
|
/* Add a Data Element header to the response for the Attribute ID */ |
|
|
|
/* Add a Data Element header to the response for the Attribute ID */ |
|
|
|
SDP_WriteData8(ResponseBuffer, (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit)); |
|
|
|
SDP_WriteData8(ResponseBuffer, (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit)); |
|
|
|
|
|
|
|
|
|
|
@ -471,7 +465,7 @@ static ServiceAttributeTable_t* SDP_GetAttributeTable(const uint8_t* const UUID) |
|
|
|
|
|
|
|
|
|
|
|
/* Retrieve the size of the Class UUID list and skip past the header to the first Class UUID in the list */
|
|
|
|
/* Retrieve the size of the Class UUID list and skip past the header to the first Class UUID in the list */
|
|
|
|
uint8_t ClassUUIDListHeaderSize; |
|
|
|
uint8_t ClassUUIDListHeaderSize; |
|
|
|
uint32_t ClassUUIDListSize = SDP_GetLocalAttributeContainerSize(ClassUUIDs, &ClassUUIDListHeaderSize); |
|
|
|
uint16_t ClassUUIDListSize = SDP_GetLocalAttributeContainerSize(ClassUUIDs, &ClassUUIDListHeaderSize); |
|
|
|
ClassUUIDs += ClassUUIDListHeaderSize; |
|
|
|
ClassUUIDs += ClassUUIDListHeaderSize; |
|
|
|
|
|
|
|
|
|
|
|
/* Check each class UUID in turn for a match */ |
|
|
|
/* Check each class UUID in turn for a match */ |
|
|
|