Make bluetooth SDP code correctly unpack the search UUIDs and parameters.

Minor documentation improvements.
pull/1469/head
Dean Camera 15 years ago
parent fc8e4837a9
commit d92e9133d3

@ -7,8 +7,7 @@
*/ */
/* /*
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com) Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Based on code by Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted software and its documentation for any purpose is hereby granted

@ -8,7 +8,6 @@
/* /*
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Permission to use, copy, modify, distribute, and sell this Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted software and its documentation for any purpose is hereby granted

@ -7,8 +7,8 @@
*/ */
/* /*
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com) Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Based on code by Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted software and its documentation for any purpose is hereby granted

@ -206,8 +206,7 @@ void Bluetooth_Host_Task(void)
bool Bluetooth_ConnectionRequest(const uint8_t* RemoteAddress) bool Bluetooth_ConnectionRequest(const uint8_t* RemoteAddress)
{ {
printf_P(PSTR("Connection Request from Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"), printf_P(PSTR("Connection Request from Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"),
RemoteAddress[5], RemoteAddress[4], RemoteAddress[5], RemoteAddress[4], RemoteAddress[3], RemoteAddress[2],
RemoteAddress[3], RemoteAddress[2],
RemoteAddress[1], RemoteAddress[0]); RemoteAddress[1], RemoteAddress[0]);
/* Always accept connections from remote devices */ /* Always accept connections from remote devices */

@ -493,17 +493,17 @@ static inline void Bluetooth_Signal_ConfigurationReq(const BT_Signal_Header_t* c
while (OptionPos < OptionsLen) while (OptionPos < OptionsLen)
{ {
BT_Config_Option_Header_t* OptionHeader = (BT_Config_Option_Header_t*)&Options[OptionPos]; BT_Config_Option_Header_t* OptionHeader = (BT_Config_Option_Header_t*)&Options[OptionPos];
void* OptionData = &Options[OptionPos + sizeof(*OptionHeader)]; void* OptionData = &Options[OptionPos + sizeof(BT_Config_Option_Header_t)];
BT_ACL_DEBUG(2, "-- Option Type: 0x%04X", OptionHeader->Type); BT_ACL_DEBUG(2, "-- Option Type: 0x%04X", OptionHeader->Type);
BT_ACL_DEBUG(2, "-- Option Length: 0x%04X", (sizeof(*OptionHeader) + OptionHeader->Length)); BT_ACL_DEBUG(2, "-- Option Length: 0x%04X", (sizeof(BT_Config_Option_Header_t) + OptionHeader->Length));
/* Store the remote MTU option's value if present */ /* Store the remote MTU option's value if present */
if (OptionHeader->Type == BT_CONFIG_OPTION_MTU) if (OptionHeader->Type == BT_CONFIG_OPTION_MTU)
ChannelData->RemoteMTU = *((uint16_t*)OptionData); ChannelData->RemoteMTU = *((uint16_t*)OptionData);
/* Progress to the next option in the packet */ /* Progress to the next option in the packet */
OptionPos += (sizeof(*OptionHeader) + OptionHeader->Length); OptionPos += (sizeof(BT_Config_Option_Header_t) + OptionHeader->Length);
} }
} }

@ -40,6 +40,11 @@ void ServiceDiscovery_ProcessPacket(void* Data, Bluetooth_Channel_t* Channel)
BT_SDP_DEBUG(2, "-- PDU ID: 0x%02X", SDPHeader->PDU); BT_SDP_DEBUG(2, "-- PDU ID: 0x%02X", SDPHeader->PDU);
BT_SDP_DEBUG(2, "-- Param Length: 0x%04X", SDPHeader->ParameterLength); BT_SDP_DEBUG(2, "-- Param Length: 0x%04X", SDPHeader->ParameterLength);
printf("\r\n");
for (uint8_t i = 0; i < SDPHeader->ParameterLength; i++)
printf("0x%02X ", *((uint8_t*)Data + sizeof(SDP_PDUHeader_t) + i));
printf("\r\n");
switch (SDPHeader->PDU) switch (SDPHeader->PDU)
{ {
case SDP_PDU_SERVICESEARCHREQUEST: case SDP_PDU_SERVICESEARCHREQUEST:
@ -66,60 +71,92 @@ static void ServiceDiscovery_ProcessServiceAttribute(SDP_PDUHeader_t* SDPHeader)
static void ServiceDiscovery_ProcessServiceSearchAttribute(SDP_PDUHeader_t* SDPHeader) static void ServiceDiscovery_ProcessServiceSearchAttribute(SDP_PDUHeader_t* SDPHeader)
{ {
uint8_t* CurrentParameter = ((uint8_t*)SDPHeader + sizeof(SDP_PDUHeader_t)); void* CurrentParameter = ((void*)SDPHeader + sizeof(SDP_PDUHeader_t));
BT_SDP_DEBUG(1, "<< Service Search Attribute", NULL); BT_SDP_DEBUG(1, "<< Service Search Attribute", NULL);
uint8_t ElementHeaderSize;
uint8_t ServicePatternLength = ServiceDiscovery_GetDataElementSize(CurrentParameter); uint16_t ServicePatternLength = ServiceDiscovery_GetDataElementSize(&CurrentParameter, &ElementHeaderSize);
BT_SDP_DEBUG(2, "-- Total UUID Length: 0x%04X", ServicePatternLength);
while (ServicePatternLength) while (ServicePatternLength)
{ {
uint8_t UUIDLength = ServiceDiscovery_GetDataElementSize(CurrentParameter); uint8_t UUIDLength = ServiceDiscovery_GetDataElementSize(&CurrentParameter, &ElementHeaderSize);
uint8_t UUID[16]; uint8_t UUID[16];
memset(UUID, 0x00, sizeof(UUID)); memset(UUID, 0x00, sizeof(UUID));
memcpy(&UUID[sizeof(UUID) - UUIDLength], CurrentParameter, UUIDLength); memcpy(UUID, CurrentParameter, UUIDLength);
CurrentParameter += UUIDLength;
BT_SDP_DEBUG(2, "-- UUID: 0x%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", BT_SDP_DEBUG(2, "-- UUID (%d): 0x%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
UUID[0], UUID[1], UUID[2], UUID[3], UUID[4], UUID[5], UUID[6], UUID[7], UUIDLength,
UUID[8], UUID[9], UUID[10], UUID[11], UUID[12], UUID[13], UUID[14], UUID[15]); UUID[15], UUID[14], UUID[13], UUID[12], UUID[11], UUID[10], UUID[9], UUID[8],
UUID[7], UUID[6], UUID[5], UUID[4], UUID[3], UUID[2], UUID[1], UUID[0]);
ServicePatternLength -= UUIDLength; ServicePatternLength -= (UUIDLength + ElementHeaderSize);
} }
uint16_t MaxAttributeSize = ServiceDiscovery_Read16BitParameter(CurrentParameter); uint16_t MaxAttributeSize = ServiceDiscovery_Read16BitParameter(&CurrentParameter);
BT_SDP_DEBUG(2, "-- Max Return Attribute Bytes: 0x%04X", MaxAttributeSize);
uint8_t AttributeIDListLength = ServiceDiscovery_GetDataElementSize(CurrentParameter); uint16_t AttributeIDListLength = ServiceDiscovery_GetDataElementSize(&CurrentParameter, &ElementHeaderSize);
BT_SDP_DEBUG(2, "-- Total Attribute Length: 0x%04X", AttributeIDListLength);
while (AttributeIDListLength) while (AttributeIDListLength)
{ {
uint8_t AttributeLength = ServiceDiscovery_GetDataElementSize(CurrentParameter); uint8_t AttributeLength = ServiceDiscovery_GetDataElementSize(&CurrentParameter, &ElementHeaderSize);
uint32_t Attribute = 0;
BT_SDP_DEBUG(2, "-- Attribute Length: 0x%04X", AttributeLength); memcpy(&Attribute, CurrentParameter, AttributeLength);
CurrentParameter += AttributeLength;
BT_SDP_DEBUG(2, "-- Attribute(%d): 0x%08lX", AttributeLength, Attribute);
AttributeIDListLength -= AttributeLength; AttributeIDListLength -= (AttributeLength + ElementHeaderSize);
} }
} }
static uint32_t ServiceDiscovery_GetDataElementSize(void* DataElementHeader) static uint32_t ServiceDiscovery_GetDataElementSize(void** DataElementHeader, uint8_t* ElementHeaderSize)
{ {
uint8_t SizeIndex = (*((uint8_t*)DataElementHeader++) & 0x07); uint8_t SizeIndex = (*((uint8_t*)*DataElementHeader) & 0x07);
*DataElementHeader += sizeof(uint8_t);
*ElementHeaderSize = 1;
uint32_t ElementValue;
switch (SizeIndex) switch (SizeIndex)
{ {
case 0: case 0:
return 1; ElementValue = 1;
break;
case 1: case 1:
return 2; ElementValue = 2;
break;
case 2: case 2:
return 4; ElementValue = 4;
break;
case 3: case 3:
return 8; ElementValue = 8;
break;
case 4: case 4:
return 16; ElementValue = 16;
break;
case 5: case 5:
return *((uint8_t*)DataElementHeader++); ElementValue = *((uint8_t*)*DataElementHeader);
*DataElementHeader += sizeof(uint8_t);
*ElementHeaderSize = (1 + sizeof(uint8_t));
break;
case 6: case 6:
return *((uint16_t*)DataElementHeader++); ElementValue = *((uint16_t*)*DataElementHeader);
*DataElementHeader += sizeof(uint16_t);
*ElementHeaderSize = (1 + sizeof(uint16_t));
break;
default: default:
return *((uint32_t*)DataElementHeader++); ElementValue = *((uint32_t*)*DataElementHeader);
*DataElementHeader += sizeof(uint32_t);
*ElementHeaderSize = (1 + sizeof(uint32_t));
break;
} }
return ElementValue;
} }

@ -70,12 +70,14 @@
static void ServiceDiscovery_ProcessServiceAttribute(SDP_PDUHeader_t* SDPHeader); static void ServiceDiscovery_ProcessServiceAttribute(SDP_PDUHeader_t* SDPHeader);
static void ServiceDiscovery_ProcessServiceSearchAttribute(SDP_PDUHeader_t* SDPHeader); static void ServiceDiscovery_ProcessServiceSearchAttribute(SDP_PDUHeader_t* SDPHeader);
static inline uint16_t ServiceDiscovery_Read16BitParameter(void* AttributeHeader) static inline uint16_t ServiceDiscovery_Read16BitParameter(void** AttributeHeader)
{ {
return *((uint16_t*)AttributeHeader++); uint16_t ParamValue = *((uint16_t*)*AttributeHeader);
*AttributeHeader += sizeof(uint16_t);
return ParamValue;
} }
static uint32_t ServiceDiscovery_GetDataElementSize(void* AttributeHeader); static uint32_t ServiceDiscovery_GetDataElementSize(void** AttributeHeader, uint8_t* ElementHeaderSize);
#endif #endif
#endif #endif

@ -43,15 +43,18 @@
* - "Fingerlicking Wingdinger" (WARNING: Bad Language if no Javascript), a MIDI controller: http://noisybox.net/electronics/wingdinger/ * - "Fingerlicking Wingdinger" (WARNING: Bad Language if no Javascript), a MIDI controller: http://noisybox.net/electronics/wingdinger/
* - Garmin GPS USB to NMEA standard serial sentence translator: http://github.com/nall/garmin-transmogrifier/tree/master * - Garmin GPS USB to NMEA standard serial sentence translator: http://github.com/nall/garmin-transmogrifier/tree/master
* - Generic HID Device Creator: http://generichid.sourceforge.net/ * - Generic HID Device Creator: http://generichid.sourceforge.net/
* - NES Controller USB modification: http://projects.peterpolidoro.net/video/NESUSB.htm * - IR Remote to Keyboard decoder: http://netzhansa.blogspot.com/2010/04/our-living-room-hi-fi-setup-needs-mp3.html
* - LED Panel controller: http://projects.peterpolidoro.net/caltech/panelscontroller/panelscontroller.htm
* - Linux Secure Storage Dongle: http://github.com/TomMD/teensy * - Linux Secure Storage Dongle: http://github.com/TomMD/teensy
* - MakeTV Episode Dispenser: http://www.youtube.com/watch?v=BkWUi18hl3g * - MakeTV Episode Dispenser: http://www.youtube.com/watch?v=BkWUi18hl3g
* - Midimonster, a USB-to-MIDI gateway board: http://www.dorkbotpdx.org/wiki/midimonster * - MidiMonster, a USB-to-MIDI gateway board: http://www.dorkbotpdx.org/wiki/midimonster
* - NES Controller USB modification: http://projects.peterpolidoro.net/video/NESUSB.htm
* - Opendous-JTAG, an open source JTAG device: http://code.google.com/p/opendous-jtag/ * - Opendous-JTAG, an open source JTAG device: http://code.google.com/p/opendous-jtag/
* - Openkubus, an open source hardware-based authentication dongle: http://code.google.com/p/openkubus/ * - Openkubus, an open source hardware-based authentication dongle: http://code.google.com/p/openkubus/
* - Orbee, a USB connected RGB Orb for notifications: http://www.franksworkshop.com.au/Electronics/Orbee/Orbee.htm * - Orbee, a USB connected RGB Orb for notifications: http://www.franksworkshop.com.au/Electronics/Orbee/Orbee.htm
* - Programmable XBOX controller: http://richard-burke.dyndns.org/wordpress/pan-galactic-gargantuan-gargle-brain-aka-xbox-360-usb-controller/ * - Programmable XBOX controller: http://richard-burke.dyndns.org/wordpress/pan-galactic-gargantuan-gargle-brain-aka-xbox-360-usb-controller/
* - Reprap with LUFA, a LUFA powered 3D printer: http://code.google.com/p/at90usb1287-code-for-arduino-and-eclipse/ * - Reprap with LUFA, a LUFA powered 3D printer: http://code.google.com/p/at90usb1287-code-for-arduino-and-eclipse/
* - SD Card reader: http://elasticsheep.com/2010/04/teensy2-usb-mass-storage-with-an-sd-card/
* - SEGA Megadrive/Genesis Development Cartridge: http://www.makestuff.eu/wordpress/?page_id=398 * - SEGA Megadrive/Genesis Development Cartridge: http://www.makestuff.eu/wordpress/?page_id=398
* - Stripe Snoop, a Magnetic Card reader: http://www.ossguy.com/ss_usb/ * - Stripe Snoop, a Magnetic Card reader: http://www.ossguy.com/ss_usb/
* - USB Interface for Playstation Portable Devices: http://forums.ps2dev.org/viewtopic.php?t=11001 * - USB Interface for Playstation Portable Devices: http://forums.ps2dev.org/viewtopic.php?t=11001

@ -103,6 +103,7 @@
* - <b>LEDNotifier</b> - USB LED Notification project * - <b>LEDNotifier</b> - USB LED Notification project
* - <b>Magstripe</b> - Magnetic Stripe Card Reader project * - <b>Magstripe</b> - Magnetic Stripe Card Reader project
* - <b>MissileLaucher</b> - Toy Missile Launcher Host project * - <b>MissileLaucher</b> - Toy Missile Launcher Host project
* - <b>RelayBoard</b> - Relay board controller, controllable via the "sismpctl" Linux application
* - <b>TemperatureDataLogger</b> - Temperature Datalogging project, using the FatFS library * - <b>TemperatureDataLogger</b> - Temperature Datalogging project, using the FatFS library
* - <b>USBtoSerial</b> - USB to USART Serial Converter project * - <b>USBtoSerial</b> - USB to USART Serial Converter project
* - <b>Webserver</b> - RNDIS Host Webserver with DHCP client, powered by uIP TCP/IP stack project and FatFS library * - <b>Webserver</b> - RNDIS Host Webserver with DHCP client, powered by uIP TCP/IP stack project and FatFS library

@ -34,8 +34,8 @@
* void Bootloader_Jump_Check(void) ATTR_INIT_SECTION(3); * void Bootloader_Jump_Check(void) ATTR_INIT_SECTION(3);
* void Bootloader_Jump_Check(void) * void Bootloader_Jump_Check(void)
* { * {
* // If the bootloader key is correct, clear it and jump to the bootloader * // If the reset source was the bootloader and the key is correct, clear it and jump to the bootloader
* if (Boot_Key == MAGIC_BOOT_KEY) * if ((MCUSR & (1<<WDRF)) && (Boot_Key == MAGIC_BOOT_KEY))
* { * {
* Boot_Key = 0; * Boot_Key = 0;
* ((void (*)(void))BOOTLOADER_START_ADDRESS)(); * ((void (*)(void))BOOTLOADER_START_ADDRESS)();

Loading…
Cancel
Save