diff options
Diffstat (limited to 'net/bluetooth/mgmt.c')
-rw-r--r-- | net/bluetooth/mgmt.c | 60 |
1 files changed, 24 insertions, 36 deletions
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index a6e0f3d8da6..ad6613d17ca 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c | |||
@@ -210,7 +210,7 @@ static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status) | |||
210 | 210 | ||
211 | BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status); | 211 | BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status); |
212 | 212 | ||
213 | skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_ATOMIC); | 213 | skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_KERNEL); |
214 | if (!skb) | 214 | if (!skb) |
215 | return -ENOMEM; | 215 | return -ENOMEM; |
216 | 216 | ||
@@ -241,7 +241,7 @@ static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status, | |||
241 | 241 | ||
242 | BT_DBG("sock %p", sk); | 242 | BT_DBG("sock %p", sk); |
243 | 243 | ||
244 | skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_ATOMIC); | 244 | skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_KERNEL); |
245 | if (!skb) | 245 | if (!skb) |
246 | return -ENOMEM; | 246 | return -ENOMEM; |
247 | 247 | ||
@@ -687,14 +687,14 @@ static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode, | |||
687 | { | 687 | { |
688 | struct pending_cmd *cmd; | 688 | struct pending_cmd *cmd; |
689 | 689 | ||
690 | cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC); | 690 | cmd = kmalloc(sizeof(*cmd), GFP_KERNEL); |
691 | if (!cmd) | 691 | if (!cmd) |
692 | return NULL; | 692 | return NULL; |
693 | 693 | ||
694 | cmd->opcode = opcode; | 694 | cmd->opcode = opcode; |
695 | cmd->index = hdev->id; | 695 | cmd->index = hdev->id; |
696 | 696 | ||
697 | cmd->param = kmalloc(len, GFP_ATOMIC); | 697 | cmd->param = kmalloc(len, GFP_KERNEL); |
698 | if (!cmd->param) { | 698 | if (!cmd->param) { |
699 | kfree(cmd); | 699 | kfree(cmd); |
700 | return NULL; | 700 | return NULL; |
@@ -812,7 +812,7 @@ static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len, | |||
812 | struct sk_buff *skb; | 812 | struct sk_buff *skb; |
813 | struct mgmt_hdr *hdr; | 813 | struct mgmt_hdr *hdr; |
814 | 814 | ||
815 | skb = alloc_skb(sizeof(*hdr) + data_len, GFP_ATOMIC); | 815 | skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL); |
816 | if (!skb) | 816 | if (!skb) |
817 | return -ENOMEM; | 817 | return -ENOMEM; |
818 | 818 | ||
@@ -1268,7 +1268,7 @@ static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) | |||
1268 | goto failed; | 1268 | goto failed; |
1269 | } | 1269 | } |
1270 | 1270 | ||
1271 | uuid = kmalloc(sizeof(*uuid), GFP_ATOMIC); | 1271 | uuid = kmalloc(sizeof(*uuid), GFP_KERNEL); |
1272 | if (!uuid) { | 1272 | if (!uuid) { |
1273 | err = -ENOMEM; | 1273 | err = -ENOMEM; |
1274 | goto failed; | 1274 | goto failed; |
@@ -1611,7 +1611,7 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data, | |||
1611 | } | 1611 | } |
1612 | 1612 | ||
1613 | dc.handle = cpu_to_le16(conn->handle); | 1613 | dc.handle = cpu_to_le16(conn->handle); |
1614 | dc.reason = 0x13; /* Remote User Terminated Connection */ | 1614 | dc.reason = HCI_ERROR_REMOTE_USER_TERM; |
1615 | 1615 | ||
1616 | err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc); | 1616 | err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc); |
1617 | if (err < 0) | 1617 | if (err < 0) |
@@ -1667,7 +1667,7 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data, | |||
1667 | } | 1667 | } |
1668 | 1668 | ||
1669 | rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info)); | 1669 | rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info)); |
1670 | rp = kmalloc(rp_len, GFP_ATOMIC); | 1670 | rp = kmalloc(rp_len, GFP_KERNEL); |
1671 | if (!rp) { | 1671 | if (!rp) { |
1672 | err = -ENOMEM; | 1672 | err = -ENOMEM; |
1673 | goto unlock; | 1673 | goto unlock; |
@@ -1778,29 +1778,6 @@ failed: | |||
1778 | return err; | 1778 | return err; |
1779 | } | 1779 | } |
1780 | 1780 | ||
1781 | static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev, | ||
1782 | void *data, u16 len) | ||
1783 | { | ||
1784 | struct mgmt_cp_pin_code_neg_reply *cp = data; | ||
1785 | int err; | ||
1786 | |||
1787 | BT_DBG(""); | ||
1788 | |||
1789 | hci_dev_lock(hdev); | ||
1790 | |||
1791 | if (!hdev_is_powered(hdev)) { | ||
1792 | err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY, | ||
1793 | MGMT_STATUS_NOT_POWERED); | ||
1794 | goto failed; | ||
1795 | } | ||
1796 | |||
1797 | err = send_pin_code_neg_reply(sk, hdev, cp); | ||
1798 | |||
1799 | failed: | ||
1800 | hci_dev_unlock(hdev); | ||
1801 | return err; | ||
1802 | } | ||
1803 | |||
1804 | static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data, | 1781 | static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data, |
1805 | u16 len) | 1782 | u16 len) |
1806 | { | 1783 | { |
@@ -2083,6 +2060,18 @@ done: | |||
2083 | return err; | 2060 | return err; |
2084 | } | 2061 | } |
2085 | 2062 | ||
2063 | static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev, | ||
2064 | void *data, u16 len) | ||
2065 | { | ||
2066 | struct mgmt_cp_pin_code_neg_reply *cp = data; | ||
2067 | |||
2068 | BT_DBG(""); | ||
2069 | |||
2070 | return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type, | ||
2071 | MGMT_OP_PIN_CODE_NEG_REPLY, | ||
2072 | HCI_OP_PIN_CODE_NEG_REPLY, 0); | ||
2073 | } | ||
2074 | |||
2086 | static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data, | 2075 | static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data, |
2087 | u16 len) | 2076 | u16 len) |
2088 | { | 2077 | { |
@@ -2607,8 +2596,8 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, | |||
2607 | if (cp->val) { | 2596 | if (cp->val) { |
2608 | type = PAGE_SCAN_TYPE_INTERLACED; | 2597 | type = PAGE_SCAN_TYPE_INTERLACED; |
2609 | 2598 | ||
2610 | /* 22.5 msec page scan interval */ | 2599 | /* 160 msec page scan interval */ |
2611 | acp.interval = __constant_cpu_to_le16(0x0024); | 2600 | acp.interval = __constant_cpu_to_le16(0x0100); |
2612 | } else { | 2601 | } else { |
2613 | type = PAGE_SCAN_TYPE_STANDARD; /* default */ | 2602 | type = PAGE_SCAN_TYPE_STANDARD; /* default */ |
2614 | 2603 | ||
@@ -3546,9 +3535,9 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, | |||
3546 | ev->addr.type = link_to_bdaddr(link_type, addr_type); | 3535 | ev->addr.type = link_to_bdaddr(link_type, addr_type); |
3547 | ev->rssi = rssi; | 3536 | ev->rssi = rssi; |
3548 | if (cfm_name) | 3537 | if (cfm_name) |
3549 | ev->flags[0] |= MGMT_DEV_FOUND_CONFIRM_NAME; | 3538 | ev->flags |= cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME); |
3550 | if (!ssp) | 3539 | if (!ssp) |
3551 | ev->flags[0] |= MGMT_DEV_FOUND_LEGACY_PAIRING; | 3540 | ev->flags |= cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING); |
3552 | 3541 | ||
3553 | if (eir_len > 0) | 3542 | if (eir_len > 0) |
3554 | memcpy(ev->eir, eir, eir_len); | 3543 | memcpy(ev->eir, eir, eir_len); |
@@ -3558,7 +3547,6 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, | |||
3558 | dev_class, 3); | 3547 | dev_class, 3); |
3559 | 3548 | ||
3560 | ev->eir_len = cpu_to_le16(eir_len); | 3549 | ev->eir_len = cpu_to_le16(eir_len); |
3561 | |||
3562 | ev_size = sizeof(*ev) + eir_len; | 3550 | ev_size = sizeof(*ev) + eir_len; |
3563 | 3551 | ||
3564 | return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL); | 3552 | return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL); |