This checks if connection encrypt flag is set if attribute requires
encryption and in case the connection is already encrypted return
success.
Change-Id: I8af4e9786b63a21f478b3aa9f6df448d7f5760c5
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Respond with an error if attribute read/write return an error.
Change-Id: I9c2f98ac4b73bca5d3714339a47290ca9ae2391b
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
With the introduction of the Number of Completed Packets event
handling this FIFO & fiber aren't anymore strictly HCI command
completion related. Rename them therefore to something that more
appropriately describes their purpose.
Change-Id: Ia53dea8b5ec0098459f23918a5483075757d9202
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
The Number of Completed Packets HCI event belongs to the same category
as the Command Complete/Status events in that it is likely to unlock a
waiter in one of the other fibers. Events which may affect waiters in
this way need to be processed without delay and through a separate
FIFO & fiber to avoid deadlocks.
Change-Id: Ibc2ee2b4f72e2534a8579ad1c36591867e19e6df
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
The PACK_STRUCT macro will be removed soon and __packed is what all
code should use. Convert all the usages in Bluetooth code.
Change-Id: Id5c724566565f67fa8167b61398c508194ece89b
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
We need to make sure we have more event buffers than outgoing ACL
buffers. Currently we allocate 7 + 7 ACL in/out buffers leaving only 7
left for commands/events. Increase the buffer count by two to make
sure we've got 8 command/event buffers.
Change-Id: I4c54aa07019ad9ef262aeecabf151edd60f91b9e
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
When reading a characteristic attribute which contain a 128 bits UUID the
size of the elements were counting only the UUID alone not other fields
that are part of the value causing invalid responses to be sent.
Change-Id: I7474531f586ba19788eb9e0ed59555c5d7672176
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This checks attribute permission returning an error in case they don't
match.
Change-Id: I56a85ad594cb1ac535b03cdbceb43af84dc6604f
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
If CONFIG_BLUETOOTH_DEBUG_HCI_CORE is enabled it causes the following
error:
hci_core.c:514:12: error: 'struct bt_hci_evt_encrypt_key_refresh_complete' has no member named 'encrypt'
evt->encrypt);
^
Change-Id: I1983653eba40b9aea6b19572b39a285883f00450
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
We can do centralized PDU length checks and more compact code size
with the help of a handler table where the index maps to the SMP op
code.
Change-Id: Iba69ecc14f452411dfb6b4db7c7a5fd19ba3e51f
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Fixes memory leak when buffer is allocated before CCC check, the best
fix is to move CCC check forward.
Change-Id: Ib0492f629a339b576cf811adce47b2f6ab101c33
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
For now we don't support key shortening, so set the minimum value
appropriately to 16 bytes. Once key shortening is implemented this
value can be lowered again.
Change-Id: I172d0bf6d04ba4c5eaa7bbf8ae2accfa373eebb5
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Devices using LE Privacy are identified by their Identity Address
whenever we've paired and received their IRK. We should therefore try
to look up matching IRKs for advertising responses.
Change-Id: I304108da699ff2506e6cc50bd6c5c053a0db024b
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Use correct address to string translation.
Change-Id: Ic766147fd6016894c0f60ec57059984887653a15
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
This event comes instead of Encrypt Change when we re-encrypt an
already encrypted connection.
Change-Id: I7fe9545e6c58392a34d72f3dd3962c475ebb7871
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
When a connection occurs it may have happened with an RPA. If so,
check if there's a matching IRK available and update the connection
address with the Identity Address (stored together with the IRK).
Change-Id: I3d995a35171b514ec1902fce617e8e7d6770e785
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add an API to bt_keys for looking up IRKs based on a given RPA.
Change-Id: If9c0569c8d619f9cb2b6174d77c25dd5358db863
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add support for the SMP ah() crypto function which is used to match up
IRKs with RPAs.
Change-Id: Iaea8397ea401df800259dfab2ce97187aa5e2df6
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
To avoid spending unnecessary time looking up the same keys multiple
times simply store a pointer to them from the connection context.
Change-Id: I94b550870c863237348a2cab7ba056be2a7f4bc5
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
If we're not actively performing pairing we should ignore any
encryption changes. If we don't do this the code might e.g.
incorrectly clear out existing keys.
Change-Id: Iac49a09abd7386b773e325b9bc939d6b6c741c92
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add support for handing the Identity Info and Identity Address Info
SMP PDUs.
Change-Id: Ie0ed57e2c1819a1619b9eaa340ed22666c81eea8
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add support to store IRKs through the bt_keys API.
Change-Id: I01f713f8ad3657605a8bc2738db349d25bb89649
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
We'll need to store many other keys besides slave LTKs. Refactor the
key handling code so that new types can be easily added.
Change-Id: I768db9cb29e8e73e87713e59f7b80af80399f20d
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
In preparation of adding more key support and to not bloat hci_core.c
prepare a new .c file for the key management code.
Change-Id: I5129a7a3a5d495a299f75e4e669253446a276142
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
The input paramter is bt_addr_le_t so the function should be named
accordingly.
Change-Id: I7b796020d6e43ae1aa76a261cbfbaf7cba163029
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
bt_gatt_notify can be used to send ATT notifications:
< ACL Data TX: Handle 3585 flags 0x00 dlen 8
ATT: Handle Value Notification (0x1b) len 3
Handle: 0x0010
Data: 64
Change-Id: I908f10f9e60dc7cef221e4b27c3b6e49e7b0cfc9
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
BT_GATT_CCC uses _bt_gatt_ccc internal struct to handle peer
configurations and special helpers to read and write to minimize the
code necessary to handle CCC in the task.
Note this not yet include handling of connection and disconnection but
the idea is that the core would automatically disable the configurations
while disconnected and re-enable once peer connect back.
Change-Id: I89325b8a074766b9fd2423085565df669f7275e1
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Invalid peer address was being passed since the conn pointer was not
initialized properly.
Change-Id: Ib64584f1eb8bc534389bd4fa057c58dd00ffbd6d
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
To implement CCC properly it is required to know the remote address since
it is per client, futhermore bt_gatt_notify requires an address where to
send the notification.
Change-Id: I9d9fdf72d668831bed76e2aef06816af3620f4b8
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Follow the same style as bt_conn_lookup_handle (i.e. drop the 'by').
Change-Id: I6a31104fc8beac13c357088e46a91bd713fcfdd4
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
To take multiple different ways of looking up connections rename the
existing too generic bt_conn_lookup to bt_conn_lookup_handle.
Change-Id: I1c4965ad76738fa08ccca91b28cda552c9a88373
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
bt_conn_lookup_by_addr looks up for existing BLE connection by address.
Change-Id: If24516511b7d07cd99bbe095a737b38b0adaabad
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Move the usage reports into the function that does the analysis, and
also include a percentage of the usage. To make the results more
relevant give them in terms of the "real" stack size, i.e. the stack
space minus the CSS size in the beginning.
Change-Id: Ibc0418de396e140839c9a810196fbf16df533df5
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
512 is a more accurate description than 1024 of the stack usage impact
of enabling debug logs.
Change-Id: I4b79b4eb9724ba624ff546973a1126c62382d1aa
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
To not have to always do the __noinit, debug log correction and 4-byte
alignement declaration create some helper macros for defining the
stacks.
Change-Id: I2de5068d7044af3f348ed01281498a777d04c97d
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
The CCS always starts at a 4-byte aligned boundary, so if the stack
given to fiber_start doesn't begin in such a place there will be some
unused bytes in the beginning and the 'real' stack will start at a
different offset. Take this into account when calculating the unused
stack portion.
Change-Id: I6c36d0354f4d014ad256b5580b76282d7d4384ce
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
In case there are changes to the way the stacks are defined it's safer
to use sizeof() rather than rely on some specific size define.
Change-Id: Ic9ae090c0dbc0d88995a8883f9b4876be5958f1d
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This one doesn't really contribute anything extra to the other info
that's already logged.
Change-Id: I741fa1a161914915bee0870dc102a7d0acfe0a33
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Set the stack sizes based on what the current utilization is for SMP
and GATT tests.
Change-Id: I892282a088d7b244f7abdbc92368addc9c19e4eb
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
To make it easy to periodically verify that we have sane stack sizes
it's helpful to have some code to evaluate how much of the stacks are
used. There's already a CONFIG_INIT_STACKS option which pre-fills the
stacks with 0xaa bytes, so we make use of it and in case the option is
enabled run the extra code to evaluate how much of each stack was
used. The trigger for the evaluation is a disconnection event.
Change-Id: I815ff96b2e6f877c29f4df3c949afae78222a8f3
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
No need to waste CPU cycles initializing the stack variables.
Change-Id: Ifab0cf77ffb46d93aecb9a3082155478de782736
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Bluetooth fibers must have their stacks properly aligned.
Change-Id: Id46b376abb46400c563050b4c8393ab3983ff045
Signed-off-by: Peter Mitsis <peter.mitsis@windriver.com>
BLUETOOTH_UART and BLUETOOTH_DEBUG_UART defined twice.
Change-Id: I77f0e87a7f6132514696ef854c183037a540acba
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
This commit add license headers to Kconfig files.
Change-Id: I79e60263b8c7b696463ecc84b8ad411af5415117
Signed-off-by: Juan Manuel Cruz <juan.m.cruz.alcaraz@linux.intel.com>
This commit organizes the bluetooth Ksymbols in:
- Driver symbols at drivers/bluetooth/Kconfig
- Stack symbols at net/bluetooth/Kconfig
Change-Id: I8ebadeb8ac7f8a769d7620e4e44077a05915dc86
Signed-off-by: Juan Manuel Cruz <juan.m.cruz.alcaraz@linux.intel.com>
This commit adds the Makefile and Kconfig files
to support the bluetooth driver in the Kbuild system.
Signed-off-by: Juan Manuel Cruz <juan.m.cruz.alcaraz@linux.intel.com>
Change-Id: I1f72b13aca8fb098eece04c4f0e1b680639b520f
The code was incorrectly using RX_STACK_SIZE instead of
CMD_RX_STACK_SIZE.
Change-Id: I4a8ddb700e2a701bf8572ed877865a7d0cb3b2d0
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Some hci_core.c debug logs were still incorrectly using the old
bt_bdaddr_str API.
Change-Id: I92ce4544c44266216225b4d9a20e639a2fefa9d0
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add a GATT debug config option to be able to limit the debug logs only
to the GATT submodule.
Change-Id: Ie486c9125070f32506547f981c704eaf3e9f2377
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Read attributes matching value and handle range generating a proper
response:
< ACL Data TX: Handle 3585 flags 0x00 dlen 9
ATT: Find By Type Value Response (0x07) len 4
Handle range: 0x0001-0x0005
Change-Id: I8001afa2b22e804bef3778d0509d17b01a8d597c
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Read attributes matching UUID and handle range generating a proper
response:
< ACL Data TX: Handle 3585 flags 0x00 dlen 20
ATT: Read By Type Response (0x09) len 15
Attribute data length: 7
Attribute data list: 2 entries
Handle: 0x0002
Value: 020300002a
Handle: 0x0004
Value: 020500012a
Change-Id: Iaf4b0c963765a7769a17144a4d394dce8555c2d3
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This replace the old code that could only compare 16 bits UUID with
bt_uuid_cmp which can expand to 128 bits if types don't match.
Change-Id: I84219d451d8c95baf6f7e42b92629cb106428ccf
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
bt_gatt_foreach_attr iterates over attributes via callback, it will be
used to implement discovery functionality.
Change-Id: Ice66f4b3d0d12b3616986931d5da0fe0f202e533
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
bt_uuid_cmp compares 2 UUIDs returning if they match, if the types are
different it converts both to 128 bit format before performing the
comparison.
Change-Id: Iacf330cc0271a7e5429cbb2f405a7d9ef249a1a3
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds initial API and definitions to create a database.
Change-Id: I69d5b3f5fd2f04cc309c2f76a84581673aa54e7b
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This properly init the MTU to default upon new connection and properly
store the new value in case of Exchange MTU request.
Change-Id: I561f5b1756fd8833244cdd2a986e561c16fc8471
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
The overflow/underflow checks are something that we want to have
whenever debug is enabled in general (and not just for buffers
specifically).
Change-Id: Ib4edd366ae8ce1a80d33155ab1dc8d5a20477909
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
For LE Privacy support we'll need to be able to distinguish which
addresses are RPAs and which are Identity Addresses.
Change-Id: Ie244a4d53ffddc435edbd6d69d7ecca205202f18
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
We use addresses in lots of places and with LE we always need to pass
around the type in addition to the address value. Defining dedicated
types for addresses makes the code much simpler.
Change-Id: Ie8b495dce50e3f084685909c19acc5d08e2cca10
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
When debug is enabled the cmd_rx fiber seems to cause exceptions some
times. Increasing its stack size seems to help.
Change-Id: I8152645f5904758b771ffe73b1112c77c8bfe924
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Now that bt_hci_send_cmd_sync() is safe to be called from the rx fiber
(used for all HCI events besides Command Complete/Status) we can move
the le_rand() usage to the key distribution stage instead of the
workaround of generating them prematurely.
Change-Id: I8bbc8dc78922a275a0c9982474d60b0693b29af2
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Now that there's the split of Command Complete/Status events from all
other RX data we don't anymore need dedicated per-connection RX
fibers. Remove these fibers and their associated FIFO and use
bt_l2cap_recv() directly from bt_conn_recv().
Change-Id: Ib9740e76200cfa40d46ee234f9693dcb7e8387fd
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
These events are special since they release any blocking
bt_hci_cmd_send_sync() calls. In order to be able to use the send_sync
API from HCI Event handlers without deadlocking having the Command
Complete/Status events processed through a dedicated fiber is
essential.
Change-Id: Id5c597d618bf326a8efb7c9ca2500af60a502d77
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
To prepare for a dedicated Command Complete/Status processing fiber,
add 'tx' to the existing names to differentiate from the 'rx' in the
upcoming names.
Change-Id: I59e0ba34502e4a2341396f81bfb5829c296b35a5
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Unknown buffers are likely a bug, but we should still put them back to
the buffer pool. Also, there's no reason to stop running the fiber.
Change-Id: I413f9ff115689da9b1487bc622a8d26693cfd6d0
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
The bt_hci_cmd_send_sync function will deadlock if called from within
the rx fiber. Add prevention for this when debug is enabled by
verifying that the calling context is not the rx fiber.
Change-Id: Ib94bd5c10185165d017fe0aeafbce46d503ad705
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add support for distributing our LTK to the remote side. Normally we
would generate the needed random bytes when the connection becomes
encrypted, however using bt_hci_cmd_send_sync() from a HCI event
handler (which the encryption_change is) is not possible and will
deadlock (because it needs to wait for a HCI command of its own to
complete). Instead, pre-generate the LTK as part of the SMP context
when we receive the SMP Random PDU from the remote.
Change-Id: Id9cc34b7ddfd1804626cf8bdc81c25aa8cc7943c
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
We shouldn't send any unknown bits or bits that we do not support.
Change-Id: Ia1c1cfd1e70ca879fd070b5fbcceef3b66ba8237
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add more defines needed to do key distribution and using correct
values for the authentication requirement.
Change-Id: I674c143d26ee31e9473c50c181c2947a305025fd
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
We also need to store the EDiv & Rand values to be able to do correct
look-up of LTKs.
Change-Id: If6dbfc7569d18a4c8597a401deccad3ef8cb51ad
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
We'll soon need to generate other amounts of random bytes than 16.
Update the le_rand() helper to generate any amount of random bytes.
Change-Id: I9295e6e3d79b0577c7bced31604a0fa45f1a9424
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
UUID defines, etc, will be needed by multiple files including GATT.
Change-Id: I855d3934242f54a8b5bf31652a4f8b9dfb63ef06
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Now that we have the connected/disconnected callbacks available for
L2CAP channels we can use these to associate the bt_conn with a
respective protocol-specific context.
Change-Id: I7c4d9a54f73ae7029a73372a1b0c93d473b28881
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add callbacks to notify L2CAP channels of connections, disconnections
and changes in the encryption state.
Change-Id: I66f86f20f551f01459abdbec6ccd214992828470
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
We'll either way need various callbacks as well as get rid of the
channel-specific contexts in conn.h, so add a dynamic way of
registering fixed channels. The LE signaling channel is handled in the
same way as any other channel.
Change-Id: I5f8c1af3c8e3d107212becf507a5a6485838e081
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
There will be various scenarios where we need to know what the current
encryption mode for a connection is.
Change-Id: I9836ffe51bfb6ebfc09497c7c716bd13a4064305
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
The handles do not need ACL data-like decoding and the handlers should
be no-op for any non-zero status.
Change-Id: I40006ef7e5d01e8841ae0bebeda87755b2a32938
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Now that the logging macros use printf we can use more appropriate
format specifiers for various values.
Change-Id: I01025133b6a075f3478957a60163a1574cd85df7
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add an event handler for LTK requests that looks up the LTK using the
new bt_keys API.
Change-Id: Ifc4e5f96e84026d7e8c68eacb64154dc0a9c72b3
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Take advantage of the new bt_keys API to store the generated STK.
Change-Id: I7dc20c8581e55a98f2f4f804d3a01bc636364ad0
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add runtime storage of pairing related keys, along with a config
option to control how many pairings are supported.
Change-Id: Ib5177d2b6fbb0d2d458b539a3f1095c1dce135ff
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
The s1() crypto function is used to generate keys for SMP Legacy
Pairing.
Change-Id: I839cb8210d8babe64551f8d958c97d0addd459b4
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Add a kernel config option to specify how many simultaneous
connections can be supported.
Change-Id: I963aacb7cece3436ecd5049683a19a350224a156
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
These may help debug early initialization issues.
Change-Id: I18a8043b2da46ec50f03fedfce46e48d9b41b373
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Encoding the L2CAP header when allocating the buffer means that we
must know the final size up-front. This is not always possible, so
move the header encoding to bt_l2cap_send() and only have the
bt_l2cap_create_pdu() function reserve enough headroom without
actually encoding anything.
Change-Id: Ic1c3b6b72c265cd0db4e835790fa915e0acd9388
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>