aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2015-03-14 23:53:25 -0400
committerJohan Hedberg <johan.hedberg@intel.com>2015-03-15 04:03:41 -0400
commitd3d5305bfd1cb48c8f44207abb567276a1e09cc7 (patch)
tree5bcc688e2ccdb2b9c5936d3a18a83edc23d75cdf /net/bluetooth
parenta958452aa40c57a0407ecf84ba1bfa31ad532313 (diff)
Bluetooth: Add simple version of Read Advertising Features command
This adds support for the simplest possible version of Read Advertising Features management command. It allows basic testing of the interface. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Diffstat (limited to 'net/bluetooth')
-rw-r--r--net/bluetooth/mgmt.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index fa5654d89702..25a687c2a112 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -97,6 +97,7 @@ static const u16 mgmt_commands[] = {
97 MGMT_OP_SET_PUBLIC_ADDRESS, 97 MGMT_OP_SET_PUBLIC_ADDRESS,
98 MGMT_OP_START_SERVICE_DISCOVERY, 98 MGMT_OP_START_SERVICE_DISCOVERY,
99 MGMT_OP_READ_EXT_INDEX_LIST, 99 MGMT_OP_READ_EXT_INDEX_LIST,
100 MGMT_OP_READ_ADV_FEATURES,
100}; 101};
101 102
102static const u16 mgmt_events[] = { 103static const u16 mgmt_events[] = {
@@ -6254,6 +6255,40 @@ unlock:
6254 return err; 6255 return err;
6255} 6256}
6256 6257
6258static int read_adv_features(struct sock *sk, struct hci_dev *hdev,
6259 void *data, u16 data_len)
6260{
6261 struct mgmt_rp_read_adv_features *rp;
6262 size_t rp_len;
6263 int err;
6264
6265 BT_DBG("%s", hdev->name);
6266
6267 hci_dev_lock(hdev);
6268
6269 rp_len = sizeof(*rp);
6270 rp = kmalloc(rp_len, GFP_ATOMIC);
6271 if (!rp) {
6272 hci_dev_unlock(hdev);
6273 return -ENOMEM;
6274 }
6275
6276 rp->supported_flags = cpu_to_le32(0);
6277 rp->max_adv_data_len = 31;
6278 rp->max_scan_rsp_len = 31;
6279 rp->max_instances = 0;
6280 rp->num_instances = 0;
6281
6282 hci_dev_unlock(hdev);
6283
6284 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
6285 MGMT_STATUS_SUCCESS, rp, rp_len);
6286
6287 kfree(rp);
6288
6289 return err;
6290}
6291
6257static const struct hci_mgmt_handler mgmt_handlers[] = { 6292static const struct hci_mgmt_handler mgmt_handlers[] = {
6258 { NULL }, /* 0x0000 (no command) */ 6293 { NULL }, /* 0x0000 (no command) */
6259 { read_version, MGMT_READ_VERSION_SIZE, 6294 { read_version, MGMT_READ_VERSION_SIZE,
@@ -6337,6 +6372,7 @@ static const struct hci_mgmt_handler mgmt_handlers[] = {
6337 { read_ext_index_list, MGMT_READ_EXT_INDEX_LIST_SIZE, 6372 { read_ext_index_list, MGMT_READ_EXT_INDEX_LIST_SIZE,
6338 HCI_MGMT_NO_HDEV | 6373 HCI_MGMT_NO_HDEV |
6339 HCI_MGMT_UNTRUSTED }, 6374 HCI_MGMT_UNTRUSTED },
6375 { read_adv_features, MGMT_READ_ADV_FEATURES_SIZE },
6340}; 6376};
6341 6377
6342int mgmt_control(struct hci_mgmt_chan *chan, struct sock *sk, 6378int mgmt_control(struct hci_mgmt_chan *chan, struct sock *sk,