summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hcid/dbus-database.c11
-rw-r--r--hcid/dbus-hci.c24
-rw-r--r--hcid/dbus-hci.h1
-rw-r--r--hcid/hcid.conf2
-rw-r--r--hcid/main.c3
-rw-r--r--hcid/manager.c26
-rw-r--r--hcid/manager.h2
-rw-r--r--sdpd/sdpd.h2
-rw-r--r--sdpd/service.c11
9 files changed, 78 insertions, 4 deletions
diff --git a/hcid/dbus-database.c b/hcid/dbus-database.c
index 1c770c83..384df032 100644
--- a/hcid/dbus-database.c
+++ b/hcid/dbus-database.c
@@ -44,6 +44,7 @@
#include "hcid.h"
#include "sdpd.h"
#include "sdp-xml.h"
+#include "manager.h"
#include "adapter.h"
#include "dbus-hci.h"
#include "dbus-common.h"
@@ -85,6 +86,8 @@ static void exit_callback(const char *name, void *user_data)
else
unregister_sdp_record(user_record->handle);
+ update_class_of_device();
+
if (user_record->sender)
g_free(user_record->sender);
@@ -145,6 +148,8 @@ static DBusHandlerResult add_service_record(DBusConnection *conn,
}
}
+ update_class_of_device();
+
sender = dbus_message_get_sender(msg);
user_record->sender = g_strdup(sender);
@@ -206,6 +211,8 @@ static DBusHandlerResult add_service_record_from_xml(DBusConnection *conn,
sdp_record_free(sdp_record);
}
+ update_class_of_device();
+
sender = dbus_message_get_sender(msg);
user_record->sender = g_strdup(sender);
@@ -255,6 +262,8 @@ static DBusHandlerResult update_record(DBusConnection *conn, DBusMessage *msg,
}
}
+ update_class_of_device();
+
return send_message_and_unref(conn,
dbus_message_new_method_return(msg));
}
@@ -357,6 +366,8 @@ static DBusHandlerResult remove_service_record(DBusConnection *conn,
else
unregister_sdp_record(handle);
+ update_class_of_device();
+
if (user_record->sender)
g_free(user_record->sender);
diff --git a/hcid/dbus-hci.c b/hcid/dbus-hci.c
index a8ae676c..77a93421 100644
--- a/hcid/dbus-hci.c
+++ b/hcid/dbus-hci.c
@@ -1666,8 +1666,28 @@ int set_limited_discoverable(int dd, const uint8_t *cls, gboolean limited)
if (hci_write_class_of_dev(dd, dev_class, 1000) < 0) {
err = errno;
- error("Can't write class of device: %s(%d)",
- strerror(err), err);
+ error("Can't write class of device: %s (%d)",
+ strerror(err), err);
+ return -err;
+ }
+
+ return 0;
+}
+
+int set_service_classes(int dd, const uint8_t *cls, uint8_t value)
+{
+ uint32_t dev_class;
+ int err;
+
+ if (cls[2] == value)
+ return 0; /* Already set */
+
+ dev_class = (value << 16) | (cls[1] << 8) | cls[0];
+
+ if (hci_write_class_of_dev(dd, dev_class, 1000) < 0) {
+ err = errno;
+ error("Can't write class of device: %s (%d)",
+ strerror(err), err);
return -err;
}
diff --git a/hcid/dbus-hci.h b/hcid/dbus-hci.h
index 385ed96c..6c0a662f 100644
--- a/hcid/dbus-hci.h
+++ b/hcid/dbus-hci.h
@@ -69,6 +69,7 @@ int found_device_add(GSList **list, bdaddr_t *bdaddr, int8_t rssi,
int found_device_req_name(struct adapter *dbus_data);
int set_limited_discoverable(int dd, const uint8_t *cls, gboolean limited);
+int set_service_classes(int dd, const uint8_t *cls, uint8_t value);
int discov_timeout_handler(void *data);
diff --git a/hcid/hcid.conf b/hcid/hcid.conf
index 77c743a7..b6ce3b48 100644
--- a/hcid/hcid.conf
+++ b/hcid/hcid.conf
@@ -32,7 +32,7 @@ device {
name "BlueZ (%d)";
# Local device class
- class 0x3e0100;
+ class 0x000100;
# Default packet type
#pkt_type DH1,DM1,HV1;
diff --git a/hcid/main.c b/hcid/main.c
index bd470c87..75229fba 100644
--- a/hcid/main.c
+++ b/hcid/main.c
@@ -467,12 +467,15 @@ static void configure_device(int dev_id)
if (read_local_class(&di.bdaddr, cls) < 0) {
class = htobl(device_opts->class);
+ cls[2] = get_service_classes();
memcpy(cp.dev_class, &class, 3);
} else {
if (!(device_opts->scan & SCAN_INQUIRY))
cls[1] &= 0xdf; /* Clear discoverable bit */
+ cls[2] = get_service_classes();
memcpy(cp.dev_class, cls, 3);
}
+
hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_CLASS_OF_DEV,
WRITE_CLASS_OF_DEV_CP_SIZE, &cp);
}
diff --git a/hcid/manager.c b/hcid/manager.c
index 50cd698e..c03cdc3f 100644
--- a/hcid/manager.c
+++ b/hcid/manager.c
@@ -42,6 +42,7 @@
#include <dbus/dbus.h>
#include "hcid.h"
+#include "sdpd.h"
#include "adapter.h"
#include "dbus.h"
#include "dbus-helper.h"
@@ -328,3 +329,28 @@ void set_default_adapter(int new_default)
{
default_adapter_id = new_default;
}
+
+void update_class_of_device(void)
+{
+ uint8_t value = get_service_classes();
+ uint8_t cls[3];
+ int dd, dev_id = default_adapter_id;
+
+ if (dev_id < 0)
+ return;
+
+ dd = hci_open_dev(dev_id);
+ if (dd < 0)
+ return;
+
+ if (hci_read_class_of_dev(dd, cls, 1000) < 0) {
+ error("Can't read class of device on hci%d: %s (%d)",
+ dev_id, strerror(errno), errno);
+ hci_close_dev(dd);
+ return;
+ }
+
+ set_service_classes(dd, cls, value);
+
+ hci_close_dev(dd);
+}
diff --git a/hcid/manager.h b/hcid/manager.h
index eef0dd36..41127bab 100644
--- a/hcid/manager.h
+++ b/hcid/manager.h
@@ -28,3 +28,5 @@ dbus_bool_t manager_init(DBusConnection *conn, const char *path);
int get_default_adapter(void);
void set_default_adapter(int new_default);
+
+void update_class_of_device(void);
diff --git a/sdpd/sdpd.h b/sdpd/sdpd.h
index d3d45b85..dbb1ee09 100644
--- a/sdpd/sdpd.h
+++ b/sdpd/sdpd.h
@@ -86,3 +86,5 @@ void stop_sdp_server(void);
int add_record_to_server(sdp_record_t *rec);
int remove_record_from_server(uint32_t handle);
+
+uint8_t get_service_classes(void);
diff --git a/sdpd/service.c b/sdpd/service.c
index e37a0c38..f84ddc9a 100644
--- a/sdpd/service.c
+++ b/sdpd/service.c
@@ -42,7 +42,9 @@
#include "sdpd.h"
#include "logging.h"
-static sdp_record_t *server;
+static sdp_record_t *server = NULL;
+
+static uint8_t service_classes = 0x00;
/*
* List of version numbers supported by the SDP server.
@@ -117,6 +119,13 @@ static void update_svclass_list(void)
}
debug("Service classes 0x%02x", val);
+
+ service_classes = val;
+}
+
+uint8_t get_service_classes(void)
+{
+ return service_classes;
}
void register_public_browse_group(void)