diff options
| author | Ingo Molnar <mingo@kernel.org> | 2020-02-05 08:44:22 +0100 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2020-02-05 08:44:22 +0100 | 
| commit | fdff7c21ea00787e3f70a1a00b40b88eb998c6ad (patch) | |
| tree | 03016a8375e849e2c39dec8a15d660055bb16a8c /net/bluetooth/l2cap_core.c | |
| parent | f1ec3a517b4352e78dbef6b1e591f43202ecb3fe (diff) | |
| parent | b3a6082223369203d7e7db7e81253ac761377644 (diff) | |
Merge branch 'linus' into perf/urgent, to synchronize with upstream
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'net/bluetooth/l2cap_core.c')
| -rw-r--r-- | net/bluetooth/l2cap_core.c | 55 | 
1 files changed, 52 insertions, 3 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index a845786258a0..195459a1e53e 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -1289,6 +1289,9 @@ static void l2cap_le_connect(struct l2cap_chan *chan)  	if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))  		return; +	if (!chan->imtu) +		chan->imtu = chan->conn->mtu; +  	l2cap_le_flowctl_init(chan, 0);  	req.psm     = chan->psm; @@ -3226,6 +3229,49 @@ static inline void l2cap_txwin_setup(struct l2cap_chan *chan)  	chan->ack_win = chan->tx_win;  } +static void l2cap_mtu_auto(struct l2cap_chan *chan) +{ +	struct hci_conn *conn = chan->conn->hcon; + +	chan->imtu = L2CAP_DEFAULT_MIN_MTU; + +	/* The 2-DH1 packet has between 2 and 56 information bytes +	 * (including the 2-byte payload header) +	 */ +	if (!(conn->pkt_type & HCI_2DH1)) +		chan->imtu = 54; + +	/* The 3-DH1 packet has between 2 and 85 information bytes +	 * (including the 2-byte payload header) +	 */ +	if (!(conn->pkt_type & HCI_3DH1)) +		chan->imtu = 83; + +	/* The 2-DH3 packet has between 2 and 369 information bytes +	 * (including the 2-byte payload header) +	 */ +	if (!(conn->pkt_type & HCI_2DH3)) +		chan->imtu = 367; + +	/* The 3-DH3 packet has between 2 and 554 information bytes +	 * (including the 2-byte payload header) +	 */ +	if (!(conn->pkt_type & HCI_3DH3)) +		chan->imtu = 552; + +	/* The 2-DH5 packet has between 2 and 681 information bytes +	 * (including the 2-byte payload header) +	 */ +	if (!(conn->pkt_type & HCI_2DH5)) +		chan->imtu = 679; + +	/* The 3-DH5 packet has between 2 and 1023 information bytes +	 * (including the 2-byte payload header) +	 */ +	if (!(conn->pkt_type & HCI_3DH5)) +		chan->imtu = 1021; +} +  static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size)  {  	struct l2cap_conf_req *req = data; @@ -3255,8 +3301,12 @@ static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data  	}  done: -	if (chan->imtu != L2CAP_DEFAULT_MTU) -		l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, endptr - ptr); +	if (chan->imtu != L2CAP_DEFAULT_MTU) { +		if (!chan->imtu) +			l2cap_mtu_auto(chan); +		l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, +				   endptr - ptr); +	}  	switch (chan->mode) {  	case L2CAP_MODE_BASIC: @@ -5031,7 +5081,6 @@ static inline int l2cap_move_channel_req(struct l2cap_conn *conn,  	chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;  	l2cap_move_setup(chan);  	chan->move_id = req->dest_amp_id; -	icid = chan->dcid;  	if (req->dest_amp_id == AMP_ID_BREDR) {  		/* Moving to BR/EDR */  | 
