Skip to content

Commit

Permalink
Bluetooth: Add send_mode_rsp convenience function for mgmt.c
Browse files Browse the repository at this point in the history
Several management commands have similar responses but they are not
always sent asynchronously. To enable synchronous sending (from the
managment command handler function) a send_mode_rsp function is added.

Signed-off-by: Johan Hedberg <johan.hedberg@nokia.com>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
  • Loading branch information
Johan Hedberg authored and Gustavo F. Padovan committed Feb 8, 2011
1 parent ebc99fe commit 053f021
Showing 1 changed file with 29 additions and 21 deletions.
50 changes: 29 additions & 21 deletions net/bluetooth/mgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,34 @@ static int set_connectable(struct sock *sk, unsigned char *data, u16 len)
return err;
}

static int send_mode_rsp(struct sock *sk, u16 opcode, u16 index, u8 val)
{
struct mgmt_hdr *hdr;
struct mgmt_ev_cmd_complete *ev;
struct mgmt_mode *rp;
struct sk_buff *skb;

skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + sizeof(*rp), GFP_ATOMIC);
if (!skb)
return -ENOMEM;

hdr = (void *) skb_put(skb, sizeof(*hdr));
hdr->opcode = cpu_to_le16(MGMT_EV_CMD_COMPLETE);
hdr->len = cpu_to_le16(sizeof(*ev) + sizeof(*rp));

ev = (void *) skb_put(skb, sizeof(*ev));
put_unaligned_le16(opcode, &ev->opcode);

rp = (void *) skb_put(skb, sizeof(*rp));
put_unaligned_le16(index, &rp->index);
rp->val = val;

if (sock_queue_rcv_skb(sk, skb) < 0)
kfree_skb(skb);

return 0;
}

int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
unsigned char *buf;
Expand Down Expand Up @@ -594,33 +622,13 @@ struct cmd_lookup {

static void mode_rsp(struct pending_cmd *cmd, void *data)
{
struct mgmt_hdr *hdr;
struct mgmt_ev_cmd_complete *ev;
struct mgmt_mode *rp;
struct mgmt_mode *cp = cmd->cmd;
struct sk_buff *skb;
struct cmd_lookup *match = data;

if (cp->val != match->val)
return;

skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + sizeof(*rp), GFP_ATOMIC);
if (!skb)
return;

hdr = (void *) skb_put(skb, sizeof(*hdr));
hdr->opcode = cpu_to_le16(MGMT_EV_CMD_COMPLETE);
hdr->len = cpu_to_le16(sizeof(*ev) + sizeof(*rp));

ev = (void *) skb_put(skb, sizeof(*ev));
put_unaligned_le16(cmd->opcode, &ev->opcode);

rp = (void *) skb_put(skb, sizeof(*rp));
put_unaligned_le16(cmd->index, &rp->index);
rp->val = cp->val;

if (sock_queue_rcv_skb(cmd->sk, skb) < 0)
kfree_skb(skb);
send_mode_rsp(cmd->sk, cmd->opcode, cmd->index, cp->val);

list_del(&cmd->list);

Expand Down

0 comments on commit 053f021

Please sign in to comment.