diff options
author | Andrei Emeltchenko <andrei.emeltchenko@intel.com> | 2012-05-29 12:59:03 +0200 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2012-06-05 05:34:12 +0200 |
commit | f6d3c6e783b0e9f75b18232f8ff8cd5dbc3f7301 (patch) | |
tree | 868a752db0c703cdb9152ada0c2e3e6f276d7545 /net/bluetooth | |
parent | Bluetooth: A2MP: AMP Manager basic functions (diff) | |
download | linux-f6d3c6e783b0e9f75b18232f8ff8cd5dbc3f7301.tar.xz linux-f6d3c6e783b0e9f75b18232f8ff8cd5dbc3f7301.zip |
Bluetooth: A2MP: Build and Send msg helpers
Helper function to build and send A2MP messages.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth')
-rw-r--r-- | net/bluetooth/a2mp.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/net/bluetooth/a2mp.c b/net/bluetooth/a2mp.c index 3c241c2b3e1a..53f49a0b7f9a 100644 --- a/net/bluetooth/a2mp.c +++ b/net/bluetooth/a2mp.c @@ -17,6 +17,52 @@ #include <net/bluetooth/l2cap.h> #include <net/bluetooth/a2mp.h> +/* A2MP build & send command helper functions */ +static struct a2mp_cmd *__a2mp_build(u8 code, u8 ident, u16 len, void *data) +{ + struct a2mp_cmd *cmd; + int plen; + + plen = sizeof(*cmd) + len; + cmd = kzalloc(plen, GFP_KERNEL); + if (!cmd) + return NULL; + + cmd->code = code; + cmd->ident = ident; + cmd->len = cpu_to_le16(len); + + memcpy(cmd->data, data, len); + + return cmd; +} + +static void a2mp_send(struct amp_mgr *mgr, u8 code, u8 ident, u16 len, + void *data) +{ + struct l2cap_chan *chan = mgr->a2mp_chan; + struct a2mp_cmd *cmd; + u16 total_len = len + sizeof(*cmd); + struct kvec iv; + struct msghdr msg; + + cmd = __a2mp_build(code, ident, len, data); + if (!cmd) + return; + + iv.iov_base = cmd; + iv.iov_len = total_len; + + memset(&msg, 0, sizeof(msg)); + + msg.msg_iov = (struct iovec *) &iv; + msg.msg_iovlen = 1; + + l2cap_chan_send(chan, &msg, total_len, 0); + + kfree(cmd); +} + static struct l2cap_ops a2mp_chan_ops = { .name = "L2CAP A2MP channel", }; |