* [PATCH v8 2/3] bluetooth: mgmt: Add MGMT Adv Monitor Device Found/Lost events
2021-12-16 4:39 [PATCH v8 1/3] bluetooth: msft: Handle MSFT Monitor Device Event Manish Mandlik
@ 2021-12-16 4:39 ` Manish Mandlik
2021-12-16 4:39 ` [PATCH v8 3/3] bluetooth: mgmt: Fix sizeof in mgmt_device_found() Manish Mandlik
2021-12-16 10:08 ` [PATCH v8 1/3] bluetooth: msft: Handle MSFT Monitor Device Event kernel test robot
2 siblings, 0 replies; 4+ messages in thread
From: Manish Mandlik @ 2021-12-16 4:39 UTC (permalink / raw)
To: marcel, luiz.dentz
Cc: chromeos-bluetooth-upstreaming, linux-bluetooth, Manish Mandlik,
Miao-chen Chou, David S. Miller, Jakub Kicinski, Johan Hedberg,
linux-kernel, netdev
This patch introduces two new MGMT events for notifying the bluetoothd
whenever the controller starts/stops monitoring a device.
Test performed:
- Verified by logs that the MSFT Monitor Device is received from the
controller and the bluetoothd is notified whenever the controller
starts/stops monitoring a device.
Signed-off-by: Manish Mandlik <mmandlik@google.com>
Reviewed-by: Miao-chen Chou <mcchou@google.com>
---
Changes in v8:
- Refactor mgmt_adv_monitor_device_found() to make use of
skb_put/skb_put_data.
Changes in v7:
- Refactor mgmt_device_found() to fix stack frame size limit
Changes in v6:
- Fix compiler warning for mgmt_adv_monitor_device_found().
Changes in v5:
- New patch in the series. Split previous patch into two.
- Update the Device Found logic to send existing Device Found event or
Adv Monitor Device Found event depending on the active scanning state.
include/net/bluetooth/hci_core.h | 3 +
include/net/bluetooth/mgmt.h | 16 +++++
net/bluetooth/mgmt.c | 115 +++++++++++++++++++++++++++++--
net/bluetooth/msft.c | 15 +++-
4 files changed, 143 insertions(+), 6 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index c2a8b1163c30..290b8a1ac0f9 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -600,6 +600,7 @@ struct hci_dev {
struct delayed_work interleave_scan;
struct list_head monitored_devices;
+ bool advmon_pend_notify;
#if IS_ENABLED(CONFIG_BT_LEDS)
struct led_trigger *power_led;
@@ -1852,6 +1853,8 @@ void mgmt_adv_monitor_removed(struct hci_dev *hdev, u16 handle);
int mgmt_phy_configuration_changed(struct hci_dev *hdev, struct sock *skip);
int mgmt_add_adv_patterns_monitor_complete(struct hci_dev *hdev, u8 status);
int mgmt_remove_adv_monitor_complete(struct hci_dev *hdev, u8 status);
+void mgmt_adv_monitor_device_lost(struct hci_dev *hdev, u16 handle,
+ bdaddr_t *bdaddr, u8 addr_type);
u8 hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, u16 latency,
u16 to_multiplier);
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
index 107b25deae68..99266f7aebdc 100644
--- a/include/net/bluetooth/mgmt.h
+++ b/include/net/bluetooth/mgmt.h
@@ -1104,3 +1104,19 @@ struct mgmt_ev_controller_resume {
#define MGMT_WAKE_REASON_NON_BT_WAKE 0x0
#define MGMT_WAKE_REASON_UNEXPECTED 0x1
#define MGMT_WAKE_REASON_REMOTE_WAKE 0x2
+
+#define MGMT_EV_ADV_MONITOR_DEVICE_FOUND 0x002f
+struct mgmt_ev_adv_monitor_device_found {
+ __le16 monitor_handle;
+ struct mgmt_addr_info addr;
+ __s8 rssi;
+ __le32 flags;
+ __le16 eir_len;
+ __u8 eir[0];
+} __packed;
+
+#define MGMT_EV_ADV_MONITOR_DEVICE_LOST 0x0030
+struct mgmt_ev_adv_monitor_device_lost {
+ __le16 monitor_handle;
+ struct mgmt_addr_info addr;
+} __packed;
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index e931e417d3e1..c65247b5896c 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -174,6 +174,8 @@ static const u16 mgmt_events[] = {
MGMT_EV_ADV_MONITOR_REMOVED,
MGMT_EV_CONTROLLER_SUSPEND,
MGMT_EV_CONTROLLER_RESUME,
+ MGMT_EV_ADV_MONITOR_DEVICE_FOUND,
+ MGMT_EV_ADV_MONITOR_DEVICE_LOST,
};
static const u16 mgmt_untrusted_commands[] = {
@@ -9562,12 +9564,116 @@ static bool is_filter_match(struct hci_dev *hdev, s8 rssi, u8 *eir,
return true;
}
+void mgmt_adv_monitor_device_lost(struct hci_dev *hdev, u16 handle,
+ bdaddr_t *bdaddr, u8 addr_type)
+{
+ struct mgmt_ev_adv_monitor_device_lost ev;
+
+ ev.monitor_handle = cpu_to_le16(handle);
+ bacpy(&ev.addr.bdaddr, bdaddr);
+ ev.addr.type = addr_type;
+
+ mgmt_event(MGMT_EV_ADV_MONITOR_DEVICE_LOST, hdev, &ev, sizeof(ev),
+ NULL);
+}
+
+static void mgmt_adv_monitor_device_found(struct hci_dev *hdev,
+ bdaddr_t *bdaddr, bool report_device,
+ struct sk_buff *skb,
+ struct sock *skip_sk)
+{
+ struct sk_buff *advmon_skb;
+ size_t advmon_skb_len;
+ __le16 *monitor_handle;
+ struct monitored_device *dev, *tmp;
+ bool matched = false;
+ bool notify = false;
+
+ /* We have received the Advertisement Report because:
+ * 1. the kernel has initiated active discovery
+ * 2. if not, we have pend_le_reports > 0 in which case we are doing
+ * passive scanning
+ * 3. if none of the above is true, we have one or more active
+ * Advertisement Monitor
+ *
+ * For case 1 and 2, report all advertisements via MGMT_EV_DEVICE_FOUND
+ * and report ONLY one advertisement per device for the matched Monitor
+ * via MGMT_EV_ADV_MONITOR_DEVICE_FOUND event.
+ *
+ * For case 3, since we are not active scanning and all advertisements
+ * received are due to a matched Advertisement Monitor, report all
+ * advertisements ONLY via MGMT_EV_ADV_MONITOR_DEVICE_FOUND event.
+ */
+ if (report_device && !hdev->advmon_pend_notify) {
+ mgmt_event_skb(skb, skip_sk);
+ return;
+ }
+
+ advmon_skb_len = (sizeof(struct mgmt_ev_adv_monitor_device_found) -
+ sizeof(struct mgmt_ev_device_found)) + skb->len;
+ advmon_skb = mgmt_alloc_skb(hdev, MGMT_EV_ADV_MONITOR_DEVICE_FOUND,
+ advmon_skb_len);
+ if (!advmon_skb) {
+ if (report_device)
+ mgmt_event_skb(skb, skip_sk);
+ else
+ kfree_skb(skb);
+ return;
+ }
+
+ /* ADV_MONITOR_DEVICE_FOUND is similar to DEVICE_FOUND event except
+ * that it also has 'monitor_handle'. Make a copy of DEVICE_FOUND and
+ * store monitor_handle of the matched monitor.
+ */
+ monitor_handle = skb_put(advmon_skb, sizeof(*monitor_handle));
+ skb_put_data(advmon_skb, skb->data, skb->len);
+
+ hdev->advmon_pend_notify = false;
+
+ list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices, list) {
+ if (!bacmp(&dev->bdaddr, bdaddr)) {
+ matched = true;
+
+ if (!dev->notified) {
+ *monitor_handle = cpu_to_le16(dev->handle);
+ notify = true;
+ dev->notified = true;
+ }
+ }
+
+ if (!dev->notified)
+ hdev->advmon_pend_notify = true;
+ }
+
+ if (!report_device &&
+ ((matched && !notify) || !msft_monitor_supported(hdev))) {
+ /* Handle 0 indicates that we are not active scanning and this
+ * is a subsequent advertisement report for an already matched
+ * Advertisement Monitor or the controller offloading support
+ * is not available.
+ */
+ *monitor_handle = 0;
+ notify = true;
+ }
+
+ if (report_device)
+ mgmt_event_skb(skb, skip_sk);
+ else
+ kfree_skb(skb);
+
+ if (notify)
+ mgmt_event_skb(advmon_skb, skip_sk);
+ else
+ kfree_skb(advmon_skb);
+}
+
void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
u8 addr_type, u8 *dev_class, s8 rssi, u32 flags,
u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len)
{
struct sk_buff *skb;
struct mgmt_ev_device_found *ev;
+ bool report_device = hci_discovery_active(hdev);
/* Don't send events for a non-kernel initiated discovery. With
* LE one exception is if we have pend_le_reports > 0 in which
@@ -9576,11 +9682,10 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
if (!hci_discovery_active(hdev)) {
if (link_type == ACL_LINK)
return;
- if (link_type == LE_LINK &&
- list_empty(&hdev->pend_le_reports) &&
- !hci_is_adv_monitoring(hdev)) {
+ if (link_type == LE_LINK && !list_empty(&hdev->pend_le_reports))
+ report_device = true;
+ else if (!hci_is_adv_monitoring(hdev))
return;
- }
}
if (hdev->discovery.result_filtering) {
@@ -9645,7 +9750,7 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len);
- mgmt_event_skb(skb, NULL);
+ mgmt_adv_monitor_device_found(hdev, bdaddr, report_device, skb, NULL);
}
void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
diff --git a/net/bluetooth/msft.c b/net/bluetooth/msft.c
index b4544b1acf8f..61bedd1927e6 100644
--- a/net/bluetooth/msft.c
+++ b/net/bluetooth/msft.c
@@ -578,8 +578,16 @@ void msft_do_close(struct hci_dev *hdev)
hci_dev_lock(hdev);
- /* Clear any devices that are being monitored */
+ /* Clear any devices that are being monitored and notify device lost */
+
+ hdev->advmon_pend_notify = false;
+
list_for_each_entry_safe(dev, tmp_dev, &hdev->monitored_devices, list) {
+ if (dev->notified)
+ mgmt_adv_monitor_device_lost(hdev, dev->handle,
+ &dev->bdaddr,
+ dev->addr_type);
+
list_del(&dev->list);
kfree(dev);
}
@@ -638,6 +646,7 @@ static void msft_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr,
INIT_LIST_HEAD(&dev->list);
list_add(&dev->list, &hdev->monitored_devices);
+ hdev->advmon_pend_notify = true;
}
/* This function requires the caller holds hdev->lock */
@@ -648,6 +657,10 @@ static void msft_device_lost(struct hci_dev *hdev, bdaddr_t *bdaddr,
list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices, list) {
if (dev->handle == mgmt_handle) {
+ if (dev->notified)
+ mgmt_adv_monitor_device_lost(hdev, mgmt_handle,
+ bdaddr, addr_type);
+
list_del(&dev->list);
kfree(dev);
--
2.34.1.173.g76aa8bc2d0-goog
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH v8 3/3] bluetooth: mgmt: Fix sizeof in mgmt_device_found()
2021-12-16 4:39 [PATCH v8 1/3] bluetooth: msft: Handle MSFT Monitor Device Event Manish Mandlik
2021-12-16 4:39 ` [PATCH v8 2/3] bluetooth: mgmt: Add MGMT Adv Monitor Device Found/Lost events Manish Mandlik
@ 2021-12-16 4:39 ` Manish Mandlik
2021-12-16 10:08 ` [PATCH v8 1/3] bluetooth: msft: Handle MSFT Monitor Device Event kernel test robot
2 siblings, 0 replies; 4+ messages in thread
From: Manish Mandlik @ 2021-12-16 4:39 UTC (permalink / raw)
To: marcel, luiz.dentz
Cc: chromeos-bluetooth-upstreaming, linux-bluetooth, Manish Mandlik,
David S. Miller, Jakub Kicinski, Johan Hedberg, linux-kernel,
netdev
Use correct sizeof() parameter while allocating skb.
Signed-off-by: Manish Mandlik <mmandlik@google.com>
---
Changes in v8:
- New patch in the series.
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 c65247b5896c..5fd29bd399f1 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -9709,7 +9709,7 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
/* Allocate skb. The 5 extra bytes are for the potential CoD field */
skb = mgmt_alloc_skb(hdev, MGMT_EV_DEVICE_FOUND,
- sizeof(ev) + eir_len + scan_rsp_len + 5);
+ sizeof(*ev) + eir_len + scan_rsp_len + 5);
if (!skb)
return;
--
2.34.1.173.g76aa8bc2d0-goog
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v8 1/3] bluetooth: msft: Handle MSFT Monitor Device Event
2021-12-16 4:39 [PATCH v8 1/3] bluetooth: msft: Handle MSFT Monitor Device Event Manish Mandlik
2021-12-16 4:39 ` [PATCH v8 2/3] bluetooth: mgmt: Add MGMT Adv Monitor Device Found/Lost events Manish Mandlik
2021-12-16 4:39 ` [PATCH v8 3/3] bluetooth: mgmt: Fix sizeof in mgmt_device_found() Manish Mandlik
@ 2021-12-16 10:08 ` kernel test robot
2 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2021-12-16 10:08 UTC (permalink / raw)
To: Manish Mandlik, marcel, luiz.dentz
Cc: kbuild-all, chromeos-bluetooth-upstreaming, linux-bluetooth,
Manish Mandlik, Miao-chen Chou, Jakub Kicinski, Johan Hedberg,
linux-kernel, netdev
Hi Manish,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on bluetooth-next/master]
[also build test ERROR on next-20211215]
[cannot apply to bluetooth/master v5.16-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Manish-Mandlik/bluetooth-msft-Handle-MSFT-Monitor-Device-Event/20211216-124056
base: https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master
config: arc-randconfig-r043-20211216 (https://download.01.org/0day-ci/archive/20211216/202112161736.WMgjxclO-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/db0604d7b0d0308963bdc1465b486be11d5fdcb6
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Manish-Mandlik/bluetooth-msft-Handle-MSFT-Monitor-Device-Event/20211216-124056
git checkout db0604d7b0d0308963bdc1465b486be11d5fdcb6
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arc SHELL=/bin/bash net/bluetooth/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
In file included from include/linux/wait.h:7,
from include/linux/poll.h:8,
from include/net/bluetooth/bluetooth.h:28,
from net/bluetooth/msft.c:6:
net/bluetooth/msft.c: In function 'msft_le_cancel_monitor_advertisement_cb':
>> net/bluetooth/msft.c:306:42: error: 'dev' undeclared (first use in this function); did you mean 'hdev'?
306 | list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices,
| ^~~
include/linux/list.h:717:14: note: in definition of macro 'list_for_each_entry_safe'
717 | for (pos = list_first_entry(head, typeof(*pos), member), \
| ^~~
net/bluetooth/msft.c:306:42: note: each undeclared identifier is reported only once for each function it appears in
306 | list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices,
| ^~~
include/linux/list.h:717:14: note: in definition of macro 'list_for_each_entry_safe'
717 | for (pos = list_first_entry(head, typeof(*pos), member), \
| ^~~
In file included from arch/arc/include/asm/cache.h:28,
from include/linux/cache.h:6,
from include/linux/time.h:5,
from include/linux/ktime.h:24,
from include/linux/poll.h:7,
from include/net/bluetooth/bluetooth.h:28,
from net/bluetooth/msft.c:6:
include/linux/compiler_types.h:276:27: error: expression in static assertion is not an integer
276 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^~~~
include/linux/container_of.h:19:9: note: in expansion of macro 'static_assert'
19 | static_assert(__same_type(*(ptr), ((type *)0)->member) || \
| ^~~~~~~~~~~~~
include/linux/container_of.h:19:23: note: in expansion of macro '__same_type'
19 | static_assert(__same_type(*(ptr), ((type *)0)->member) || \
| ^~~~~~~~~~~
include/linux/list.h:513:9: note: in expansion of macro 'container_of'
513 | container_of(ptr, type, member)
| ^~~~~~~~~~~~
include/linux/list.h:524:9: note: in expansion of macro 'list_entry'
524 | list_entry((ptr)->next, type, member)
| ^~~~~~~~~~
include/linux/list.h:717:20: note: in expansion of macro 'list_first_entry'
717 | for (pos = list_first_entry(head, typeof(*pos), member), \
| ^~~~~~~~~~~~~~~~
net/bluetooth/msft.c:306:17: note: in expansion of macro 'list_for_each_entry_safe'
306 | list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices,
| ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from include/linux/wait.h:7,
from include/linux/poll.h:8,
from include/net/bluetooth/bluetooth.h:28,
from net/bluetooth/msft.c:6:
>> net/bluetooth/msft.c:306:47: error: 'tmp' undeclared (first use in this function); did you mean 'tm'?
306 | list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices,
| ^~~
include/linux/list.h:718:17: note: in definition of macro 'list_for_each_entry_safe'
718 | n = list_next_entry(pos, member); \
| ^
In file included from arch/arc/include/asm/cache.h:28,
from include/linux/cache.h:6,
from include/linux/time.h:5,
from include/linux/ktime.h:24,
from include/linux/poll.h:7,
from include/net/bluetooth/bluetooth.h:28,
from net/bluetooth/msft.c:6:
include/linux/compiler_types.h:276:27: error: expression in static assertion is not an integer
276 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^~~~
include/linux/container_of.h:19:9: note: in expansion of macro 'static_assert'
19 | static_assert(__same_type(*(ptr), ((type *)0)->member) || \
| ^~~~~~~~~~~~~
include/linux/container_of.h:19:23: note: in expansion of macro '__same_type'
19 | static_assert(__same_type(*(ptr), ((type *)0)->member) || \
| ^~~~~~~~~~~
include/linux/list.h:513:9: note: in expansion of macro 'container_of'
513 | container_of(ptr, type, member)
| ^~~~~~~~~~~~
include/linux/list.h:557:9: note: in expansion of macro 'list_entry'
557 | list_entry((pos)->member.next, typeof(*(pos)), member)
| ^~~~~~~~~~
include/linux/list.h:718:21: note: in expansion of macro 'list_next_entry'
718 | n = list_next_entry(pos, member); \
| ^~~~~~~~~~~~~~~
net/bluetooth/msft.c:306:17: note: in expansion of macro 'list_for_each_entry_safe'
306 | list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices,
| ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from include/linux/wait.h:7,
from include/linux/poll.h:8,
from include/net/bluetooth/bluetooth.h:28,
from net/bluetooth/msft.c:6:
include/linux/list.h:717:64: warning: left-hand operand of comma expression has no effect [-Wunused-value]
717 | for (pos = list_first_entry(head, typeof(*pos), member), \
| ^
net/bluetooth/msft.c:306:17: note: in expansion of macro 'list_for_each_entry_safe'
306 | list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices,
| ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from arch/arc/include/asm/cache.h:28,
from include/linux/cache.h:6,
from include/linux/time.h:5,
from include/linux/ktime.h:24,
from include/linux/poll.h:7,
from include/net/bluetooth/bluetooth.h:28,
from net/bluetooth/msft.c:6:
include/linux/compiler_types.h:276:27: error: expression in static assertion is not an integer
276 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^~~~
include/linux/container_of.h:19:9: note: in expansion of macro 'static_assert'
19 | static_assert(__same_type(*(ptr), ((type *)0)->member) || \
| ^~~~~~~~~~~~~
include/linux/container_of.h:19:23: note: in expansion of macro '__same_type'
19 | static_assert(__same_type(*(ptr), ((type *)0)->member) || \
| ^~~~~~~~~~~
include/linux/list.h:513:9: note: in expansion of macro 'container_of'
513 | container_of(ptr, type, member)
| ^~~~~~~~~~~~
include/linux/list.h:557:9: note: in expansion of macro 'list_entry'
557 | list_entry((pos)->member.next, typeof(*(pos)), member)
| ^~~~~~~~~~
include/linux/list.h:720:27: note: in expansion of macro 'list_next_entry'
720 | pos = n, n = list_next_entry(n, member))
| ^~~~~~~~~~~~~~~
net/bluetooth/msft.c:306:17: note: in expansion of macro 'list_for_each_entry_safe'
306 | list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices,
| ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from include/linux/wait.h:7,
from include/linux/poll.h:8,
from include/net/bluetooth/bluetooth.h:28,
from net/bluetooth/msft.c:6:
include/linux/list.h:720:21: warning: left-hand operand of comma expression has no effect [-Wunused-value]
720 | pos = n, n = list_next_entry(n, member))
| ^
net/bluetooth/msft.c:306:17: note: in expansion of macro 'list_for_each_entry_safe'
306 | list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices,
| ^~~~~~~~~~~~~~~~~~~~~~~~
vim +306 net/bluetooth/msft.c
265
266 static void msft_le_cancel_monitor_advertisement_cb(struct hci_dev *hdev,
267 u8 status, u16 opcode,
268 struct sk_buff *skb)
269 {
270 struct msft_cp_le_cancel_monitor_advertisement *cp;
271 struct msft_rp_le_cancel_monitor_advertisement *rp;
272 struct adv_monitor *monitor;
273 struct msft_monitor_advertisement_handle_data *handle_data;
274 struct msft_data *msft = hdev->msft_data;
275 int err;
276 bool pending;
277
278 if (status)
279 goto done;
280
281 rp = (struct msft_rp_le_cancel_monitor_advertisement *)skb->data;
282 if (skb->len < sizeof(*rp)) {
283 status = HCI_ERROR_UNSPECIFIED;
284 goto done;
285 }
286
287 hci_dev_lock(hdev);
288
289 cp = hci_sent_cmd_data(hdev, hdev->msft_opcode);
290 handle_data = msft_find_handle_data(hdev, cp->handle, false);
291
292 if (handle_data) {
293 monitor = idr_find(&hdev->adv_monitors_idr,
294 handle_data->mgmt_handle);
295
296 if (monitor && monitor->state == ADV_MONITOR_STATE_OFFLOADED)
297 monitor->state = ADV_MONITOR_STATE_REGISTERED;
298
299 /* Do not free the monitor if it is being removed due to
300 * suspend. It will be re-monitored on resume.
301 */
302 if (monitor && !msft->suspending)
303 hci_free_adv_monitor(hdev, monitor);
304
305 /* Clear any monitored devices by this Adv Monitor */
> 306 list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices,
307 list) {
308 if (dev->handle == handle_data->mgmt_handle) {
309 list_del(&dev->list);
310 kfree(dev);
311 }
312 }
313
314 list_del(&handle_data->list);
315 kfree(handle_data);
316 }
317
318 /* If remove all monitors is required, we need to continue the process
319 * here because the earlier it was paused when waiting for the
320 * response from controller.
321 */
322 if (msft->pending_remove_handle == 0) {
323 pending = hci_remove_all_adv_monitor(hdev, &err);
324 if (pending) {
325 hci_dev_unlock(hdev);
326 return;
327 }
328
329 if (err)
330 status = HCI_ERROR_UNSPECIFIED;
331 }
332
333 hci_dev_unlock(hdev);
334
335 done:
336 if (!msft->suspending)
337 hci_remove_adv_monitor_complete(hdev, status);
338 }
339
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 4+ messages in thread