/******************************************************************************
 *
 *  Copyright 2001-2012 Broadcom Corporation
 *
 *  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.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This interface file contains the interface to the Bluetooth Network
 *  Encapsilation Protocol (BNEP).
 *
 ******************************************************************************/
#ifndef BNEP_API_H
#define BNEP_API_H

#include "l2c_api.h"

/*****************************************************************************
 *  Constants
 ****************************************************************************/

/* Define the minimum offset needed in a GKI buffer for
 * sending BNEP packets. Note, we are currently not sending
 * extension headers, but may in the future, so allow
 * space for them
*/
#define BNEP_MINIMUM_OFFSET (15 + L2CAP_MIN_OFFSET)
#define BNEP_INVALID_HANDLE 0xFFFF

/*****************************************************************************
 *  Type Definitions
 ****************************************************************************/

/* Define the result codes from BNEP
*/
enum {
  BNEP_SUCCESS,               /* Success                           */
  BNEP_CONN_DISCONNECTED,     /* Connection terminated   */
  BNEP_NO_RESOURCES,          /* No resources                      */
  BNEP_MTU_EXCEDED,           /* Attempt to write long data        */
  BNEP_INVALID_OFFSET,        /* Insufficient offset in GKI buffer */
  BNEP_CONN_FAILED,           /* Connection failed                 */
  BNEP_CONN_FAILED_CFG,       /* Connection failed cos of config   */
  BNEP_CONN_FAILED_SRC_UUID,  /* Connection failed wrong source UUID   */
  BNEP_CONN_FAILED_DST_UUID,  /* Connection failed wrong destination UUID   */
  BNEP_CONN_FAILED_UUID_SIZE, /* Connection failed wrong size UUID   */
  BNEP_Q_SIZE_EXCEEDED,       /* Too many buffers to dest          */
  BNEP_TOO_MANY_FILTERS,      /* Too many local filters specified  */
  BNEP_SET_FILTER_FAIL,       /* Set Filter failed  */
  BNEP_WRONG_HANDLE,          /* Wrong handle for the connection  */
  BNEP_WRONG_STATE,           /* Connection is in wrong state */
  BNEP_SECURITY_FAIL,         /* Failed because of security */
  BNEP_IGNORE_CMD,            /* To ignore the rcvd command */
  BNEP_TX_FLOW_ON,            /* tx data flow enabled */
  BNEP_TX_FLOW_OFF            /* tx data flow disabled */

};
typedef uint8_t tBNEP_RESULT;

/***************************
 *  Callback Functions
 ***************************/

/* Connection state change callback prototype. Parameters are
 *              Connection handle
 *              BD Address of remote
 *              Connection state change result
 *                  BNEP_SUCCESS indicates connection is success
 *                  All values are used to indicate the reason for failure
 *              Flag to indicate if it is just a role change
*/
typedef void(tBNEP_CONN_STATE_CB)(uint16_t handle, const RawAddress& rem_bda,
                                  tBNEP_RESULT result, bool is_role_change);

/* Connection indication callback prototype. Parameters are
 *              BD Address of remote, remote UUID and local UUID
 *              and flag to indicate role change and handle to the connection
 *              When BNEP calls this function profile should
 *              use BNEP_ConnectResp call to accept or reject the request
*/
typedef void(tBNEP_CONNECT_IND_CB)(uint16_t handle, const RawAddress& bd_addr,
                                   const bluetooth::Uuid& remote_uuid,
                                   const bluetooth::Uuid& local_uuid,
                                   bool is_role_change);

/* Data buffer received indication callback prototype. Parameters are
 *              Handle to the connection
 *              Source BD/Ethernet Address
 *              Dest BD/Ethernet address
 *              Protocol
 *              Pointer to the buffer
 *              Flag to indicate whether extension headers to be forwarded are
 *                present
 */
typedef void(tBNEP_DATA_BUF_CB)(uint16_t handle, const RawAddress& src,
                                const RawAddress& dst, uint16_t protocol,
                                BT_HDR* p_buf, bool fw_ext_present);

/* Data received indication callback prototype. Parameters are
 *              Handle to the connection
 *              Source BD/Ethernet Address
 *              Dest BD/Ethernet address
 *              Protocol
 *              Pointer to the beginning of the data
 *              Length of data
 *              Flag to indicate whether extension headers to be forwarded are
 *                present
 */
typedef void(tBNEP_DATA_IND_CB)(uint16_t handle, const RawAddress& src,
                                const RawAddress& dst, uint16_t protocol,
                                uint8_t* p_data, uint16_t len,
                                bool fw_ext_present);

/* Flow control callback for TX data. Parameters are
 *              Handle to the connection
 *              Event  flow status
*/
typedef void(tBNEP_TX_DATA_FLOW_CB)(uint16_t handle, tBNEP_RESULT event);

/* Filters received indication callback prototype. Parameters are
 *              Handle to the connection
 *              true if the cb is called for indication
 *              Ignore this if it is indication, otherwise it is the result
 *                      for the filter set operation performed by the local
 *                      device
 *              Number of protocol filters present
 *              Pointer to the filters start. Filters are present in pairs
 *                      of start of the range and end of the range.
 *                      They will be present in big endian order. First
 *                      two bytes will be starting of the first range and
 *                      next two bytes will be ending of the range.
*/
typedef void(tBNEP_FILTER_IND_CB)(uint16_t handle, bool indication,
                                  tBNEP_RESULT result, uint16_t num_filters,
                                  uint8_t* p_filters);

/* Multicast Filters received indication callback prototype. Parameters are
 *              Handle to the connection
 *              true if the cb is called for indication
 *              Ignore this if it is indication, otherwise it is the result
 *                      for the filter set operation performed by the local
 *                      device
 *              Number of multicast filters present
 *              Pointer to the filters start. Filters are present in pairs
 *                      of start of the range and end of the range.
 *                      First six bytes will be starting of the first range and
 *                      next six bytes will be ending of the range.
*/
typedef void(tBNEP_MFILTER_IND_CB)(uint16_t handle, bool indication,
                                   tBNEP_RESULT result, uint16_t num_mfilters,
                                   uint8_t* p_mfilters);

/* This is the structure used by profile to register with BNEP */
typedef struct {
  tBNEP_CONNECT_IND_CB* p_conn_ind_cb;  /* To indicate the conn request */
  tBNEP_CONN_STATE_CB* p_conn_state_cb; /* To indicate conn state change */
  tBNEP_DATA_IND_CB* p_data_ind_cb;     /* To pass the data received */
  tBNEP_DATA_BUF_CB* p_data_buf_cb;     /* To pass the data buffer received */
  tBNEP_TX_DATA_FLOW_CB* p_tx_data_flow_cb; /* data flow callback */
  tBNEP_FILTER_IND_CB*
      p_filter_ind_cb; /* To indicate that peer set protocol filters */
  tBNEP_MFILTER_IND_CB*
      p_mfilter_ind_cb; /* To indicate that peer set mcast filters */

} tBNEP_REGISTER;

/* This is the structure used by profile to get the status of BNEP */
typedef struct {
#define BNEP_STATUS_FAILE 0
#define BNEP_STATUS_CONNECTED 1
  uint8_t con_status;

  uint16_t l2cap_cid;
  RawAddress rem_bda;
  uint16_t rem_mtu_size;
  uint16_t xmit_q_depth;

  uint16_t sent_num_filters;
  uint16_t sent_mcast_filters;
  uint16_t rcvd_num_filters;
  uint16_t rcvd_mcast_filters;
  bluetooth::Uuid src_uuid;
  bluetooth::Uuid dst_uuid;

} tBNEP_STATUS;

/*****************************************************************************
 *  External Function Declarations
 ****************************************************************************/
/*******************************************************************************
 *
 * Function         BNEP_Register
 *
 * Description      This function is called by the upper layer to register
 *                  its callbacks with BNEP
 *
 * Parameters:      p_reg_info - contains all callback function pointers
 *
 *
 * Returns          BNEP_SUCCESS        if registered successfully
 *                  BNEP_FAILURE        if connection state callback is missing
 *
 ******************************************************************************/
extern tBNEP_RESULT BNEP_Register(tBNEP_REGISTER* p_reg_info);

/*******************************************************************************
 *
 * Function         BNEP_Deregister
 *
 * Description      This function is called by the upper layer to de-register
 *                  its callbacks.
 *
 * Parameters:      void
 *
 *
 * Returns          void
 *
 ******************************************************************************/
extern void BNEP_Deregister(void);

/*******************************************************************************
 *
 * Function         BNEP_Connect
 *
 * Description      This function creates a BNEP connection to a remote
 *                  device.
 *
 * Parameters:      p_rem_addr - BD_ADDR of the peer
 *                  src_uuid   - source uuid for the connection
 *                  dst_uuid   - destination uuid for the connection
 *                  p_handle   - pointer to return the handle for the connection
 *
 * Returns          BNEP_SUCCESS                if connection started
 *                  BNEP_NO_RESOURCES           if no resources
 *
 ******************************************************************************/
extern tBNEP_RESULT BNEP_Connect(const RawAddress& p_rem_bda,
                                 const bluetooth::Uuid& src_uuid,
                                 const bluetooth::Uuid& dst_uuid,
                                 uint16_t* p_handle);

/*******************************************************************************
 *
 * Function         BNEP_ConnectResp
 *
 * Description      This function is called in responce to connection indication
 *
 *
 * Parameters:      handle  - handle given in the connection indication
 *                  resp    - responce for the connection indication
 *
 * Returns          BNEP_SUCCESS                if connection started
 *                  BNEP_WRONG_HANDLE           if the connection is not found
 *                  BNEP_WRONG_STATE            if the responce is not expected
 *
 ******************************************************************************/
extern tBNEP_RESULT BNEP_ConnectResp(uint16_t handle, tBNEP_RESULT resp);

/*******************************************************************************
 *
 * Function         BNEP_Disconnect
 *
 * Description      This function is called to close the specified connection.
 *
 * Parameters:      handle   - handle of the connection
 *
 * Returns          BNEP_SUCCESS                if connection is disconnected
 *                  BNEP_WRONG_HANDLE           if no connection is not found
 *
 ******************************************************************************/
extern tBNEP_RESULT BNEP_Disconnect(uint16_t handle);

/*******************************************************************************
 *
 * Function         BNEP_WriteBuf
 *
 * Description      This function sends data in a GKI buffer on BNEP connection
 *
 * Parameters:      handle       - handle of the connection to write
 *                  p_dest_addr  - BD_ADDR/Ethernet addr of the destination
 *                  p_buf        - pointer to address of buffer with data
 *                  protocol     - protocol type of the packet
 *                  p_src_addr   - (optional) BD_ADDR/ethernet address of the
 *                                 source (should be NULL if it is the local BD
 *                                         Addr)
 *                  fw_ext_present - forwarded extensions present
 *
 * Returns:         BNEP_WRONG_HANDLE       - if passed handle is not valid
 *                  BNEP_MTU_EXCEDED        - If the data length is greater
 *                                            than MTU
 *                  BNEP_IGNORE_CMD         - If the packet is filtered out
 *                  BNEP_Q_SIZE_EXCEEDED    - If the Tx Q is full
 *                  BNEP_SUCCESS            - If written successfully
 *
 ******************************************************************************/
extern tBNEP_RESULT BNEP_WriteBuf(uint16_t handle,
                                  const RawAddress& p_dest_addr, BT_HDR* p_buf,
                                  uint16_t protocol,
                                  const RawAddress* p_src_addr,
                                  bool fw_ext_present);

/*******************************************************************************
 *
 * Function         BNEP_Write
 *
 * Description      This function sends data over a BNEP connection
 *
 * Parameters:      handle       - handle of the connection to write
 *                  p_dest_addr  - BD_ADDR/Ethernet addr of the destination
 *                  p_data       - pointer to data start
 *                  protocol     - protocol type of the packet
 *                  p_src_addr   - (optional) BD_ADDR/ethernet address of the
 *                                 source (should be NULL if it is the local BD
 *                                 Addr)
 *                  fw_ext_present - forwarded extensions present
 *
 * Returns:         BNEP_WRONG_HANDLE       - if passed handle is not valid
 *                  BNEP_MTU_EXCEDED        - If the data length is greater than
 *                                            the MTU
 *                  BNEP_IGNORE_CMD         - If the packet is filtered out
 *                  BNEP_Q_SIZE_EXCEEDED    - If the Tx Q is full
 *                  BNEP_NO_RESOURCES       - If not able to allocate a buffer
 *                  BNEP_SUCCESS            - If written successfully
 *
 ******************************************************************************/
extern tBNEP_RESULT BNEP_Write(uint16_t handle, const RawAddress& p_dest_addr,
                               uint8_t* p_data, uint16_t len, uint16_t protocol,
                               const RawAddress* p_src_addr,
                               bool fw_ext_present);

/*******************************************************************************
 *
 * Function         BNEP_SetProtocolFilters
 *
 * Description      This function sets the protocol filters on peer device
 *
 * Parameters:      handle        - Handle for the connection
 *                  num_filters   - total number of filter ranges
 *                  p_start_array - Array of beginings of all protocol ranges
 *                  p_end_array   - Array of ends of all protocol ranges
 *
 * Returns          BNEP_WRONG_HANDLE           - if the connection handle is
 *                                                not valid
 *                  BNEP_SET_FILTER_FAIL        - if the connection is in the
 *                                                wrong state
 *                  BNEP_TOO_MANY_FILTERS       - if too many filters
 *                  BNEP_SUCCESS                - if request sent successfully
 *
 ******************************************************************************/
extern tBNEP_RESULT BNEP_SetProtocolFilters(uint16_t handle,
                                            uint16_t num_filters,
                                            uint16_t* p_start_array,
                                            uint16_t* p_end_array);

/*******************************************************************************
 *
 * Function         BNEP_SetMulticastFilters
 *
 * Description      This function sets the filters for multicast addresses for
 *                  BNEP.
 *
 * Parameters:      handle        - Handle for the connection
 *                  num_filters   - total number of filter ranges
 *                  p_start_array - Pointer to sequence of beginings of all
 *                                         multicast address ranges
 *                  p_end_array   - Pointer to sequence of ends of all
 *                                         multicast address ranges
 *
 * Returns          BNEP_WRONG_HANDLE           - if the connection handle is
 *                                                not valid
 *                  BNEP_SET_FILTER_FAIL        - if the connection is in the
 *                                                wrong state
 *                  BNEP_TOO_MANY_FILTERS       - if too many filters
 *                  BNEP_SUCCESS                - if request sent successfully
 *
 ******************************************************************************/
extern tBNEP_RESULT BNEP_SetMulticastFilters(uint16_t handle,
                                             uint16_t num_filters,
                                             uint8_t* p_start_array,
                                             uint8_t* p_end_array);

/*******************************************************************************
 *
 * Function         BNEP_SetTraceLevel
 *
 * Description      This function sets the trace level for BNEP. If called with
 *                  a value of 0xFF, it simply reads the current trace level.
 *
 * Returns          the new (current) trace level
 *
 ******************************************************************************/
extern uint8_t BNEP_SetTraceLevel(uint8_t new_level);

/*******************************************************************************
 *
 * Function         BNEP_Init
 *
 * Description      This function initializes the BNEP unit. It should be called
 *                  before accessing any other APIs to initialize the control
 *                  block
 *
 * Returns          void
 *
 ******************************************************************************/
extern void BNEP_Init(void);

/*******************************************************************************
 *
 * Function         BNEP_GetStatus
 *
 * Description      This function gets the status information for BNEP
 *                  connection
 *
 * Returns          BNEP_SUCCESS            - if the status is available
 *                  BNEP_NO_RESOURCES       - if no structure is passed for
 *                                            output
 *                  BNEP_WRONG_HANDLE       - if the handle is invalid
 *                  BNEP_WRONG_STATE        - if not in connected state
 *
 ******************************************************************************/
extern tBNEP_RESULT BNEP_GetStatus(uint16_t handle, tBNEP_STATUS* p_status);

#endif
