diff options
-rw-r--r-- | include/net/bluetooth/rfcomm.h | 9 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/core.c | 23 |
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)) |