Skip to contentSkip to conversation

Add Mesh functionality to net/bluetooth

PATCH Superseded Brian Gix 3 participants 5 messages May 10, 2022 – May 11, 2022

Subsystems (2)

v3 of 7 Superseded Latest is v7 →

lore
Share & tools
lore

Brian Gix

author
#0 lore raw

v3 cover Add Mesh functionality to net/bluetooth

Housekeeping and implementation

v2: Add checking for Packet Ownership when querying Tx queue state
Add cleanup of Tx queue when MGMT socket closes

v3: Fix CI complaints

Brian Gix (2):
Bluetooth: Implement support for Mesh
Bluetooth: Add experimental wrapper for MGMT based mesh

 include/net/bluetooth/bluetooth.h |   1 +
 include/net/bluetooth/hci.h       |   4 +
 include/net/bluetooth/hci_core.h  |  18 +-
 include/net/bluetooth/hci_sync.h  |   3 +
 include/net/bluetooth/mgmt.h      |  51 +++
 net/bluetooth/hci_conn.c          |   2 +-
 net/bluetooth/hci_core.c          |   1 +
 net/bluetooth/hci_event.c         |  61 ++--
 net/bluetooth/hci_request.c       | 116 +++++--
 net/bluetooth/hci_sock.c          |   1 +
 net/bluetooth/hci_sync.c          | 103 ++++--
 net/bluetooth/mgmt.c              | 552 +++++++++++++++++++++++++++++-
 net/bluetooth/mgmt_util.c         |  69 ++++
 net/bluetooth/mgmt_util.h         |  17 +
 14 files changed, 914 insertions(+), 85 deletions(-)
Signature · 1 line
2.35.1
author
#1 lore raw

PATCH v3 1/2 Bluetooth: Implement support for Mesh

The patch adds state bits, storage and HCI command chains for sending and receiving Bluetooth Mesh advertising packets, and delivery to requesting user space processes. It specifically creates 4 new MGMT commands and 2 new MGMT events:

MGMT_OP_SET_MESH_RECEIVER - Sets passive scan parameters and a list of AD Types which will trigger Mesh Packet Received events

MGMT_OP_MESH_READ_FEATURES - Returns information on how many outbound Mesh packets can be simultaneously queued, and what the currently queued handles are.

MGMT_OP_MESH_SEND - Command to queue a specific outbound Mesh packet, with the number of times it should be sent, and the BD Addr to use.

MGMT_OP_MESH_SEND_CANCEL - Command to cancel a prior outbound message request.

MGMT_EV_MESH_DEVICE_FOUND - Event to deliver entire received Mesh Advertisement packet, along with timing information.

MGMT_EV_MESH_PACKET_CMPLT - Event to indicate that an outbound packet is no longer queued for delivery.

---
 include/net/bluetooth/bluetooth.h |   1 +
 include/net/bluetooth/hci.h       |   3 +
 include/net/bluetooth/hci_core.h  |  18 +-
 include/net/bluetooth/hci_sync.h  |   3 +
 include/net/bluetooth/mgmt.h      |  51 ++++
 net/bluetooth/hci_conn.c          |   2 +-
 net/bluetooth/hci_core.c          |   1 +
 net/bluetooth/hci_event.c         |  61 ++--
 net/bluetooth/hci_request.c       | 116 ++++++--
 net/bluetooth/hci_sock.c          |   1 +
 net/bluetooth/hci_sync.c          | 103 +++++--
 net/bluetooth/mgmt.c              | 443 +++++++++++++++++++++++++++++-
 net/bluetooth/mgmt_util.c         |  69 +++++
 net/bluetooth/mgmt_util.h         |  17 ++
 14 files changed, 810 insertions(+), 79 deletions(-)
include/net/bluetooth/bluetooth.h +1 -0
index 6b48d9e2aab9..506b7bacc656 100644
@@ -560,6 +560,7 @@ static inline void sco_exit(void)
 
 int mgmt_init(void);
 void mgmt_exit(void);
+void mgmt_cleanup(struct sock *sk);
 
 void bt_sock_reclassify_lock(struct sock *sk, int proto);
 
include/net/bluetooth/hci.h +3 -0
index 62a9bb022aed..5d70beb54cab 100644
@@ -362,6 +362,9 @@ enum {
 	HCI_OFFLOAD_CODECS_ENABLED,
 	HCI_LE_SIMULTANEOUS_ROLES,
 
+	HCI_MESH,
+	HCI_MESH_SENDING,
+
 	__HCI_NUM_FLAGS,
 };
 
include/net/bluetooth/hci_core.h +16 -2
index 64d3a63759a8..36f5ed2a5460 100644
@@ -357,6 +357,8 @@ struct hci_dev {
 	__u8		le_resolv_list_size;
 	__u8		le_num_of_adv_sets;
 	__u8		le_states[8];
+	__u8		mesh_ad_types[16];
+	__u8		mesh_send_ref;
 	__u8		commands[64];
 	__u8		hci_ver;
 	__u16		hci_rev;
@@ -544,6 +546,7 @@ struct hci_dev {
 
 	struct hci_conn_hash	conn_hash;
 
+	struct list_head	mesh_pending;
 	struct list_head	mgmt_pending;
 	struct list_head	reject_list;
 	struct list_head	accept_list;
@@ -595,6 +598,8 @@ struct hci_dev {
 	struct delayed_work	rpa_expired;
 	bdaddr_t		rpa;
 
+	struct delayed_work	mesh_send_done;
+
 	enum {
 		INTERLEAVE_SCAN_NONE,
 		INTERLEAVE_SCAN_NO_FILTER,
@@ -1501,7 +1506,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
 
 /* Use ext scanning if set ext scan param and ext scan enable is supported */
 #define use_ext_scan(dev) (((dev)->commands[37] & 0x20) && \
-			   ((dev)->commands[37] & 0x40))
+			   ((dev)->commands[37] & 0x40) && \
+			   !hci_dev_test_flag(dev, HCI_MESH))
+
 /* Use ext create connection if command is supported */
 #define use_ext_conn(dev) ((dev)->commands[37] & 0x80)
 
@@ -1516,6 +1523,10 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
 #define use_enhanced_conn_complete(dev) (ll_privacy_capable(dev) || \
 					 ext_adv_capable(dev))
 
+/* Use ext advertising if supported and not running Mesh */
+#define use_ext_adv(dev) (ext_adv_capable(dev) && \
+			  !hci_dev_test_flag(dev, HCI_MESH))
+
 /* ----- HCI protocols ----- */
 #define HCI_PROTO_DEFER             0x01
 
@@ -1797,6 +1808,8 @@ void hci_mgmt_chan_unregister(struct hci_mgmt_chan *c);
 #define DISCOV_LE_RESTART_DELAY		msecs_to_jiffies(200)	/* msec */
 #define DISCOV_LE_FAST_ADV_INT_MIN	0x00A0	/* 100 msec */
 #define DISCOV_LE_FAST_ADV_INT_MAX	0x00F0	/* 150 msec */
+#define DISCOV_LE_ADV_MESH_MIN		0x00A0  /* 100 msec */
+#define DISCOV_LE_ADV_MESH_MAX		0x00A0  /* 100 msec */
 
 #define NAME_RESOLVE_DURATION		msecs_to_jiffies(10240)	/* 10.24 sec */
 
@@ -1848,7 +1861,8 @@ void mgmt_start_discovery_complete(struct hci_dev *hdev, u8 status);
 void mgmt_stop_discovery_complete(struct hci_dev *hdev, u8 status);
 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);
+		       u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len,
+		       u64 instant);
 void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
 		      u8 addr_type, s8 rssi, u8 *name, u8 name_len);
 void mgmt_discovering(struct hci_dev *hdev, u8 discovering);
include/net/bluetooth/hci_sync.h +3 -0
index 2492e3b46a8f..b86a3bcf0814 100644
@@ -85,6 +85,9 @@ int hci_remove_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance,
 struct sk_buff *hci_read_local_oob_data_sync(struct hci_dev *hdev, bool ext,
 					     struct sock *sk);
 
+int hci_mesh_send_sync(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type,
+							u8 *data, u8 len);
+
 int hci_reset_sync(struct hci_dev *hdev);
 int hci_dev_open_sync(struct hci_dev *hdev);
 int hci_dev_close_sync(struct hci_dev *hdev);
include/net/bluetooth/mgmt.h +51 -0

60 lines not on this page · raw message

net/bluetooth/hci_conn.c +1 -1
index 882a7df13005..7ca498112685 100644
@@ -638,7 +638,7 @@ static void hci_conn_auto_accept(struct work_struct *work)
 
 static void le_disable_advertising(struct hci_dev *hdev)
 {
-	if (ext_adv_capable(hdev)) {
+	if (use_ext_adv(hdev)) {
 		struct hci_cp_le_set_ext_adv_enable cp;
 
 		cp.enable = 0x00;
net/bluetooth/hci_core.c +1 -0
index ad4f4ab0afca..d90f1f501b38 100644
@@ -2487,6 +2487,7 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv)
 	mutex_init(&hdev->lock);
 	mutex_init(&hdev->req_lock);
 
+	INIT_LIST_HEAD(&hdev->mesh_pending);
 	INIT_LIST_HEAD(&hdev->mgmt_pending);
 	INIT_LIST_HEAD(&hdev->reject_list);
 	INIT_LIST_HEAD(&hdev->accept_list);
net/bluetooth/hci_event.c +38 -23

195 lines not on this page · raw message

net/bluetooth/hci_request.c +91 -25

253 lines not on this page · raw message

net/bluetooth/hci_sock.c +1 -0
index 189e3115c8c6..5e7e85bcb949 100644
@@ -2056,6 +2056,7 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname,
 
 static void hci_sock_destruct(struct sock *sk)
 {
+	mgmt_cleanup(sk);
 	skb_queue_purge(&sk->sk_receive_queue);
 	skb_queue_purge(&sk->sk_write_queue);
 }
net/bluetooth/hci_sync.c +83 -20

238 lines not on this page · raw message

net/bluetooth/mgmt.c +435 -8

523 lines not on this page · raw message

net/bluetooth/mgmt_util.c +69 -0

72 lines not on this page · raw message

net/bluetooth/mgmt_util.h +17 -0
index 98e40395a383..fbf942123b10 100644
@@ -20,6 +20,15 @@
    SOFTWARE IS DISCLAIMED.
 */
 
+struct mgmt_mesh_tx {
+	struct list_head list;
+	int index;
+	size_t param_len;
+	struct sock *sk;
+	u8 handle;
+	u8 param[sizeof(struct mgmt_cp_mesh_send) + 29];
+};
+
 struct mgmt_pending_cmd {
 	struct list_head list;
 	u16 opcode;
@@ -59,3 +68,11 @@ struct mgmt_pending_cmd *mgmt_pending_new(struct sock *sk, u16 opcode,
 					  void *data, u16 len);
 void mgmt_pending_free(struct mgmt_pending_cmd *cmd);
 void mgmt_pending_remove(struct mgmt_pending_cmd *cmd);
+void mgmt_mesh_foreach(struct hci_dev *hdev,
+		       void (*cb)(struct mgmt_mesh_tx *mesh_tx, void *data),
+		       void *data, struct sock *sk);
+struct mgmt_mesh_tx *mgmt_mesh_find(struct hci_dev *hdev, u8 handle);
+struct mgmt_mesh_tx *mgmt_mesh_next(struct hci_dev *hdev, struct sock *sk);
+struct mgmt_mesh_tx *mgmt_mesh_add(struct sock *sk, struct hci_dev *hdev,
+				   void *data, u16 len);
+void mgmt_mesh_remove(struct mgmt_mesh_tx *mesh_tx);
Signature · 1 line
2.35.1
#2 lore raw

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list. This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=640338

---Test result---

Test Summary:

CheckPatch                    FAIL      6.48 seconds
GitLint                       PASS      2.12 seconds
SubjectPrefix                 PASS      1.95 seconds
BuildKernel                   PASS      32.15 seconds
BuildKernel32                 PASS      28.72 seconds
Incremental Build with patchesPASS      65.13 seconds
TestRunner: Setup             PASS      468.98 seconds
TestRunner: l2cap-tester      PASS      17.39 seconds
TestRunner: bnep-tester       PASS      6.15 seconds
TestRunner: mgmt-tester       FAIL      101.05 seconds
TestRunner: rfcomm-tester     PASS      9.68 seconds
TestRunner: sco-tester        PASS      9.57 seconds
TestRunner: smp-tester        PASS      9.59 seconds
TestRunner: userchan-tester   PASS      6.42 seconds

Details
##############################
Test: CheckPatch - FAIL - 6.48 seconds
Run checkpatch.pl script with rule in .checkpatch.conf
[v3,1/2] Bluetooth: Implement support for Mesh\CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #701: FILE: net/bluetooth/hci_request.c:2122:
+ if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
+ hci_dev_test_flag(hdev, HCI_MESH))

ERROR:CODE_INDENT: code indent should use tabs where possible #1515: FILE: net/bluetooth/mgmt.c:10062:
+^I^I u8 addr_type, s8 rssi, u32 flags, u8 *eir,$

CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #1515: FILE: net/bluetooth/mgmt.c:10062:
+static void mesh_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr,
+ u8 addr_type, s8 rssi, u32 flags, u8 *eir,

total: 1 errors, 0 warnings, 2 checks, 1474 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.

NOTE: Whitespace errors detected.
You may wish to use scripts/cleanpatch or scripts/cleanfile

/github/workspace/src/12845561.patch has style problems, please review.

NOTE: Ignored message types: UNKNOWN_COMMIT_ID

NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.

[v3,2/2] Bluetooth: Add experimental wrapper for MGMT based mesh\CHECK:BRACES: Unbalanced braces around else statement #244: FILE: net/bluetooth/mgmt.c:4537:
+ else {

total: 0 errors, 0 warnings, 1 checks, 182 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12845560.patch has style problems, please review.

NOTE: Ignored message types: UNKNOWN_COMMIT_ID

NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.

##############################
Test: TestRunner: mgmt-tester - FAIL - 101.05 seconds Run test-runner with mgmt-tester
Total: 493, Passed: 492 (99.8%), Failed: 1, Not Run: 0

Failed Test Cases
Read Exp Feature - Success Failed 0.094 seconds

---
Regards,
Linux Bluetooth

#3 lore raw

Re: [PATCH v3 1/2] Bluetooth: Implement support for Mesh

In reply to Brian Gix
Thank you for the patch! Perhaps something to improve:

Hi Brian,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on bluetooth/master]
[also build test WARNING on bluetooth-next/master v5.18-rc6 next-20220510] [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/intel-lab-lkp/linux/commits/Brian-Gix/Add-Mesh-functionality-to-net-bluetooth/20220511-054524
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git master
config: i386-randconfig-s002-20220509 (https://download.01.org/0day-ci/archive/20220511/[email protected]/config)
compiler: gcc-11 (Debian 11.2.0-20) 11.2.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.4-dirty
        # https://github.com/intel-lab-lkp/linux/commit/bea4eccd2f7e8b93f2fba58d72cd4803105baf4f
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Brian-Gix/Add-Mesh-functionality-to-net-bluetooth/20220511-054524
        git checkout bea4eccd2f7e8b93f2fba58d72cd4803105baf4f
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash net/bluetooth/

If you fix the issue, kindly add following tag as appropriate

sparse warnings: (new ones prefixed by >>)
net/bluetooth/mgmt.c:4093:29: sparse: sparse: restricted __le16 degrades to integer net/bluetooth/mgmt.c:4832:9: sparse: sparse: cast to restricted __le32

>> net/bluetooth/mgmt.c:10112:21: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le64 [usertype] instant @@     got unsigned long long [usertype] instant @@

net/bluetooth/mgmt.c:10112:21: sparse: expected restricted __le64 [usertype] instant
net/bluetooth/mgmt.c:10112:21: sparse: got unsigned long long [usertype] instant

vim +10112 net/bluetooth/mgmt.c

10060
10061 static void mesh_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr,
10062 u8 addr_type, s8 rssi, u32 flags, u8 *eir,
10063 u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len,
10064 u64 instant)
10065 {
10066 struct sk_buff *skb;
10067 struct mgmt_ev_mesh_device_found *ev;
10068 int i, j;
10069
10070 if (!hdev->mesh_ad_types[0])
10071 goto accepted;
10072
10073 /* Scan for requested AD types */
10074 if (eir_len > 0) {
10075 for (i = 0; i + 1 < eir_len; i += eir[i] + 1) {
10076 for (j = 0; j < sizeof(hdev->mesh_ad_types); j++) {
10077 if (!hdev->mesh_ad_types[j])
10078 break;
10079
10080 if (hdev->mesh_ad_types[j] == eir[i + 1])
10081 goto accepted;
10082 }
10083 }
10084 }
10085
10086 if (scan_rsp_len > 0) {
10087 for (i = 0; i + 1 < scan_rsp_len; i += scan_rsp[i] + 1) {
10088 for (j = 0; j < sizeof(hdev->mesh_ad_types); j++) {
10089 if (!hdev->mesh_ad_types[j])
10090 break;
10091
10092 if (hdev->mesh_ad_types[j] == scan_rsp[i + 1])
10093 goto accepted;
10094 }
10095 }
10096 }
10097
10098 return;
10099
10100 accepted:
10101 skb = mgmt_alloc_skb(hdev, MGMT_EV_MESH_DEVICE_FOUND,
10102 sizeof(*ev) + eir_len + scan_rsp_len);
10103 if (!skb)
10104 return;
10105
10106 ev = skb_put(skb, sizeof(*ev));
10107
10108 bacpy(&ev->addr.bdaddr, bdaddr);
10109 ev->addr.type = link_to_bdaddr(LE_LINK, addr_type);
10110 ev->rssi = rssi;
10111 ev->flags = cpu_to_le32(flags);
10112 ev->instant = instant;
10113
10114 if (eir_len > 0)
10115 /* Copy EIR or advertising data into event */
10116 skb_put_data(skb, eir, eir_len);
10117
10118 if (scan_rsp_len > 0)
10119 /* Append scan response data to event */
10120 skb_put_data(skb, scan_rsp, scan_rsp_len);
10121
10122 ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len);
10123
10124 mgmt_event_skb(skb, NULL);
10125 }
10126

Signature · 2 lines
0-DAY CI Kernel Test Service
https://01.org/lkp
author
#4 lore raw

PATCH v3 2/2 Bluetooth: Add experimental wrapper for MGMT based mesh

In reply to Brian Gix

This introduces a "Mesh UUID" and an Experimental Feature bit to the hdev mask, and depending all underlying Mesh functionality on it.

---
 include/net/bluetooth/hci.h |   1 +
 net/bluetooth/mgmt.c        | 113 +++++++++++++++++++++++++++++++++---
 2 files changed, 106 insertions(+), 8 deletions(-)
include/net/bluetooth/hci.h +1 -0
index 5d70beb54cab..e18c8d104f79 100644
@@ -362,6 +362,7 @@ enum {
 	HCI_OFFLOAD_CODECS_ENABLED,
 	HCI_LE_SIMULTANEOUS_ROLES,
 
+	HCI_MESH_EXPERIMENTAL,
 	HCI_MESH,
 	HCI_MESH_SENDING,
 
net/bluetooth/mgmt.c +105 -8

175 lines not on this page · raw message

Signature · 1 line
2.35.1