Skip to content

Commit

Permalink
Bluetooth: mgmt: Add address type parameter to Stop Discovery command
Browse files Browse the repository at this point in the history
This patch adds an address type parameter to the Stop Discovery command
which should match the value given to Start Discovery.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
  • Loading branch information
Johan Hedberg committed Feb 20, 2012
1 parent 4b95a24 commit d930650
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 11 deletions.
3 changes: 3 additions & 0 deletions include/net/bluetooth/mgmt.h
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,9 @@ struct mgmt_cp_start_discovery {
} __packed;

#define MGMT_OP_STOP_DISCOVERY 0x0024
struct mgmt_cp_stop_discovery {
__u8 type;
} __packed;

#define MGMT_OP_CONFIRM_NAME 0x0025
struct mgmt_cp_confirm_name {
Expand Down
33 changes: 22 additions & 11 deletions net/bluetooth/mgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -2281,8 +2281,9 @@ static int start_discovery(struct sock *sk, u16 index,
return err;
}

static int stop_discovery(struct sock *sk, u16 index)
static int stop_discovery(struct sock *sk, u16 index, void *data, u16 len)
{
struct mgmt_cp_stop_discovery *mgmt_cp = data;
struct hci_dev *hdev;
struct pending_cmd *cmd;
struct hci_cp_remote_name_req_cancel cp;
Expand All @@ -2291,6 +2292,10 @@ static int stop_discovery(struct sock *sk, u16 index)

BT_DBG("hci%u", index);

if (len != sizeof(*mgmt_cp))
return cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY,
MGMT_STATUS_INVALID_PARAMS);

hdev = hci_dev_get(index);
if (!hdev)
return cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY,
Expand All @@ -2299,8 +2304,16 @@ static int stop_discovery(struct sock *sk, u16 index)
hci_dev_lock(hdev);

if (!hci_discovery_active(hdev)) {
err = cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY,
MGMT_STATUS_REJECTED);
err = cmd_complete(sk, index, MGMT_OP_STOP_DISCOVERY,
MGMT_STATUS_REJECTED,
&mgmt_cp->type, sizeof(mgmt_cp->type));
goto unlock;
}

if (hdev->discovery.type != mgmt_cp->type) {
err = cmd_complete(sk, index, MGMT_OP_STOP_DISCOVERY,
MGMT_STATUS_INVALID_PARAMS,
&mgmt_cp->type, sizeof(mgmt_cp->type));
goto unlock;
}

Expand All @@ -2323,7 +2336,7 @@ static int stop_discovery(struct sock *sk, u16 index)
if (!e) {
mgmt_pending_remove(cmd);
err = cmd_complete(sk, index, MGMT_OP_STOP_DISCOVERY, 0,
NULL, 0);
&mgmt_cp->type, sizeof(mgmt_cp->type));
hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
goto unlock;
}
Expand Down Expand Up @@ -2706,7 +2719,7 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
err = start_discovery(sk, index, cp, len);
break;
case MGMT_OP_STOP_DISCOVERY:
err = stop_discovery(sk, index);
err = stop_discovery(sk, index, cp, len);
break;
case MGMT_OP_CONFIRM_NAME:
err = confirm_name(sk, index, cp, len);
Expand Down Expand Up @@ -3369,7 +3382,9 @@ int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
if (!cmd)
return -ENOENT;

err = cmd_status(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status));
err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
&hdev->discovery.type,
sizeof(hdev->discovery.type));
mgmt_pending_remove(cmd);

return err;
Expand All @@ -3389,12 +3404,8 @@ int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
if (cmd != NULL) {
u8 type = hdev->discovery.type;

if (discovering)
cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0,
cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0,
&type, sizeof(type));
else
cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0,
NULL, 0);
mgmt_pending_remove(cmd);
}

Expand Down

0 comments on commit d930650

Please sign in to comment.