2019-08-29 07:13:39

by K, SpoorthiX

[permalink] [raw]
Subject: [PATCH] Add Support to use Resolving List

From: Spoorthi Ravishankar Koppad <[email protected]>

As per Core specification 5.0, Vol 2, Part E, Section 7.8.38,
following code changes implements LE add device to Resolving List.

Signed-off-by: Spoorthi Ravishankar Koppad <[email protected]>
---
include/net/bluetooth/hci.h | 1 +
net/bluetooth/hci_request.c | 72 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 73 insertions(+)

diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index c36dc1e..99a38cf36 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -420,6 +420,7 @@ enum {
#define HCI_LE_SLAVE_FEATURES 0x08
#define HCI_LE_PING 0x10
#define HCI_LE_DATA_LEN_EXT 0x20
+#define HCI_LE_LL_PRIVACY 0x40
#define HCI_LE_PHY_2M 0x01
#define HCI_LE_PHY_CODED 0x08
#define HCI_LE_EXT_ADV 0x10
diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c
index ca73d36..48a1777 100644
--- a/net/bluetooth/hci_request.c
+++ b/net/bluetooth/hci_request.c
@@ -665,6 +665,70 @@ void hci_req_add_le_scan_disable(struct hci_request *req)
}
}

+static void add_to_resolve_list(struct hci_request *req,
+ struct hci_conn_params *params)
+{
+ struct hci_cp_le_add_to_resolv_list cp;
+ struct bdaddr_list_with_irk *entry;
+
+ entry = kzalloc(sizeof(*entry), GFP_KERNEL);
+ if (!entry)
+ return;
+ memset(&cp, 0, sizeof(cp));
+
+ cp.bdaddr_type = params->addr_type;
+ bacpy(&cp.bdaddr, &params->addr);
+ memcpy(entry->peer_irk, cp.peer_irk, 16);
+ memcpy(entry->local_irk, cp.local_irk, 16);
+ hci_req_add(req, HCI_OP_LE_ADD_TO_RESOLV_LIST, sizeof(cp), &cp);
+}
+
+static u8 update_resolve_list(struct hci_request *req)
+{
+ struct hci_dev *hdev = req->hdev;
+ struct hci_conn_params *params;
+ struct bdaddr_list *b;
+ int err;
+ u8 resolve_list_entries = 0;
+
+ list_for_each_entry(b, &hdev->le_resolv_list, list) {
+ /* Cannot Remove or add the device to the Resolving list
+ * whenever there is an outstanding connection.
+ */
+ if (!hci_pend_le_action_lookup(&hdev->pend_le_conns,
+ &b->bdaddr, b->bdaddr_type) &&
+ !hci_pend_le_action_lookup(&hdev->pend_le_reports,
+ &b->bdaddr, b->bdaddr_type)) {
+ struct hci_cp_le_del_from_resolv_list cp;
+
+ cp.bdaddr_type = b->bdaddr_type;
+ bacpy(&cp.bdaddr, &b->bdaddr);
+
+ hci_req_add(req, HCI_OP_LE_DEL_FROM_RESOLV_LIST,
+ sizeof(cp), &cp);
+ continue;
+ }
+
+ if (hci_find_irk_by_addr(hdev, &b->bdaddr, b->bdaddr_type)) {
+ /* Add device to resolving list */
+ resolve_list_entries++;
+ add_to_resolve_list(req, params);
+ }
+
+ if (hci_bdaddr_list_lookup(&hdev->le_resolv_list,
+ &params->addr, params->addr_type))
+ continue;
+
+ if (resolve_list_entries >= hdev->le_resolv_list_size) {
+ err = smp_generate_rpa(hdev, hdev->irk, &hdev->rpa);
+ if (err < 0)
+ BT_ERR("%s failed to generate new RPA",
+ hdev->name);
+ }
+ resolve_list_entries++;
+ }
+}
+
static void add_to_white_list(struct hci_request *req,
struct hci_conn_params *params)
{
@@ -891,6 +955,14 @@ void hci_req_add_le_passive_scan(struct hci_request *req)
(hdev->le_features[0] & HCI_LE_EXT_SCAN_POLICY))
filter_policy |= 0x02;

+ /* When filter policy is not 0x00 (no whitelist) and 0x01
+ * (whitelist enabled) and if LE Privacy is supported in controller
+ * add the device to resolving list.
+ */
+ if ((filter_policy == 0x02 || filter_policy == 0x03) &&
+ (hci_dev_test_flag(hdev, HCI_LE_LL_PRIVACY)))
+ update_resolve_list(req);
+
hci_req_start_scan(req, LE_SCAN_PASSIVE, hdev->le_scan_interval,
hdev->le_scan_window, own_addr_type, filter_policy);
}
--
1.9.1


2019-08-29 19:13:00

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] Add Support to use Resolving List

Hi,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[cannot apply to v5.3-rc6 next-20190829]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/spoorthix-k-intel-com/Add-Support-to-use-Resolving-List/20190830-003531
config: m68k-allmodconfig (attached as .config)
compiler: m68k-linux-gcc (GCC) 7.4.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=7.4.0 make.cross ARCH=m68k

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <[email protected]>

All warnings (new ones prefixed by >>):

net/bluetooth/hci_request.c: In function 'update_resolve_list':
>> net/bluetooth/hci_request.c:735:1: warning: no return statement in function returning non-void [-Wreturn-type]
}
^
net/bluetooth/hci_request.c: In function 'hci_req_add_le_passive_scan':
>> net/bluetooth/hci_request.c:684:25: warning: 'params' may be used uninitialized in this function [-Wmaybe-uninitialized]
cp.bdaddr_type = params->addr_type;
~~~~~~^~~~~~~~~~~
net/bluetooth/hci_request.c:694:26: note: 'params' was declared here
struct hci_conn_params *params;
^~~~~~

vim +735 net/bluetooth/hci_request.c

672
673 static void add_to_resolve_list(struct hci_request *req,
674 struct hci_conn_params *params)
675 {
676 struct hci_cp_le_add_to_resolv_list cp;
677 struct bdaddr_list_with_irk *entry;
678
679 entry = kzalloc(sizeof(*entry), GFP_KERNEL);
680 if (!entry)
681 return;
682 memset(&cp, 0, sizeof(cp));
683
> 684 cp.bdaddr_type = params->addr_type;
685 bacpy(&cp.bdaddr, &params->addr);
686 memcpy(entry->peer_irk, cp.peer_irk, 16);
687 memcpy(entry->local_irk, cp.local_irk, 16);
688 hci_req_add(req, HCI_OP_LE_ADD_TO_RESOLV_LIST, sizeof(cp), &cp);
689 }
690
691 static u8 update_resolve_list(struct hci_request *req)
692 {
693 struct hci_dev *hdev = req->hdev;
694 struct hci_conn_params *params;
695 struct bdaddr_list *b;
696 int err;
697 u8 resolve_list_entries = 0;
698
699 list_for_each_entry(b, &hdev->le_resolv_list, list) {
700 /* Cannot Remove or add the device to the Resolving list
701 * whenever there is an outstanding connection.
702 */
703 if (!hci_pend_le_action_lookup(&hdev->pend_le_conns,
704 &b->bdaddr, b->bdaddr_type) &&
705 !hci_pend_le_action_lookup(&hdev->pend_le_reports,
706 &b->bdaddr, b->bdaddr_type)) {
707 struct hci_cp_le_del_from_resolv_list cp;
708
709 cp.bdaddr_type = b->bdaddr_type;
710 bacpy(&cp.bdaddr, &b->bdaddr);
711
712 hci_req_add(req, HCI_OP_LE_DEL_FROM_RESOLV_LIST,
713 sizeof(cp), &cp);
714 continue;
715 }
716
717 if (hci_find_irk_by_addr(hdev, &b->bdaddr, b->bdaddr_type)) {
718 /* Add device to resolving list */
719 resolve_list_entries++;
720 add_to_resolve_list(req, params);
721 }
722
723 if (hci_bdaddr_list_lookup(&hdev->le_resolv_list,
724 &params->addr, params->addr_type))
725 continue;
726
727 if (resolve_list_entries >= hdev->le_resolv_list_size) {
728 err = smp_generate_rpa(hdev, hdev->irk, &hdev->rpa);
729 if (err < 0)
730 BT_ERR("%s failed to generate new RPA",
731 hdev->name);
732 }
733 resolve_list_entries++;
734 }
> 735 }
736

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (3.92 kB)
.config.gz (49.74 kB)
Download all attachments