aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth/l2cap_sock.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/bluetooth/l2cap_sock.c')
-rw-r--r--net/bluetooth/l2cap_sock.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index f52d58e05d02..3bb1611b9d48 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -324,8 +324,8 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __us
324 324
325 case L2CAP_CONNINFO: 325 case L2CAP_CONNINFO:
326 if (sk->sk_state != BT_CONNECTED && 326 if (sk->sk_state != BT_CONNECTED &&
327 !(sk->sk_state == BT_CONNECT2 && 327 !(sk->sk_state == BT_CONNECT2 &&
328 bt_sk(sk)->defer_setup)) { 328 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
329 err = -ENOTCONN; 329 err = -ENOTCONN;
330 break; 330 break;
331 } 331 }
@@ -399,7 +399,8 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch
399 break; 399 break;
400 } 400 }
401 401
402 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval)) 402 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
403 (u32 __user *) optval))
403 err = -EFAULT; 404 err = -EFAULT;
404 405
405 break; 406 break;
@@ -601,10 +602,10 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch
601 602
602 /* or for ACL link */ 603 /* or for ACL link */
603 } else if ((sk->sk_state == BT_CONNECT2 && 604 } else if ((sk->sk_state == BT_CONNECT2 &&
604 bt_sk(sk)->defer_setup) || 605 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
605 sk->sk_state == BT_CONNECTED) { 606 sk->sk_state == BT_CONNECTED) {
606 if (!l2cap_chan_check_security(chan)) 607 if (!l2cap_chan_check_security(chan))
607 bt_sk(sk)->suspended = true; 608 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
608 else 609 else
609 sk->sk_state_change(sk); 610 sk->sk_state_change(sk);
610 } else { 611 } else {
@@ -623,7 +624,10 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch
623 break; 624 break;
624 } 625 }
625 626
626 bt_sk(sk)->defer_setup = opt; 627 if (opt)
628 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
629 else
630 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
627 break; 631 break;
628 632
629 case BT_FLUSHABLE: 633 case BT_FLUSHABLE:
@@ -741,7 +745,8 @@ static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct ms
741 745
742 lock_sock(sk); 746 lock_sock(sk);
743 747
744 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) { 748 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
749 &bt_sk(sk)->flags)) {
745 sk->sk_state = BT_CONFIG; 750 sk->sk_state = BT_CONFIG;
746 pi->chan->state = BT_CONFIG; 751 pi->chan->state = BT_CONFIG;
747 752
@@ -984,7 +989,7 @@ static void l2cap_sock_init(struct sock *sk, struct sock *parent)
984 struct l2cap_chan *pchan = l2cap_pi(parent)->chan; 989 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
985 990
986 sk->sk_type = parent->sk_type; 991 sk->sk_type = parent->sk_type;
987 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup; 992 bt_sk(sk)->flags = bt_sk(parent)->flags;
988 993
989 chan->chan_type = pchan->chan_type; 994 chan->chan_type = pchan->chan_type;
990 chan->imtu = pchan->imtu; 995 chan->imtu = pchan->imtu;