diff options
Diffstat (limited to 'net/bluetooth/l2cap.c')
-rw-r--r-- | net/bluetooth/l2cap.c | 233 |
1 files changed, 151 insertions, 82 deletions
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index fde1606a4f31..896ae5a9c07a 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -258,7 +258,119 @@ static void l2cap_chan_del(struct sock *sk, int err) | |||
258 | sk->sk_state_change(sk); | 258 | sk->sk_state_change(sk); |
259 | } | 259 | } |
260 | 260 | ||
261 | static inline u8 l2cap_get_ident(struct l2cap_conn *conn) | ||
262 | { | ||
263 | u8 id; | ||
264 | |||
265 | /* Get next available identificator. | ||
266 | * 1 - 128 are used by kernel. | ||
267 | * 129 - 199 are reserved. | ||
268 | * 200 - 254 are used by utilities like l2ping, etc. | ||
269 | */ | ||
270 | |||
271 | spin_lock_bh(&conn->lock); | ||
272 | |||
273 | if (++conn->tx_ident > 128) | ||
274 | conn->tx_ident = 1; | ||
275 | |||
276 | id = conn->tx_ident; | ||
277 | |||
278 | spin_unlock_bh(&conn->lock); | ||
279 | |||
280 | return id; | ||
281 | } | ||
282 | |||
283 | static inline int l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data) | ||
284 | { | ||
285 | struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data); | ||
286 | |||
287 | BT_DBG("code 0x%2.2x", code); | ||
288 | |||
289 | if (!skb) | ||
290 | return -ENOMEM; | ||
291 | |||
292 | return hci_send_acl(conn->hcon, skb, 0); | ||
293 | } | ||
294 | |||
261 | /* ---- L2CAP connections ---- */ | 295 | /* ---- L2CAP connections ---- */ |
296 | static void l2cap_conn_start(struct l2cap_conn *conn) | ||
297 | { | ||
298 | struct l2cap_chan_list *l = &conn->chan_list; | ||
299 | struct sock *sk; | ||
300 | |||
301 | BT_DBG("conn %p", conn); | ||
302 | |||
303 | read_lock(&l->lock); | ||
304 | |||
305 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
306 | bh_lock_sock(sk); | ||
307 | |||
308 | if (sk->sk_type != SOCK_SEQPACKET) { | ||
309 | l2cap_sock_clear_timer(sk); | ||
310 | sk->sk_state = BT_CONNECTED; | ||
311 | sk->sk_state_change(sk); | ||
312 | } else if (sk->sk_state == BT_CONNECT) { | ||
313 | struct l2cap_conn_req req; | ||
314 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | ||
315 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | ||
316 | req.psm = l2cap_pi(sk)->psm; | ||
317 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | ||
318 | L2CAP_CONN_REQ, sizeof(req), &req); | ||
319 | } | ||
320 | |||
321 | bh_unlock_sock(sk); | ||
322 | } | ||
323 | |||
324 | read_unlock(&l->lock); | ||
325 | } | ||
326 | |||
327 | static void l2cap_conn_ready(struct l2cap_conn *conn) | ||
328 | { | ||
329 | BT_DBG("conn %p", conn); | ||
330 | |||
331 | if (conn->chan_list.head || !hlist_empty(&l2cap_sk_list.head)) { | ||
332 | struct l2cap_info_req req; | ||
333 | |||
334 | req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK); | ||
335 | |||
336 | conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT; | ||
337 | conn->info_ident = l2cap_get_ident(conn); | ||
338 | |||
339 | mod_timer(&conn->info_timer, | ||
340 | jiffies + msecs_to_jiffies(L2CAP_INFO_TIMEOUT)); | ||
341 | |||
342 | l2cap_send_cmd(conn, conn->info_ident, | ||
343 | L2CAP_INFO_REQ, sizeof(req), &req); | ||
344 | } | ||
345 | } | ||
346 | |||
347 | /* Notify sockets that we cannot guaranty reliability anymore */ | ||
348 | static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err) | ||
349 | { | ||
350 | struct l2cap_chan_list *l = &conn->chan_list; | ||
351 | struct sock *sk; | ||
352 | |||
353 | BT_DBG("conn %p", conn); | ||
354 | |||
355 | read_lock(&l->lock); | ||
356 | |||
357 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
358 | if (l2cap_pi(sk)->link_mode & L2CAP_LM_RELIABLE) | ||
359 | sk->sk_err = err; | ||
360 | } | ||
361 | |||
362 | read_unlock(&l->lock); | ||
363 | } | ||
364 | |||
365 | static void l2cap_info_timeout(unsigned long arg) | ||
366 | { | ||
367 | struct l2cap_conn *conn = (void *) arg; | ||
368 | |||
369 | conn->info_ident = 0; | ||
370 | |||
371 | l2cap_conn_start(conn); | ||
372 | } | ||
373 | |||
262 | static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) | 374 | static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) |
263 | { | 375 | { |
264 | struct l2cap_conn *conn = hcon->l2cap_data; | 376 | struct l2cap_conn *conn = hcon->l2cap_data; |
@@ -279,6 +391,12 @@ static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) | |||
279 | conn->src = &hcon->hdev->bdaddr; | 391 | conn->src = &hcon->hdev->bdaddr; |
280 | conn->dst = &hcon->dst; | 392 | conn->dst = &hcon->dst; |
281 | 393 | ||
394 | conn->feat_mask = 0; | ||
395 | |||
396 | init_timer(&conn->info_timer); | ||
397 | conn->info_timer.function = l2cap_info_timeout; | ||
398 | conn->info_timer.data = (unsigned long) conn; | ||
399 | |||
282 | spin_lock_init(&conn->lock); | 400 | spin_lock_init(&conn->lock); |
283 | rwlock_init(&conn->chan_list.lock); | 401 | rwlock_init(&conn->chan_list.lock); |
284 | 402 | ||
@@ -318,40 +436,6 @@ static inline void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, stru | |||
318 | write_unlock_bh(&l->lock); | 436 | write_unlock_bh(&l->lock); |
319 | } | 437 | } |
320 | 438 | ||
321 | static inline u8 l2cap_get_ident(struct l2cap_conn *conn) | ||
322 | { | ||
323 | u8 id; | ||
324 | |||
325 | /* Get next available identificator. | ||
326 | * 1 - 128 are used by kernel. | ||
327 | * 129 - 199 are reserved. | ||
328 | * 200 - 254 are used by utilities like l2ping, etc. | ||
329 | */ | ||
330 | |||
331 | spin_lock_bh(&conn->lock); | ||
332 | |||
333 | if (++conn->tx_ident > 128) | ||
334 | conn->tx_ident = 1; | ||
335 | |||
336 | id = conn->tx_ident; | ||
337 | |||
338 | spin_unlock_bh(&conn->lock); | ||
339 | |||
340 | return id; | ||
341 | } | ||
342 | |||
343 | static inline int l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data) | ||
344 | { | ||
345 | struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data); | ||
346 | |||
347 | BT_DBG("code 0x%2.2x", code); | ||
348 | |||
349 | if (!skb) | ||
350 | return -ENOMEM; | ||
351 | |||
352 | return hci_send_acl(conn->hcon, skb, 0); | ||
353 | } | ||
354 | |||
355 | /* ---- Socket interface ---- */ | 439 | /* ---- Socket interface ---- */ |
356 | static struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src) | 440 | static struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src) |
357 | { | 441 | { |
@@ -529,7 +613,7 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int p | |||
529 | INIT_LIST_HEAD(&bt_sk(sk)->accept_q); | 613 | INIT_LIST_HEAD(&bt_sk(sk)->accept_q); |
530 | 614 | ||
531 | sk->sk_destruct = l2cap_sock_destruct; | 615 | sk->sk_destruct = l2cap_sock_destruct; |
532 | sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT; | 616 | sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT); |
533 | 617 | ||
534 | sock_reset_flag(sk, SOCK_ZAPPED); | 618 | sock_reset_flag(sk, SOCK_ZAPPED); |
535 | 619 | ||
@@ -649,6 +733,11 @@ static int l2cap_do_connect(struct sock *sk) | |||
649 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); | 733 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); |
650 | 734 | ||
651 | if (hcon->state == BT_CONNECTED) { | 735 | if (hcon->state == BT_CONNECTED) { |
736 | if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)) { | ||
737 | l2cap_conn_ready(conn); | ||
738 | goto done; | ||
739 | } | ||
740 | |||
652 | if (sk->sk_type == SOCK_SEQPACKET) { | 741 | if (sk->sk_type == SOCK_SEQPACKET) { |
653 | struct l2cap_conn_req req; | 742 | struct l2cap_conn_req req; |
654 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 743 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); |
@@ -1083,52 +1172,6 @@ static int l2cap_sock_release(struct socket *sock) | |||
1083 | return err; | 1172 | return err; |
1084 | } | 1173 | } |
1085 | 1174 | ||
1086 | static void l2cap_conn_ready(struct l2cap_conn *conn) | ||
1087 | { | ||
1088 | struct l2cap_chan_list *l = &conn->chan_list; | ||
1089 | struct sock *sk; | ||
1090 | |||
1091 | BT_DBG("conn %p", conn); | ||
1092 | |||
1093 | read_lock(&l->lock); | ||
1094 | |||
1095 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
1096 | bh_lock_sock(sk); | ||
1097 | |||
1098 | if (sk->sk_type != SOCK_SEQPACKET) { | ||
1099 | l2cap_sock_clear_timer(sk); | ||
1100 | sk->sk_state = BT_CONNECTED; | ||
1101 | sk->sk_state_change(sk); | ||
1102 | } else if (sk->sk_state == BT_CONNECT) { | ||
1103 | struct l2cap_conn_req req; | ||
1104 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | ||
1105 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | ||
1106 | req.psm = l2cap_pi(sk)->psm; | ||
1107 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, L2CAP_CONN_REQ, sizeof(req), &req); | ||
1108 | } | ||
1109 | |||
1110 | bh_unlock_sock(sk); | ||
1111 | } | ||
1112 | |||
1113 | read_unlock(&l->lock); | ||
1114 | } | ||
1115 | |||
1116 | /* Notify sockets that we cannot guaranty reliability anymore */ | ||
1117 | static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err) | ||
1118 | { | ||
1119 | struct l2cap_chan_list *l = &conn->chan_list; | ||
1120 | struct sock *sk; | ||
1121 | |||
1122 | BT_DBG("conn %p", conn); | ||
1123 | |||
1124 | read_lock(&l->lock); | ||
1125 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
1126 | if (l2cap_pi(sk)->link_mode & L2CAP_LM_RELIABLE) | ||
1127 | sk->sk_err = err; | ||
1128 | } | ||
1129 | read_unlock(&l->lock); | ||
1130 | } | ||
1131 | |||
1132 | static void l2cap_chan_ready(struct sock *sk) | 1175 | static void l2cap_chan_ready(struct sock *sk) |
1133 | { | 1176 | { |
1134 | struct sock *parent = bt_sk(sk)->parent; | 1177 | struct sock *parent = bt_sk(sk)->parent; |
@@ -1399,6 +1442,23 @@ static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 fla | |||
1399 | return ptr - data; | 1442 | return ptr - data; |
1400 | } | 1443 | } |
1401 | 1444 | ||
1445 | static inline int l2cap_command_rej(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data) | ||
1446 | { | ||
1447 | struct l2cap_cmd_rej *rej = (struct l2cap_cmd_rej *) data; | ||
1448 | |||
1449 | if (rej->reason != 0x0000) | ||
1450 | return 0; | ||
1451 | |||
1452 | if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) && | ||
1453 | cmd->ident == conn->info_ident) { | ||
1454 | conn->info_ident = 0; | ||
1455 | del_timer(&conn->info_timer); | ||
1456 | l2cap_conn_start(conn); | ||
1457 | } | ||
1458 | |||
1459 | return 0; | ||
1460 | } | ||
1461 | |||
1402 | static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data) | 1462 | static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data) |
1403 | { | 1463 | { |
1404 | struct l2cap_chan_list *list = &conn->chan_list; | 1464 | struct l2cap_chan_list *list = &conn->chan_list; |
@@ -1739,6 +1799,15 @@ static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cm | |||
1739 | 1799 | ||
1740 | BT_DBG("type 0x%4.4x result 0x%2.2x", type, result); | 1800 | BT_DBG("type 0x%4.4x result 0x%2.2x", type, result); |
1741 | 1801 | ||
1802 | conn->info_ident = 0; | ||
1803 | |||
1804 | del_timer(&conn->info_timer); | ||
1805 | |||
1806 | if (type == L2CAP_IT_FEAT_MASK) | ||
1807 | conn->feat_mask = __le32_to_cpu(get_unaligned((__le32 *) rsp->data)); | ||
1808 | |||
1809 | l2cap_conn_start(conn); | ||
1810 | |||
1742 | return 0; | 1811 | return 0; |
1743 | } | 1812 | } |
1744 | 1813 | ||
@@ -1768,7 +1837,7 @@ static inline void l2cap_sig_channel(struct l2cap_conn *conn, struct sk_buff *sk | |||
1768 | 1837 | ||
1769 | switch (cmd.code) { | 1838 | switch (cmd.code) { |
1770 | case L2CAP_COMMAND_REJ: | 1839 | case L2CAP_COMMAND_REJ: |
1771 | /* FIXME: We should process this */ | 1840 | l2cap_command_rej(conn, &cmd, data); |
1772 | break; | 1841 | break; |
1773 | 1842 | ||
1774 | case L2CAP_CONN_REQ: | 1843 | case L2CAP_CONN_REQ: |