aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth/l2cap_core.c
diff options
context:
space:
mode:
authorGustavo F. Padovan <padovan@profusion.mobi>2011-04-18 18:38:43 -0300
committerGustavo F. Padovan <padovan@profusion.mobi>2011-05-05 13:47:38 -0300
commit9e4425fff9e0a0fb6a8c705777ed861f991f8747 (patch)
tree640771ab2e0c403d38e2a86538e272fbf47d3e6c /net/bluetooth/l2cap_core.c
parent7cbc9bd99542752ff570abca79d0027669a01fb8 (diff)
downloadkernel_samsung_smdk4412-9e4425fff9e0a0fb6a8c705777ed861f991f8747.zip
kernel_samsung_smdk4412-9e4425fff9e0a0fb6a8c705777ed861f991f8747.tar.gz
kernel_samsung_smdk4412-9e4425fff9e0a0fb6a8c705777ed861f991f8747.tar.bz2
Bluetooth: Add l2cap_add_psm() and l2cap_add_scid()
The intention is to get rid of the l2cap_sk_list usage inside l2cap_core.c. l2cap_sk_list will soon be replaced by a list that does not depend on socket usage. Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Diffstat (limited to 'net/bluetooth/l2cap_core.c')
-rw-r--r--net/bluetooth/l2cap_core.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 338d8c3..98ddd86 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -135,6 +135,50 @@ static inline struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn
return c;
}
+struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src)
+{
+ struct sock *sk;
+ struct hlist_node *node;
+ sk_for_each(sk, node, &l2cap_sk_list.head) {
+ struct l2cap_chan *chan = l2cap_pi(sk)->chan;
+
+ if (chan->sport == psm && !bacmp(&bt_sk(sk)->src, src))
+ goto found;
+ }
+
+ sk = NULL;
+found:
+ return sk;
+}
+
+int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
+{
+ write_lock_bh(&l2cap_sk_list.lock);
+
+ if (__l2cap_get_sock_by_addr(psm, src)) {
+ write_unlock_bh(&l2cap_sk_list.lock);
+ return -EADDRINUSE;
+ }
+
+ chan->psm = psm;
+ chan->sport = psm;
+
+ write_unlock_bh(&l2cap_sk_list.lock);
+
+ return 0;
+}
+
+int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
+{
+ write_lock_bh(&l2cap_sk_list.lock);
+
+ chan->scid = scid;
+
+ write_unlock_bh(&l2cap_sk_list.lock);
+
+ return 0;
+}
+
static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
{
u16 cid = L2CAP_CID_DYN_START;