diff options
author | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-04-13 16:20:49 -0400 |
---|---|---|
committer | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-04-28 00:09:58 -0400 |
commit | 0c1bc5c626e9783034264ccca4b262b3acc628f1 (patch) | |
tree | ca6c9ecaf753ec9892d3cec078c63723299e01fb /net/bluetooth/l2cap_core.c | |
parent | 47d1ec6161da2c7b9dbc56a5200fa26b17d5fdc1 (diff) |
Bluetooth: Move more channel info to struct l2cap_chan
In this commit, omtu, imtu, flush_to, mode and sport. It also remove the
pi var from l2cap_sock_sendmsg().
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Diffstat (limited to 'net/bluetooth/l2cap_core.c')
-rw-r--r-- | net/bluetooth/l2cap_core.c | 97 |
1 files changed, 48 insertions, 49 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index cb3c4ed47ae2..7b06375d05a7 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -176,24 +176,24 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) | |||
176 | if (sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM) { | 176 | if (sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM) { |
177 | if (conn->hcon->type == LE_LINK) { | 177 | if (conn->hcon->type == LE_LINK) { |
178 | /* LE connection */ | 178 | /* LE connection */ |
179 | l2cap_pi(sk)->omtu = L2CAP_LE_DEFAULT_MTU; | 179 | chan->omtu = L2CAP_LE_DEFAULT_MTU; |
180 | l2cap_pi(sk)->scid = L2CAP_CID_LE_DATA; | 180 | l2cap_pi(sk)->scid = L2CAP_CID_LE_DATA; |
181 | l2cap_pi(sk)->dcid = L2CAP_CID_LE_DATA; | 181 | l2cap_pi(sk)->dcid = L2CAP_CID_LE_DATA; |
182 | } else { | 182 | } else { |
183 | /* Alloc CID for connection-oriented socket */ | 183 | /* Alloc CID for connection-oriented socket */ |
184 | l2cap_pi(sk)->scid = l2cap_alloc_cid(conn); | 184 | l2cap_pi(sk)->scid = l2cap_alloc_cid(conn); |
185 | l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; | 185 | chan->omtu = L2CAP_DEFAULT_MTU; |
186 | } | 186 | } |
187 | } else if (sk->sk_type == SOCK_DGRAM) { | 187 | } else if (sk->sk_type == SOCK_DGRAM) { |
188 | /* Connectionless socket */ | 188 | /* Connectionless socket */ |
189 | l2cap_pi(sk)->scid = L2CAP_CID_CONN_LESS; | 189 | l2cap_pi(sk)->scid = L2CAP_CID_CONN_LESS; |
190 | l2cap_pi(sk)->dcid = L2CAP_CID_CONN_LESS; | 190 | l2cap_pi(sk)->dcid = L2CAP_CID_CONN_LESS; |
191 | l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; | 191 | chan->omtu = L2CAP_DEFAULT_MTU; |
192 | } else { | 192 | } else { |
193 | /* Raw socket can send/recv signalling messages only */ | 193 | /* Raw socket can send/recv signalling messages only */ |
194 | l2cap_pi(sk)->scid = L2CAP_CID_SIGNALING; | 194 | l2cap_pi(sk)->scid = L2CAP_CID_SIGNALING; |
195 | l2cap_pi(sk)->dcid = L2CAP_CID_SIGNALING; | 195 | l2cap_pi(sk)->dcid = L2CAP_CID_SIGNALING; |
196 | l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; | 196 | chan->omtu = L2CAP_DEFAULT_MTU; |
197 | } | 197 | } |
198 | 198 | ||
199 | sock_hold(sk); | 199 | sock_hold(sk); |
@@ -242,7 +242,7 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err) | |||
242 | 242 | ||
243 | skb_queue_purge(&chan->tx_q); | 243 | skb_queue_purge(&chan->tx_q); |
244 | 244 | ||
245 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) { | 245 | if (chan->mode == L2CAP_MODE_ERTM) { |
246 | struct srej_list *l, *tmp; | 246 | struct srej_list *l, *tmp; |
247 | 247 | ||
248 | del_timer(&chan->retrans_timer); | 248 | del_timer(&chan->retrans_timer); |
@@ -479,7 +479,7 @@ void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, in | |||
479 | 479 | ||
480 | sk = chan->sk; | 480 | sk = chan->sk; |
481 | 481 | ||
482 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) { | 482 | if (chan->mode == L2CAP_MODE_ERTM) { |
483 | del_timer(&chan->retrans_timer); | 483 | del_timer(&chan->retrans_timer); |
484 | del_timer(&chan->monitor_timer); | 484 | del_timer(&chan->monitor_timer); |
485 | del_timer(&chan->ack_timer); | 485 | del_timer(&chan->ack_timer); |
@@ -523,7 +523,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
523 | continue; | 523 | continue; |
524 | } | 524 | } |
525 | 525 | ||
526 | if (!l2cap_mode_supported(l2cap_pi(sk)->mode, | 526 | if (!l2cap_mode_supported(chan->mode, |
527 | conn->feat_mask) | 527 | conn->feat_mask) |
528 | && chan->conf_state & | 528 | && chan->conf_state & |
529 | L2CAP_CONF_STATE2_DEVICE) { | 529 | L2CAP_CONF_STATE2_DEVICE) { |
@@ -1609,7 +1609,7 @@ static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data) | |||
1609 | { | 1609 | { |
1610 | struct l2cap_pinfo *pi = l2cap_pi(chan->sk); | 1610 | struct l2cap_pinfo *pi = l2cap_pi(chan->sk); |
1611 | struct l2cap_conf_req *req = data; | 1611 | struct l2cap_conf_req *req = data; |
1612 | struct l2cap_conf_rfc rfc = { .mode = pi->mode }; | 1612 | struct l2cap_conf_rfc rfc = { .mode = chan->mode }; |
1613 | void *ptr = req->data; | 1613 | void *ptr = req->data; |
1614 | 1614 | ||
1615 | BT_DBG("chan %p", chan); | 1615 | BT_DBG("chan %p", chan); |
@@ -1617,7 +1617,7 @@ static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data) | |||
1617 | if (chan->num_conf_req || chan->num_conf_rsp) | 1617 | if (chan->num_conf_req || chan->num_conf_rsp) |
1618 | goto done; | 1618 | goto done; |
1619 | 1619 | ||
1620 | switch (pi->mode) { | 1620 | switch (chan->mode) { |
1621 | case L2CAP_MODE_STREAMING: | 1621 | case L2CAP_MODE_STREAMING: |
1622 | case L2CAP_MODE_ERTM: | 1622 | case L2CAP_MODE_ERTM: |
1623 | if (chan->conf_state & L2CAP_CONF_STATE2_DEVICE) | 1623 | if (chan->conf_state & L2CAP_CONF_STATE2_DEVICE) |
@@ -1625,15 +1625,15 @@ static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data) | |||
1625 | 1625 | ||
1626 | /* fall through */ | 1626 | /* fall through */ |
1627 | default: | 1627 | default: |
1628 | pi->mode = l2cap_select_mode(rfc.mode, pi->conn->feat_mask); | 1628 | chan->mode = l2cap_select_mode(rfc.mode, pi->conn->feat_mask); |
1629 | break; | 1629 | break; |
1630 | } | 1630 | } |
1631 | 1631 | ||
1632 | done: | 1632 | done: |
1633 | if (pi->imtu != L2CAP_DEFAULT_MTU) | 1633 | if (chan->imtu != L2CAP_DEFAULT_MTU) |
1634 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu); | 1634 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu); |
1635 | 1635 | ||
1636 | switch (pi->mode) { | 1636 | switch (chan->mode) { |
1637 | case L2CAP_MODE_BASIC: | 1637 | case L2CAP_MODE_BASIC: |
1638 | if (!(pi->conn->feat_mask & L2CAP_FEAT_ERTM) && | 1638 | if (!(pi->conn->feat_mask & L2CAP_FEAT_ERTM) && |
1639 | !(pi->conn->feat_mask & L2CAP_FEAT_STREAMING)) | 1639 | !(pi->conn->feat_mask & L2CAP_FEAT_STREAMING)) |
@@ -1730,7 +1730,7 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data) | |||
1730 | break; | 1730 | break; |
1731 | 1731 | ||
1732 | case L2CAP_CONF_FLUSH_TO: | 1732 | case L2CAP_CONF_FLUSH_TO: |
1733 | pi->flush_to = val; | 1733 | chan->flush_to = val; |
1734 | break; | 1734 | break; |
1735 | 1735 | ||
1736 | case L2CAP_CONF_QOS: | 1736 | case L2CAP_CONF_QOS: |
@@ -1760,25 +1760,25 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data) | |||
1760 | if (chan->num_conf_rsp || chan->num_conf_req > 1) | 1760 | if (chan->num_conf_rsp || chan->num_conf_req > 1) |
1761 | goto done; | 1761 | goto done; |
1762 | 1762 | ||
1763 | switch (pi->mode) { | 1763 | switch (chan->mode) { |
1764 | case L2CAP_MODE_STREAMING: | 1764 | case L2CAP_MODE_STREAMING: |
1765 | case L2CAP_MODE_ERTM: | 1765 | case L2CAP_MODE_ERTM: |
1766 | if (!(chan->conf_state & L2CAP_CONF_STATE2_DEVICE)) { | 1766 | if (!(chan->conf_state & L2CAP_CONF_STATE2_DEVICE)) { |
1767 | pi->mode = l2cap_select_mode(rfc.mode, | 1767 | chan->mode = l2cap_select_mode(rfc.mode, |
1768 | pi->conn->feat_mask); | 1768 | pi->conn->feat_mask); |
1769 | break; | 1769 | break; |
1770 | } | 1770 | } |
1771 | 1771 | ||
1772 | if (pi->mode != rfc.mode) | 1772 | if (chan->mode != rfc.mode) |
1773 | return -ECONNREFUSED; | 1773 | return -ECONNREFUSED; |
1774 | 1774 | ||
1775 | break; | 1775 | break; |
1776 | } | 1776 | } |
1777 | 1777 | ||
1778 | done: | 1778 | done: |
1779 | if (pi->mode != rfc.mode) { | 1779 | if (chan->mode != rfc.mode) { |
1780 | result = L2CAP_CONF_UNACCEPT; | 1780 | result = L2CAP_CONF_UNACCEPT; |
1781 | rfc.mode = pi->mode; | 1781 | rfc.mode = chan->mode; |
1782 | 1782 | ||
1783 | if (chan->num_conf_rsp == 1) | 1783 | if (chan->num_conf_rsp == 1) |
1784 | return -ECONNREFUSED; | 1784 | return -ECONNREFUSED; |
@@ -1795,10 +1795,10 @@ done: | |||
1795 | if (mtu < L2CAP_DEFAULT_MIN_MTU) | 1795 | if (mtu < L2CAP_DEFAULT_MIN_MTU) |
1796 | result = L2CAP_CONF_UNACCEPT; | 1796 | result = L2CAP_CONF_UNACCEPT; |
1797 | else { | 1797 | else { |
1798 | pi->omtu = mtu; | 1798 | chan->omtu = mtu; |
1799 | chan->conf_state |= L2CAP_CONF_MTU_DONE; | 1799 | chan->conf_state |= L2CAP_CONF_MTU_DONE; |
1800 | } | 1800 | } |
1801 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu); | 1801 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu); |
1802 | 1802 | ||
1803 | switch (rfc.mode) { | 1803 | switch (rfc.mode) { |
1804 | case L2CAP_MODE_BASIC: | 1804 | case L2CAP_MODE_BASIC: |
@@ -1844,7 +1844,7 @@ done: | |||
1844 | result = L2CAP_CONF_UNACCEPT; | 1844 | result = L2CAP_CONF_UNACCEPT; |
1845 | 1845 | ||
1846 | memset(&rfc, 0, sizeof(rfc)); | 1846 | memset(&rfc, 0, sizeof(rfc)); |
1847 | rfc.mode = pi->mode; | 1847 | rfc.mode = chan->mode; |
1848 | } | 1848 | } |
1849 | 1849 | ||
1850 | if (result == L2CAP_CONF_SUCCESS) | 1850 | if (result == L2CAP_CONF_SUCCESS) |
@@ -1876,16 +1876,16 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, voi | |||
1876 | case L2CAP_CONF_MTU: | 1876 | case L2CAP_CONF_MTU: |
1877 | if (val < L2CAP_DEFAULT_MIN_MTU) { | 1877 | if (val < L2CAP_DEFAULT_MIN_MTU) { |
1878 | *result = L2CAP_CONF_UNACCEPT; | 1878 | *result = L2CAP_CONF_UNACCEPT; |
1879 | pi->imtu = L2CAP_DEFAULT_MIN_MTU; | 1879 | chan->imtu = L2CAP_DEFAULT_MIN_MTU; |
1880 | } else | 1880 | } else |
1881 | pi->imtu = val; | 1881 | chan->imtu = val; |
1882 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu); | 1882 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu); |
1883 | break; | 1883 | break; |
1884 | 1884 | ||
1885 | case L2CAP_CONF_FLUSH_TO: | 1885 | case L2CAP_CONF_FLUSH_TO: |
1886 | pi->flush_to = val; | 1886 | chan->flush_to = val; |
1887 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, | 1887 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, |
1888 | 2, pi->flush_to); | 1888 | 2, chan->flush_to); |
1889 | break; | 1889 | break; |
1890 | 1890 | ||
1891 | case L2CAP_CONF_RFC: | 1891 | case L2CAP_CONF_RFC: |
@@ -1893,7 +1893,7 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, voi | |||
1893 | memcpy(&rfc, (void *)val, olen); | 1893 | memcpy(&rfc, (void *)val, olen); |
1894 | 1894 | ||
1895 | if ((chan->conf_state & L2CAP_CONF_STATE2_DEVICE) && | 1895 | if ((chan->conf_state & L2CAP_CONF_STATE2_DEVICE) && |
1896 | rfc.mode != pi->mode) | 1896 | rfc.mode != chan->mode) |
1897 | return -ECONNREFUSED; | 1897 | return -ECONNREFUSED; |
1898 | 1898 | ||
1899 | chan->fcs = 0; | 1899 | chan->fcs = 0; |
@@ -1904,10 +1904,10 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, voi | |||
1904 | } | 1904 | } |
1905 | } | 1905 | } |
1906 | 1906 | ||
1907 | if (pi->mode == L2CAP_MODE_BASIC && pi->mode != rfc.mode) | 1907 | if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode) |
1908 | return -ECONNREFUSED; | 1908 | return -ECONNREFUSED; |
1909 | 1909 | ||
1910 | pi->mode = rfc.mode; | 1910 | chan->mode = rfc.mode; |
1911 | 1911 | ||
1912 | if (*result == L2CAP_CONF_SUCCESS) { | 1912 | if (*result == L2CAP_CONF_SUCCESS) { |
1913 | switch (rfc.mode) { | 1913 | switch (rfc.mode) { |
@@ -1968,14 +1968,13 @@ void __l2cap_connect_rsp_defer(struct sock *sk) | |||
1968 | 1968 | ||
1969 | static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len) | 1969 | static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len) |
1970 | { | 1970 | { |
1971 | struct l2cap_pinfo *pi = l2cap_pi(chan->sk); | ||
1972 | int type, olen; | 1971 | int type, olen; |
1973 | unsigned long val; | 1972 | unsigned long val; |
1974 | struct l2cap_conf_rfc rfc; | 1973 | struct l2cap_conf_rfc rfc; |
1975 | 1974 | ||
1976 | BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len); | 1975 | BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len); |
1977 | 1976 | ||
1978 | if ((pi->mode != L2CAP_MODE_ERTM) && (pi->mode != L2CAP_MODE_STREAMING)) | 1977 | if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING)) |
1979 | return; | 1978 | return; |
1980 | 1979 | ||
1981 | while (len >= L2CAP_CONF_OPT_SIZE) { | 1980 | while (len >= L2CAP_CONF_OPT_SIZE) { |
@@ -2232,7 +2231,7 @@ static inline void set_default_fcs(struct l2cap_chan *chan) | |||
2232 | /* FCS is enabled only in ERTM or streaming mode, if one or both | 2231 | /* FCS is enabled only in ERTM or streaming mode, if one or both |
2233 | * sides request it. | 2232 | * sides request it. |
2234 | */ | 2233 | */ |
2235 | if (pi->mode != L2CAP_MODE_ERTM && pi->mode != L2CAP_MODE_STREAMING) | 2234 | if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING) |
2236 | chan->fcs = L2CAP_FCS_NONE; | 2235 | chan->fcs = L2CAP_FCS_NONE; |
2237 | else if (!(pi->chan->conf_state & L2CAP_CONF_NO_FCS_RECV)) | 2236 | else if (!(pi->chan->conf_state & L2CAP_CONF_NO_FCS_RECV)) |
2238 | chan->fcs = L2CAP_FCS_CRC16; | 2237 | chan->fcs = L2CAP_FCS_CRC16; |
@@ -2312,7 +2311,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2312 | chan->next_tx_seq = 0; | 2311 | chan->next_tx_seq = 0; |
2313 | chan->expected_tx_seq = 0; | 2312 | chan->expected_tx_seq = 0; |
2314 | skb_queue_head_init(&chan->tx_q); | 2313 | skb_queue_head_init(&chan->tx_q); |
2315 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) | 2314 | if (chan->mode == L2CAP_MODE_ERTM) |
2316 | l2cap_ertm_init(chan); | 2315 | l2cap_ertm_init(chan); |
2317 | 2316 | ||
2318 | l2cap_chan_ready(sk); | 2317 | l2cap_chan_ready(sk); |
@@ -2403,7 +2402,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2403 | chan->next_tx_seq = 0; | 2402 | chan->next_tx_seq = 0; |
2404 | chan->expected_tx_seq = 0; | 2403 | chan->expected_tx_seq = 0; |
2405 | skb_queue_head_init(&chan->tx_q); | 2404 | skb_queue_head_init(&chan->tx_q); |
2406 | if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) | 2405 | if (chan->mode == L2CAP_MODE_ERTM) |
2407 | l2cap_ertm_init(chan); | 2406 | l2cap_ertm_init(chan); |
2408 | 2407 | ||
2409 | l2cap_chan_ready(sk); | 2408 | l2cap_chan_ready(sk); |
@@ -2876,7 +2875,7 @@ static int l2cap_ertm_reassembly_sdu(struct l2cap_chan *chan, struct sk_buff *sk | |||
2876 | 2875 | ||
2877 | chan->sdu_len = get_unaligned_le16(skb->data); | 2876 | chan->sdu_len = get_unaligned_le16(skb->data); |
2878 | 2877 | ||
2879 | if (chan->sdu_len > pi->imtu) | 2878 | if (chan->sdu_len > chan->imtu) |
2880 | goto disconnect; | 2879 | goto disconnect; |
2881 | 2880 | ||
2882 | chan->sdu = bt_skb_alloc(chan->sdu_len, GFP_ATOMIC); | 2881 | chan->sdu = bt_skb_alloc(chan->sdu_len, GFP_ATOMIC); |
@@ -2919,7 +2918,7 @@ static int l2cap_ertm_reassembly_sdu(struct l2cap_chan *chan, struct sk_buff *sk | |||
2919 | if (!(chan->conn_state & L2CAP_CONN_SAR_RETRY)) { | 2918 | if (!(chan->conn_state & L2CAP_CONN_SAR_RETRY)) { |
2920 | chan->partial_sdu_len += skb->len; | 2919 | chan->partial_sdu_len += skb->len; |
2921 | 2920 | ||
2922 | if (chan->partial_sdu_len > pi->imtu) | 2921 | if (chan->partial_sdu_len > chan->imtu) |
2923 | goto drop; | 2922 | goto drop; |
2924 | 2923 | ||
2925 | if (chan->partial_sdu_len != chan->sdu_len) | 2924 | if (chan->partial_sdu_len != chan->sdu_len) |
@@ -3087,7 +3086,6 @@ static int l2cap_push_rx_skb(struct l2cap_chan *chan, struct sk_buff *skb, u16 c | |||
3087 | 3086 | ||
3088 | static int l2cap_streaming_reassembly_sdu(struct l2cap_chan *chan, struct sk_buff *skb, u16 control) | 3087 | static int l2cap_streaming_reassembly_sdu(struct l2cap_chan *chan, struct sk_buff *skb, u16 control) |
3089 | { | 3088 | { |
3090 | struct l2cap_pinfo *pi = l2cap_pi(chan->sk); | ||
3091 | struct sk_buff *_skb; | 3089 | struct sk_buff *_skb; |
3092 | int err = -EINVAL; | 3090 | int err = -EINVAL; |
3093 | 3091 | ||
@@ -3118,7 +3116,7 @@ static int l2cap_streaming_reassembly_sdu(struct l2cap_chan *chan, struct sk_buf | |||
3118 | chan->sdu_len = get_unaligned_le16(skb->data); | 3116 | chan->sdu_len = get_unaligned_le16(skb->data); |
3119 | skb_pull(skb, 2); | 3117 | skb_pull(skb, 2); |
3120 | 3118 | ||
3121 | if (chan->sdu_len > pi->imtu) { | 3119 | if (chan->sdu_len > chan->imtu) { |
3122 | err = -EMSGSIZE; | 3120 | err = -EMSGSIZE; |
3123 | break; | 3121 | break; |
3124 | } | 3122 | } |
@@ -3159,7 +3157,7 @@ static int l2cap_streaming_reassembly_sdu(struct l2cap_chan *chan, struct sk_buf | |||
3159 | chan->conn_state &= ~L2CAP_CONN_SAR_SDU; | 3157 | chan->conn_state &= ~L2CAP_CONN_SAR_SDU; |
3160 | chan->partial_sdu_len += skb->len; | 3158 | chan->partial_sdu_len += skb->len; |
3161 | 3159 | ||
3162 | if (chan->partial_sdu_len > pi->imtu) | 3160 | if (chan->partial_sdu_len > chan->imtu) |
3163 | goto drop; | 3161 | goto drop; |
3164 | 3162 | ||
3165 | if (chan->partial_sdu_len == chan->sdu_len) { | 3163 | if (chan->partial_sdu_len == chan->sdu_len) { |
@@ -3625,14 +3623,14 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
3625 | if (sk->sk_state != BT_CONNECTED) | 3623 | if (sk->sk_state != BT_CONNECTED) |
3626 | goto drop; | 3624 | goto drop; |
3627 | 3625 | ||
3628 | switch (pi->mode) { | 3626 | switch (chan->mode) { |
3629 | case L2CAP_MODE_BASIC: | 3627 | case L2CAP_MODE_BASIC: |
3630 | /* If socket recv buffers overflows we drop data here | 3628 | /* If socket recv buffers overflows we drop data here |
3631 | * which is *bad* because L2CAP has to be reliable. | 3629 | * which is *bad* because L2CAP has to be reliable. |
3632 | * But we don't have any other choice. L2CAP doesn't | 3630 | * But we don't have any other choice. L2CAP doesn't |
3633 | * provide flow control mechanism. */ | 3631 | * provide flow control mechanism. */ |
3634 | 3632 | ||
3635 | if (pi->imtu < skb->len) | 3633 | if (chan->imtu < skb->len) |
3636 | goto drop; | 3634 | goto drop; |
3637 | 3635 | ||
3638 | if (!sock_queue_rcv_skb(sk, skb)) | 3636 | if (!sock_queue_rcv_skb(sk, skb)) |
@@ -3678,7 +3676,7 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
3678 | goto done; | 3676 | goto done; |
3679 | 3677 | ||
3680 | default: | 3678 | default: |
3681 | BT_DBG("chan %p: bad mode 0x%2.2x", chan, pi->mode); | 3679 | BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode); |
3682 | break; | 3680 | break; |
3683 | } | 3681 | } |
3684 | 3682 | ||
@@ -3707,7 +3705,7 @@ static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, str | |||
3707 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED) | 3705 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED) |
3708 | goto drop; | 3706 | goto drop; |
3709 | 3707 | ||
3710 | if (l2cap_pi(sk)->imtu < skb->len) | 3708 | if (l2cap_pi(sk)->chan->imtu < skb->len) |
3711 | goto drop; | 3709 | goto drop; |
3712 | 3710 | ||
3713 | if (!sock_queue_rcv_skb(sk, skb)) | 3711 | if (!sock_queue_rcv_skb(sk, skb)) |
@@ -3737,7 +3735,7 @@ static inline int l2cap_att_channel(struct l2cap_conn *conn, __le16 cid, struct | |||
3737 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED) | 3735 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED) |
3738 | goto drop; | 3736 | goto drop; |
3739 | 3737 | ||
3740 | if (l2cap_pi(sk)->imtu < skb->len) | 3738 | if (l2cap_pi(sk)->chan->imtu < skb->len) |
3741 | goto drop; | 3739 | goto drop; |
3742 | 3740 | ||
3743 | if (!sock_queue_rcv_skb(sk, skb)) | 3741 | if (!sock_queue_rcv_skb(sk, skb)) |
@@ -4020,10 +4018,10 @@ static int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 fl | |||
4020 | if (chan && chan->sk) { | 4018 | if (chan && chan->sk) { |
4021 | struct sock *sk = chan->sk; | 4019 | struct sock *sk = chan->sk; |
4022 | 4020 | ||
4023 | if (l2cap_pi(sk)->imtu < len - L2CAP_HDR_SIZE) { | 4021 | if (chan->imtu < len - L2CAP_HDR_SIZE) { |
4024 | BT_ERR("Frame exceeding recv MTU (len %d, " | 4022 | BT_ERR("Frame exceeding recv MTU (len %d, " |
4025 | "MTU %d)", len, | 4023 | "MTU %d)", len, |
4026 | l2cap_pi(sk)->imtu); | 4024 | chan->imtu); |
4027 | bh_unlock_sock(sk); | 4025 | bh_unlock_sock(sk); |
4028 | l2cap_conn_unreliable(conn, ECOMM); | 4026 | l2cap_conn_unreliable(conn, ECOMM); |
4029 | goto drop; | 4027 | goto drop; |
@@ -4083,14 +4081,15 @@ static int l2cap_debugfs_show(struct seq_file *f, void *p) | |||
4083 | 4081 | ||
4084 | sk_for_each(sk, node, &l2cap_sk_list.head) { | 4082 | sk_for_each(sk, node, &l2cap_sk_list.head) { |
4085 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 4083 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
4084 | struct l2cap_chan *chan = pi->chan; | ||
4086 | 4085 | ||
4087 | seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n", | 4086 | seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n", |
4088 | batostr(&bt_sk(sk)->src), | 4087 | batostr(&bt_sk(sk)->src), |
4089 | batostr(&bt_sk(sk)->dst), | 4088 | batostr(&bt_sk(sk)->dst), |
4090 | sk->sk_state, __le16_to_cpu(pi->psm), | 4089 | sk->sk_state, __le16_to_cpu(pi->psm), |
4091 | pi->scid, pi->dcid, | 4090 | pi->scid, pi->dcid, |
4092 | pi->imtu, pi->omtu, pi->chan->sec_level, | 4091 | chan->imtu, chan->omtu, chan->sec_level, |
4093 | pi->mode); | 4092 | chan->mode); |
4094 | } | 4093 | } |
4095 | 4094 | ||
4096 | read_unlock_bh(&l2cap_sk_list.lock); | 4095 | read_unlock_bh(&l2cap_sk_list.lock); |