On Tue, Nov 13, 2018 at 11:21 AM Luiz Augusto von Dentz <luiz.dentz@xxxxxxxxx> wrote: > > Hi Emil, Martin, > On Tue, Nov 13, 2018 at 12:47 PM Emil Lenngren <emil.lenngren@xxxxxxxxx> wrote: > > > > Hi, > > > > Den mån 12 nov. 2018 kl 17:19 skrev Martin Townsend <mtownsend1973@xxxxxxxxx>: > > > I've just been reading the 4.1 spec on GAP and on page 224 it states: > > > > > > > > > "In LE, GAP defines four specific roles: Broadcaster, Observer, Peripheral, and > > > Central. A device may support multiple LE GAP roles provided that the underly- > > > ing Controller supports those roles or role combinations. However, only one LE > > > GAP role may be supported at a given time. Each role specifies the require- > > > ments for the underlying Controller. This allows for Controllers to be optimized > > > for specific use cases." > > > > > > Now to me that says a device can support being a central and > > > peripheral but doesn't have to support them concurrently so I'm > > > guessing if the device is in the peripheral role and then wanted to > > > connect to another device you would have to stop being a peripheral > > > (ie drop this connection) and then become a central, make the > > > connection and when finished disconnect and become a peripheral again > > > and wait for the other devices to reconnect to you. Or am I > > > mis-reading this? > > > > This restriction is lifted in newer versions of the spec. The same > > section in version 4.2 says this: > > "In LE, GAP defines four specific roles: Broadcaster, Observer, Peripheral, and > > Central. A device may support multiple LE GAP roles provided that the > > underlying Controller supports those roles or role combinations. Each role > > specifies the requirements for the underlying Controller. This allows for > > Controllers to be optimized for specific use cases." > > > > If you use the btmon tool you can easily see what combination of > > supported states the controller supports. If you have btmon running > > while you initiate bluetoothd you will see the packet LE Read > > Supported States Command, which contains this info. > > In that case we should definitely use these states to determine > instead of assuming the controller don't support Master & Slave state, > though it would be great if Martin provides the HCI traces where it is > failing and if indeed is the controller not support it or some other > bug. > > -- > Luiz Augusto von Dentz Apologies for the delay. I've heard back from the device manufacture and they have confirmed that it does support both roles simultaneously and have proved this using their WICED platform. https://community.cypress.com/thread/36729 So I have ran btmon and then powered the device and get the following LE Read Supported States message in the log (let me know if you want the full log or other messages, there were quite a few of them) < HCI Command: LE Read Supported States (0x08|0x001c) plen 0 #27 [hci0] 12.173109 > HCI Event: Command Complete (0x0e) plen 12 #28 [hci0] 12.178836 LE Read Supported States (0x08|0x001c) ncmd 1 Status: Success (0x00) States: 0x000003ffffffffff Non-connectable Advertising State Scannable Advertising State Connectable Advertising State High Duty Cycle Directed Advertising State Passive Scanning State Active Scanning State Initiating State and Connection State (Master Role) Connection State (Slave Role) Non-connectable Advertising State and Passive Scanning State Scannable Advertising State and Passive Scanning State Connectable Advertising State and Passive Scanning State High Duty Cycle Directed Advertising State and Passive Scanning State Non-connectable Advertising State and Active Scanning State Scannable Advertising State and Active Scanning State Connectable Advertising State and Active Scanning State High Duty Cycle Directed Advertising State and Active Scanning State Non-connectable Advertising State and Initiating State Scannable Advertising State and Initiating State Non-connectable Advertising State and Connection State (Master Role) Scannable Advertising State and Connection State (Master Role) Non-connectable Advertising State and Connection State (Slave Role) Scannable Advertising State and Connection State (Slave Role) Passive Scanning State and Initiating State Active Scanning State and Initiating State Passive Scanning State and Connection State (Master Role) Active Scanning State and Connection State (Master Role) Passive Scanning State and Connection State (Slave Role) Active Scanning State and Connection State (Slave Role) Initiating State and Connection State (Master Role) and Master Role & Master Role Low Duty Cycle Directed Advertising State Low Duty Cycle Directed Advertising State and Passive Scanning State Low Duty Cycle Directed Advertising State and Active Scanning State Connectable Advertising State and Initiating State and Master Role & Slave Role High Duty Cycle Directed Advertising State and Initiating State and Master Role & Slave Role Low Duty Cycle Directed Advertising State and Initiating State and Master Role & Slave Role Connectable Advertising State and Connection State (Master Role) and Master Role & Slave Role High Duty Cycle Directed Advertising State and Connection State (Master Role) and Master Role & Slave Role Low Duty Cycle Directed Advertising State and Connection State (Master Role) and Master Role & Slave Role Connectable Advertising State and Connection State (Slave Role) and Master Role & Slave Role High Duty Cycle Directed Advertising State and Connection State (Slave Role) and Slave Role & Slave Role Low Duty Cycle Directed Advertising State and Connection State (Slave Role) and Slave Role & Slave Role Initiating State and Connection State (Slave Role) and Master Role & Slave Role Using btmon I then captured the HCI trace for the failing dual role case Starting the GATT Server and connecting from a PC ======================================== < HCI Command: LE Set Advertising Parameters (0x08|0x0006) plen 15 #69 [hci0] 736.868434 Min advertising interval: 1280.000 msec (0x0800) Max advertising interval: 1280.000 msec (0x0800) Type: Connectable undirected - ADV_IND (0x00) Own address type: Public (0x00) Direct address type: Public (0x00) Direct address: 00:00:00:00:00:00 (OUI 00-00-00) Channel map: 37, 38, 39 (0x07) Filter policy: Allow Scan Request from Any, Allow Connect Request from Any (0x00) > HCI Event: Command Complete (0x0e) plen 4 #70 [hci0] 736.875133 LE Set Advertising Parameters (0x08|0x0006) ncmd 1 Status: Success (0x00) < HCI Command: LE Set Advertise Enable (0x08|0x000a) plen 1 #71 [hci0] 736.878291 Advertising: Enabled (0x01) > HCI Event: Command Complete (0x0e) plen 4 #72 [hci0] 736.883585 LE Set Advertise Enable (0x08|0x000a) ncmd 1 Status: Success (0x00) @ RAW Close: hciconfig {0x0004} [hci0] 736.884982 @ RAW Close: hciconfig {0x0003} 736.885139 @ RAW Open: btgatt-server (privileged) version 2.22 {0x0003} 736.950116 @ RAW Close: btgatt-server {0x0003} 736.953288 @ RAW Open: btgatt-server (privileged) version 2.22 {0x0003} 736.953693 @ RAW Close: btgatt-server {0x0003} 736.953991 > HCI Event: LE Meta Event (0x3e) plen 19 #73 [hci0] 752.270109 LE Connection Complete (0x01) Status: Success (0x00) Handle: 64 Role: Slave (0x01) Peer address type: Public (0x00) Peer address: 9C:B6:D0:DE:5C:A2 (OUI 9C-B6-D0) Connection interval: 45.00 msec (0x0024) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) Master clock accuracy: 0x00 @ MGMT Event: Device Connected (0x000b) plen 13 {0x0001} [hci0] 752.270401 LE Address: 9C:B6:D0:DE:5C:A2 (OUI 9C-B6-D0) Flags: 0x00000000 Data length: 0 @ MGMT Event: Device Connected (0x000b) plen 13 {0x0002} [hci0] 752.270401 LE Address: 9C:B6:D0:DE:5C:A2 (OUI 9C-B6-D0) Flags: 0x00000000 Data length: 0 < HCI Command: LE Read Remote Used Features (0x08|0x0016) plen 2 #74 [hci0] 752.276167 Handle: 64 > HCI Event: Command Status (0x0f) plen 4 #75 [hci0] 752.281522 LE Read Remote Used Features (0x08|0x0016) ncmd 1 Status: Success (0x00) > HCI Event: LE Meta Event (0x3e) plen 12 #76 [hci0] 752.522510 LE Read Remote Used Features (0x04) Status: Success (0x00) Handle: 64 Features: 0x1f 0x00 0x00 0x00 0x00 0x00 0x00 0x00 LE Encryption Connection Parameter Request Procedure Extended Reject Indication Slave-initiated Features Exchange LE Ping < ACL Data TX: Handle 64 flags 0x00 dlen 16 #77 [hci0] 752.522823 LE L2CAP: Connection Parameter Update Request (0x12) ident 1 len 8 Min interval: 40 Max interval: 56 Slave latency: 0 Timeout multiplier: 42 > HCI Event: LE Meta Event (0x3e) plen 11 #78 [hci0] 752.612551 LE Remote Connection Parameter Request (0x06) Handle: 64 Min connection interval: 50.00 msec (0x0028) Max connection interval: 70.00 msec (0x0038) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) < HCI Command: LE Remote Connection Parameter Request Reply (0x08|0x0020) plen 14 #79 [hci0] 752.612732 Handle: 64 Min connection interval: 50.00 msec (0x0028) Max connection interval: 70.00 msec (0x0038) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) Min connection length: 0.000 msec (0x0000) Max connection length: 0.000 msec (0x0000) > HCI Event: Command Complete (0x0e) plen 6 #80 [hci0] 752.622017 LE Remote Connection Parameter Request Reply (0x08|0x0020) ncmd 1 Status: Success (0x00) Handle: 64 > ACL Data RX: Handle 64 flags 0x02 dlen 10 #81 [hci0] 752.657199 LE L2CAP: Connection Parameter Update Response (0x13) ident 1 len 2 Result: Connection Parameters accepted (0x0000) > HCI Event: Number of Completed Packets (0x13) plen 5 #82 [hci0] 752.755860 Num handles: 1 Handle: 64 Count: 1 > HCI Event: LE Meta Event (0x3e) plen 10 #83 [hci0] 753.017532 LE Connection Update Complete (0x03) Status: Success (0x00) Handle: 64 Connection interval: 60.00 msec (0x0030) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) Attempting to connect to another GATT Server (4F:E8:66:0A:92:63) ==================================================== < HCI Command: LE Set Scan Parameters (0x08|0x000b) plen 7 #403 [hci0] 1988.511852 Type: Passive (0x00) Interval: 60.000 msec (0x0060) Window: 30.000 msec (0x0030) Own address type: Public (0x00) Filter policy: Ignore not in white list (0x01) > HCI Event: Ccheck_pending_le_conn: le_num_slave = 1 ommand Complete (0x0e) plen 4 #404 [hci0] 1988.517687 LE Set Scan Parameters (0x08|0x000b) ncmd 1 Shci_cs_le_create_conn: conn=972bb800 tatus: Success (0x00) < HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 #405 [hci0] 1988.518123 Scanning: Enabled (0x01) Filter duplicates: Enabled (0x01) > HCI Event: Command Complete (0x0e) plen 4 #406 [hci0] 1988.523477 LE Set Scan Enable (0x08|0x000c) ncmd 1 Status: Success (0x00) > HCI Event: LE Meta Event (0x3e) plen 29 #407 [hci0] 1988.551326 LE Advertising Report (0x02) Num reports: 1 Event type: Connectable undirected - ADV_IND (0x00) Address type: Random (0x01) Address: 4F:E8:66:0A:92:63 (Resolvable) Data length: 17 Flags: 0x02 LE General Discoverable Mode Name (complete): LG K8 (2017) RSSI: -71 dBm (0xb9) < HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 #408 [hci0] 1988.557402 Scanning: Disabled (0x00) Filter duplicates: Disabled (0x00) > HCI Event: Command Complete (0x0e) plen 4 #409 [hci0] 1988.563409 LE Set Scan Enable (0x08|0x000c) ncmd 1 Status: Success (0x00) < HCI Command: LE Create Connection (0x08|0x000d) plen 25 #410 [hci0] 1988.563891 Scan interval: 60.000 msec (0x0060) Scan window: 60.000 msec (0x0060) Filter policy: White list is not used (0x00) Peer address type: Random (0x01) Peer address: 4F:E8:66:0A:92:63 (Resolvable) Own address type: Public (0x00) Min connection interval: 50.00 msec (0x0028) Max connection interval: 70.00 msec (0x0038) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) Min connection length: 0.000 msec (0x0000) Max connection length: 0.000 msec (0x0000) > HCI Event: Command Status (0x0f) plen 4 #411 [hci0] 1988.573442 LE Create Connection (0x08|0x000d) ncmd 1 Status: Success (0x00) > HCI Event: LE Meta Event (0x3e) plen 19 #412 [hci0] 1988.839656 LE Connection Complete (0x01) Status: Success (0x00) Handle: 65 Role: Master (0x00) Peer address type: Random (0x01) Peer address: 4F:E8:66:0A:92:63 (Resolvable) Connection interval: 60.00 msec (0x0030) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) Master clock accuracy: 0x00 @ MGMT Event: Device Connected (0x000b) plen 30 {0x0001} [hci0] 1988.839788 LE Address: 4F:E8:66:0A:92:63 (Resolvable) Flags: 0x00000000 Data length: 17 Flags: 0x02 LE General Discoverable Mode Name (complete): LG K8 (2017) @ MGMT Event: Device Connected (0x000b) plen 30 {0x0002} [hci0] 1988.839788 LE Address: 4F:E8:66:0A:92:63 (Resolvable) Flags: 0x00000000 Data length: 17 Flags: 0x02 LE General Discoverable Mode Name (complete): LG K8 (2017) < HCI Command: LE Read Remote Used Features (0x08|0x0016) plen 2 #413 [hci0] 1988.840257 Handle: 65 > HCI Event: Command Status (0x0f) plen 4 #414 [hci0] 1988.846789 LE Read Remote Used Features (0x08|0x0016) ncmd 1 Status: Success (0x00) > HCI Event: LE Meta Event (0x3e) plen 12 #415 [hci0] 1989.040282 LE Read Remote Used Features (0x04) Status: Success (0x00) Handle: 65 Features: 0x0f 0x00 0x00 0x00 0x00 0x00 0x00 0x00 LE Encryption Connection Parameter Request Procedure Extended Reject Indication Slave-initiated Features Exchange > HCI Event: LE Meta Event (0x3e) plen 11 #416 [hci0] 1989.401375 LE Remote Connection Parameter Request (0x06) Handle: 65 Min connection interval: 7.50 msec (0x0006) Max connection interval: 7.50 msec (0x0006) Connection latency: 0 (0x0000) Supervision timeout: 5000 msec (0x01f4) < HCI Command: LE Remote Connection Parameter Request Reply (0x08|0x0020) plen 14 #417 [hci0] 1989.401742 Handle: 65 Min connection interval: 7.50 msec (0x0006) Max connection interval: 7.50 msec (0x0006) Connection latency: 0 (0x0000) Supervision timeout: 5000 msec (0x01f4) Min connection length: 0.000 msec (0x0000) Max connection length: 0.000 msec (0x0000) > HCI Event: Command Complete (0x0e) plen 6 #418 [hci0] 1989.410534 LE Remote Connection Parameter Request Reply (0x08|0x0020) ncmd 1 Status: Success (0x00) Handle: 65 > ACL Data RX: Handle 65 flags 0x02 dlen 11 #419 [hci0] 1989.460209 ATT: Read By Group Type Request (0x10) len 6 Handle range: 0x0001-0xffff Attribute group type: Primary Service (0x2800) < ACL Data TX: Handle 65 flags 0x00 dlen 9 #420 [hci0] 1989.461006 ATT: Error Response (0x01) len 4 Read By Group Type Request (0x10) Handle: 0x0000 Error: Request Not Supported (0x06) > HCI Event: Number of Completed Packets (0x13) plen 5 #421 [hci0] 1989.657151 Num handles: 1 Handle: 65 Count: 1 > HCI Event: LE Meta Event (0x3e) plen 10 #422 [hci0] 1989.886359 LE Connection Update Complete (0x03) Status: Success (0x00) Handle: 65 Connection interval: 7.50 msec (0x0006) Connection latency: 0 (0x0000) Supervision timeout: 5000 msec (0x01f4) > HCI Event: LE Meta Event (0x3e) plen 11 #423 [hci0] 1989.894763 LE Remote Connection Parameter Request (0x06) Handle: 65 Min connection interval: 60.00 msec (0x0030) Max connection interval: 60.00 msec (0x0030) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) < HCI Command: LE Remote Connection Parameter Request Reply (0x08|0x0020) plen 14 #424 [hci0] 1989.895117 Handle: 65 Min connection interval: 60.00 msec (0x0030) Max connection interval: 60.00 msec (0x0030) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) Min connection length: 0.000 msec (0x0000) Max connection length: 0.000 msec (0x0000) > HCI Event: Command Complete (0x0e) plen 6 #425 [hci0] 1989.903898 LE Remote Connection Parameter Request Reply (0x08|0x0020) ncmd 1 Status: Success (0x00) Handle: 65 > HCI Event: LE Meta Event (0x3e) plen 10 #426 [hci0] 1989.988169 LE Connection Update Complete (0x03) Status: Success (0x00) Handle: 65 Connection interval: 60.00 msec (0x0030) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) which now seems to be working, I think maybe the first time I tried connecting I didn't specify that the address was a random address for the connection to the GATT Server running on my phone using nRF. I do have this patch in place to remove the check on le_num_slave as per the suggestion by Luiz @@ -4651,6 +4652,7 @@ static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev, struct hci_conn *conn; struct hci_conn_params *params; +printk(KERN_ERR "%s: le_num_slave = %d\n", __func__, hdev->conn_hash.le_num_slave); /* If the event is not connectable don't proceed further */ if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND) return NULL; @@ -4662,8 +4664,10 @@ static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev, /* Most controller will fail if we try to create new connections * while we have an existing one in slave role. */ +#if 0 if (hdev->conn_hash.le_num_slave > 0) return NULL; +#endif /* If we're not connectable only connect devices that we have in * our pend_le_conns list. And during the connection I do now see the following in the journal ov 09 08:57:59 mach-cw-rnet-ppm-1717 kernel: check_pending_le_conn: le_num_slave = 1 Nov 09 08:57:59 mach-cw-rnet-ppm-1717 kernel: hci0 opcode 0x200c plen 2 Nov 09 08:57:59 mach-cw-rnet-ppm-1717 kernel: skb len 5 which does suggest you were right Luiz. I'll take the patch out and retry the experiment to make sure. Cheers, Martin