diff options
author | Gustavo Padovan <gustavo@padovan.org> | 2012-05-16 11:17:10 -0400 |
---|---|---|
committer | Gustavo Padovan <gustavo.padovan@collabora.co.uk> | 2012-05-16 15:14:17 -0400 |
commit | c5daa683f2d3315cd766f550ef7d88bfca1671f4 (patch) | |
tree | 91a974326357fd923a52818107b8ba99cad1e111 | |
parent | c6585a4da0c709a7a9f59aab68869298b52ca1e1 (diff) |
Bluetooth: Create flags for bt_sk()
defer_setup and suspended are now flags into bt_sk().
Signed-off-by: Gustavo Padovan <gustavo@padovan.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
-rw-r--r-- | include/net/bluetooth/bluetooth.h | 8 | ||||
-rw-r--r-- | net/bluetooth/af_bluetooth.c | 8 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 14 | ||||
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 21 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/sock.c | 14 |
5 files changed, 41 insertions, 24 deletions
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 7981ca48b83a..961669b648fd 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
@@ -194,8 +194,12 @@ struct bt_sock { | |||
194 | bdaddr_t dst; | 194 | bdaddr_t dst; |
195 | struct list_head accept_q; | 195 | struct list_head accept_q; |
196 | struct sock *parent; | 196 | struct sock *parent; |
197 | u32 defer_setup; | 197 | unsigned long flags; |
198 | bool suspended; | 198 | }; |
199 | |||
200 | enum { | ||
201 | BT_SK_DEFER_SETUP, | ||
202 | BT_SK_SUSPEND, | ||
199 | }; | 203 | }; |
200 | 204 | ||
201 | struct bt_sock_list { | 205 | struct bt_sock_list { |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 6fb68a9743af..46e7f86acfc9 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -210,7 +210,7 @@ struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock) | |||
210 | } | 210 | } |
211 | 211 | ||
212 | if (sk->sk_state == BT_CONNECTED || !newsock || | 212 | if (sk->sk_state == BT_CONNECTED || !newsock || |
213 | bt_sk(parent)->defer_setup) { | 213 | test_bit(BT_DEFER_SETUP, &bt_sk(parent)->flags)) { |
214 | bt_accept_unlink(sk); | 214 | bt_accept_unlink(sk); |
215 | if (newsock) | 215 | if (newsock) |
216 | sock_graft(sk, newsock); | 216 | sock_graft(sk, newsock); |
@@ -410,8 +410,8 @@ static inline unsigned int bt_accept_poll(struct sock *parent) | |||
410 | list_for_each_safe(p, n, &bt_sk(parent)->accept_q) { | 410 | list_for_each_safe(p, n, &bt_sk(parent)->accept_q) { |
411 | sk = (struct sock *) list_entry(p, struct bt_sock, accept_q); | 411 | sk = (struct sock *) list_entry(p, struct bt_sock, accept_q); |
412 | if (sk->sk_state == BT_CONNECTED || | 412 | if (sk->sk_state == BT_CONNECTED || |
413 | (bt_sk(parent)->defer_setup && | 413 | (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags) && |
414 | sk->sk_state == BT_CONNECT2)) | 414 | sk->sk_state == BT_CONNECT2)) |
415 | return POLLIN | POLLRDNORM; | 415 | return POLLIN | POLLRDNORM; |
416 | } | 416 | } |
417 | 417 | ||
@@ -450,7 +450,7 @@ unsigned int bt_sock_poll(struct file *file, struct socket *sock, poll_table *wa | |||
450 | sk->sk_state == BT_CONFIG) | 450 | sk->sk_state == BT_CONFIG) |
451 | return mask; | 451 | return mask; |
452 | 452 | ||
453 | if (!bt_sk(sk)->suspended && sock_writeable(sk)) | 453 | if (!test_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags) && sock_writeable(sk)) |
454 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; | 454 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; |
455 | else | 455 | else |
456 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 456 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 285c5e13c7d5..24f144b72a96 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -71,7 +71,7 @@ static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, | |||
71 | void *data); | 71 | void *data); |
72 | static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data); | 72 | static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data); |
73 | static void l2cap_send_disconn_req(struct l2cap_conn *conn, | 73 | static void l2cap_send_disconn_req(struct l2cap_conn *conn, |
74 | struct l2cap_chan *chan, int err); | 74 | struct l2cap_chan *chan, int err); |
75 | 75 | ||
76 | /* ---- L2CAP channels ---- */ | 76 | /* ---- L2CAP channels ---- */ |
77 | 77 | ||
@@ -586,7 +586,7 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason) | |||
586 | struct l2cap_conn_rsp rsp; | 586 | struct l2cap_conn_rsp rsp; |
587 | __u16 result; | 587 | __u16 result; |
588 | 588 | ||
589 | if (bt_sk(sk)->defer_setup) | 589 | if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) |
590 | result = L2CAP_CR_SEC_BLOCK; | 590 | result = L2CAP_CR_SEC_BLOCK; |
591 | else | 591 | else |
592 | result = L2CAP_CR_BAD_PSM; | 592 | result = L2CAP_CR_BAD_PSM; |
@@ -1050,7 +1050,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
1050 | 1050 | ||
1051 | if (l2cap_chan_check_security(chan)) { | 1051 | if (l2cap_chan_check_security(chan)) { |
1052 | lock_sock(sk); | 1052 | lock_sock(sk); |
1053 | if (bt_sk(sk)->defer_setup) { | 1053 | if (test_bit(BT_SK_DEFER_SETUP, |
1054 | &bt_sk(sk)->flags)) { | ||
1054 | struct sock *parent = bt_sk(sk)->parent; | 1055 | struct sock *parent = bt_sk(sk)->parent; |
1055 | rsp.result = cpu_to_le16(L2CAP_CR_PEND); | 1056 | rsp.result = cpu_to_le16(L2CAP_CR_PEND); |
1056 | rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND); | 1057 | 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 | 3033 | ||
3033 | if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) { | 3034 | if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) { |
3034 | if (l2cap_chan_check_security(chan)) { | 3035 | if (l2cap_chan_check_security(chan)) { |
3035 | if (bt_sk(sk)->defer_setup) { | 3036 | if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { |
3036 | __l2cap_state_change(chan, BT_CONNECT2); | 3037 | __l2cap_state_change(chan, BT_CONNECT2); |
3037 | result = L2CAP_CR_PEND; | 3038 | result = L2CAP_CR_PEND; |
3038 | status = L2CAP_CS_AUTHOR_PEND; | 3039 | status = L2CAP_CS_AUTHOR_PEND; |
@@ -4924,7 +4925,7 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
4924 | chan->state == BT_CONFIG)) { | 4925 | chan->state == BT_CONFIG)) { |
4925 | struct sock *sk = chan->sk; | 4926 | struct sock *sk = chan->sk; |
4926 | 4927 | ||
4927 | bt_sk(sk)->suspended = false; | 4928 | clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags); |
4928 | sk->sk_state_change(sk); | 4929 | sk->sk_state_change(sk); |
4929 | 4930 | ||
4930 | l2cap_check_encryption(chan, encrypt); | 4931 | l2cap_check_encryption(chan, encrypt); |
@@ -4946,7 +4947,8 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
4946 | lock_sock(sk); | 4947 | lock_sock(sk); |
4947 | 4948 | ||
4948 | if (!status) { | 4949 | if (!status) { |
4949 | if (bt_sk(sk)->defer_setup) { | 4950 | if (test_bit(BT_SK_DEFER_SETUP, |
4951 | &bt_sk(sk)->flags)) { | ||
4950 | struct sock *parent = bt_sk(sk)->parent; | 4952 | struct sock *parent = bt_sk(sk)->parent; |
4951 | res = L2CAP_CR_PEND; | 4953 | res = L2CAP_CR_PEND; |
4952 | stat = L2CAP_CS_AUTHOR_PEND; | 4954 | stat = L2CAP_CS_AUTHOR_PEND; |
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; |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index a55a43e9f70e..e8707debb864 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
@@ -260,7 +260,8 @@ static void rfcomm_sock_init(struct sock *sk, struct sock *parent) | |||
260 | 260 | ||
261 | if (parent) { | 261 | if (parent) { |
262 | sk->sk_type = parent->sk_type; | 262 | sk->sk_type = parent->sk_type; |
263 | pi->dlc->defer_setup = bt_sk(parent)->defer_setup; | 263 | pi->dlc->defer_setup = test_bit(BT_SK_DEFER_SETUP, |
264 | &bt_sk(parent)->flags); | ||
264 | 265 | ||
265 | pi->sec_level = rfcomm_pi(parent)->sec_level; | 266 | pi->sec_level = rfcomm_pi(parent)->sec_level; |
266 | pi->role_switch = rfcomm_pi(parent)->role_switch; | 267 | 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 | break; | 732 | break; |
732 | } | 733 | } |
733 | 734 | ||
734 | bt_sk(sk)->defer_setup = opt; | 735 | if (opt) |
736 | set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); | ||
737 | else | ||
738 | clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); | ||
739 | |||
735 | break; | 740 | break; |
736 | 741 | ||
737 | default: | 742 | default: |
@@ -849,7 +854,8 @@ static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, c | |||
849 | break; | 854 | break; |
850 | } | 855 | } |
851 | 856 | ||
852 | if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval)) | 857 | if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), |
858 | (u32 __user *) optval)) | ||
853 | err = -EFAULT; | 859 | err = -EFAULT; |
854 | 860 | ||
855 | break; | 861 | break; |
@@ -972,7 +978,7 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc * | |||
972 | done: | 978 | done: |
973 | bh_unlock_sock(parent); | 979 | bh_unlock_sock(parent); |
974 | 980 | ||
975 | if (bt_sk(parent)->defer_setup) | 981 | if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags)) |
976 | parent->sk_state_change(parent); | 982 | parent->sk_state_change(parent); |
977 | 983 | ||
978 | return result; | 984 | return result; |