diff options
author | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-03-25 13:16:54 -0400 |
---|---|---|
committer | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-04-07 17:06:26 -0400 |
commit | 73ffa904b78287f6acf8797e040150aa26a4af4a (patch) | |
tree | 9056d6909606d0286bd8ebb5223b37aea0fc2fa5 /net/bluetooth | |
parent | fc7f8a7ed4543853a99852ca405ea71fabe78946 (diff) |
Bluetooth: Move conf_{req,rsp} stuff to struct l2cap_chan
They are also l2cap_chan specific.
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Diffstat (limited to 'net/bluetooth')
-rw-r--r-- | net/bluetooth/l2cap_core.c | 55 | ||||
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 8 |
2 files changed, 32 insertions, 31 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 6020e1e2f500..cb849b51632f 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -569,8 +569,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
569 | 569 | ||
570 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 570 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; |
571 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 571 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
572 | l2cap_build_conf_req(sk, buf), buf); | 572 | l2cap_build_conf_req(chan, buf), buf); |
573 | l2cap_pi(sk)->num_conf_req++; | 573 | chan->num_conf_req++; |
574 | } | 574 | } |
575 | 575 | ||
576 | bh_unlock_sock(sk); | 576 | bh_unlock_sock(sk); |
@@ -1598,8 +1598,9 @@ static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask) | |||
1598 | } | 1598 | } |
1599 | } | 1599 | } |
1600 | 1600 | ||
1601 | int l2cap_build_conf_req(struct sock *sk, void *data) | 1601 | int l2cap_build_conf_req(struct l2cap_chan *chan, void *data) |
1602 | { | 1602 | { |
1603 | struct sock *sk = chan->sk; | ||
1603 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 1604 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
1604 | struct l2cap_conf_req *req = data; | 1605 | struct l2cap_conf_req *req = data; |
1605 | struct l2cap_conf_rfc rfc = { .mode = pi->mode }; | 1606 | struct l2cap_conf_rfc rfc = { .mode = pi->mode }; |
@@ -1607,7 +1608,7 @@ int l2cap_build_conf_req(struct sock *sk, void *data) | |||
1607 | 1608 | ||
1608 | BT_DBG("sk %p", sk); | 1609 | BT_DBG("sk %p", sk); |
1609 | 1610 | ||
1610 | if (pi->num_conf_req || pi->num_conf_rsp) | 1611 | if (chan->num_conf_req || chan->num_conf_rsp) |
1611 | goto done; | 1612 | goto done; |
1612 | 1613 | ||
1613 | switch (pi->mode) { | 1614 | switch (pi->mode) { |
@@ -1696,20 +1697,20 @@ done: | |||
1696 | return ptr - data; | 1697 | return ptr - data; |
1697 | } | 1698 | } |
1698 | 1699 | ||
1699 | static int l2cap_parse_conf_req(struct sock *sk, void *data) | 1700 | static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data) |
1700 | { | 1701 | { |
1701 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 1702 | struct l2cap_pinfo *pi = l2cap_pi(chan->sk); |
1702 | struct l2cap_conf_rsp *rsp = data; | 1703 | struct l2cap_conf_rsp *rsp = data; |
1703 | void *ptr = rsp->data; | 1704 | void *ptr = rsp->data; |
1704 | void *req = pi->conf_req; | 1705 | void *req = chan->conf_req; |
1705 | int len = pi->conf_len; | 1706 | int len = chan->conf_len; |
1706 | int type, hint, olen; | 1707 | int type, hint, olen; |
1707 | unsigned long val; | 1708 | unsigned long val; |
1708 | struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC }; | 1709 | struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC }; |
1709 | u16 mtu = L2CAP_DEFAULT_MTU; | 1710 | u16 mtu = L2CAP_DEFAULT_MTU; |
1710 | u16 result = L2CAP_CONF_SUCCESS; | 1711 | u16 result = L2CAP_CONF_SUCCESS; |
1711 | 1712 | ||
1712 | BT_DBG("sk %p", sk); | 1713 | BT_DBG("chan %p", chan); |
1713 | 1714 | ||
1714 | while (len >= L2CAP_CONF_OPT_SIZE) { | 1715 | while (len >= L2CAP_CONF_OPT_SIZE) { |
1715 | len -= l2cap_get_conf_opt(&req, &type, &olen, &val); | 1716 | len -= l2cap_get_conf_opt(&req, &type, &olen, &val); |
@@ -1750,7 +1751,7 @@ static int l2cap_parse_conf_req(struct sock *sk, void *data) | |||
1750 | } | 1751 | } |
1751 | } | 1752 | } |
1752 | 1753 | ||
1753 | if (pi->num_conf_rsp || pi->num_conf_req > 1) | 1754 | if (chan->num_conf_rsp || chan->num_conf_req > 1) |
1754 | goto done; | 1755 | goto done; |
1755 | 1756 | ||
1756 | switch (pi->mode) { | 1757 | switch (pi->mode) { |
@@ -1773,7 +1774,7 @@ done: | |||
1773 | result = L2CAP_CONF_UNACCEPT; | 1774 | result = L2CAP_CONF_UNACCEPT; |
1774 | rfc.mode = pi->mode; | 1775 | rfc.mode = pi->mode; |
1775 | 1776 | ||
1776 | if (pi->num_conf_rsp == 1) | 1777 | if (chan->num_conf_rsp == 1) |
1777 | return -ECONNREFUSED; | 1778 | return -ECONNREFUSED; |
1778 | 1779 | ||
1779 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, | 1780 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, |
@@ -1992,7 +1993,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
1992 | { | 1993 | { |
1993 | struct l2cap_conn_req *req = (struct l2cap_conn_req *) data; | 1994 | struct l2cap_conn_req *req = (struct l2cap_conn_req *) data; |
1994 | struct l2cap_conn_rsp rsp; | 1995 | struct l2cap_conn_rsp rsp; |
1995 | struct l2cap_chan *chan; | 1996 | struct l2cap_chan *chan = NULL; |
1996 | struct sock *parent, *sk = NULL; | 1997 | struct sock *parent, *sk = NULL; |
1997 | int result, status = L2CAP_CS_NO_INFO; | 1998 | int result, status = L2CAP_CS_NO_INFO; |
1998 | 1999 | ||
@@ -2115,13 +2116,13 @@ sendresp: | |||
2115 | L2CAP_INFO_REQ, sizeof(info), &info); | 2116 | L2CAP_INFO_REQ, sizeof(info), &info); |
2116 | } | 2117 | } |
2117 | 2118 | ||
2118 | if (sk && !(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) && | 2119 | if (chan && !(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) && |
2119 | result == L2CAP_CR_SUCCESS) { | 2120 | result == L2CAP_CR_SUCCESS) { |
2120 | u8 buf[128]; | 2121 | u8 buf[128]; |
2121 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 2122 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; |
2122 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 2123 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
2123 | l2cap_build_conf_req(sk, buf), buf); | 2124 | l2cap_build_conf_req(chan, buf), buf); |
2124 | l2cap_pi(sk)->num_conf_req++; | 2125 | chan->num_conf_req++; |
2125 | } | 2126 | } |
2126 | 2127 | ||
2127 | return 0; | 2128 | return 0; |
@@ -2167,8 +2168,8 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
2167 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 2168 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; |
2168 | 2169 | ||
2169 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 2170 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
2170 | l2cap_build_conf_req(sk, req), req); | 2171 | l2cap_build_conf_req(chan, req), req); |
2171 | l2cap_pi(sk)->num_conf_req++; | 2172 | chan->num_conf_req++; |
2172 | break; | 2173 | break; |
2173 | 2174 | ||
2174 | case L2CAP_CR_PEND: | 2175 | case L2CAP_CR_PEND: |
@@ -2234,7 +2235,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2234 | 2235 | ||
2235 | /* Reject if config buffer is too small. */ | 2236 | /* Reject if config buffer is too small. */ |
2236 | len = cmd_len - sizeof(*req); | 2237 | len = cmd_len - sizeof(*req); |
2237 | if (l2cap_pi(sk)->conf_len + len > sizeof(l2cap_pi(sk)->conf_req)) { | 2238 | if (chan->conf_len + len > sizeof(chan->conf_req)) { |
2238 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, | 2239 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, |
2239 | l2cap_build_conf_rsp(sk, rsp, | 2240 | l2cap_build_conf_rsp(sk, rsp, |
2240 | L2CAP_CONF_REJECT, flags), rsp); | 2241 | L2CAP_CONF_REJECT, flags), rsp); |
@@ -2242,8 +2243,8 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2242 | } | 2243 | } |
2243 | 2244 | ||
2244 | /* Store config. */ | 2245 | /* Store config. */ |
2245 | memcpy(l2cap_pi(sk)->conf_req + l2cap_pi(sk)->conf_len, req->data, len); | 2246 | memcpy(chan->conf_req + chan->conf_len, req->data, len); |
2246 | l2cap_pi(sk)->conf_len += len; | 2247 | chan->conf_len += len; |
2247 | 2248 | ||
2248 | if (flags & 0x0001) { | 2249 | if (flags & 0x0001) { |
2249 | /* Incomplete config. Send empty response. */ | 2250 | /* Incomplete config. Send empty response. */ |
@@ -2254,17 +2255,17 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2254 | } | 2255 | } |
2255 | 2256 | ||
2256 | /* Complete config. */ | 2257 | /* Complete config. */ |
2257 | len = l2cap_parse_conf_req(sk, rsp); | 2258 | len = l2cap_parse_conf_req(chan, rsp); |
2258 | if (len < 0) { | 2259 | if (len < 0) { |
2259 | l2cap_send_disconn_req(conn, sk, ECONNRESET); | 2260 | l2cap_send_disconn_req(conn, sk, ECONNRESET); |
2260 | goto unlock; | 2261 | goto unlock; |
2261 | } | 2262 | } |
2262 | 2263 | ||
2263 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); | 2264 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); |
2264 | l2cap_pi(sk)->num_conf_rsp++; | 2265 | chan->num_conf_rsp++; |
2265 | 2266 | ||
2266 | /* Reset config buffer. */ | 2267 | /* Reset config buffer. */ |
2267 | l2cap_pi(sk)->conf_len = 0; | 2268 | chan->conf_len = 0; |
2268 | 2269 | ||
2269 | if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE)) | 2270 | if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE)) |
2270 | goto unlock; | 2271 | goto unlock; |
@@ -2288,8 +2289,8 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2288 | u8 buf[64]; | 2289 | u8 buf[64]; |
2289 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 2290 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; |
2290 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 2291 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
2291 | l2cap_build_conf_req(sk, buf), buf); | 2292 | l2cap_build_conf_req(chan, buf), buf); |
2292 | l2cap_pi(sk)->num_conf_req++; | 2293 | chan->num_conf_req++; |
2293 | } | 2294 | } |
2294 | 2295 | ||
2295 | unlock: | 2296 | unlock: |
@@ -2324,7 +2325,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2324 | break; | 2325 | break; |
2325 | 2326 | ||
2326 | case L2CAP_CONF_UNACCEPT: | 2327 | case L2CAP_CONF_UNACCEPT: |
2327 | if (l2cap_pi(sk)->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) { | 2328 | if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) { |
2328 | char req[64]; | 2329 | char req[64]; |
2329 | 2330 | ||
2330 | if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { | 2331 | if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { |
@@ -2343,7 +2344,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
2343 | 2344 | ||
2344 | l2cap_send_cmd(conn, l2cap_get_ident(conn), | 2345 | l2cap_send_cmd(conn, l2cap_get_ident(conn), |
2345 | L2CAP_CONF_REQ, len, req); | 2346 | L2CAP_CONF_REQ, len, req); |
2346 | l2cap_pi(sk)->num_conf_req++; | 2347 | chan->num_conf_req++; |
2347 | if (result != L2CAP_CONF_SUCCESS) | 2348 | if (result != L2CAP_CONF_SUCCESS) |
2348 | goto done; | 2349 | goto done; |
2349 | break; | 2350 | break; |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index cad4bc7d36b2..244475ea045c 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -810,6 +810,7 @@ static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct ms | |||
810 | if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) { | 810 | if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) { |
811 | struct l2cap_conn_rsp rsp; | 811 | struct l2cap_conn_rsp rsp; |
812 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 812 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; |
813 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | ||
813 | u8 buf[128]; | 814 | u8 buf[128]; |
814 | 815 | ||
815 | sk->sk_state = BT_CONFIG; | 816 | sk->sk_state = BT_CONFIG; |
@@ -818,7 +819,7 @@ static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct ms | |||
818 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); | 819 | rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid); |
819 | rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS); | 820 | rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS); |
820 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); | 821 | rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); |
821 | l2cap_send_cmd(l2cap_pi(sk)->conn, l2cap_pi(sk)->chan->ident, | 822 | l2cap_send_cmd(l2cap_pi(sk)->conn, chan->ident, |
822 | L2CAP_CONN_RSP, sizeof(rsp), &rsp); | 823 | L2CAP_CONN_RSP, sizeof(rsp), &rsp); |
823 | 824 | ||
824 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) { | 825 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) { |
@@ -828,8 +829,8 @@ static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct ms | |||
828 | 829 | ||
829 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 830 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; |
830 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 831 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
831 | l2cap_build_conf_req(sk, buf), buf); | 832 | l2cap_build_conf_req(chan, buf), buf); |
832 | l2cap_pi(sk)->num_conf_req++; | 833 | chan->num_conf_req++; |
833 | 834 | ||
834 | release_sock(sk); | 835 | release_sock(sk); |
835 | return 0; | 836 | return 0; |
@@ -1035,7 +1036,6 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent) | |||
1035 | } | 1036 | } |
1036 | 1037 | ||
1037 | /* Default config options */ | 1038 | /* Default config options */ |
1038 | pi->conf_len = 0; | ||
1039 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; | 1039 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; |
1040 | skb_queue_head_init(TX_QUEUE(sk)); | 1040 | skb_queue_head_init(TX_QUEUE(sk)); |
1041 | skb_queue_head_init(SREJ_QUEUE(sk)); | 1041 | skb_queue_head_init(SREJ_QUEUE(sk)); |