2 Copyright (c) 2010,2011 Code Aurora Forum. All rights reserved.
3 Copyright (c) 2011,2012 Intel Corp.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License version 2 and
7 only version 2 as published by the Free Software Foundation.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
15 #include <net/bluetooth/bluetooth.h>
16 #include <net/bluetooth/hci_core.h>
17 #include <net/bluetooth/l2cap.h>
18 #include <net/bluetooth/a2mp.h>
20 /* A2MP build & send command helper functions */
21 static struct a2mp_cmd
*__a2mp_build(u8 code
, u8 ident
, u16 len
, void *data
)
26 plen
= sizeof(*cmd
) + len
;
27 cmd
= kzalloc(plen
, GFP_KERNEL
);
33 cmd
->len
= cpu_to_le16(len
);
35 memcpy(cmd
->data
, data
, len
);
40 static void a2mp_send(struct amp_mgr
*mgr
, u8 code
, u8 ident
, u16 len
,
43 struct l2cap_chan
*chan
= mgr
->a2mp_chan
;
45 u16 total_len
= len
+ sizeof(*cmd
);
49 cmd
= __a2mp_build(code
, ident
, len
, data
);
54 iv
.iov_len
= total_len
;
56 memset(&msg
, 0, sizeof(msg
));
58 msg
.msg_iov
= (struct iovec
*) &iv
;
61 l2cap_chan_send(chan
, &msg
, total_len
, 0);
66 static inline void __a2mp_cl_bredr(struct a2mp_cl
*cl
)
73 /* hci_dev_list shall be locked */
74 static void __a2mp_add_cl(struct amp_mgr
*mgr
, struct a2mp_cl
*cl
, u8 num_ctrl
)
81 list_for_each_entry(hdev
, &hci_dev_list
, list
) {
82 /* Iterate through AMP controllers */
83 if (hdev
->id
== HCI_BREDR_ID
)
86 /* Starting from second entry */
91 cl
[i
].type
= hdev
->amp_type
;
92 cl
[i
].status
= hdev
->amp_status
;
96 /* Processing A2MP messages */
97 static int a2mp_command_rej(struct amp_mgr
*mgr
, struct sk_buff
*skb
,
100 struct a2mp_cmd_rej
*rej
= (void *) skb
->data
;
102 if (le16_to_cpu(hdr
->len
) < sizeof(*rej
))
105 BT_DBG("ident %d reason %d", hdr
->ident
, le16_to_cpu(rej
->reason
));
107 skb_pull(skb
, sizeof(*rej
));
112 static int a2mp_discover_req(struct amp_mgr
*mgr
, struct sk_buff
*skb
,
113 struct a2mp_cmd
*hdr
)
115 struct a2mp_discov_req
*req
= (void *) skb
->data
;
116 u16 len
= le16_to_cpu(hdr
->len
);
117 struct a2mp_discov_rsp
*rsp
;
121 if (len
< sizeof(*req
))
124 skb_pull(skb
, sizeof(*req
));
126 ext_feat
= le16_to_cpu(req
->ext_feat
);
128 BT_DBG("mtu %d efm 0x%4.4x", le16_to_cpu(req
->mtu
), ext_feat
);
130 /* check that packet is not broken for now */
131 while (ext_feat
& A2MP_FEAT_EXT
) {
132 if (len
< sizeof(ext_feat
))
135 ext_feat
= get_unaligned_le16(skb
->data
);
136 BT_DBG("efm 0x%4.4x", ext_feat
);
137 len
-= sizeof(ext_feat
);
138 skb_pull(skb
, sizeof(ext_feat
));
141 read_lock(&hci_dev_list_lock
);
143 num_ctrl
= __hci_num_ctrl();
144 len
= num_ctrl
* sizeof(struct a2mp_cl
) + sizeof(*rsp
);
145 rsp
= kmalloc(len
, GFP_ATOMIC
);
147 read_unlock(&hci_dev_list_lock
);
151 rsp
->mtu
= __constant_cpu_to_le16(L2CAP_A2MP_DEFAULT_MTU
);
154 __a2mp_add_cl(mgr
, rsp
->cl
, num_ctrl
);
156 read_unlock(&hci_dev_list_lock
);
158 a2mp_send(mgr
, A2MP_DISCOVER_RSP
, hdr
->ident
, len
, rsp
);
164 static int a2mp_change_notify(struct amp_mgr
*mgr
, struct sk_buff
*skb
,
165 struct a2mp_cmd
*hdr
)
167 struct a2mp_cl
*cl
= (void *) skb
->data
;
169 while (skb
->len
>= sizeof(*cl
)) {
170 BT_DBG("Controller id %d type %d status %d", cl
->id
, cl
->type
,
172 cl
= (struct a2mp_cl
*) skb_pull(skb
, sizeof(*cl
));
175 /* TODO send A2MP_CHANGE_RSP */
180 static int a2mp_getinfo_req(struct amp_mgr
*mgr
, struct sk_buff
*skb
,
181 struct a2mp_cmd
*hdr
)
183 struct a2mp_info_req
*req
= (void *) skb
->data
;
184 struct a2mp_info_rsp rsp
;
185 struct hci_dev
*hdev
;
187 if (le16_to_cpu(hdr
->len
) < sizeof(*req
))
190 BT_DBG("id %d", req
->id
);
193 rsp
.status
= A2MP_STATUS_INVALID_CTRL_ID
;
195 hdev
= hci_dev_get(req
->id
);
196 if (hdev
&& hdev
->amp_type
!= HCI_BREDR
) {
198 rsp
.total_bw
= cpu_to_le32(hdev
->amp_total_bw
);
199 rsp
.max_bw
= cpu_to_le32(hdev
->amp_max_bw
);
200 rsp
.min_latency
= cpu_to_le32(hdev
->amp_min_latency
);
201 rsp
.pal_cap
= cpu_to_le16(hdev
->amp_pal_cap
);
202 rsp
.assoc_size
= cpu_to_le16(hdev
->amp_assoc_size
);
208 a2mp_send(mgr
, A2MP_GETINFO_RSP
, hdr
->ident
, sizeof(rsp
), &rsp
);
210 skb_pull(skb
, sizeof(*req
));
214 static int a2mp_getampassoc_req(struct amp_mgr
*mgr
, struct sk_buff
*skb
,
215 struct a2mp_cmd
*hdr
)
217 struct a2mp_amp_assoc_req
*req
= (void *) skb
->data
;
218 struct hci_dev
*hdev
;
220 if (le16_to_cpu(hdr
->len
) < sizeof(*req
))
223 BT_DBG("id %d", req
->id
);
225 hdev
= hci_dev_get(req
->id
);
226 if (!hdev
|| hdev
->amp_type
== HCI_BREDR
) {
227 struct a2mp_amp_assoc_rsp rsp
;
229 rsp
.status
= A2MP_STATUS_INVALID_CTRL_ID
;
231 a2mp_send(mgr
, A2MP_GETAMPASSOC_RSP
, hdr
->ident
, sizeof(rsp
),
236 /* Placeholder for HCI Read AMP Assoc */
242 skb_pull(skb
, sizeof(*req
));
246 static int a2mp_createphyslink_req(struct amp_mgr
*mgr
, struct sk_buff
*skb
,
247 struct a2mp_cmd
*hdr
)
249 struct a2mp_physlink_req
*req
= (void *) skb
->data
;
251 struct a2mp_physlink_rsp rsp
;
252 struct hci_dev
*hdev
;
254 if (le16_to_cpu(hdr
->len
) < sizeof(*req
))
257 BT_DBG("local_id %d, remote_id %d", req
->local_id
, req
->remote_id
);
259 rsp
.local_id
= req
->remote_id
;
260 rsp
.remote_id
= req
->local_id
;
262 hdev
= hci_dev_get(req
->remote_id
);
263 if (!hdev
|| hdev
->amp_type
!= HCI_AMP
) {
264 rsp
.status
= A2MP_STATUS_INVALID_CTRL_ID
;
268 /* TODO process physlink create */
270 rsp
.status
= A2MP_STATUS_SUCCESS
;
276 a2mp_send(mgr
, A2MP_CREATEPHYSLINK_RSP
, hdr
->ident
, sizeof(rsp
),
279 skb_pull(skb
, le16_to_cpu(hdr
->len
));
283 static int a2mp_discphyslink_req(struct amp_mgr
*mgr
, struct sk_buff
*skb
,
284 struct a2mp_cmd
*hdr
)
286 struct a2mp_physlink_req
*req
= (void *) skb
->data
;
287 struct a2mp_physlink_rsp rsp
;
288 struct hci_dev
*hdev
;
290 if (le16_to_cpu(hdr
->len
) < sizeof(*req
))
293 BT_DBG("local_id %d remote_id %d", req
->local_id
, req
->remote_id
);
295 rsp
.local_id
= req
->remote_id
;
296 rsp
.remote_id
= req
->local_id
;
297 rsp
.status
= A2MP_STATUS_SUCCESS
;
299 hdev
= hci_dev_get(req
->local_id
);
301 rsp
.status
= A2MP_STATUS_INVALID_CTRL_ID
;
305 /* TODO Disconnect Phys Link here */
310 a2mp_send(mgr
, A2MP_DISCONNPHYSLINK_RSP
, hdr
->ident
, sizeof(rsp
), &rsp
);
312 skb_pull(skb
, sizeof(*req
));
316 static inline int a2mp_cmd_rsp(struct amp_mgr
*mgr
, struct sk_buff
*skb
,
317 struct a2mp_cmd
*hdr
)
319 BT_DBG("ident %d code %d", hdr
->ident
, hdr
->code
);
321 skb_pull(skb
, le16_to_cpu(hdr
->len
));
325 /* Handle A2MP signalling */
326 static int a2mp_chan_recv_cb(struct l2cap_chan
*chan
, struct sk_buff
*skb
)
328 struct a2mp_cmd
*hdr
= (void *) skb
->data
;
329 struct amp_mgr
*mgr
= chan
->data
;
334 while (skb
->len
>= sizeof(*hdr
)) {
335 struct a2mp_cmd
*hdr
= (void *) skb
->data
;
336 u16 len
= le16_to_cpu(hdr
->len
);
338 BT_DBG("code 0x%02x id %d len %d", hdr
->code
, hdr
->ident
, len
);
340 skb_pull(skb
, sizeof(*hdr
));
342 if (len
> skb
->len
|| !hdr
->ident
) {
347 mgr
->ident
= hdr
->ident
;
350 case A2MP_COMMAND_REJ
:
351 a2mp_command_rej(mgr
, skb
, hdr
);
354 case A2MP_DISCOVER_REQ
:
355 err
= a2mp_discover_req(mgr
, skb
, hdr
);
358 case A2MP_CHANGE_NOTIFY
:
359 err
= a2mp_change_notify(mgr
, skb
, hdr
);
362 case A2MP_GETINFO_REQ
:
363 err
= a2mp_getinfo_req(mgr
, skb
, hdr
);
366 case A2MP_GETAMPASSOC_REQ
:
367 err
= a2mp_getampassoc_req(mgr
, skb
, hdr
);
370 case A2MP_CREATEPHYSLINK_REQ
:
371 err
= a2mp_createphyslink_req(mgr
, skb
, hdr
);
374 case A2MP_DISCONNPHYSLINK_REQ
:
375 err
= a2mp_discphyslink_req(mgr
, skb
, hdr
);
378 case A2MP_CHANGE_RSP
:
379 case A2MP_DISCOVER_RSP
:
380 case A2MP_GETINFO_RSP
:
381 case A2MP_GETAMPASSOC_RSP
:
382 case A2MP_CREATEPHYSLINK_RSP
:
383 case A2MP_DISCONNPHYSLINK_RSP
:
384 err
= a2mp_cmd_rsp(mgr
, skb
, hdr
);
388 BT_ERR("Unknown A2MP sig cmd 0x%2.2x", hdr
->code
);
395 struct a2mp_cmd_rej rej
;
396 rej
.reason
= __constant_cpu_to_le16(0);
398 BT_DBG("Send A2MP Rej: cmd 0x%2.2x err %d", hdr
->code
, err
);
400 a2mp_send(mgr
, A2MP_COMMAND_REJ
, hdr
->ident
, sizeof(rej
),
404 /* Always free skb and return success error code to prevent
405 from sending L2CAP Disconnect over A2MP channel */
413 static void a2mp_chan_close_cb(struct l2cap_chan
*chan
)
415 l2cap_chan_destroy(chan
);
418 static void a2mp_chan_state_change_cb(struct l2cap_chan
*chan
, int state
)
420 struct amp_mgr
*mgr
= chan
->data
;
425 BT_DBG("chan %p state %s", chan
, state_to_string(state
));
437 static struct sk_buff
*a2mp_chan_alloc_skb_cb(struct l2cap_chan
*chan
,
438 unsigned long len
, int nb
)
440 return bt_skb_alloc(len
, GFP_KERNEL
);
443 static struct l2cap_ops a2mp_chan_ops
= {
444 .name
= "L2CAP A2MP channel",
445 .recv
= a2mp_chan_recv_cb
,
446 .close
= a2mp_chan_close_cb
,
447 .state_change
= a2mp_chan_state_change_cb
,
448 .alloc_skb
= a2mp_chan_alloc_skb_cb
,
450 /* Not implemented for A2MP */
451 .new_connection
= l2cap_chan_no_new_connection
,
452 .teardown
= l2cap_chan_no_teardown
,
453 .ready
= l2cap_chan_no_ready
,
456 static struct l2cap_chan
*a2mp_chan_open(struct l2cap_conn
*conn
)
458 struct l2cap_chan
*chan
;
461 chan
= l2cap_chan_create();
465 BT_DBG("chan %p", chan
);
467 chan
->chan_type
= L2CAP_CHAN_CONN_FIX_A2MP
;
468 chan
->flush_to
= L2CAP_DEFAULT_FLUSH_TO
;
470 chan
->ops
= &a2mp_chan_ops
;
472 l2cap_chan_set_defaults(chan
);
473 chan
->remote_max_tx
= chan
->max_tx
;
474 chan
->remote_tx_win
= chan
->tx_win
;
476 chan
->retrans_timeout
= L2CAP_DEFAULT_RETRANS_TO
;
477 chan
->monitor_timeout
= L2CAP_DEFAULT_MONITOR_TO
;
479 skb_queue_head_init(&chan
->tx_q
);
481 chan
->mode
= L2CAP_MODE_ERTM
;
483 err
= l2cap_ertm_init(chan
);
485 l2cap_chan_del(chan
, 0);
489 chan
->conf_state
= 0;
491 l2cap_chan_add(conn
, chan
);
493 chan
->remote_mps
= chan
->omtu
;
494 chan
->mps
= chan
->omtu
;
496 chan
->state
= BT_CONNECTED
;
501 /* AMP Manager functions */
502 void amp_mgr_get(struct amp_mgr
*mgr
)
504 BT_DBG("mgr %p orig refcnt %d", mgr
, atomic_read(&mgr
->kref
.refcount
));
506 kref_get(&mgr
->kref
);
509 static void amp_mgr_destroy(struct kref
*kref
)
511 struct amp_mgr
*mgr
= container_of(kref
, struct amp_mgr
, kref
);
513 BT_DBG("mgr %p", mgr
);
518 int amp_mgr_put(struct amp_mgr
*mgr
)
520 BT_DBG("mgr %p orig refcnt %d", mgr
, atomic_read(&mgr
->kref
.refcount
));
522 return kref_put(&mgr
->kref
, &_mgr_destroy
);
525 static struct amp_mgr
*amp_mgr_create(struct l2cap_conn
*conn
)
528 struct l2cap_chan
*chan
;
530 mgr
= kzalloc(sizeof(*mgr
), GFP_KERNEL
);
534 BT_DBG("conn %p mgr %p", conn
, mgr
);
536 mgr
->l2cap_conn
= conn
;
538 chan
= a2mp_chan_open(conn
);
544 mgr
->a2mp_chan
= chan
;
547 conn
->hcon
->amp_mgr
= mgr
;
549 kref_init(&mgr
->kref
);
554 struct l2cap_chan
*a2mp_channel_create(struct l2cap_conn
*conn
,
559 mgr
= amp_mgr_create(conn
);
561 BT_ERR("Could not create AMP manager");
565 BT_DBG("mgr: %p chan %p", mgr
, mgr
->a2mp_chan
);
567 return mgr
->a2mp_chan
;