GNU Linux-libre 4.9.331-gnu1
[releases.git] / net / bluetooth / a2mp.c
1 /*
2    Copyright (c) 2010,2011 Code Aurora Forum.  All rights reserved.
3    Copyright (c) 2011,2012 Intel Corp.
4
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.
8
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.
13 */
14
15 #include <net/bluetooth/bluetooth.h>
16 #include <net/bluetooth/hci_core.h>
17 #include <net/bluetooth/l2cap.h>
18
19 #include "hci_request.h"
20 #include "a2mp.h"
21 #include "amp.h"
22
23 #define A2MP_FEAT_EXT   0x8000
24
25 /* Global AMP Manager list */
26 static LIST_HEAD(amp_mgr_list);
27 static DEFINE_MUTEX(amp_mgr_list_lock);
28
29 /* A2MP build & send command helper functions */
30 static struct a2mp_cmd *__a2mp_build(u8 code, u8 ident, u16 len, void *data)
31 {
32         struct a2mp_cmd *cmd;
33         int plen;
34
35         plen = sizeof(*cmd) + len;
36         cmd = kzalloc(plen, GFP_KERNEL);
37         if (!cmd)
38                 return NULL;
39
40         cmd->code = code;
41         cmd->ident = ident;
42         cmd->len = cpu_to_le16(len);
43
44         memcpy(cmd->data, data, len);
45
46         return cmd;
47 }
48
49 static void a2mp_send(struct amp_mgr *mgr, u8 code, u8 ident, u16 len, void *data)
50 {
51         struct l2cap_chan *chan = mgr->a2mp_chan;
52         struct a2mp_cmd *cmd;
53         u16 total_len = len + sizeof(*cmd);
54         struct kvec iv;
55         struct msghdr msg;
56
57         cmd = __a2mp_build(code, ident, len, data);
58         if (!cmd)
59                 return;
60
61         iv.iov_base = cmd;
62         iv.iov_len = total_len;
63
64         memset(&msg, 0, sizeof(msg));
65
66         iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, &iv, 1, total_len);
67
68         l2cap_chan_send(chan, &msg, total_len);
69
70         kfree(cmd);
71 }
72
73 static u8 __next_ident(struct amp_mgr *mgr)
74 {
75         if (++mgr->ident == 0)
76                 mgr->ident = 1;
77
78         return mgr->ident;
79 }
80
81 static struct amp_mgr *amp_mgr_lookup_by_state(u8 state)
82 {
83         struct amp_mgr *mgr;
84
85         mutex_lock(&amp_mgr_list_lock);
86         list_for_each_entry(mgr, &amp_mgr_list, list) {
87                 if (test_and_clear_bit(state, &mgr->state)) {
88                         amp_mgr_get(mgr);
89                         mutex_unlock(&amp_mgr_list_lock);
90                         return mgr;
91                 }
92         }
93         mutex_unlock(&amp_mgr_list_lock);
94
95         return NULL;
96 }
97
98 /* hci_dev_list shall be locked */
99 static void __a2mp_add_cl(struct amp_mgr *mgr, struct a2mp_cl *cl)
100 {
101         struct hci_dev *hdev;
102         int i = 1;
103
104         cl[0].id = AMP_ID_BREDR;
105         cl[0].type = AMP_TYPE_BREDR;
106         cl[0].status = AMP_STATUS_BLUETOOTH_ONLY;
107
108         list_for_each_entry(hdev, &hci_dev_list, list) {
109                 if (hdev->dev_type == HCI_AMP) {
110                         cl[i].id = hdev->id;
111                         cl[i].type = hdev->amp_type;
112                         if (test_bit(HCI_UP, &hdev->flags))
113                                 cl[i].status = hdev->amp_status;
114                         else
115                                 cl[i].status = AMP_STATUS_POWERED_DOWN;
116                         i++;
117                 }
118         }
119 }
120
121 /* Processing A2MP messages */
122 static int a2mp_command_rej(struct amp_mgr *mgr, struct sk_buff *skb,
123                             struct a2mp_cmd *hdr)
124 {
125         struct a2mp_cmd_rej *rej = (void *) skb->data;
126
127         if (le16_to_cpu(hdr->len) < sizeof(*rej))
128                 return -EINVAL;
129
130         BT_DBG("ident %d reason %d", hdr->ident, le16_to_cpu(rej->reason));
131
132         skb_pull(skb, sizeof(*rej));
133
134         return 0;
135 }
136
137 static int a2mp_discover_req(struct amp_mgr *mgr, struct sk_buff *skb,
138                              struct a2mp_cmd *hdr)
139 {
140         struct a2mp_discov_req *req = (void *) skb->data;
141         u16 len = le16_to_cpu(hdr->len);
142         struct a2mp_discov_rsp *rsp;
143         u16 ext_feat;
144         u8 num_ctrl;
145         struct hci_dev *hdev;
146
147         if (len < sizeof(*req))
148                 return -EINVAL;
149
150         skb_pull(skb, sizeof(*req));
151
152         ext_feat = le16_to_cpu(req->ext_feat);
153
154         BT_DBG("mtu %d efm 0x%4.4x", le16_to_cpu(req->mtu), ext_feat);
155
156         /* check that packet is not broken for now */
157         while (ext_feat & A2MP_FEAT_EXT) {
158                 if (len < sizeof(ext_feat))
159                         return -EINVAL;
160
161                 ext_feat = get_unaligned_le16(skb->data);
162                 BT_DBG("efm 0x%4.4x", ext_feat);
163                 len -= sizeof(ext_feat);
164                 skb_pull(skb, sizeof(ext_feat));
165         }
166
167         read_lock(&hci_dev_list_lock);
168
169         /* at minimum the BR/EDR needs to be listed */
170         num_ctrl = 1;
171
172         list_for_each_entry(hdev, &hci_dev_list, list) {
173                 if (hdev->dev_type == HCI_AMP)
174                         num_ctrl++;
175         }
176
177         len = num_ctrl * sizeof(struct a2mp_cl) + sizeof(*rsp);
178         rsp = kmalloc(len, GFP_ATOMIC);
179         if (!rsp) {
180                 read_unlock(&hci_dev_list_lock);
181                 return -ENOMEM;
182         }
183
184         rsp->mtu = cpu_to_le16(L2CAP_A2MP_DEFAULT_MTU);
185         rsp->ext_feat = 0;
186
187         __a2mp_add_cl(mgr, rsp->cl);
188
189         read_unlock(&hci_dev_list_lock);
190
191         a2mp_send(mgr, A2MP_DISCOVER_RSP, hdr->ident, len, rsp);
192
193         kfree(rsp);
194         return 0;
195 }
196
197 static int a2mp_discover_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
198                              struct a2mp_cmd *hdr)
199 {
200         struct a2mp_discov_rsp *rsp = (void *) skb->data;
201         u16 len = le16_to_cpu(hdr->len);
202         struct a2mp_cl *cl;
203         u16 ext_feat;
204         bool found = false;
205
206         if (len < sizeof(*rsp))
207                 return -EINVAL;
208
209         len -= sizeof(*rsp);
210         skb_pull(skb, sizeof(*rsp));
211
212         ext_feat = le16_to_cpu(rsp->ext_feat);
213
214         BT_DBG("mtu %d efm 0x%4.4x", le16_to_cpu(rsp->mtu), ext_feat);
215
216         /* check that packet is not broken for now */
217         while (ext_feat & A2MP_FEAT_EXT) {
218                 if (len < sizeof(ext_feat))
219                         return -EINVAL;
220
221                 ext_feat = get_unaligned_le16(skb->data);
222                 BT_DBG("efm 0x%4.4x", ext_feat);
223                 len -= sizeof(ext_feat);
224                 skb_pull(skb, sizeof(ext_feat));
225         }
226
227         cl = (void *) skb->data;
228         while (len >= sizeof(*cl)) {
229                 BT_DBG("Remote AMP id %d type %d status %d", cl->id, cl->type,
230                        cl->status);
231
232                 if (cl->id != AMP_ID_BREDR && cl->type != AMP_TYPE_BREDR) {
233                         struct a2mp_info_req req;
234
235                         found = true;
236
237                         memset(&req, 0, sizeof(req));
238
239                         req.id = cl->id;
240                         a2mp_send(mgr, A2MP_GETINFO_REQ, __next_ident(mgr),
241                                   sizeof(req), &req);
242                 }
243
244                 len -= sizeof(*cl);
245                 cl = (void *) skb_pull(skb, sizeof(*cl));
246         }
247
248         /* Fall back to L2CAP init sequence */
249         if (!found) {
250                 struct l2cap_conn *conn = mgr->l2cap_conn;
251                 struct l2cap_chan *chan;
252
253                 mutex_lock(&conn->chan_lock);
254
255                 list_for_each_entry(chan, &conn->chan_l, list) {
256
257                         BT_DBG("chan %p state %s", chan,
258                                state_to_string(chan->state));
259
260                         if (chan->scid == L2CAP_CID_A2MP)
261                                 continue;
262
263                         l2cap_chan_lock(chan);
264
265                         if (chan->state == BT_CONNECT)
266                                 l2cap_send_conn_req(chan);
267
268                         l2cap_chan_unlock(chan);
269                 }
270
271                 mutex_unlock(&conn->chan_lock);
272         }
273
274         return 0;
275 }
276
277 static int a2mp_change_notify(struct amp_mgr *mgr, struct sk_buff *skb,
278                               struct a2mp_cmd *hdr)
279 {
280         struct a2mp_cl *cl = (void *) skb->data;
281
282         while (skb->len >= sizeof(*cl)) {
283                 BT_DBG("Controller id %d type %d status %d", cl->id, cl->type,
284                        cl->status);
285                 cl = (struct a2mp_cl *) skb_pull(skb, sizeof(*cl));
286         }
287
288         /* TODO send A2MP_CHANGE_RSP */
289
290         return 0;
291 }
292
293 static void read_local_amp_info_complete(struct hci_dev *hdev, u8 status,
294                                          u16 opcode)
295 {
296         BT_DBG("%s status 0x%2.2x", hdev->name, status);
297
298         a2mp_send_getinfo_rsp(hdev);
299 }
300
301 static int a2mp_getinfo_req(struct amp_mgr *mgr, struct sk_buff *skb,
302                             struct a2mp_cmd *hdr)
303 {
304         struct a2mp_info_req *req  = (void *) skb->data;
305         struct hci_dev *hdev;
306         struct hci_request hreq;
307         int err = 0;
308
309         if (le16_to_cpu(hdr->len) < sizeof(*req))
310                 return -EINVAL;
311
312         BT_DBG("id %d", req->id);
313
314         hdev = hci_dev_get(req->id);
315         if (!hdev || hdev->dev_type != HCI_AMP) {
316                 struct a2mp_info_rsp rsp;
317
318                 memset(&rsp, 0, sizeof(rsp));
319
320                 rsp.id = req->id;
321                 rsp.status = A2MP_STATUS_INVALID_CTRL_ID;
322
323                 a2mp_send(mgr, A2MP_GETINFO_RSP, hdr->ident, sizeof(rsp),
324                           &rsp);
325
326                 goto done;
327         }
328
329         set_bit(READ_LOC_AMP_INFO, &mgr->state);
330         hci_req_init(&hreq, hdev);
331         hci_req_add(&hreq, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL);
332         err = hci_req_run(&hreq, read_local_amp_info_complete);
333         if (err < 0)
334                 a2mp_send_getinfo_rsp(hdev);
335
336 done:
337         if (hdev)
338                 hci_dev_put(hdev);
339
340         skb_pull(skb, sizeof(*req));
341         return 0;
342 }
343
344 static int a2mp_getinfo_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
345                             struct a2mp_cmd *hdr)
346 {
347         struct a2mp_info_rsp *rsp = (struct a2mp_info_rsp *) skb->data;
348         struct a2mp_amp_assoc_req req;
349         struct amp_ctrl *ctrl;
350
351         if (le16_to_cpu(hdr->len) < sizeof(*rsp))
352                 return -EINVAL;
353
354         BT_DBG("id %d status 0x%2.2x", rsp->id, rsp->status);
355
356         if (rsp->status)
357                 return -EINVAL;
358
359         ctrl = amp_ctrl_add(mgr, rsp->id);
360         if (!ctrl)
361                 return -ENOMEM;
362
363         memset(&req, 0, sizeof(req));
364
365         req.id = rsp->id;
366         a2mp_send(mgr, A2MP_GETAMPASSOC_REQ, __next_ident(mgr), sizeof(req),
367                   &req);
368
369         skb_pull(skb, sizeof(*rsp));
370         return 0;
371 }
372
373 static int a2mp_getampassoc_req(struct amp_mgr *mgr, struct sk_buff *skb,
374                                 struct a2mp_cmd *hdr)
375 {
376         struct a2mp_amp_assoc_req *req = (void *) skb->data;
377         struct hci_dev *hdev;
378         struct amp_mgr *tmp;
379
380         if (le16_to_cpu(hdr->len) < sizeof(*req))
381                 return -EINVAL;
382
383         BT_DBG("id %d", req->id);
384
385         /* Make sure that other request is not processed */
386         tmp = amp_mgr_lookup_by_state(READ_LOC_AMP_ASSOC);
387
388         hdev = hci_dev_get(req->id);
389         if (!hdev || hdev->amp_type == AMP_TYPE_BREDR || tmp) {
390                 struct a2mp_amp_assoc_rsp rsp;
391
392                 memset(&rsp, 0, sizeof(rsp));
393                 rsp.id = req->id;
394
395                 if (tmp) {
396                         rsp.status = A2MP_STATUS_COLLISION_OCCURED;
397                         amp_mgr_put(tmp);
398                 } else {
399                         rsp.status = A2MP_STATUS_INVALID_CTRL_ID;
400                 }
401
402                 a2mp_send(mgr, A2MP_GETAMPASSOC_RSP, hdr->ident, sizeof(rsp),
403                           &rsp);
404
405                 goto done;
406         }
407
408         amp_read_loc_assoc(hdev, mgr);
409
410 done:
411         if (hdev)
412                 hci_dev_put(hdev);
413
414         skb_pull(skb, sizeof(*req));
415         return 0;
416 }
417
418 static int a2mp_getampassoc_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
419                                 struct a2mp_cmd *hdr)
420 {
421         struct a2mp_amp_assoc_rsp *rsp = (void *) skb->data;
422         u16 len = le16_to_cpu(hdr->len);
423         struct hci_dev *hdev;
424         struct amp_ctrl *ctrl;
425         struct hci_conn *hcon;
426         size_t assoc_len;
427
428         if (len < sizeof(*rsp))
429                 return -EINVAL;
430
431         assoc_len = len - sizeof(*rsp);
432
433         BT_DBG("id %d status 0x%2.2x assoc len %zu", rsp->id, rsp->status,
434                assoc_len);
435
436         if (rsp->status)
437                 return -EINVAL;
438
439         /* Save remote ASSOC data */
440         ctrl = amp_ctrl_lookup(mgr, rsp->id);
441         if (ctrl) {
442                 u8 *assoc;
443
444                 assoc = kmemdup(rsp->amp_assoc, assoc_len, GFP_KERNEL);
445                 if (!assoc) {
446                         amp_ctrl_put(ctrl);
447                         return -ENOMEM;
448                 }
449
450                 ctrl->assoc = assoc;
451                 ctrl->assoc_len = assoc_len;
452                 ctrl->assoc_rem_len = assoc_len;
453                 ctrl->assoc_len_so_far = 0;
454
455                 amp_ctrl_put(ctrl);
456         }
457
458         /* Create Phys Link */
459         hdev = hci_dev_get(rsp->id);
460         if (!hdev)
461                 return -EINVAL;
462
463         hcon = phylink_add(hdev, mgr, rsp->id, true);
464         if (!hcon)
465                 goto done;
466
467         BT_DBG("Created hcon %p: loc:%d -> rem:%d", hcon, hdev->id, rsp->id);
468
469         mgr->bredr_chan->remote_amp_id = rsp->id;
470
471         amp_create_phylink(hdev, mgr, hcon);
472
473 done:
474         hci_dev_put(hdev);
475         skb_pull(skb, len);
476         return 0;
477 }
478
479 static int a2mp_createphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb,
480                                    struct a2mp_cmd *hdr)
481 {
482         struct a2mp_physlink_req *req = (void *) skb->data;
483         struct a2mp_physlink_rsp rsp;
484         struct hci_dev *hdev;
485         struct hci_conn *hcon;
486         struct amp_ctrl *ctrl;
487
488         if (le16_to_cpu(hdr->len) < sizeof(*req))
489                 return -EINVAL;
490
491         BT_DBG("local_id %d, remote_id %d", req->local_id, req->remote_id);
492
493         memset(&rsp, 0, sizeof(rsp));
494
495         rsp.local_id = req->remote_id;
496         rsp.remote_id = req->local_id;
497
498         hdev = hci_dev_get(req->remote_id);
499         if (!hdev || hdev->amp_type == AMP_TYPE_BREDR) {
500                 rsp.status = A2MP_STATUS_INVALID_CTRL_ID;
501                 goto send_rsp;
502         }
503
504         ctrl = amp_ctrl_lookup(mgr, rsp.remote_id);
505         if (!ctrl) {
506                 ctrl = amp_ctrl_add(mgr, rsp.remote_id);
507                 if (ctrl) {
508                         amp_ctrl_get(ctrl);
509                 } else {
510                         rsp.status = A2MP_STATUS_UNABLE_START_LINK_CREATION;
511                         goto send_rsp;
512                 }
513         }
514
515         if (ctrl) {
516                 size_t assoc_len = le16_to_cpu(hdr->len) - sizeof(*req);
517                 u8 *assoc;
518
519                 assoc = kmemdup(req->amp_assoc, assoc_len, GFP_KERNEL);
520                 if (!assoc) {
521                         amp_ctrl_put(ctrl);
522                         hci_dev_put(hdev);
523                         return -ENOMEM;
524                 }
525
526                 ctrl->assoc = assoc;
527                 ctrl->assoc_len = assoc_len;
528                 ctrl->assoc_rem_len = assoc_len;
529                 ctrl->assoc_len_so_far = 0;
530
531                 amp_ctrl_put(ctrl);
532         }
533
534         hcon = phylink_add(hdev, mgr, req->local_id, false);
535         if (hcon) {
536                 amp_accept_phylink(hdev, mgr, hcon);
537                 rsp.status = A2MP_STATUS_SUCCESS;
538         } else {
539                 rsp.status = A2MP_STATUS_UNABLE_START_LINK_CREATION;
540         }
541
542 send_rsp:
543         if (hdev)
544                 hci_dev_put(hdev);
545
546         /* Reply error now and success after HCI Write Remote AMP Assoc
547            command complete with success status
548          */
549         if (rsp.status != A2MP_STATUS_SUCCESS) {
550                 a2mp_send(mgr, A2MP_CREATEPHYSLINK_RSP, hdr->ident,
551                           sizeof(rsp), &rsp);
552         } else {
553                 set_bit(WRITE_REMOTE_AMP_ASSOC, &mgr->state);
554                 mgr->ident = hdr->ident;
555         }
556
557         skb_pull(skb, le16_to_cpu(hdr->len));
558         return 0;
559 }
560
561 static int a2mp_discphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb,
562                                  struct a2mp_cmd *hdr)
563 {
564         struct a2mp_physlink_req *req = (void *) skb->data;
565         struct a2mp_physlink_rsp rsp;
566         struct hci_dev *hdev;
567         struct hci_conn *hcon;
568
569         if (le16_to_cpu(hdr->len) < sizeof(*req))
570                 return -EINVAL;
571
572         BT_DBG("local_id %d remote_id %d", req->local_id, req->remote_id);
573
574         memset(&rsp, 0, sizeof(rsp));
575
576         rsp.local_id = req->remote_id;
577         rsp.remote_id = req->local_id;
578         rsp.status = A2MP_STATUS_SUCCESS;
579
580         hdev = hci_dev_get(req->remote_id);
581         if (!hdev) {
582                 rsp.status = A2MP_STATUS_INVALID_CTRL_ID;
583                 goto send_rsp;
584         }
585
586         hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
587                                        &mgr->l2cap_conn->hcon->dst);
588         if (!hcon) {
589                 BT_ERR("No phys link exist");
590                 rsp.status = A2MP_STATUS_NO_PHYSICAL_LINK_EXISTS;
591                 goto clean;
592         }
593
594         /* TODO Disconnect Phys Link here */
595
596 clean:
597         hci_dev_put(hdev);
598
599 send_rsp:
600         a2mp_send(mgr, A2MP_DISCONNPHYSLINK_RSP, hdr->ident, sizeof(rsp), &rsp);
601
602         skb_pull(skb, sizeof(*req));
603         return 0;
604 }
605
606 static inline int a2mp_cmd_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
607                                struct a2mp_cmd *hdr)
608 {
609         BT_DBG("ident %d code 0x%2.2x", hdr->ident, hdr->code);
610
611         skb_pull(skb, le16_to_cpu(hdr->len));
612         return 0;
613 }
614
615 /* Handle A2MP signalling */
616 static int a2mp_chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
617 {
618         struct a2mp_cmd *hdr;
619         struct amp_mgr *mgr = chan->data;
620         int err = 0;
621
622         amp_mgr_get(mgr);
623
624         while (skb->len >= sizeof(*hdr)) {
625                 u16 len;
626
627                 hdr = (void *) skb->data;
628                 len = le16_to_cpu(hdr->len);
629
630                 BT_DBG("code 0x%2.2x id %d len %u", hdr->code, hdr->ident, len);
631
632                 skb_pull(skb, sizeof(*hdr));
633
634                 if (len > skb->len || !hdr->ident) {
635                         err = -EINVAL;
636                         break;
637                 }
638
639                 mgr->ident = hdr->ident;
640
641                 switch (hdr->code) {
642                 case A2MP_COMMAND_REJ:
643                         a2mp_command_rej(mgr, skb, hdr);
644                         break;
645
646                 case A2MP_DISCOVER_REQ:
647                         err = a2mp_discover_req(mgr, skb, hdr);
648                         break;
649
650                 case A2MP_CHANGE_NOTIFY:
651                         err = a2mp_change_notify(mgr, skb, hdr);
652                         break;
653
654                 case A2MP_GETINFO_REQ:
655                         err = a2mp_getinfo_req(mgr, skb, hdr);
656                         break;
657
658                 case A2MP_GETAMPASSOC_REQ:
659                         err = a2mp_getampassoc_req(mgr, skb, hdr);
660                         break;
661
662                 case A2MP_CREATEPHYSLINK_REQ:
663                         err = a2mp_createphyslink_req(mgr, skb, hdr);
664                         break;
665
666                 case A2MP_DISCONNPHYSLINK_REQ:
667                         err = a2mp_discphyslink_req(mgr, skb, hdr);
668                         break;
669
670                 case A2MP_DISCOVER_RSP:
671                         err = a2mp_discover_rsp(mgr, skb, hdr);
672                         break;
673
674                 case A2MP_GETINFO_RSP:
675                         err = a2mp_getinfo_rsp(mgr, skb, hdr);
676                         break;
677
678                 case A2MP_GETAMPASSOC_RSP:
679                         err = a2mp_getampassoc_rsp(mgr, skb, hdr);
680                         break;
681
682                 case A2MP_CHANGE_RSP:
683                 case A2MP_CREATEPHYSLINK_RSP:
684                 case A2MP_DISCONNPHYSLINK_RSP:
685                         err = a2mp_cmd_rsp(mgr, skb, hdr);
686                         break;
687
688                 default:
689                         BT_ERR("Unknown A2MP sig cmd 0x%2.2x", hdr->code);
690                         err = -EINVAL;
691                         break;
692                 }
693         }
694
695         if (err) {
696                 struct a2mp_cmd_rej rej;
697
698                 memset(&rej, 0, sizeof(rej));
699
700                 rej.reason = cpu_to_le16(0);
701                 hdr = (void *) skb->data;
702
703                 BT_DBG("Send A2MP Rej: cmd 0x%2.2x err %d", hdr->code, err);
704
705                 a2mp_send(mgr, A2MP_COMMAND_REJ, hdr->ident, sizeof(rej),
706                           &rej);
707         }
708
709         /* Always free skb and return success error code to prevent
710            from sending L2CAP Disconnect over A2MP channel */
711         kfree_skb(skb);
712
713         amp_mgr_put(mgr);
714
715         return 0;
716 }
717
718 static void a2mp_chan_close_cb(struct l2cap_chan *chan)
719 {
720         l2cap_chan_put(chan);
721 }
722
723 static void a2mp_chan_state_change_cb(struct l2cap_chan *chan, int state,
724                                       int err)
725 {
726         struct amp_mgr *mgr = chan->data;
727
728         if (!mgr)
729                 return;
730
731         BT_DBG("chan %p state %s", chan, state_to_string(state));
732
733         chan->state = state;
734
735         switch (state) {
736         case BT_CLOSED:
737                 if (mgr)
738                         amp_mgr_put(mgr);
739                 break;
740         }
741 }
742
743 static struct sk_buff *a2mp_chan_alloc_skb_cb(struct l2cap_chan *chan,
744                                               unsigned long hdr_len,
745                                               unsigned long len, int nb)
746 {
747         struct sk_buff *skb;
748
749         skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
750         if (!skb)
751                 return ERR_PTR(-ENOMEM);
752
753         return skb;
754 }
755
756 static const struct l2cap_ops a2mp_chan_ops = {
757         .name = "L2CAP A2MP channel",
758         .recv = a2mp_chan_recv_cb,
759         .close = a2mp_chan_close_cb,
760         .state_change = a2mp_chan_state_change_cb,
761         .alloc_skb = a2mp_chan_alloc_skb_cb,
762
763         /* Not implemented for A2MP */
764         .new_connection = l2cap_chan_no_new_connection,
765         .teardown = l2cap_chan_no_teardown,
766         .ready = l2cap_chan_no_ready,
767         .defer = l2cap_chan_no_defer,
768         .resume = l2cap_chan_no_resume,
769         .set_shutdown = l2cap_chan_no_set_shutdown,
770         .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
771 };
772
773 static struct l2cap_chan *a2mp_chan_open(struct l2cap_conn *conn, bool locked)
774 {
775         struct l2cap_chan *chan;
776         int err;
777
778         chan = l2cap_chan_create();
779         if (!chan)
780                 return NULL;
781
782         BT_DBG("chan %p", chan);
783
784         chan->chan_type = L2CAP_CHAN_FIXED;
785         chan->scid = L2CAP_CID_A2MP;
786         chan->dcid = L2CAP_CID_A2MP;
787         chan->omtu = L2CAP_A2MP_DEFAULT_MTU;
788         chan->imtu = L2CAP_A2MP_DEFAULT_MTU;
789         chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
790
791         chan->ops = &a2mp_chan_ops;
792
793         l2cap_chan_set_defaults(chan);
794         chan->remote_max_tx = chan->max_tx;
795         chan->remote_tx_win = chan->tx_win;
796
797         chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
798         chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
799
800         skb_queue_head_init(&chan->tx_q);
801
802         chan->mode = L2CAP_MODE_ERTM;
803
804         err = l2cap_ertm_init(chan);
805         if (err < 0) {
806                 l2cap_chan_del(chan, 0);
807                 return NULL;
808         }
809
810         chan->conf_state = 0;
811
812         if (locked)
813                 __l2cap_chan_add(conn, chan);
814         else
815                 l2cap_chan_add(conn, chan);
816
817         chan->remote_mps = chan->omtu;
818         chan->mps = chan->omtu;
819
820         chan->state = BT_CONNECTED;
821
822         return chan;
823 }
824
825 /* AMP Manager functions */
826 struct amp_mgr *amp_mgr_get(struct amp_mgr *mgr)
827 {
828         BT_DBG("mgr %p orig refcnt %d", mgr, atomic_read(&mgr->kref.refcount));
829
830         kref_get(&mgr->kref);
831
832         return mgr;
833 }
834
835 static void amp_mgr_destroy(struct kref *kref)
836 {
837         struct amp_mgr *mgr = container_of(kref, struct amp_mgr, kref);
838
839         BT_DBG("mgr %p", mgr);
840
841         mutex_lock(&amp_mgr_list_lock);
842         list_del(&mgr->list);
843         mutex_unlock(&amp_mgr_list_lock);
844
845         amp_ctrl_list_flush(mgr);
846         kfree(mgr);
847 }
848
849 int amp_mgr_put(struct amp_mgr *mgr)
850 {
851         BT_DBG("mgr %p orig refcnt %d", mgr, atomic_read(&mgr->kref.refcount));
852
853         return kref_put(&mgr->kref, &amp_mgr_destroy);
854 }
855
856 static struct amp_mgr *amp_mgr_create(struct l2cap_conn *conn, bool locked)
857 {
858         struct amp_mgr *mgr;
859         struct l2cap_chan *chan;
860
861         mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
862         if (!mgr)
863                 return NULL;
864
865         BT_DBG("conn %p mgr %p", conn, mgr);
866
867         mgr->l2cap_conn = conn;
868
869         chan = a2mp_chan_open(conn, locked);
870         if (!chan) {
871                 kfree(mgr);
872                 return NULL;
873         }
874
875         mgr->a2mp_chan = chan;
876         chan->data = mgr;
877
878         conn->hcon->amp_mgr = mgr;
879
880         kref_init(&mgr->kref);
881
882         /* Remote AMP ctrl list initialization */
883         INIT_LIST_HEAD(&mgr->amp_ctrls);
884         mutex_init(&mgr->amp_ctrls_lock);
885
886         mutex_lock(&amp_mgr_list_lock);
887         list_add(&mgr->list, &amp_mgr_list);
888         mutex_unlock(&amp_mgr_list_lock);
889
890         return mgr;
891 }
892
893 struct l2cap_chan *a2mp_channel_create(struct l2cap_conn *conn,
894                                        struct sk_buff *skb)
895 {
896         struct amp_mgr *mgr;
897
898         if (conn->hcon->type != ACL_LINK)
899                 return NULL;
900
901         mgr = amp_mgr_create(conn, false);
902         if (!mgr) {
903                 BT_ERR("Could not create AMP manager");
904                 return NULL;
905         }
906
907         BT_DBG("mgr: %p chan %p", mgr, mgr->a2mp_chan);
908
909         return mgr->a2mp_chan;
910 }
911
912 void a2mp_send_getinfo_rsp(struct hci_dev *hdev)
913 {
914         struct amp_mgr *mgr;
915         struct a2mp_info_rsp rsp;
916
917         mgr = amp_mgr_lookup_by_state(READ_LOC_AMP_INFO);
918         if (!mgr)
919                 return;
920
921         BT_DBG("%s mgr %p", hdev->name, mgr);
922
923         memset(&rsp, 0, sizeof(rsp));
924
925         rsp.id = hdev->id;
926         rsp.status = A2MP_STATUS_INVALID_CTRL_ID;
927
928         if (hdev->amp_type != AMP_TYPE_BREDR) {
929                 rsp.status = 0;
930                 rsp.total_bw = cpu_to_le32(hdev->amp_total_bw);
931                 rsp.max_bw = cpu_to_le32(hdev->amp_max_bw);
932                 rsp.min_latency = cpu_to_le32(hdev->amp_min_latency);
933                 rsp.pal_cap = cpu_to_le16(hdev->amp_pal_cap);
934                 rsp.assoc_size = cpu_to_le16(hdev->amp_assoc_size);
935         }
936
937         a2mp_send(mgr, A2MP_GETINFO_RSP, mgr->ident, sizeof(rsp), &rsp);
938         amp_mgr_put(mgr);
939 }
940
941 void a2mp_send_getampassoc_rsp(struct hci_dev *hdev, u8 status)
942 {
943         struct amp_mgr *mgr;
944         struct amp_assoc *loc_assoc = &hdev->loc_assoc;
945         struct a2mp_amp_assoc_rsp *rsp;
946         size_t len;
947
948         mgr = amp_mgr_lookup_by_state(READ_LOC_AMP_ASSOC);
949         if (!mgr)
950                 return;
951
952         BT_DBG("%s mgr %p", hdev->name, mgr);
953
954         len = sizeof(struct a2mp_amp_assoc_rsp) + loc_assoc->len;
955         rsp = kzalloc(len, GFP_KERNEL);
956         if (!rsp) {
957                 amp_mgr_put(mgr);
958                 return;
959         }
960
961         rsp->id = hdev->id;
962
963         if (status) {
964                 rsp->status = A2MP_STATUS_INVALID_CTRL_ID;
965         } else {
966                 rsp->status = A2MP_STATUS_SUCCESS;
967                 memcpy(rsp->amp_assoc, loc_assoc->data, loc_assoc->len);
968         }
969
970         a2mp_send(mgr, A2MP_GETAMPASSOC_RSP, mgr->ident, len, rsp);
971         amp_mgr_put(mgr);
972         kfree(rsp);
973 }
974
975 void a2mp_send_create_phy_link_req(struct hci_dev *hdev, u8 status)
976 {
977         struct amp_mgr *mgr;
978         struct amp_assoc *loc_assoc = &hdev->loc_assoc;
979         struct a2mp_physlink_req *req;
980         struct l2cap_chan *bredr_chan;
981         size_t len;
982
983         mgr = amp_mgr_lookup_by_state(READ_LOC_AMP_ASSOC_FINAL);
984         if (!mgr)
985                 return;
986
987         len = sizeof(*req) + loc_assoc->len;
988
989         BT_DBG("%s mgr %p assoc_len %zu", hdev->name, mgr, len);
990
991         req = kzalloc(len, GFP_KERNEL);
992         if (!req) {
993                 amp_mgr_put(mgr);
994                 return;
995         }
996
997         bredr_chan = mgr->bredr_chan;
998         if (!bredr_chan)
999                 goto clean;
1000
1001         req->local_id = hdev->id;
1002         req->remote_id = bredr_chan->remote_amp_id;
1003         memcpy(req->amp_assoc, loc_assoc->data, loc_assoc->len);
1004
1005         a2mp_send(mgr, A2MP_CREATEPHYSLINK_REQ, __next_ident(mgr), len, req);
1006
1007 clean:
1008         amp_mgr_put(mgr);
1009         kfree(req);
1010 }
1011
1012 void a2mp_send_create_phy_link_rsp(struct hci_dev *hdev, u8 status)
1013 {
1014         struct amp_mgr *mgr;
1015         struct a2mp_physlink_rsp rsp;
1016         struct hci_conn *hs_hcon;
1017
1018         mgr = amp_mgr_lookup_by_state(WRITE_REMOTE_AMP_ASSOC);
1019         if (!mgr)
1020                 return;
1021
1022         memset(&rsp, 0, sizeof(rsp));
1023
1024         hs_hcon = hci_conn_hash_lookup_state(hdev, AMP_LINK, BT_CONNECT);
1025         if (!hs_hcon) {
1026                 rsp.status = A2MP_STATUS_UNABLE_START_LINK_CREATION;
1027         } else {
1028                 rsp.remote_id = hs_hcon->remote_id;
1029                 rsp.status = A2MP_STATUS_SUCCESS;
1030         }
1031
1032         BT_DBG("%s mgr %p hs_hcon %p status %u", hdev->name, mgr, hs_hcon,
1033                status);
1034
1035         rsp.local_id = hdev->id;
1036         a2mp_send(mgr, A2MP_CREATEPHYSLINK_RSP, mgr->ident, sizeof(rsp), &rsp);
1037         amp_mgr_put(mgr);
1038 }
1039
1040 void a2mp_discover_amp(struct l2cap_chan *chan)
1041 {
1042         struct l2cap_conn *conn = chan->conn;
1043         struct amp_mgr *mgr = conn->hcon->amp_mgr;
1044         struct a2mp_discov_req req;
1045
1046         BT_DBG("chan %p conn %p mgr %p", chan, conn, mgr);
1047
1048         if (!mgr) {
1049                 mgr = amp_mgr_create(conn, true);
1050                 if (!mgr)
1051                         return;
1052         }
1053
1054         mgr->bredr_chan = chan;
1055
1056         memset(&req, 0, sizeof(req));
1057
1058         req.mtu = cpu_to_le16(L2CAP_A2MP_DEFAULT_MTU);
1059         req.ext_feat = 0;
1060         a2mp_send(mgr, A2MP_DISCOVER_REQ, 1, sizeof(req), &req);
1061 }