summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/sdptool.c65
1 files changed, 60 insertions, 5 deletions
diff --git a/tools/sdptool.c b/tools/sdptool.c
index afdc567a..fb1a0fbf 100644
--- a/tools/sdptool.c
+++ b/tools/sdptool.c
@@ -3029,9 +3029,57 @@ static int add_isync(sdp_session_t *session, svc_info_t *si)
return 0;
}
+static int add_semchla(sdp_session_t *session, svc_info_t *si)
+{
+ sdp_record_t record;
+ sdp_profile_desc_t profile;
+ sdp_list_t *root, *svclass, *proto, *profiles;
+ uuid_t root_uuid, service_uuid, l2cap_uuid, semchla_uuid;
+ uint16_t psm = 0xf0f9;
+
+ memset(&record, 0, sizeof(record));
+ record.handle = si->handle;
+
+ sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
+ root = sdp_list_append(NULL, &root_uuid);
+ sdp_set_browse_groups(&record, root);
+
+ sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
+ proto = sdp_list_append(NULL, sdp_list_append(
+ sdp_list_append(NULL, &l2cap_uuid), sdp_data_alloc(SDP_UINT16, &psm)));
+
+ sdp_uuid32_create(&semchla_uuid, 0x8e770300);
+ proto = sdp_list_append(proto, sdp_list_append(NULL, &semchla_uuid));
+
+ sdp_set_access_protos(&record, sdp_list_append(NULL, proto));
+
+ sdp_uuid32_create(&service_uuid, 0x8e771301);
+ svclass = sdp_list_append(NULL, &service_uuid);
+
+ sdp_set_service_classes(&record, svclass);
+
+ sdp_uuid32_create(&profile.uuid, 0x8e771302); // Headset
+ //sdp_uuid32_create(&profile.uuid, 0x8e771303); // Phone
+ profile.version = 0x0100;
+ profiles = sdp_list_append(NULL, &profile);
+ sdp_set_profile_descs(&record, profiles);
+
+ sdp_set_info_attr(&record, "SEMC HLA", NULL, NULL);
+
+ if (sdp_device_record_register(session, &interface, &record, SDP_RECORD_PERSIST) < 0) {
+ printf("Service Record registration failed\n");
+ return -1;
+ }
+
+ /* SEMC High Level Authentication */
+ printf("SEMC HLA service registered\n");
+
+ return 0;
+}
+
struct {
char *name;
- uint16_t class;
+ uint32_t class;
int (*add)(sdp_session_t *sess, svc_info_t *si);
unsigned char *uuid;
} service[] = {
@@ -3068,6 +3116,8 @@ struct {
{ "UDIUE", UDI_MT_SVCLASS_ID, add_udi_ue },
{ "UDITE", UDI_TA_SVCLASS_ID, add_udi_te },
+ { "SEMCHLA", 0x8e771301, add_semchla },
+
{ "SR1", 0, add_sr1, sr1_uuid },
{ "SYNCML", 0, add_syncml, syncml_uuid },
{ "ACTIVESYNC", 0, add_activesync, async_uuid },
@@ -3435,7 +3485,7 @@ static int cmd_search(int argc, char **argv)
{
struct search_context context;
unsigned char *uuid = NULL;
- uint16_t class = 0;
+ uint32_t class = 0;
bdaddr_t bdaddr;
int has_addr = 0;
int i;
@@ -3494,9 +3544,14 @@ static int cmd_search(int argc, char **argv)
}
}
- if (class)
- sdp_uuid16_create(&context.group, class);
- else
+ if (class) {
+ if (class & 0xffff0000)
+ sdp_uuid32_create(&context.group, class);
+ else {
+ uint16_t class16 = class & 0xffff;
+ sdp_uuid16_create(&context.group, class16);
+ }
+ } else
sdp_uuid128_create(&context.group, uuid);
if (has_addr)