Add Mesh functionality to net/bluetooth
Subsystems (2)
v5 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
v4: More indent clean-ups and proper var types
v5: Conform to the ADV Instance mechanism, and make fully compatible
with Extended Advertising mechanism.
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 | 15 +- include/net/bluetooth/mgmt.h | 52 +++ net/bluetooth/hci_core.c | 11 +- net/bluetooth/hci_event.c | 61 ++-- net/bluetooth/hci_request.c | 96 ++++- net/bluetooth/hci_sock.c | 1 + net/bluetooth/hci_sync.c | 43 ++- net/bluetooth/mgmt.c | 589 +++++++++++++++++++++++++++++- net/bluetooth/mgmt_util.c | 74 ++++ net/bluetooth/mgmt_util.h | 18 + 12 files changed, 899 insertions(+), 66 deletions(-)
Signature · 1 line
2.36.1
PATCH v5 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. Discrete advertisments are added to the ADV Instance list.
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 | 15 +- include/net/bluetooth/mgmt.h | 52 ++++ net/bluetooth/hci_core.c | 11 +- net/bluetooth/hci_event.c | 61 ++-- net/bluetooth/hci_request.c | 96 +++++- net/bluetooth/hci_sock.c | 1 + net/bluetooth/hci_sync.c | 43 ++- net/bluetooth/mgmt.c | 480 +++++++++++++++++++++++++++++- net/bluetooth/mgmt_util.c | 74 +++++ net/bluetooth/mgmt_util.h | 18 ++ 12 files changed, 795 insertions(+), 60 deletions(-)
include/net/bluetooth/bluetooth.h +1 -0
@@ -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
@@ -363,6 +363,9 @@ enum {HCI_LE_SIMULTANEOUS_ROLES ,HCI_CMD_DRAIN_WORKQUEUE , +HCI_MESH , +HCI_MESH_SENDING , + __HCI_NUM_FLAGS, };
include/net/bluetooth/hci_core.h +13 -2
@@ -239,6 +239,7 @@ struct adv_info {struct list_head list;bool enabled;bool pending; +__u8 mesh;__u8 instance;__u32 flags;__u16 timeout;
@@ -371,6 +372,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;
@@ -558,6 +561,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;
@@ -609,6 +613,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 ,
@@ -1412,7 +1418,8 @@ int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags, u16 adv_data_len, u8 *adv_data, u16 scan_rsp_len, u8 *scan_rsp_data, u16 timeout, u16 duration, s8 tx_power, - u32 min_interval, u32 max_interval); + u32 min_interval, u32 max_interval, + u8 mesh_handle);int hci_set_adv_instance_data (struct hci_dev *hdev,u8 instance,u16 adv_data_len,u8 *adv_data,u16 scan_rsp_len,u8 *scan_rsp_data);
@@ -1813,6 +1820,9 @@ 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 INTERVAL_TO_MS (x) (((x) * 10) / 0x10)#define NAME_RESOLVE_DURATION msecs_to_jiffies(10240)/* 10.24 sec */
@@ -1864,7 +1874,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/mgmt.h +52 -0
61 lines not on this page · raw message
net/bluetooth/hci_core.c +9 -2
@@ -1703,7 +1703,8 @@ int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags, u16 adv_data_len, u8 *adv_data, u16 scan_rsp_len, u8 *scan_rsp_data, u16 timeout, u16 duration, s8 tx_power, - u32 min_interval, u32 max_interval) + u32 min_interval, u32 max_interval, + u8 mesh_handle) { struct adv_info *adv_instance;
@@ -1715,7 +1716,7 @@ int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags, sizeof(adv_instance->scan_rsp_data)); }else {if (hdev->adv_instance_cnt >= hdev->le_num_of_adv_sets || - instance <1 || instance > hdev->le_num_of_adv_sets) + instance <1 || instance > hdev->le_num_of_adv_sets +1 )return -EOVERFLOW ; adv_instance =kzalloc (sizeof (*adv_instance),GFP_KERNEL );
@@ -1732,6 +1733,11 @@ int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags, adv_instance->min_interval = min_interval; adv_instance->max_interval = max_interval; adv_instance->tx_power = tx_power; +/* Defining a mesh_handle changes the timing units to ms, +* rather than seconds, and ties the instance to the requested +* mesh_tx queue. +*/ + adv_instance->mesh = mesh_handle;hci_set_adv_instance_data (hdev, instance, adv_data_len, adv_data, scan_rsp_len, scan_rsp_data);
@@ -2494,6 +2500,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 +81 -15
173 lines not on this page · raw message
net/bluetooth/hci_sock.c +1 -0
@@ -2065,6 +2065,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 +33 -10
112 lines not on this page · raw message
net/bluetooth/mgmt.c +472 -8
558 lines not on this page · raw message
net/bluetooth/mgmt_util.c +74 -0
77 lines not on this page · raw message
net/bluetooth/mgmt_util.h +18 -0
@@ -20,6 +20,16 @@SOFTWARE IS DISCLAIMED. */ +struct mgmt_mesh_tx { +struct list_head list; +int index; +size_t param_len; +struct sock *sk; +u8 handle; +u8 instance; +u8 param[sizeof (struct mgmt_cp_mesh_send ) +29 ]; +}; +struct mgmt_pending_cmd {struct list_head list;u16 opcode;
@@ -59,3 +69,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.36.1
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=661590
---Test result---
Test Summary:
CheckPatch FAIL 6.31 seconds GitLint PASS 2.21 seconds SubjectPrefix PASS 1.95 seconds BuildKernel PASS 35.54 seconds BuildKernel32 PASS 30.11 seconds Incremental Build with patchesPASS 75.43 seconds TestRunner: Setup PASS 539.23 seconds TestRunner: l2cap-tester PASS 17.34 seconds TestRunner: bnep-tester PASS 6.01 seconds TestRunner: mgmt-tester FAIL 99.83 seconds TestRunner: rfcomm-tester PASS 9.65 seconds TestRunner: sco-tester PASS 9.27 seconds TestRunner: smp-tester PASS 9.31 seconds TestRunner: userchan-tester PASS 6.19 seconds
Details
##############################
Test: CheckPatch - FAIL - 6.31 seconds
Run checkpatch.pl script with rule in .checkpatch.conf
[v5,2/2] Bluetooth: Add experimental wrapper for MGMT based mesh\CHECK:BRACES: Unbalanced braces around else statement #244: FILE: net/bluetooth/mgmt.c:4568:
+ 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/12924471.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 - 99.83 seconds Run test-runner with mgmt-tester
Total: 494, Passed: 493 (99.8%), Failed: 1, Not Run: 0
Failed Test Cases
Read Exp Feature - Success Failed 0.093 seconds
---
Regards,
Linux Bluetooth
PATCH v5 2/2 Bluetooth: Add experimental wrapper for MGMT based mesh
In reply to Brian GixThis 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
@@ -363,6 +363,7 @@ enum {HCI_LE_SIMULTANEOUS_ROLES ,HCI_CMD_DRAIN_WORKQUEUE , +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.36.1