Commit Graph

893 Commits

Author SHA1 Message Date
Jukka Rissanen
a2a702a986 net: 802.15.4: Dummy radio driver must reset status on error
In order to avoid memory corruption, the dummy 802.15.4 radio
must reset its internal state when there is an error when
reading packet data from UART.

Change-Id: Ifeba5181f014426b95d21e5726c638eae555b649
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
c9f1ce2639 Bluetooth: Increase default ATT MTU when possible
The 23 bytes default is quite limiting. When SMP has been enabled we
can do a bit better since we know that we can fit two complete ACL
packets to the buffers (23 bytes payload in the first, and 27 in the
second).

Change-Id: I71d9c484c962b1ff46d325f7182511f168608b8e
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
3bc43254e0 Bluetooth: Use event/cmd lengths instead of buffer sizes in KConfig
It's more intuitive to specify needed command or event lengths rather
than the raw buffer size in Kconfig. The exact buffer size calculation
can be done in the code itself.

Change-Id: I2760cc1182a689b26405e4c2b1428f140b4aa88a
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
8167ababe0 Bluetooth: Make Kconfig buffer sizes follow MTU sizes
It's more intuitive to specify needed MTU sizes instead of raw buffer
sizes. The exact buffer size calculations can instead be made
internally in the code (using the BT_L2CAP_BUF_SIZE helper macro).

Change-Id: I0637340a7d99e04020f57f49ecd8e6dcfcc4bcf4
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
50256ea514 Bluetooth: Move BT_L2CAP_BUF_SIZE to a more appropriate place
This doesn't need to be exposed in the public API.

Change-Id: Ib6d4336684620bd1e03d128765f289b5ebd744ef
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
1ba3350157 Bluetooth: Fix leaving empty header space in ACL fragments
The outgoing fragments don't need to reserve space for the L2CAP
header since we're copying from an original buffer that already has
this header (and continuation fragments don't have it a all).

Change-Id: I3ce18bf45f2a31f5ab3db395a506e35aa246762b
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
6d1864c55d Bluetooth: Make create_frag() responsible for copying data
We can simplify & shorten the code by doing the copying from the
original buffer straight in the create_frag() function.

Change-Id: I8e7676642a13095783071275fbccc248f55e245c
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
03d9aa4ecc Bluetooth: Fix double-free when sending ACL buffers
When send_frag() is given the original buffer (from tx_fiber) the
tx_fiber itself takes care of unrefing in case of failure. We need to
therefore instruct send_frag() when it can fully assume to own the
buffer (in case it's a separately created fragment) and when it should
leave it alone in case of failure (when it's the original tx buffer).

Change-Id: If4804e1fe19a9c7a0aa0694fdc2cbb58b10ece2b
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
7a39d44577 Bluetooth: Move ACL fragmentation from bt_conn_send to tx fiber
This way we're both able to properly utilize the fragments pool as
well as ensure that no two buffers for this connection end up being
fragmented into the tx_queue in an interleaved fashion (which would
just confuse the controller).

Change-Id: I3934cd3fbfc5e190d61475eb691a34a2df13ed74
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
f6bfb4377e Bluetooth: Fix buffer leak in bt_conn_send
Since bt_conn_send doesn't currently return an error code it must be
assumed to consume the buffer no matter what. The only failure
condition is the "not connected" case, so make sure the buffer is
unreffed there.

Change-Id: I30e9a81d6f801a67d90ab59c1040b6f55261e71c
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
b9d13664ab Bluetooth: Create protocol-specific outgoing ACL buffer pools
With this split we get better control of the buffer sizes and counts.
We also anyway will need a fragments pool so a simple generic ACL_OUT
pool doesn't make sense anymore. The related Kconfig options for that
have been removed.

Change-Id: I616cf49915a1cc0dc0ddc724e2e182bcbe0c80f6
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
1f6841c9c1 Bluetooth: Convert driver header info to hidden Kconfig options
We know the needed values at build-time, so there's no point in having
a runtime mechanism of accessing them in the code. Having the values
as defines makes it e.g. possible to use them as input for defining
the size of buffer pools.

Change-Id: Ib7556644719bfb631e638fa5bf29f3d1747a5072
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
4599fa1db3 Bluetooth: Move ACL_OUT buffer management to conn.c
This seems like a more appropriate place, and it's where we'll anyway
need to manage a separate pool for ACL_OUT fragments.

Change-Id: I6e0e2ec67d2f89a7f09787a3674405570d9b9cce
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Johan Hedberg
32f5826a1b Bluetooth: Add bt_conn_init() API
This helps move the ACL_OUT buffer management into conn.c.

Change-Id: Ie5ef48e02eeef5077f433e42c1e2eba9bdb94f63
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:45 -05:00
Mariusz Skamra
992237bc51 Bluetooth: Add bt_conn_enc_key_size function
This patch adds bt_conn_enc_key_size function which will be used
by application to check encryption keys size of a encrypted connection.
This will be used especialy by GATT applications, because some
attributes to be accessed require encryption with specified
minimum encryption key length.

> ACL Data RX: Handle 64 flags 0x02 dlen 7         [hci0] 708547.536685
      ATT: Read Request (0x0a) len 2
        Handle: 0x0003
< ACL Data TX: Handle 64 flags 0x00 dlen 9         [hci0] 708547.544302
      ATT: Error Response (0x01) len 4
        Read Request (0x0a)
        Handle: 0x0003
        Error: Insufficient Encryption Key Size (0x0c)

Change-Id: Idbc9afde7ec80504898bd8d1e193f3e71a93f3f9
Signed-off-by: Mariusz Skamra <mariusz.skamra@tieto.com>
2016-02-05 20:24:45 -05:00
Szymon Janc
89cfd86f2f Bluetooth: SMP: Fix using JustWorks when MITM was required
JustWorks pairing should be forced only if both sides don't require
MITM. Code checking this was incorrect and forced JustWorks even if
one side required MITM.

Change-Id: I70312b6832218f430546896ae1f2283ae6ce7c60
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:24:45 -05:00
Szymon Janc
1baada5589 Bluetooth: Remove not needed key look-up in update_sec_level
Keys in struct conn are set before encryption is enabled so there is
no need to look-up those every time security level is updated.

Change-Id: Ib0edb3c40fd2c5deca00055ed3f3ae7414a5df8e
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:24:45 -05:00
Szymon Janc
47e3db235d Bluetooth: Fix not setting keys for connection as master
If no keys are set for connection look-up it done. If keys are already
present there is no need for another look-up.

Change-Id: I0518772c4c9d8458b4b79aa7cb34a049324fb552
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:24:44 -05:00
Johan Hedberg
3cae902928 Bluetooth: Make HCI driver send() consume the given buffer
It is more intuitive to assume that the driver send() consumes (takes
ownership) of the buffer given to it.

Change-Id: I53d9cbebc0564d1d11110fc78a62ce0bbb3cdfd2
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:44 -05:00
Arkadiusz Lichwa
555d0d2594 Bluetooth: Refactor bt_conn struct
Isolates existing LE connection specific attributes and
prepares for now empty BR/EDR specific connection internals.

Change-Id: Ib423306fbf60e8451998e3933aee00cb672a1106
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:24:44 -05:00
Arkadiusz Lichwa
4970defaa4 Bluetooth: Refactor br_init()
Don't jump to BR/EDR read buffer size if LE read buffer size
returned LE data packet length value > 0 in le_init().

Change-Id: If0efa9f239ef75d832cf0f89ae6f227788cbf175
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:24:44 -05:00
Arkadiusz Lichwa
99bd06deaa Bluetooth: Refactor bt_dev struct
Groups LE stack specific values.

Change-Id: Ia947d25c105f518287293b4f870466daa416385c
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:24:44 -05:00
Johan Hedberg
20d946efa8 net: buf: Fix minor typo
Change-Id: Ibe47982cf3aeb1f4e2d700c4e7d11a77991ef6df
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:44 -05:00
Johan Hedberg
72050e2352 net: buf: Require destroy callbacks to handle returning to free FIFO
There could be cases where the destroy callback needs more
fine-grained control of step ordering than "1. destroy, 2. put back to
free FIFO". One case could be when the the pool needs to be protected
by a microkernel mutex or semaphore. In such a case the putting back
to the FIFO may need to happen before a custom action in the destroy
callback.

Making the destroy callback responsible for returning to the free FIFO
gives full flexibility regarding the order of the cleanup actions.

Change-Id: Ib9532d1dd70e0a2042af54ebd3e40a853dd42d33
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:44 -05:00
Luiz Augusto von Dentz
47fd65fdcf Bluetooth: L2CAP: Add #ifdef for l2cap_chan_le_recv
l2cap_chan_le_recv and related code should only be compiled if
CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL is defined.

Change-Id: Ia83e2010cdf251afc0a5cbf24b54173926de84c5
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
2016-02-05 20:24:44 -05:00
Johan Hedberg
a8bd3c358d Bluetooth: Fix missing sem_give() for ncmd when driver send() fails
If we fail to send an HCI command to the HCI driver we should give back the
semaphore that counts available commands.

Change-Id: I4aedf662c8b96d57ebafeb471deeb911c5f8ac7a
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:44 -05:00
Johan Hedberg
f1ebd8e513 Bluetooth: Fix missing sem_give() for ACL data when driver send() fails
If we fail to send an ACL packet to the HCI driver we should give back
the semaphore that counts available buffers on the controller side.

Change-Id: Ibad4039d24bcd49fe40b1f87608e1ad4c0248251
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:44 -05:00
Johan Hedberg
fa5dfa1366 Bluetooth: Kconfig: Make ACL buffer count ranges more reasonable
We need at least 2 buffers in each direction in case of fragmentation,
and there's no need to have such a low maximum count.

Change-Id: Ie25f4ebb231176a855e9651cb896fa8b59279629
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:44 -05:00
Johan Hedberg
db946d8bae Bluetooth: Add convenience defines for ACL handles
These make the code more readable when it comes to encoding and
decoding ACL handle values.

Change-Id: Ibd1972d6001c6c0c55428300f839b288dff1ce52
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:44 -05:00
Luiz Augusto von Dentz
5bd4324ae2 Bluetooth: L2CAP: Unref buffer after calling recv callback
This simplify the handling quite a bit while the application can still
prevent the buffer to be freed by referencing it if necessary.

Change-Id: I5ed0e96e8d9e349b79ba31ba9568af61181e1065
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
2016-02-05 20:24:41 -05:00
Luiz Augusto von Dentz
0475c0339d Bluetooth: L2CAP: Fix MTU value
Since segmentation is not enable the maximum SDU/MTU that could be
received is MPS - 2 since the first 2 bytes are used to inform the
SDU length.

Change-Id: I93b2f5b5bd5897870799db130d82476e520ee927
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
2016-02-05 20:24:41 -05:00
Luiz Augusto von Dentz
6da7f385a5 Bluetooth: L2CAP: Send LE Flow Control Credit
This adds logic to send more credits whenever it went bellow the
define threshold (50% of maximum):

> ACL Data RX: Handle 3585 flags 0x01 dlen 16
      Channel: 64 len 66 [PSM 128 mode 0] {chan 0}
        40 00 18 00 00 00 40 00 7f 7f 7f 7f 7f 7f 7f 7f  @.....@.........
        7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f  ................
        7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f  ................
        7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f  ................
        7f 7f                                            ..
< ACL Data TX: Handle 3585 flags 0x00 dlen 12
      LE L2CAP: LE Flow Control Credit (0x16) ident 58 len 4
        Source CID: 64
        Credits: 1

Change-Id: If12f3012a5405beca696edab3dd31775818bdeb8
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
6d60cee320 Bluetooth: Use bt_hci_cmd_send_sync for host buffer size
Follow the same conventions as for all other HCI commands that are
part of the init sequence.

Change-Id: Ia88b66044d903be103b9ce9fdc2a026a38ac551a
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Arkadiusz Lichwa
e16bb2282e Bluetooth: Refactor hci_init routine
Groups logically the sequence of hci initialization.

Change-Id: I6b465e79e809ce6514b8d6cc7563e4ee9775d324
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:24:40 -05:00
Luiz Augusto von Dentz
e5a1e66f9a Bluetooth: L2CAP: Handle disconnection request
This handle disconnection request removing the existing channel and
responding properly:

> ACL Data RX: Handle 3585 flags 0x02 dlen 12
      LE L2CAP: Disconnection Request (0x06) ident 2 len 4
        Destination CID: 64
        Source CID: 64
< ACL Data TX: Handle 3585 flags 0x00 dlen 12
      LE L2CAP: Disconnection Response (0x07) ident 2 len 4
        Destination CID: 64
        Source CID: 64

Change-Id: I13a57852f5c341a067c326c457b0200de438a54e
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
2016-02-05 20:24:40 -05:00
Luiz Augusto von Dentz
92b40ae0df Bluetooth: L2CAP: Fix selecting MPS based on buffer tailroom
It doesn't make sense to derive MPS from buffer tailroom since that a
signalling header, futhermore the buffer from signalling and data can
now have different sizes so instead just calculate the MPS based on
maximum buffer size.

Change-Id: Ieaac94b575c5d21711e0cb4b2685913977f057f3
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
4e2880f9c1 Bluetooth: Make sure fixed channels have the tx CID set
Right now we don't rely on this value being set, but we might in the
future.

Change-Id: Icc560b6935582a9e6dc268d21ce0784773aa480d
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
c20b68a221 Bluetooth: Remove broken check for existing rx CID
This check was trying to optimize the CID allocation, but it adds
little value and was actually broken because of the wrong CID passed
to the lookup function.

Change-Id: I793be0c5eeccb931cea4a5430991d4e692926da6
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
4f66545ba7 Bluetooth: Add clarifying comment to l2cap_chan_alloc_cid()
Make it clear why we're checking for non-zero rx CID.

Change-Id: I07a44cf1a0f28c540b191e24aba4d0519c338eaf
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
b5245cb9db Bluetooth: l2cap: Fix setting unnecessary DCID header in response
For an LE L2CAP Connect Response with a failure error code the core
specification states:

"The DCID, MTU, MPS and Initial Credits fields shall be ignored when
the result field indicates the connection was refused."

This means that there's no point in setting any specific value to it,
i.e. it can be left to 0 as set by memset.

Change-Id: Iead8039c7b60e1cf766e9ab14691e83fe9813288
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
450a124c3f Bluetooth: Fix checking for existing dynamic CID
L2CAP_LE_DYN_CID_END is still a valid CID so we should include it in
the search.

Change-Id: I5ead169fd9114c5d418e2e4f504d82faca8b1afa
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
4c6a95bb55 Bluetooth: Add missing check for invalid dynamic CID
When receiving an LE L2CAP Connect Request we should verify that the
proposed remote CID is within the dynamic CID range, and if not return
the appropriate error.

Change-Id: I54ca2431f0f622f96bc2c3acbd3de7ca4c92713a
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
394de5d2c1 Bluetooth: L2CAP name dynamic CID ranges appropriately
Change-Id: If66ab2e80c2a0d5c877a4e465363c1d05c8e643a
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
d858444eb5 Bluetooth: l2cap: Fix error code for SCID in use
If we receive a connect request for an SCID that's already allocated
we should return the appropriate "SCID in use" error for it instead of
"No resources".

Change-Id: I1c1e1bba7059c8a37a8cc01c4bb2f3fbd7aab67d
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Luiz Augusto von Dentz
701404624e Bluetooth: L2CAP: Don't limit tx MTU
This store the original MTU sent by the remote instead of limiting it to
the amount the buffer can allocate since buffer sizes can now be
different and it was anyway wrong to assume the size of buffer used for
signalling would be the same as in data packets.

Change-Id: I52c7e4946ae949a0068ce28a00d2b427a48a1b51
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
c73a6fd017 Bluetooth: Adjust lower bound of HCI command size
Currently the biggest required HCI command is HCI_LE_Generate_DHkey
which needs 1 (H4 header) + 3 (cmd header) + 64 = 68 bytes.

Change-Id: Ice142b7c68c1cb1571e03549bceb301d806bc453
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Jukka Rissanen
db51867a2b net: Fix NET_BUF_ASSERT macro compile error
This commit fixes this compile error if network buffer debugging
is activated.

  CC      net/buf.o
net/buf.c: In function 'net_buf_unref':
net/buf.c:40:31: error: expected expression before 'if'
 #define NET_BUF_ASSERT(cond) (if (!(cond)) {    \
                               ^
net/buf.c:81:2: note: in expansion of macro 'NET_BUF_ASSERT'
  NET_BUF_ASSERT(buf->ref > 0);
  ^

Change-Id: Id4248806a5df571663e47eab581164a16df0cd1b
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
9350318b92 Bluetooth: core: Rename buffer user data more appropriately
The structs are private so there's no need for long name-spacing.
Also, the bt_hci_data is only used for commands, so just call it
cmd_data.

Change-Id: I924a5b8a8cbcb9eb56038a83c03bcbcf7e79b6e0
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
297f4f481f Bluetooth: Split HCI command & event buffers to two pools
The HCI commands and events have slightly different requirements
(e.g. max sizes, or the fact that events don't need any user data) so
it makes sense to keep them separate. The total count is kept at 8 (2
+ 6) but the ACL_OUT count is modified to not exceed the event count
(to avoid inability of handling bursts of Number of Completed Packets
events). The ACL_IN count is also modified to keep these symmetric for
now.

Change-Id: Ia1915a596424425525b6df67e0ddce47a7f618f3
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00
Johan Hedberg
eaa34b0753 Bluetooth: Fix using correct host ACL buffer count
The BT_BUF_ACL_IN_MAX was a left-over that shouldn't be used anymore.

Change-Id: Ifa15e00e7e72f56670961ca7830595a2b4301093
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:24:40 -05:00