hci_packet_parser.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 "bt_types.h"
22bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hcimsgs.h"
23bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hci_layer.h"
24bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson#include "hci_packet_parser.h"
25bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
26bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic void parse_read_buffer_size_response(
27bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    BT_HDR *response,
28bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    uint8_t *status_ptr,
29bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    uint16_t *data_size_ptr) {
30bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  uint8_t *stream = response->data + response->offset;
31bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  command_opcode_t opcode;
32bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
33bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  stream += 3; // skip the event header fields, and the number of hci command packets field
34bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  STREAM_TO_UINT16(opcode, stream);
35bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  STREAM_TO_UINT8(*status_ptr, stream);
36bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  STREAM_TO_UINT16(*data_size_ptr, stream);
37bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
38bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  assert(opcode == HCI_READ_BUFFER_SIZE);
39bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
40bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
41bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic void parse_ble_read_buffer_size_response(
42bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    BT_HDR *response,
43bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    uint8_t *status_ptr,
44bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    uint16_t *data_size_ptr) {
45bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  uint8_t *stream = response->data + response->offset;
46bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  command_opcode_t opcode;
47bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
48bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  stream += 3; // skip the event header fields, and the number of hci command packets field
49bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  STREAM_TO_UINT16(opcode, stream);
50bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  STREAM_TO_UINT8(*status_ptr, stream);
51bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  STREAM_TO_UINT16(*data_size_ptr, stream);
52bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
53bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  assert(opcode == HCI_BLE_READ_BUFFER_SIZE);
54bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
55bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
56bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic const hci_packet_parser_t interface = {
57bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  parse_read_buffer_size_response,
58bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  parse_ble_read_buffer_size_response
59bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson};
60bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson
61bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonconst hci_packet_parser_t *hci_packet_parser_get_interface() {
62bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson  return &interface;
63bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson}
64