aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/bluetooth/mgmt.h8
-rw-r--r--net/bluetooth/mgmt.c107
2 files changed, 56 insertions, 59 deletions
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
index 36e68b4551af..7e3d38bfaec3 100644
--- a/include/net/bluetooth/mgmt.h
+++ b/include/net/bluetooth/mgmt.h
@@ -184,7 +184,6 @@ struct mgmt_cp_disconnect {
184} __packed; 184} __packed;
185struct mgmt_rp_disconnect { 185struct mgmt_rp_disconnect {
186 struct mgmt_addr_info addr; 186 struct mgmt_addr_info addr;
187 __u8 status;
188} __packed; 187} __packed;
189 188
190#define MGMT_OP_GET_CONNECTIONS 0x0015 189#define MGMT_OP_GET_CONNECTIONS 0x0015
@@ -201,7 +200,6 @@ struct mgmt_cp_pin_code_reply {
201} __packed; 200} __packed;
202struct mgmt_rp_pin_code_reply { 201struct mgmt_rp_pin_code_reply {
203 struct mgmt_addr_info addr; 202 struct mgmt_addr_info addr;
204 uint8_t status;
205} __packed; 203} __packed;
206 204
207#define MGMT_OP_PIN_CODE_NEG_REPLY 0x0017 205#define MGMT_OP_PIN_CODE_NEG_REPLY 0x0017
@@ -221,7 +219,6 @@ struct mgmt_cp_pair_device {
221} __packed; 219} __packed;
222struct mgmt_rp_pair_device { 220struct mgmt_rp_pair_device {
223 struct mgmt_addr_info addr; 221 struct mgmt_addr_info addr;
224 __u8 status;
225} __packed; 222} __packed;
226 223
227#define MGMT_OP_CANCEL_PAIR_DEVICE 0x001A 224#define MGMT_OP_CANCEL_PAIR_DEVICE 0x001A
@@ -233,7 +230,6 @@ struct mgmt_cp_unpair_device {
233} __packed; 230} __packed;
234struct mgmt_rp_unpair_device { 231struct mgmt_rp_unpair_device {
235 struct mgmt_addr_info addr; 232 struct mgmt_addr_info addr;
236 __u8 status;
237}; 233};
238 234
239#define MGMT_OP_USER_CONFIRM_REPLY 0x001C 235#define MGMT_OP_USER_CONFIRM_REPLY 0x001C
@@ -242,7 +238,6 @@ struct mgmt_cp_user_confirm_reply {
242} __packed; 238} __packed;
243struct mgmt_rp_user_confirm_reply { 239struct mgmt_rp_user_confirm_reply {
244 struct mgmt_addr_info addr; 240 struct mgmt_addr_info addr;
245 __u8 status;
246} __packed; 241} __packed;
247 242
248#define MGMT_OP_USER_CONFIRM_NEG_REPLY 0x001D 243#define MGMT_OP_USER_CONFIRM_NEG_REPLY 0x001D
@@ -257,7 +252,6 @@ struct mgmt_cp_user_passkey_reply {
257} __packed; 252} __packed;
258struct mgmt_rp_user_passkey_reply { 253struct mgmt_rp_user_passkey_reply {
259 struct mgmt_addr_info addr; 254 struct mgmt_addr_info addr;
260 __u8 status;
261} __packed; 255} __packed;
262 256
263#define MGMT_OP_USER_PASSKEY_NEG_REPLY 0x001F 257#define MGMT_OP_USER_PASSKEY_NEG_REPLY 0x001F
@@ -297,7 +291,6 @@ struct mgmt_cp_confirm_name {
297} __packed; 291} __packed;
298struct mgmt_rp_confirm_name { 292struct mgmt_rp_confirm_name {
299 struct mgmt_addr_info addr; 293 struct mgmt_addr_info addr;
300 __u8 status;
301} __packed; 294} __packed;
302 295
303#define MGMT_OP_BLOCK_DEVICE 0x0026 296#define MGMT_OP_BLOCK_DEVICE 0x0026
@@ -313,6 +306,7 @@ struct mgmt_cp_unblock_device {
313#define MGMT_EV_CMD_COMPLETE 0x0001 306#define MGMT_EV_CMD_COMPLETE 0x0001
314struct mgmt_ev_cmd_complete { 307struct mgmt_ev_cmd_complete {
315 __le16 opcode; 308 __le16 opcode;
309 __u8 status;
316 __u8 data[0]; 310 __u8 data[0];
317} __packed; 311} __packed;
318 312
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 89754bbcd02b..61d0250bd77e 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -227,8 +227,8 @@ static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
227 return err; 227 return err;
228} 228}
229 229
230static int cmd_complete(struct sock *sk, u16 index, u16 cmd, void *rp, 230static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
231 size_t rp_len) 231 void *rp, size_t rp_len)
232{ 232{
233 struct sk_buff *skb; 233 struct sk_buff *skb;
234 struct mgmt_hdr *hdr; 234 struct mgmt_hdr *hdr;
@@ -249,6 +249,7 @@ static int cmd_complete(struct sock *sk, u16 index, u16 cmd, void *rp,
249 249
250 ev = (void *) skb_put(skb, sizeof(*ev) + rp_len); 250 ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
251 put_unaligned_le16(cmd, &ev->opcode); 251 put_unaligned_le16(cmd, &ev->opcode);
252 ev->status = status;
252 253
253 if (rp) 254 if (rp)
254 memcpy(ev->data, rp, rp_len); 255 memcpy(ev->data, rp, rp_len);
@@ -269,7 +270,7 @@ static int read_version(struct sock *sk)
269 rp.version = MGMT_VERSION; 270 rp.version = MGMT_VERSION;
270 put_unaligned_le16(MGMT_REVISION, &rp.revision); 271 put_unaligned_le16(MGMT_REVISION, &rp.revision);
271 272
272 return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, &rp, 273 return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0, &rp,
273 sizeof(rp)); 274 sizeof(rp));
274} 275}
275 276
@@ -299,7 +300,7 @@ static int read_commands(struct sock *sk)
299 for (i = 0; i < num_events; i++, opcode++) 300 for (i = 0; i < num_events; i++, opcode++)
300 put_unaligned_le16(mgmt_events[i], opcode); 301 put_unaligned_le16(mgmt_events[i], opcode);
301 302
302 err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, rp, 303 err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0, rp,
303 rp_size); 304 rp_size);
304 kfree(rp); 305 kfree(rp);
305 306
@@ -347,7 +348,7 @@ static int read_index_list(struct sock *sk)
347 348
348 read_unlock(&hci_dev_list_lock); 349 read_unlock(&hci_dev_list_lock);
349 350
350 err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, rp, 351 err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, 0, rp,
351 rp_len); 352 rp_len);
352 353
353 kfree(rp); 354 kfree(rp);
@@ -637,7 +638,7 @@ static int read_controller_info(struct sock *sk, u16 index)
637 hci_dev_unlock(hdev); 638 hci_dev_unlock(hdev);
638 hci_dev_put(hdev); 639 hci_dev_put(hdev);
639 640
640 return cmd_complete(sk, index, MGMT_OP_READ_INFO, &rp, sizeof(rp)); 641 return cmd_complete(sk, index, MGMT_OP_READ_INFO, 0, &rp, sizeof(rp));
641} 642}
642 643
643static void mgmt_pending_free(struct pending_cmd *cmd) 644static void mgmt_pending_free(struct pending_cmd *cmd)
@@ -717,7 +718,8 @@ static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
717{ 718{
718 __le32 settings = cpu_to_le32(get_current_settings(hdev)); 719 __le32 settings = cpu_to_le32(get_current_settings(hdev));
719 720
720 return cmd_complete(sk, hdev->id, opcode, &settings, sizeof(settings)); 721 return cmd_complete(sk, hdev->id, opcode, 0, &settings,
722 sizeof(settings));
721} 723}
722 724
723static int set_powered(struct sock *sk, u16 index, void *data, u16 len) 725static int set_powered(struct sock *sk, u16 index, void *data, u16 len)
@@ -1124,7 +1126,7 @@ static int add_uuid(struct sock *sk, u16 index, void *data, u16 len)
1124 if (err < 0) 1126 if (err < 0)
1125 goto failed; 1127 goto failed;
1126 1128
1127 err = cmd_complete(sk, index, MGMT_OP_ADD_UUID, NULL, 0); 1129 err = cmd_complete(sk, index, MGMT_OP_ADD_UUID, 0, NULL, 0);
1128 1130
1129failed: 1131failed:
1130 hci_dev_unlock(hdev); 1132 hci_dev_unlock(hdev);
@@ -1185,7 +1187,7 @@ static int remove_uuid(struct sock *sk, u16 index, void *data, u16 len)
1185 if (err < 0) 1187 if (err < 0)
1186 goto unlock; 1188 goto unlock;
1187 1189
1188 err = cmd_complete(sk, index, MGMT_OP_REMOVE_UUID, NULL, 0); 1190 err = cmd_complete(sk, index, MGMT_OP_REMOVE_UUID, 0, NULL, 0);
1189 1191
1190unlock: 1192unlock:
1191 hci_dev_unlock(hdev); 1193 hci_dev_unlock(hdev);
@@ -1226,7 +1228,8 @@ static int set_dev_class(struct sock *sk, u16 index, void *data, u16 len)
1226 err = update_class(hdev); 1228 err = update_class(hdev);
1227 1229
1228 if (err == 0) 1230 if (err == 0)
1229 err = cmd_complete(sk, index, MGMT_OP_SET_DEV_CLASS, NULL, 0); 1231 err = cmd_complete(sk, index, MGMT_OP_SET_DEV_CLASS, 0,
1232 NULL, 0);
1230 1233
1231 hci_dev_unlock(hdev); 1234 hci_dev_unlock(hdev);
1232 hci_dev_put(hdev); 1235 hci_dev_put(hdev);
@@ -1282,7 +1285,7 @@ static int load_link_keys(struct sock *sk, u16 index, void *data, u16 len)