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