aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorGustavo F. Padovan <padovan@profusion.mobi>2011-04-12 17:15:09 -0400
committerGustavo F. Padovan <padovan@profusion.mobi>2011-04-27 17:51:34 -0400
commitb44500351845e4f6df0d752a8870da246be8216f (patch)
tree3f0faf668af01c72c408be1eea043c73bff2c0b9 /net/bluetooth
parent5d41ce1dd91bce01d50aff79786dc5d5eedcfab7 (diff)
Bluetooth: Move conf_state to struct l2cap_chan
First move of elements depending on user data. Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Diffstat (limited to 'net/bluetooth')
-rw-r--r--net/bluetooth/l2cap_core.c88
-rw-r--r--net/bluetooth/l2cap_sock.c10
2 files changed, 52 insertions, 46 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 4b857adc536..190b04960da 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -236,8 +236,8 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err)
236 } else 236 } else
237 sk->sk_state_change(sk); 237 sk->sk_state_change(sk);
238 238
239 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE && 239 if (!(chan->conf_state & L2CAP_CONF_OUTPUT_DONE &&
240 l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE)) 240 chan->conf_state & L2CAP_CONF_INPUT_DONE))
241 goto free; 241 goto free;
242 242
243 skb_queue_purge(&chan->tx_q); 243 skb_queue_purge(&chan->tx_q);
@@ -411,9 +411,9 @@ static inline void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, u16 control)
411 l2cap_send_sframe(chan, control); 411 l2cap_send_sframe(chan, control);
412} 412}
413 413
414static inline int __l2cap_no_conn_pending(struct sock *sk) 414static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
415{ 415{
416 return !(l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND); 416 return !(chan->conf_state & L2CAP_CONF_CONNECT_PEND);
417} 417}
418 418
419static void l2cap_do_start(struct l2cap_chan *chan) 419static void l2cap_do_start(struct l2cap_chan *chan)
@@ -425,13 +425,13 @@ static void l2cap_do_start(struct l2cap_chan *chan)
425 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)) 425 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
426 return; 426 return;
427 427
428 if (l2cap_check_security(sk) && __l2cap_no_conn_pending(sk)) { 428 if (l2cap_check_security(sk) && __l2cap_no_conn_pending(chan)) {
429 struct l2cap_conn_req req; 429 struct l2cap_conn_req req;
430 req.scid = cpu_to_le16(l2cap_pi(sk)->scid); 430 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
431 req.psm = l2cap_pi(sk)->psm; 431 req.psm = l2cap_pi(sk)->psm;
432 432
433 chan->ident = l2cap_get_ident(conn); 433 chan->ident = l2cap_get_ident(conn);
434 l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; 434 chan->conf_state |= L2CAP_CONF_CONNECT_PEND;
435 435
436 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, 436 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ,
437 sizeof(req), &req); 437 sizeof(req), &req);
@@ -516,14 +516,14 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
516 struct l2cap_conn_req req; 516 struct l2cap_conn_req req;
517 517
518 if (!l2cap_check_security(sk) || 518 if (!l2cap_check_security(sk) ||
519 !__l2cap_no_conn_pending(sk)) { 519 !__l2cap_no_conn_pending(chan)) {
520 bh_unlock_sock(sk); 520 bh_unlock_sock(sk);
521 continue; 521 continue;
522 } 522 }
523 523
524 if (!l2cap_mode_supported(l2cap_pi(sk)->mode, 524 if (!l2cap_mode_supported(l2cap_pi(sk)->mode,
525 conn->feat_mask) 525 conn->feat_mask)
526 && l2cap_pi(sk)->conf_state & 526 && chan->conf_state &
527 L2CAP_CONF_STATE2_DEVICE) { 527 L2CAP_CONF_STATE2_DEVICE) {
528 /* __l2cap_sock_close() calls list_del(chan) 528 /* __l2cap_sock_close() calls list_del(chan)
529 * so release the lock */ 529 * so release the lock */
@@ -538,7 +538,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
538 req.psm = l2cap_pi(sk)->psm; 538 req.psm = l2cap_pi(sk)->psm;
539 539
540 chan->ident = l2cap_get_ident(conn); 540 chan->ident = l2cap_get_ident(conn);
541 l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; 541 chan->conf_state |= L2CAP_CONF_CONNECT_PEND;
542 542
543 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, 543 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ,
544 sizeof(req), &req); 544 sizeof(req), &req);
@@ -569,13 +569,13 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
569 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, 569 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
570 sizeof(rsp), &rsp); 570 sizeof(rsp), &rsp);
571 571
572 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT || 572 if (chan->conf_state & L2CAP_CONF_REQ_SENT ||
573 rsp.result != L2CAP_CR_SUCCESS) { 573 rsp.result != L2CAP_CR_SUCCESS) {
574 bh_unlock_sock(sk); 574 bh_unlock_sock(sk);
575 continue; 575 continue;
576 } 576 }
577 577
578 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; 578 chan->conf_state |= L2CAP_CONF_REQ_SENT;
579 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, 579 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
580 l2cap_build_conf_req(chan, buf), buf); 580 l2cap_build_conf_req(chan, buf), buf);
581 chan->num_conf_req++; 581 chan->num_conf_req++;
@@ -1382,10 +1382,11 @@ int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t le
1382static void l2cap_chan_ready(struct sock *sk) 1382static void l2cap_chan_ready(struct sock *sk)
1383{ 1383{
1384 struct sock *parent = bt_sk(sk)->parent; 1384 struct sock *parent = bt_sk(sk)->parent;
1385 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1385 1386
1386 BT_DBG("sk %p, parent %p", sk, parent); 1387 BT_DBG("sk %p, parent %p", sk, parent);
1387 1388
1388 l2cap_pi(sk)->conf_state = 0; 1389 chan->conf_state = 0;
1389 l2cap_sock_clear_timer(sk); 1390 l2cap_sock_clear_timer(sk);
1390 1391
1391 if (!parent) { 1392 if (!parent) {
@@ -1619,7 +1620,7 @@ static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
1619 switch (pi->mode) { 1620 switch (pi->mode) {
1620 case L2CAP_MODE_STREAMING: 1621 case L2CAP_MODE_STREAMING:
1621 case L2CAP_MODE_ERTM: 1622 case L2CAP_MODE_ERTM:
1622 if (pi->conf_state & L2CAP_CONF_STATE2_DEVICE) 1623 if (chan->conf_state & L2CAP_CONF_STATE2_DEVICE)
1623 break; 1624 break;
1624 1625
1625 /* fall through */ 1626 /* fall through */
@@ -1666,7 +1667,7 @@ done:
1666 break; 1667 break;
1667 1668
1668 if (pi->fcs == L2CAP_FCS_NONE || 1669 if (pi->fcs == L2CAP_FCS_NONE ||
1669 pi->conf_state & L2CAP_CONF_NO_FCS_RECV) { 1670 chan->conf_state & L2CAP_CONF_NO_FCS_RECV) {
1670 pi->fcs = L2CAP_FCS_NONE; 1671 pi->fcs = L2CAP_FCS_NONE;
1671 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, pi->fcs); 1672 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, pi->fcs);
1672 } 1673 }
@@ -1689,7 +1690,7 @@ done:
1689 break; 1690 break;
1690 1691
1691 if (pi->fcs == L2CAP_FCS_NONE || 1692 if (pi->fcs == L2CAP_FCS_NONE ||
1692 pi->conf_state & L2CAP_CONF_NO_FCS_RECV) { 1693 chan->conf_state & L2CAP_CONF_NO_FCS_RECV) {
1693 pi->fcs = L2CAP_FCS_NONE; 1694 pi->fcs = L2CAP_FCS_NONE;
1694 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, pi->fcs); 1695 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, pi->fcs);
1695 } 1696 }
@@ -1742,7 +1743,7 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
1742 1743
1743 case L2CAP_CONF_FCS: 1744 case L2CAP_CONF_FCS:
1744 if (val == L2CAP_FCS_NONE) 1745 if (val == L2CAP_FCS_NONE)
1745 pi->conf_state |= L2CAP_CONF_NO_FCS_RECV; 1746 chan->conf_state |= L2CAP_CONF_NO_FCS_RECV;
1746 1747
1747 break; 1748 break;
1748 1749
@@ -1762,7 +1763,7 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
1762 switch (pi->mode) { 1763 switch (pi->mode) {
1763 case L2CAP_MODE_STREAMING: 1764 case L2CAP_MODE_STREAMING:
1764 case L2CAP_MODE_ERTM: 1765 case L2CAP_MODE_ERTM:
1765 if (!(pi->conf_state & L2CAP_CONF_STATE2_DEVICE)) { 1766 if (!(chan->conf_state & L2CAP_CONF_STATE2_DEVICE)) {
1766 pi->mode = l2cap_select_mode(rfc.mode, 1767 pi->mode = l2cap_select_mode(rfc.mode,
1767 pi->conn->feat_mask); 1768 pi->conn->feat_mask);
1768 break; 1769 break;
@@ -1795,14 +1796,14 @@ done:
1795 result = L2CAP_CONF_UNACCEPT; 1796 result = L2CAP_CONF_UNACCEPT;
1796 else { 1797 else {
1797 pi->omtu = mtu; 1798 pi->omtu = mtu;
1798 pi->conf_state |= L2CAP_CONF_MTU_DONE; 1799 chan->conf_state |= L2CAP_CONF_MTU_DONE;
1799 } 1800 }
1800 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu); 1801 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu);
1801 1802
1802 switch (rfc.mode) { 1803 switch (rfc.mode) {
1803 case L2CAP_MODE_BASIC: 1804 case L2CAP_MODE_BASIC:
1804 pi->fcs = L2CAP_FCS_NONE; 1805 pi->fcs = L2CAP_FCS_NONE;
1805 pi->conf_state |= L2CAP_CONF_MODE_DONE; 1806 chan->conf_state |= L2CAP_CONF_MODE_DONE;
1806 break; 1807 break;
1807 1808
1808 case L2CAP_MODE_ERTM: 1809 case L2CAP_MODE_ERTM:
@@ -1819,7 +1820,7 @@ done:
1819 rfc.monitor_timeout = 1820 rfc.monitor_timeout =
1820 le16_to_cpu(L2CAP_DEFAULT_MONITOR_TO); 1821 le16_to_cpu(L2CAP_DEFAULT_MONITOR_TO);
1821 1822
1822 pi->conf_state |= L2CAP_CONF_MODE_DONE; 1823 chan->conf_state |= L2CAP_CONF_MODE_DONE;
1823 1824
1824 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, 1825 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
1825 sizeof(rfc), (unsigned long) &rfc); 1826 sizeof(rfc), (unsigned long) &rfc);
@@ -1832,7 +1833,7 @@ done:
1832 1833
1833 chan->remote_mps = le16_to_cpu(rfc.max_pdu_size); 1834 chan->remote_mps = le16_to_cpu(rfc.max_pdu_size);
1834 1835
1835 pi->conf_state |= L2CAP_CONF_MODE_DONE; 1836 chan->conf_state |= L2CAP_CONF_MODE_DONE;
1836 1837
1837 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, 1838 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
1838 sizeof(rfc), (unsigned long) &rfc); 1839 sizeof(rfc), (unsigned long) &rfc);
@@ -1847,7 +1848,7 @@ done:
1847 } 1848 }
1848 1849
1849 if (result == L2CAP_CONF_SUCCESS) 1850 if (result == L2CAP_CONF_SUCCESS)
1850 pi->conf_state |= L2CAP_CONF_OUTPUT_DONE; 1851 chan->conf_state |= L2CAP_CONF_OUTPUT_DONE;
1851 } 1852 }
1852 rsp->scid = cpu_to_le16(pi->dcid); 1853 rsp->scid = cpu_to_le16(pi->dcid);
1853 rsp->result = cpu_to_le16(result); 1854 rsp->result = cpu_to_le16(result);
@@ -1856,8 +1857,9 @@ done:
1856 return ptr - data; 1857 return ptr - data;
1857} 1858}
1858 1859
1859static int l2cap_parse_conf_rsp(struct sock *sk, void *rsp, int len, void *data, u16 *result) 1860static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, void *data, u16 *result)
1860{ 1861{
1862 struct sock *sk = chan->sk;
1861 struct l2cap_pinfo *pi = l2cap_pi(sk); 1863 struct l2cap_pinfo *pi = l2cap_pi(sk);
1862 struct l2cap_conf_req *req = data; 1864 struct l2cap_conf_req *req = data;
1863 void *ptr = req->data; 1865 void *ptr = req->data;
@@ -1890,7 +1892,7 @@ static int l2cap_parse_conf_rsp(struct sock *sk, void *rsp, int len, void *data,
1890 if (olen == sizeof(rfc)) 1892 if (olen == sizeof(rfc))
1891 memcpy(&rfc, (void *)val, olen); 1893 memcpy(&rfc, (void *)val, olen);
1892 1894
1893 if ((pi->conf_state & L2CAP_CONF_STATE2_DEVICE) && 1895 if ((chan->conf_state & L2CAP_CONF_STATE2_DEVICE) &&
1894 rfc.mode != pi->mode) 1896 rfc.mode != pi->mode)
1895 return -ECONNREFUSED; 1897 return -ECONNREFUSED;
1896 1898
@@ -1955,10 +1957,10 @@ void __l2cap_connect_rsp_defer(struct sock *sk)
1955 l2cap_send_cmd(conn, chan->ident, 1957 l2cap_send_cmd(conn, chan->ident,
1956 L2CAP_CONN_RSP, sizeof(rsp), &rsp); 1958 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
1957 1959
1958 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) 1960 if (chan->conf_state & L2CAP_CONF_REQ_SENT)
1959 return; 1961 return;
1960 1962
1961 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; 1963 chan->conf_state |= L2CAP_CONF_REQ_SENT;
1962 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, 1964 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
1963 l2cap_build_conf_req(chan, buf), buf); 1965 l2cap_build_conf_req(chan, buf), buf);
1964 chan->num_conf_req++; 1966 chan->num_conf_req++;
@@ -2146,10 +2148,10 @@ sendresp:
2146 L2CAP_INFO_REQ, sizeof(info), &info); 2148 L2CAP_INFO_REQ, sizeof(info), &info);
2147 } 2149 }
2148 2150
2149 if (chan && !(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) && 2151 if (chan && !(chan->conf_state & L2CAP_CONF_REQ_SENT) &&
2150 result == L2CAP_CR_SUCCESS) { 2152 result == L2CAP_CR_SUCCESS) {
2151 u8 buf[128]; 2153 u8 buf[128];
2152 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; 2154 chan->conf_state |= L2CAP_CONF_REQ_SENT;
2153 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, 2155 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
2154 l2cap_build_conf_req(chan, buf), buf); 2156 l2cap_build_conf_req(chan, buf), buf);
2155 chan->num_conf_req++; 2157 chan->num_conf_req++;
@@ -2190,12 +2192,12 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd
2190 sk->sk_state = BT_CONFIG; 2192 sk->sk_state = BT_CONFIG;
2191 chan->ident = 0; 2193 chan->ident = 0;
2192 l2cap_pi(sk)->dcid = dcid; 2194 l2cap_pi(sk)->dcid = dcid;
2193 l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND; 2195 chan->conf_state &= ~L2CAP_CONF_CONNECT_PEND;
2194 2196
2195 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) 2197 if (chan->conf_state & L2CAP_CONF_REQ_SENT)
2196 break; 2198 break;
2197 2199
2198 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; 2200 chan->conf_state |= L2CAP_CONF_REQ_SENT;
2199 2201
2200 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, 2202 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
2201 l2cap_build_conf_req(chan, req), req); 2203 l2cap_build_conf_req(chan, req), req);
@@ -2203,7 +2205,7 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd
2203 break; 2205 break;
2204 2206
2205 case L2CAP_CR_PEND: 2207 case L2CAP_CR_PEND:
2206 l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; 2208 chan->conf_state |= L2CAP_CONF_CONNECT_PEND;
2207 break; 2209 break;
2208 2210
2209 default: 2211 default:
@@ -2230,7 +2232,7 @@ static inline void set_default_fcs(struct l2cap_pinfo *pi)
2230 */ 2232 */
2231 if (pi->mode != L2CAP_MODE_ERTM && pi->mode != L2CAP_MODE_STREAMING) 2233 if (pi->mode != L2CAP_MODE_ERTM && pi->mode != L2CAP_MODE_STREAMING)
2232 pi->fcs = L2CAP_FCS_NONE; 2234 pi->fcs = L2CAP_FCS_NONE;
2233 else if (!(pi->conf_state & L2CAP_CONF_NO_FCS_RECV)) 2235 else if (!(pi->chan->conf_state & L2CAP_CONF_NO_FCS_RECV))
2234 pi->fcs = L2CAP_FCS_CRC16; 2236 pi->fcs = L2CAP_FCS_CRC16;
2235} 2237}
2236 2238
@@ -2297,10 +2299,10 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
2297 /* Reset config buffer. */ 2299 /* Reset config buffer. */
2298 chan->conf_len = 0; 2300 chan->conf_len = 0;
2299 2301
2300 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE)) 2302 if (!(chan->conf_state & L2CAP_CONF_OUTPUT_DONE))
2301 goto unlock; 2303 goto unlock;
2302 2304
2303 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { 2305 if (chan->conf_state & L2CAP_CONF_INPUT_DONE) {
2304 set_default_fcs(l2cap_pi(sk)); 2306 set_default_fcs(l2cap_pi(sk));
2305 2307
2306 sk->sk_state = BT_CONNECTED; 2308 sk->sk_state = BT_CONNECTED;
@@ -2315,9 +2317,9 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
2315 goto unlock; 2317 goto unlock;
2316 } 2318 }
2317 2319
2318 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) { 2320 if (!(chan->conf_state & L2CAP_CONF_REQ_SENT)) {
2319 u8 buf[64]; 2321 u8 buf[64];
2320 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; 2322 chan->conf_state |= L2CAP_CONF_REQ_SENT;
2321 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, 2323 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
2322 l2cap_build_conf_req(chan, buf), buf); 2324 l2cap_build_conf_req(chan, buf), buf);
2323 chan->num_conf_req++; 2325 chan->num_conf_req++;
@@ -2365,8 +2367,8 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
2365 2367
2366 /* throw out any old stored conf requests */ 2368 /* throw out any old stored conf requests */
2367 result = L2CAP_CONF_SUCCESS; 2369 result = L2CAP_CONF_SUCCESS;
2368 len = l2cap_parse_conf_rsp(sk, rsp->data, 2370 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
2369 len, req, &result); 2371 req, &result);
2370 if (len < 0) { 2372 if (len < 0) {
2371 l2cap_send_disconn_req(conn, chan, ECONNRESET); 2373 l2cap_send_disconn_req(conn, chan, ECONNRESET);
2372 goto done; 2374 goto done;
@@ -2390,9 +2392,9 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
2390 if (flags & 0x01) 2392 if (flags & 0x01)
2391 goto done; 2393 goto done;
2392 2394
2393 l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE; 2395 chan->conf_state |= L2CAP_CONF_INPUT_DONE;
2394 2396
2395 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) { 2397 if (chan->conf_state & L2CAP_CONF_OUTPUT_DONE) {
2396 set_default_fcs(l2cap_pi(sk)); 2398 set_default_fcs(l2cap_pi(sk));
2397 2399
2398 sk->sk_state = BT_CONNECTED; 2400 sk->sk_state = BT_CONNECTED;
@@ -3899,7 +3901,7 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
3899 3901
3900 bh_lock_sock(sk); 3902 bh_lock_sock(sk);
3901 3903
3902 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND) { 3904 if (chan->conf_state & L2CAP_CONF_CONNECT_PEND) {
3903 bh_unlock_sock(sk); 3905 bh_unlock_sock(sk);
3904 continue; 3906 continue;
3905 } 3907 }
@@ -3918,7 +3920,7 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
3918 req.psm = l2cap_pi(sk)->psm; 3920 req.psm = l2cap_pi(sk)->psm;
3919 3921
3920 chan->ident = l2cap_get_ident(conn); 3922 chan->ident = l2cap_get_ident(conn);
3921 l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; 3923 chan->conf_state |= L2CAP_CONF_CONNECT_PEND;
3922 3924
3923 l2cap_send_cmd(conn, chan->ident, 3925 l2cap_send_cmd(conn, chan->ident,
3924 L2CAP_CONN_REQ, sizeof(req), &req); 3926 L2CAP_CONN_REQ, sizeof(req), &req);
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index e3724572c44..a29782a0083 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -528,6 +528,7 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch
528static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen) 528static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
529{ 529{
530 struct sock *sk = sock->sk; 530 struct sock *sk = sock->sk;
531 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
531 struct l2cap_options opts; 532 struct l2cap_options opts;
532 int len, err = 0; 533 int len, err = 0;
533 u32 opt; 534 u32 opt;
@@ -565,7 +566,7 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us
565 l2cap_pi(sk)->mode = opts.mode; 566 l2cap_pi(sk)->mode = opts.mode;
566 switch (l2cap_pi(sk)->mode) { 567 switch (l2cap_pi(sk)->mode) {
567 case L2CAP_MODE_BASIC: 568 case L2CAP_MODE_BASIC:
568 l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_STATE2_DEVICE; 569 chan->conf_state &= ~L2CAP_CONF_STATE2_DEVICE;
569 break; 570 break;
570 case L2CAP_MODE_ERTM: 571 case L2CAP_MODE_ERTM:
571 case L2CAP_MODE_STREAMING: 572 case L2CAP_MODE_STREAMING:
@@ -979,16 +980,19 @@ static void l2cap_sock_destruct(struct sock *sk)
979void l2cap_sock_init(struct sock *sk, struct sock *parent) 980void l2cap_sock_init(struct sock *sk, struct sock *parent)
980{ 981{
981 struct l2cap_pinfo *pi = l2cap_pi(sk); 982 struct l2cap_pinfo *pi = l2cap_pi(sk);
983 struct l2cap_chan *chan = pi->chan;
982 984
983 BT_DBG("sk %p", sk); 985 BT_DBG("sk %p", sk);
984 986
985 if (parent) { 987 if (parent) {
988 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
989
986 sk->sk_type = parent->sk_type; 990 sk->sk_type = parent->sk_type;
987 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup; 991 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
988 992
989 pi->imtu = l2cap_pi(parent)->imtu; 993 pi->imtu = l2cap_pi(parent)->imtu;
990 pi->omtu = l2cap_pi(parent)->omtu; 994 pi->omtu = l2cap_pi(parent)->omtu;
991 pi->conf_state = l2cap_pi(parent)->conf_state; 995 chan->conf_state = pchan->conf_state;
992 pi->mode = l2cap_pi(parent)->mode; 996 pi->mode = l2cap_pi(parent)->mode;
993 pi->fcs = l2cap_pi(parent)->fcs; 997 pi->fcs = l2cap_pi(parent)->fcs;
994 pi->max_tx = l2cap_pi(parent)->max_tx; 998 pi->max_tx = l2cap_pi(parent)->max_tx;
@@ -1002,7 +1006,7 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent)
1002 pi->omtu = 0; 1006 pi->omtu = 0;
1003 if (!disable_ertm && sk->sk_type == SOCK_STREAM) { 1007 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
1004 pi->mode = L2CAP_MODE_ERTM; 1008 pi->mode = L2CAP_MODE_ERTM;
1005 pi->conf_state |= L2CAP_CONF_STATE2_DEVICE; 1009 chan->conf_state |= L2CAP_CONF_STATE2_DEVICE;
1006 } else { 1010 } else {
1007 pi->mode = L2CAP_MODE_BASIC; 1011 pi->mode = L2CAP_MODE_BASIC;
1008 } 1012 }