| /****************************************************************************** |
| * |
| * Copyright (C) 2014 Google, Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ******************************************************************************/ |
| |
| #pragma once |
| |
| #include "bt_types.h" |
| #include "hci_layer.h" |
| #include "osi/include/allocator.h" |
| |
| typedef void (*transmit_finished_cb)(BT_HDR* packet, bool all_fragments_sent); |
| typedef void (*packet_reassembled_cb)(BT_HDR* packet); |
| typedef void (*packet_fragmented_cb)(BT_HDR* packet, |
| bool send_transmit_finished); |
| |
| typedef struct { |
| // Called for every packet fragment. |
| packet_fragmented_cb fragmented; |
| |
| // Called for every completely reassembled packet. |
| packet_reassembled_cb reassembled; |
| |
| // Called when the fragmenter finishes sending all requested fragments, |
| // but the packet has not been entirely sent. |
| transmit_finished_cb transmit_finished; |
| } packet_fragmenter_callbacks_t; |
| |
| typedef struct packet_fragmenter_t { |
| // Initialize the fragmenter, specifying the |result_callbacks|. |
| void (*init)(const packet_fragmenter_callbacks_t* result_callbacks); |
| |
| // Release all resources associated with the fragmenter. |
| void (*cleanup)(void); |
| |
| // Fragments |packet| if necessary and hands off everything to the fragmented |
| // callback. |
| void (*fragment_and_dispatch)(BT_HDR* packet); |
| // If |packet| is a complete packet, forwards to the reassembled callback. |
| // Otherwise |
| // holds onto it until all fragments arrive, at which point the reassembled |
| // callback is called |
| // with the reassembled data. |
| void (*reassemble_and_dispatch)(BT_HDR* packet); |
| } packet_fragmenter_t; |
| |
| const packet_fragmenter_t* packet_fragmenter_get_interface(); |
| |
| const packet_fragmenter_t* packet_fragmenter_get_test_interface( |
| const controller_t* controller_interface, |
| const allocator_t* buffer_allocator_interface); |