提交 c5daa683 编写于 作者: G Gustavo Padovan 提交者: Gustavo Padovan

Bluetooth: Create flags for bt_sk()

defer_setup and suspended are now flags into bt_sk().
Signed-off-by: NGustavo Padovan <gustavo@padovan.org>
Signed-off-by: NJohan Hedberg <johan.hedberg@intel.com>
上级 c6585a4d
...@@ -194,8 +194,12 @@ struct bt_sock { ...@@ -194,8 +194,12 @@ struct bt_sock {
bdaddr_t dst; bdaddr_t dst;
struct list_head accept_q; struct list_head accept_q;
struct sock *parent; struct sock *parent;
u32 defer_setup; unsigned long flags;
bool suspended; };
enum {
BT_SK_DEFER_SETUP,
BT_SK_SUSPEND,
}; };
struct bt_sock_list { struct bt_sock_list {
......
...@@ -210,7 +210,7 @@ struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock) ...@@ -210,7 +210,7 @@ struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock)
} }
if (sk->sk_state == BT_CONNECTED || !newsock || if (sk->sk_state == BT_CONNECTED || !newsock ||
bt_sk(parent)->defer_setup) { test_bit(BT_DEFER_SETUP, &bt_sk(parent)->flags)) {
bt_accept_unlink(sk); bt_accept_unlink(sk);
if (newsock) if (newsock)
sock_graft(sk, newsock); sock_graft(sk, newsock);
...@@ -410,7 +410,7 @@ static inline unsigned int bt_accept_poll(struct sock *parent) ...@@ -410,7 +410,7 @@ static inline unsigned int bt_accept_poll(struct sock *parent)
list_for_each_safe(p, n, &bt_sk(parent)->accept_q) { list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
sk = (struct sock *) list_entry(p, struct bt_sock, accept_q); sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
if (sk->sk_state == BT_CONNECTED || if (sk->sk_state == BT_CONNECTED ||
(bt_sk(parent)->defer_setup && (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags) &&
sk->sk_state == BT_CONNECT2)) sk->sk_state == BT_CONNECT2))
return POLLIN | POLLRDNORM; return POLLIN | POLLRDNORM;
} }
...@@ -450,7 +450,7 @@ unsigned int bt_sock_poll(struct file *file, struct socket *sock, poll_table *wa ...@@ -450,7 +450,7 @@ unsigned int bt_sock_poll(struct file *file, struct socket *sock, poll_table *wa
sk->sk_state == BT_CONFIG) sk->sk_state == BT_CONFIG)
return mask; return mask;
if (!bt_sk(sk)->suspended && sock_writeable(sk)) if (!test_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags) && sock_writeable(sk))
mask |= POLLOUT | POLLWRNORM | POLLWRBAND; mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
else else
set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
......
...@@ -586,7 +586,7 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason) ...@@ -586,7 +586,7 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason)
struct l2cap_conn_rsp rsp; struct l2cap_conn_rsp rsp;
__u16 result; __u16 result;
if (bt_sk(sk)->defer_setup) if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))
result = L2CAP_CR_SEC_BLOCK; result = L2CAP_CR_SEC_BLOCK;
else else
result = L2CAP_CR_BAD_PSM; result = L2CAP_CR_BAD_PSM;
...@@ -1050,7 +1050,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn) ...@@ -1050,7 +1050,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
if (l2cap_chan_check_security(chan)) { if (l2cap_chan_check_security(chan)) {
lock_sock(sk); lock_sock(sk);
if (bt_sk(sk)->defer_setup) { if (test_bit(BT_SK_DEFER_SETUP,
&bt_sk(sk)->flags)) {
struct sock *parent = bt_sk(sk)->parent; struct sock *parent = bt_sk(sk)->parent;
rsp.result = cpu_to_le16(L2CAP_CR_PEND); rsp.result = cpu_to_le16(L2CAP_CR_PEND);
rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND); rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
...@@ -3032,7 +3033,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd ...@@ -3032,7 +3033,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd
if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) { if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
if (l2cap_chan_check_security(chan)) { if (l2cap_chan_check_security(chan)) {
if (bt_sk(sk)->defer_setup) { if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
__l2cap_state_change(chan, BT_CONNECT2); __l2cap_state_change(chan, BT_CONNECT2);
result = L2CAP_CR_PEND; result = L2CAP_CR_PEND;
status = L2CAP_CS_AUTHOR_PEND; status = L2CAP_CS_AUTHOR_PEND;
...@@ -4924,7 +4925,7 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) ...@@ -4924,7 +4925,7 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
chan->state == BT_CONFIG)) { chan->state == BT_CONFIG)) {
struct sock *sk = chan->sk; struct sock *sk = chan->sk;
bt_sk(sk)->suspended = false; clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
sk->sk_state_change(sk); sk->sk_state_change(sk);
l2cap_check_encryption(chan, encrypt); l2cap_check_encryption(chan, encrypt);
...@@ -4946,7 +4947,8 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) ...@@ -4946,7 +4947,8 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
lock_sock(sk); lock_sock(sk);
if (!status) { if (!status) {
if (bt_sk(sk)->defer_setup) { if (test_bit(BT_SK_DEFER_SETUP,
&bt_sk(sk)->flags)) {
struct sock *parent = bt_sk(sk)->parent; struct sock *parent = bt_sk(sk)->parent;
res = L2CAP_CR_PEND; res = L2CAP_CR_PEND;
stat = L2CAP_CS_AUTHOR_PEND; stat = L2CAP_CS_AUTHOR_PEND;
......
...@@ -325,7 +325,7 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __us ...@@ -325,7 +325,7 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __us
case L2CAP_CONNINFO: case L2CAP_CONNINFO:
if (sk->sk_state != BT_CONNECTED && if (sk->sk_state != BT_CONNECTED &&
!(sk->sk_state == BT_CONNECT2 && !(sk->sk_state == BT_CONNECT2 &&
bt_sk(sk)->defer_setup)) { test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
err = -ENOTCONN; err = -ENOTCONN;
break; break;
} }
...@@ -399,7 +399,8 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch ...@@ -399,7 +399,8 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch
break; break;
} }
if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval)) if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
(u32 __user *) optval))
err = -EFAULT; err = -EFAULT;
break; break;
...@@ -601,10 +602,10 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch ...@@ -601,10 +602,10 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch
/* or for ACL link */ /* or for ACL link */
} else if ((sk->sk_state == BT_CONNECT2 && } else if ((sk->sk_state == BT_CONNECT2 &&
bt_sk(sk)->defer_setup) || test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
sk->sk_state == BT_CONNECTED) { sk->sk_state == BT_CONNECTED) {
if (!l2cap_chan_check_security(chan)) if (!l2cap_chan_check_security(chan))
bt_sk(sk)->suspended = true; set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
else else
sk->sk_state_change(sk); sk->sk_state_change(sk);
} else { } else {
...@@ -623,7 +624,10 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch ...@@ -623,7 +624,10 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch
break; break;
} }
bt_sk(sk)->defer_setup = opt; if (opt)
set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
else
clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
break; break;
case BT_FLUSHABLE: case BT_FLUSHABLE:
...@@ -741,7 +745,8 @@ static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct ms ...@@ -741,7 +745,8 @@ static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct ms
lock_sock(sk); lock_sock(sk);
if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) { if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
&bt_sk(sk)->flags)) {
sk->sk_state = BT_CONFIG; sk->sk_state = BT_CONFIG;
pi->chan->state = BT_CONFIG; pi->chan->state = BT_CONFIG;
...@@ -984,7 +989,7 @@ static void l2cap_sock_init(struct sock *sk, struct sock *parent) ...@@ -984,7 +989,7 @@ static void l2cap_sock_init(struct sock *sk, struct sock *parent)
struct l2cap_chan *pchan = l2cap_pi(parent)->chan; struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
sk->sk_type = parent->sk_type; sk->sk_type = parent->sk_type;
bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup; bt_sk(sk)->flags = bt_sk(parent)->flags;
chan->chan_type = pchan->chan_type; chan->chan_type = pchan->chan_type;
chan->imtu = pchan->imtu; chan->imtu = pchan->imtu;
......
...@@ -260,7 +260,8 @@ static void rfcomm_sock_init(struct sock *sk, struct sock *parent) ...@@ -260,7 +260,8 @@ static void rfcomm_sock_init(struct sock *sk, struct sock *parent)
if (parent) { if (parent) {
sk->sk_type = parent->sk_type; sk->sk_type = parent->sk_type;
pi->dlc->defer_setup = bt_sk(parent)->defer_setup; pi->dlc->defer_setup = test_bit(BT_SK_DEFER_SETUP,
&bt_sk(parent)->flags);
pi->sec_level = rfcomm_pi(parent)->sec_level; pi->sec_level = rfcomm_pi(parent)->sec_level;
pi->role_switch = rfcomm_pi(parent)->role_switch; pi->role_switch = rfcomm_pi(parent)->role_switch;
...@@ -731,7 +732,11 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, c ...@@ -731,7 +732,11 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, c
break; break;
} }
bt_sk(sk)->defer_setup = opt; if (opt)
set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
else
clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
break; break;
default: default:
...@@ -849,7 +854,8 @@ static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, c ...@@ -849,7 +854,8 @@ static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, c
break; break;
} }
if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval)) if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
(u32 __user *) optval))
err = -EFAULT; err = -EFAULT;
break; break;
...@@ -972,7 +978,7 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc * ...@@ -972,7 +978,7 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc *
done: done:
bh_unlock_sock(parent); bh_unlock_sock(parent);
if (bt_sk(parent)->defer_setup) if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
parent->sk_state_change(parent); parent->sk_state_change(parent);
return result; return result;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册