Skip to content

Commit

Permalink
Bluetooth: Fix regression with L2CAP configuration in Basic Mode
Browse files Browse the repository at this point in the history
Basic Mode is the default mode of operation of a L2CAP entity. In
this case the RFC (Retransmission and Flow Control) configuration
option should not be used at all.

Normally remote L2CAP implementation should just ignore this option,
but it can cause various side effects with other Bluetooth stacks
that are not capable of handling unknown options.

Signed-off-by: Gustavo F. Padovan <gustavo@las.ic.unicamp.br>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
  • Loading branch information
Gustavo F. Padovan authored and Marcel Holtmann committed Nov 16, 2009
1 parent a0e55a3 commit 68ae663
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions net/bluetooth/l2cap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2394,13 +2394,21 @@ static int l2cap_parse_conf_req(struct sock *sk, void *data)
rfc.monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;

pi->conf_state |= L2CAP_CONF_MODE_DONE;

l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
sizeof(rfc), (unsigned long) &rfc);

break;

case L2CAP_MODE_STREAMING:
pi->remote_tx_win = rfc.txwin_size;
pi->max_pdu_size = rfc.max_pdu_size;

pi->conf_state |= L2CAP_CONF_MODE_DONE;

l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
sizeof(rfc), (unsigned long) &rfc);

break;

default:
Expand All @@ -2410,9 +2418,6 @@ static int l2cap_parse_conf_req(struct sock *sk, void *data)
rfc.mode = pi->mode;
}

l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
sizeof(rfc), (unsigned long) &rfc);

if (result == L2CAP_CONF_SUCCESS)
pi->conf_state |= L2CAP_CONF_OUTPUT_DONE;
}
Expand Down

0 comments on commit 68ae663

Please sign in to comment.