hci_packet_factory.cc revision bf8193bc81cc077e3acd245cacbe8e3789c4b9ff
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
19bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include <assert.h>
20bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
21bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "allocator.h"
22bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "bt_types.h"
23bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "buffer_allocator.h"
24bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hcidefs.h"
25bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hcimsgs.h"
26bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hci_internals.h"
27bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hci_layer.h"
28bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hci_packet_factory.h"
29bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
30bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic const allocator_t *buffer_allocator;
31bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
32bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic BT_HDR *make_packet(size_t data_size);
33bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
34bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson// Interface functions
35bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
36bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic BT_HDR *make_read_buffer_size_command(void) {
37bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  BT_HDR *packet = make_packet(HCI_COMMAND_PREAMBLE_SIZE);
38bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
39bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  uint8_t *stream = packet->data;
40bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  UINT16_TO_STREAM(stream, HCI_READ_BUFFER_SIZE);
41bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  UINT8_TO_STREAM(stream, 0); // no parameters
42bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
43bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  return packet;
44bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
45bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
46bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic BT_HDR *make_ble_read_buffer_size_command(void) {
47bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  BT_HDR *packet = make_packet(HCI_COMMAND_PREAMBLE_SIZE);
48bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
49bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  uint8_t *stream = packet->data;
50bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  UINT16_TO_STREAM(stream, HCI_BLE_READ_BUFFER_SIZE);
51bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  UINT8_TO_STREAM(stream, 0); // no parameters
52bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
53bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  return packet;
54bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
55bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
56bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson// Internal functions
57bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
58bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic BT_HDR *make_packet(size_t data_size) {
59bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  BT_HDR *ret = (BT_HDR *)buffer_allocator->alloc(sizeof(BT_HDR) + data_size);
60bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  assert(ret);
61bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  ret->event = 0;
62bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  ret->offset = 0;
63bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  ret->layer_specific = 0;
64bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  ret->len = data_size;
65bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  return ret;
66bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
67bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
68bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic const hci_packet_factory_t interface = {
69bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  make_read_buffer_size_command,
70bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  make_ble_read_buffer_size_command
71bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson};
72bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
73bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonconst hci_packet_factory_t *hci_packet_factory_get_interface() {
74bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  buffer_allocator = buffer_allocator_get_interface();
75bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  return &interface;
76bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
77