Skip to content

Commit

Permalink
Bluetooth: A2MP: Process A2MP Create Physlink Request
Browse files Browse the repository at this point in the history
Placeholder for A2MP Create Physlink Request.
Handles requests with invalid controler id as shown below:

...
> ACL data: handle 11 flags 0x02 dlen 50
    A2MP: Create Physical Link req: local id 1 remote id 85
      Assoc data:
        <skipped>
< ACL data: handle 11 flags 0x00 dlen 15
    A2MP: Create Physical Link rsp: local id 85 remote id 1 status 1
      Invalid Controller ID
...

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
  • Loading branch information
Andrei Emeltchenko authored and Johan Hedberg committed Jun 5, 2012
1 parent a28381d commit e072f5d
Showing 1 changed file with 40 additions and 0 deletions.
40 changes: 40 additions & 0 deletions net/bluetooth/a2mp.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,43 @@ static int a2mp_getampassoc_req(struct amp_mgr *mgr, struct sk_buff *skb,
return 0;
}

static int a2mp_createphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb,
struct a2mp_cmd *hdr)
{
struct a2mp_physlink_req *req = (void *) skb->data;

struct a2mp_physlink_rsp rsp;
struct hci_dev *hdev;

if (le16_to_cpu(hdr->len) < sizeof(*req))
return -EINVAL;

BT_DBG("local_id %d, remote_id %d", req->local_id, req->remote_id);

rsp.local_id = req->remote_id;
rsp.remote_id = req->local_id;

hdev = hci_dev_get(req->remote_id);
if (!hdev || hdev->amp_type != HCI_AMP) {
rsp.status = A2MP_STATUS_INVALID_CTRL_ID;
goto send_rsp;
}

/* TODO process physlink create */

rsp.status = A2MP_STATUS_SUCCESS;

send_rsp:
if (hdev)
hci_dev_put(hdev);

a2mp_send(mgr, A2MP_CREATEPHYSLINK_RSP, hdr->ident, sizeof(rsp),
&rsp);

skb_pull(skb, le16_to_cpu(hdr->len));
return 0;
}

/* Handle A2MP signalling */
static int a2mp_chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
{
Expand Down Expand Up @@ -289,6 +326,9 @@ static int a2mp_chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
break;

case A2MP_CREATEPHYSLINK_REQ:
err = a2mp_createphyslink_req(mgr, skb, hdr);
break;

case A2MP_DISCONNPHYSLINK_REQ:
case A2MP_CHANGE_RSP:
case A2MP_DISCOVER_RSP:
Expand Down

0 comments on commit e072f5d

Please sign in to comment.