mgmt.c (a10c907ce0e5e138c3da091fcb7c3d109a15aec5) mgmt.c (e625e50ceee18bc1e3fb1a6375e089405a797a4d)
1/*
2 BlueZ - Bluetooth protocol stack for Linux
3
4 Copyright (C) 2010 Nokia Corporation
5 Copyright (C) 2011-2012 Intel Corporation
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as

--- 3701 unchanged lines hidden (view full) ---

3710 rp->sec_len = cpu_to_le16(sec_len);
3711
3712 hci_dev_unlock(hdev);
3713
3714 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_SECURITY_INFO, 0,
3715 rp, sizeof(*rp) + sec_len);
3716}
3717
1/*
2 BlueZ - Bluetooth protocol stack for Linux
3
4 Copyright (C) 2010 Nokia Corporation
5 Copyright (C) 2011-2012 Intel Corporation
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as

--- 3701 unchanged lines hidden (view full) ---

3710 rp->sec_len = cpu_to_le16(sec_len);
3711
3712 hci_dev_unlock(hdev);
3713
3714 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_SECURITY_INFO, 0,
3715 rp, sizeof(*rp) + sec_len);
3716}
3717
3718#ifdef CONFIG_BT_FEATURE_DEBUG
3719/* d4992530-b9ec-469f-ab01-6c481c47da1c */
3720static const u8 debug_uuid[16] = {
3721 0x1c, 0xda, 0x47, 0x1c, 0x48, 0x6c, 0x01, 0xab,
3722 0x9f, 0x46, 0xec, 0xb9, 0x30, 0x25, 0x99, 0xd4,
3723};
3724#endif
3725
3718static int read_exp_features_info(struct sock *sk, struct hci_dev *hdev,
3719 void *data, u16 data_len)
3720{
3721 char buf[42];
3722 struct mgmt_rp_read_exp_features_info *rp = (void *)buf;
3723 u16 idx = 0;
3724
3725 bt_dev_dbg(hdev, "sock %p", sk);
3726
3727 memset(&buf, 0, sizeof(buf));
3728
3726static int read_exp_features_info(struct sock *sk, struct hci_dev *hdev,
3727 void *data, u16 data_len)
3728{
3729 char buf[42];
3730 struct mgmt_rp_read_exp_features_info *rp = (void *)buf;
3731 u16 idx = 0;
3732
3733 bt_dev_dbg(hdev, "sock %p", sk);
3734
3735 memset(&buf, 0, sizeof(buf));
3736
3737#ifdef CONFIG_BT_FEATURE_DEBUG
3738 if (!hdev) {
3739 u32 flags = bt_dbg_get() ? BIT(0) : 0;
3740
3741 memcpy(rp->features[idx].uuid, debug_uuid, 16);
3742 rp->features[idx].flags = cpu_to_le32(flags);
3743 idx++;
3744 }
3745#endif
3746
3729 rp->feature_count = cpu_to_le16(idx);
3730
3731 /* After reading the experimental features information, enable
3732 * the events to update client on any future change.
3733 */
3734 hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS);
3735
3736 return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE,
3737 MGMT_OP_READ_EXP_FEATURES_INFO,
3738 0, rp, sizeof(*rp) + (20 * idx));
3739}
3740
3747 rp->feature_count = cpu_to_le16(idx);
3748
3749 /* After reading the experimental features information, enable
3750 * the events to update client on any future change.
3751 */
3752 hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS);
3753
3754 return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE,
3755 MGMT_OP_READ_EXP_FEATURES_INFO,
3756 0, rp, sizeof(*rp) + (20 * idx));
3757}
3758
3759#ifdef CONFIG_BT_FEATURE_DEBUG
3760static int exp_debug_feature_changed(bool enabled, struct sock *skip)
3761{
3762 struct mgmt_ev_exp_feature_changed ev;
3763
3764 memset(&ev, 0, sizeof(ev));
3765 memcpy(ev.uuid, debug_uuid, 16);
3766 ev.flags = cpu_to_le32(enabled ? BIT(0) : 0);
3767
3768 return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, NULL,
3769 &ev, sizeof(ev),
3770 HCI_MGMT_EXP_FEATURE_EVENTS, skip);
3771}
3772#endif
3773
3741static int set_exp_feature(struct sock *sk, struct hci_dev *hdev,
3742 void *data, u16 data_len)
3743{
3744 struct mgmt_cp_set_exp_feature *cp = data;
3745 struct mgmt_rp_set_exp_feature rp;
3746
3747 bt_dev_dbg(hdev, "sock %p", sk);
3748
3749 if (!memcmp(cp->uuid, ZERO_KEY, 16)) {
3750 memset(rp.uuid, 0, 16);
3751 rp.flags = cpu_to_le32(0);
3752
3774static int set_exp_feature(struct sock *sk, struct hci_dev *hdev,
3775 void *data, u16 data_len)
3776{
3777 struct mgmt_cp_set_exp_feature *cp = data;
3778 struct mgmt_rp_set_exp_feature rp;
3779
3780 bt_dev_dbg(hdev, "sock %p", sk);
3781
3782 if (!memcmp(cp->uuid, ZERO_KEY, 16)) {
3783 memset(rp.uuid, 0, 16);
3784 rp.flags = cpu_to_le32(0);
3785
3786#ifdef CONFIG_BT_FEATURE_DEBUG
3787 if (!hdev) {
3788 bool changed = bt_dbg_get();
3789
3790 bt_dbg_set(false);
3791
3792 if (changed)
3793 exp_debug_feature_changed(false, sk);
3794 }
3795#endif
3796
3753 hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS);
3754
3755 return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE,
3756 MGMT_OP_SET_EXP_FEATURE, 0,
3757 &rp, sizeof(rp));
3758 }
3759
3797 hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS);
3798
3799 return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE,
3800 MGMT_OP_SET_EXP_FEATURE, 0,
3801 &rp, sizeof(rp));
3802 }
3803
3804#ifdef CONFIG_BT_FEATURE_DEBUG
3805 if (!memcmp(cp->uuid, debug_uuid, 16)) {
3806 bool val, changed;
3807 int err;
3808
3809 /* Command requires to use the non-controller index */
3810 if (hdev)
3811 return mgmt_cmd_status(sk, hdev->id,
3812 MGMT_OP_SET_EXP_FEATURE,
3813 MGMT_STATUS_INVALID_INDEX);
3814
3815 /* Parameters are limited to a single octet */
3816 if (data_len != MGMT_SET_EXP_FEATURE_SIZE + 1)
3817 return mgmt_cmd_status(sk, MGMT_INDEX_NONE,
3818 MGMT_OP_SET_EXP_FEATURE,
3819 MGMT_STATUS_INVALID_PARAMS);
3820
3821 /* Only boolean on/off is supported */
3822 if (cp->param[0] != 0x00 && cp->param[0] != 0x01)
3823 return mgmt_cmd_status(sk, MGMT_INDEX_NONE,
3824 MGMT_OP_SET_EXP_FEATURE,
3825 MGMT_STATUS_INVALID_PARAMS);
3826
3827 val = !!cp->param[0];
3828 changed = val ? !bt_dbg_get() : bt_dbg_get();
3829 bt_dbg_set(val);
3830
3831 memcpy(rp.uuid, debug_uuid, 16);
3832 rp.flags = cpu_to_le32(val ? BIT(0) : 0);
3833
3834 hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS);
3835
3836 err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
3837 MGMT_OP_SET_EXP_FEATURE, 0,
3838 &rp, sizeof(rp));
3839
3840 if (changed)
3841 exp_debug_feature_changed(val, sk);
3842
3843 return err;
3844 }
3845#endif
3846
3760 return mgmt_cmd_status(sk, hdev ? hdev->id : MGMT_INDEX_NONE,
3761 MGMT_OP_SET_EXP_FEATURE,
3762 MGMT_STATUS_NOT_SUPPORTED);
3763}
3764
3765static void read_local_oob_data_complete(struct hci_dev *hdev, u8 status,
3766 u16 opcode, struct sk_buff *skb)
3767{

--- 4483 unchanged lines hidden ---
3847 return mgmt_cmd_status(sk, hdev ? hdev->id : MGMT_INDEX_NONE,
3848 MGMT_OP_SET_EXP_FEATURE,
3849 MGMT_STATUS_NOT_SUPPORTED);
3850}
3851
3852static void read_local_oob_data_complete(struct hci_dev *hdev, u8 status,
3853 u16 opcode, struct sk_buff *skb)
3854{

--- 4483 unchanged lines hidden ---