msft.c 30 KB

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