Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) 2020 Google Corporation
   4 */
   5
   6#include <net/bluetooth/bluetooth.h>
   7#include <net/bluetooth/hci_core.h>
   8#include <net/bluetooth/mgmt.h>
   9
  10#include "hci_request.h"
  11#include "mgmt_util.h"
  12#include "msft.h"
  13
  14#define MSFT_RSSI_THRESHOLD_VALUE_MIN		-127
  15#define MSFT_RSSI_THRESHOLD_VALUE_MAX		20
  16#define MSFT_RSSI_LOW_TIMEOUT_MAX		0x3C
  17
  18#define MSFT_OP_READ_SUPPORTED_FEATURES		0x00
  19struct msft_cp_read_supported_features {
  20	__u8   sub_opcode;
  21} __packed;
  22
  23struct msft_rp_read_supported_features {
  24	__u8   status;
  25	__u8   sub_opcode;
  26	__le64 features;
  27	__u8   evt_prefix_len;
  28	__u8   evt_prefix[];
  29} __packed;
  30
  31#define MSFT_OP_LE_MONITOR_ADVERTISEMENT	0x03
  32#define MSFT_MONITOR_ADVERTISEMENT_TYPE_PATTERN	0x01
  33struct msft_le_monitor_advertisement_pattern {
  34	__u8 length;
  35	__u8 data_type;
  36	__u8 start_byte;
  37	__u8 pattern[];
  38};
  39
  40struct msft_le_monitor_advertisement_pattern_data {
  41	__u8 count;
  42	__u8 data[];
  43};
  44
  45struct msft_cp_le_monitor_advertisement {
  46	__u8 sub_opcode;
  47	__s8 rssi_high;
  48	__s8 rssi_low;
  49	__u8 rssi_low_interval;
  50	__u8 rssi_sampling_period;
  51	__u8 cond_type;
  52	__u8 data[];
  53} __packed;
  54
  55struct msft_rp_le_monitor_advertisement {
  56	__u8 status;
  57	__u8 sub_opcode;
  58	__u8 handle;
  59} __packed;
  60
  61#define MSFT_OP_LE_CANCEL_MONITOR_ADVERTISEMENT	0x04
  62struct msft_cp_le_cancel_monitor_advertisement {
  63	__u8 sub_opcode;
  64	__u8 handle;
  65} __packed;
  66
  67struct msft_rp_le_cancel_monitor_advertisement {
  68	__u8 status;
  69	__u8 sub_opcode;
  70} __packed;
  71
  72#define MSFT_OP_LE_SET_ADVERTISEMENT_FILTER_ENABLE	0x05
  73struct msft_cp_le_set_advertisement_filter_enable {
  74	__u8 sub_opcode;
  75	__u8 enable;
  76} __packed;
  77
  78struct msft_rp_le_set_advertisement_filter_enable {
  79	__u8 status;
  80	__u8 sub_opcode;
  81} __packed;
  82
  83#define MSFT_EV_LE_MONITOR_DEVICE	0x02
  84struct msft_ev_le_monitor_device {
  85	__u8     addr_type;
  86	bdaddr_t bdaddr;
  87	__u8     monitor_handle;
  88	__u8     monitor_state;
  89} __packed;
  90
  91struct msft_monitor_advertisement_handle_data {
  92	__u8  msft_handle;
  93	__u16 mgmt_handle;
  94	__s8 rssi_high;
  95	__s8 rssi_low;
  96	__u8 rssi_low_interval;
  97	__u8 rssi_sampling_period;
  98	__u8 cond_type;
  99	struct list_head list;
 100};
 101
 102enum monitor_addr_filter_state {
 103	AF_STATE_IDLE,
 104	AF_STATE_ADDING,
 105	AF_STATE_ADDED,
 106	AF_STATE_REMOVING,
 107};
 108
 109#define MSFT_MONITOR_ADVERTISEMENT_TYPE_ADDR	0x04
 110struct msft_monitor_addr_filter_data {
 111	__u8     msft_handle;
 112	__u8     pattern_handle; /* address filters pertain to */
 113	__u16    mgmt_handle;
 114	int      state;
 115	__s8     rssi_high;
 116	__s8     rssi_low;
 117	__u8     rssi_low_interval;
 118	__u8     rssi_sampling_period;
 119	__u8     addr_type;
 120	bdaddr_t bdaddr;
 121	struct list_head list;
 122};
 123
 124struct msft_data {
 125	__u64 features;
 126	__u8  evt_prefix_len;
 127	__u8  *evt_prefix;
 128	struct list_head handle_map;
 129	struct list_head address_filters;
 130	__u8 resuming;
 131	__u8 suspending;
 132	__u8 filter_enabled;
 133	/* To synchronize add/remove address filter and monitor device event.*/
 134	struct mutex filter_lock;
 135};
 136
 137bool msft_monitor_supported(struct hci_dev *hdev)
 138{
 139	return !!(msft_get_features(hdev) & MSFT_FEATURE_MASK_LE_ADV_MONITOR);
 140}
 141
 142static bool read_supported_features(struct hci_dev *hdev,
 143				    struct msft_data *msft)
 144{
 145	struct msft_cp_read_supported_features cp;
 146	struct msft_rp_read_supported_features *rp;
 147	struct sk_buff *skb;
 148
 149	cp.sub_opcode = MSFT_OP_READ_SUPPORTED_FEATURES;
 150
 151	skb = __hci_cmd_sync(hdev, hdev->msft_opcode, sizeof(cp), &cp,
 152			     HCI_CMD_TIMEOUT);
 153	if (IS_ERR(skb)) {
 154		bt_dev_err(hdev, "Failed to read MSFT supported features (%ld)",
 155			   PTR_ERR(skb));
 156		return false;
 157	}
 158
 159	if (skb->len < sizeof(*rp)) {
 160		bt_dev_err(hdev, "MSFT supported features length mismatch");
 161		goto failed;
 162	}
 163
 164	rp = (struct msft_rp_read_supported_features *)skb->data;
 165
 166	if (rp->sub_opcode != MSFT_OP_READ_SUPPORTED_FEATURES)
 167		goto failed;
 168
 169	if (rp->evt_prefix_len > 0) {
 170		msft->evt_prefix = kmemdup(rp->evt_prefix, rp->evt_prefix_len,
 171					   GFP_KERNEL);
 172		if (!msft->evt_prefix)
 173			goto failed;
 174	}
 175
 176	msft->evt_prefix_len = rp->evt_prefix_len;
 177	msft->features = __le64_to_cpu(rp->features);
 178
 179	if (msft->features & MSFT_FEATURE_MASK_CURVE_VALIDITY)
 180		hdev->msft_curve_validity = true;
 181
 182	kfree_skb(skb);
 183	return true;
 184
 185failed:
 186	kfree_skb(skb);
 187	return false;
 188}
 189
 190/* is_mgmt = true matches the handle exposed to userspace via mgmt.
 191 * is_mgmt = false matches the handle used by the msft controller.
 192 * This function requires the caller holds hdev->lock
 193 */
 194static struct msft_monitor_advertisement_handle_data *msft_find_handle_data
 195				(struct hci_dev *hdev, u16 handle, bool is_mgmt)
 196{
 197	struct msft_monitor_advertisement_handle_data *entry;
 198	struct msft_data *msft = hdev->msft_data;
 199
 200	list_for_each_entry(entry, &msft->handle_map, list) {
 201		if (is_mgmt && entry->mgmt_handle == handle)
 202			return entry;
 203		if (!is_mgmt && entry->msft_handle == handle)
 204			return entry;
 205	}
 206
 207	return NULL;
 208}
 209
 210/* This function requires the caller holds msft->filter_lock */
 211static struct msft_monitor_addr_filter_data *msft_find_address_data
 212			(struct hci_dev *hdev, u8 addr_type, bdaddr_t *addr,
 213			 u8 pattern_handle)
 214{
 215	struct msft_monitor_addr_filter_data *entry;
 216	struct msft_data *msft = hdev->msft_data;
 217
 218	list_for_each_entry(entry, &msft->address_filters, list) {
 219		if (entry->pattern_handle == pattern_handle &&
 220		    addr_type == entry->addr_type &&
 221		    !bacmp(addr, &entry->bdaddr))
 222			return entry;
 223	}
 224
 225	return NULL;
 226}
 227
 228/* This function requires the caller holds hdev->lock */
 229static int msft_monitor_device_del(struct hci_dev *hdev, __u16 mgmt_handle,
 230				   bdaddr_t *bdaddr, __u8 addr_type,
 231				   bool notify)
 232{
 233	struct monitored_device *dev, *tmp;
 234	int count = 0;
 235
 236	list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices, list) {
 237		/* mgmt_handle == 0 indicates remove all devices, whereas,
 238		 * bdaddr == NULL indicates remove all devices matching the
 239		 * mgmt_handle.
 240		 */
 241		if ((!mgmt_handle || dev->handle == mgmt_handle) &&
 242		    (!bdaddr || (!bacmp(bdaddr, &dev->bdaddr) &&
 243				 addr_type == dev->addr_type))) {
 244			if (notify && dev->notified) {
 245				mgmt_adv_monitor_device_lost(hdev, dev->handle,
 246							     &dev->bdaddr,
 247							     dev->addr_type);
 248			}
 249
 250			list_del(&dev->list);
 251			kfree(dev);
 252			count++;
 253		}
 254	}
 255
 256	return count;
 257}
 258
 259static int msft_le_monitor_advertisement_cb(struct hci_dev *hdev, u16 opcode,
 260					    struct adv_monitor *monitor,
 261					    struct sk_buff *skb)
 262{
 263	struct msft_rp_le_monitor_advertisement *rp;
 264	struct msft_monitor_advertisement_handle_data *handle_data;
 265	struct msft_data *msft = hdev->msft_data;
 266	int status = 0;
 267
 268	hci_dev_lock(hdev);
 269
 270	rp = (struct msft_rp_le_monitor_advertisement *)skb->data;
 271	if (skb->len < sizeof(*rp)) {
 272		status = HCI_ERROR_UNSPECIFIED;
 273		goto unlock;
 274	}
 275
 276	status = rp->status;
 277	if (status)
 278		goto unlock;
 279
 280	handle_data = kmalloc(sizeof(*handle_data), GFP_KERNEL);
 281	if (!handle_data) {
 282		status = HCI_ERROR_UNSPECIFIED;
 283		goto unlock;
 284	}
 285
 286	handle_data->mgmt_handle = monitor->handle;
 287	handle_data->msft_handle = rp->handle;
 288	handle_data->cond_type   = MSFT_MONITOR_ADVERTISEMENT_TYPE_PATTERN;
 289	INIT_LIST_HEAD(&handle_data->list);
 290	list_add(&handle_data->list, &msft->handle_map);
 291
 292	monitor->state = ADV_MONITOR_STATE_OFFLOADED;
 293
 294unlock:
 295	if (status)
 296		hci_free_adv_monitor(hdev, monitor);
 297
 298	hci_dev_unlock(hdev);
 299
 300	return status;
 301}
 302
 303/* This function requires the caller holds hci_req_sync_lock */
 304static void msft_remove_addr_filters_sync(struct hci_dev *hdev, u8 handle)
 305{
 306	struct msft_monitor_addr_filter_data *address_filter, *n;
 307	struct msft_cp_le_cancel_monitor_advertisement cp;
 308	struct msft_data *msft = hdev->msft_data;
 309	struct list_head head;
 310	struct sk_buff *skb;
 311
 312	INIT_LIST_HEAD(&head);
 313
 314	/* Cancel all corresponding address monitors */
 315	mutex_lock(&msft->filter_lock);
 316
 317	list_for_each_entry_safe(address_filter, n, &msft->address_filters,
 318				 list) {
 319		if (address_filter->pattern_handle != handle)
 320			continue;
 321
 322		list_del(&address_filter->list);
 323
 324		/* Keep the address filter and let
 325		 * msft_add_address_filter_sync() remove and free the address
 326		 * filter.
 327		 */
 328		if (address_filter->state == AF_STATE_ADDING) {
 329			address_filter->state = AF_STATE_REMOVING;
 330			continue;
 331		}
 332
 333		/* Keep the address filter and let
 334		 * msft_cancel_address_filter_sync() remove and free the address
 335		 * filter
 336		 */
 337		if (address_filter->state == AF_STATE_REMOVING)
 338			continue;
 339
 340		list_add_tail(&address_filter->list, &head);
 341	}
 342
 343	mutex_unlock(&msft->filter_lock);
 344
 345	list_for_each_entry_safe(address_filter, n, &head, list) {
 346		list_del(&address_filter->list);
 347
 348		cp.sub_opcode = MSFT_OP_LE_CANCEL_MONITOR_ADVERTISEMENT;
 349		cp.handle = address_filter->msft_handle;
 350
 351		skb = __hci_cmd_sync(hdev, hdev->msft_opcode, sizeof(cp), &cp,
 352				     HCI_CMD_TIMEOUT);
 353		if (IS_ERR(skb)) {
 354			kfree(address_filter);
 355			continue;
 356		}
 357
 358		kfree_skb(skb);
 359
 360		bt_dev_dbg(hdev, "MSFT: Canceled device %pMR address filter",
 361			   &address_filter->bdaddr);
 362
 363		kfree(address_filter);
 364	}
 365}
 366
 367static int msft_le_cancel_monitor_advertisement_cb(struct hci_dev *hdev,
 368						   u16 opcode,
 369						   struct adv_monitor *monitor,
 370						   struct sk_buff *skb)
 371{
 372	struct msft_rp_le_cancel_monitor_advertisement *rp;
 373	struct msft_monitor_advertisement_handle_data *handle_data;
 374	struct msft_data *msft = hdev->msft_data;
 375	int status = 0;
 376	u8 msft_handle;
 377
 378	rp = (struct msft_rp_le_cancel_monitor_advertisement *)skb->data;
 379	if (skb->len < sizeof(*rp)) {
 380		status = HCI_ERROR_UNSPECIFIED;
 381		goto done;
 382	}
 383
 384	status = rp->status;
 385	if (status)
 386		goto done;
 387
 388	hci_dev_lock(hdev);
 389
 390	handle_data = msft_find_handle_data(hdev, monitor->handle, true);
 391
 392	if (handle_data) {
 393		if (monitor->state == ADV_MONITOR_STATE_OFFLOADED)
 394			monitor->state = ADV_MONITOR_STATE_REGISTERED;
 395
 396		/* Do not free the monitor if it is being removed due to
 397		 * suspend. It will be re-monitored on resume.
 398		 */
 399		if (!msft->suspending) {
 400			hci_free_adv_monitor(hdev, monitor);
 401
 402			/* Clear any monitored devices by this Adv Monitor */
 403			msft_monitor_device_del(hdev, handle_data->mgmt_handle,
 404						NULL, 0, false);
 405		}
 406
 407		msft_handle = handle_data->msft_handle;
 408
 409		list_del(&handle_data->list);
 410		kfree(handle_data);
 411
 412		hci_dev_unlock(hdev);
 413
 414		msft_remove_addr_filters_sync(hdev, msft_handle);
 415	} else {
 416		hci_dev_unlock(hdev);
 417	}
 418
 419done:
 420	return status;
 421}
 422
 423/* This function requires the caller holds hci_req_sync_lock */
 424static int msft_remove_monitor_sync(struct hci_dev *hdev,
 425				    struct adv_monitor *monitor)
 426{
 427	struct msft_cp_le_cancel_monitor_advertisement cp;
 428	struct msft_monitor_advertisement_handle_data *handle_data;
 429	struct sk_buff *skb;
 430
 431	handle_data = msft_find_handle_data(hdev, monitor->handle, true);
 432
 433	/* If no matched handle, just remove without telling controller */
 434	if (!handle_data)
 435		return -ENOENT;
 436
 437	cp.sub_opcode = MSFT_OP_LE_CANCEL_MONITOR_ADVERTISEMENT;
 438	cp.handle = handle_data->msft_handle;
 439
 440	skb = __hci_cmd_sync(hdev, hdev->msft_opcode, sizeof(cp), &cp,
 441			     HCI_CMD_TIMEOUT);
 442	if (IS_ERR(skb))
 443		return PTR_ERR(skb);
 444
 445	return msft_le_cancel_monitor_advertisement_cb(hdev, hdev->msft_opcode,
 446						       monitor, skb);
 447}
 448
 449/* This function requires the caller holds hci_req_sync_lock */
 450int msft_suspend_sync(struct hci_dev *hdev)
 451{
 452	struct msft_data *msft = hdev->msft_data;
 453	struct adv_monitor *monitor;
 454	int handle = 0;
 455
 456	if (!msft || !msft_monitor_supported(hdev))
 457		return 0;
 458
 459	msft->suspending = true;
 460
 461	while (1) {
 462		monitor = idr_get_next(&hdev->adv_monitors_idr, &handle);
 463		if (!monitor)
 464			break;
 465
 466		msft_remove_monitor_sync(hdev, monitor);
 467
 468		handle++;
 469	}
 470
 471	/* All monitors have been removed */
 472	msft->suspending = false;
 473
 474	return 0;
 475}
 476
 477static bool msft_monitor_rssi_valid(struct adv_monitor *monitor)
 478{
 479	struct adv_rssi_thresholds *r = &monitor->rssi;
 480
 481	if (r->high_threshold < MSFT_RSSI_THRESHOLD_VALUE_MIN ||
 482	    r->high_threshold > MSFT_RSSI_THRESHOLD_VALUE_MAX ||
 483	    r->low_threshold < MSFT_RSSI_THRESHOLD_VALUE_MIN ||
 484	    r->low_threshold > MSFT_RSSI_THRESHOLD_VALUE_MAX)
 485		return false;
 486
 487	/* High_threshold_timeout is not supported,
 488	 * once high_threshold is reached, events are immediately reported.
 489	 */
 490	if (r->high_threshold_timeout != 0)
 491		return false;
 492
 493	if (r->low_threshold_timeout > MSFT_RSSI_LOW_TIMEOUT_MAX)
 494		return false;
 495
 496	/* Sampling period from 0x00 to 0xFF are all allowed */
 497	return true;
 498}
 499
 500static bool msft_monitor_pattern_valid(struct adv_monitor *monitor)
 501{
 502	return msft_monitor_rssi_valid(monitor);
 503	/* No additional check needed for pattern-based monitor */
 504}
 505
 506static int msft_add_monitor_sync(struct hci_dev *hdev,
 507				 struct adv_monitor *monitor)
 508{
 509	struct msft_cp_le_monitor_advertisement *cp;
 510	struct msft_le_monitor_advertisement_pattern_data *pattern_data;
 511	struct msft_monitor_advertisement_handle_data *handle_data;
 512	struct msft_le_monitor_advertisement_pattern *pattern;
 513	struct adv_pattern *entry;
 514	size_t total_size = sizeof(*cp) + sizeof(*pattern_data);
 515	ptrdiff_t offset = 0;
 516	u8 pattern_count = 0;
 517	struct sk_buff *skb;
 518	int err;
 519
 520	if (!msft_monitor_pattern_valid(monitor))
 521		return -EINVAL;
 522
 523	list_for_each_entry(entry, &monitor->patterns, list) {
 524		pattern_count++;
 525		total_size += sizeof(*pattern) + entry->length;
 526	}
 527
 528	cp = kmalloc(total_size, GFP_KERNEL);
 529	if (!cp)
 530		return -ENOMEM;
 531
 532	cp->sub_opcode = MSFT_OP_LE_MONITOR_ADVERTISEMENT;
 533	cp->rssi_high = monitor->rssi.high_threshold;
 534	cp->rssi_low = monitor->rssi.low_threshold;
 535	cp->rssi_low_interval = (u8)monitor->rssi.low_threshold_timeout;
 536	cp->rssi_sampling_period = monitor->rssi.sampling_period;
 537
 538	cp->cond_type = MSFT_MONITOR_ADVERTISEMENT_TYPE_PATTERN;
 539
 540	pattern_data = (void *)cp->data;
 541	pattern_data->count = pattern_count;
 542
 543	list_for_each_entry(entry, &monitor->patterns, list) {
 544		pattern = (void *)(pattern_data->data + offset);
 545		/* the length also includes data_type and offset */
 546		pattern->length = entry->length + 2;
 547		pattern->data_type = entry->ad_type;
 548		pattern->start_byte = entry->offset;
 549		memcpy(pattern->pattern, entry->value, entry->length);
 550		offset += sizeof(*pattern) + entry->length;
 551	}
 552
 553	skb = __hci_cmd_sync(hdev, hdev->msft_opcode, total_size, cp,
 554			     HCI_CMD_TIMEOUT);
 555
 556	if (IS_ERR(skb)) {
 557		err = PTR_ERR(skb);
 558		goto out_free;
 559	}
 560
 561	err = msft_le_monitor_advertisement_cb(hdev, hdev->msft_opcode,
 562					       monitor, skb);
 563	if (err)
 564		goto out_free;
 565
 566	handle_data = msft_find_handle_data(hdev, monitor->handle, true);
 567	if (!handle_data) {
 568		err = -ENODATA;
 569		goto out_free;
 570	}
 571
 572	handle_data->rssi_high	= cp->rssi_high;
 573	handle_data->rssi_low	= cp->rssi_low;
 574	handle_data->rssi_low_interval	  = cp->rssi_low_interval;
 575	handle_data->rssi_sampling_period = cp->rssi_sampling_period;
 576
 577out_free:
 578	kfree(cp);
 579	return err;
 580}
 581
 582/* This function requires the caller holds hci_req_sync_lock */
 583static void reregister_monitor(struct hci_dev *hdev)
 584{
 585	struct adv_monitor *monitor;
 586	struct msft_data *msft = hdev->msft_data;
 587	int handle = 0;
 588
 589	if (!msft)
 590		return;
 591
 592	msft->resuming = true;
 593
 594	while (1) {
 595		monitor = idr_get_next(&hdev->adv_monitors_idr, &handle);
 596		if (!monitor)
 597			break;
 598
 599		msft_add_monitor_sync(hdev, monitor);
 600
 601		handle++;
 602	}
 603
 604	/* All monitors have been reregistered */
 605	msft->resuming = false;
 606}
 607
 608/* This function requires the caller holds hci_req_sync_lock */
 609int msft_resume_sync(struct hci_dev *hdev)
 610{
 611	struct msft_data *msft = hdev->msft_data;
 612
 613	if (!msft || !msft_monitor_supported(hdev))
 614		return 0;
 615
 616	hci_dev_lock(hdev);
 617
 618	/* Clear already tracked devices on resume. Once the monitors are
 619	 * reregistered, devices in range will be found again after resume.
 620	 */
 621	hdev->advmon_pend_notify = false;
 622	msft_monitor_device_del(hdev, 0, NULL, 0, true);
 623
 624	hci_dev_unlock(hdev);
 625
 626	reregister_monitor(hdev);
 627
 628	return 0;
 629}
 630
 631/* This function requires the caller holds hci_req_sync_lock */
 632void msft_do_open(struct hci_dev *hdev)
 633{
 634	struct msft_data *msft = hdev->msft_data;
 635
 636	if (hdev->msft_opcode == HCI_OP_NOP)
 637		return;
 638
 639	if (!msft) {
 640		bt_dev_err(hdev, "MSFT extension not registered");
 641		return;
 642	}
 643
 644	bt_dev_dbg(hdev, "Initialize MSFT extension");
 645
 646	/* Reset existing MSFT data before re-reading */
 647	kfree(msft->evt_prefix);
 648	msft->evt_prefix = NULL;
 649	msft->evt_prefix_len = 0;
 650	msft->features = 0;
 651
 652	if (!read_supported_features(hdev, msft)) {
 653		hdev->msft_data = NULL;
 654		kfree(msft);
 655		return;
 656	}
 657
 658	if (msft_monitor_supported(hdev)) {
 659		msft->resuming = true;
 660		msft_set_filter_enable(hdev, true);
 661		/* Monitors get removed on power off, so we need to explicitly
 662		 * tell the controller to re-monitor.
 663		 */
 664		reregister_monitor(hdev);
 665	}
 666}
 667
 668void msft_do_close(struct hci_dev *hdev)
 669{
 670	struct msft_data *msft = hdev->msft_data;
 671	struct msft_monitor_advertisement_handle_data *handle_data, *tmp;
 672	struct msft_monitor_addr_filter_data *address_filter, *n;
 673	struct adv_monitor *monitor;
 674
 675	if (!msft)
 676		return;
 677
 678	bt_dev_dbg(hdev, "Cleanup of MSFT extension");
 679
 680	/* The controller will silently remove all monitors on power off.
 681	 * Therefore, remove handle_data mapping and reset monitor state.
 682	 */
 683	list_for_each_entry_safe(handle_data, tmp, &msft->handle_map, list) {
 684		monitor = idr_find(&hdev->adv_monitors_idr,
 685				   handle_data->mgmt_handle);
 686
 687		if (monitor && monitor->state == ADV_MONITOR_STATE_OFFLOADED)
 688			monitor->state = ADV_MONITOR_STATE_REGISTERED;
 689
 690		list_del(&handle_data->list);
 691		kfree(handle_data);
 692	}
 693
 694	mutex_lock(&msft->filter_lock);
 695	list_for_each_entry_safe(address_filter, n, &msft->address_filters,
 696				 list) {
 697		list_del(&address_filter->list);
 698		kfree(address_filter);
 699	}
 700	mutex_unlock(&msft->filter_lock);
 701
 702	hci_dev_lock(hdev);
 703
 704	/* Clear any devices that are being monitored and notify device lost */
 705	hdev->advmon_pend_notify = false;
 706	msft_monitor_device_del(hdev, 0, NULL, 0, true);
 707
 708	hci_dev_unlock(hdev);
 709}
 710
 711static int msft_cancel_address_filter_sync(struct hci_dev *hdev, void *data)
 712{
 713	struct msft_monitor_addr_filter_data *address_filter = data;
 714	struct msft_cp_le_cancel_monitor_advertisement cp;
 715	struct msft_data *msft = hdev->msft_data;
 716	struct sk_buff *skb;
 717	int err = 0;
 718
 719	if (!msft) {
 720		bt_dev_err(hdev, "MSFT: msft data is freed");
 721		return -EINVAL;
 722	}
 723
 724	/* The address filter has been removed by hci dev close */
 725	if (!test_bit(HCI_UP, &hdev->flags))
 726		return 0;
 727
 728	mutex_lock(&msft->filter_lock);
 729	list_del(&address_filter->list);
 730	mutex_unlock(&msft->filter_lock);
 731
 732	cp.sub_opcode = MSFT_OP_LE_CANCEL_MONITOR_ADVERTISEMENT;
 733	cp.handle = address_filter->msft_handle;
 734
 735	skb = __hci_cmd_sync(hdev, hdev->msft_opcode, sizeof(cp), &cp,
 736			     HCI_CMD_TIMEOUT);
 737	if (IS_ERR(skb)) {
 738		bt_dev_err(hdev, "MSFT: Failed to cancel address (%pMR) filter",
 739			   &address_filter->bdaddr);
 740		err = PTR_ERR(skb);
 741		goto done;
 742	}
 743	kfree_skb(skb);
 744
 745	bt_dev_dbg(hdev, "MSFT: Canceled device %pMR address filter",
 746		   &address_filter->bdaddr);
 747
 748done:
 749	kfree(address_filter);
 750
 751	return err;
 752}
 753
 754void msft_register(struct hci_dev *hdev)
 755{
 756	struct msft_data *msft = NULL;
 757
 758	bt_dev_dbg(hdev, "Register MSFT extension");
 759
 760	msft = kzalloc(sizeof(*msft), GFP_KERNEL);
 761	if (!msft) {
 762		bt_dev_err(hdev, "Failed to register MSFT extension");
 763		return;
 764	}
 765
 766	INIT_LIST_HEAD(&msft->handle_map);
 767	INIT_LIST_HEAD(&msft->address_filters);
 768	hdev->msft_data = msft;
 769	mutex_init(&msft->filter_lock);
 770}
 771
 772void msft_unregister(struct hci_dev *hdev)
 773{
 774	struct msft_data *msft = hdev->msft_data;
 775
 776	if (!msft)
 777		return;
 778
 779	bt_dev_dbg(hdev, "Unregister MSFT extension");
 780
 781	hdev->msft_data = NULL;
 782
 783	kfree(msft->evt_prefix);
 784	mutex_destroy(&msft->filter_lock);
 785	kfree(msft);
 786}
 787
 788/* This function requires the caller holds hdev->lock */
 789static void msft_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr,
 790			      __u8 addr_type, __u16 mgmt_handle)
 791{
 792	struct monitored_device *dev;
 793
 794	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
 795	if (!dev) {
 796		bt_dev_err(hdev, "MSFT vendor event %u: no memory",
 797			   MSFT_EV_LE_MONITOR_DEVICE);
 798		return;
 799	}
 800
 801	bacpy(&dev->bdaddr, bdaddr);
 802	dev->addr_type = addr_type;
 803	dev->handle = mgmt_handle;
 804	dev->notified = false;
 805
 806	INIT_LIST_HEAD(&dev->list);
 807	list_add(&dev->list, &hdev->monitored_devices);
 808	hdev->advmon_pend_notify = true;
 809}
 810
 811/* This function requires the caller holds hdev->lock */
 812static void msft_device_lost(struct hci_dev *hdev, bdaddr_t *bdaddr,
 813			     __u8 addr_type, __u16 mgmt_handle)
 814{
 815	if (!msft_monitor_device_del(hdev, mgmt_handle, bdaddr, addr_type,
 816				     true)) {
 817		bt_dev_err(hdev, "MSFT vendor event %u: dev %pMR not in list",
 818			   MSFT_EV_LE_MONITOR_DEVICE, bdaddr);
 819	}
 820}
 821
 822static void *msft_skb_pull(struct hci_dev *hdev, struct sk_buff *skb,
 823			   u8 ev, size_t len)
 824{
 825	void *data;
 826
 827	data = skb_pull_data(skb, len);
 828	if (!data)
 829		bt_dev_err(hdev, "Malformed MSFT vendor event: 0x%02x", ev);
 830
 831	return data;
 832}
 833
 834static int msft_add_address_filter_sync(struct hci_dev *hdev, void *data)
 835{
 836	struct msft_monitor_addr_filter_data *address_filter = data;
 837	struct msft_rp_le_monitor_advertisement *rp;
 838	struct msft_cp_le_monitor_advertisement *cp;
 839	struct msft_data *msft = hdev->msft_data;
 840	struct sk_buff *skb = NULL;
 841	bool remove = false;
 842	size_t size;
 843
 844	if (!msft) {
 845		bt_dev_err(hdev, "MSFT: msft data is freed");
 846		return -EINVAL;
 847	}
 848
 849	/* The address filter has been removed by hci dev close */
 850	if (!test_bit(HCI_UP, &hdev->flags))
 851		return -ENODEV;
 852
 853	/* We are safe to use the address filter from now on.
 854	 * msft_monitor_device_evt() wouldn't delete this filter because it's
 855	 * not been added by now.
 856	 * And all other functions that requiring hci_req_sync_lock wouldn't
 857	 * touch this filter before this func completes because it's protected
 858	 * by hci_req_sync_lock.
 859	 */
 860
 861	if (address_filter->state == AF_STATE_REMOVING) {
 862		mutex_lock(&msft->filter_lock);
 863		list_del(&address_filter->list);
 864		mutex_unlock(&msft->filter_lock);
 865		kfree(address_filter);
 866		return 0;
 867	}
 868
 869	size = sizeof(*cp) +
 870	       sizeof(address_filter->addr_type) +
 871	       sizeof(address_filter->bdaddr);
 872	cp = kzalloc(size, GFP_KERNEL);
 873	if (!cp) {
 874		bt_dev_err(hdev, "MSFT: Alloc cmd param err");
 875		remove = true;
 876		goto done;
 877	}
 878	cp->sub_opcode           = MSFT_OP_LE_MONITOR_ADVERTISEMENT;
 879	cp->rssi_high		 = address_filter->rssi_high;
 880	cp->rssi_low		 = address_filter->rssi_low;
 881	cp->rssi_low_interval    = address_filter->rssi_low_interval;
 882	cp->rssi_sampling_period = address_filter->rssi_sampling_period;
 883	cp->cond_type            = MSFT_MONITOR_ADVERTISEMENT_TYPE_ADDR;
 884	cp->data[0]              = address_filter->addr_type;
 885	memcpy(&cp->data[1], &address_filter->bdaddr,
 886	       sizeof(address_filter->bdaddr));
 887
 888	skb = __hci_cmd_sync(hdev, hdev->msft_opcode, size, cp,
 889			     HCI_CMD_TIMEOUT);
 890	if (IS_ERR(skb)) {
 891		bt_dev_err(hdev, "Failed to enable address %pMR filter",
 892			   &address_filter->bdaddr);
 893		skb = NULL;
 894		remove = true;
 895		goto done;
 896	}
 897
 898	rp = skb_pull_data(skb, sizeof(*rp));
 899	if (!rp || rp->sub_opcode != MSFT_OP_LE_MONITOR_ADVERTISEMENT ||
 900	    rp->status)
 901		remove = true;
 902
 903done:
 904	mutex_lock(&msft->filter_lock);
 905
 906	if (remove) {
 907		bt_dev_warn(hdev, "MSFT: Remove address (%pMR) filter",
 908			    &address_filter->bdaddr);
 909		list_del(&address_filter->list);
 910		kfree(address_filter);
 911	} else {
 912		address_filter->state = AF_STATE_ADDED;
 913		address_filter->msft_handle = rp->handle;
 914		bt_dev_dbg(hdev, "MSFT: Address %pMR filter enabled",
 915			   &address_filter->bdaddr);
 916	}
 917	mutex_unlock(&msft->filter_lock);
 918
 919	kfree_skb(skb);
 920
 921	return 0;
 922}
 923
 924/* This function requires the caller holds msft->filter_lock */
 925static struct msft_monitor_addr_filter_data *msft_add_address_filter
 926		(struct hci_dev *hdev, u8 addr_type, bdaddr_t *bdaddr,
 927		 struct msft_monitor_advertisement_handle_data *handle_data)
 928{
 929	struct msft_monitor_addr_filter_data *address_filter = NULL;
 930	struct msft_data *msft = hdev->msft_data;
 931	int err;
 932
 933	address_filter = kzalloc(sizeof(*address_filter), GFP_KERNEL);
 934	if (!address_filter)
 935		return NULL;
 936
 937	address_filter->state             = AF_STATE_ADDING;
 938	address_filter->msft_handle       = 0xff;
 939	address_filter->pattern_handle    = handle_data->msft_handle;
 940	address_filter->mgmt_handle       = handle_data->mgmt_handle;
 941	address_filter->rssi_high         = handle_data->rssi_high;
 942	address_filter->rssi_low          = handle_data->rssi_low;
 943	address_filter->rssi_low_interval = handle_data->rssi_low_interval;
 944	address_filter->rssi_sampling_period = handle_data->rssi_sampling_period;
 945	address_filter->addr_type            = addr_type;
 946	bacpy(&address_filter->bdaddr, bdaddr);
 947
 948	/* With the above AF_STATE_ADDING, duplicated address filter can be
 949	 * avoided when receiving monitor device event (found/lost) frequently
 950	 * for the same device.
 951	 */
 952	list_add_tail(&address_filter->list, &msft->address_filters);
 953
 954	err = hci_cmd_sync_queue(hdev, msft_add_address_filter_sync,
 955				 address_filter, NULL);
 956	if (err < 0) {
 957		bt_dev_err(hdev, "MSFT: Add address %pMR filter err", bdaddr);
 958		list_del(&address_filter->list);
 959		kfree(address_filter);
 960		return NULL;
 961	}
 962
 963	bt_dev_dbg(hdev, "MSFT: Add device %pMR address filter",
 964		   &address_filter->bdaddr);
 965
 966	return address_filter;
 967}
 968
 969/* This function requires the caller holds hdev->lock */
 970static void msft_monitor_device_evt(struct hci_dev *hdev, struct sk_buff *skb)
 971{
 972	struct msft_monitor_addr_filter_data *n, *address_filter = NULL;
 973	struct msft_ev_le_monitor_device *ev;
 974	struct msft_monitor_advertisement_handle_data *handle_data;
 975	struct msft_data *msft = hdev->msft_data;
 976	u16 mgmt_handle = 0xffff;
 977	u8 addr_type;
 978
 979	ev = msft_skb_pull(hdev, skb, MSFT_EV_LE_MONITOR_DEVICE, sizeof(*ev));
 980	if (!ev)
 981		return;
 982
 983	bt_dev_dbg(hdev,
 984		   "MSFT vendor event 0x%02x: handle 0x%04x state %d addr %pMR",
 985		   MSFT_EV_LE_MONITOR_DEVICE, ev->monitor_handle,
 986		   ev->monitor_state, &ev->bdaddr);
 987
 988	handle_data = msft_find_handle_data(hdev, ev->monitor_handle, false);
 989
 990	if (!test_bit(HCI_QUIRK_USE_MSFT_EXT_ADDRESS_FILTER, &hdev->quirks)) {
 991		if (!handle_data)
 992			return;
 993		mgmt_handle = handle_data->mgmt_handle;
 994		goto report_state;
 995	}
 996
 997	if (handle_data) {
 998		/* Don't report any device found/lost event from pattern
 999		 * monitors. Pattern monitor always has its address filters for
1000		 * tracking devices.
1001		 */
1002
1003		address_filter = msft_find_address_data(hdev, ev->addr_type,
1004							&ev->bdaddr,
1005							handle_data->msft_handle);
1006		if (address_filter)
1007			return;
1008
1009		if (ev->monitor_state && handle_data->cond_type ==
1010				MSFT_MONITOR_ADVERTISEMENT_TYPE_PATTERN)
1011			msft_add_address_filter(hdev, ev->addr_type,
1012						&ev->bdaddr, handle_data);
1013
1014		return;
1015	}
1016
1017	/* This device event is not from pattern monitor.
1018	 * Report it if there is a corresponding address_filter for it.
1019	 */
1020	list_for_each_entry(n, &msft->address_filters, list) {
1021		if (n->state == AF_STATE_ADDED &&
1022		    n->msft_handle == ev->monitor_handle) {
1023			mgmt_handle = n->mgmt_handle;
1024			address_filter = n;
1025			break;
1026		}
1027	}
1028
1029	if (!address_filter) {
1030		bt_dev_warn(hdev, "MSFT: Unexpected device event %pMR, %u, %u",
1031			    &ev->bdaddr, ev->monitor_handle, ev->monitor_state);
1032		return;
1033	}
1034
1035report_state:
1036	switch (ev->addr_type) {
1037	case ADDR_LE_DEV_PUBLIC:
1038		addr_type = BDADDR_LE_PUBLIC;
1039		break;
1040
1041	case ADDR_LE_DEV_RANDOM:
1042		addr_type = BDADDR_LE_RANDOM;
1043		break;
1044
1045	default:
1046		bt_dev_err(hdev,
1047			   "MSFT vendor event 0x%02x: unknown addr type 0x%02x",
1048			   MSFT_EV_LE_MONITOR_DEVICE, ev->addr_type);
1049		return;
1050	}
1051
1052	if (ev->monitor_state) {
1053		msft_device_found(hdev, &ev->bdaddr, addr_type, mgmt_handle);
1054	} else {
1055		if (address_filter && address_filter->state == AF_STATE_ADDED) {
1056			address_filter->state = AF_STATE_REMOVING;
1057			hci_cmd_sync_queue(hdev,
1058					   msft_cancel_address_filter_sync,
1059					   address_filter,
1060					   NULL);
1061		}
1062		msft_device_lost(hdev, &ev->bdaddr, addr_type, mgmt_handle);
1063	}
1064}
1065
1066void msft_vendor_evt(struct hci_dev *hdev, void *data, struct sk_buff *skb)
1067{
1068	struct msft_data *msft = hdev->msft_data;
1069	u8 *evt_prefix;
1070	u8 *evt;
1071
1072	if (!msft)
1073		return;
1074
1075	/* When the extension has defined an event prefix, check that it
1076	 * matches, and otherwise just return.
1077	 */
1078	if (msft->evt_prefix_len > 0) {
1079		evt_prefix = msft_skb_pull(hdev, skb, 0, msft->evt_prefix_len);
1080		if (!evt_prefix)
1081			return;
1082
1083		if (memcmp(evt_prefix, msft->evt_prefix, msft->evt_prefix_len))
1084			return;
1085	}
1086
1087	/* Every event starts at least with an event code and the rest of
1088	 * the data is variable and depends on the event code.
1089	 */
1090	if (skb->len < 1)
1091		return;
1092
1093	evt = msft_skb_pull(hdev, skb, 0, sizeof(*evt));
1094	if (!evt)
1095		return;
1096
1097	hci_dev_lock(hdev);
1098
1099	switch (*evt) {
1100	case MSFT_EV_LE_MONITOR_DEVICE:
1101		mutex_lock(&msft->filter_lock);
1102		msft_monitor_device_evt(hdev, skb);
1103		mutex_unlock(&msft->filter_lock);
1104		break;
1105
1106	default:
1107		bt_dev_dbg(hdev, "MSFT vendor event 0x%02x", *evt);
1108		break;
1109	}
1110
1111	hci_dev_unlock(hdev);
1112}
1113
1114__u64 msft_get_features(struct hci_dev *hdev)
1115{
1116	struct msft_data *msft = hdev->msft_data;
1117
1118	return msft ? msft->features : 0;
1119}
1120
1121static void msft_le_set_advertisement_filter_enable_cb(struct hci_dev *hdev,
1122						       void *user_data,
1123						       u8 status)
1124{
1125	struct msft_cp_le_set_advertisement_filter_enable *cp = user_data;
1126	struct msft_data *msft = hdev->msft_data;
1127
1128	/* Error 0x0C would be returned if the filter enabled status is
1129	 * already set to whatever we were trying to set.
1130	 * Although the default state should be disabled, some controller set
1131	 * the initial value to enabled. Because there is no way to know the
1132	 * actual initial value before sending this command, here we also treat
1133	 * error 0x0C as success.
1134	 */
1135	if (status != 0x00 && status != 0x0C)
1136		return;
1137
1138	hci_dev_lock(hdev);
1139
1140	msft->filter_enabled = cp->enable;
1141
1142	if (status == 0x0C)
1143		bt_dev_warn(hdev, "MSFT filter_enable is already %s",
1144			    cp->enable ? "on" : "off");
1145
1146	hci_dev_unlock(hdev);
1147}
1148
1149/* This function requires the caller holds hci_req_sync_lock */
1150int msft_add_monitor_pattern(struct hci_dev *hdev, struct adv_monitor *monitor)
1151{
1152	struct msft_data *msft = hdev->msft_data;
1153
1154	if (!msft)
1155		return -EOPNOTSUPP;
1156
1157	if (msft->resuming || msft->suspending)
1158		return -EBUSY;
1159
1160	return msft_add_monitor_sync(hdev, monitor);
1161}
1162
1163/* This function requires the caller holds hci_req_sync_lock */
1164int msft_remove_monitor(struct hci_dev *hdev, struct adv_monitor *monitor)
1165{
1166	struct msft_data *msft = hdev->msft_data;
1167
1168	if (!msft)
1169		return -EOPNOTSUPP;
1170
1171	if (msft->resuming || msft->suspending)
1172		return -EBUSY;
1173
1174	return msft_remove_monitor_sync(hdev, monitor);
1175}
1176
1177int msft_set_filter_enable(struct hci_dev *hdev, bool enable)
1178{
1179	struct msft_cp_le_set_advertisement_filter_enable cp;
1180	struct msft_data *msft = hdev->msft_data;
1181	int err;
1182
1183	if (!msft)
1184		return -EOPNOTSUPP;
1185
1186	cp.sub_opcode = MSFT_OP_LE_SET_ADVERTISEMENT_FILTER_ENABLE;
1187	cp.enable = enable;
1188	err = __hci_cmd_sync_status(hdev, hdev->msft_opcode, sizeof(cp), &cp,
1189				    HCI_CMD_TIMEOUT);
1190
1191	msft_le_set_advertisement_filter_enable_cb(hdev, &cp, err);
1192
1193	return 0;
1194}
1195
1196bool msft_curve_validity(struct hci_dev *hdev)
1197{
1198	return hdev->msft_curve_validity;
1199}