提交 d930650b 编写于 作者: J Johan Hedberg

Bluetooth: mgmt: Add address type parameter to Stop Discovery command

This patch adds an address type parameter to the Stop Discovery command
which should match the value given to Start Discovery.
Signed-off-by: NJohan Hedberg <johan.hedberg@intel.com>
Acked-by: NMarcel Holtmann <marcel@holtmann.org>
上级 4b95a24c
...@@ -283,6 +283,9 @@ struct mgmt_cp_start_discovery { ...@@ -283,6 +283,9 @@ struct mgmt_cp_start_discovery {
} __packed; } __packed;
#define MGMT_OP_STOP_DISCOVERY 0x0024 #define MGMT_OP_STOP_DISCOVERY 0x0024
struct mgmt_cp_stop_discovery {
__u8 type;
} __packed;
#define MGMT_OP_CONFIRM_NAME 0x0025 #define MGMT_OP_CONFIRM_NAME 0x0025
struct mgmt_cp_confirm_name { struct mgmt_cp_confirm_name {
......
...@@ -2281,8 +2281,9 @@ static int start_discovery(struct sock *sk, u16 index, ...@@ -2281,8 +2281,9 @@ static int start_discovery(struct sock *sk, u16 index,
return err; 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 hci_dev *hdev;
struct pending_cmd *cmd; struct pending_cmd *cmd;
struct hci_cp_remote_name_req_cancel cp; struct hci_cp_remote_name_req_cancel cp;
...@@ -2291,6 +2292,10 @@ static int stop_discovery(struct sock *sk, u16 index) ...@@ -2291,6 +2292,10 @@ static int stop_discovery(struct sock *sk, u16 index)
BT_DBG("hci%u", 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); hdev = hci_dev_get(index);
if (!hdev) if (!hdev)
return cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY, return cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY,
...@@ -2299,8 +2304,16 @@ static int stop_discovery(struct sock *sk, u16 index) ...@@ -2299,8 +2304,16 @@ static int stop_discovery(struct sock *sk, u16 index)
hci_dev_lock(hdev); hci_dev_lock(hdev);
if (!hci_discovery_active(hdev)) { if (!hci_discovery_active(hdev)) {
err = cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY, err = cmd_complete(sk, index, MGMT_OP_STOP_DISCOVERY,
MGMT_STATUS_REJECTED); 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; goto unlock;
} }
...@@ -2323,7 +2336,7 @@ static int stop_discovery(struct sock *sk, u16 index) ...@@ -2323,7 +2336,7 @@ static int stop_discovery(struct sock *sk, u16 index)
if (!e) { if (!e) {
mgmt_pending_remove(cmd); mgmt_pending_remove(cmd);
err = cmd_complete(sk, index, MGMT_OP_STOP_DISCOVERY, 0, 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); hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
goto unlock; goto unlock;
} }
...@@ -2706,7 +2719,7 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen) ...@@ -2706,7 +2719,7 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
err = start_discovery(sk, index, cp, len); err = start_discovery(sk, index, cp, len);
break; break;
case MGMT_OP_STOP_DISCOVERY: case MGMT_OP_STOP_DISCOVERY:
err = stop_discovery(sk, index); err = stop_discovery(sk, index, cp, len);
break; break;
case MGMT_OP_CONFIRM_NAME: case MGMT_OP_CONFIRM_NAME:
err = confirm_name(sk, index, cp, len); err = confirm_name(sk, index, cp, len);
...@@ -3369,7 +3382,9 @@ int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status) ...@@ -3369,7 +3382,9 @@ int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
if (!cmd) if (!cmd)
return -ENOENT; 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); mgmt_pending_remove(cmd);
return err; return err;
...@@ -3389,12 +3404,8 @@ int mgmt_discovering(struct hci_dev *hdev, u8 discovering) ...@@ -3389,12 +3404,8 @@ int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
if (cmd != NULL) { if (cmd != NULL) {
u8 type = hdev->discovery.type; 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)); &type, sizeof(type));
else
cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0,
NULL, 0);
mgmt_pending_remove(cmd); mgmt_pending_remove(cmd);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册