diff options
author | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-04-13 18:50:45 -0400 |
---|---|---|
committer | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-04-28 00:09:59 -0400 |
commit | fe4128e0aabc3c748786c00da21e6eff9d3aeddb (patch) | |
tree | 6b62853c721023e6a05fdbbc0c806414632ef984 | |
parent | 0c1bc5c626e9783034264ccca4b262b3acc628f1 (diff) |
Bluetooth: Move more vars to struct l2cap_chan
In this commit, psm, scid and dcid.
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
-rw-r--r-- | include/net/bluetooth/l2cap.h | 10 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 116 | ||||
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 26 |
3 files changed, 77 insertions, 75 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 7522835c24ee..fd199cda752c 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
@@ -284,6 +284,9 @@ struct srej_list { | |||
284 | 284 | ||
285 | struct l2cap_chan { | 285 | struct l2cap_chan { |
286 | struct sock *sk; | 286 | struct sock *sk; |
287 | __le16 psm; | ||
288 | __u16 dcid; | ||
289 | __u16 scid; | ||
287 | 290 | ||
288 | __u16 imtu; | 291 | __u16 imtu; |
289 | __u16 omtu; | 292 | __u16 omtu; |
@@ -382,9 +385,6 @@ struct l2cap_conn { | |||
382 | 385 | ||
383 | struct l2cap_pinfo { | 386 | struct l2cap_pinfo { |
384 | struct bt_sock bt; | 387 | struct bt_sock bt; |
385 | __le16 psm; | ||
386 | __u16 dcid; | ||
387 | __u16 scid; | ||
388 | 388 | ||
389 | struct l2cap_conn *conn; | 389 | struct l2cap_conn *conn; |
390 | struct l2cap_chan *chan; | 390 | struct l2cap_chan *chan; |
@@ -450,8 +450,8 @@ void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *d | |||
450 | void __l2cap_connect_rsp_defer(struct sock *sk); | 450 | void __l2cap_connect_rsp_defer(struct sock *sk); |
451 | int __l2cap_wait_ack(struct sock *sk); | 451 | int __l2cap_wait_ack(struct sock *sk); |
452 | 452 | ||
453 | struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, size_t len); | 453 | struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len); |
454 | struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size_t len); | 454 | struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len); |
455 | struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len, u16 control, u16 sdulen); | 455 | struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len, u16 control, u16 sdulen); |
456 | int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len); | 456 | int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len); |
457 | void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb); | 457 | void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb); |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 7b06375d05a7..dd726bdd6e02 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -80,8 +80,7 @@ static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn, u16 | |||
80 | struct l2cap_chan *c; | 80 | struct l2cap_chan *c; |
81 | 81 | ||
82 | list_for_each_entry(c, &conn->chan_l, list) { | 82 | list_for_each_entry(c, &conn->chan_l, list) { |
83 | struct sock *s = c->sk; | 83 | if (c->dcid == cid) |
84 | if (l2cap_pi(s)->dcid == cid) | ||
85 | return c; | 84 | return c; |
86 | } | 85 | } |
87 | return NULL; | 86 | return NULL; |
@@ -93,8 +92,7 @@ static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn, u16 | |||
93 | struct l2cap_chan *c; | 92 | struct l2cap_chan *c; |
94 | 93 | ||
95 | list_for_each_entry(c, &conn->chan_l, list) { | 94 | list_for_each_entry(c, &conn->chan_l, list) { |
96 | struct sock *s = c->sk; | 95 | if (c->scid == cid) |
97 | if (l2cap_pi(s)->scid == cid) | ||
98 | return c; | 96 | return c; |
99 | } | 97 | } |
100 | return NULL; | 98 | return NULL; |
@@ -167,7 +165,7 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) | |||
167 | struct sock *sk = chan->sk; | 165 | struct sock *sk = chan->sk; |
168 | 166 | ||
169 | BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn, | 167 | BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn, |
170 | l2cap_pi(sk)->psm, l2cap_pi(sk)->dcid); | 168 | chan->psm, chan->dcid); |
171 | 169 | ||
172 | conn->disc_reason = 0x13; | 170 | conn->disc_reason = 0x13; |
173 | 171 | ||
@@ -177,22 +175,22 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) | |||
177 | if (conn->hcon->type == LE_LINK) { | 175 | if (conn->hcon->type == LE_LINK) { |
178 | /* LE connection */ | 176 | /* LE connection */ |
179 | chan->omtu = L2CAP_LE_DEFAULT_MTU; | 177 | chan->omtu = L2CAP_LE_DEFAULT_MTU; |
180 | l2cap_pi(sk)->scid = L2CAP_CID_LE_DATA; | 178 | chan->scid = L2CAP_CID_LE_DATA; |
181 | l2cap_pi(sk)->dcid = L2CAP_CID_LE_DATA; | 179 | chan->dcid = L2CAP_CID_LE_DATA; |
182 | } else { | 180 | } else { |
183 | /* Alloc CID for connection-oriented socket */ | 181 | /* Alloc CID for connection-oriented socket */ |
184 | l2cap_pi(sk)->scid = l2cap_alloc_cid(conn); | 182 | chan->scid = l2cap_alloc_cid(conn); |
185 | chan->omtu = L2CAP_DEFAULT_MTU; | 183 | chan->omtu = L2CAP_DEFAULT_MTU; |
186 | } | 184 | } |
187 | } else if (sk->sk_type == SOCK_DGRAM) { | 185 | } else if (sk->sk_type == SOCK_DGRAM) { |
188 | /* Connectionless socket */ | 186 | /* Connectionless socket */ |
189 | l2cap_pi(sk)->scid = L2CAP_CID_CONN_LESS; | 187 | chan->scid = L2CAP_CID_CONN_LESS; |
190 | l2cap_pi(sk)->dcid = L2CAP_CID_CONN_LESS; | 188 | chan->dcid = L2CAP_CID_CONN_LESS; |
191 | chan->omtu = L2CAP_DEFAULT_MTU; | 189 | chan->omtu = L2CAP_DEFAULT_MTU; |
192 | } else { | 190 | } else { |
193 | /* Raw socket can send/recv signalling messages only */ | 191 | /* Raw socket can send/recv signalling messages only */ |
194 | l2cap_pi(sk)->scid = L2CAP_CID_SIGNALING; | 192 | chan->scid = L2CAP_CID_SIGNALING; |
195 | l2cap_pi(sk)->dcid = L2CAP_CID_SIGNALING; | 193 | chan->dcid = L2CAP_CID_SIGNALING; |
196 | chan->omtu = L2CAP_DEFAULT_MTU; | 194 | chan->omtu = L2CAP_DEFAULT_MTU; |
197 | } | 195 | } |
198 | 196 | ||
@@ -275,7 +273,7 @@ static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan) | |||
275 | default: | 273 | default: |
276 | return HCI_AT_NO_BONDING; | 274 | return HCI_AT_NO_BONDING; |
277 | } | 275 | } |
278 | } else if (l2cap_pi(sk)->psm == cpu_to_le16(0x0001)) { | 276 | } else if (chan->psm == cpu_to_le16(0x0001)) { |
279 | if (chan->sec_level == BT_SECURITY_LOW) | 277 | if (chan->sec_level == BT_SECURITY_LOW) |
280 | chan->sec_level = BT_SECURITY_SDP; | 278 | chan->sec_level = BT_SECURITY_SDP; |
281 | 279 | ||
@@ -383,7 +381,7 @@ static inline void l2cap_send_sframe(struct l2cap_chan *chan, u16 control) | |||
383 | 381 | ||
384 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); | 382 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); |
385 | lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE); | 383 | lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE); |
386 | lh->cid = cpu_to_le16(pi->dcid); | 384 | lh->cid = cpu_to_le16(chan->dcid); |
387 | put_unaligned_le16(control, skb_put(skb, 2)); | 385 | put_unaligned_le16(control, skb_put(skb, 2)); |
388 | 386 | ||
389 | if (chan->fcs == L2CAP_FCS_CRC16) { | 387 | if (chan->fcs == L2CAP_FCS_CRC16) { |
@@ -429,8 +427,8 @@ static void l2cap_do_start(struct l2cap_chan *chan) | |||
429 | if (l2cap_check_security(chan) && | 427 | if (l2cap_check_security(chan) && |
430 | __l2cap_no_conn_pending(chan)) { | 428 | __l2cap_no_conn_pending(chan)) { |
431 | struct l2cap_conn_req req; | 429 | struct l2cap_conn_req req; |
432 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 430 | req.scid = cpu_to_le16(chan->scid); |
433 | req.psm = l2cap_pi(sk)->psm; | 431 | req.psm = chan->psm; |
434 | 432 | ||
435 | chan->ident = l2cap_get_ident(conn); | 433 | chan->ident = l2cap_get_ident(conn); |
436 | chan->conf_state |= L2CAP_CONF_CONNECT_PEND; | 434 | chan->conf_state |= L2CAP_CONF_CONNECT_PEND; |
@@ -485,8 +483,8 @@ void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, in | |||
485 | del_timer(&chan->ack_timer); | 483 | del_timer(&chan->ack_timer); |
486 | } | 484 | } |
487 | 485 | ||
488 | req.dcid = cpu_to_le16(l2cap_pi(sk)->dcid); | 486 | req.dcid = cpu_to_le16(chan->dcid); |
489 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 487 | req.scid = cpu_to_le16(chan->scid); |
490 | l2cap_send_cmd(conn, l2cap_get_ident(conn), | 488 | l2cap_send_cmd(conn, l2cap_get_ident(conn), |
491 | L2CAP_DISCONN_REQ, sizeof(req), &req); | 489 | L2CAP_DISCONN_REQ, sizeof(req), &req); |
492 | 490 | ||
@@ -536,8 +534,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
536 | continue; | 534 | continue; |
537 | } | 535 | } |
538 | 536 | ||
539 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 537 | req.scid = cpu_to_le16(chan->scid); |
540 | req.psm = l2cap_pi(sk)->psm; | 538 | req.psm = chan->psm; |
541 | 539 | ||
542 | chan->ident = l2cap_get_ident(conn); | 540 | chan->ident = l2cap_get_ident(conn); |
543 | chan->conf_state |= L2CAP_CONF_CONNECT_PEND; | 541 | chan->conf_state |= L2CAP_CONF_CONNECT_PEND; |
@@ -548,8 +546,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
548 | } else if (sk->sk_state == BT_CONNECT2) { | 546 | } else if (sk->sk_state == BT_CONNECT2) { |
549 | struct l2cap_conn_rsp rsp; | 547 | struct l2cap_conn_rsp rsp; |
550 | char buf[128]; | 548 | char buf[128]; |
551 | rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 549 | rsp.scid = cpu_to_le16(chan->dcid); |
552 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | 550 | rsp.dcid = cpu_to_le16(chan->scid); |
553 | 551 | ||
554 | if (l2cap_check_security(chan)) { | 552 | if (l2cap_check_security(chan)) { |
555 | if (bt_sk(sk)->defer_setup) { | 553 | if (bt_sk(sk)->defer_setup) { |
@@ -600,10 +598,12 @@ static struct sock *l2cap_get_sock_by_scid(int state, __le16 cid, bdaddr_t *src) | |||
600 | read_lock(&l2cap_sk_list.lock); | 598 | read_lock(&l2cap_sk_list.lock); |
601 | 599 | ||
602 | sk_for_each(sk, node, &l2cap_sk_list.head) { | 600 | sk_for_each(sk, node, &l2cap_sk_list.head) { |
601 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
602 | |||
603 | if (state && sk->sk_state != state) | 603 | if (state && sk->sk_state != state) |
604 | continue; | 604 | continue; |
605 | 605 | ||
606 | if (l2cap_pi(sk)->scid == cid) { | 606 | if (chan->scid == cid) { |
607 | /* Exact match. */ | 607 | /* Exact match. */ |
608 | if (!bacmp(&bt_sk(sk)->src, src)) | 608 | if (!bacmp(&bt_sk(sk)->src, src)) |
609 | break; | 609 | break; |
@@ -830,10 +830,12 @@ static struct sock *l2cap_get_sock_by_psm(int state, __le16 psm, bdaddr_t *src) | |||
830 | read_lock(&l2cap_sk_list.lock); | 830 | read_lock(&l2cap_sk_list.lock); |
831 | 831 | ||
832 | sk_for_each(sk, node, &l2cap_sk_list.head) { | 832 | sk_for_each(sk, node, &l2cap_sk_list.head) { |
833 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
834 | |||
833 | if (state && sk->sk_state != state) | 835 | if (state && sk->sk_state != state) |
834 | continue; | 836 | continue; |
835 | 837 | ||
836 | if (l2cap_pi(sk)->psm == psm) { | 838 | if (chan->psm == psm) { |
837 | /* Exact match. */ | 839 | /* Exact match. */ |
838 | if (!bacmp(&bt_sk(sk)->src, src)) | 840 | if (!bacmp(&bt_sk(sk)->src, src)) |
839 | break; | 841 | break; |
@@ -861,7 +863,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan) | |||
861 | int err; | 863 | int err; |
862 | 864 | ||
863 | BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst), | 865 | BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst), |
864 | l2cap_pi(sk)->psm); | 866 | chan->psm); |
865 | 867 | ||
866 | hdev = hci_get_route(dst, src); | 868 | hdev = hci_get_route(dst, src); |
867 | if (!hdev) | 869 | if (!hdev) |
@@ -871,7 +873,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan) | |||
871 | 873 | ||
872 | auth_type = l2cap_get_auth_type(chan); | 874 | auth_type = l2cap_get_auth_type(chan); |
873 | 875 | ||
874 | if (l2cap_pi(sk)->dcid == L2CAP_CID_LE_DATA) | 876 | if (chan->dcid == L2CAP_CID_LE_DATA) |
875 | hcon = hci_connect(hdev, LE_LINK, dst, | 877 | hcon = hci_connect(hdev, LE_LINK, dst, |
876 | chan->sec_level, auth_type); | 878 | chan->sec_level, auth_type); |
877 | else | 879 | else |
@@ -1231,8 +1233,9 @@ static inline int l2cap_skbuff_fromiovec(struct sock *sk, struct msghdr *msg, in | |||
1231 | return sent; | 1233 | return sent; |
1232 | } | 1234 | } |
1233 | 1235 | ||
1234 | struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, size_t len) | 1236 | struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len) |
1235 | { | 1237 | { |
1238 | struct sock *sk = chan->sk; | ||
1236 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 1239 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; |
1237 | struct sk_buff *skb; | 1240 | struct sk_buff *skb; |
1238 | int err, count, hlen = L2CAP_HDR_SIZE + 2; | 1241 | int err, count, hlen = L2CAP_HDR_SIZE + 2; |
@@ -1248,9 +1251,9 @@ struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, s | |||
1248 | 1251 | ||
1249 | /* Create L2CAP header */ | 1252 | /* Create L2CAP header */ |
1250 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); | 1253 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); |
1251 | lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid); | 1254 | lh->cid = cpu_to_le16(chan->dcid); |
1252 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); | 1255 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); |
1253 | put_unaligned_le16(l2cap_pi(sk)->psm, skb_put(skb, 2)); | 1256 | put_unaligned_le16(chan->psm, skb_put(skb, 2)); |
1254 | 1257 | ||
1255 | err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb); | 1258 | err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb); |
1256 | if (unlikely(err < 0)) { | 1259 | if (unlikely(err < 0)) { |
@@ -1260,8 +1263,9 @@ struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, s | |||
1260 | return skb; | 1263 | return skb; |
1261 | } | 1264 | } |
1262 | 1265 | ||
1263 | struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size_t len) | 1266 | struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len) |
1264 | { | 1267 | { |
1268 | struct sock *sk = chan->sk; | ||
1265 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 1269 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; |
1266 | struct sk_buff *skb; | 1270 | struct sk_buff *skb; |
1267 | int err, count, hlen = L2CAP_HDR_SIZE; | 1271 | int err, count, hlen = L2CAP_HDR_SIZE; |
@@ -1277,7 +1281,7 @@ struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size | |||
1277 | 1281 | ||
1278 | /* Create L2CAP header */ | 1282 | /* Create L2CAP header */ |
1279 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); | 1283 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); |
1280 | lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid); | 1284 | lh->cid = cpu_to_le16(chan->dcid); |
1281 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); | 1285 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); |
1282 | 1286 | ||
1283 | err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb); | 1287 | err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb); |
@@ -1315,7 +1319,7 @@ struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan, struct msghdr * | |||
1315 | 1319 | ||
1316 | /* Create L2CAP header */ | 1320 | /* Create L2CAP header */ |
1317 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); | 1321 | lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); |
1318 | lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid); | 1322 | lh->cid = cpu_to_le16(chan->dcid); |
1319 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); | 1323 | lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); |
1320 | put_unaligned_le16(control, skb_put(skb, 2)); | 1324 | put_unaligned_le16(control, skb_put(skb, 2)); |
1321 | if (sdulen) | 1325 | if (sdulen) |
@@ -1697,7 +1701,7 @@ done: | |||
1697 | break; | 1701 | break; |
1698 | } | 1702 | } |
1699 | 1703 | ||
1700 | req->dcid = cpu_to_le16(pi->dcid); | 1704 | req->dcid = cpu_to_le16(chan->dcid); |
1701 | req->flags = cpu_to_le16(0); | 1705 | req->flags = cpu_to_le16(0); |
1702 | 1706 | ||
1703 | return ptr - data; | 1707 | return ptr - data; |
@@ -1850,7 +1854,7 @@ done: | |||
1850 | if (result == L2CAP_CONF_SUCCESS) | 1854 | if (result == L2CAP_CONF_SUCCESS) |
1851 | chan->conf_state |= L2CAP_CONF_OUTPUT_DONE; | 1855 | chan->conf_state |= L2CAP_CONF_OUTPUT_DONE; |
1852 | } | 1856 | } |
1853 | rsp->scid = cpu_to_le16(pi->dcid); | 1857 | rsp->scid = cpu_to_le16(chan->dcid); |
1854 | rsp->result = cpu_to_le16(result); | 1858 | rsp->result = cpu_to_le16(result); |
1855 | rsp->flags = cpu_to_le16(0x0000); | 1859 | rsp->flags = cpu_to_le16(0x0000); |
1856 | 1860 | ||
@@ -1859,15 +1863,13 @@ done: | |||
1859 | 1863 | ||
1860 | static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, void *data, u16 *result) | 1864 | static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, void *data, u16 *result) |
1861 | { | 1865 | { |
1862 | struct sock *sk = chan->sk; | ||
1863 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
1864 | struct l2cap_conf_req *req = data; | 1866 | struct l2cap_conf_req *req = data; |
1865 | void *ptr = req->data; | 1867 | void *ptr = req->data; |
1866 | int type, olen; | 1868 | int type, olen; |
1867 | unsigned long val; | 1869 | unsigned long val; |
1868 | struct l2cap_conf_rfc rfc; | 1870 | struct l2cap_conf_rfc rfc; |
1869 | 1871 | ||
1870 | BT_DBG("sk %p, rsp %p, len %d, req %p", sk, rsp, len, data); | 1872 | BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data); |
1871 | 1873 | ||
1872 | while (len >= L2CAP_CONF_OPT_SIZE) { | 1874 | while (len >= L2CAP_CONF_OPT_SIZE) { |
1873 | len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val); | 1875 | len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val); |
@@ -1921,20 +1923,20 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, voi | |||
1921 | } | 1923 | } |
1922 | } | 1924 | } |
1923 | 1925 | ||
1924 | req->dcid = cpu_to_le16(pi->dcid); | 1926 | req->dcid = cpu_to_le16(chan->dcid); |
1925 | req->flags = cpu_to_le16(0x0000); | 1927 | req->flags = cpu_to_le16(0x0000); |
1926 | 1928 | ||
1927 | return ptr - data; | 1929 | return ptr - data; |
1928 | } | 1930 | } |
1929 | 1931 | ||
1930 | static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 flags) | 1932 | static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data, u16 result, u16 flags) |
1931 | { | 1933 | { |
1932 | struct l2cap_conf_rsp *rsp = data; | 1934 | struct l2cap_conf_rsp *rsp = data; |
1933 | void *ptr = rsp->data; | 1935 | void *ptr = rsp->data; |
1934 | 1936 | ||
1935 | BT_DBG("sk %p", sk); | 1937 | BT_DBG("chan %p", chan); |
1936 | 1938 | ||
1937 | rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 1939 | rsp->scid = cpu_to_le16(chan->dcid); |
1938 | rsp->result = cpu_to_le16(result); | 1940 | rsp->result = cpu_to_le16(result); |
1939 | rsp->flags = cpu_to_le16(flags); | 1941 | rsp->flags = cpu_to_le16(flags); |
1940 | 1942 | ||
@@ -1950,8 +1952,8 @@ void __l2cap_connect_rsp_defer(struct sock *sk) | |||
1950 | 1952 | ||
1951 | sk->sk_state = BT_CONFIG; | 1953 | sk->sk_state = BT_CONFIG; |
1952 | 1954 | ||
1953 | rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 1955 | rsp.scid = cpu_to_le16(chan->dcid); |
1954 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | 1956 | rsp.dcid = cpu_to_le16(chan->scid); |
1955 | rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS); | 1957 | rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS); |
1956 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); | 1958 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); |
1957 | l2cap_send_cmd(conn, chan->ident, | 1959 | l2cap_send_cmd(conn, chan->ident, |
@@ -2085,14 +2087,14 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2085 | l2cap_sock_init(sk, parent); | 2087 | l2cap_sock_init(sk, parent); |
2086 | bacpy(&bt_sk(sk)->src, conn->src); | 2088 | bacpy(&bt_sk(sk)->src, conn->src); |
2087 | bacpy(&bt_sk(sk)->dst, conn->dst); | 2089 | bacpy(&bt_sk(sk)->dst, conn->dst); |
2088 | l2cap_pi(sk)->psm = psm; | 2090 | chan->psm = psm; |
2089 | l2cap_pi(sk)->dcid = scid; | 2091 | chan->dcid = scid; |
2090 | 2092 | ||
2091 | bt_accept_enqueue(parent, sk); | 2093 | bt_accept_enqueue(parent, sk); |
2092 | 2094 | ||
2093 | __l2cap_chan_add(conn, chan); | 2095 | __l2cap_chan_add(conn, chan); |
2094 | 2096 | ||
2095 | dcid = l2cap_pi(sk)->scid; | 2097 | dcid = chan->scid; |
2096 | 2098 | ||
2097 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); | 2099 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); |
2098 | 2100 | ||
@@ -2190,7 +2192,7 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2190 | case L2CAP_CR_SUCCESS: | 2192 | case L2CAP_CR_SUCCESS: |
2191 | sk->sk_state = BT_CONFIG; | 2193 | sk->sk_state = BT_CONFIG; |
2192 | chan->ident = 0; | 2194 | chan->ident = 0; |
2193 | l2cap_pi(sk)->dcid = dcid; | 2195 | chan->dcid = dcid; |
2194 | chan->conf_state &= ~L2CAP_CONF_CONNECT_PEND; | 2196 | chan->conf_state &= ~L2CAP_CONF_CONNECT_PEND; |
2195 | 2197 | ||
2196 | if (chan->conf_state & L2CAP_CONF_REQ_SENT) | 2198 | if (chan->conf_state & L2CAP_CONF_REQ_SENT) |
@@ -2270,7 +2272,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2270 | len = cmd_len - sizeof(*req); | 2272 | len = cmd_len - sizeof(*req); |
2271 | if (chan->conf_len + len > sizeof(chan->conf_req)) { | 2273 | if (chan->conf_len + len > sizeof(chan->conf_req)) { |
2272 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, | 2274 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, |
2273 | l2cap_build_conf_rsp(sk, rsp, | 2275 | l2cap_build_conf_rsp(chan, rsp, |
2274 | L2CAP_CONF_REJECT, flags), rsp); | 2276 | L2CAP_CONF_REJECT, flags), rsp); |
2275 | goto unlock; | 2277 | goto unlock; |
2276 | } | 2278 | } |
@@ -2282,7 +2284,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2282 | if (flags & 0x0001) { | 2284 | if (flags & 0x0001) { |
2283 | /* Incomplete config. Send empty response. */ | 2285 | /* Incomplete config. Send empty response. */ |
2284 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, | 2286 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, |
2285 | l2cap_build_conf_rsp(sk, rsp, | 2287 | l2cap_build_conf_rsp(chan, rsp, |
2286 | L2CAP_CONF_SUCCESS, 0x0001), rsp); | 2288 | L2CAP_CONF_SUCCESS, 0x0001), rsp); |
2287 | goto unlock; | 2289 | goto unlock; |
2288 | } | 2290 | } |
@@ -2432,8 +2434,8 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd | |||
2432 | 2434 | ||
2433 | sk = chan->sk; | 2435 | sk = chan->sk; |
2434 | 2436 | ||
2435 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | 2437 | rsp.dcid = cpu_to_le16(chan->scid); |
2436 | rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 2438 | rsp.scid = cpu_to_le16(chan->dcid); |
2437 | l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp); | 2439 | l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp); |
2438 | 2440 | ||
2439 | sk->sk_shutdown = SHUTDOWN_MASK; | 2441 | sk->sk_shutdown = SHUTDOWN_MASK; |
@@ -3920,8 +3922,8 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
3920 | if (sk->sk_state == BT_CONNECT) { | 3922 | if (sk->sk_state == BT_CONNECT) { |
3921 | if (!status) { | 3923 | if (!status) { |
3922 | struct l2cap_conn_req req; | 3924 | struct l2cap_conn_req req; |
3923 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 3925 | req.scid = cpu_to_le16(chan->scid); |
3924 | req.psm = l2cap_pi(sk)->psm; | 3926 | req.psm = chan->psm; |
3925 | 3927 | ||
3926 | chan->ident = l2cap_get_ident(conn); | 3928 | chan->ident = l2cap_get_ident(conn); |
3927 | chan->conf_state |= L2CAP_CONF_CONNECT_PEND; | 3929 | chan->conf_state |= L2CAP_CONF_CONNECT_PEND; |
@@ -3945,8 +3947,8 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
3945 | result = L2CAP_CR_SEC_BLOCK; | 3947 | result = L2CAP_CR_SEC_BLOCK; |
3946 | } | 3948 | } |
3947 | 3949 | ||
3948 | rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 3950 | rsp.scid = cpu_to_le16(chan->dcid); |
3949 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | 3951 | rsp.dcid = cpu_to_le16(chan->scid); |
3950 | rsp.result = cpu_to_le16(result); | 3952 | rsp.result = cpu_to_le16(result); |
3951 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); | 3953 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); |
3952 | l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, | 3954 | l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, |
@@ -4086,8 +4088,8 @@ static int l2cap_debugfs_show(struct seq_file *f, void *p) | |||
4086 | seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n", | 4088 | seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n", |
4087 | batostr(&bt_sk(sk)->src), | 4089 | batostr(&bt_sk(sk)->src), |
4088 | batostr(&bt_sk(sk)->dst), | 4090 | batostr(&bt_sk(sk)->dst), |
4089 | sk->sk_state, __le16_to_cpu(pi->psm), | 4091 | sk->sk_state, __le16_to_cpu(chan->psm), |
4090 | pi->scid, pi->dcid, | 4092 | chan->scid, chan->dcid, |
4091 | chan->imtu, chan->omtu, chan->sec_level, | 4093 | chan->imtu, chan->omtu, chan->sec_level, |
4092 | chan->mode); | 4094 | chan->mode); |
4093 | } | 4095 | } |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index eef33b179f02..f5a27737c151 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -141,7 +141,7 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) | |||
141 | } else { | 141 | } else { |
142 | /* Save source address */ | 142 | /* Save source address */ |
143 | bacpy(&bt_sk(sk)->src, &la.l2_bdaddr); | 143 | bacpy(&bt_sk(sk)->src, &la.l2_bdaddr); |
144 | l2cap_pi(sk)->psm = la.l2_psm; | 144 | chan->psm = la.l2_psm; |
145 | chan->sport = la.l2_psm; | 145 | chan->sport = la.l2_psm; |
146 | sk->sk_state = BT_BOUND; | 146 | sk->sk_state = BT_BOUND; |
147 | 147 | ||
@@ -151,7 +151,7 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) | |||
151 | } | 151 | } |
152 | 152 | ||
153 | if (la.l2_cid) | 153 | if (la.l2_cid) |
154 | l2cap_pi(sk)->scid = la.l2_cid; | 154 | chan->scid = la.l2_cid; |
155 | 155 | ||
156 | write_unlock_bh(&l2cap_sk_list.lock); | 156 | write_unlock_bh(&l2cap_sk_list.lock); |
157 | 157 | ||
@@ -232,8 +232,8 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al | |||
232 | 232 | ||
233 | /* Set destination address and psm */ | 233 | /* Set destination address and psm */ |
234 | bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr); | 234 | bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr); |
235 | l2cap_pi(sk)->psm = la.l2_psm; | 235 | chan->psm = la.l2_psm; |
236 | l2cap_pi(sk)->dcid = la.l2_cid; | 236 | chan->dcid = la.l2_cid; |
237 | 237 | ||
238 | err = l2cap_chan_connect(l2cap_pi(sk)->chan); | 238 | err = l2cap_chan_connect(l2cap_pi(sk)->chan); |
239 | if (err) | 239 | if (err) |
@@ -276,7 +276,7 @@ static int l2cap_sock_listen(struct socket *sock, int backlog) | |||
276 | goto done; | 276 | goto done; |
277 | } | 277 | } |
278 | 278 | ||
279 | if (!l2cap_pi(sk)->psm && !l2cap_pi(sk)->scid) { | 279 | if (!chan->psm && !chan->scid) { |
280 | bdaddr_t *src = &bt_sk(sk)->src; | 280 | bdaddr_t *src = &bt_sk(sk)->src; |
281 | u16 psm; | 281 | u16 psm; |
282 | 282 | ||
@@ -286,7 +286,7 @@ static int l2cap_sock_listen(struct socket *sock, int backlog) | |||
286 | 286 | ||
287 | for (psm = 0x1001; psm < 0x1100; psm += 2) | 287 | for (psm = 0x1001; psm < 0x1100; psm += 2) |
288 | if (!__l2cap_get_sock_by_addr(cpu_to_le16(psm), src)) { | 288 | if (!__l2cap_get_sock_by_addr(cpu_to_le16(psm), src)) { |
289 | l2cap_pi(sk)->psm = cpu_to_le16(psm); | 289 | chan->psm = cpu_to_le16(psm); |
290 | chan->sport = cpu_to_le16(psm); | 290 | chan->sport = cpu_to_le16(psm); |
291 | err = 0; | 291 | err = 0; |
292 | break; | 292 | break; |
@@ -375,13 +375,13 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *l | |||
375 | *len = sizeof(struct sockaddr_l2); | 375 | *len = sizeof(struct sockaddr_l2); |
376 | 376 | ||
377 | if (peer) { | 377 | if (peer) { |
378 | la->l2_psm = l2cap_pi(sk)->psm; | 378 | la->l2_psm = chan->psm; |
379 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst); | 379 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst); |
380 | la->l2_cid = cpu_to_le16(l2cap_pi(sk)->dcid); | 380 | la->l2_cid = cpu_to_le16(chan->dcid); |
381 | } else { | 381 | } else { |
382 | la->l2_psm = chan->sport; | 382 | la->l2_psm = chan->sport; |
383 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->src); | 383 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->src); |
384 | la->l2_cid = cpu_to_le16(l2cap_pi(sk)->scid); | 384 | la->l2_cid = cpu_to_le16(chan->scid); |
385 | } | 385 | } |
386 | 386 | ||
387 | return 0; | 387 | return 0; |
@@ -737,7 +737,7 @@ static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct ms | |||
737 | 737 | ||
738 | /* Connectionless channel */ | 738 | /* Connectionless channel */ |
739 | if (sk->sk_type == SOCK_DGRAM) { | 739 | if (sk->sk_type == SOCK_DGRAM) { |
740 | skb = l2cap_create_connless_pdu(sk, msg, len); | 740 | skb = l2cap_create_connless_pdu(chan, msg, len); |
741 | if (IS_ERR(skb)) { | 741 | if (IS_ERR(skb)) { |
742 | err = PTR_ERR(skb); | 742 | err = PTR_ERR(skb); |
743 | } else { | 743 | } else { |
@@ -756,7 +756,7 @@ static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct ms | |||
756 | } | 756 | } |
757 | 757 | ||
758 | /* Create a basic PDU */ | 758 | /* Create a basic PDU */ |
759 | skb = l2cap_create_basic_pdu(sk, msg, len); | 759 | skb = l2cap_create_basic_pdu(chan, msg, len); |
760 | if (IS_ERR(skb)) { | 760 | if (IS_ERR(skb)) { |
761 | err = PTR_ERR(skb); | 761 | err = PTR_ERR(skb); |
762 | goto done; | 762 | goto done; |
@@ -911,8 +911,8 @@ void __l2cap_sock_close(struct sock *sk, int reason) | |||
911 | else | 911 | else |
912 | result = L2CAP_CR_BAD_PSM; | 912 | result = L2CAP_CR_BAD_PSM; |
913 | 913 | ||
914 | rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 914 | rsp.scid = cpu_to_le16(chan->dcid); |
915 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | 915 | rsp.dcid = cpu_to_le16(chan->scid); |
916 | rsp.result = cpu_to_le16(result); | 916 | rsp.result = cpu_to_le16(result); |
917 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); | 917 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); |
918 | l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, | 918 | l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, |