diff options
| -rw-r--r-- | sdpd/service.c | 51 | 
1 files changed, 47 insertions, 4 deletions
| diff --git a/sdpd/service.c b/sdpd/service.c index bbc7fcc8..e51f4aed 100644 --- a/sdpd/service.c +++ b/sdpd/service.c @@ -141,18 +141,61 @@ void set_service_classes_callback(service_classes_callback_t callback)  void create_ext_inquiry_response(const char *name, uint8_t *data)  { +	sdp_list_t *list = sdp_get_record_list(); +	uint8_t *ptr = data; +	uint16_t uuid[24]; +	int i, index = 0; +  	if (name) {  		int len = strlen(name);  		if (len > 48) {  			len = 48; -			data[1] = 0x08; +			ptr[1] = 0x08;  		} else -			data[1] = 0x09; +			ptr[1] = 0x09; + +		ptr[0] = len + 1; + +		memcpy(ptr + 2, name, len); + +		ptr += len + 2; +	} + +	ptr[1] = 0x03; + +	for (; list; list = list->next) { +		sdp_record_t *rec = (sdp_record_t *) list->data; + +		if (rec->svclass.type != SDP_UUID16) +			continue; + +		if (rec->svclass.value.uuid16 < 0x1100) +			continue; + +		if (index > 23) { +			ptr[1] = 0x02; +			break; +		} -		data[0] = len + 1; +		for (i = 0; i < index; i++) +			if (uuid[i] == rec->svclass.value.uuid16) +				break; -		memcpy(data + 2, name, len); +		if (i == index - 1) +			continue; + +		uuid[index++] = rec->svclass.value.uuid16; +	} + +	if (index > 0) { +		ptr[0] = (index * 2) + 1; +		ptr += 2; + +		for (i = 0; i < index; i++) { +			*ptr++ = (uuid[i] & 0x00ff); +			*ptr++ = (uuid[i] & 0xff00) >> 8; +		}  	}  } | 
