|
@@ -80,8 +80,7 @@ static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn, u16
|
|
struct l2cap_chan *c;
|
|
struct l2cap_chan *c;
|
|
|
|
|
|
list_for_each_entry(c, &conn->chan_l, list) {
|
|
list_for_each_entry(c, &conn->chan_l, list) {
|
|
- struct sock *s = c->sk;
|
|
|
|
- if (l2cap_pi(s)->dcid == cid)
|
|
|
|
|
|
+ if (c->dcid == cid)
|
|
return c;
|
|
return c;
|
|
}
|
|
}
|
|
return NULL;
|
|
return NULL;
|
|
@@ -93,8 +92,7 @@ static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn, u16
|
|
struct l2cap_chan *c;
|
|
struct l2cap_chan *c;
|
|
|
|
|
|
list_for_each_entry(c, &conn->chan_l, list) {
|
|
list_for_each_entry(c, &conn->chan_l, list) {
|
|
- struct sock *s = c->sk;
|
|
|
|
- if (l2cap_pi(s)->scid == cid)
|
|
|
|
|
|
+ if (c->scid == cid)
|
|
return c;
|
|
return c;
|
|
}
|
|
}
|
|
return NULL;
|
|
return NULL;
|
|
@@ -167,7 +165,7 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
|
|
struct sock *sk = chan->sk;
|
|
struct sock *sk = chan->sk;
|
|
|
|
|
|
BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
|
|
BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
|
|
- l2cap_pi(sk)->psm, l2cap_pi(sk)->dcid);
|
|
|
|
|
|
+ chan->psm, chan->dcid);
|
|
|
|
|
|
conn->disc_reason = 0x13;
|
|
conn->disc_reason = 0x13;
|
|
|
|
|
|
@@ -177,22 +175,22 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
|
|
if (conn->hcon->type == LE_LINK) {
|
|
if (conn->hcon->type == LE_LINK) {
|
|
/* LE connection */
|
|
/* LE connection */
|
|
chan->omtu = L2CAP_LE_DEFAULT_MTU;
|
|
chan->omtu = L2CAP_LE_DEFAULT_MTU;
|
|
- l2cap_pi(sk)->scid = L2CAP_CID_LE_DATA;
|
|
|
|
- l2cap_pi(sk)->dcid = L2CAP_CID_LE_DATA;
|
|
|
|
|
|
+ chan->scid = L2CAP_CID_LE_DATA;
|
|
|
|
+ chan->dcid = L2CAP_CID_LE_DATA;
|
|
} else {
|
|
} else {
|
|
/* Alloc CID for connection-oriented socket */
|
|
/* Alloc CID for connection-oriented socket */
|
|
- l2cap_pi(sk)->scid = l2cap_alloc_cid(conn);
|
|
|
|
|
|
+ chan->scid = l2cap_alloc_cid(conn);
|
|
chan->omtu = L2CAP_DEFAULT_MTU;
|
|
chan->omtu = L2CAP_DEFAULT_MTU;
|
|
}
|
|
}
|
|
} else if (sk->sk_type == SOCK_DGRAM) {
|
|
} else if (sk->sk_type == SOCK_DGRAM) {
|
|
/* Connectionless socket */
|
|
/* Connectionless socket */
|
|
- l2cap_pi(sk)->scid = L2CAP_CID_CONN_LESS;
|
|
|
|
- l2cap_pi(sk)->dcid = L2CAP_CID_CONN_LESS;
|
|
|
|
|
|
+ chan->scid = L2CAP_CID_CONN_LESS;
|
|
|
|
+ chan->dcid = L2CAP_CID_CONN_LESS;
|
|
chan->omtu = L2CAP_DEFAULT_MTU;
|
|
chan->omtu = L2CAP_DEFAULT_MTU;
|
|
} else {
|
|
} else {
|
|
/* Raw socket can send/recv signalling messages only */
|
|
/* Raw socket can send/recv signalling messages only */
|
|
- l2cap_pi(sk)->scid = L2CAP_CID_SIGNALING;
|
|
|
|
- l2cap_pi(sk)->dcid = L2CAP_CID_SIGNALING;
|
|
|
|
|
|
+ chan->scid = L2CAP_CID_SIGNALING;
|
|
|
|
+ chan->dcid = L2CAP_CID_SIGNALING;
|
|
chan->omtu = L2CAP_DEFAULT_MTU;
|
|
chan->omtu = L2CAP_DEFAULT_MTU;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -275,7 +273,7 @@ static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
|
|
default:
|
|
default:
|
|
return HCI_AT_NO_BONDING;
|
|
return HCI_AT_NO_BONDING;
|
|
}
|
|
}
|
|
- } else if (l2cap_pi(sk)->psm == cpu_to_le16(0x0001)) {
|
|
|
|
|
|
+ } else if (chan->psm == cpu_to_le16(0x0001)) {
|
|
if (chan->sec_level == BT_SECURITY_LOW)
|
|
if (chan->sec_level == BT_SECURITY_LOW)
|
|
chan->sec_level = BT_SECURITY_SDP;
|
|
chan->sec_level = BT_SECURITY_SDP;
|
|
|
|
|
|
@@ -383,7 +381,7 @@ static inline void l2cap_send_sframe(struct l2cap_chan *chan, u16 control)
|
|
|
|
|
|
lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
|
|
lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
|
|
lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
|
|
lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
|
|
- lh->cid = cpu_to_le16(pi->dcid);
|
|
|
|
|
|
+ lh->cid = cpu_to_le16(chan->dcid);
|
|
put_unaligned_le16(control, skb_put(skb, 2));
|
|
put_unaligned_le16(control, skb_put(skb, 2));
|
|
|
|
|
|
if (chan->fcs == L2CAP_FCS_CRC16) {
|
|
if (chan->fcs == L2CAP_FCS_CRC16) {
|
|
@@ -429,8 +427,8 @@ static void l2cap_do_start(struct l2cap_chan *chan)
|
|
if (l2cap_check_security(chan) &&
|
|
if (l2cap_check_security(chan) &&
|
|
__l2cap_no_conn_pending(chan)) {
|
|
__l2cap_no_conn_pending(chan)) {
|
|
struct l2cap_conn_req req;
|
|
struct l2cap_conn_req req;
|
|
- req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
|
|
|
|
- req.psm = l2cap_pi(sk)->psm;
|
|
|
|
|
|
+ req.scid = cpu_to_le16(chan->scid);
|
|
|
|
+ req.psm = chan->psm;
|
|
|
|
|
|
chan->ident = l2cap_get_ident(conn);
|
|
chan->ident = l2cap_get_ident(conn);
|
|
chan->conf_state |= L2CAP_CONF_CONNECT_PEND;
|
|
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
|
|
del_timer(&chan->ack_timer);
|
|
del_timer(&chan->ack_timer);
|
|
}
|
|
}
|
|
|
|
|
|
- req.dcid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
|
|
|
- req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
|
|
|
|
|
|
+ req.dcid = cpu_to_le16(chan->dcid);
|
|
|
|
+ req.scid = cpu_to_le16(chan->scid);
|
|
l2cap_send_cmd(conn, l2cap_get_ident(conn),
|
|
l2cap_send_cmd(conn, l2cap_get_ident(conn),
|
|
L2CAP_DISCONN_REQ, sizeof(req), &req);
|
|
L2CAP_DISCONN_REQ, sizeof(req), &req);
|
|
|
|
|
|
@@ -536,8 +534,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
|
|
|
|
- req.psm = l2cap_pi(sk)->psm;
|
|
|
|
|
|
+ req.scid = cpu_to_le16(chan->scid);
|
|
|
|
+ req.psm = chan->psm;
|
|
|
|
|
|
chan->ident = l2cap_get_ident(conn);
|
|
chan->ident = l2cap_get_ident(conn);
|
|
chan->conf_state |= L2CAP_CONF_CONNECT_PEND;
|
|
chan->conf_state |= L2CAP_CONF_CONNECT_PEND;
|
|
@@ -548,8 +546,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
|
|
} else if (sk->sk_state == BT_CONNECT2) {
|
|
} else if (sk->sk_state == BT_CONNECT2) {
|
|
struct l2cap_conn_rsp rsp;
|
|
struct l2cap_conn_rsp rsp;
|
|
char buf[128];
|
|
char buf[128];
|
|
- rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
|
|
|
- rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
|
|
|
|
|
|
+ rsp.scid = cpu_to_le16(chan->dcid);
|
|
|
|
+ rsp.dcid = cpu_to_le16(chan->scid);
|
|
|
|
|
|
if (l2cap_check_security(chan)) {
|
|
if (l2cap_check_security(chan)) {
|
|
if (bt_sk(sk)->defer_setup) {
|
|
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)
|
|
read_lock(&l2cap_sk_list.lock);
|
|
read_lock(&l2cap_sk_list.lock);
|
|
|
|
|
|
sk_for_each(sk, node, &l2cap_sk_list.head) {
|
|
sk_for_each(sk, node, &l2cap_sk_list.head) {
|
|
|
|
+ struct l2cap_chan *chan = l2cap_pi(sk)->chan;
|
|
|
|
+
|
|
if (state && sk->sk_state != state)
|
|
if (state && sk->sk_state != state)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- if (l2cap_pi(sk)->scid == cid) {
|
|
|
|
|
|
+ if (chan->scid == cid) {
|
|
/* Exact match. */
|
|
/* Exact match. */
|
|
if (!bacmp(&bt_sk(sk)->src, src))
|
|
if (!bacmp(&bt_sk(sk)->src, src))
|
|
break;
|
|
break;
|
|
@@ -830,10 +830,12 @@ static struct sock *l2cap_get_sock_by_psm(int state, __le16 psm, bdaddr_t *src)
|
|
read_lock(&l2cap_sk_list.lock);
|
|
read_lock(&l2cap_sk_list.lock);
|
|
|
|
|
|
sk_for_each(sk, node, &l2cap_sk_list.head) {
|
|
sk_for_each(sk, node, &l2cap_sk_list.head) {
|
|
|
|
+ struct l2cap_chan *chan = l2cap_pi(sk)->chan;
|
|
|
|
+
|
|
if (state && sk->sk_state != state)
|
|
if (state && sk->sk_state != state)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- if (l2cap_pi(sk)->psm == psm) {
|
|
|
|
|
|
+ if (chan->psm == psm) {
|
|
/* Exact match. */
|
|
/* Exact match. */
|
|
if (!bacmp(&bt_sk(sk)->src, src))
|
|
if (!bacmp(&bt_sk(sk)->src, src))
|
|
break;
|
|
break;
|
|
@@ -861,7 +863,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan)
|
|
int err;
|
|
int err;
|
|
|
|
|
|
BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst),
|
|
BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst),
|
|
- l2cap_pi(sk)->psm);
|
|
|
|
|
|
+ chan->psm);
|
|
|
|
|
|
hdev = hci_get_route(dst, src);
|
|
hdev = hci_get_route(dst, src);
|
|
if (!hdev)
|
|
if (!hdev)
|
|
@@ -871,7 +873,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan)
|
|
|
|
|
|
auth_type = l2cap_get_auth_type(chan);
|
|
auth_type = l2cap_get_auth_type(chan);
|
|
|
|
|
|
- if (l2cap_pi(sk)->dcid == L2CAP_CID_LE_DATA)
|
|
|
|
|
|
+ if (chan->dcid == L2CAP_CID_LE_DATA)
|
|
hcon = hci_connect(hdev, LE_LINK, dst,
|
|
hcon = hci_connect(hdev, LE_LINK, dst,
|
|
chan->sec_level, auth_type);
|
|
chan->sec_level, auth_type);
|
|
else
|
|
else
|
|
@@ -1231,8 +1233,9 @@ static inline int l2cap_skbuff_fromiovec(struct sock *sk, struct msghdr *msg, in
|
|
return sent;
|
|
return sent;
|
|
}
|
|
}
|
|
|
|
|
|
-struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, size_t len)
|
|
|
|
|
|
+struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
|
|
{
|
|
{
|
|
|
|
+ struct sock *sk = chan->sk;
|
|
struct l2cap_conn *conn = l2cap_pi(sk)->conn;
|
|
struct l2cap_conn *conn = l2cap_pi(sk)->conn;
|
|
struct sk_buff *skb;
|
|
struct sk_buff *skb;
|
|
int err, count, hlen = L2CAP_HDR_SIZE + 2;
|
|
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
|
|
|
|
|
|
/* Create L2CAP header */
|
|
/* Create L2CAP header */
|
|
lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
|
|
lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
|
|
- lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
|
|
|
|
|
+ lh->cid = cpu_to_le16(chan->dcid);
|
|
lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
|
|
lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
|
|
- put_unaligned_le16(l2cap_pi(sk)->psm, skb_put(skb, 2));
|
|
|
|
|
|
+ put_unaligned_le16(chan->psm, skb_put(skb, 2));
|
|
|
|
|
|
err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb);
|
|
err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb);
|
|
if (unlikely(err < 0)) {
|
|
if (unlikely(err < 0)) {
|
|
@@ -1260,8 +1263,9 @@ struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, s
|
|
return skb;
|
|
return skb;
|
|
}
|
|
}
|
|
|
|
|
|
-struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size_t len)
|
|
|
|
|
|
+struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
|
|
{
|
|
{
|
|
|
|
+ struct sock *sk = chan->sk;
|
|
struct l2cap_conn *conn = l2cap_pi(sk)->conn;
|
|
struct l2cap_conn *conn = l2cap_pi(sk)->conn;
|
|
struct sk_buff *skb;
|
|
struct sk_buff *skb;
|
|
int err, count, hlen = L2CAP_HDR_SIZE;
|
|
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
|
|
|
|
|
|
/* Create L2CAP header */
|
|
/* Create L2CAP header */
|
|
lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
|
|
lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
|
|
- lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
|
|
|
|
|
+ lh->cid = cpu_to_le16(chan->dcid);
|
|
lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
|
|
lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
|
|
|
|
|
|
err = l2cap_skbuff_fromiovec(sk, msg, len, count, skb);
|
|
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 *
|
|
|
|
|
|
/* Create L2CAP header */
|
|
/* Create L2CAP header */
|
|
lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
|
|
lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
|
|
- lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
|
|
|
|
|
+ lh->cid = cpu_to_le16(chan->dcid);
|
|
lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
|
|
lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
|
|
put_unaligned_le16(control, skb_put(skb, 2));
|
|
put_unaligned_le16(control, skb_put(skb, 2));
|
|
if (sdulen)
|
|
if (sdulen)
|
|
@@ -1697,7 +1701,7 @@ done:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- req->dcid = cpu_to_le16(pi->dcid);
|
|
|
|
|
|
+ req->dcid = cpu_to_le16(chan->dcid);
|
|
req->flags = cpu_to_le16(0);
|
|
req->flags = cpu_to_le16(0);
|
|
|
|
|
|
return ptr - data;
|
|
return ptr - data;
|
|
@@ -1850,7 +1854,7 @@ done:
|
|
if (result == L2CAP_CONF_SUCCESS)
|
|
if (result == L2CAP_CONF_SUCCESS)
|
|
chan->conf_state |= L2CAP_CONF_OUTPUT_DONE;
|
|
chan->conf_state |= L2CAP_CONF_OUTPUT_DONE;
|
|
}
|
|
}
|
|
- rsp->scid = cpu_to_le16(pi->dcid);
|
|
|
|
|
|
+ rsp->scid = cpu_to_le16(chan->dcid);
|
|
rsp->result = cpu_to_le16(result);
|
|
rsp->result = cpu_to_le16(result);
|
|
rsp->flags = cpu_to_le16(0x0000);
|
|
rsp->flags = cpu_to_le16(0x0000);
|
|
|
|
|
|
@@ -1859,15 +1863,13 @@ done:
|
|
|
|
|
|
static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, void *data, u16 *result)
|
|
static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, void *data, u16 *result)
|
|
{
|
|
{
|
|
- struct sock *sk = chan->sk;
|
|
|
|
- struct l2cap_pinfo *pi = l2cap_pi(sk);
|
|
|
|
struct l2cap_conf_req *req = data;
|
|
struct l2cap_conf_req *req = data;
|
|
void *ptr = req->data;
|
|
void *ptr = req->data;
|
|
int type, olen;
|
|
int type, olen;
|
|
unsigned long val;
|
|
unsigned long val;
|
|
struct l2cap_conf_rfc rfc;
|
|
struct l2cap_conf_rfc rfc;
|
|
|
|
|
|
- BT_DBG("sk %p, rsp %p, len %d, req %p", sk, rsp, len, data);
|
|
|
|
|
|
+ BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
|
|
|
|
|
|
while (len >= L2CAP_CONF_OPT_SIZE) {
|
|
while (len >= L2CAP_CONF_OPT_SIZE) {
|
|
len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
|
|
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- req->dcid = cpu_to_le16(pi->dcid);
|
|
|
|
|
|
+ req->dcid = cpu_to_le16(chan->dcid);
|
|
req->flags = cpu_to_le16(0x0000);
|
|
req->flags = cpu_to_le16(0x0000);
|
|
|
|
|
|
return ptr - data;
|
|
return ptr - data;
|
|
}
|
|
}
|
|
|
|
|
|
-static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 flags)
|
|
|
|
|
|
+static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data, u16 result, u16 flags)
|
|
{
|
|
{
|
|
struct l2cap_conf_rsp *rsp = data;
|
|
struct l2cap_conf_rsp *rsp = data;
|
|
void *ptr = rsp->data;
|
|
void *ptr = rsp->data;
|
|
|
|
|
|
- BT_DBG("sk %p", sk);
|
|
|
|
|
|
+ BT_DBG("chan %p", chan);
|
|
|
|
|
|
- rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
|
|
|
|
|
+ rsp->scid = cpu_to_le16(chan->dcid);
|
|
rsp->result = cpu_to_le16(result);
|
|
rsp->result = cpu_to_le16(result);
|
|
rsp->flags = cpu_to_le16(flags);
|
|
rsp->flags = cpu_to_le16(flags);
|
|
|
|
|
|
@@ -1950,8 +1952,8 @@ void __l2cap_connect_rsp_defer(struct sock *sk)
|
|
|
|
|
|
sk->sk_state = BT_CONFIG;
|
|
sk->sk_state = BT_CONFIG;
|
|
|
|
|
|
- rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
|
|
|
- rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
|
|
|
|
|
|
+ rsp.scid = cpu_to_le16(chan->dcid);
|
|
|
|
+ rsp.dcid = cpu_to_le16(chan->scid);
|
|
rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
|
|
rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
|
|
rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
|
|
rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
|
|
l2cap_send_cmd(conn, chan->ident,
|
|
l2cap_send_cmd(conn, chan->ident,
|
|
@@ -2085,14 +2087,14 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd
|
|
l2cap_sock_init(sk, parent);
|
|
l2cap_sock_init(sk, parent);
|
|
bacpy(&bt_sk(sk)->src, conn->src);
|
|
bacpy(&bt_sk(sk)->src, conn->src);
|
|
bacpy(&bt_sk(sk)->dst, conn->dst);
|
|
bacpy(&bt_sk(sk)->dst, conn->dst);
|
|
- l2cap_pi(sk)->psm = psm;
|
|
|
|
- l2cap_pi(sk)->dcid = scid;
|
|
|
|
|
|
+ chan->psm = psm;
|
|
|
|
+ chan->dcid = scid;
|
|
|
|
|
|
bt_accept_enqueue(parent, sk);
|
|
bt_accept_enqueue(parent, sk);
|
|
|
|
|
|
__l2cap_chan_add(conn, chan);
|
|
__l2cap_chan_add(conn, chan);
|
|
|
|
|
|
- dcid = l2cap_pi(sk)->scid;
|
|
|
|
|
|
+ dcid = chan->scid;
|
|
|
|
|
|
l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
|
|
l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
|
|
|
|
|
|
@@ -2190,7 +2192,7 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd
|
|
case L2CAP_CR_SUCCESS:
|
|
case L2CAP_CR_SUCCESS:
|
|
sk->sk_state = BT_CONFIG;
|
|
sk->sk_state = BT_CONFIG;
|
|
chan->ident = 0;
|
|
chan->ident = 0;
|
|
- l2cap_pi(sk)->dcid = dcid;
|
|
|
|
|
|
+ chan->dcid = dcid;
|
|
chan->conf_state &= ~L2CAP_CONF_CONNECT_PEND;
|
|
chan->conf_state &= ~L2CAP_CONF_CONNECT_PEND;
|
|
|
|
|
|
if (chan->conf_state & L2CAP_CONF_REQ_SENT)
|
|
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
|
|
len = cmd_len - sizeof(*req);
|
|
len = cmd_len - sizeof(*req);
|
|
if (chan->conf_len + len > sizeof(chan->conf_req)) {
|
|
if (chan->conf_len + len > sizeof(chan->conf_req)) {
|
|
l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
|
|
l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
|
|
- l2cap_build_conf_rsp(sk, rsp,
|
|
|
|
|
|
+ l2cap_build_conf_rsp(chan, rsp,
|
|
L2CAP_CONF_REJECT, flags), rsp);
|
|
L2CAP_CONF_REJECT, flags), rsp);
|
|
goto unlock;
|
|
goto unlock;
|
|
}
|
|
}
|
|
@@ -2282,7 +2284,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
|
|
if (flags & 0x0001) {
|
|
if (flags & 0x0001) {
|
|
/* Incomplete config. Send empty response. */
|
|
/* Incomplete config. Send empty response. */
|
|
l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
|
|
l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
|
|
- l2cap_build_conf_rsp(sk, rsp,
|
|
|
|
|
|
+ l2cap_build_conf_rsp(chan, rsp,
|
|
L2CAP_CONF_SUCCESS, 0x0001), rsp);
|
|
L2CAP_CONF_SUCCESS, 0x0001), rsp);
|
|
goto unlock;
|
|
goto unlock;
|
|
}
|
|
}
|
|
@@ -2432,8 +2434,8 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd
|
|
|
|
|
|
sk = chan->sk;
|
|
sk = chan->sk;
|
|
|
|
|
|
- rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
|
|
|
|
- rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
|
|
|
|
|
+ rsp.dcid = cpu_to_le16(chan->scid);
|
|
|
|
+ rsp.scid = cpu_to_le16(chan->dcid);
|
|
l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
|
|
l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
|
|
|
|
|
|
sk->sk_shutdown = SHUTDOWN_MASK;
|
|
sk->sk_shutdown = SHUTDOWN_MASK;
|
|
@@ -3920,8 +3922,8 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
|
|
if (sk->sk_state == BT_CONNECT) {
|
|
if (sk->sk_state == BT_CONNECT) {
|
|
if (!status) {
|
|
if (!status) {
|
|
struct l2cap_conn_req req;
|
|
struct l2cap_conn_req req;
|
|
- req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
|
|
|
|
- req.psm = l2cap_pi(sk)->psm;
|
|
|
|
|
|
+ req.scid = cpu_to_le16(chan->scid);
|
|
|
|
+ req.psm = chan->psm;
|
|
|
|
|
|
chan->ident = l2cap_get_ident(conn);
|
|
chan->ident = l2cap_get_ident(conn);
|
|
chan->conf_state |= L2CAP_CONF_CONNECT_PEND;
|
|
chan->conf_state |= L2CAP_CONF_CONNECT_PEND;
|
|
@@ -3945,8 +3947,8 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
|
|
result = L2CAP_CR_SEC_BLOCK;
|
|
result = L2CAP_CR_SEC_BLOCK;
|
|
}
|
|
}
|
|
|
|
|
|
- rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
|
|
|
- rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
|
|
|
|
|
|
+ rsp.scid = cpu_to_le16(chan->dcid);
|
|
|
|
+ rsp.dcid = cpu_to_le16(chan->scid);
|
|
rsp.result = cpu_to_le16(result);
|
|
rsp.result = cpu_to_le16(result);
|
|
rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
|
|
rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
|
|
l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
|
|
l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
|
|
@@ -4086,8 +4088,8 @@ static int l2cap_debugfs_show(struct seq_file *f, void *p)
|
|
seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
|
|
seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
|
|
batostr(&bt_sk(sk)->src),
|
|
batostr(&bt_sk(sk)->src),
|
|
batostr(&bt_sk(sk)->dst),
|
|
batostr(&bt_sk(sk)->dst),
|
|
- sk->sk_state, __le16_to_cpu(pi->psm),
|
|
|
|
- pi->scid, pi->dcid,
|
|
|
|
|
|
+ sk->sk_state, __le16_to_cpu(chan->psm),
|
|
|
|
+ chan->scid, chan->dcid,
|
|
chan->imtu, chan->omtu, chan->sec_level,
|
|
chan->imtu, chan->omtu, chan->sec_level,
|
|
chan->mode);
|
|
chan->mode);
|
|
}
|
|
}
|