@@ -421,9 +421,16 @@ static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
421
421
d , d -> state , d -> dlci , err , s );
422
422
423
423
switch (d -> state ) {
424
- case BT_CONNECTED :
425
- case BT_CONFIG :
426
424
case BT_CONNECT :
425
+ case BT_CONFIG :
426
+ if (test_and_clear_bit (RFCOMM_DEFER_SETUP , & d -> flags )) {
427
+ set_bit (RFCOMM_AUTH_REJECT , & d -> flags );
428
+ rfcomm_schedule (RFCOMM_SCHED_AUTH );
429
+ break ;
430
+ }
431
+ /* Fall through */
432
+
433
+ case BT_CONNECTED :
427
434
d -> state = BT_DISCONN ;
428
435
if (skb_queue_empty (& d -> tx_queue )) {
429
436
rfcomm_send_disc (s , d -> dlci );
@@ -434,6 +441,14 @@ static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
434
441
}
435
442
break ;
436
443
444
+ case BT_OPEN :
445
+ if (test_and_clear_bit (RFCOMM_DEFER_SETUP , & d -> flags )) {
446
+ set_bit (RFCOMM_AUTH_REJECT , & d -> flags );
447
+ rfcomm_schedule (RFCOMM_SCHED_AUTH );
448
+ break ;
449
+ }
450
+ /* Fall through */
451
+
437
452
default :
438
453
rfcomm_dlc_clear_timer (d );
439
454
@@ -1162,7 +1177,7 @@ static int rfcomm_recv_disc(struct rfcomm_session *s, u8 dlci)
1162
1177
return 0 ;
1163
1178
}
1164
1179
1165
- static void rfcomm_dlc_accept (struct rfcomm_dlc * d )
1180
+ void rfcomm_dlc_accept (struct rfcomm_dlc * d )
1166
1181
{
1167
1182
struct sock * sk = d -> session -> sock -> sk ;
1168
1183
@@ -1181,6 +1196,20 @@ static void rfcomm_dlc_accept(struct rfcomm_dlc *d)
1181
1196
rfcomm_send_msc (d -> session , 1 , d -> dlci , d -> v24_sig );
1182
1197
}
1183
1198
1199
+ static void rfcomm_check_accept (struct rfcomm_dlc * d )
1200
+ {
1201
+ if (rfcomm_check_link_mode (d )) {
1202
+ set_bit (RFCOMM_AUTH_PENDING , & d -> flags );
1203
+ rfcomm_dlc_set_timer (d , RFCOMM_AUTH_TIMEOUT );
1204
+ } else {
1205
+ if (d -> defer_setup ) {
1206
+ set_bit (RFCOMM_DEFER_SETUP , & d -> flags );
1207
+ rfcomm_dlc_set_timer (d , RFCOMM_AUTH_TIMEOUT );
1208
+ } else
1209
+ rfcomm_dlc_accept (d );
1210
+ }
1211
+ }
1212
+
1184
1213
static int rfcomm_recv_sabm (struct rfcomm_session * s , u8 dlci )
1185
1214
{
1186
1215
struct rfcomm_dlc * d ;
@@ -1203,11 +1232,7 @@ static int rfcomm_recv_sabm(struct rfcomm_session *s, u8 dlci)
1203
1232
if (d ) {
1204
1233
if (d -> state == BT_OPEN ) {
1205
1234
/* DLC was previously opened by PN request */
1206
- if (rfcomm_check_link_mode (d )) {
1207
- set_bit (RFCOMM_AUTH_PENDING , & d -> flags );
1208
- rfcomm_dlc_set_timer (d , RFCOMM_AUTH_TIMEOUT );
1209
- } else
1210
- rfcomm_dlc_accept (d );
1235
+ rfcomm_check_accept (d );
1211
1236
}
1212
1237
return 0 ;
1213
1238
}
@@ -1219,11 +1244,7 @@ static int rfcomm_recv_sabm(struct rfcomm_session *s, u8 dlci)
1219
1244
d -> addr = __addr (s -> initiator , dlci );
1220
1245
rfcomm_dlc_link (s , d );
1221
1246
1222
- if (rfcomm_check_link_mode (d )) {
1223
- set_bit (RFCOMM_AUTH_PENDING , & d -> flags );
1224
- rfcomm_dlc_set_timer (d , RFCOMM_AUTH_TIMEOUT );
1225
- } else
1226
- rfcomm_dlc_accept (d );
1247
+ rfcomm_check_accept (d );
1227
1248
} else {
1228
1249
rfcomm_send_dm (s , dlci );
1229
1250
}
@@ -1717,8 +1738,13 @@ static inline void rfcomm_process_dlcs(struct rfcomm_session *s)
1717
1738
if (d -> out ) {
1718
1739
rfcomm_send_pn (s , 1 , d );
1719
1740
rfcomm_dlc_set_timer (d , RFCOMM_CONN_TIMEOUT );
1720
- } else
1721
- rfcomm_dlc_accept (d );
1741
+ } else {
1742
+ if (d -> defer_setup ) {
1743
+ set_bit (RFCOMM_DEFER_SETUP , & d -> flags );
1744
+ rfcomm_dlc_set_timer (d , RFCOMM_AUTH_TIMEOUT );
1745
+ } else
1746
+ rfcomm_dlc_accept (d );
1747
+ }
1722
1748
if (d -> link_mode & RFCOMM_LM_SECURE ) {
1723
1749
struct sock * sk = s -> sock -> sk ;
1724
1750
hci_conn_change_link_key (l2cap_pi (sk )-> conn -> hcon );
0 commit comments