Message ID | 20200731010535.1422455-1-alainm@chromium.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] Bluetooth: use the proper scan params when conn is pending | expand |
Hi Alain, > When an LE connection is requested and an RPA update is needed via > hci_connect_le_scan, the default scanning parameters are used rather > than the connect parameters. This leads to significant delays in the > connection establishment process when using lower duty cycle scanning > parameters. > > The patch simply looks at the pended connection list when trying to > determine which scanning parameters should be used. > > Before: > < HCI Command: LE Set Extended Scan Parameters (0x08|0x0041) plen 8 > #378 [hci0] 1659.247156 > Own address type: Public (0x00) > Filter policy: Ignore not in white list (0x01) > PHYs: 0x01 > Entry 0: LE 1M > Type: Passive (0x00) > Interval: 367.500 msec (0x024c) > Window: 37.500 msec (0x003c) > > After: > < HCI Command: LE Set Extended Scan Parameters (0x08|0x0041) plen 8 > #39 [hci0] 7.422109 > Own address type: Public (0x00) > Filter policy: Ignore not in white list (0x01) > PHYs: 0x01 > Entry 0: LE 1M > Type: Passive (0x00) > Interval: 60.000 msec (0x0060) > Window: 60.000 msec (0x0060) > > Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org> > Reviewed-by: Yu Liu <yudiliu@google.com> > Signed-off-by: Alain Michaud <alainm@chromium.org> please swap these around, the signed-off-by from the author should come first. > > --- > > Changes in v2: > - Fixing Yu's email tag > > net/bluetooth/hci_request.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) Patch has been applied to bluetooth-next tree. Regards Marcel
diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c index 435400a43a78..e0269192f2e5 100644 --- a/net/bluetooth/hci_request.c +++ b/net/bluetooth/hci_request.c @@ -953,6 +953,27 @@ static void hci_req_start_scan(struct hci_request *req, u8 type, u16 interval, } } +/* Returns true if an le connection is in the scanning state */ +static inline bool hci_is_le_conn_scanning(struct hci_dev *hdev) +{ + struct hci_conn_hash *h = &hdev->conn_hash; + struct hci_conn *c; + + rcu_read_lock(); + + list_for_each_entry_rcu(c, &h->list, list) { + if (c->type == LE_LINK && c->state == BT_CONNECT && + test_bit(HCI_CONN_SCANNING, &c->flags)) { + rcu_read_unlock(); + return true; + } + } + + rcu_read_unlock(); + + return false; +} + /* Ensure to call hci_req_add_le_scan_disable() first to disable the * controller based address resolution to be able to reconfigure * resolving list. @@ -1003,6 +1024,9 @@ void hci_req_add_le_passive_scan(struct hci_request *req) if (hdev->suspended) { window = hdev->le_scan_window_suspend; interval = hdev->le_scan_int_suspend; + } else if (hci_is_le_conn_scanning(hdev)) { + window = hdev->le_scan_window_connect; + interval = hdev->le_scan_int_connect; } else { window = hdev->le_scan_window; interval = hdev->le_scan_interval;