27 Feb, 2009

14 commits

  • Some of the qualification tests demand that in case of failures in L2CAP
    the HCI disconnect should indicate a reason why L2CAP fails. This is a
    bluntly layer violation since multiple L2CAP connections could be using
    the same ACL and thus forcing a disconnect reason is not a good idea.

    To comply with the Bluetooth test specification, the disconnect reason
    is now stored in the L2CAP connection structure and every time a new
    L2CAP channel is added it will set back to its default. So only in the
    case where the L2CAP channel with the disconnect reason is really the
    last one, it will propagated to the HCI layer.

    The HCI layer has been extended with a disconnect indication that allows
    it to ask upper layers for a disconnect reason. The upper layer must not
    support this callback and in that case it will nicely default to the
    existing behavior. If an upper layer like L2CAP can provide a disconnect
    reason that one will be used to disconnect the ACL or SCO link.

    No modification to the ACL disconnect timeout have been made. So in case
    of Linux to Linux connection the initiator will disconnect the ACL link
    before the acceptor side can signal the specific disconnect reason. That
    is perfectly fine since Linux doesn't make use of this value anyway. The
    L2CAP layer has a perfect valid error code for rejecting connection due
    to a security violation. It is unclear why the Bluetooth specification
    insists on having specific HCI disconnect reason.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • In preparation for L2CAP fixed channel support, the CID value of a
    L2CAP connection needs to be accessible via the socket interface. The
    CID is the connection identifier and exists as source and destination
    value. So extend the L2CAP socket address structure with this field and
    change getsockname() and getpeername() to fill it in.

    The bind() and connect() functions have been modified to handle L2CAP
    socket address structures of variable sizes. This makes them future
    proof if additional fields need to be added.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • If the extended features mask indicates support for fixed channels,
    request the list of available fixed channels. This also enables the
    fixed channel features bit so remote implementations can request
    information about it. Currently only the signal channel will be
    listed.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The recommendation for the L2CAP PSM 1 (SDP) is to not use any kind
    of authentication or encryption. So don't trigger authentication
    for incoming and outgoing SDP connections.

    For L2CAP PSM 3 (RFCOMM) there is no clear requirement, but with
    Bluetooth 2.1 the initiator is required to enable authentication
    and encryption first and this gets enforced. So there is no need
    to trigger an additional authentication step. The RFCOMM service
    security will make sure that a secure enough link key is present.

    When the encryption gets enabled after the SDP connection setup,
    then switch the security level from SDP to low security.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • If the remote L2CAP server uses authentication pending stage and
    encryption is enabled it can happen that a L2CAP connection request is
    sent twice due to a race condition in the connection state machine.

    When the remote side indicates any kind of connection pending, then
    track this state and skip sending of L2CAP commands for this period.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • When two L2CAP connections are requested quickly after the ACL link has
    been established there exists a window for a race condition where a
    connection request is sent before the information response has been
    received. Any connection request should only be sent after an exchange
    of the extended features mask has been finished.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • When receiving incoming connection to specific services, always use
    general bonding. This ensures that the link key gets stored and can be
    used for further authentications.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • When attempting to setup eSCO connections it can happen that some link
    manager implementations fail to properly negotiate the eSCO parameters
    and thus fail the eSCO setup. Normally the link manager is responsible
    for the negotiation of the parameters and actually fallback to SCO if
    no agreement can be reached. In cases where the link manager is just too
    stupid, then at least try to establish a SCO link if eSCO fails.

    For the Bluetooth devices with EDR support this includes handling packet
    types of EDR basebands. This is particular tricky since for the EDR the
    logic of enabling/disabling one specific packet type is turned around.
    This fix contains an extra bitmask to disable eSCO EDR packet when
    trying to fallback to a SCO connection.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • A role switch with devices following the Bluetooth pre-2.1 standards
    or without Encryption Pause and Resume support is not possible if
    encryption is enabled. Most newer headsets require the role switch,
    but also require that the connection is encrypted.

    For connections with a high security mode setting, the link will be
    immediately dropped. When the connection uses medium security mode
    setting, then a grace period is introduced where the TX is halted and
    the remote device gets a change to re-enable encryption after the
    role switch. If not re-enabled the link will be dropped.

    Based on initial work by Ville Tervo

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • Change the RFCOMM internals to use the new security levels and remove
    the link mode details.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • Change the L2CAP internals to use the new security levels and remove
    the link mode details.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The current security model is based around the flags AUTH, ENCRYPT and
    SECURE. Starting with support for the Bluetooth 2.1 specification this is
    no longer sufficient. The different security levels are now defined as
    SDP, LOW, MEDIUM and SECURE.

    Previously it was possible to set each security independently, but this
    actually doesn't make a lot of sense. For Bluetooth the encryption depends
    on a previous successful authentication. Also you can only update your
    existing link key if you successfully created at least one before. And of
    course the update of link keys without having proper encryption in place
    is a security issue.

    The new security levels from the Bluetooth 2.1 specification are now
    used internally. All old settings are mapped to the new values and this
    way it ensures that old applications still work. The only limitation
    is that it is no longer possible to set authentication without also
    enabling encryption. No application should have done this anyway since
    this is actually a security issue. Without encryption the integrity of
    the authentication can't be guaranteed.

    As default for a new L2CAP or RFCOMM connection, the LOW security level
    is used. The only exception here are the service discovery sessions on
    PSM 1 where SDP level is used. To have similar security strength as with
    a Bluetooth 2.0 and before combination key, the MEDIUM level should be
    used. This is according to the Bluetooth specification. The MEDIUM level
    will not require any kind of man-in-the-middle (MITM) protection. Only
    the HIGH security level will require this.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • In order to decide if listening RFCOMM sockets should be accept()ed
    the BD_ADDR of the remote device needs to be known. This patch adds
    a socket option which defines a timeout for deferring the actual
    connection setup.

    The connection setup is done after reading from the socket for the
    first time. Until then writing to the socket returns ENOTCONN.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The L2CAP and RFCOMM applications require support for authorization
    and the ability of rejecting incoming connection requests. The socket
    interface is not really able to support this.

    This patch does the ground work for a socket option to defer connection
    setup. Setting this option allows calling of accept() and then the
    first read() will trigger the final connection setup. Calling close()
    would reject the connection.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     

30 Nov, 2008

2 commits

  • With the introduction of CONFIG_DYNAMIC_PRINTK_DEBUG it is possible to
    allow debugging without having to recompile the kernel. This patch turns
    all BT_DBG() calls into pr_debug() to support dynamic debug messages.

    As a side effect all CONFIG_BT_*_DEBUG statements are now removed and
    some broken debug entries have been fixed.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The Bluetooth subsystem was not using the HCI Reset command when doing
    device initialization. The Bluetooth 1.0b specification was ambiguous
    on how the device firmware was suppose to handle it. Almost every device
    was triggering a transport reset at the same time. In case of USB this
    ended up in disconnects from the bus.

    All modern Bluetooth dongles handle this perfectly fine and a lot of
    them actually require that HCI Reset is sent. If not then they are
    either stuck in their HID Proxy mode or their internal structures for
    inquiry and paging are not correctly setup.

    To handle old and new devices smoothly the Bluetooth subsystem contains
    a quirk to force the HCI Reset on initialization. However maintaining
    such a quirk becomes more and more complicated. This patch turns the
    logic around and lets the old devices disable the HCI Reset command.

    The only device where the HCI_QUIRK_NO_RESET is still needed are the
    original Digianswer devices and dongles with an early CSR firmware.

    CSR reported that they fixed this for version 12 firmware. The last
    official release of version 11 firmware is build ID 115. The first
    version 12 candidate was build ID 117.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     

17 Oct, 2008

1 commit


09 Sep, 2008

2 commits

  • The Security Mode 4 of the Bluetooth 2.1 specification has strict
    authentication and encryption requirements. It is the initiators job
    to create a secure ACL link. However in case of malicious devices, the
    acceptor has to make sure that the ACL is encrypted before allowing
    any kind of L2CAP connection. The only exception here is the PSM 1 for
    the service discovery protocol, because that is allowed to run on an
    insecure ACL link.

    Previously it was enough to reject a L2CAP connection during the
    connection setup phase, but with Bluetooth 2.1 it is forbidden to
    do any L2CAP protocol exchange on an insecure link (except SDP).

    The new hci_conn_check_link_mode() function can be used to check the
    integrity of an ACL link. This functions also takes care of the cases
    where Security Mode 4 is disabled or one of the devices is based on
    an older specification.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • With the introduction of Security Mode 4 and Simple Pairing from the
    Bluetooth 2.1 specification it became mandatory that the initiator
    requires authentication and encryption before any L2CAP channel can
    be established. The only exception here is PSM 1 for the service
    discovery protocol (SDP). It is meant to be used without any encryption
    since it contains only public information. This is how Bluetooth 2.0
    and before handle connections on PSM 1.

    For Bluetooth 2.1 devices the pairing procedure differentiates between
    no bonding, general bonding and dedicated bonding. The L2CAP layer
    wrongly uses always general bonding when creating new connections, but it
    should not do this for SDP connections. In this case the authentication
    requirement should be no bonding and the just-works model should be used,
    but in case of non-SDP connection it is required to use general bonding.

    If the new connection requires man-in-the-middle (MITM) protection, it
    also first wrongly creates an unauthenticated link key and then later on
    requests an upgrade to an authenticated link key to provide full MITM
    protection. With Simple Pairing the link key generation is an expensive
    operation (compared to Bluetooth 2.0 and before) and doing this twice
    during a connection setup causes a noticeable delay when establishing
    a new connection. This should be avoided to not regress from the expected
    Bluetooth 2.0 connection times. The authentication requirements are known
    up-front and so enforce them.

    To fulfill these requirements the hci_connect() function has been extended
    with an authentication requirement parameter that will be stored inside
    the connection information and can be retrieved by userspace at any
    time. This allows the correct IO capabilities exchange and results in
    the expected behavior.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     

15 Jul, 2008

11 commits

  • When switching a RFCOMM socket to a TTY, the remote modem status might
    be needed later. Currently it is lost since the original configuration
    is done via the socket interface. So store the modem status and reply
    it when the socket has been converted to a TTY.

    Signed-off-by: Denis Kenzior
    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • Enable the common timestamp functionality that the network subsystem
    provides for L2CAP, RFCOMM and SCO sockets. It is possible to either
    use SO_TIMESTAMP or the IOCTLs to retrieve the timestamp of the
    current packet.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • With the Simple Pairing support, the authentication requirements are
    an explicit setting during the bonding process. Track and enforce the
    requirements and allow higher layers like L2CAP and RFCOMM to increase
    them if needed.

    This patch introduces a new IOCTL that allows to query the current
    authentication requirements. It is also possible to detect Simple
    Pairing support in the kernel this way.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The Bluetooth technology introduces new features on a regular basis
    and for some of them it is important that the hardware on both sides
    support them. For features like Simple Pairing it is important that
    the host stacks on both sides have switched this feature on. To make
    valid decisions, a config stage during ACL link establishment has been
    introduced that retrieves remote features and if needed also the remote
    extended features (known as remote host features) before signalling
    this link as connected.

    This change introduces full reference counting of incoming and outgoing
    ACL links and the Bluetooth core will disconnect both if no owner of it
    is present. To better handle interoperability during the pairing phase
    the disconnect timeout for incoming connections has been increased to
    10 seconds. This is five times more than for outgoing connections.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The Simple Pairing process can only be used if both sides have the
    support enabled in the host stack. The current Bluetooth specification
    has three ways to detect this support.

    If an Extended Inquiry Result has been sent during inquiry then it
    is safe to assume that Simple Pairing is enabled. It is not allowed
    to enable Extended Inquiry without Simple Pairing. During the remote
    name request phase a notification with the remote host supported
    features will be sent to indicate Simple Pairing support. Also the
    second page of the remote extended features can indicate support for
    Simple Pairing.

    For all three cases the value of remote Simple Pairing mode is stored
    in the inquiry cache for later use.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The Simple Pairing feature is optional and needs to be enabled by the
    host stack first. The Linux kernel relies on the Bluetooth daemon to
    either enable or disable it, but at any time it needs to know the
    current state of the Simple Pairing mode. So track any changes made
    by external entities and store the current mode in the HCI device
    structure.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • During the Simple Pairing process the HCI disconnect timer must be
    disabled. The way to do this is by holding a reference count of the
    HCI connection. The Simple Pairing process on both sides starts with
    an IO Capabilities Request and ends with Simple Pairing Complete.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The Bluetooth specification supports the default link policy settings
    on a per host controller basis. For every new connection the link
    manager would then use these settings. It is better to use this instead
    of bothering the controller on every connection setup to overwrite the
    default settings.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The connection packet type can be changed after the connection has been
    established and thus needs to be properly tracked to ensure that the
    host stack has always correct and valid information about it.

    On incoming connections the Bluetooth core switches the supported packet
    types to the configured list for this controller. However the usefulness
    of this feature has been questioned a lot. The general consent is that
    every Bluetooth host stack should enable as many packet types as the
    hardware actually supports and leave the decision to the link manager
    software running on the Bluetooth chip.

    When running on Bluetooth 2.0 or later hardware, don't change the packet
    type for incoming connections anymore. This hardware likely supports
    Enhanced Data Rate and thus leave it completely up to the link manager
    to pick the best packet type.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The Bluetooth specification allows to enable or disable the encryption
    of an ACL link at any time by either the peer or the remote device. If
    a L2CAP or RFCOMM connection requested an encrypted link, they will now
    disconnect that link if the encryption gets disabled. Higher protocols
    that don't care about encryption (like SDP) are not affected.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • Recent tests with various Bluetooth headsets have shown that some of
    them don't enforce authentication and encryption when connecting. All
    of them leave it up to the host stack to enforce it. Non of them should
    allow unencrypted connections, but that is how it is. So in case the
    link mode settings require authentication and/or encryption it will now
    also be enforced on outgoing RFCOMM connections. Previously this was
    only done for incoming connections.

    This support has a small drawback from a protocol level point of view
    since the host stack can't really tell with 100% certainty if a remote
    side is already authenticated or not. So if both sides are configured
    to enforce authentication it will be requested twice. Most Bluetooth
    chips are caching this information and thus no extra authentication
    procedure has to be triggered over-the-air, but it can happen.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     

06 Mar, 2008

1 commit


29 Jan, 2008

1 commit


22 Oct, 2007

5 commits


31 Jul, 2007

1 commit


11 Jul, 2007

2 commits