diff options
Diffstat (limited to 'net/bluetooth/l2cap.c')
-rw-r--r-- | net/bluetooth/l2cap.c | 210 |
1 files changed, 149 insertions, 61 deletions
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 947f8bbb4bb3..9753b690a8b3 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -40,6 +40,8 @@ | |||
40 | #include <linux/skbuff.h> | 40 | #include <linux/skbuff.h> |
41 | #include <linux/list.h> | 41 | #include <linux/list.h> |
42 | #include <linux/device.h> | 42 | #include <linux/device.h> |
43 | #include <linux/debugfs.h> | ||
44 | #include <linux/seq_file.h> | ||
43 | #include <linux/uaccess.h> | 45 | #include <linux/uaccess.h> |
44 | #include <linux/crc16.h> | 46 | #include <linux/crc16.h> |
45 | #include <net/sock.h> | 47 | #include <net/sock.h> |
@@ -54,6 +56,7 @@ | |||
54 | #define VERSION "2.14" | 56 | #define VERSION "2.14" |
55 | 57 | ||
56 | static int enable_ertm = 0; | 58 | static int enable_ertm = 0; |
59 | static int max_transmit = L2CAP_DEFAULT_MAX_TX; | ||
57 | 60 | ||
58 | static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN; | 61 | static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN; |
59 | static u8 l2cap_fixed_chan[8] = { 0x02, }; | 62 | static u8 l2cap_fixed_chan[8] = { 0x02, }; |
@@ -373,6 +376,8 @@ static inline int l2cap_send_rr_or_rnr(struct l2cap_pinfo *pi, u16 control) | |||
373 | else | 376 | else |
374 | control |= L2CAP_SUPER_RCV_READY; | 377 | control |= L2CAP_SUPER_RCV_READY; |
375 | 378 | ||
379 | control |= pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; | ||
380 | |||
376 | return l2cap_send_sframe(pi, control); | 381 | return l2cap_send_sframe(pi, control); |
377 | } | 382 | } |
378 | 383 | ||
@@ -819,7 +824,8 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int p | |||
819 | return sk; | 824 | return sk; |
820 | } | 825 | } |
821 | 826 | ||
822 | static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol) | 827 | static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol, |
828 | int kern) | ||
823 | { | 829 | { |
824 | struct sock *sk; | 830 | struct sock *sk; |
825 | 831 | ||
@@ -831,7 +837,7 @@ static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol) | |||
831 | sock->type != SOCK_DGRAM && sock->type != SOCK_RAW) | 837 | sock->type != SOCK_DGRAM && sock->type != SOCK_RAW) |
832 | return -ESOCKTNOSUPPORT; | 838 | return -ESOCKTNOSUPPORT; |
833 | 839 | ||
834 | if (sock->type == SOCK_RAW && !capable(CAP_NET_RAW)) | 840 | if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW)) |
835 | return -EPERM; | 841 | return -EPERM; |
836 | 842 | ||
837 | sock->ops = &l2cap_sock_ops; | 843 | sock->ops = &l2cap_sock_ops; |
@@ -996,7 +1002,8 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al | |||
996 | 1002 | ||
997 | BT_DBG("sk %p", sk); | 1003 | BT_DBG("sk %p", sk); |
998 | 1004 | ||
999 | if (!addr || addr->sa_family != AF_BLUETOOTH) | 1005 | if (!addr || alen < sizeof(addr->sa_family) || |
1006 | addr->sa_family != AF_BLUETOOTH) | ||
1000 | return -EINVAL; | 1007 | return -EINVAL; |
1001 | 1008 | ||
1002 | memset(&la, 0, sizeof(la)); | 1009 | memset(&la, 0, sizeof(la)); |
@@ -1208,6 +1215,7 @@ static void l2cap_monitor_timeout(unsigned long arg) | |||
1208 | bh_lock_sock(sk); | 1215 | bh_lock_sock(sk); |
1209 | if (l2cap_pi(sk)->retry_count >= l2cap_pi(sk)->remote_max_tx) { | 1216 | if (l2cap_pi(sk)->retry_count >= l2cap_pi(sk)->remote_max_tx) { |
1210 | l2cap_send_disconn_req(l2cap_pi(sk)->conn, sk); | 1217 | l2cap_send_disconn_req(l2cap_pi(sk)->conn, sk); |
1218 | bh_unlock_sock(sk); | ||
1211 | return; | 1219 | return; |
1212 | } | 1220 | } |
1213 | 1221 | ||
@@ -1332,7 +1340,7 @@ static int l2cap_retransmit_frame(struct sock *sk, u8 tx_seq) | |||
1332 | tx_skb = skb_clone(skb, GFP_ATOMIC); | 1340 | tx_skb = skb_clone(skb, GFP_ATOMIC); |
1333 | bt_cb(skb)->retries++; | 1341 | bt_cb(skb)->retries++; |
1334 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); | 1342 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); |
1335 | control |= (pi->req_seq << L2CAP_CTRL_REQSEQ_SHIFT) | 1343 | control |= (pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT) |
1336 | | (tx_seq << L2CAP_CTRL_TXSEQ_SHIFT); | 1344 | | (tx_seq << L2CAP_CTRL_TXSEQ_SHIFT); |
1337 | put_unaligned_le16(control, tx_skb->data + L2CAP_HDR_SIZE); | 1345 | put_unaligned_le16(control, tx_skb->data + L2CAP_HDR_SIZE); |
1338 | 1346 | ||
@@ -1361,9 +1369,8 @@ static int l2cap_ertm_send(struct sock *sk) | |||
1361 | if (pi->conn_state & L2CAP_CONN_WAIT_F) | 1369 | if (pi->conn_state & L2CAP_CONN_WAIT_F) |
1362 | return 0; | 1370 | return 0; |
1363 | 1371 | ||
1364 | while ((skb = sk->sk_send_head) && (!l2cap_tx_window_full(sk)) | 1372 | while ((skb = sk->sk_send_head) && (!l2cap_tx_window_full(sk)) && |
1365 | && !(pi->conn_state & L2CAP_CONN_REMOTE_BUSY)) { | 1373 | !(pi->conn_state & L2CAP_CONN_REMOTE_BUSY)) { |
1366 | tx_skb = skb_clone(skb, GFP_ATOMIC); | ||
1367 | 1374 | ||
1368 | if (pi->remote_max_tx && | 1375 | if (pi->remote_max_tx && |
1369 | bt_cb(skb)->retries == pi->remote_max_tx) { | 1376 | bt_cb(skb)->retries == pi->remote_max_tx) { |
@@ -1371,10 +1378,12 @@ static int l2cap_ertm_send(struct sock *sk) | |||
1371 | break; | 1378 | break; |
1372 | } | 1379 | } |
1373 | 1380 | ||
1381 | tx_skb = skb_clone(skb, GFP_ATOMIC); | ||
1382 | |||
1374 | bt_cb(skb)->retries++; | 1383 | bt_cb(skb)->retries++; |
1375 | 1384 | ||
1376 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); | 1385 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); |
1377 | control |= (pi->req_seq << L2CAP_CTRL_REQSEQ_SHIFT) | 1386 | control |= (pi->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT) |
1378 | | (pi->next_tx_seq << L2CAP_CTRL_TXSEQ_SHIFT); | 1387 | | (pi->next_tx_seq << L2CAP_CTRL_TXSEQ_SHIFT); |
1379 | put_unaligned_le16(control, tx_skb->data + L2CAP_HDR_SIZE); | 1388 | put_unaligned_le16(control, tx_skb->data + L2CAP_HDR_SIZE); |
1380 | 1389 | ||
@@ -1603,8 +1612,8 @@ static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct ms | |||
1603 | return -EOPNOTSUPP; | 1612 | return -EOPNOTSUPP; |
1604 | 1613 | ||
1605 | /* Check outgoing MTU */ | 1614 | /* Check outgoing MTU */ |
1606 | if (sk->sk_type == SOCK_SEQPACKET && pi->mode == L2CAP_MODE_BASIC | 1615 | if (sk->sk_type == SOCK_SEQPACKET && pi->mode == L2CAP_MODE_BASIC && |
1607 | && len > pi->omtu) | 1616 | len > pi->omtu) |
1608 | return -EINVAL; | 1617 | return -EINVAL; |
1609 | 1618 | ||
1610 | lock_sock(sk); | 1619 | lock_sock(sk); |
@@ -1617,7 +1626,10 @@ static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct ms | |||
1617 | /* Connectionless channel */ | 1626 | /* Connectionless channel */ |
1618 | if (sk->sk_type == SOCK_DGRAM) { | 1627 | if (sk->sk_type == SOCK_DGRAM) { |
1619 | skb = l2cap_create_connless_pdu(sk, msg, len); | 1628 | skb = l2cap_create_connless_pdu(sk, msg, len); |
1620 | err = l2cap_do_send(sk, skb); | 1629 | if (IS_ERR(skb)) |
1630 | err = PTR_ERR(skb); | ||
1631 | else | ||
1632 | err = l2cap_do_send(sk, skb); | ||
1621 | goto done; | 1633 | goto done; |
1622 | } | 1634 | } |
1623 | 1635 | ||
@@ -2172,6 +2184,21 @@ static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val) | |||
2172 | *ptr += L2CAP_CONF_OPT_SIZE + len; | 2184 | *ptr += L2CAP_CONF_OPT_SIZE + len; |
2173 | } | 2185 | } |
2174 | 2186 | ||
2187 | static inline void l2cap_ertm_init(struct sock *sk) | ||
2188 | { | ||
2189 | l2cap_pi(sk)->expected_ack_seq = 0; | ||
2190 | l2cap_pi(sk)->unacked_frames = 0; | ||
2191 | l2cap_pi(sk)->buffer_seq = 0; | ||
2192 | l2cap_pi(sk)->num_to_ack = 0; | ||
2193 | |||
2194 | setup_timer(&l2cap_pi(sk)->retrans_timer, | ||
2195 | l2cap_retrans_timeout, (unsigned long) sk); | ||
2196 | setup_timer(&l2cap_pi(sk)->monitor_timer, | ||
2197 | l2cap_monitor_timeout, (unsigned long) sk); | ||
2198 | |||
2199 | __skb_queue_head_init(SREJ_QUEUE(sk)); | ||
2200 | } | ||
2201 | |||
2175 | static int l2cap_mode_supported(__u8 mode, __u32 feat_mask) | 2202 | static int l2cap_mode_supported(__u8 mode, __u32 feat_mask) |
2176 | { | 2203 | { |
2177 | u32 local_feat_mask = l2cap_feat_mask; | 2204 | u32 local_feat_mask = l2cap_feat_mask; |
@@ -2235,7 +2262,7 @@ done: | |||
2235 | case L2CAP_MODE_ERTM: | 2262 | case L2CAP_MODE_ERTM: |
2236 | rfc.mode = L2CAP_MODE_ERTM; | 2263 | rfc.mode = L2CAP_MODE_ERTM; |
2237 | rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW; | 2264 | rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW; |
2238 | rfc.max_transmit = L2CAP_DEFAULT_MAX_TX; | 2265 | rfc.max_transmit = max_transmit; |
2239 | rfc.retrans_timeout = 0; | 2266 | rfc.retrans_timeout = 0; |
2240 | rfc.monitor_timeout = 0; | 2267 | rfc.monitor_timeout = 0; |
2241 | rfc.max_pdu_size = cpu_to_le16(L2CAP_DEFAULT_MAX_PDU_SIZE); | 2268 | rfc.max_pdu_size = cpu_to_le16(L2CAP_DEFAULT_MAX_PDU_SIZE); |
@@ -2755,22 +2782,18 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2755 | goto unlock; | 2782 | goto unlock; |
2756 | 2783 | ||
2757 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { | 2784 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { |
2758 | if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_NO_FCS_RECV) | 2785 | if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_NO_FCS_RECV) || |
2759 | || l2cap_pi(sk)->fcs != L2CAP_FCS_NONE) | 2786 | l2cap_pi(sk)->fcs != L2CAP_FCS_NONE) |
2760 | l2cap_pi(sk)->fcs = L2CAP_FCS_CRC16; | 2787 | l2cap_pi(sk)->fcs = L2CAP_FCS_CRC16; |
2761 | 2788 | ||
2762 | sk->sk_state = BT_CONNECTED; | 2789 | sk->sk_state = BT_CONNECTED; |
2763 | l2cap_pi(sk)->next_tx_seq = 0; | ||
2764 | l2cap_pi(sk)->expected_ack_seq = 0; | ||
2765 | l2cap_pi(sk)->unacked_frames = 0; | ||
2766 | |||
2767 | setup_timer(&l2cap_pi(sk)->retrans_timer, | ||
2768 | l2cap_retrans_timeout, (unsigned long) sk); | ||
2769 | setup_timer(&l2cap_pi(sk)->monitor_timer, | ||
2770 | l2cap_monitor_timeout, (unsigned long) sk); | ||
2771 | 2790 | ||
2791 | l2cap_pi(sk)->next_tx_seq = 0; | ||
2792 | l2cap_pi(sk)->expected_tx_seq = 0; | ||
2772 | __skb_queue_head_init(TX_QUEUE(sk)); | 2793 | __skb_queue_head_init(TX_QUEUE(sk)); |
2773 | __skb_queue_head_init(SREJ_QUEUE(sk)); | 2794 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) |
2795 | l2cap_ertm_init(sk); | ||
2796 | |||
2774 | l2cap_chan_ready(sk); | 2797 | l2cap_chan_ready(sk); |
2775 | goto unlock; | 2798 | goto unlock; |
2776 | } | 2799 | } |
@@ -2813,6 +2836,11 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2813 | int len = cmd->len - sizeof(*rsp); | 2836 | int len = cmd->len - sizeof(*rsp); |
2814 | char req[64]; | 2837 | char req[64]; |
2815 | 2838 | ||
2839 | if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { | ||
2840 | l2cap_send_disconn_req(conn, sk); | ||
2841 | goto done; | ||
2842 | } | ||
2843 | |||
2816 | /* throw out any old stored conf requests */ | 2844 | /* throw out any old stored conf requests */ |
2817 | result = L2CAP_CONF_SUCCESS; | 2845 | result = L2CAP_CONF_SUCCESS; |
2818 | len = l2cap_parse_conf_rsp(sk, rsp->data, | 2846 | len = l2cap_parse_conf_rsp(sk, rsp->data, |
@@ -2844,16 +2872,17 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2844 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE; | 2872 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE; |
2845 | 2873 | ||
2846 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) { | 2874 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) { |
2847 | if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_NO_FCS_RECV) | 2875 | if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_NO_FCS_RECV) || |
2848 | || l2cap_pi(sk)->fcs != L2CAP_FCS_NONE) | 2876 | l2cap_pi(sk)->fcs != L2CAP_FCS_NONE) |
2849 | l2cap_pi(sk)->fcs = L2CAP_FCS_CRC16; | 2877 | l2cap_pi(sk)->fcs = L2CAP_FCS_CRC16; |
2850 | 2878 | ||
2851 | sk->sk_state = BT_CONNECTED; | 2879 | sk->sk_state = BT_CONNECTED; |
2880 | l2cap_pi(sk)->next_tx_seq = 0; | ||
2852 | l2cap_pi(sk)->expected_tx_seq = 0; | 2881 | l2cap_pi(sk)->expected_tx_seq = 0; |
2853 | l2cap_pi(sk)->buffer_seq = 0; | ||
2854 | l2cap_pi(sk)->num_to_ack = 0; | ||
2855 | __skb_queue_head_init(TX_QUEUE(sk)); | 2882 | __skb_queue_head_init(TX_QUEUE(sk)); |
2856 | __skb_queue_head_init(SREJ_QUEUE(sk)); | 2883 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) |
2884 | l2cap_ertm_init(sk); | ||
2885 | |||
2857 | l2cap_chan_ready(sk); | 2886 | l2cap_chan_ready(sk); |
2858 | } | 2887 | } |
2859 | 2888 | ||
@@ -2885,9 +2914,12 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd | |||
2885 | sk->sk_shutdown = SHUTDOWN_MASK; | 2914 | sk->sk_shutdown = SHUTDOWN_MASK; |
2886 | 2915 | ||
2887 | skb_queue_purge(TX_QUEUE(sk)); | 2916 | skb_queue_purge(TX_QUEUE(sk)); |
2888 | skb_queue_purge(SREJ_QUEUE(sk)); | 2917 | |
2889 | del_timer(&l2cap_pi(sk)->retrans_timer); | 2918 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) { |
2890 | del_timer(&l2cap_pi(sk)->monitor_timer); | 2919 | skb_queue_purge(SREJ_QUEUE(sk)); |
2920 | del_timer(&l2cap_pi(sk)->retrans_timer); | ||
2921 | del_timer(&l2cap_pi(sk)->monitor_timer); | ||
2922 | } | ||
2891 | 2923 | ||
2892 | l2cap_chan_del(sk, ECONNRESET); | 2924 | l2cap_chan_del(sk, ECONNRESET); |
2893 | bh_unlock_sock(sk); | 2925 | bh_unlock_sock(sk); |
@@ -2912,9 +2944,12 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd | |||
2912 | return 0; | 2944 | return 0; |
2913 | 2945 | ||
2914 | skb_queue_purge(TX_QUEUE(sk)); | 2946 | skb_queue_purge(TX_QUEUE(sk)); |
2915 | skb_queue_purge(SREJ_QUEUE(sk)); | 2947 | |
2916 | del_timer(&l2cap_pi(sk)->retrans_timer); | 2948 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) { |
2917 | del_timer(&l2cap_pi(sk)->monitor_timer); | 2949 | skb_queue_purge(SREJ_QUEUE(sk)); |
2950 | del_timer(&l2cap_pi(sk)->retrans_timer); | ||
2951 | del_timer(&l2cap_pi(sk)->monitor_timer); | ||
2952 | } | ||
2918 | 2953 | ||
2919 | l2cap_chan_del(sk, 0); | 2954 | l2cap_chan_del(sk, 0); |
2920 | bh_unlock_sock(sk); | 2955 | bh_unlock_sock(sk); |
@@ -3279,12 +3314,16 @@ static inline int l2cap_data_channel_iframe(struct sock *sk, u16 rx_control, str | |||
3279 | { | 3314 | { |
3280 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 3315 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
3281 | u8 tx_seq = __get_txseq(rx_control); | 3316 | u8 tx_seq = __get_txseq(rx_control); |
3317 | u8 req_seq = __get_reqseq(rx_control); | ||
3282 | u16 tx_control = 0; | 3318 | u16 tx_control = 0; |
3283 | u8 sar = rx_control >> L2CAP_CTRL_SAR_SHIFT; | 3319 | u8 sar = rx_control >> L2CAP_CTRL_SAR_SHIFT; |
3284 | int err = 0; | 3320 | int err = 0; |
3285 | 3321 | ||
3286 | BT_DBG("sk %p rx_control 0x%4.4x len %d", sk, rx_control, skb->len); | 3322 | BT_DBG("sk %p rx_control 0x%4.4x len %d", sk, rx_control, skb->len); |
3287 | 3323 | ||
3324 | pi->expected_ack_seq = req_seq; | ||
3325 | l2cap_drop_acked_frames(sk); | ||
3326 | |||
3288 | if (tx_seq == pi->expected_tx_seq) | 3327 | if (tx_seq == pi->expected_tx_seq) |
3289 | goto expected; | 3328 | goto expected; |
3290 | 3329 | ||
@@ -3339,6 +3378,16 @@ expected: | |||
3339 | return 0; | 3378 | return 0; |
3340 | } | 3379 | } |
3341 | 3380 | ||
3381 | if (rx_control & L2CAP_CTRL_FINAL) { | ||
3382 | if (pi->conn_state & L2CAP_CONN_REJ_ACT) | ||
3383 | pi->conn_state &= ~L2CAP_CONN_REJ_ACT; | ||
3384 | else { | ||
3385 | sk->sk_send_head = TX_QUEUE(sk)->next; | ||
3386 | pi->next_tx_seq = pi->expected_ack_seq; | ||
3387 | l2cap_ertm_send(sk); | ||
3388 | } | ||
3389 | } | ||
3390 | |||
3342 | pi->buffer_seq = (pi->buffer_seq + 1) % 64; | 3391 | pi->buffer_seq = (pi->buffer_seq + 1) % 64; |
3343 | 3392 | ||
3344 | err = l2cap_sar_reassembly_sdu(sk, skb, rx_control); | 3393 | err = l2cap_sar_reassembly_sdu(sk, skb, rx_control); |
@@ -3375,6 +3424,14 @@ static inline int l2cap_data_channel_sframe(struct sock *sk, u16 rx_control, str | |||
3375 | pi->expected_ack_seq = tx_seq; | 3424 | pi->expected_ack_seq = tx_seq; |
3376 | l2cap_drop_acked_frames(sk); | 3425 | l2cap_drop_acked_frames(sk); |
3377 | 3426 | ||
3427 | if (pi->conn_state & L2CAP_CONN_REJ_ACT) | ||
3428 | pi->conn_state &= ~L2CAP_CONN_REJ_ACT; | ||
3429 | else { | ||
3430 | sk->sk_send_head = TX_QUEUE(sk)->next; | ||
3431 | pi->next_tx_seq = pi->expected_ack_seq; | ||
3432 | l2cap_ertm_send(sk); | ||
3433 | } | ||
3434 | |||
3378 | if (!(pi->conn_state & L2CAP_CONN_WAIT_F)) | 3435 | if (!(pi->conn_state & L2CAP_CONN_WAIT_F)) |
3379 | break; | 3436 | break; |
3380 | 3437 | ||
@@ -3387,12 +3444,12 @@ static inline int l2cap_data_channel_sframe(struct sock *sk, u16 rx_control, str | |||
3387 | pi->expected_ack_seq = tx_seq; | 3444 | pi->expected_ack_seq = tx_seq; |
3388 | l2cap_drop_acked_frames(sk); | 3445 | l2cap_drop_acked_frames(sk); |
3389 | 3446 | ||
3390 | if ((pi->conn_state & L2CAP_CONN_REMOTE_BUSY) | 3447 | if ((pi->conn_state & L2CAP_CONN_REMOTE_BUSY) && |
3391 | && (pi->unacked_frames > 0)) | 3448 | (pi->unacked_frames > 0)) |
3392 | __mod_retrans_timer(); | 3449 | __mod_retrans_timer(); |
3393 | 3450 | ||
3394 | l2cap_ertm_send(sk); | ||
3395 | pi->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; | 3451 | pi->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; |
3452 | l2cap_ertm_send(sk); | ||
3396 | } | 3453 | } |
3397 | break; | 3454 | break; |
3398 | 3455 | ||
@@ -3402,10 +3459,24 @@ static inline int l2cap_data_channel_sframe(struct sock *sk, u16 rx_control, str | |||
3402 | pi->expected_ack_seq = __get_reqseq(rx_control); | 3459 | pi->expected_ack_seq = __get_reqseq(rx_control); |
3403 | l2cap_drop_acked_frames(sk); | 3460 | l2cap_drop_acked_frames(sk); |
3404 | 3461 | ||
3405 | sk->sk_send_head = TX_QUEUE(sk)->next; | 3462 | if (rx_control & L2CAP_CTRL_FINAL) { |
3406 | pi->next_tx_seq = pi->expected_ack_seq; | 3463 | if (pi->conn_state & L2CAP_CONN_REJ_ACT) |
3464 | pi->conn_state &= ~L2CAP_CONN_REJ_ACT; | ||
3465 | else { | ||
3466 | sk->sk_send_head = TX_QUEUE(sk)->next; | ||
3467 | pi->next_tx_seq = pi->expected_ack_seq; | ||
3468 | l2cap_ertm_send(sk); | ||
3469 | } | ||
3470 | } else { | ||
3471 | sk->sk_send_head = TX_QUEUE(sk)->next; | ||
3472 | pi->next_tx_seq = pi->expected_ack_seq; | ||
3473 | l2cap_ertm_send(sk); | ||
3407 | 3474 | ||
3408 | l2cap_ertm_send(sk); | 3475 | if (pi->conn_state & L2CAP_CONN_WAIT_F) { |
3476 | pi->srej_save_reqseq = tx_seq; | ||
3477 | pi->conn_state |= L2CAP_CONN_REJ_ACT; | ||
3478 | } | ||
3479 | } | ||
3409 | 3480 | ||
3410 | break; | 3481 | break; |
3411 | 3482 | ||
@@ -3413,9 +3484,9 @@ static inline int l2cap_data_channel_sframe(struct sock *sk, u16 rx_control, str | |||
3413 | pi->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; | 3484 | pi->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; |
3414 | 3485 | ||
3415 | if (rx_control & L2CAP_CTRL_POLL) { | 3486 | if (rx_control & L2CAP_CTRL_POLL) { |
3416 | l2cap_retransmit_frame(sk, tx_seq); | ||
3417 | pi->expected_ack_seq = tx_seq; | 3487 | pi->expected_ack_seq = tx_seq; |
3418 | l2cap_drop_acked_frames(sk); | 3488 | l2cap_drop_acked_frames(sk); |
3489 | l2cap_retransmit_frame(sk, tx_seq); | ||
3419 | l2cap_ertm_send(sk); | 3490 | l2cap_ertm_send(sk); |
3420 | if (pi->conn_state & L2CAP_CONN_WAIT_F) { | 3491 | if (pi->conn_state & L2CAP_CONN_WAIT_F) { |
3421 | pi->srej_save_reqseq = tx_seq; | 3492 | pi->srej_save_reqseq = tx_seq; |
@@ -3424,7 +3495,7 @@ static inline int l2cap_data_channel_sframe(struct sock *sk, u16 rx_control, str | |||
3424 | } else if (rx_control & L2CAP_CTRL_FINAL) { | 3495 | } else if (rx_control & L2CAP_CTRL_FINAL) { |
3425 | if ((pi->conn_state & L2CAP_CONN_SREJ_ACT) && | 3496 | if ((pi->conn_state & L2CAP_CONN_SREJ_ACT) && |
3426 | pi->srej_save_reqseq == tx_seq) | 3497 | pi->srej_save_reqseq == tx_seq) |
3427 | pi->srej_save_reqseq &= ~L2CAP_CONN_SREJ_ACT; | 3498 | pi->conn_state &= ~L2CAP_CONN_SREJ_ACT; |
3428 | else | 3499 | else |
3429 | l2cap_retransmit_frame(sk, tx_seq); | 3500 | l2cap_retransmit_frame(sk, tx_seq); |
3430 | } | 3501 | } |
@@ -3459,7 +3530,6 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
3459 | struct l2cap_pinfo *pi; | 3530 | struct l2cap_pinfo *pi; |
3460 | u16 control, len; | 3531 | u16 control, len; |
3461 | u8 tx_seq; | 3532 | u8 tx_seq; |
3462 | int err; | ||
3463 | 3533 | ||
3464 | sk = l2cap_get_chan_by_scid(&conn->chan_list, cid); | 3534 | sk = l2cap_get_chan_by_scid(&conn->chan_list, cid); |
3465 | if (!sk) { | 3535 | if (!sk) { |
@@ -3511,13 +3581,11 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
3511 | goto drop; | 3581 | goto drop; |
3512 | 3582 | ||
3513 | if (__is_iframe(control)) | 3583 | if (__is_iframe(control)) |
3514 | err = l2cap_data_channel_iframe(sk, control, skb); | 3584 | l2cap_data_channel_iframe(sk, control, skb); |
3515 | else | 3585 | else |
3516 | err = l2cap_data_channel_sframe(sk, control, skb); | 3586 | l2cap_data_channel_sframe(sk, control, skb); |
3517 | 3587 | ||
3518 | if (!err) | 3588 | goto done; |
3519 | goto done; | ||
3520 | break; | ||
3521 | 3589 | ||
3522 | case L2CAP_MODE_STREAMING: | 3590 | case L2CAP_MODE_STREAMING: |
3523 | control = get_unaligned_le16(skb->data); | 3591 | control = get_unaligned_le16(skb->data); |
@@ -3543,7 +3611,7 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
3543 | else | 3611 | else |
3544 | pi->expected_tx_seq = tx_seq + 1; | 3612 | pi->expected_tx_seq = tx_seq + 1; |
3545 | 3613 | ||
3546 | err = l2cap_sar_reassembly_sdu(sk, skb, control); | 3614 | l2cap_sar_reassembly_sdu(sk, skb, control); |
3547 | 3615 | ||
3548 | goto done; | 3616 | goto done; |
3549 | 3617 | ||
@@ -3880,29 +3948,42 @@ drop: | |||
3880 | return 0; | 3948 | return 0; |
3881 | } | 3949 | } |
3882 | 3950 | ||
3883 | static ssize_t l2cap_sysfs_show(struct class *dev, char *buf) | 3951 | static int l2cap_debugfs_show(struct seq_file *f, void *p) |
3884 | { | 3952 | { |
3885 | struct sock *sk; | 3953 | struct sock *sk; |
3886 | struct hlist_node *node; | 3954 | struct hlist_node *node; |
3887 | char *str = buf; | ||
3888 | 3955 | ||
3889 | read_lock_bh(&l2cap_sk_list.lock); | 3956 | read_lock_bh(&l2cap_sk_list.lock); |
3890 | 3957 | ||
3891 | sk_for_each(sk, node, &l2cap_sk_list.head) { | 3958 | sk_for_each(sk, node, &l2cap_sk_list.head) { |
3892 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 3959 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
3893 | 3960 | ||
3894 | str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n", | 3961 | seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n", |
3895 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), | 3962 | batostr(&bt_sk(sk)->src), |
3896 | sk->sk_state, __le16_to_cpu(pi->psm), pi->scid, | 3963 | batostr(&bt_sk(sk)->dst), |
3897 | pi->dcid, pi->imtu, pi->omtu, pi->sec_level); | 3964 | sk->sk_state, __le16_to_cpu(pi->psm), |
3965 | pi->scid, pi->dcid, | ||
3966 | pi->imtu, pi->omtu, pi->sec_level); | ||
3898 | } | 3967 | } |
3899 | 3968 | ||
3900 | read_unlock_bh(&l2cap_sk_list.lock); | 3969 | read_unlock_bh(&l2cap_sk_list.lock); |
3901 | 3970 | ||
3902 | return str - buf; | 3971 | return 0; |
3972 | } | ||
3973 | |||
3974 | static int l2cap_debugfs_open(struct inode *inode, struct file *file) | ||
3975 | { | ||
3976 | return single_open(file, l2cap_debugfs_show, inode->i_private); | ||
3903 | } | 3977 | } |
3904 | 3978 | ||
3905 | static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL); | 3979 | static const struct file_operations l2cap_debugfs_fops = { |
3980 | .open = l2cap_debugfs_open, | ||
3981 | .read = seq_read, | ||
3982 | .llseek = seq_lseek, | ||
3983 | .release = single_release, | ||
3984 | }; | ||
3985 | |||
3986 | static struct dentry *l2cap_debugfs; | ||
3906 | 3987 | ||
3907 | static const struct proto_ops l2cap_sock_ops = { | 3988 | static const struct proto_ops l2cap_sock_ops = { |
3908 | .family = PF_BLUETOOTH, | 3989 | .family = PF_BLUETOOTH, |
@@ -3924,7 +4005,7 @@ static const struct proto_ops l2cap_sock_ops = { | |||
3924 | .getsockopt = l2cap_sock_getsockopt | 4005 | .getsockopt = l2cap_sock_getsockopt |
3925 | }; | 4006 | }; |
3926 | 4007 | ||
3927 | static struct net_proto_family l2cap_sock_family_ops = { | 4008 | static const struct net_proto_family l2cap_sock_family_ops = { |
3928 | .family = PF_BLUETOOTH, | 4009 | .family = PF_BLUETOOTH, |
3929 | .owner = THIS_MODULE, | 4010 | .owner = THIS_MODULE, |
3930 | .create = l2cap_sock_create, | 4011 | .create = l2cap_sock_create, |
@@ -3962,8 +4043,12 @@ static int __init l2cap_init(void) | |||
3962 | goto error; | 4043 | goto error; |
3963 | } | 4044 | } |
3964 | 4045 | ||
3965 | if (class_create_file(bt_class, &class_attr_l2cap) < 0) | 4046 | if (bt_debugfs) { |
3966 | BT_ERR("Failed to create L2CAP info file"); | 4047 | l2cap_debugfs = debugfs_create_file("l2cap", 0444, |
4048 | bt_debugfs, NULL, &l2cap_debugfs_fops); | ||
4049 | if (!l2cap_debugfs) | ||
4050 | BT_ERR("Failed to create L2CAP debug file"); | ||
4051 | } | ||
3967 | 4052 | ||
3968 | BT_INFO("L2CAP ver %s", VERSION); | 4053 | BT_INFO("L2CAP ver %s", VERSION); |
3969 | BT_INFO("L2CAP socket layer initialized"); | 4054 | BT_INFO("L2CAP socket layer initialized"); |
@@ -3977,7 +4062,7 @@ error: | |||
3977 | 4062 | ||
3978 | static void __exit l2cap_exit(void) | 4063 | static void __exit l2cap_exit(void) |
3979 | { | 4064 | { |
3980 | class_remove_file(bt_class, &class_attr_l2cap); | 4065 | debugfs_remove(l2cap_debugfs); |
3981 | 4066 | ||
3982 | if (bt_sock_unregister(BTPROTO_L2CAP) < 0) | 4067 | if (bt_sock_unregister(BTPROTO_L2CAP) < 0) |
3983 | BT_ERR("L2CAP socket unregistration failed"); | 4068 | BT_ERR("L2CAP socket unregistration failed"); |
@@ -4003,6 +4088,9 @@ module_exit(l2cap_exit); | |||
4003 | module_param(enable_ertm, bool, 0644); | 4088 | module_param(enable_ertm, bool, 0644); |
4004 | MODULE_PARM_DESC(enable_ertm, "Enable enhanced retransmission mode"); | 4089 | MODULE_PARM_DESC(enable_ertm, "Enable enhanced retransmission mode"); |
4005 | 4090 | ||
4091 | module_param(max_transmit, uint, 0644); | ||
4092 | MODULE_PARM_DESC(max_transmit, "Max transmit value (default = 3)"); | ||
4093 | |||
4006 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); | 4094 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
4007 | MODULE_DESCRIPTION("Bluetooth L2CAP ver " VERSION); | 4095 | MODULE_DESCRIPTION("Bluetooth L2CAP ver " VERSION); |
4008 | MODULE_VERSION(VERSION); | 4096 | MODULE_VERSION(VERSION); |