diff options
author | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-04-08 14:40:02 -0400 |
---|---|---|
committer | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-04-27 17:51:34 -0400 |
commit | 5d41ce1dd91bce01d50aff79786dc5d5eedcfab7 (patch) | |
tree | 36905721ffdbbc24e13e6d302c9d956b9143da75 /net/bluetooth | |
parent | 828d7d7b19446bf5a40928da47955c575a454c75 (diff) |
Bluetooth: Refactor L2CAP channel allocation
If the allocation happens at l2cap_sock_create() will be able to use the
struct l2cap_chan to store channel info that comes from the user via
setsockopt.
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Diffstat (limited to 'net/bluetooth')
-rw-r--r-- | net/bluetooth/l2cap_core.c | 23 | ||||
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 11 |
2 files changed, 17 insertions, 17 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 9e8dc136ef16..4b857adc5361 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -149,7 +149,7 @@ static u16 l2cap_alloc_cid(struct l2cap_conn *conn) | |||
149 | return 0; | 149 | return 0; |
150 | } | 150 | } |
151 | 151 | ||
152 | static struct l2cap_chan *l2cap_chan_alloc(struct sock *sk) | 152 | struct l2cap_chan *l2cap_chan_alloc(struct sock *sk) |
153 | { | 153 | { |
154 | struct l2cap_chan *chan; | 154 | struct l2cap_chan *chan; |
155 | 155 | ||
@@ -648,6 +648,8 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn) | |||
648 | goto clean; | 648 | goto clean; |
649 | } | 649 | } |
650 | 650 | ||
651 | l2cap_pi(sk)->chan = chan; | ||
652 | |||
651 | write_lock_bh(&conn->chan_lock); | 653 | write_lock_bh(&conn->chan_lock); |
652 | 654 | ||
653 | hci_conn_hold(conn->hcon); | 655 | hci_conn_hold(conn->hcon); |
@@ -661,8 +663,6 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn) | |||
661 | 663 | ||
662 | __l2cap_chan_add(conn, chan); | 664 | __l2cap_chan_add(conn, chan); |
663 | 665 | ||
664 | l2cap_pi(sk)->chan = chan; | ||
665 | |||
666 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); | 666 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); |
667 | 667 | ||
668 | sk->sk_state = BT_CONNECTED; | 668 | sk->sk_state = BT_CONNECTED; |
@@ -847,12 +847,12 @@ static struct sock *l2cap_get_sock_by_psm(int state, __le16 psm, bdaddr_t *src) | |||
847 | return node ? sk : sk1; | 847 | return node ? sk : sk1; |
848 | } | 848 | } |
849 | 849 | ||
850 | int l2cap_do_connect(struct sock *sk) | 850 | int l2cap_do_connect(struct l2cap_chan *chan) |
851 | { | 851 | { |
852 | struct sock *sk = chan->sk; | ||
852 | bdaddr_t *src = &bt_sk(sk)->src; | 853 | bdaddr_t *src = &bt_sk(sk)->src; |
853 | bdaddr_t *dst = &bt_sk(sk)->dst; | 854 | bdaddr_t *dst = &bt_sk(sk)->dst; |
854 | struct l2cap_conn *conn; | 855 | struct l2cap_conn *conn; |
855 | struct l2cap_chan *chan; | ||
856 | struct hci_conn *hcon; | 856 | struct hci_conn *hcon; |
857 | struct hci_dev *hdev; | 857 | struct hci_dev *hdev; |
858 | __u8 auth_type; | 858 | __u8 auth_type; |
@@ -888,20 +888,11 @@ int l2cap_do_connect(struct sock *sk) | |||
888 | goto done; | 888 | goto done; |
889 | } | 889 | } |
890 | 890 | ||
891 | chan = l2cap_chan_alloc(sk); | ||
892 | if (!chan) { | ||
893 | hci_conn_put(hcon); | ||
894 | err = -ENOMEM; | ||
895 | goto done; | ||
896 | } | ||
897 | |||
898 | /* Update source addr of the socket */ | 891 | /* Update source addr of the socket */ |
899 | bacpy(src, conn->src); | 892 | bacpy(src, conn->src); |
900 | 893 | ||
901 | l2cap_chan_add(conn, chan); | 894 | l2cap_chan_add(conn, chan); |
902 | 895 | ||
903 | l2cap_pi(sk)->chan = chan; | ||
904 | |||
905 | sk->sk_state = BT_CONNECT; | 896 | sk->sk_state = BT_CONNECT; |
906 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); | 897 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); |
907 | 898 | ||
@@ -2076,6 +2067,8 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2076 | goto response; | 2067 | goto response; |
2077 | } | 2068 | } |
2078 | 2069 | ||
2070 | l2cap_pi(sk)->chan = chan; | ||
2071 | |||
2079 | write_lock_bh(&conn->chan_lock); | 2072 | write_lock_bh(&conn->chan_lock); |
2080 | 2073 | ||
2081 | /* Check if we already have channel with that dcid */ | 2074 | /* Check if we already have channel with that dcid */ |
@@ -2098,8 +2091,6 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2098 | 2091 | ||
2099 | __l2cap_chan_add(conn, chan); | 2092 | __l2cap_chan_add(conn, chan); |
2100 | 2093 | ||
2101 | l2cap_pi(sk)->chan = chan; | ||
2102 | |||
2103 | dcid = l2cap_pi(sk)->scid; | 2094 | dcid = l2cap_pi(sk)->scid; |
2104 | 2095 | ||
2105 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); | 2096 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 473e5973d8fe..e3724572c448 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -229,7 +229,7 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al | |||
229 | l2cap_pi(sk)->psm = la.l2_psm; | 229 | l2cap_pi(sk)->psm = la.l2_psm; |
230 | l2cap_pi(sk)->dcid = la.l2_cid; | 230 | l2cap_pi(sk)->dcid = la.l2_cid; |
231 | 231 | ||
232 | err = l2cap_do_connect(sk); | 232 | err = l2cap_do_connect(l2cap_pi(sk)->chan); |
233 | if (err) | 233 | if (err) |
234 | goto done; | 234 | goto done; |
235 | 235 | ||
@@ -1054,6 +1054,7 @@ static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol, | |||
1054 | int kern) | 1054 | int kern) |
1055 | { | 1055 | { |
1056 | struct sock *sk; | 1056 | struct sock *sk; |
1057 | struct l2cap_chan *chan; | ||
1057 | 1058 | ||
1058 | BT_DBG("sock %p", sock); | 1059 | BT_DBG("sock %p", sock); |
1059 | 1060 | ||
@@ -1072,6 +1073,14 @@ static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol, | |||
1072 | if (!sk) | 1073 | if (!sk) |
1073 | return -ENOMEM; | 1074 | return -ENOMEM; |
1074 | 1075 | ||
1076 | chan = l2cap_chan_alloc(sk); | ||
1077 | if (!chan) { | ||
1078 | l2cap_sock_kill(sk); | ||
1079 | return -ENOMEM; | ||
1080 | } | ||
1081 | |||
1082 | l2cap_pi(sk)->chan = chan; | ||
1083 | |||
1075 | l2cap_sock_init(sk, NULL); | 1084 | l2cap_sock_init(sk, NULL); |
1076 | return 0; | 1085 | return 0; |
1077 | } | 1086 | } |