aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/bluetooth/rfcomm.h9
-rw-r--r--net/bluetooth/rfcomm/core.c23
2 files changed, 22 insertions, 10 deletions
diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h
index bda68d833ddd..80072611d26a 100644
--- a/include/net/bluetooth/rfcomm.h
+++ b/include/net/bluetooth/rfcomm.h
@@ -204,10 +204,11 @@ struct rfcomm_dlc {
204#define RFCOMM_TX_THROTTLED 1 204#define RFCOMM_TX_THROTTLED 1
205#define RFCOMM_TIMED_OUT 2 205#define RFCOMM_TIMED_OUT 2
206#define RFCOMM_MSC_PENDING 3 206#define RFCOMM_MSC_PENDING 3
207#define RFCOMM_AUTH_PENDING 4 207#define RFCOMM_SEC_PENDING 4
208#define RFCOMM_AUTH_ACCEPT 5 208#define RFCOMM_AUTH_PENDING 5
209#define RFCOMM_AUTH_REJECT 6 209#define RFCOMM_AUTH_ACCEPT 6
210#define RFCOMM_DEFER_SETUP 7 210#define RFCOMM_AUTH_REJECT 7
211#define RFCOMM_DEFER_SETUP 8
211 212
212/* Scheduling flags and events */ 213/* Scheduling flags and events */
213#define RFCOMM_SCHED_STATE 0 214#define RFCOMM_SCHED_STATE 0
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
index db83f92d274c..dafaee91cdfb 100644
--- a/net/bluetooth/rfcomm/core.c
+++ b/net/bluetooth/rfcomm/core.c
@@ -1979,12 +1979,23 @@ static void rfcomm_security_cfm(struct hci_conn *conn, u8 status, u8 encrypt)
1979 list_for_each_safe(p, n, &s->dlcs) { 1979 list_for_each_safe(p, n, &s->dlcs) {
1980 d = list_entry(p, struct rfcomm_dlc, list); 1980 d = list_entry(p, struct rfcomm_dlc, list);
1981 1981
1982 if (!status && encrypt == 0x00 && 1982 if (test_and_clear_bit(RFCOMM_SEC_PENDING, &d->flags)) {
1983 d->sec_level == BT_SECURITY_HIGH && 1983 rfcomm_dlc_clear_timer(d);
1984 (d->state == BT_CONNECTED || 1984 if (status || encrypt == 0x00) {
1985 d->state == BT_CONFIG)) { 1985 __rfcomm_dlc_close(d, ECONNREFUSED);
1986 __rfcomm_dlc_close(d, ECONNREFUSED); 1986 continue;
1987 continue; 1987 }
1988 }
1989
1990 if (d->state == BT_CONNECTED && !status && encrypt == 0x00) {
1991 if (d->sec_level == BT_SECURITY_MEDIUM) {
1992 set_bit(RFCOMM_SEC_PENDING, &d->flags);
1993 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
1994 continue;
1995 } else if (d->sec_level == BT_SECURITY_HIGH) {
1996 __rfcomm_dlc_close(d, ECONNREFUSED);
1997 continue;
1998 }
1988 } 1999 }
1989 2000
1990 if (!test_and_clear_bit(RFCOMM_AUTH_PENDING, &d->flags)) 2001 if (!test_and_clear_bit(RFCOMM_AUTH_PENDING, &d->flags))