40
40
#include <sys/types.h>
41
41
#include <sys/socket.h>
42
42
#include <sys/un.h>
44
#include <bluetooth/bluetooth.h>
45
#include <bluetooth/hci.h>
46
#include <bluetooth/hci_lib.h>
47
#include <bluetooth/l2cap.h>
48
#include <bluetooth/sdp.h>
49
#include <bluetooth/sdp_lib.h>
51
43
#include <netinet/in.h>
45
#include "bluetooth.h"
53
52
#define SDPINF(fmt, arg...) syslog(LOG_INFO, fmt "\n", ## arg)
54
53
#define SDPERR(fmt, arg...) syslog(LOG_ERR, "%s: " fmt "\n", __func__ , ## arg)
55
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
57
58
#define SDPDBG(fmt, arg...) syslog(LOG_DEBUG, "%s: " fmt "\n", __func__ , ## arg)
79
90
static inline void ntoh128(uint128_t *src, uint128_t *dst)
82
93
for (i = 0; i < 16; i++)
83
94
dst->data[15 - i] = src->data[i];
97
static inline void btoh128(uint128_t *src, uint128_t *dst)
99
memcpy(src, dst, sizeof(uint128_t));
87
104
#define hton64(x) ntoh64(x)
88
105
#define hton128(x, y) ntoh128(x, y)
106
#define htob128(x, y) btoh128(x, y)
90
108
#define BASE_UUID "00000000-0000-1000-8000-00805F9B34FB"
99
117
static sdp_data_t *sdp_copy_seq(sdp_data_t *data);
100
118
static int sdp_attr_add_new_with_length(sdp_record_t *rec,
101
119
uint16_t attr, uint8_t dtd, const void *value, uint32_t len);
120
static int sdp_gen_buffer(sdp_buf_t *buf, sdp_data_t *d);
103
122
/* Message structure. */
199
219
{ VIDEO_SOURCE_SVCLASS_ID, "Video Source" },
200
220
{ VIDEO_SINK_SVCLASS_ID, "Video Sink" },
201
221
{ VIDEO_DISTRIBUTION_SVCLASS_ID, "Video Distribution" },
202
{ MDP_SVCLASS_ID, "MDP" },
203
{ MDP_SOURCE_SVCLASS_ID, "MDP Source" },
204
{ MDP_SINK_SVCLASS_ID, "MDP Sink" },
222
{ HDP_SVCLASS_ID, "HDP" },
223
{ HDP_SOURCE_SVCLASS_ID, "HDP Source" },
224
{ HDP_SINK_SVCLASS_ID, "HDP Sink" },
205
225
{ APPLE_AGENT_SVCLASS_ID, "Apple Agent" },
226
{ GENERIC_ATTRIB_SVCLASS_ID, "Generic Attribute" },
683
static int sdp_get_data_type(sdp_buf_t *buf, uint8_t dtd)
687
data_type += sizeof(uint8_t);
694
data_type += sizeof(uint8_t);
700
data_type += sizeof(uint16_t);
706
data_type += sizeof(uint32_t);
711
buf->buf_size += data_type;
662
716
static int sdp_set_data_type(sdp_buf_t *buf, uint8_t dtd)
664
int orig = buf->data_size;
665
719
uint8_t *p = buf->data + buf->data_size;
668
buf->data_size += sizeof(uint8_t);
675
buf->data_size += sizeof(uint8_t);
681
buf->data_size += sizeof(uint16_t);
687
buf->data_size += sizeof(uint32_t);
691
return buf->data_size - orig;
722
data_type = sdp_get_data_type(buf, dtd);
723
buf->data_size += data_type;
694
728
void sdp_set_attrid(sdp_buf_t *buf, uint16_t attr)
711
for (d = sdpdata->val.dataseq; d; d = d->next)
712
n += sdp_gen_pdu(buf, d);
745
for (d = sdpdata->val.dataseq; d; d = d->next) {
747
n += sdp_gen_pdu(buf, d);
749
n += sdp_gen_buffer(buf, d);
755
static int sdp_get_data_size(sdp_buf_t *buf, sdp_data_t *d)
757
uint32_t data_size = 0;
758
uint8_t dtd = d->dtd;
764
data_size = sizeof(uint8_t);
767
data_size = sizeof(uint16_t);
770
data_size = sizeof(uint32_t);
773
data_size = sizeof(uint64_t);
776
data_size = sizeof(uint128_t);
780
data_size = sizeof(int8_t);
783
data_size = sizeof(int16_t);
786
data_size = sizeof(int32_t);
789
data_size = sizeof(int64_t);
792
data_size = sizeof(uint128_t);
800
data_size = d->unitSize - sizeof(uint8_t);
805
data_size = get_data_size(buf, d);
810
data_size = get_data_size(buf, d);
813
data_size = sizeof(uint16_t);
816
data_size = sizeof(uint32_t);
819
data_size = sizeof(uint128_t);
826
buf->buf_size += data_size;
831
static int sdp_gen_buffer(sdp_buf_t *buf, sdp_data_t *d)
833
int orig = buf->buf_size;
835
if (buf->buf_size == 0 && d->dtd == 0) {
836
/* create initial sequence */
837
buf->buf_size += sizeof(uint8_t);
839
/* reserve space for sequence size */
840
buf->buf_size += sizeof(uint8_t);
843
/* attribute length */
844
buf->buf_size += sizeof(uint8_t) + sizeof(uint16_t);
846
sdp_get_data_type(buf, d->dtd);
847
sdp_get_data_size(buf, d);
849
if (buf->buf_size > UCHAR_MAX && d->dtd == SDP_SEQ8)
850
buf->buf_size += sizeof(uint8_t);
852
return buf->buf_size - orig;
717
855
int sdp_gen_pdu(sdp_buf_t *buf, sdp_data_t *d)
719
857
uint32_t pdu_size = 0, data_size = 0;
726
864
uint8_t *seqp = buf->data + buf->data_size;
728
866
pdu_size = sdp_set_data_type(buf, dtd);
867
data_size = sdp_get_data_size(buf, d);
731
870
case SDP_DATA_NIL:
734
873
src = &d->val.uint8;
735
data_size = sizeof(uint8_t);
738
876
u16 = htons(d->val.uint16);
739
877
src = (unsigned char *) &u16;
740
data_size = sizeof(uint16_t);
743
880
u32 = htonl(d->val.uint32);
744
881
src = (unsigned char *) &u32;
745
data_size = sizeof(uint32_t);
748
884
u64 = hton64(d->val.uint64);
749
885
src = (unsigned char *) &u64;
750
data_size = sizeof(uint64_t);
752
887
case SDP_UINT128:
753
888
hton128(&d->val.uint128, &u128);
754
889
src = (unsigned char *) &u128;
755
data_size = sizeof(uint128_t);
759
893
src = (unsigned char *) &d->val.int8;
760
data_size = sizeof(int8_t);
763
896
u16 = htons(d->val.int16);
764
897
src = (unsigned char *) &u16;
765
data_size = sizeof(int16_t);
768
900
u32 = htonl(d->val.int32);
769
901
src = (unsigned char *) &u32;
770
data_size = sizeof(int32_t);
773
904
u64 = hton64(d->val.int64);
774
905
src = (unsigned char *) &u64;
775
data_size = sizeof(int64_t);
778
908
hton128(&d->val.int128, &u128);
779
909
src = (unsigned char *) &u128;
780
data_size = sizeof(uint128_t);
782
911
case SDP_TEXT_STR8:
783
912
case SDP_TEXT_STR16:
786
915
case SDP_URL_STR16:
787
916
case SDP_URL_STR32:
788
917
src = (unsigned char *) d->val.str;
789
data_size = d->unitSize - sizeof(uint8_t);
790
918
sdp_set_seq_len(seqp, data_size);
796
data_size = get_data_size(buf, d);
797
924
sdp_set_seq_len(seqp, data_size);
803
data_size = get_data_size(buf, d);
804
930
sdp_set_seq_len(seqp, data_size);
807
933
u16 = htons(d->val.uuid.value.uuid16);
808
934
src = (unsigned char *) &u16;
809
data_size = sizeof(uint16_t);
812
937
u32 = htonl(d->val.uuid.value.uuid32);
813
938
src = (unsigned char *) &u32;
814
data_size = sizeof(uint32_t);
816
940
case SDP_UUID128:
817
941
src = (unsigned char *) &d->val.uuid.value.uuid128;
818
data_size = sizeof(uint128_t);
840
963
sdp_append_to_pdu((sdp_buf_t *)udata, (sdp_data_t *)value);
966
static void sdp_attr_size(void *value, void *udata)
968
sdp_gen_buffer((sdp_buf_t *)udata, (sdp_data_t *)value);
843
971
int sdp_gen_record_pdu(const sdp_record_t *rec, sdp_buf_t *buf)
845
buf->data = malloc(SDP_PDU_CHUNK_SIZE);
973
memset(buf, 0, sizeof(sdp_buf_t));
974
sdp_list_foreach(rec->attrlist, sdp_attr_size, buf);
976
buf->data = malloc(buf->buf_size);
849
buf->buf_size = SDP_PDU_CHUNK_SIZE;
850
979
buf->data_size = 0;
851
980
memset(buf->data, 0, buf->buf_size);
852
982
sdp_list_foreach(rec->attrlist, sdp_attr_pdu, buf);
1042
1174
sdp_data_t *d = malloc(sizeof(sdp_data_t));
1044
1179
SDPDBG("Extracting UUID");
1045
1180
memset(d, 0, sizeof(sdp_data_t));
1046
1181
if (sdp_uuid_extract(p, bufsize, &d->val.uuid, len) < 0) {
1050
d->dtd = *(uint8_t *) p;
1052
1187
sdp_pattern_add_uuid(rec, &d->val.uuid);
1191
1328
sdp_data_t *curr, *prev;
1192
1329
sdp_data_t *d = malloc(sizeof(sdp_data_t));
1194
1334
SDPDBG("Extracting SEQ");
1195
1335
memset(d, 0, sizeof(sdp_data_t));
1196
1336
*len = sdp_extract_seqtype(p, bufsize, &d->dtd, &seqlen);
1632
1772
uint8_t *rspbuf, uint32_t reqsize, uint32_t *rspsize)
1635
sdp_pdu_hdr_t *reqhdr = (sdp_pdu_hdr_t *)reqbuf;
1636
sdp_pdu_hdr_t *rsphdr = (sdp_pdu_hdr_t *)rspbuf;
1775
sdp_pdu_hdr_t *reqhdr = (sdp_pdu_hdr_t *) reqbuf;
1776
sdp_pdu_hdr_t *rsphdr = (sdp_pdu_hdr_t *) rspbuf;
1639
1779
if (0 > sdp_send_req(session, reqbuf, reqsize)) {
1769
1909
for (; list; list = list->next) {
1771
1911
for (p = list->data; p; p = p->next) {
1772
sdp_data_t *seq = (sdp_data_t *) p->data;
1912
sdp_data_t *seq = p->data;
1773
1913
if (SDP_IS_UUID(seq->dtd) &&
1774
1914
sdp_uuid_to_proto(&seq->val.uuid) == proto)
1775
1915
return seq->next;
1835
1975
for (d = sdpdata->val.dataseq; d; d = d->next) {
1837
if (d->dtd < SDP_UUID16 || d->dtd > SDP_UUID128)
1977
if (d->dtd < SDP_UUID16 || d->dtd > SDP_UUID128) {
1840
1982
u = malloc(sizeof(uuid_t));
1841
1986
memset(u, 0, sizeof(uuid_t));
1842
1987
*u = d->val.uuid;
1843
1988
*seqp = sdp_list_append(*seqp, u);
1862
2007
len = sdp_list_len(seq);
1863
2008
if (!seq || len == 0)
1865
dtds = (void **)malloc(len * sizeof(void *));
1866
values = (void **)malloc(len * sizeof(void *));
2010
dtds = malloc(len * sizeof(void *));
2014
values = malloc(len * sizeof(void *));
1867
2020
for (p = seq, i = 0; i < len; i++, p = p->next) {
1868
uuid_t *uuid = (uuid_t *)p->data;
2021
uuid_t *uuid = p->data;
1870
2023
switch (uuid->type) {
1871
2024
case SDP_UUID16:
1915
2068
sdp_data_t *pCode = curr_data;
1916
2069
sdp_data_t *pEncoding = pCode->next;
1917
2070
sdp_data_t *pOffset = pEncoding->next;
1918
if (pCode && pEncoding && pOffset) {
2071
if (pEncoding && pOffset) {
1919
2072
lang = malloc(sizeof(sdp_lang_attr_t));
2074
sdp_list_free(*langSeq, free);
1920
2078
lang->code_ISO639 = pCode->val.uint16;
1921
2079
lang->encoding = pEncoding->val.uint16;
1922
2080
lang->base_offset = pOffset->val.uint16;
2100
2263
const char *desc)
2103
sdp_attr_add_new(rec, SDP_ATTR_SVCNAME_PRIMARY, SDP_TEXT_STR8,
2266
sdp_attr_add_new(rec, SDP_ATTR_SVCNAME_PRIMARY,
2267
SDP_TEXT_STR8, name);
2106
sdp_attr_add_new(rec, SDP_ATTR_PROVNAME_PRIMARY, SDP_TEXT_STR8,
2269
sdp_attr_add_new(rec, SDP_ATTR_PROVNAME_PRIMARY,
2270
SDP_TEXT_STR8, prov);
2109
sdp_attr_add_new(rec, SDP_ATTR_SVCDESC_PRIMARY, SDP_TEXT_STR8,
2272
sdp_attr_add_new(rec, SDP_ATTR_SVCDESC_PRIMARY,
2273
SDP_TEXT_STR8, desc);
2113
2276
static sdp_data_t *access_proto_to_dataseq(sdp_record_t *rec, sdp_list_t *proto)
2121
2284
seqlen = sdp_list_len(proto);
2122
seqDTDs = (void **)malloc(seqlen * sizeof(void *));
2123
seqs = (void **)malloc(seqlen * sizeof(void *));
2285
seqDTDs = malloc(seqlen * sizeof(void *));
2289
seqs = malloc(seqlen * sizeof(void *));
2124
2295
for (i = 0, p = proto; p; p = p->next, i++) {
2125
sdp_list_t *elt = (sdp_list_t *)p->data;
2296
sdp_list_t *elt = p->data;
2127
2298
uuid_t *uuid = NULL;
2128
2299
unsigned int pslen = 0;
2129
for (; elt && pslen < sizeof(dtds); elt = elt->next, pslen++) {
2130
sdp_data_t *d = (sdp_data_t *)elt->data;
2300
for (; elt && pslen < ARRAY_SIZE(dtds); elt = elt->next, pslen++) {
2301
sdp_data_t *d = elt->data;
2131
2302
dtds[pslen] = &d->dtd;
2132
2303
switch (d->dtd) {
2133
2304
case SDP_UUID16:
2192
2363
sdp_data_t *protos = NULL;
2194
2365
for (p = ap; p; p = p->next) {
2195
sdp_data_t *seq = access_proto_to_dataseq(rec,
2196
(sdp_list_t *) p->data);
2366
sdp_data_t *seq = access_proto_to_dataseq(rec, p->data);
2197
2367
protos = sdp_seq_append(protos, seq);
2208
2378
sdp_data_t *protos = NULL;
2210
2380
for (p = ap; p; p = p->next) {
2211
sdp_data_t *seq = access_proto_to_dataseq(rec,
2212
(sdp_list_t *) p->data);
2381
sdp_data_t *seq = access_proto_to_dataseq(rec, p->data);
2213
2382
protos = sdp_seq_append(protos, seq);
2240
2409
uint8_t uint16 = SDP_UINT16;
2241
2410
int status = 0, i = 0, seqlen = sdp_list_len(seq);
2242
void **dtds = (void **)malloc(3 * seqlen * sizeof(void *));
2243
void **values = (void **)malloc(3 * seqlen * sizeof(void *));
2411
void **dtds, **values;
2244
2412
const sdp_list_t *p;
2414
dtds = malloc(3 * seqlen * sizeof(void *));
2418
values = malloc(3 * seqlen * sizeof(void *));
2246
2424
for (p = seq; p; p = p->next) {
2247
sdp_lang_attr_t *lang = (sdp_lang_attr_t *)p->data;
2425
sdp_lang_attr_t *lang = p->data;
2344
2522
uint8_t uuid128 = SDP_UUID128;
2345
2523
uint8_t uint16 = SDP_UINT16;
2346
2524
int i = 0, seqlen = sdp_list_len(profiles);
2347
void **seqDTDs = (void **)malloc(seqlen * sizeof(void *));
2348
void **seqs = (void **)malloc(seqlen * sizeof(void *));
2525
void **seqDTDs, **seqs;
2349
2526
const sdp_list_t *p;
2528
seqDTDs = malloc(seqlen * sizeof(void *));
2532
seqs = malloc(seqlen * sizeof(void *));
2351
2538
for (p = profiles; p; p = p->next) {
2352
2539
sdp_data_t *seq;
2353
2540
void *dtds[2], *values[2];
2354
sdp_profile_desc_t *profile = (sdp_profile_desc_t *)p->data;
2541
sdp_profile_desc_t *profile = p->data;
2355
2542
if (!profile) {
2444
2631
* UUID comparison function
2445
2632
* returns 0 if uuidValue1 == uuidValue2 else -1
2634
int sdp_uuid_cmp(const void *p1, const void *p2)
2636
uuid_t *u1 = sdp_uuid_to_uuid128(p1);
2637
uuid_t *u2 = sdp_uuid_to_uuid128(p2);
2640
ret = sdp_uuid128_cmp(u1, u2);
2649
* UUID comparison function
2650
* returns 0 if uuidValue1 == uuidValue2 else -1
2447
2652
int sdp_uuid16_cmp(const void *p1, const void *p2)
2449
const uuid_t *u1 = (const uuid_t *)p1;
2450
const uuid_t *u2 = (const uuid_t *)p2;
2654
const uuid_t *u1 = p1;
2655
const uuid_t *u2 = p2;
2451
2656
return memcmp(&u1->value.uuid16, &u2->value.uuid16, sizeof(uint16_t));
2467
2672
* yet to be implemented. Note that the input is in NBO in
2468
2673
* both 32 and 128 bit UUIDs and conversion is needed
2470
void sdp_uuid16_to_uuid128(uuid_t *uuid128, uuid_t *uuid16)
2675
void sdp_uuid16_to_uuid128(uuid_t *uuid128, const uuid_t *uuid16)
2473
2678
* We have a 16 bit value, which needs to be added to
2489
2694
memcpy(&uuid128->value.uuid128.data[2], &data1, 2);
2492
void sdp_uuid32_to_uuid128(uuid_t *uuid128, uuid_t *uuid32)
2697
void sdp_uuid32_to_uuid128(uuid_t *uuid128, const uuid_t *uuid32)
2495
2700
* We have a 32 bit value, which needs to be added to
2511
2716
memcpy(&uuid128->value.uuid128.data[0], &data0, 4);
2514
uuid_t *sdp_uuid_to_uuid128(uuid_t *uuid)
2719
uuid_t *sdp_uuid_to_uuid128(const uuid_t *uuid)
2516
2721
uuid_t *uuid128 = bt_malloc(sizeof(uuid_t));
2517
2726
memset(uuid128, 0, sizeof(uuid_t));
2518
2727
switch (uuid->type) {
2519
2728
case SDP_UUID128:
2585
2794
void sdp_append_to_buf(sdp_buf_t *dst, uint8_t *data, uint32_t len)
2587
2796
uint8_t *p = dst->data;
2588
uint8_t dtd = *(uint8_t *) p;
2590
2799
SDPDBG("Append src size: %d\n", len);
2591
2800
SDPDBG("Append dst size: %d\n", dst->data_size);
2592
2801
SDPDBG("Dst buffer size: %d\n", dst->buf_size);
2593
if (dst->data_size + len > dst->buf_size) {
2594
int need = SDP_PDU_CHUNK_SIZE * ((len / SDP_PDU_CHUNK_SIZE) + 1);
2595
dst->data = realloc(dst->data, dst->buf_size + need);
2597
SDPDBG("Realloc'ing : %d\n", need);
2599
if (dst->data == NULL) {
2600
SDPERR("Realloc fails \n");
2602
dst->buf_size += need;
2604
2802
if (dst->data_size == 0 && dtd == 0) {
2605
2803
/* create initial sequence */
2606
*(uint8_t *)p = SDP_SEQ8;
2607
2805
p += sizeof(uint8_t);
2608
2806
dst->data_size += sizeof(uint8_t);
2609
2807
/* reserve space for sequence size */
2614
2812
memcpy(dst->data + dst->data_size, data, len);
2615
2813
dst->data_size += len;
2617
dtd = *(uint8_t *)dst->data;
2815
dtd = *(uint8_t *) dst->data;
2618
2816
if (dst->data_size > UCHAR_MAX && dtd == SDP_SEQ8) {
2619
2817
short offset = sizeof(uint8_t) + sizeof(uint8_t);
2620
2818
memmove(dst->data + offset + 1, dst->data + offset,
2621
2819
dst->data_size - offset);
2623
*(uint8_t *) p = SDP_SEQ16;
2624
2822
p += sizeof(uint8_t);
2625
2823
dst->data_size += 1;
2643
2841
void sdp_append_to_pdu(sdp_buf_t *pdu, sdp_data_t *d)
2646
2843
sdp_buf_t append;
2648
2845
memset(&append, 0, sizeof(sdp_buf_t));
2650
append.buf_size = sizeof(buf);
2651
append.data_size = 0;
2846
sdp_gen_buffer(&append, d);
2847
append.data = malloc(append.buf_size);
2653
2851
sdp_set_attrid(&append, d->attrId);
2654
2852
sdp_gen_pdu(&append, d);
2655
2853
sdp_append_to_buf(pdu, append.data, append.data_size);
2968
3159
sdp_record_t *sdp_record_alloc()
2970
3161
sdp_record_t *rec = malloc(sizeof(sdp_record_t));
2971
memset((void *)rec, 0, sizeof(sdp_record_t));
3166
memset(rec, 0, sizeof(sdp_record_t));
2972
3167
rec->handle = 0xffffffff;
2988
3183
uuid_t *uuid128 = sdp_uuid_to_uuid128(uuid);
2990
SDPDBG("SvcRec : 0x%lx\n", (unsigned long)rec);
2991
3185
SDPDBG("Elements in target pattern : %d\n", sdp_list_len(rec->pattern));
2992
SDPDBG("Trying to add : 0x%lx\n", (unsigned long)uuid128);
3186
SDPDBG("Trying to add : 0x%lx\n", (unsigned long) uuid128);
2994
3188
if (sdp_list_find(rec->pattern, uuid128, sdp_uuid128_cmp) == NULL)
2995
3189
rec->pattern = sdp_list_insert_sorted(rec->pattern, uuid128, sdp_uuid128_cmp);
3050
3244
// Fill up the value and the dtd arrays
3053
memset(&buf, 0, sizeof(sdp_buf_t));
3054
buf.data = malloc(512);
3060
3247
SDPDBG("Seq length : %d\n", seqlen);
3062
3249
types = malloc(seqlen * sizeof(void *));
3063
3253
values = malloc(seqlen * sizeof(void *));
3064
3259
for (i = 0; i < seqlen; i++) {
3065
3260
void *data = seq->data;
3066
3261
types[i] = &dtd;
3073
3268
dataseq = sdp_seq_alloc(types, values, seqlen);
3275
memset(&buf, 0, sizeof(sdp_buf_t));
3276
sdp_gen_buffer(&buf, dataseq);
3277
buf.data = malloc(buf.buf_size);
3280
sdp_data_free(dataseq);
3074
3286
SDPDBG("Data Seq : 0x%p\n", seq);
3075
3287
seqlen = sdp_gen_pdu(&buf, dataseq);
3076
3288
SDPDBG("Copying : %d\n", buf.data_size);
3312
3522
* The service record
3314
sdp_record_t *sdp_service_attr_req(sdp_session_t *session, uint32_t handle,
3524
sdp_record_t *sdp_service_attr_req(sdp_session_t *session, uint32_t handle,
3315
3525
sdp_attrreq_type_t reqtype, const sdp_list_t *attrids)
3318
3527
uint32_t reqsize = 0, _reqsize;
3319
3528
uint32_t rspsize = 0, rsp_count;
3320
3529
int attr_list_len = 0;
3331
3540
if (reqtype != SDP_ATTR_REQ_INDIVIDUAL && reqtype != SDP_ATTR_REQ_RANGE) {
3332
3541
errno = EINVAL;
3545
memset(&rsp_concat_buf, 0, sizeof(sdp_buf_t));
3336
3547
reqbuf = malloc(SDP_REQ_BUFFER_SIZE);
3337
3548
rspbuf = malloc(SDP_RSP_BUFFER_SIZE);
3338
3549
if (!reqbuf || !rspbuf) {
3339
3550
errno = ENOMEM;
3343
memset((char *) &rsp_concat_buf, 0, sizeof(sdp_buf_t));
3344
3553
reqhdr = (sdp_pdu_hdr_t *) reqbuf;
3345
3554
reqhdr->pdu_id = SDP_SVC_ATTR_REQ;
3358
3567
pdata += sizeof(uint16_t);
3360
3569
// get attr seq PDU form
3361
seqlen = gen_attridseq_pdu(pdata, attrids,
3570
seqlen = gen_attridseq_pdu(pdata, attrids,
3362
3571
reqtype == SDP_ATTR_REQ_INDIVIDUAL? SDP_UINT16 : SDP_UINT32);
3363
3572
if (seqlen == -1) {
3364
3573
errno = EINVAL;
3368
3576
pdata += seqlen;
3389
3599
if (rspsize < sizeof(sdp_pdu_hdr_t)) {
3390
3600
SDPERR("Unexpected end of packet");
3396
3604
rsphdr = (sdp_pdu_hdr_t *) rspbuf;
3397
3605
if (rsphdr->pdu_id == SDP_ERROR_RSP) {
3398
3606
SDPDBG("PDU ID : 0x%x\n", rsphdr->pdu_id);
3402
3609
pdata = rspbuf + sizeof(sdp_pdu_hdr_t);
3426
3631
SDPDBG("sdp_cstate_t length : %d\n", cstate_len);
3429
* a split response: concatenate intermediate responses
3634
* a split response: concatenate intermediate responses
3430
3635
* and the last one (which has cstate_len == 0)
3432
3637
if (cstate_len > 0 || rsp_concat_buf.data_size != 0) {
3549
3748
* This function starts an asynchronous service search request.
3550
* The incomming and outgoing data are stored in the transaction structure
3749
* The incomming and outgoing data are stored in the transaction structure
3551
3750
* buffers. When there is incomming data the sdp_process function must be
3552
3751
* called to get the data and handle the continuation state.
3585
3784
t = session->priv;
3587
/* check if the buffer is already allocated */
3588
if (t->rsp_concat_buf.data)
3589
free(t->rsp_concat_buf.data);
3786
/* clean possible allocated buffer */
3787
free(t->rsp_concat_buf.data);
3590
3788
memset(&t->rsp_concat_buf, 0, sizeof(sdp_buf_t));
3592
3790
if (!t->reqbuf) {
3644
3840
* This function starts an asynchronous service attribute request.
3645
* The incomming and outgoing data are stored in the transaction structure
3841
* The incomming and outgoing data are stored in the transaction structure
3646
3842
* buffers. When there is incomming data the sdp_process function must be
3647
3843
* called to get the data and handle the continuation state.
3689
3885
t = session->priv;
3691
/* check if the buffer is already allocated */
3692
if (t->rsp_concat_buf.data)
3693
free(t->rsp_concat_buf.data);
3887
/* clean possible allocated buffer */
3888
free(t->rsp_concat_buf.data);
3694
3889
memset(&t->rsp_concat_buf, 0, sizeof(sdp_buf_t));
3696
3891
if (!t->reqbuf) {
3804
3997
t = session->priv;
3806
/* check if the buffer is already allocated */
3807
if (t->rsp_concat_buf.data)
3808
free(t->rsp_concat_buf.data);
3999
/* clean possible allocated buffer */
4000
free(t->rsp_concat_buf.data);
3809
4001
memset(&t->rsp_concat_buf, 0, sizeof(sdp_buf_t));
3811
4003
if (!t->reqbuf) {
4012
4202
case SDP_SVC_SEARCH_ATTR_RSP:
4013
4203
rsp_count = ntohs(bt_get_unaligned((uint16_t *) pdata));
4014
4204
SDPDBG("Attrlist byte count : %d\n", rsp_count);
4017
4207
* Number of bytes in the AttributeLists parameter(without
4018
4208
* continuation state) + AttributeListsByteCount field size.
4074
4264
// set the request header's param length
4075
4265
reqhdr->plen = htons(reqsize - sizeof(sdp_pdu_hdr_t));
4077
4267
if (sdp_send_req(session, t->reqbuf, reqsize) < 0) {
4078
4268
SDPERR("Error sendind data:%s(%d)", strerror(errno), errno);
4079
4269
status = 0xffff;
4391
4577
sa.sun_family = AF_UNIX;
4392
4578
strcpy(sa.sun_path, SDP_UNIX_PATH);
4394
return connect(session->sock, (struct sockaddr *)&sa, sizeof(sa));
4580
return connect(session->sock, (struct sockaddr *) &sa, sizeof(sa));
4397
4583
static int sdp_connect_l2cap(const bdaddr_t *src,
4491
4676
return session->tid++;
4680
* Set the supported features
4682
int sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf)
4684
const sdp_list_t *p, *r;
4685
sdp_data_t *feat, *seq_feat;
4687
void **seqDTDs, **seqVals;
4689
seqlen = sdp_list_len(sf);
4690
seqDTDs = malloc(seqlen * sizeof(void *));
4693
seqVals = malloc(seqlen * sizeof(void *));
4699
for (p = sf, i = 0; p; p = p->next, i++) {
4701
void **dtds, **vals;
4704
plen = sdp_list_len(p->data);
4705
dtds = malloc(plen * sizeof(void *));
4708
vals = malloc(plen * sizeof(void *));
4713
lengths = malloc(plen * sizeof(int *));
4719
for (r = p->data, j = 0; r; r = r->next, j++) {
4720
sdp_data_t *data = (sdp_data_t*)r->data;
4721
dtds[j] = &data->dtd;
4722
switch (data->dtd) {
4726
case SDP_TEXT_STR16:
4727
vals[j] = data->val.str;
4728
lengths[j] = data->unitSize - sizeof(uint8_t);
4736
vals[j] = data->val.dataseq;
4740
vals[j] = &data->val;
4745
feat = sdp_seq_alloc_with_length(dtds, vals, lengths, plen);
4751
seqDTDs[i] = &feat->dtd;
4754
seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen);
4757
sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat);
4770
* Get the supported features
4771
* If an error occurred -1 is returned and errno is set
4773
int sdp_get_supp_feat(const sdp_record_t *rec, sdp_list_t **seqp)
4775
sdp_data_t *sdpdata, *d;
4779
sdpdata = sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST);
4781
if (!sdpdata || sdpdata->dtd < SDP_SEQ8 || sdpdata->dtd > SDP_SEQ32)
4782
return sdp_get_uuidseq_attr(rec,
4783
SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp);
4785
for (d = sdpdata->val.dataseq; d; d = d->next) {
4789
if (d->dtd < SDP_SEQ8 || d->dtd > SDP_SEQ32)
4794
for (dd = d->val.dataseq; dd; dd = dd->next) {
4803
case SDP_TEXT_STR16:
4805
length = dd->unitSize - sizeof(uint8_t);
4816
data = sdp_data_alloc_with_length(dd->dtd, val, length);
4818
subseq = sdp_list_append(subseq, data);
4820
tseq = sdp_list_append(tseq, subseq);
4830
sdp_list_free(tseq, free);