summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2008-09-29 10:19:41 +0200
committerMarcel Holtmann <marcel@holtmann.org>2008-09-29 10:19:41 +0200
commit491fcac03898cdd75aecd0eef165712e8d0efa83 (patch)
tree5fd5d853a9f46496b10ac62a509cc67e5e6a8f76
parent747ce6f32a88e5f2c7df6bc94ca006bbdaff5bd6 (diff)
Add functions to write major and minor device class
-rw-r--r--src/dbus-hci.c41
-rw-r--r--src/dbus-hci.h2
2 files changed, 38 insertions, 5 deletions
diff --git a/src/dbus-hci.c b/src/dbus-hci.c
index eea166e7..c6f3bb96 100644
--- a/src/dbus-hci.c
+++ b/src/dbus-hci.c
@@ -1143,7 +1143,6 @@ void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status,
int set_limited_discoverable(int dd, const uint8_t *cls, gboolean limited)
{
uint32_t dev_class;
- int err;
int num = (limited ? 2 : 1);
uint8_t lap[] = { 0x33, 0x8b, 0x9e, 0x00, 0x8b, 0x9e };
/*
@@ -1151,7 +1150,7 @@ int set_limited_discoverable(int dd, const uint8_t *cls, gboolean limited)
* 2: giac + liac
*/
if (hci_write_current_iac_lap(dd, num, lap, HCI_REQ_TIMEOUT) < 0) {
- err = errno;
+ int err = errno;
error("Can't write current IAC LAP: %s(%d)",
strerror(err), err);
return -err;
@@ -1170,7 +1169,7 @@ int set_limited_discoverable(int dd, const uint8_t *cls, gboolean limited)
}
if (hci_write_class_of_dev(dd, dev_class, HCI_REQ_TIMEOUT) < 0) {
- err = errno;
+ int err = errno;
error("Can't write class of device: %s (%d)",
strerror(err), err);
return -err;
@@ -1182,7 +1181,6 @@ 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)
{
uint32_t dev_class;
- int err;
if (cls[2] == value)
return 0; /* Already set */
@@ -1190,7 +1188,40 @@ int set_service_classes(int dd, const uint8_t *cls, uint8_t value)
dev_class = (value << 16) | (cls[1] << 8) | cls[0];
if (hci_write_class_of_dev(dd, dev_class, HCI_REQ_TIMEOUT) < 0) {
- err = errno;
+ int err = errno;
+ error("Can't write class of device: %s (%d)",
+ strerror(err), err);
+ return -err;
+ }
+
+ return 0;
+}
+
+int set_major_class(int dd, const uint8_t *cls, uint8_t major)
+{
+ uint32_t dev_class;
+
+ dev_class = (cls[2] << 16) | ((cls[1] & 0x20) << 8) |
+ ((major & 0xdf) << 8) | 0x00;
+
+ if (hci_write_class_of_dev(dd, dev_class, HCI_REQ_TIMEOUT) < 0) {
+ int err = errno;
+ error("Can't write class of device: %s (%d)",
+ strerror(err), err);
+ return -err;
+ }
+
+ return 0;
+}
+
+int set_minor_class(int dd, const uint8_t *cls, uint8_t minor)
+{
+ uint32_t dev_class;
+
+ dev_class = (cls[2] << 16) | (cls[1] << 8) | minor;
+
+ if (hci_write_class_of_dev(dd, dev_class, HCI_REQ_TIMEOUT) < 0) {
+ int err = errno;
error("Can't write class of device: %s (%d)",
strerror(err), err);
return -err;
diff --git a/src/dbus-hci.h b/src/dbus-hci.h
index f6547ea4..a9ccbbd5 100644
--- a/src/dbus-hci.h
+++ b/src/dbus-hci.h
@@ -56,6 +56,8 @@ int cancel_periodic_discovery(struct btd_adapter *adapter);
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 set_major_class(int dd, const uint8_t *cls, uint8_t major);
+int set_minor_class(int dd, const uint8_t *cls, uint8_t minor);
void set_dbus_connection(DBusConnection *conn);