* [RFC 3/6] android: Use hal-log.h for logging in hidhost HAL
From: Szymon Janc @ 2013-10-20 17:45 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1382291146-23518-1-git-send-email-szymon.janc@tieto.com>
This will allow to log both on Android and Linux (in haltest)
---
android/hal-hidhost.c | 26 ++++++++++++--------------
1 file changed, 12 insertions(+), 14 deletions(-)
diff --git a/android/hal-hidhost.c b/android/hal-hidhost.c
index 7436864..8c47e27 100644
--- a/android/hal-hidhost.c
+++ b/android/hal-hidhost.c
@@ -21,9 +21,7 @@
#include <hardware/bluetooth.h>
#include <hardware/bt_hh.h>
-#define LOG_TAG "BlueZ"
-#include <cutils/log.h>
-
+#include "hal-log.h"
#include "hal.h"
bthh_callbacks_t *bt_hh_cbacks;
@@ -35,7 +33,7 @@ static bool interface_ready(void)
static bt_status_t bt_hidhost_connect(bt_bdaddr_t *bd_addr)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -48,7 +46,7 @@ static bt_status_t bt_hidhost_connect(bt_bdaddr_t *bd_addr)
static bt_status_t bt_hidhost_disconnect(bt_bdaddr_t *bd_addr)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -61,7 +59,7 @@ static bt_status_t bt_hidhost_disconnect(bt_bdaddr_t *bd_addr)
static bt_status_t bt_hidhost_virtual_unplug(bt_bdaddr_t *bd_addr)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -75,7 +73,7 @@ static bt_status_t bt_hidhost_virtual_unplug(bt_bdaddr_t *bd_addr)
static bt_status_t bt_hidhost_set_info(bt_bdaddr_t *bd_addr,
bthh_hid_info_t hid_info)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -89,7 +87,7 @@ static bt_status_t bt_hidhost_set_info(bt_bdaddr_t *bd_addr,
static bt_status_t bt_hidhost_get_protocol(bt_bdaddr_t *bd_addr,
bthh_protocol_mode_t protocolMode)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -103,7 +101,7 @@ static bt_status_t bt_hidhost_get_protocol(bt_bdaddr_t *bd_addr,
static bt_status_t bt_hidhost_set_protocol(bt_bdaddr_t *bd_addr,
bthh_protocol_mode_t protocolMode)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -119,7 +117,7 @@ static bt_status_t bt_hidhost_get_report(bt_bdaddr_t *bd_addr,
uint8_t reportId,
int bufferSize)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -134,7 +132,7 @@ static bt_status_t bt_hidhost_set_report(bt_bdaddr_t *bd_addr,
bthh_report_type_t reportType,
char *report)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -147,7 +145,7 @@ static bt_status_t bt_hidhost_set_report(bt_bdaddr_t *bd_addr,
static bt_status_t bt_hidhost_send_data(bt_bdaddr_t *bd_addr, char *data)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -160,7 +158,7 @@ static bt_status_t bt_hidhost_send_data(bt_bdaddr_t *bd_addr, char *data)
static bt_status_t bt_hidhost_init(bthh_callbacks_t *callbacks)
{
- ALOGI(__func__);
+ DBG("");
/* store reference to user callbacks */
bt_hh_cbacks = callbacks;
@@ -174,7 +172,7 @@ static bt_status_t bt_hidhost_init(bthh_callbacks_t *callbacks)
static void bt_hidhost_cleanup(void)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return;
--
1.8.4
^ permalink raw reply related
* [RFC 2/6] android: Use hal-log.h for logging in bluetooth HAL
From: Szymon Janc @ 2013-10-20 17:45 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1382291146-23518-1-git-send-email-szymon.janc@tieto.com>
This will allow to log both on Android and Linux (in haltest).
---
Makefile.android | 4 ++-
android/hal-bluetooth.c | 68 ++++++++++++++++++++++++-------------------------
2 files changed, 36 insertions(+), 36 deletions(-)
diff --git a/Makefile.android b/Makefile.android
index 244a13b..e9992d9 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -32,7 +32,9 @@ android_libhal_internal_la_SOURCES = android/hal.h android/hal-bluetooth.c \
android/hardware/bt_sock.h \
android/hardware/hardware.h \
android/cutils/log.h \
- android/cutils/properties.h
+ android/cutils/properties.h \
+ android/hal-log.h
+
android_libhal_internal_la_CPPFLAGS = -I$(srcdir)/android
noinst_PROGRAMS += android/haltest
diff --git a/android/hal-bluetooth.c b/android/hal-bluetooth.c
index ce64d3b..035bb0f 100644
--- a/android/hal-bluetooth.c
+++ b/android/hal-bluetooth.c
@@ -31,9 +31,7 @@
#include <cutils/properties.h>
-#define LOG_TAG "BlueZ"
-#include <cutils/log.h>
-
+#include "hal-log.h"
#include "hal.h"
#include "hal-msg.h"
@@ -63,19 +61,19 @@ static int accept_connection(int sk)
err = poll(&pfd, 1, CONNECT_TIMEOUT);
if (err < 0) {
err = errno;
- ALOGE("Failed to poll: %d (%s)", err, strerror(err));
+ error("Failed to poll: %d (%s)", err, strerror(err));
return -1;
}
if (err == 0) {
- ALOGE("bluetoothd connect timeout");
+ error("bluetoothd connect timeout");
return -1;
}
new_sk = accept(sk, NULL, NULL);
if (new_sk < 0) {
err = errno;
- ALOGE("Failed to accept socket: %d (%s)", err, strerror(err));
+ error("Failed to accept socket: %d (%s)", err, strerror(err));
return -1;
}
@@ -91,7 +89,7 @@ static bool start_daemon(void)
sk = socket(AF_LOCAL, SOCK_SEQPACKET, 0);
if (sk < 0) {
err = errno;
- ALOGE("Failed to create socket: %d (%s)", err,
+ error("Failed to create socket: %d (%s)", err,
strerror(err));
return false;
}
@@ -103,14 +101,14 @@ static bool start_daemon(void)
if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
err = errno;
- ALOGE("Failed to bind socket: %d (%s)", err, strerror(err));
+ error("Failed to bind socket: %d (%s)", err, strerror(err));
close(sk);
return false;
}
if (listen(sk, 2) < 0) {
err = errno;
- ALOGE("Failed to listen on socket: %d (%s)", err,
+ error("Failed to listen on socket: %d (%s)", err,
strerror(err));
close(sk);
return false;
@@ -133,7 +131,7 @@ static bool start_daemon(void)
return false;
}
- ALOGI("bluetoothd connected");
+ info("bluetoothd connected");
close(sk);
@@ -151,7 +149,7 @@ static void stop_daemon(void)
static int init(bt_callbacks_t *callbacks)
{
- ALOGD(__func__);
+ DBG("");
if (interface_ready())
return BT_STATUS_SUCCESS;
@@ -166,14 +164,14 @@ static int init(bt_callbacks_t *callbacks)
static int enable(void)
{
- ALOGD(__func__);
+ DBG("");
return BT_STATUS_UNSUPPORTED;
}
static int disable(void)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -183,7 +181,7 @@ static int disable(void)
static void cleanup(void)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return;
@@ -195,7 +193,7 @@ static void cleanup(void)
static int get_adapter_properties(void)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -205,7 +203,7 @@ static int get_adapter_properties(void)
static int get_adapter_property(bt_property_type_t type)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -215,7 +213,7 @@ static int get_adapter_property(bt_property_type_t type)
static int set_adapter_property(const bt_property_t *property)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -228,7 +226,7 @@ static int set_adapter_property(const bt_property_t *property)
static int get_remote_device_properties(bt_bdaddr_t *remote_addr)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -239,7 +237,7 @@ static int get_remote_device_properties(bt_bdaddr_t *remote_addr)
static int get_remote_device_property(bt_bdaddr_t *remote_addr,
bt_property_type_t type)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -250,7 +248,7 @@ static int get_remote_device_property(bt_bdaddr_t *remote_addr,
static int set_remote_device_property(bt_bdaddr_t *remote_addr,
const bt_property_t *property)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -260,7 +258,7 @@ static int set_remote_device_property(bt_bdaddr_t *remote_addr,
static int get_remote_service_record(bt_bdaddr_t *remote_addr, bt_uuid_t *uuid)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -270,7 +268,7 @@ static int get_remote_service_record(bt_bdaddr_t *remote_addr, bt_uuid_t *uuid)
static int get_remote_services(bt_bdaddr_t *remote_addr)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -280,7 +278,7 @@ static int get_remote_services(bt_bdaddr_t *remote_addr)
static int start_discovery(void)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -290,7 +288,7 @@ static int start_discovery(void)
static int cancel_discovery(void)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -300,7 +298,7 @@ static int cancel_discovery(void)
static int create_bond(const bt_bdaddr_t *bd_addr)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -313,7 +311,7 @@ static int create_bond(const bt_bdaddr_t *bd_addr)
static int cancel_bond(const bt_bdaddr_t *bd_addr)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -323,7 +321,7 @@ static int cancel_bond(const bt_bdaddr_t *bd_addr)
static int remove_bond(const bt_bdaddr_t *bd_addr)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -334,7 +332,7 @@ static int remove_bond(const bt_bdaddr_t *bd_addr)
static int pin_reply(const bt_bdaddr_t *bd_addr, uint8_t accept,
uint8_t pin_len, bt_pin_code_t *pin_code)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -345,7 +343,7 @@ static int pin_reply(const bt_bdaddr_t *bd_addr, uint8_t accept,
static int ssp_reply(const bt_bdaddr_t *bd_addr, bt_ssp_variant_t variant,
uint8_t accept, uint32_t passkey)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -358,7 +356,7 @@ static int ssp_reply(const bt_bdaddr_t *bd_addr, bt_ssp_variant_t variant,
static const void *get_profile_interface(const char *profile_id)
{
- ALOGD("%s: %s", __func__, profile_id);
+ DBG("%s: %s", __func__, profile_id);
if (!interface_ready())
return NULL;
@@ -377,7 +375,7 @@ static const void *get_profile_interface(const char *profile_id)
static int dut_mode_configure(uint8_t enable)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -387,7 +385,7 @@ static int dut_mode_configure(uint8_t enable)
static int dut_mode_send(uint16_t opcode, uint8_t *buf, uint8_t len)
{
- ALOGD(__func__);
+ DBG("");
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -423,14 +421,14 @@ static const bt_interface_t bluetooth_if = {
static const bt_interface_t *get_bluetooth_interface(void)
{
- ALOGD(__func__);
+ DBG("");
return &bluetooth_if;
}
static int close_bluetooth(struct hw_device_t *device)
{
- ALOGD(__func__);
+ DBG("");
cleanup();
@@ -442,7 +440,7 @@ static int open_bluetooth(const struct hw_module_t *module, char const *name,
{
bluetooth_device_t *dev = malloc(sizeof(bluetooth_device_t));
- ALOGD(__func__);
+ DBG("");
memset(dev, 0, sizeof(bluetooth_device_t));
dev->common.tag = HARDWARE_DEVICE_TAG;
--
1.8.4
^ permalink raw reply related
* [RFC 1/6] android: Add wrapper for HAL logging
From: Szymon Janc @ 2013-10-20 17:45 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1382291146-23518-1-git-send-email-szymon.janc@tieto.com>
Provide logging API similar to standard logging used in daemon. This
will allow to log on both Android and Linux (i.e. in haltest).
Another advantage is that now LOG_TAG and message format are configured
from single location.
---
Makefile.android | 3 ++-
android/hal-log.h | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 37 insertions(+), 1 deletion(-)
create mode 100644 android/hal-log.h
diff --git a/Makefile.android b/Makefile.android
index dcaca3c..244a13b 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -59,7 +59,8 @@ EXTRA_DIST += android/Android.mk android/log.c android/device.c \
EXTRA_DIST += android/hal-bluetooth.c \
android/hal-sock.c \
android/hal-hidhost.c \
- android/hal-pan.c
+ android/hal-pan.c \
+ android/hal-log.h
EXTRA_DIST += android/client/terminal.c \
android/client/haltest.c \
diff --git a/android/hal-log.h b/android/hal-log.h
new file mode 100644
index 0000000..9bd024d
--- /dev/null
+++ b/android/hal-log.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#define LOG_TAG "BlueZ"
+
+#ifdef __BIONIC__
+#include <cutils/log.h>
+#else
+#include <stdio.h>
+#define LOG_INFO " I"
+#define LOG_WARN " W"
+#define LOG_ERROR " E"
+#define LOG_DEBUG " D"
+#define ALOG(pri, tag, fmt, arg...) printf(tag pri": " fmt"\n", ##arg)
+#endif
+
+#define info(fmt, arg...) ALOG(LOG_INFO, LOG_TAG, fmt, ##arg)
+#define warn(fmt, arg...) ALOG(LOG_WARN, LOG_TAG, fmt, ##arg)
+#define error(fmt, arg...) ALOG(LOG_ERROR, LOG_TAG, fmt, ##arg)
+#define DBG(fmt, arg...) ALOG(LOG_DEBUG, LOG_TAG, "%s:%s() "fmt, __FILE__, \
+ __func__, ##arg)
--
1.8.4
^ permalink raw reply related
* [RFC 0/6] Logging from Android HAL library
From: Szymon Janc @ 2013-10-20 17:45 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
Hi,
This is an attempt to make library logging API similar to other parts of code.
It maps log levels used in BlueZ to Android levels and provides log printing
when HAL library is used by haltest on Linux. Since cutils/log.h is not used
directly there is no need to stub it on Linux.
Another advantage is that LOG_TAG and message format is configured in single
file (eg. modules tags could be easily added to improve readibility of
non-debug messages)
Comments are welcome.
Szymon Janc (6):
android: Add wrapper for HAL logging
android: Use hal-log.h for logging in bluetooth HAL
android: Use hal-log.h for logging in hidhost HAL
android: Use hal-log.h for logging in pan HAL
android: Use hal-log.h for logging in socket HAL
android: Remove not needed cutils/log.h stub
Makefile.android | 9 ++++---
android/cutils/log.h | 29 ---------------------
android/hal-bluetooth.c | 68 ++++++++++++++++++++++++-------------------------
android/hal-hidhost.c | 26 +++++++++----------
android/hal-log.h | 35 +++++++++++++++++++++++++
android/hal-pan.c | 16 +++++-------
android/hal-sock.c | 19 ++++++--------
7 files changed, 100 insertions(+), 102 deletions(-)
delete mode 100644 android/cutils/log.h
create mode 100644 android/hal-log.h
--
1.8.4
^ permalink raw reply
* Re: [PATCH v3] Bluetooth: Update Set Discoverable to support LE
From: Marcel Holtmann @ 2013-10-20 16:07 UTC (permalink / raw)
To: johan.hedberg; +Cc: linux-bluetooth
In-Reply-To: <1382284807-26311-1-git-send-email-johan.hedberg@gmail.com>
Hi Johan,
> This patch updates the Set Discoverable management command to also be
> applicable for LE. In particular this affects the advertising flags
> where we can say "general discoverable" or "limited discoverable".
>
> Since the device flags may not be up-to-date when the advertising data
> is written this patch introduces a get_adv_discov_flags() helper
> function which also looks at any pending mgmt commands (a pending
> set_discoverable would be the exception when the flags are not yet
> correct).
>
> The patch also adds HCI_DISCOVERABLE flag clearing to the
> mgmt_discoverable_timeout function, since the code was previously
> relying on the mgmt_discoverable callback to handle this, which is only
> called for the BR/EDR-only HCI_Write_Scan_Enable command.
>
> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
> ---
> v3:
> * Fix updating advertising flags when switching connectable off while
> limited discoverable is enabled.
> v2:
> * Fix advertising flags update when disabling connectable while
> discoverable is enabled.
> * Fix redundant check for HCI_LE_ENABLED
>
> net/bluetooth/mgmt.c | 80 ++++++++++++++++++++++++++++++++++++++++++++--------
> 1 file changed, 69 insertions(+), 11 deletions(-)
all 9 patches have been applied to bluetooth-next tree.
Regards
Marcel
^ permalink raw reply
* [PATCH v3] Bluetooth: Update Set Discoverable to support LE
From: johan.hedberg @ 2013-10-20 16:00 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382259320-20009-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
This patch updates the Set Discoverable management command to also be
applicable for LE. In particular this affects the advertising flags
where we can say "general discoverable" or "limited discoverable".
Since the device flags may not be up-to-date when the advertising data
is written this patch introduces a get_adv_discov_flags() helper
function which also looks at any pending mgmt commands (a pending
set_discoverable would be the exception when the flags are not yet
correct).
The patch also adds HCI_DISCOVERABLE flag clearing to the
mgmt_discoverable_timeout function, since the code was previously
relying on the mgmt_discoverable callback to handle this, which is only
called for the BR/EDR-only HCI_Write_Scan_Enable command.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
v3:
* Fix updating advertising flags when switching connectable off while
limited discoverable is enabled.
v2:
* Fix advertising flags update when disabling connectable while
discoverable is enabled.
* Fix redundant check for HCI_LE_ENABLED
net/bluetooth/mgmt.c | 80 ++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 69 insertions(+), 11 deletions(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 796db58..bd91ee5 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -599,12 +599,35 @@ static void update_scan_rsp_data(struct hci_request *req)
hci_req_add(req, HCI_OP_LE_SET_SCAN_RSP_DATA, sizeof(cp), &cp);
}
+static u8 get_adv_discov_flags(struct hci_dev *hdev)
+{
+ struct pending_cmd *cmd;
+
+ /* If there's a pending mgmt command the flags will not yet have
+ * their final values, so check for this first.
+ */
+ cmd = mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
+ if (cmd) {
+ struct mgmt_mode *cp = cmd->param;
+ if (cp->val == 0x01)
+ return LE_AD_GENERAL;
+ else if (cp->val == 0x02)
+ return LE_AD_LIMITED;
+ } else {
+ if (test_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags))
+ return LE_AD_LIMITED;
+ else if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
+ return LE_AD_GENERAL;
+ }
+
+ return 0;
+}
+
static u8 create_adv_data(struct hci_dev *hdev, u8 *ptr)
{
u8 ad_len = 0, flags = 0;
- if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
- flags |= LE_AD_GENERAL;
+ flags |= get_adv_discov_flags(hdev);
if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
if (lmp_le_br_capable(hdev))
@@ -1120,15 +1143,15 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
struct pending_cmd *cmd;
struct hci_request req;
u16 timeout;
- u8 scan, status;
+ u8 scan;
int err;
BT_DBG("request for %s", hdev->name);
- status = mgmt_bredr_support(hdev);
- if (status)
+ if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
+ !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
- status);
+ MGMT_STATUS_REJECTED);
if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
@@ -1228,6 +1251,12 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
hci_req_init(&req, hdev);
+ /* The procedure for LE-only controllers is much simpler - just
+ * update the advertising data.
+ */
+ if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
+ goto update_ad;
+
scan = SCAN_PAGE;
if (cp->val) {
@@ -1260,6 +1289,9 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan);
+update_ad:
+ update_adv_data(&req);
+
err = hci_req_run(&req, set_discoverable_complete);
if (err < 0)
mgmt_pending_remove(cmd);
@@ -1451,8 +1483,17 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
hci_req_init(&req, hdev);
- if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) &&
- cp->val != test_bit(HCI_PSCAN, &hdev->flags)) {
+ /* If BR/EDR is not enabled and we disable advertising as a
+ * by-product of disabling connectable, we need to update the
+ * advertising flags.
+ */
+ if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
+ if (!cp->val) {
+ clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
+ clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
+ }
+ update_adv_data(&req);
+ } else if (cp->val != test_bit(HCI_PSCAN, &hdev->flags)) {
if (cp->val) {
scan = SCAN_PAGE;
} else {
@@ -4348,6 +4389,7 @@ void mgmt_discoverable_timeout(struct hci_dev *hdev)
* safe to unconditionally clear the flag.
*/
clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
+ clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
hci_req_init(&req, hdev);
if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
@@ -4356,10 +4398,13 @@ void mgmt_discoverable_timeout(struct hci_dev *hdev)
sizeof(scan), &scan);
}
update_class(&req);
+ update_adv_data(&req);
hci_req_run(&req, NULL);
hdev->discov_timeout = 0;
+ new_settings(hdev, NULL);
+
hci_dev_unlock(hdev);
}
@@ -4374,13 +4419,26 @@ void mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev))
return;
- if (discoverable)
+ if (discoverable) {
changed = !test_and_set_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
- else
+ } else {
+ clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
changed = test_and_clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
+ }
+
+ if (changed) {
+ struct hci_request req;
+
+ /* In case this change in discoverable was triggered by
+ * a disabling of connectable there could be a need to
+ * update the advertising flags.
+ */
+ hci_req_init(&req, hdev);
+ update_adv_data(&req);
+ hci_req_run(&req, NULL);
- if (changed)
new_settings(hdev, NULL);
+ }
}
void mgmt_connectable(struct hci_dev *hdev, u8 connectable)
--
1.8.3.1
^ permalink raw reply related
* [PATCH v2 6/6] android: Remove not needed property_get function form cutils stubs
From: Szymon Janc @ 2013-10-20 9:53 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1382262838-25725-1-git-send-email-szymon.janc@tieto.com>
This is no longer used as daemon indicates its presence by connecting
socket.
---
android/cutils/properties.h | 27 ---------------------------
1 file changed, 27 deletions(-)
diff --git a/android/cutils/properties.h b/android/cutils/properties.h
index 44a712c..f318b01 100644
--- a/android/cutils/properties.h
+++ b/android/cutils/properties.h
@@ -24,33 +24,6 @@
extern "C" {
#endif
-#define PROPERTY_KEY_MAX 32
-#define PROPERTY_VALUE_MAX 92
-
-/* property_get: returns the length of the value which will never be
-** greater than PROPERTY_VALUE_MAX - 1 and will always be zero terminated.
-** (the length does not include the terminating zero).
-**
-** If the property read fails or returns an empty value, the default
-** value is used (if nonnull).
-*/
-static inline int property_get(const char *key, char *value,
- const char *default_value)
-{
- const char *env;
-
- env = getenv(key);
- if (!env)
- env = default_value;
-
- if (!value || !env)
- return 0;
-
- strncpy(value, env, PROPERTY_VALUE_MAX);
-
- return strlen(value);
-}
-
/* property_set: returns 0 on success, < 0 on failure
*/
static inline int property_set(const char *key, const char *value)
--
1.8.4
^ permalink raw reply related
* [PATCH v2 5/6] android: Make HAL library wait for daemon to connect on init
From: Szymon Janc @ 2013-10-20 9:53 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1382262838-25725-1-git-send-email-szymon.janc@tieto.com>
After starting up, daemon is responsible for connecting to HAL library.
If this doesn't happen before timeout occured init will fail.
---
android/hal-bluetooth.c | 126 +++++++++++++++++++++++++++++++++++++++---------
1 file changed, 103 insertions(+), 23 deletions(-)
diff --git a/android/hal-bluetooth.c b/android/hal-bluetooth.c
index 2c6c2eb..ce64d3b 100644
--- a/android/hal-bluetooth.c
+++ b/android/hal-bluetooth.c
@@ -19,6 +19,10 @@
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
+#include <errno.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <poll.h>
#include <hardware/bluetooth.h>
#include <hardware/bt_sock.h>
@@ -31,41 +35,118 @@
#include <cutils/log.h>
#include "hal.h"
+#include "hal-msg.h"
#define SERVICE_NAME "bluetoothd"
+#define CONNECT_TIMEOUT (5 * 1000)
bt_callbacks_t *bt_hal_cbacks = NULL;
+static int cmd_sk = -1;
+static int notif_sk = -1;
+
static bool interface_ready(void)
{
return bt_hal_cbacks != NULL;
}
-static bool start_bt_daemon(void)
+static int accept_connection(int sk)
{
- int tries = 40; /* wait 4 seconds for completion */
+ int err;
+ struct pollfd pfd;
+ int new_sk;
+
+ memset(&pfd, 0 , sizeof(pfd));
+ pfd.fd = sk;
+ pfd.events = POLLIN;
+
+ err = poll(&pfd, 1, CONNECT_TIMEOUT);
+ if (err < 0) {
+ err = errno;
+ ALOGE("Failed to poll: %d (%s)", err, strerror(err));
+ return -1;
+ }
- ALOGD(__func__);
+ if (err == 0) {
+ ALOGE("bluetoothd connect timeout");
+ return -1;
+ }
+
+ new_sk = accept(sk, NULL, NULL);
+ if (new_sk < 0) {
+ err = errno;
+ ALOGE("Failed to accept socket: %d (%s)", err, strerror(err));
+ return -1;
+ }
+
+ return new_sk;
+}
+
+static bool start_daemon(void)
+{
+ struct sockaddr_un addr;
+ int sk;
+ int err;
+
+ sk = socket(AF_LOCAL, SOCK_SEQPACKET, 0);
+ if (sk < 0) {
+ err = errno;
+ ALOGE("Failed to create socket: %d (%s)", err,
+ strerror(err));
+ return false;
+ }
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+
+ memcpy(addr.sun_path, BLUEZ_HAL_SK_PATH, sizeof(BLUEZ_HAL_SK_PATH));
+
+ if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+ err = errno;
+ ALOGE("Failed to bind socket: %d (%s)", err, strerror(err));
+ close(sk);
+ return false;
+ }
+
+ if (listen(sk, 2) < 0) {
+ err = errno;
+ ALOGE("Failed to listen on socket: %d (%s)", err,
+ strerror(err));
+ close(sk);
+ return false;
+ }
/* Start Android Bluetooth daemon service */
property_set("ctl.start", SERVICE_NAME);
- while (tries-- > 0) {
- char val[PROPERTY_VALUE_MAX];
-
- if (property_get("init.svc." SERVICE_NAME, val, NULL)) {
- if (!strcmp(val, "running")) {
- ALOGI("Android BlueZ daemon started");
- return true;
- }
- } else {
- return false;
- }
+ cmd_sk = accept_connection(sk);
+ if (cmd_sk < 0) {
+ close(sk);
+ return false;
+ }
- usleep(100000);
+ notif_sk = accept_connection(sk);
+ if (notif_sk < 0) {
+ close(sk);
+ close(cmd_sk);
+ cmd_sk = -1;
+ return false;
}
- return false;
+ ALOGI("bluetoothd connected");
+
+ close(sk);
+
+ return true;
+}
+
+static void stop_daemon(void)
+{
+ close(cmd_sk);
+ cmd_sk = -1;
+
+ close(notif_sk);
+ notif_sk = 1;
}
static int init(bt_callbacks_t *callbacks)
@@ -75,15 +156,12 @@ static int init(bt_callbacks_t *callbacks)
if (interface_ready())
return BT_STATUS_SUCCESS;
- if (start_bt_daemon()) {
- /* TODO: open channel */
+ if (!start_daemon())
+ return BT_STATUS_FAIL;
- bt_hal_cbacks = callbacks;
+ bt_hal_cbacks = callbacks;
- return BT_STATUS_SUCCESS;
- }
-
- return BT_STATUS_UNSUPPORTED;
+ return BT_STATUS_SUCCESS;
}
static int enable(void)
@@ -110,6 +188,8 @@ static void cleanup(void)
if (!interface_ready())
return;
+ stop_daemon();
+
bt_hal_cbacks = NULL;
}
--
1.8.4
^ permalink raw reply related
* [PATCH v2 4/6] android: Connect daemon to HAL library
From: Szymon Janc @ 2013-10-20 9:53 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1382262838-25725-1-git-send-email-szymon.janc@tieto.com>
Connect to HAL when adapter initialization is finished. If any problem
with connection occurs or connected socket is closed by remote daemon
shutdowns.
---
android/main.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 122 insertions(+)
diff --git a/android/main.c b/android/main.c
index cfa728d..2581b87 100644
--- a/android/main.c
+++ b/android/main.c
@@ -32,7 +32,10 @@
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
+#include <errno.h>
#include <sys/signalfd.h>
+#include <sys/socket.h>
+#include <sys/un.h>
#include <glib.h>
@@ -44,6 +47,7 @@
#include "src/shared/mgmt.h"
#include "adapter.h"
+#include "hal-msg.h"
#define SHUTDOWN_GRACE_SECONDS 10
@@ -55,8 +59,104 @@ static uint8_t mgmt_revision = 0;
static uint16_t adapter_index = MGMT_INDEX_NONE;
+static GIOChannel *hal_cmd_io = NULL;
+static GIOChannel *hal_notif_io = NULL;
+
static volatile sig_atomic_t __terminated = 0;
+static gboolean watch_cb(GIOChannel *io, GIOCondition cond,
+ gpointer user_data)
+{
+ info("HAL socket closed, terminating");
+ g_main_loop_quit(event_loop);
+
+ return FALSE;
+}
+
+static GIOChannel *connect_hal(GIOFunc connect_cb)
+{
+ struct sockaddr_un addr;
+ GIOCondition cond;
+ GIOChannel *io;
+ int err, sk;
+
+ sk = socket(PF_LOCAL, SOCK_SEQPACKET, 0);
+ if (sk < 0) {
+ err = errno;
+ error("Failed to create socket: %d (%s)", err, strerror(err));
+ return NULL;
+ }
+
+ io = g_io_channel_unix_new(sk);
+
+ g_io_channel_set_close_on_unref(io, TRUE);
+ g_io_channel_set_flags(io, G_IO_FLAG_NONBLOCK, NULL);
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+
+ memcpy(addr.sun_path, BLUEZ_HAL_SK_PATH, sizeof(BLUEZ_HAL_SK_PATH));
+
+ err = connect(sk, (struct sockaddr *) &addr, sizeof(addr));
+ if (err < 0) {
+ err = -errno;
+ error("Failed to connect HAL socket: %d (%s)", errno,
+ strerror(errno));
+ g_io_channel_unref(io);
+ return NULL;
+ }
+
+ cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
+
+ g_io_add_watch(io, cond, connect_cb, NULL);
+
+ return io;
+}
+
+static gboolean notif_connect_cb(GIOChannel *io, GIOCondition cond,
+ gpointer user_data)
+{
+ DBG("");
+
+ if (cond & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) {
+ g_main_loop_quit(event_loop);
+ return FALSE;
+ }
+
+ cond = G_IO_ERR | G_IO_HUP | G_IO_NVAL;
+
+ g_io_add_watch(io, cond, watch_cb, NULL);
+
+ info("Successfully connected to HAL");
+
+ /* TODO start handling commands */
+
+ return FALSE;
+}
+
+static gboolean cmd_connect_cb(GIOChannel *io, GIOCondition cond,
+ gpointer user_data)
+{
+ DBG("");
+
+ if (cond & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) {
+ g_main_loop_quit(event_loop);
+ return FALSE;
+ }
+
+ cond = G_IO_ERR | G_IO_HUP | G_IO_NVAL;
+
+ g_io_add_watch(io, cond, watch_cb, NULL);
+
+ hal_notif_io = connect_hal(notif_connect_cb);
+ if (!hal_notif_io) {
+ error("Cannot connect to HAL, terminating");
+ g_main_loop_quit(event_loop);
+ }
+
+ return FALSE;
+}
+
static gboolean signal_handler(GIOChannel *channel, GIOCondition cond,
gpointer user_data)
{
@@ -141,6 +241,12 @@ static void adapter_ready(struct bt_adapter *adapter, int err)
}
info("Adapter initialized");
+
+ hal_cmd_io = connect_hal(cmd_connect_cb);
+ if (!hal_cmd_io) {
+ error("Cannot connect to HAL, terminating");
+ g_main_loop_quit(event_loop);
+ }
}
static void mgmt_index_added_event(uint16_t index, uint16_t length,
@@ -290,6 +396,21 @@ static void cleanup_mgmt_interface(void)
mgmt_if = NULL;
}
+static void cleanup_hal_connection(void)
+{
+ if (hal_cmd_io) {
+ g_io_channel_shutdown(hal_cmd_io, TRUE, NULL);
+ g_io_channel_unref(hal_cmd_io);
+ hal_cmd_io = NULL;
+ }
+
+ if (hal_notif_io) {
+ g_io_channel_shutdown(hal_notif_io, TRUE, NULL);
+ g_io_channel_unref(hal_notif_io);
+ hal_notif_io = NULL;
+ }
+}
+
int main(int argc, char *argv[])
{
GOptionContext *context;
@@ -335,6 +456,7 @@ int main(int argc, char *argv[])
g_source_remove(signal);
+ cleanup_hal_connection();
stop_sdp_server();
cleanup_mgmt_interface();
g_main_loop_unref(event_loop);
--
1.8.4
^ permalink raw reply related
* [PATCH v2 3/6] android: Define path for HAL communication socket
From: Szymon Janc @ 2013-10-20 9:53 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1382262838-25725-1-git-send-email-szymon.janc@tieto.com>
This socket will be used by android daemon and libhal to communitate.
---
android/hal-msg.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/android/hal-msg.h b/android/hal-msg.h
index 4c5ca69..4440fc8 100644
--- a/android/hal-msg.h
+++ b/android/hal-msg.h
@@ -21,6 +21,8 @@
*
*/
+static const char BLUEZ_HAL_SK_PATH[] = "\0bluez_hal_socket";
+
struct hal_msg_hdr {
uint8_t service_id;
uint8_t opcode;
--
1.8.4
^ permalink raw reply related
* [PATCH v2 2/6] android: Improve cutils/log.h stubs
From: Szymon Janc @ 2013-10-20 9:53 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1382262838-25725-1-git-send-email-szymon.janc@tieto.com>
Provide dummy function that will use ALOG* macros parameters. This fix
build errors about set-but-not-used used local variables on linux.
---
android/cutils/log.h | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/android/cutils/log.h b/android/cutils/log.h
index d87da72..389542b 100644
--- a/android/cutils/log.h
+++ b/android/cutils/log.h
@@ -17,11 +17,13 @@
#ifndef _CUTILS_LOG_H
#define _CUTILS_LOG_H
-#define ALOGV(...)
-#define ALOGD(...)
-#define ALOGI(...)
-#define ALOGW(...)
-#define ALOGE(...)
+static inline void ALOG() {};
+
+#define ALOGV(...) ALOG("V", __VA_ARGS__)
+#define ALOGD(...) ALOG("D", __VA_ARGS__)
+#define ALOGI(...) ALOG("I", __VA_ARGS__)
+#define ALOGW(...) ALOG("W", __VA_ARGS__)
+#define ALOGE(...) ALOG("E", __VA_ARGS__)
#define LOG_ALWAYS_FATAL(...) do { ALOGE(__VA_ARGS__); exit(1); } while (0)
#endif // _CUTILS_LOG_H
--
1.8.4
^ permalink raw reply related
* [PATCH v2 1/6] android: Fix missing log cleanup on daemon exit
From: Szymon Janc @ 2013-10-20 9:53 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1382262838-25725-1-git-send-email-szymon.janc@tieto.com>
---
android/main.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/android/main.c b/android/main.c
index c3fb80e..cfa728d 100644
--- a/android/main.c
+++ b/android/main.c
@@ -341,5 +341,7 @@ int main(int argc, char *argv[])
info("Exit");
+ __btd_log_cleanup();
+
return EXIT_SUCCESS;
}
--
1.8.4
^ permalink raw reply related
* [PATCH v2 0/6] Initial Android IPC
From: Szymon Janc @ 2013-10-20 9:53 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
V2:
- simplify daemon code
- sockets handling cleanup
- other minor fixes
--
BR
Szymon Janc
Szymon Janc (6):
android: Fix missing log cleanup on daemon exit
android: Improve cutils/log.h stubs
android: Define path for HAL communication socket
android: Connect daemon to HAL library
android: Make HAL library wait for daemon to connect on init
android: Remove not needed property_get function form cutils stubs
android/cutils/log.h | 10 ++--
android/cutils/properties.h | 27 ----------
android/hal-bluetooth.c | 126 ++++++++++++++++++++++++++++++++++++--------
android/hal-msg.h | 2 +
android/main.c | 124 +++++++++++++++++++++++++++++++++++++++++++
5 files changed, 234 insertions(+), 55 deletions(-)
--
1.8.4
^ permalink raw reply
* [PATCH v2] Bluetooth: Update Set Discoverable to support LE
From: johan.hedberg @ 2013-10-20 8:55 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382215103-6968-10-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
This patch updates the Set Discoverable management command to also be
applicable for LE. In particular this affects the advertising flags
where we can say "general discoverable" or "limited discoverable".
Since the device flags may not be up-to-date when the advertising data
is written this patch introduces a get_adv_discov_flags() helper
function which also looks at any pending mgmt commands (a pending
set_discoverable would be the exception when the flags are not yet
correct).
The patch also adds HCI_DISCOVERABLE flag clearing to the
mgmt_discoverable_timeout function, since the code was previously
relying on the mgmt_discoverable callback to handle this, which is only
called for the BR/EDR-only HCI_Write_Scan_Enable command.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
v2:
* Fix advertising flags update when disabling connectable while
discoverable is enabled.
* Fix redundant check for HCI_LE_ENABLED
net/bluetooth/mgmt.c | 72 +++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 63 insertions(+), 9 deletions(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 796db58..5ac0b9a 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -599,12 +599,35 @@ static void update_scan_rsp_data(struct hci_request *req)
hci_req_add(req, HCI_OP_LE_SET_SCAN_RSP_DATA, sizeof(cp), &cp);
}
+static u8 get_adv_discov_flags(struct hci_dev *hdev)
+{
+ struct pending_cmd *cmd;
+
+ /* If there's a pending mgmt command the flags will not yet have
+ * their final values, so check for this first.
+ */
+ cmd = mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
+ if (cmd) {
+ struct mgmt_mode *cp = cmd->param;
+ if (cp->val == 0x01)
+ return LE_AD_GENERAL;
+ else if (cp->val == 0x02)
+ return LE_AD_LIMITED;
+ } else {
+ if (test_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags))
+ return LE_AD_LIMITED;
+ else if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
+ return LE_AD_GENERAL;
+ }
+
+ return 0;
+}
+
static u8 create_adv_data(struct hci_dev *hdev, u8 *ptr)
{
u8 ad_len = 0, flags = 0;
- if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
- flags |= LE_AD_GENERAL;
+ flags |= get_adv_discov_flags(hdev);
if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
if (lmp_le_br_capable(hdev))
@@ -1120,15 +1143,15 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
struct pending_cmd *cmd;
struct hci_request req;
u16 timeout;
- u8 scan, status;
+ u8 scan;
int err;
BT_DBG("request for %s", hdev->name);
- status = mgmt_bredr_support(hdev);
- if (status)
+ if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
+ !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
- status);
+ MGMT_STATUS_REJECTED);
if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
@@ -1228,6 +1251,12 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
hci_req_init(&req, hdev);
+ /* The procedure for LE-only controllers is much simpler - just
+ * update the advertising data.
+ */
+ if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
+ goto update_ad;
+
scan = SCAN_PAGE;
if (cp->val) {
@@ -1260,6 +1289,9 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan);
+update_ad:
+ update_adv_data(&req);
+
err = hci_req_run(&req, set_discoverable_complete);
if (err < 0)
mgmt_pending_remove(cmd);
@@ -1451,8 +1483,15 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
hci_req_init(&req, hdev);
- if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) &&
- cp->val != test_bit(HCI_PSCAN, &hdev->flags)) {
+ /* If BR/EDR is not enabled and we disable advertising as a
+ * by-product of disabling connectable, we need to update the
+ * advertising flags.
+ */
+ if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
+ if (!cp->val)
+ clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
+ update_adv_data(&req);
+ } else if (cp->val != test_bit(HCI_PSCAN, &hdev->flags)) {
if (cp->val) {
scan = SCAN_PAGE;
} else {
@@ -4348,6 +4387,7 @@ void mgmt_discoverable_timeout(struct hci_dev *hdev)
* safe to unconditionally clear the flag.
*/
clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
+ clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
hci_req_init(&req, hdev);
if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
@@ -4356,10 +4396,13 @@ void mgmt_discoverable_timeout(struct hci_dev *hdev)
sizeof(scan), &scan);
}
update_class(&req);
+ update_adv_data(&req);
hci_req_run(&req, NULL);
hdev->discov_timeout = 0;
+ new_settings(hdev, NULL);
+
hci_dev_unlock(hdev);
}
@@ -4379,8 +4422,19 @@ void mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
else
changed = test_and_clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
- if (changed)
+ if (changed) {
+ struct hci_request req;
+
+ /* In case this change in discoverable was triggered by
+ * a disabling of connectable there could be a need to
+ * update the advertising flags.
+ */
+ hci_req_init(&req, hdev);
+ update_adv_data(&req);
+ hci_req_run(&req, NULL);
+
new_settings(hdev, NULL);
+ }
}
void mgmt_connectable(struct hci_dev *hdev, u8 connectable)
--
1.8.3.1
^ permalink raw reply related
* Re: [PATCH 9/9] Bluetooth: Update Set Discoverable to support LE
From: Marcel Holtmann @ 2013-10-19 22:11 UTC (permalink / raw)
To: johan.hedberg; +Cc: linux-bluetooth
In-Reply-To: <1382215103-6968-10-git-send-email-johan.hedberg@gmail.com>
Hi Johan,
> This patch updates the Set Discoverable management command to also be
> applicable for LE. In particular this affects the advertising flags
> where we can say "general discoverable" or "limited discoverable".
>
> Since the device flags may not be up-to-date when the advertising data
> is written this patch introduces a get_adv_discov_flags() helper
> function which also looks at any pending mgmt commands (a pending
> set_discoverable would be the exception when the flags are not yet
> correct).
>
> The patch also adds HCI_DISCOVERABLE flag clearing to the
> mgmt_discoverable_timeout function, since the code was previously
> relying on the mgmt_discoverable callback to handle this, which is only
> called for the BR/EDR-only HCI_Write_Scan_Enable command.
>
> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
> ---
> net/bluetooth/mgmt.c | 49 +++++++++++++++++++++++++++++++++++++++++++------
> 1 file changed, 43 insertions(+), 6 deletions(-)
>
> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
> index 796db58..73ed132 100644
> --- a/net/bluetooth/mgmt.c
> +++ b/net/bluetooth/mgmt.c
> @@ -599,12 +599,35 @@ static void update_scan_rsp_data(struct hci_request *req)
> hci_req_add(req, HCI_OP_LE_SET_SCAN_RSP_DATA, sizeof(cp), &cp);
> }
>
> +static u8 get_adv_discov_flags(struct hci_dev *hdev)
> +{
> + struct pending_cmd *cmd;
> +
> + /* If there's a pending mgmt command the flags will not yet have
> + * their final values, so check for this first.
> + */
> + cmd = mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
> + if (cmd) {
> + struct mgmt_mode *cp = cmd->param;
> + if (cp->val == 0x01)
> + return LE_AD_GENERAL;
> + else if (cp->val == 0x02)
> + return LE_AD_LIMITED;
> + } else {
> + if (test_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags))
> + return LE_AD_LIMITED;
> + else if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
> + return LE_AD_GENERAL;
> + }
> +
> + return 0;
> +}
> +
> static u8 create_adv_data(struct hci_dev *hdev, u8 *ptr)
> {
> u8 ad_len = 0, flags = 0;
>
> - if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
> - flags |= LE_AD_GENERAL;
> + flags |= get_adv_discov_flags(hdev);
>
> if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
> if (lmp_le_br_capable(hdev))
> @@ -1120,15 +1143,15 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
> struct pending_cmd *cmd;
> struct hci_request req;
> u16 timeout;
> - u8 scan, status;
> + u8 scan;
> int err;
>
> BT_DBG("request for %s", hdev->name);
>
> - status = mgmt_bredr_support(hdev);
> - if (status)
> + if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
> + !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
> return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
> - status);
> + MGMT_STATUS_REJECTED);
>
> if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
> return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
> @@ -1228,6 +1251,12 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
>
> hci_req_init(&req, hdev);
>
> + /* The procedure for LE-only controllers is much simpler - just
> + * update the advertising data.
> + */
> + if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
> + goto update_ad;
> +
> scan = SCAN_PAGE;
>
> if (cp->val) {
> @@ -1260,6 +1289,10 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
>
> hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan);
>
> +update_ad:
> + if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
> + update_adv_data(&req);
> +
actually update_adv_data() check for HCI_LE_ENABLED all by itself. So this check is just duplicated and not needed here.
Regards
Marcel
^ permalink raw reply
* [PATCH 9/9] Bluetooth: Update Set Discoverable to support LE
From: johan.hedberg @ 2013-10-19 20:38 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382215103-6968-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
This patch updates the Set Discoverable management command to also be
applicable for LE. In particular this affects the advertising flags
where we can say "general discoverable" or "limited discoverable".
Since the device flags may not be up-to-date when the advertising data
is written this patch introduces a get_adv_discov_flags() helper
function which also looks at any pending mgmt commands (a pending
set_discoverable would be the exception when the flags are not yet
correct).
The patch also adds HCI_DISCOVERABLE flag clearing to the
mgmt_discoverable_timeout function, since the code was previously
relying on the mgmt_discoverable callback to handle this, which is only
called for the BR/EDR-only HCI_Write_Scan_Enable command.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/mgmt.c | 49 +++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 43 insertions(+), 6 deletions(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 796db58..73ed132 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -599,12 +599,35 @@ static void update_scan_rsp_data(struct hci_request *req)
hci_req_add(req, HCI_OP_LE_SET_SCAN_RSP_DATA, sizeof(cp), &cp);
}
+static u8 get_adv_discov_flags(struct hci_dev *hdev)
+{
+ struct pending_cmd *cmd;
+
+ /* If there's a pending mgmt command the flags will not yet have
+ * their final values, so check for this first.
+ */
+ cmd = mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
+ if (cmd) {
+ struct mgmt_mode *cp = cmd->param;
+ if (cp->val == 0x01)
+ return LE_AD_GENERAL;
+ else if (cp->val == 0x02)
+ return LE_AD_LIMITED;
+ } else {
+ if (test_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags))
+ return LE_AD_LIMITED;
+ else if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
+ return LE_AD_GENERAL;
+ }
+
+ return 0;
+}
+
static u8 create_adv_data(struct hci_dev *hdev, u8 *ptr)
{
u8 ad_len = 0, flags = 0;
- if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
- flags |= LE_AD_GENERAL;
+ flags |= get_adv_discov_flags(hdev);
if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
if (lmp_le_br_capable(hdev))
@@ -1120,15 +1143,15 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
struct pending_cmd *cmd;
struct hci_request req;
u16 timeout;
- u8 scan, status;
+ u8 scan;
int err;
BT_DBG("request for %s", hdev->name);
- status = mgmt_bredr_support(hdev);
- if (status)
+ if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
+ !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
- status);
+ MGMT_STATUS_REJECTED);
if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
@@ -1228,6 +1251,12 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
hci_req_init(&req, hdev);
+ /* The procedure for LE-only controllers is much simpler - just
+ * update the advertising data.
+ */
+ if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
+ goto update_ad;
+
scan = SCAN_PAGE;
if (cp->val) {
@@ -1260,6 +1289,10 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan);
+update_ad:
+ if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
+ update_adv_data(&req);
+
err = hci_req_run(&req, set_discoverable_complete);
if (err < 0)
mgmt_pending_remove(cmd);
@@ -4348,6 +4381,7 @@ void mgmt_discoverable_timeout(struct hci_dev *hdev)
* safe to unconditionally clear the flag.
*/
clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
+ clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
hci_req_init(&req, hdev);
if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
@@ -4356,10 +4390,13 @@ void mgmt_discoverable_timeout(struct hci_dev *hdev)
sizeof(scan), &scan);
}
update_class(&req);
+ update_adv_data(&req);
hci_req_run(&req, NULL);
hdev->discov_timeout = 0;
+ new_settings(hdev, NULL);
+
hci_dev_unlock(hdev);
}
--
1.8.3.1
^ permalink raw reply related
* [PATCH 8/9] Bluetooth: Move HCI_LIMITED_DISCOVERABLE changes to a general place
From: johan.hedberg @ 2013-10-19 20:38 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382215103-6968-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
We'll soon be introducing also LE support for the Set Discoverable
management command, so move the HCI_LIMITED_DISCOVERABLE flag clearing
and setting out from the if-branch that is only used for a BR/EDR
specific HCI command.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/mgmt.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 67b95a8..796db58 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -1220,6 +1220,12 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
cancel_delayed_work(&hdev->discov_off);
hdev->discov_timeout = timeout;
+ /* Limited discoverable mode */
+ if (cp->val == 0x02)
+ set_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
+ else
+ clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
+
hci_req_init(&req, hdev);
scan = SCAN_PAGE;
@@ -1229,8 +1235,6 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
if (cp->val == 0x02) {
/* Limited discoverable mode */
- set_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
-
hci_cp.num_iac = 2;
hci_cp.iac_lap[0] = 0x00; /* LIAC */
hci_cp.iac_lap[1] = 0x8b;
@@ -1240,8 +1244,6 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
hci_cp.iac_lap[5] = 0x9e;
} else {
/* General discoverable mode */
- clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
-
hci_cp.num_iac = 1;
hci_cp.iac_lap[0] = 0x33; /* GIAC */
hci_cp.iac_lap[1] = 0x8b;
--
1.8.3.1
^ permalink raw reply related
* [PATCH 7/9] Bluetooth: Fix sending write_scan_enable when BR/EDR is disabled
From: johan.hedberg @ 2013-10-19 20:38 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382215103-6968-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
We should only send the HCI_Write_Scan_Enable command from
mgmt_set_powered_failed() when BR/EDR support is enabled. This is
particularly important when the discoverable setting is also tied to LE.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/mgmt.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 20f6309..67b95a8 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -4337,7 +4337,6 @@ void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
void mgmt_discoverable_timeout(struct hci_dev *hdev)
{
struct hci_request req;
- u8 scan = SCAN_PAGE;
hci_dev_lock(hdev);
@@ -4349,7 +4348,11 @@ void mgmt_discoverable_timeout(struct hci_dev *hdev)
clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
hci_req_init(&req, hdev);
- hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan);
+ if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
+ u8 scan = SCAN_PAGE;
+ hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE,
+ sizeof(scan), &scan);
+ }
update_class(&req);
hci_req_run(&req, NULL);
--
1.8.3.1
^ permalink raw reply related
* [PATCH 6/9] Bluetooth: Move mgmt_pending_find to avoid forward declarations
From: johan.hedberg @ 2013-10-19 20:38 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382215103-6968-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
We will soon need this function for updating the advertising data, so
move it higher up in mgmt.c to avoid a forward declaration.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/mgmt.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 51d0446..20f6309 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -536,6 +536,18 @@ static u8 *create_uuid128_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
return ptr;
}
+static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
+{
+ struct pending_cmd *cmd;
+
+ list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
+ if (cmd->opcode == opcode)
+ return cmd;
+ }
+
+ return NULL;
+}
+
static u8 create_scan_rsp_data(struct hci_dev *hdev, u8 *ptr)
{
u8 ad_len = 0;
@@ -886,18 +898,6 @@ static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
}
}
-static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
-{
- struct pending_cmd *cmd;
-
- list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
- if (cmd->opcode == opcode)
- return cmd;
- }
-
- return NULL;
-}
-
static void mgmt_pending_remove(struct pending_cmd *cmd)
{
list_del(&cmd->list);
--
1.8.3.1
^ permalink raw reply related
* [PATCH 5/9] Bluetooth: Fix updating settings when there are no HCI commands to send
From: johan.hedberg @ 2013-10-19 20:38 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382215103-6968-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
It is possible that the Set Connectable management command doesn't cause
any HCI commands to send (such as when BR/EDR is disabled). We can't
just send a response to user space in this case but must also update the
necessary device flags and settings. This patch fixes the issue by using
the recently introduced set_connectable_update_settings function.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/mgmt.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index b74a157..51d0446 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -1483,8 +1483,8 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
if (err < 0) {
mgmt_pending_remove(cmd);
if (err == -ENODATA)
- err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE,
- hdev);
+ err = set_connectable_update_settings(hdev, sk,
+ cp->val);
goto failed;
}
--
1.8.3.1
^ permalink raw reply related
* [PATCH 4/9] Bluetooth: Refactor set_connectable settings update to separate function
From: johan.hedberg @ 2013-10-19 20:38 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382215103-6968-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
We will need to directly update the device flags and notify user space
of the new settings not just when we're powered off but also if it turns
out that there are no HCI commands to send (which can happen in
particular when BR/EDR is disabled). Since this is a considerable amount
of code, refactor it to a separate function so it can be reused for the
"no HCI commands to send" case.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/mgmt.c | 46 +++++++++++++++++++++++++++-------------------
1 file changed, 27 insertions(+), 19 deletions(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index c363285..b74a157 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -1381,6 +1381,32 @@ unlock:
hci_dev_unlock(hdev);
}
+static int set_connectable_update_settings(struct hci_dev *hdev,
+ struct sock *sk, u8 val)
+{
+ bool changed = false;
+ int err;
+
+ if (!!val != test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
+ changed = true;
+
+ if (val) {
+ set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
+ } else {
+ clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
+ clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
+ }
+
+ err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
+ if (err < 0)
+ return err;
+
+ if (changed)
+ return new_settings(hdev, sk);
+
+ return 0;
+}
+
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
u16 len)
{
@@ -1404,25 +1430,7 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
hci_dev_lock(hdev);
if (!hdev_is_powered(hdev)) {
- bool changed = false;
-
- if (!!cp->val != test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
- changed = true;
-
- if (cp->val) {
- set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
- } else {
- clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
- clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
- }
-
- err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
- if (err < 0)
- goto failed;
-
- if (changed)
- err = new_settings(hdev, sk);
-
+ err = set_connectable_update_settings(hdev, sk, cp->val);
goto failed;
}
--
1.8.3.1
^ permalink raw reply related
* [PATCH 3/9] Bluetooth: Add missing check for BREDR_ENABLED flag in update_class()
From: johan.hedberg @ 2013-10-19 20:38 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382215103-6968-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
We shouldn't be sending the HCI_Write_Class_Of_Device command when
BR/EDR is disabled since this is a BR/EDR-only command.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/mgmt.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index dd0bd4a..c363285 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -749,6 +749,9 @@ static void update_class(struct hci_request *req)
if (!hdev_is_powered(hdev))
return;
+ if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
+ return;
+
if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
return;
--
1.8.3.1
^ permalink raw reply related
* [PATCH 2/9] Bluetooth: Check for flag instead of features in update_adv_data()
From: johan.hedberg @ 2013-10-19 20:38 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382215103-6968-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
It's better to check for the device flag instead of device features so
that we avoid unnecessary HCI commands when the feature is supported but
disabled (i.e. the flag is unset).
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/mgmt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index f39bab0..dd0bd4a 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -632,7 +632,7 @@ static void update_adv_data(struct hci_request *req)
struct hci_cp_le_set_adv_data cp;
u8 len;
- if (!lmp_le_capable(hdev))
+ if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
return;
memset(&cp, 0, sizeof(cp));
--
1.8.3.1
^ permalink raw reply related
* [PATCH 1/9] Bluetooth: Check for flag instead of features in update_scan_rsp_data()
From: johan.hedberg @ 2013-10-19 20:38 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1382215103-6968-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
It's better to check for the device flag instead of device features so
that we avoid unnecessary HCI commands when the feature is supported but
disabled (i.e. the flag is unset).
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/mgmt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index fb7fc9f..f39bab0 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -568,7 +568,7 @@ static void update_scan_rsp_data(struct hci_request *req)
struct hci_cp_le_set_scan_rsp_data cp;
u8 len;
- if (!lmp_le_capable(hdev))
+ if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
return;
memset(&cp, 0, sizeof(cp));
--
1.8.3.1
^ permalink raw reply related
* [PATCH 0/9] Bluetooth: Add LE support for mgmt_set_discoverable
From: johan.hedberg @ 2013-10-19 20:38 UTC (permalink / raw)
To: linux-bluetooth
Hi,
In addition to a couple if fixes in the existing mgmt code (first 5
patches), this patch set adds support for hooking up the
set_discoverable command to LE, in particular the advertising flags.
Johan
----------------------------------------------------------------
Johan Hedberg (9):
Bluetooth: Check for flag instead of features in update_scan_rsp_data()
Bluetooth: Check for flag instead of features in update_adv_data()
Bluetooth: Add missing check for BREDR_ENABLED flag in update_class()
Bluetooth: Refactor set_connectable settings update to separate function
Bluetooth: Fix updating settings when there are no HCI commands to send
Bluetooth: Move mgmt_pending_find to avoid forward declarations
Bluetooth: Fix sending write_scan_enable when BR/EDR is disabled
Bluetooth: Move HCI_LIMITED_DISCOVERABLE changes to a general place
Bluetooth: Update Set Discoverable to support LE
net/bluetooth/mgmt.c | 147 +++++++++++++++++++++++++++++++++----------------
1 file changed, 100 insertions(+), 47 deletions(-)
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox