Bluetooth: Add handler of MGMT_OP_READ_ADV_MONITOR_FEATURES
This adds the request handler of MGMT_OP_READ_ADV_MONITOR_FEATURES command. Since the controller-based monitoring is not yet in place, this report only the supported features but not the enabled features. The following test was performed. - Issuing btmgmt advmon-features. Signed-off-by: Miao-chen Chou <mcchou@chromium.org> Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:

committed by
Johan Hedberg

parent
7fceb17c6b
commit
e5e1e7fd47
@@ -37,6 +37,7 @@
|
||||
#include "smp.h"
|
||||
#include "mgmt_util.h"
|
||||
#include "mgmt_config.h"
|
||||
#include "msft.h"
|
||||
|
||||
#define MGMT_VERSION 1
|
||||
#define MGMT_REVISION 17
|
||||
@@ -118,6 +119,7 @@ static const u16 mgmt_commands[] = {
|
||||
MGMT_OP_SET_DEF_RUNTIME_CONFIG,
|
||||
MGMT_OP_GET_DEVICE_FLAGS,
|
||||
MGMT_OP_SET_DEVICE_FLAGS,
|
||||
MGMT_OP_READ_ADV_MONITOR_FEATURES,
|
||||
};
|
||||
|
||||
static const u16 mgmt_events[] = {
|
||||
@@ -3973,6 +3975,51 @@ done:
|
||||
&cp->addr, sizeof(cp->addr));
|
||||
}
|
||||
|
||||
static int read_adv_mon_features(struct sock *sk, struct hci_dev *hdev,
|
||||
void *data, u16 len)
|
||||
{
|
||||
struct adv_monitor *monitor = NULL;
|
||||
struct mgmt_rp_read_adv_monitor_features *rp = NULL;
|
||||
int handle;
|
||||
size_t rp_size = 0;
|
||||
__u32 supported = 0;
|
||||
__u16 num_handles = 0;
|
||||
__u16 handles[HCI_MAX_ADV_MONITOR_NUM_HANDLES];
|
||||
|
||||
BT_DBG("request for %s", hdev->name);
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
|
||||
if (msft_get_features(hdev) & MSFT_FEATURE_MASK_LE_ADV_MONITOR)
|
||||
supported |= MGMT_ADV_MONITOR_FEATURE_MASK_OR_PATTERNS;
|
||||
|
||||
idr_for_each_entry(&hdev->adv_monitors_idr, monitor, handle) {
|
||||
handles[num_handles++] = monitor->handle;
|
||||
}
|
||||
|
||||
hci_dev_unlock(hdev);
|
||||
|
||||
rp_size = sizeof(*rp) + (num_handles * sizeof(u16));
|
||||
rp = kmalloc(rp_size, GFP_KERNEL);
|
||||
if (!rp)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Once controller-based monitoring is in place, the enabled_features
|
||||
* should reflect the use.
|
||||
*/
|
||||
rp->supported_features = cpu_to_le32(supported);
|
||||
rp->enabled_features = 0;
|
||||
rp->max_num_handles = cpu_to_le16(HCI_MAX_ADV_MONITOR_NUM_HANDLES);
|
||||
rp->max_num_patterns = HCI_MAX_ADV_MONITOR_NUM_PATTERNS;
|
||||
rp->num_handles = cpu_to_le16(num_handles);
|
||||
if (num_handles)
|
||||
memcpy(&rp->handles, &handles, (num_handles * sizeof(u16)));
|
||||
|
||||
return mgmt_cmd_complete(sk, hdev->id,
|
||||
MGMT_OP_READ_ADV_MONITOR_FEATURES,
|
||||
MGMT_STATUS_SUCCESS, rp, rp_size);
|
||||
}
|
||||
|
||||
static void read_local_oob_data_complete(struct hci_dev *hdev, u8 status,
|
||||
u16 opcode, struct sk_buff *skb)
|
||||
{
|
||||
@@ -7441,6 +7488,7 @@ static const struct hci_mgmt_handler mgmt_handlers[] = {
|
||||
HCI_MGMT_VAR_LEN },
|
||||
{ get_device_flags, MGMT_GET_DEVICE_FLAGS_SIZE },
|
||||
{ set_device_flags, MGMT_SET_DEVICE_FLAGS_SIZE },
|
||||
{ read_adv_mon_features, MGMT_READ_ADV_MONITOR_FEATURES_SIZE },
|
||||
};
|
||||
|
||||
void mgmt_index_added(struct hci_dev *hdev)
|
||||
|
Reference in New Issue
Block a user