aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorGustavo F. Padovan <padovan@profusion.mobi>2011-03-25 13:16:54 -0400
committerGustavo F. Padovan <padovan@profusion.mobi>2011-04-07 17:06:26 -0400
commit73ffa904b78287f6acf8797e040150aa26a4af4a (patch)
tree9056d6909606d0286bd8ebb5223b37aea0fc2fa5 /net/bluetooth
parentfc7f8a7ed4543853a99852ca405ea71fabe78946 (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.c55
-rw-r--r--net/bluetooth/l2cap_sock.c8
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
1601int l2cap_build_conf_req(struct sock *sk, void *data) 1601int 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
1699static int l2cap_parse_conf_req(struct sock *sk, void *data) 1700static 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
2295unlock: 2296unlock:
@@ -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));