1bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson/******************************************************************************
2bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *
3bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *  Copyright (C) 2014 Google, Inc.
4bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *
5bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *  Licensed under the Apache License, Version 2.0 (the "License");
6bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *  you may not use this file except in compliance with the License.
7bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *  You may obtain a copy of the License at:
8bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *
9bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *  http://www.apache.org/licenses/LICENSE-2.0
10bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *
11bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *  Unless required by applicable law or agreed to in writing, software
12bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *  distributed under the License is distributed on an "AS IS" BASIS,
13bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *  See the License for the specific language governing permissions and
15bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *  limitations under the License.
16bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson *
17bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson ******************************************************************************/
18bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
19f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He#include <base/logging.h>
20bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
21bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "bt_types.h"
22bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "buffer_allocator.h"
23bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hci_internals.h"
24bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hci_layer.h"
25bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hci_packet_factory.h"
265ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson#include "hcidefs.h"
275ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson#include "hcimsgs.h"
285ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson#include "osi/include/allocator.h"
29bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
305ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic const allocator_t* buffer_allocator;
31bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
325ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_packet(size_t data_size);
335ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_command_no_params(uint16_t opcode);
345ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_command(uint16_t opcode, size_t parameter_size,
355ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson                            uint8_t** stream_out);
36bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
37bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson// Interface functions
38bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
395ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_reset(void) { return make_command_no_params(HCI_RESET); }
40bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
415ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_read_buffer_size(void) {
4230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return make_command_no_params(HCI_READ_BUFFER_SIZE);
4330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
44bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
455ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_host_buffer_size(uint16_t acl_size, uint8_t sco_size,
465ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson                                     uint16_t acl_count, uint16_t sco_count) {
475ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  uint8_t* stream;
485ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  const uint8_t parameter_size = 2 + 1 + 2 + 2;  // from each of the parameters
495ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  BT_HDR* packet = make_command(HCI_HOST_BUFFER_SIZE, parameter_size, &stream);
5030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
5130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  UINT16_TO_STREAM(stream, acl_size);
5230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  UINT8_TO_STREAM(stream, sco_size);
5330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  UINT16_TO_STREAM(stream, acl_count);
5430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  UINT16_TO_STREAM(stream, sco_count);
55bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  return packet;
56bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
57bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
585ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_read_local_version_info(void) {
5930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return make_command_no_params(HCI_READ_LOCAL_VERSION_INFO);
6030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
61bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
625ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_read_bd_addr(void) {
6330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return make_command_no_params(HCI_READ_BD_ADDR);
6430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
6530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
665ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_read_local_supported_commands(void) {
6730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return make_command_no_params(HCI_READ_LOCAL_SUPPORTED_CMDS);
6830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
6930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
705ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_read_local_extended_features(uint8_t page_number) {
715ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  uint8_t* stream;
7230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  const uint8_t parameter_size = 1;
735ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  BT_HDR* packet =
745ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson      make_command(HCI_READ_LOCAL_EXT_FEATURES, parameter_size, &stream);
7530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
7630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  UINT8_TO_STREAM(stream, page_number);
7730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return packet;
7830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
7930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
805ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_write_simple_pairing_mode(uint8_t mode) {
815ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  uint8_t* stream;
8230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  const uint8_t parameter_size = 1;
835ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  BT_HDR* packet =
845ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson      make_command(HCI_WRITE_SIMPLE_PAIRING_MODE, parameter_size, &stream);
8530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
8630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  UINT8_TO_STREAM(stream, mode);
8730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return packet;
8830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
8930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
905ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_write_secure_connections_host_support(uint8_t mode) {
915ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  uint8_t* stream;
92444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji  const uint8_t parameter_size = 1;
935ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  BT_HDR* packet =
945ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson      make_command(HCI_WRITE_SECURE_CONNS_SUPPORT, parameter_size, &stream);
95444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
96444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji  UINT8_TO_STREAM(stream, mode);
97444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji  return packet;
98444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
99444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1005ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_set_event_mask(const bt_event_mask_t* event_mask) {
1015ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  uint8_t* stream;
10230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  uint8_t parameter_size = sizeof(bt_event_mask_t);
1035ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  BT_HDR* packet = make_command(HCI_SET_EVENT_MASK, parameter_size, &stream);
10430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
10530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  ARRAY8_TO_STREAM(stream, event_mask->as_array);
10630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return packet;
10730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
10830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
1095ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_ble_write_host_support(uint8_t supported_host,
1105ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson                                           uint8_t simultaneous_host) {
1115ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  uint8_t* stream;
11230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  const uint8_t parameter_size = 1 + 1;
1135ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  BT_HDR* packet =
1145ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson      make_command(HCI_WRITE_LE_HOST_SUPPORT, parameter_size, &stream);
115bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
11630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  UINT8_TO_STREAM(stream, supported_host);
11730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  UINT8_TO_STREAM(stream, simultaneous_host);
11830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return packet;
11930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
12030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
1215ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_ble_read_white_list_size(void) {
12230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return make_command_no_params(HCI_BLE_READ_WHITE_LIST_SIZE);
12330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
12430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
1255ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_ble_read_buffer_size(void) {
12630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return make_command_no_params(HCI_BLE_READ_BUFFER_SIZE);
12730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
12830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
1295ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_ble_read_supported_states(void) {
13030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return make_command_no_params(HCI_BLE_READ_SUPPORTED_STATES);
13130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
13230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
1335ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_ble_read_local_supported_features(void) {
13430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return make_command_no_params(HCI_BLE_READ_LOCAL_SPT_FEAT);
13530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
13630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
1375ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_ble_read_resolving_list_size(void) {
138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji  return make_command_no_params(HCI_BLE_READ_RESOLVING_LIST_SIZE);
139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1415ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_ble_read_suggested_default_data_length(void) {
1425ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  return make_command_no_params(HCI_BLE_READ_DEFAULT_DATA_LENGTH);
143636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera}
144636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
1451f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowskistatic BT_HDR* make_ble_read_maximum_advertising_data_length(void) {
1461f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowski  return make_command_no_params(HCI_LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH);
1471f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowski}
1481f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowski
1491f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowskistatic BT_HDR* make_ble_read_number_of_supported_advertising_sets(void) {
1501f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowski  return make_command_no_params(
1511f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowski      HCI_LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS);
1521f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowski}
1531f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowski
1545ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_read_local_supported_codecs(void) {
1555ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  return make_command_no_params(HCI_READ_LOCAL_SUPPORTED_CODECS);
156f6dcf79f62880e716e127b19c70ea328e07c6051Srinu Jella}
157f6dcf79f62880e716e127b19c70ea328e07c6051Srinu Jella
1585ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_ble_set_event_mask(const bt_event_mask_t* event_mask) {
1595ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  uint8_t* stream;
16030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  uint8_t parameter_size = sizeof(bt_event_mask_t);
1615ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  BT_HDR* packet =
1625ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson      make_command(HCI_BLE_SET_EVENT_MASK, parameter_size, &stream);
16330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
16430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  ARRAY8_TO_STREAM(stream, event_mask->as_array);
165bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  return packet;
166bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
167bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
168bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson// Internal functions
169bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
1705ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_command_no_params(uint16_t opcode) {
17130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return make_command(opcode, 0, NULL);
17230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
17330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
1745ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_command(uint16_t opcode, size_t parameter_size,
1755ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson                            uint8_t** stream_out) {
1765ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  BT_HDR* packet = make_packet(HCI_COMMAND_PREAMBLE_SIZE + parameter_size);
17730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
1785ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  uint8_t* stream = packet->data;
17930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  UINT16_TO_STREAM(stream, opcode);
18030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  UINT8_TO_STREAM(stream, parameter_size);
18130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
1825ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  if (stream_out != NULL) *stream_out = stream;
18330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
18430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson  return packet;
18530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson}
18630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
1875ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonstatic BT_HDR* make_packet(size_t data_size) {
1885ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson  BT_HDR* ret = (BT_HDR*)buffer_allocator->alloc(sizeof(BT_HDR) + data_size);
189f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He  CHECK(ret);
190bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  ret->event = 0;
191bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  ret->offset = 0;
192bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  ret->layer_specific = 0;
193bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  ret->len = data_size;
194bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  return ret;
195bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
196bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
197bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic const hci_packet_factory_t interface = {
1985ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_reset,
1995ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_read_buffer_size,
2005ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_host_buffer_size,
2015ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_read_local_version_info,
2025ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_read_bd_addr,
2035ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_read_local_supported_commands,
2045ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_read_local_extended_features,
2055ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_write_simple_pairing_mode,
2065ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_write_secure_connections_host_support,
2075ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_set_event_mask,
2085ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_ble_write_host_support,
2095ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_ble_read_white_list_size,
2105ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_ble_read_buffer_size,
2115ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_ble_read_supported_states,
2125ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_ble_read_local_supported_features,
2135ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_ble_read_resolving_list_size,
2145ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_ble_read_suggested_default_data_length,
2151f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowski    make_ble_read_maximum_advertising_data_length,
2161f4cc6dc61ad5863c3fe31dafd364e064b1e64adJakub Pawlowski    make_ble_read_number_of_supported_advertising_sets,
2175ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_ble_set_event_mask,
2185ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson    make_read_local_supported_codecs};
2195ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watson
2205ff20a23661695abb1cff6d01d71a8cad4cc7890Myles Watsonconst hci_packet_factory_t* hci_packet_factory_get_interface() {
221bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  buffer_allocator = buffer_allocator_get_interface();
222bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  return &interface;
223bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
224