Home | History | Annotate | Download | only in include
      1 /******************************************************************************
      2  *
      3  *  Copyright 2014 Google, Inc.
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 #pragma once
     20 
     21 #include "bt_types.h"
     22 #include "hci_layer.h"
     23 #include "osi/include/allocator.h"
     24 
     25 typedef void (*transmit_finished_cb)(BT_HDR* packet, bool all_fragments_sent);
     26 typedef void (*packet_reassembled_cb)(BT_HDR* packet);
     27 typedef void (*packet_fragmented_cb)(BT_HDR* packet,
     28                                      bool send_transmit_finished);
     29 
     30 typedef struct {
     31   // Called for every packet fragment.
     32   packet_fragmented_cb fragmented;
     33 
     34   // Called for every completely reassembled packet.
     35   packet_reassembled_cb reassembled;
     36 
     37   // Called when the fragmenter finishes sending all requested fragments,
     38   // but the packet has not been entirely sent.
     39   transmit_finished_cb transmit_finished;
     40 } packet_fragmenter_callbacks_t;
     41 
     42 typedef struct packet_fragmenter_t {
     43   // Initialize the fragmenter, specifying the |result_callbacks|.
     44   void (*init)(const packet_fragmenter_callbacks_t* result_callbacks);
     45 
     46   // Release all resources associated with the fragmenter.
     47   void (*cleanup)(void);
     48 
     49   // Fragments |packet| if necessary and hands off everything to the fragmented
     50   // callback.
     51   void (*fragment_and_dispatch)(BT_HDR* packet);
     52   // If |packet| is a complete packet, forwards to the reassembled callback.
     53   // Otherwise
     54   // holds onto it until all fragments arrive, at which point the reassembled
     55   // callback is called
     56   // with the reassembled data.
     57   void (*reassemble_and_dispatch)(BT_HDR* packet);
     58 } packet_fragmenter_t;
     59 
     60 const packet_fragmenter_t* packet_fragmenter_get_interface();
     61 
     62 const packet_fragmenter_t* packet_fragmenter_get_test_interface(
     63     const controller_t* controller_interface,
     64     const allocator_t* buffer_allocator_interface);
     65