linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Martin Townsend <mtownsend1973@gmail.com>
To: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Cc: emil.lenngren@gmail.com, linux-bluetooth@vger.kernel.org
Subject: Re: Operating central and peripheral roles concurrently
Date: Thu, 15 Nov 2018 16:54:28 +0000	[thread overview]
Message-ID: <CABatt_wXV6==NNsqogs_Pk1eHqu3uqeietiEn+pKdwM3d5zCWg@mail.gmail.com> (raw)
In-Reply-To: <CABBYNZJJoLbWC5Dm3Gmd23TdFG1KJQUUKL4e+hGit4CzM5Rp5w@mail.gmail.com>

On Tue, Nov 13, 2018 at 11:21 AM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> Hi Emil, Martin,
> On Tue, Nov 13, 2018 at 12:47 PM Emil Lenngren <emil.lenngren@gmail.com> wrote:
> >
> > Hi,
> >
> > Den mån 12 nov. 2018 kl 17:19 skrev Martin Townsend <mtownsend1973@gmail.com>:
> > > 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

  reply	other threads:[~2018-11-15 16:54 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-09 16:32 Operating central and peripheral roles concurrently Martin Townsend
2018-11-09 17:55 ` Martin Townsend
2018-11-10 18:03   ` Luiz Augusto von Dentz
2018-11-10 18:29     ` Martin Townsend
2018-11-12 13:52       ` Martin Townsend
2018-11-12 16:17         ` Martin Townsend
2018-11-13 10:47           ` Emil Lenngren
2018-11-13 11:21             ` Luiz Augusto von Dentz
2018-11-15 16:54               ` Martin Townsend [this message]
2018-11-15 17:10                 ` Martin Townsend
2019-03-05 10:54 Martin Townsend

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CABatt_wXV6==NNsqogs_Pk1eHqu3uqeietiEn+pKdwM3d5zCWg@mail.gmail.com' \
    --to=mtownsend1973@gmail.com \
    --cc=emil.lenngren@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=luiz.dentz@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).