diff options
Diffstat (limited to 'net/bluetooth/l2cap_core.c')
-rw-r--r-- | net/bluetooth/l2cap_core.c | 100 |
1 files changed, 51 insertions, 49 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index b52f66d22437..2c78208d793e 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -53,8 +53,7 @@ static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, | |||
53 | static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, | 53 | static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, |
54 | void *data); | 54 | void *data); |
55 | static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data); | 55 | static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data); |
56 | static void l2cap_send_disconn_req(struct l2cap_conn *conn, | 56 | static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err); |
57 | struct l2cap_chan *chan, int err); | ||
58 | 57 | ||
59 | static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, | 58 | static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, |
60 | struct sk_buff_head *skbs, u8 event); | 59 | struct sk_buff_head *skbs, u8 event); |
@@ -632,7 +631,7 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason) | |||
632 | if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && | 631 | if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && |
633 | conn->hcon->type == ACL_LINK) { | 632 | conn->hcon->type == ACL_LINK) { |
634 | __set_chan_timer(chan, sk->sk_sndtimeo); | 633 | __set_chan_timer(chan, sk->sk_sndtimeo); |
635 | l2cap_send_disconn_req(conn, chan, reason); | 634 | l2cap_send_disconn_req(chan, reason); |
636 | } else | 635 | } else |
637 | l2cap_chan_del(chan, reason); | 636 | l2cap_chan_del(chan, reason); |
638 | break; | 637 | break; |
@@ -1014,6 +1013,7 @@ static bool __amp_capable(struct l2cap_chan *chan) | |||
1014 | struct l2cap_conn *conn = chan->conn; | 1013 | struct l2cap_conn *conn = chan->conn; |
1015 | 1014 | ||
1016 | if (enable_hs && | 1015 | if (enable_hs && |
1016 | hci_amp_capable() && | ||
1017 | chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED && | 1017 | chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED && |
1018 | conn->fixed_chan_mask & L2CAP_FC_A2MP) | 1018 | conn->fixed_chan_mask & L2CAP_FC_A2MP) |
1019 | return true; | 1019 | return true; |
@@ -1180,10 +1180,10 @@ static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask) | |||
1180 | } | 1180 | } |
1181 | } | 1181 | } |
1182 | 1182 | ||
1183 | static void l2cap_send_disconn_req(struct l2cap_conn *conn, | 1183 | static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err) |
1184 | struct l2cap_chan *chan, int err) | ||
1185 | { | 1184 | { |
1186 | struct sock *sk = chan->sk; | 1185 | struct sock *sk = chan->sk; |
1186 | struct l2cap_conn *conn = chan->conn; | ||
1187 | struct l2cap_disconn_req req; | 1187 | struct l2cap_disconn_req req; |
1188 | 1188 | ||
1189 | if (!conn) | 1189 | if (!conn) |
@@ -1960,7 +1960,7 @@ static void l2cap_ertm_resend(struct l2cap_chan *chan) | |||
1960 | if (chan->max_tx != 0 && | 1960 | if (chan->max_tx != 0 && |
1961 | bt_cb(skb)->control.retries > chan->max_tx) { | 1961 | bt_cb(skb)->control.retries > chan->max_tx) { |
1962 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); | 1962 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); |
1963 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 1963 | l2cap_send_disconn_req(chan, ECONNRESET); |
1964 | l2cap_seq_list_clear(&chan->retrans_list); | 1964 | l2cap_seq_list_clear(&chan->retrans_list); |
1965 | break; | 1965 | break; |
1966 | } | 1966 | } |
@@ -2666,7 +2666,7 @@ static void l2cap_tx_state_wait_f(struct l2cap_chan *chan, | |||
2666 | __set_monitor_timer(chan); | 2666 | __set_monitor_timer(chan); |
2667 | chan->retry_count++; | 2667 | chan->retry_count++; |
2668 | } else { | 2668 | } else { |
2669 | l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED); | 2669 | l2cap_send_disconn_req(chan, ECONNABORTED); |
2670 | } | 2670 | } |
2671 | break; | 2671 | break; |
2672 | default: | 2672 | default: |
@@ -3106,18 +3106,17 @@ done: | |||
3106 | if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) | 3106 | if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) |
3107 | l2cap_add_opt_efs(&ptr, chan); | 3107 | l2cap_add_opt_efs(&ptr, chan); |
3108 | 3108 | ||
3109 | if (!(chan->conn->feat_mask & L2CAP_FEAT_FCS)) | ||
3110 | break; | ||
3111 | |||
3112 | if (chan->fcs == L2CAP_FCS_NONE || | ||
3113 | test_bit(CONF_NO_FCS_RECV, &chan->conf_state)) { | ||
3114 | chan->fcs = L2CAP_FCS_NONE; | ||
3115 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, chan->fcs); | ||
3116 | } | ||
3117 | |||
3118 | if (test_bit(FLAG_EXT_CTRL, &chan->flags)) | 3109 | if (test_bit(FLAG_EXT_CTRL, &chan->flags)) |
3119 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2, | 3110 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2, |
3120 | chan->tx_win); | 3111 | chan->tx_win); |
3112 | |||
3113 | if (chan->conn->feat_mask & L2CAP_FEAT_FCS) | ||
3114 | if (chan->fcs == L2CAP_FCS_NONE || | ||
3115 | test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { | ||
3116 | chan->fcs = L2CAP_FCS_NONE; | ||
3117 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, | ||
3118 | chan->fcs); | ||
3119 | } | ||
3121 | break; | 3120 | break; |
3122 | 3121 | ||
3123 | case L2CAP_MODE_STREAMING: | 3122 | case L2CAP_MODE_STREAMING: |
@@ -3139,14 +3138,13 @@ done: | |||
3139 | if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) | 3138 | if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) |
3140 | l2cap_add_opt_efs(&ptr, chan); | 3139 | l2cap_add_opt_efs(&ptr, chan); |
3141 | 3140 | ||
3142 | if (!(chan->conn->feat_mask & L2CAP_FEAT_FCS)) | 3141 | if (chan->conn->feat_mask & L2CAP_FEAT_FCS) |
3143 | break; | 3142 | if (chan->fcs == L2CAP_FCS_NONE || |
3144 | 3143 | test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { | |
3145 | if (chan->fcs == L2CAP_FCS_NONE || | 3144 | chan->fcs = L2CAP_FCS_NONE; |
3146 | test_bit(CONF_NO_FCS_RECV, &chan->conf_state)) { | 3145 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, |
3147 | chan->fcs = L2CAP_FCS_NONE; | 3146 | chan->fcs); |
3148 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, chan->fcs); | 3147 | } |
3149 | } | ||
3150 | break; | 3148 | break; |
3151 | } | 3149 | } |
3152 | 3150 | ||
@@ -3198,7 +3196,7 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data) | |||
3198 | 3196 | ||
3199 | case L2CAP_CONF_FCS: | 3197 | case L2CAP_CONF_FCS: |
3200 | if (val == L2CAP_FCS_NONE) | 3198 | if (val == L2CAP_FCS_NONE) |
3201 | set_bit(CONF_NO_FCS_RECV, &chan->conf_state); | 3199 | set_bit(CONF_RECV_NO_FCS, &chan->conf_state); |
3202 | break; | 3200 | break; |
3203 | 3201 | ||
3204 | case L2CAP_CONF_EFS: | 3202 | case L2CAP_CONF_EFS: |
@@ -3433,6 +3431,13 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, | |||
3433 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs), | 3431 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs), |
3434 | (unsigned long) &efs); | 3432 | (unsigned long) &efs); |
3435 | break; | 3433 | break; |
3434 | |||
3435 | case L2CAP_CONF_FCS: | ||
3436 | if (*result == L2CAP_CONF_PENDING) | ||
3437 | if (val == L2CAP_FCS_NONE) | ||
3438 | set_bit(CONF_RECV_NO_FCS, | ||
3439 | &chan->conf_state); | ||
3440 | break; | ||
3436 | } | 3441 | } |
3437 | } | 3442 | } |
3438 | 3443 | ||
@@ -3802,7 +3807,7 @@ static inline void set_default_fcs(struct l2cap_chan *chan) | |||
3802 | */ | 3807 | */ |
3803 | if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING) | 3808 | if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING) |
3804 | chan->fcs = L2CAP_FCS_NONE; | 3809 | chan->fcs = L2CAP_FCS_NONE; |
3805 | else if (!test_bit(CONF_NO_FCS_RECV, &chan->conf_state)) | 3810 | else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) |
3806 | chan->fcs = L2CAP_FCS_CRC16; | 3811 | chan->fcs = L2CAP_FCS_CRC16; |
3807 | } | 3812 | } |
3808 | 3813 | ||
@@ -3877,7 +3882,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, | |||
3877 | /* Complete config. */ | 3882 | /* Complete config. */ |
3878 | len = l2cap_parse_conf_req(chan, rsp); | 3883 | len = l2cap_parse_conf_req(chan, rsp); |
3879 | if (len < 0) { | 3884 | if (len < 0) { |
3880 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 3885 | l2cap_send_disconn_req(chan, ECONNRESET); |
3881 | goto unlock; | 3886 | goto unlock; |
3882 | } | 3887 | } |
3883 | 3888 | ||
@@ -3899,7 +3904,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, | |||
3899 | err = l2cap_ertm_init(chan); | 3904 | err = l2cap_ertm_init(chan); |
3900 | 3905 | ||
3901 | if (err < 0) | 3906 | if (err < 0) |
3902 | l2cap_send_disconn_req(chan->conn, chan, -err); | 3907 | l2cap_send_disconn_req(chan, -err); |
3903 | else | 3908 | else |
3904 | l2cap_chan_ready(chan); | 3909 | l2cap_chan_ready(chan); |
3905 | 3910 | ||
@@ -3967,7 +3972,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, | |||
3967 | len = l2cap_parse_conf_rsp(chan, rsp->data, len, | 3972 | len = l2cap_parse_conf_rsp(chan, rsp->data, len, |
3968 | buf, &result); | 3973 | buf, &result); |
3969 | if (len < 0) { | 3974 | if (len < 0) { |
3970 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 3975 | l2cap_send_disconn_req(chan, ECONNRESET); |
3971 | goto done; | 3976 | goto done; |
3972 | } | 3977 | } |
3973 | 3978 | ||
@@ -3988,7 +3993,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, | |||
3988 | char req[64]; | 3993 | char req[64]; |
3989 | 3994 | ||
3990 | if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { | 3995 | if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { |
3991 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 3996 | l2cap_send_disconn_req(chan, ECONNRESET); |
3992 | goto done; | 3997 | goto done; |
3993 | } | 3998 | } |
3994 | 3999 | ||
@@ -3997,7 +4002,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, | |||
3997 | len = l2cap_parse_conf_rsp(chan, rsp->data, len, | 4002 | len = l2cap_parse_conf_rsp(chan, rsp->data, len, |
3998 | req, &result); | 4003 | req, &result); |
3999 | if (len < 0) { | 4004 | if (len < 0) { |
4000 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 4005 | l2cap_send_disconn_req(chan, ECONNRESET); |
4001 | goto done; | 4006 | goto done; |
4002 | } | 4007 | } |
4003 | 4008 | ||
@@ -4013,7 +4018,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, | |||
4013 | l2cap_chan_set_err(chan, ECONNRESET); | 4018 | l2cap_chan_set_err(chan, ECONNRESET); |
4014 | 4019 | ||
4015 | __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT); | 4020 | __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT); |
4016 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 4021 | l2cap_send_disconn_req(chan, ECONNRESET); |
4017 | goto done; | 4022 | goto done; |
4018 | } | 4023 | } |
4019 | 4024 | ||
@@ -4030,7 +4035,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, | |||
4030 | err = l2cap_ertm_init(chan); | 4035 | err = l2cap_ertm_init(chan); |
4031 | 4036 | ||
4032 | if (err < 0) | 4037 | if (err < 0) |
4033 | l2cap_send_disconn_req(chan->conn, chan, -err); | 4038 | l2cap_send_disconn_req(chan, -err); |
4034 | else | 4039 | else |
4035 | l2cap_chan_ready(chan); | 4040 | l2cap_chan_ready(chan); |
4036 | } | 4041 | } |
@@ -4392,7 +4397,7 @@ static void l2cap_logical_fail(struct l2cap_chan *chan) | |||
4392 | /* Logical link setup failed */ | 4397 | /* Logical link setup failed */ |
4393 | if (chan->state != BT_CONNECTED) { | 4398 | if (chan->state != BT_CONNECTED) { |
4394 | /* Create channel failure, disconnect */ | 4399 | /* Create channel failure, disconnect */ |
4395 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 4400 | l2cap_send_disconn_req(chan, ECONNRESET); |
4396 | return; | 4401 | return; |
4397 | } | 4402 | } |
4398 | 4403 | ||
@@ -4435,7 +4440,7 @@ static void l2cap_logical_finish_create(struct l2cap_chan *chan, | |||
4435 | 4440 | ||
4436 | err = l2cap_ertm_init(chan); | 4441 | err = l2cap_ertm_init(chan); |
4437 | if (err < 0) | 4442 | if (err < 0) |
4438 | l2cap_send_disconn_req(chan->conn, chan, -err); | 4443 | l2cap_send_disconn_req(chan, -err); |
4439 | else | 4444 | else |
4440 | l2cap_chan_ready(chan); | 4445 | l2cap_chan_ready(chan); |
4441 | } | 4446 | } |
@@ -5400,7 +5405,7 @@ static void l2cap_handle_srej(struct l2cap_chan *chan, | |||
5400 | 5405 | ||
5401 | if (control->reqseq == chan->next_tx_seq) { | 5406 | if (control->reqseq == chan->next_tx_seq) { |
5402 | BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); | 5407 | BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); |
5403 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 5408 | l2cap_send_disconn_req(chan, ECONNRESET); |
5404 | return; | 5409 | return; |
5405 | } | 5410 | } |
5406 | 5411 | ||
@@ -5414,7 +5419,7 @@ static void l2cap_handle_srej(struct l2cap_chan *chan, | |||
5414 | 5419 | ||
5415 | if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) { | 5420 | if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) { |
5416 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); | 5421 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); |
5417 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 5422 | l2cap_send_disconn_req(chan, ECONNRESET); |
5418 | return; | 5423 | return; |
5419 | } | 5424 | } |
5420 | 5425 | ||
@@ -5458,7 +5463,7 @@ static void l2cap_handle_rej(struct l2cap_chan *chan, | |||
5458 | 5463 | ||
5459 | if (control->reqseq == chan->next_tx_seq) { | 5464 | if (control->reqseq == chan->next_tx_seq) { |
5460 | BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); | 5465 | BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); |
5461 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 5466 | l2cap_send_disconn_req(chan, ECONNRESET); |
5462 | return; | 5467 | return; |
5463 | } | 5468 | } |
5464 | 5469 | ||
@@ -5467,7 +5472,7 @@ static void l2cap_handle_rej(struct l2cap_chan *chan, | |||
5467 | if (chan->max_tx && skb && | 5472 | if (chan->max_tx && skb && |
5468 | bt_cb(skb)->control.retries >= chan->max_tx) { | 5473 | bt_cb(skb)->control.retries >= chan->max_tx) { |
5469 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); | 5474 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); |
5470 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 5475 | l2cap_send_disconn_req(chan, ECONNRESET); |
5471 | return; | 5476 | return; |
5472 | } | 5477 | } |
5473 | 5478 | ||
@@ -5651,8 +5656,7 @@ static int l2cap_rx_state_recv(struct l2cap_chan *chan, | |||
5651 | break; | 5656 | break; |
5652 | case L2CAP_TXSEQ_INVALID: | 5657 | case L2CAP_TXSEQ_INVALID: |
5653 | default: | 5658 | default: |
5654 | l2cap_send_disconn_req(chan->conn, chan, | 5659 | l2cap_send_disconn_req(chan, ECONNRESET); |
5655 | ECONNRESET); | ||
5656 | break; | 5660 | break; |
5657 | } | 5661 | } |
5658 | break; | 5662 | break; |
@@ -5785,8 +5789,7 @@ static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan, | |||
5785 | break; | 5789 | break; |
5786 | case L2CAP_TXSEQ_INVALID: | 5790 | case L2CAP_TXSEQ_INVALID: |
5787 | default: | 5791 | default: |
5788 | l2cap_send_disconn_req(chan->conn, chan, | 5792 | l2cap_send_disconn_req(chan, ECONNRESET); |
5789 | ECONNRESET); | ||
5790 | break; | 5793 | break; |
5791 | } | 5794 | } |
5792 | break; | 5795 | break; |
@@ -5981,7 +5984,7 @@ static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, | |||
5981 | BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d", | 5984 | BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d", |
5982 | control->reqseq, chan->next_tx_seq, | 5985 | control->reqseq, chan->next_tx_seq, |
5983 | chan->expected_ack_seq); | 5986 | chan->expected_ack_seq); |
5984 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 5987 | l2cap_send_disconn_req(chan, ECONNRESET); |
5985 | } | 5988 | } |
5986 | 5989 | ||
5987 | return err; | 5990 | return err; |
@@ -6050,7 +6053,7 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) | |||
6050 | len -= L2CAP_FCS_SIZE; | 6053 | len -= L2CAP_FCS_SIZE; |
6051 | 6054 | ||
6052 | if (len > chan->mps) { | 6055 | if (len > chan->mps) { |
6053 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 6056 | l2cap_send_disconn_req(chan, ECONNRESET); |
6054 | goto drop; | 6057 | goto drop; |
6055 | } | 6058 | } |
6056 | 6059 | ||
@@ -6075,8 +6078,7 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) | |||
6075 | } | 6078 | } |
6076 | 6079 | ||
6077 | if (err) | 6080 | if (err) |
6078 | l2cap_send_disconn_req(chan->conn, chan, | 6081 | l2cap_send_disconn_req(chan, ECONNRESET); |
6079 | ECONNRESET); | ||
6080 | } else { | 6082 | } else { |
6081 | const u8 rx_func_to_event[4] = { | 6083 | const u8 rx_func_to_event[4] = { |
6082 | L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ, | 6084 | L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ, |
@@ -6093,7 +6095,7 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) | |||
6093 | 6095 | ||
6094 | if (len != 0) { | 6096 | if (len != 0) { |
6095 | BT_ERR("Trailing bytes: %d in sframe", len); | 6097 | BT_ERR("Trailing bytes: %d in sframe", len); |
6096 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 6098 | l2cap_send_disconn_req(chan, ECONNRESET); |
6097 | goto drop; | 6099 | goto drop; |
6098 | } | 6100 | } |
6099 | 6101 | ||
@@ -6104,7 +6106,7 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) | |||
6104 | 6106 | ||
6105 | event = rx_func_to_event[control->super]; | 6107 | event = rx_func_to_event[control->super]; |
6106 | if (l2cap_rx(chan, control, skb, event)) | 6108 | if (l2cap_rx(chan, control, skb, event)) |
6107 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 6109 | l2cap_send_disconn_req(chan, ECONNRESET); |
6108 | } | 6110 | } |
6109 | 6111 | ||
6110 | return 0; | 6112 | return 0; |