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 --- |