10 May, 2010
40 commits
-
Get the device type from MODULE_BRINGUP_REQ command response.
Signed-off-by: Bing Zhao
Signed-off-by: Marcel Holtmann -
Move btmrvl hdev registration code out of btmrvl_add_card().
New function btmrvl_register_hdev() is added.Signed-off-by: Bing Zhao
Signed-off-by: Marcel Holtmann -
The MODULE_BRINGUP_REQ command response returns success with
either 0x00 or 0x0c.Signed-off-by: Bing Zhao
Signed-off-by: Marcel Holtmann -
This is mostly cleanup. There is only one caller and it just checks for
non-zero return values. Still "ret" should be int because we want to return
-EINVAL on errors.Signed-off-by: Dan Carpenter
Signed-off-by: Marcel Holtmann -
Instead of having a global workqueue for all controllers, it makes
more sense to have a workqueue per controller.Signed-off-by: Marcel Holtmann
-
On the receipt of an RR(P=1) under RemoteBusy set to TRUE(on the RECV
state table) we have to call sendIorRRorRNR(F=1) and just after set
RemoteBusy to False. This leads to a freeze in the sending process since
it's not allowed send data with RemoteBusy set to true and no one
call SendPending-I-Frames after set RemoteBusy to false(The last action
for that event).Actually sendIorRRorRNR() calls SendPending-I-Frames but at that moment
RemoteBusy is still True and we cannot send any frame, after, no one
calls SendPending-I-Frames again and the sending process stops.The solution here is to set RemoteBusy to false inside
SendPending-I-Frames just before call SendPending-I-Frames. That will
make SendPending-I-Frames able to send frames. This solution is similar
to what RR(P=0)(F=0) on the RECV table and RR(P=1) on the SREJ_SENT
table do.Actually doesn't make any sense call SendPending-I-Frames if we can send
any frame, i. e., RemoteBusy is True.Signed-off-by: Gustavo F. Padovan
Signed-off-by: Marcel Holtmann -
The checks should be done before the the memcpy to avoid buffer
overflow.Reported-by: João Paulo Rechi Vita
Signed-off-by: Gustavo F. Padovan
Signed-off-by: Marcel Holtmann -
l2cap_ertm_send() can be called both from user context and bottom half
context. The socket locks for that contexts are different, the user
context uses a mutex(which can sleep) and the second one uses a
spinlock_bh. That creates a race condition when we have interruptions on
both contexts at the same time.The better way to solve this is to add a new spinlock to lock
l2cap_ertm_send() and the vars it access. The other solution was to defer
l2cap_ertm_send() with a workqueue, but we the sending process already
has one defer on the hci layer. It's not a good idea add another one.The patch refactor the code to create l2cap_retransmit_frames(), then we
encapulate the lock of l2cap_ertm_send() for some call. It also changes
l2cap_retransmit_frame() to l2cap_retransmit_one_frame() to avoid
confusionSigned-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
To guarantee that all packets we sent were received we need to wait for
theirs ack before shutdown the socket.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Supports Local Busy condition handling through a waitqueue that wake ups
each 200ms and try to push the packets to the upper layer. If it can
push all the queue then it leaves the Local Busy state.The patch modifies the behaviour of l2cap_ertm_reassembly_sdu() to
support retry of the push operation.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Add checks for invalid tx_seq and fixes the duplicated tx_seq check.
Signed-off-by: João Paulo Rechi Vita
Acked-by: Gustavo F. Padovan
Signed-off-by: Marcel Holtmann -
There is a plenty of situation where ERTM shall close the channel, this
commit treats the cases regarding Invalid Frame Detection.
It create one reassembly SDU function for ERTM and other for Streaming
Mode to make the Invalid Frame Detection handling less complex.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Make the code flow cleaner and changes the function to void.
It also fixes a potential NULL dereference with skb.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
hci_send_acl can't fail, so we can make it void. This patch changes
that and all the funcions that use hci_send_acl().
That change exposed a bug on sending connectionless data. We were not
reporting the lenght send back to the user space.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
A spin_lock_init() call was missing. :)
Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
F-bit set should be processed only if we are in the WAIT_F state.
Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Trivial clean up.
Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
That action is not specified by the ERTM spec, so removing it.
Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
We can set the SAR bits in the control field directly.
Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Signed-off-by: João Paulo Rechi Vita
Acked-by: Gustavo F. Padovan
Signed-off-by: Marcel Holtmann -
The code was reusing the control var without its reinitialization.
Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Add this check to getsockopt makes possible to fail early instead of
waiting until listen / connect.Signed-off-by: João Paulo Rechi Vita
Acked-by: Gustavo F. Padovan
Signed-off-by: Marcel Holtmann -
if enable_ertm is true and we have SOCK_STREAM the default mode will be
ERTM, otherwise Basic Mode.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
The L2CAP Extended Features are still unstable and under development,
so we are adding them under the EXPERIMENTAL flag to get more feedback
on them. L2CAP Extended Features includes the Enhanced Retransmission
and Streaming Modes, Frame Check Sequence (FCS), and Segmentation and
Reassemby (SAR).Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
When the I-frame received is the expected, i.e., its tx_seq is equal to
expected_tx_seq and we are under a SREJ, we can just add it to the tail
of the list. Doing that we change the complexity from O(n) to O(1).Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
l2cap_drop_acked_frames() was droping not sent packets, causing them to
be not transmitted.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
The code was crashing due to a invalid access to hci_conn after the
channel disconnect.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
If there is no frames to retransmit l2cap was crashing the kernel, now
we check if the queue is empty first.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
With the sockopt extension we can set a per-channel MaxTx value.
Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Very useful for testing purposes.
Signed-off-by: Gustavo F. Padovan
[jprvita@profusion.mobi: improved parameter description]
Signed-off-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Now that we can set the txWindow we need to change the acknowledgement
procedure to ack after each (pi->txWindow/6 + 1). The plus 1 is to avoid
the zero value.
It also renames pi->num_to_ack to a better name: pi->num_acked.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Now we can set/get Transmission Window size via sockopt.
Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
As specified by Bluetooth 3.0 spec we shall send an acknowledgment using
the Send-Ack() after clear the SREJ list.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
If the SDU size is greater than the MTU something is wrong, so report
an error.Signed-off-by: Gustavo F. Padovan
[jprvita@profusion.mobi: set err to appropriate errno value]
Signed-off-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Fix a possible problem with Big Endian machines.
Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
We were accepting values bigger than we can accept. This was leading
ERTM to drop packets because of wrong FCS checks.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
On Enhanced Retransmission Mode and Streaming Mode a entity can send, on
a successful Conf RSP, new values for the RFC fields. For example, the
entity can send txWindow and MPS values less than the value received on
a Conf REQ.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
Tx Window value shall not be used with Streaming Mode and the receiver
of the config Request shall ignore its value.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann -
We ack I-frames on each txWindow/5 I-frames received, but if the sender
stop to send I-frames and it's not a txWindow multiple we can leave some
frames unacked.
So I added a timer to ack I-frames on this case. The timer expires in
200ms.Signed-off-by: Gustavo F. Padovan
Reviewed-by: João Paulo Rechi Vita
Signed-off-by: Marcel Holtmann