aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorGustavo F. Padovan <padovan@profusion.mobi>2011-04-08 14:40:02 -0400
committerGustavo F. Padovan <padovan@profusion.mobi>2011-04-27 17:51:34 -0400
commit5d41ce1dd91bce01d50aff79786dc5d5eedcfab7 (patch)
tree36905721ffdbbc24e13e6d302c9d956b9143da75 /net
parent828d7d7b19446bf5a40928da47955c575a454c75 (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')
-rw-r--r--net/bluetooth/l2cap_core.c23
-rw-r--r--net/bluetooth/l2cap_sock.c11
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
152static struct l2cap_chan *l2cap_chan_alloc(struct sock *sk) 152struct 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
850int l2cap_do_connect(struct sock *sk) 850int 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}