diff options
-rw-r--r-- | include/net/bluetooth/l2cap.h | 1 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 35 | ||||
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 4 |
3 files changed, 14 insertions, 26 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index abba765c174e..e149e992fdae 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
@@ -873,7 +873,6 @@ int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len, | |||
873 | void l2cap_chan_busy(struct l2cap_chan *chan, int busy); | 873 | void l2cap_chan_busy(struct l2cap_chan *chan, int busy); |
874 | int l2cap_chan_check_security(struct l2cap_chan *chan); | 874 | int l2cap_chan_check_security(struct l2cap_chan *chan); |
875 | void l2cap_chan_set_defaults(struct l2cap_chan *chan); | 875 | void l2cap_chan_set_defaults(struct l2cap_chan *chan); |
876 | void l2cap_le_flowctl_init(struct l2cap_chan *chan); | ||
877 | int l2cap_ertm_init(struct l2cap_chan *chan); | 876 | int l2cap_ertm_init(struct l2cap_chan *chan); |
878 | void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); | 877 | void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); |
879 | void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); | 878 | void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 8e9e883874ce..6e6f308af036 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -498,11 +498,11 @@ void l2cap_chan_set_defaults(struct l2cap_chan *chan) | |||
498 | set_bit(FLAG_FORCE_ACTIVE, &chan->flags); | 498 | set_bit(FLAG_FORCE_ACTIVE, &chan->flags); |
499 | } | 499 | } |
500 | 500 | ||
501 | void l2cap_le_flowctl_init(struct l2cap_chan *chan) | 501 | static void l2cap_le_flowctl_init(struct l2cap_chan *chan) |
502 | { | 502 | { |
503 | chan->imtu = L2CAP_DEFAULT_MTU; | 503 | chan->sdu = NULL; |
504 | chan->omtu = L2CAP_LE_MIN_MTU; | 504 | chan->sdu_last_frag = NULL; |
505 | chan->mode = L2CAP_MODE_LE_FLOWCTL; | 505 | chan->sdu_len = 0; |
506 | chan->tx_credits = 0; | 506 | chan->tx_credits = 0; |
507 | chan->rx_credits = le_max_credits; | 507 | chan->rx_credits = le_max_credits; |
508 | 508 | ||
@@ -510,6 +510,8 @@ void l2cap_le_flowctl_init(struct l2cap_chan *chan) | |||
510 | chan->mps = chan->imtu; | 510 | chan->mps = chan->imtu; |
511 | else | 511 | else |
512 | chan->mps = L2CAP_LE_DEFAULT_MPS; | 512 | chan->mps = L2CAP_LE_DEFAULT_MPS; |
513 | |||
514 | skb_queue_head_init(&chan->tx_q); | ||
513 | } | 515 | } |
514 | 516 | ||
515 | void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) | 517 | void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) |
@@ -1208,31 +1210,14 @@ static void l2cap_move_done(struct l2cap_chan *chan) | |||
1208 | } | 1210 | } |
1209 | } | 1211 | } |
1210 | 1212 | ||
1211 | static void l2cap_le_flowctl_start(struct l2cap_chan *chan) | ||
1212 | { | ||
1213 | chan->sdu = NULL; | ||
1214 | chan->sdu_last_frag = NULL; | ||
1215 | chan->sdu_len = 0; | ||
1216 | |||
1217 | if (chan->imtu < L2CAP_LE_DEFAULT_MPS) | ||
1218 | chan->mps = chan->imtu; | ||
1219 | else | ||
1220 | chan->mps = le_default_mps; | ||
1221 | |||
1222 | skb_queue_head_init(&chan->tx_q); | ||
1223 | |||
1224 | if (!chan->tx_credits) | ||
1225 | chan->ops->suspend(chan); | ||
1226 | } | ||
1227 | |||
1228 | static void l2cap_chan_ready(struct l2cap_chan *chan) | 1213 | static void l2cap_chan_ready(struct l2cap_chan *chan) |
1229 | { | 1214 | { |
1230 | /* This clears all conf flags, including CONF_NOT_COMPLETE */ | 1215 | /* This clears all conf flags, including CONF_NOT_COMPLETE */ |
1231 | chan->conf_state = 0; | 1216 | chan->conf_state = 0; |
1232 | __clear_chan_timer(chan); | 1217 | __clear_chan_timer(chan); |
1233 | 1218 | ||
1234 | if (chan->mode == L2CAP_MODE_LE_FLOWCTL) | 1219 | if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits) |
1235 | l2cap_le_flowctl_start(chan); | 1220 | chan->ops->suspend(chan); |
1236 | 1221 | ||
1237 | chan->state = BT_CONNECTED; | 1222 | chan->state = BT_CONNECTED; |
1238 | 1223 | ||
@@ -1909,7 +1894,9 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, | |||
1909 | 1894 | ||
1910 | switch (chan->mode) { | 1895 | switch (chan->mode) { |
1911 | case L2CAP_MODE_BASIC: | 1896 | case L2CAP_MODE_BASIC: |
1897 | break; | ||
1912 | case L2CAP_MODE_LE_FLOWCTL: | 1898 | case L2CAP_MODE_LE_FLOWCTL: |
1899 | l2cap_le_flowctl_init(chan); | ||
1913 | break; | 1900 | break; |
1914 | case L2CAP_MODE_ERTM: | 1901 | case L2CAP_MODE_ERTM: |
1915 | case L2CAP_MODE_STREAMING: | 1902 | case L2CAP_MODE_STREAMING: |
@@ -5663,6 +5650,8 @@ static int l2cap_le_connect_req(struct l2cap_conn *conn, | |||
5663 | goto response_unlock; | 5650 | goto response_unlock; |
5664 | } | 5651 | } |
5665 | 5652 | ||
5653 | l2cap_le_flowctl_init(chan); | ||
5654 | |||
5666 | bacpy(&chan->src, &conn->hcon->src); | 5655 | bacpy(&chan->src, &conn->hcon->src); |
5667 | bacpy(&chan->dst, &conn->hcon->dst); | 5656 | bacpy(&chan->dst, &conn->hcon->dst); |
5668 | chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type); | 5657 | chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type); |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 88fa9c07c503..e7806e6d282c 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -153,7 +153,7 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) | |||
153 | chan->src_type = la.l2_bdaddr_type; | 153 | chan->src_type = la.l2_bdaddr_type; |
154 | 154 | ||
155 | if (chan->psm && bdaddr_type_is_le(chan->src_type)) | 155 | if (chan->psm && bdaddr_type_is_le(chan->src_type)) |
156 | l2cap_le_flowctl_init(chan); | 156 | chan->mode = L2CAP_MODE_LE_FLOWCTL; |
157 | 157 | ||
158 | chan->state = BT_BOUND; | 158 | chan->state = BT_BOUND; |
159 | sk->sk_state = BT_BOUND; | 159 | sk->sk_state = BT_BOUND; |
@@ -226,7 +226,7 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, | |||
226 | } | 226 | } |
227 | 227 | ||
228 | if (chan->psm && bdaddr_type_is_le(chan->src_type)) | 228 | if (chan->psm && bdaddr_type_is_le(chan->src_type)) |
229 | l2cap_le_flowctl_init(chan); | 229 | chan->mode = L2CAP_MODE_LE_FLOWCTL; |
230 | 230 | ||
231 | err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid), | 231 | err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid), |
232 | &la.l2_bdaddr, la.l2_bdaddr_type); | 232 | &la.l2_bdaddr, la.l2_bdaddr_type); |