/******************************************************************************
 *
 *  Copyright 2009-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 Multi-Channel
 *  Adaptation Protocol (MCAP).
 *
 ******************************************************************************/
#ifndef MCA_API_H
#define MCA_API_H

#include "bt_target.h"
#include "l2c_api.h"

/* move the following to bt_target.h or other place later */
#define MCA_NUM_TC_TBL ((MCA_NUM_REGS) * (MCA_NUM_LINKS) * (MCA_NUM_MDLS + 1))
/* Number of control channel control blocks	*/
#define MCA_NUM_CCBS ((MCA_NUM_REGS) * (MCA_NUM_LINKS))
/* Number of data channel control blocks */
#define MCA_NUM_DCBS ((MCA_NUM_REGS) * (MCA_NUM_LINKS) * (MCA_NUM_MDLS))

/*****************************************************************************
 * constants
 ****************************************************************************/
/* API function return value result codes. */
#define MCA_SUCCESS 0      /* Function successful */
#define MCA_BAD_PARAMS 1   /* Invalid parameters */
#define MCA_NO_RESOURCES 2 /* Not enough resources */
#define MCA_BAD_HANDLE 3   /* Bad handle */
#define MCA_BUSY 4         /* A procedure is already in progress */
#define MCA_WRITE_FAIL 5   /* Write failed */
#define MCA_BAD_MDL_ID 6   /* MDL ID is not valid for the current API */
typedef uint8_t tMCA_RESULT;

/* MDEP data type.  */
#define MCA_TDEP_ECHO 0 /* MDEP for echo test  */
#define MCA_TDEP_DATA 1 /* MDEP for normal data */

/* Control callback events. */
#define MCA_ERROR_RSP_EVT 0     /* error response */
#define MCA_CREATE_IND_EVT 1    /* create mdl indication */
#define MCA_CREATE_CFM_EVT 2    /* create mdl confirm */
#define MCA_RECONNECT_IND_EVT 3 /* reconnect mdl indication */
#define MCA_RECONNECT_CFM_EVT 4 /* reconnect mdl confirm */
#define MCA_ABORT_IND_EVT 5     /* abort mdl indication */
#define MCA_ABORT_CFM_EVT 6     /* abort mdl confirm */
#define MCA_DELETE_IND_EVT 7    /* delete mdl indication */
#define MCA_DELETE_CFM_EVT 8    /* delete mdl confirm */

/* request sync capabilities & requirements */
#define MCA_SYNC_CAP_IND_EVT 0x11
#define MCA_SYNC_CAP_CFM_EVT 0x12 /* indicate completion */
/* request to set the time-stamp clock */
#define MCA_SYNC_SET_IND_EVT 0x13
#define MCA_SYNC_SET_CFM_EVT 0x14 /* indicate completion */
/* update of the actual time-stamp clock instant from the sync slave */
#define MCA_SYNC_INFO_IND_EVT 0x15

#define MCA_CONNECT_IND_EVT 0x20    /* Control channel connected */
#define MCA_DISCONNECT_IND_EVT 0x21 /* Control channel disconnected */
#define MCA_OPEN_IND_EVT 0x22       /* Data channel open indication */
#define MCA_OPEN_CFM_EVT 0x23       /* Data channel open confirm */
#define MCA_CLOSE_IND_EVT 0x24      /* Data channel close indication */
#define MCA_CLOSE_CFM_EVT 0x25      /* Data channel close confirm */
#define MCA_CONG_CHG_EVT 0x26       /* congestion change event */
#define MCA_RSP_TOUT_IND_EVT                       \
  0x27 /* Control channel message response timeout \
          */
/*****************************************************************************
 *  Type Definitions
 ****************************************************************************/
typedef uint8_t
    tMCA_HANDLE;         /* the handle for registration. 1 based index to rcb */
typedef uint8_t tMCA_CL; /* the handle for a control channel; reported at
                            MCA_CONNECT_IND_EVT */
typedef uint8_t
    tMCA_DEP; /* the handle for MCA_CreateDep. This is also the local mdep_id */
typedef uint16_t tMCA_DL; /* the handle for the data channel. This is reported
                             at MCA_OPEN_CFM_EVT or MCA_OPEN_IND_EVT */

/* This is the data callback function.  It is executed when MCAP has a data
 * packet ready for the application.
*/
typedef void(tMCA_DATA_CBACK)(tMCA_DL mdl, BT_HDR* p_pkt);

/* This structure contains parameters which are set at registration. */
typedef struct {
  uint32_t rsp_tout; /* MCAP signaling response timeout */
  uint16_t ctrl_psm; /* L2CAP PSM for the MCAP control channel */
  uint16_t data_psm; /* L2CAP PSM for the MCAP data channel */
  uint16_t sec_mask; /* Security mask for BTM_SetSecurityLevel() */
} tMCA_REG;

/* This structure contains parameters to create a MDEP. */
typedef struct {
  uint8_t type; /* MCA_TDEP_DATA, or MCA_TDEP_ECHO. a regiatration may have only
                   one MCA_TDEP_ECHO MDEP */
  uint8_t max_mdl; /* The maximum number of MDLs for this MDEP (max is
                      MCA_NUM_MDLS) */
  tMCA_DATA_CBACK* p_data_cback; /* Data callback function */
} tMCA_CS;

#define MCA_FCS_NONE 0      /* fcs_present=false */
#define MCA_FCS_BYPASS 0x10 /* fcs_present=true, fcs=L2CAP_CFG_FCS_BYPASS */
#define MCA_FCS_USE 0x11    /* fcs_present=true, fcs=L2CAP_CFG_FCS_USE */
#define MCA_FCS_PRESNT_MASK 0x10 /* fcs_present=true */
#define MCA_FCS_USE_MASK 0x01    /* mask for fcs */
typedef uint8_t tMCA_FCS_OPT;

/* This structure contains L2CAP configuration parameters for the channel. */
typedef struct {
  tL2CAP_FCR_OPTS fcr_opt;
  uint16_t user_rx_buf_size;
  uint16_t user_tx_buf_size;
  uint16_t fcr_rx_buf_size;
  uint16_t fcr_tx_buf_size;
  tMCA_FCS_OPT fcs;
  uint16_t data_mtu; /* L2CAP MTU of the MCAP data channel */
} tMCA_CHNL_CFG;

/* Header structure for callback event parameters. */
typedef struct {
  uint16_t mdl_id; /* The associated MDL ID */
  uint8_t op_code; /* The op (request/response) code */
} tMCA_EVT_HDR;

/* Response Header structure for callback event parameters. */
typedef struct {
  uint16_t mdl_id;  /* The associated MDL ID */
  uint8_t op_code;  /* The op (request/response) code */
  uint8_t rsp_code; /* The response code */
} tMCA_RSP_EVT;

/* This data structure is associated with the MCA_CREATE_IND_EVT. */
typedef struct {
  uint16_t mdl_id; /* The associated MDL ID */
  uint8_t op_code; /* The op (request/response) code */
  uint8_t dep_id;  /* MDEP ID */
  uint8_t cfg;     /* The configuration to negotiate */
} tMCA_CREATE_IND;

/* This data structure is associated with the MCA_CREATE_CFM_EVT. */
typedef struct {
  uint16_t mdl_id;  /* The associated MDL ID */
  uint8_t op_code;  /* The op (request/response) code */
  uint8_t rsp_code; /* The response code. */
  uint8_t cfg;      /* The configuration to negotiate */
} tMCA_CREATE_CFM;

/* This data structure is associated with MCA_CONNECT_IND_EVT. */
typedef struct {
  RawAddress bd_addr; /* The peer address */
  uint16_t mtu;    /* peer mtu */
} tMCA_CONNECT_IND;

/* This data structure is associated with MCA_DISCONNECT_IND_EVT. */
typedef struct {
  RawAddress bd_addr; /* The peer address */
  uint16_t reason; /* disconnect reason given by L2CAP */
} tMCA_DISCONNECT_IND;

/* This data structure is for MCA_OPEN_IND_EVT, and MCA_OPEN_CFM_EVT. */
typedef struct {
  uint16_t mdl_id; /* The associated MDL ID */
  tMCA_DL mdl;     /* The handle for the data channel */
  uint16_t mtu;    /* peer mtu */
} tMCA_DL_OPEN;

/* This data structure is for MCA_CLOSE_IND_EVT and MCA_CLOSE_CFM_EVT. */
typedef struct {
  uint16_t mdl_id; /* The associated MDL ID */
  tMCA_DL mdl;     /* The handle for the data channel */
  uint16_t reason; /* disconnect reason given by L2CAP */
} tMCA_DL_CLOSE;

/* This data structure is associated with MCA_CONG_CHG_EVT. */
typedef struct {
  uint16_t mdl_id; /* N/A - This is a place holder */
  tMCA_DL mdl;     /* The handle for the data channel */
  bool cong;       /* true, if the channel is congested */
} tMCA_CONG_CHG;

/* Union of all control callback event data structures */
typedef union {
  tMCA_EVT_HDR hdr;
  tMCA_RSP_EVT rsp;
  tMCA_CREATE_IND create_ind;
  tMCA_CREATE_CFM create_cfm;
  tMCA_EVT_HDR reconnect_ind;
  tMCA_RSP_EVT reconnect_cfm;
  tMCA_EVT_HDR abort_ind;
  tMCA_RSP_EVT abort_cfm;
  tMCA_EVT_HDR delete_ind;
  tMCA_RSP_EVT delete_cfm;
  tMCA_CONNECT_IND connect_ind;
  tMCA_DISCONNECT_IND disconnect_ind;
  tMCA_DL_OPEN open_ind;
  tMCA_DL_OPEN open_cfm;
  tMCA_DL_CLOSE close_ind;
  tMCA_DL_CLOSE close_cfm;
  tMCA_CONG_CHG cong_chg;
} tMCA_CTRL;

/* This is the control callback function.  This function passes control events
 * to the application.
*/
typedef void(tMCA_CTRL_CBACK)(tMCA_HANDLE handle, tMCA_CL mcl, uint8_t event,
                              tMCA_CTRL* p_data);

/*******************************************************************************
 *
 * Function         MCA_Init
 *
 * Description      Initialize MCAP internal control blocks.
 *                  This function is called at stack start up.
 *
 * Returns          void
 *
 ******************************************************************************/
extern void MCA_Init(void);

/*******************************************************************************
 *
 * Function         MCA_SetTraceLevel
 *
 * Description      This function sets the debug trace level for MCA.
 *                  If 0xff is passed, the current trace level is returned.
 *
 *                  Input Parameters:
 *                      level:  The level to set the MCA tracing to:
 *                      0xff-returns the current setting.
 *                      0-turns off tracing.
 *                      >= 1-Errors.
 *                      >= 2-Warnings.
 *                      >= 3-APIs.
 *                      >= 4-Events.
 *                      >= 5-Debug.
 *
 * Returns          The new trace level or current trace level if
 *                  the input parameter is 0xff.
 *
 ******************************************************************************/
extern uint8_t MCA_SetTraceLevel(uint8_t level);

/*******************************************************************************
 *
 * Function         MCA_Register
 *
 * Description      This function registers an MCAP implementation.
 *                  It is assumed that the control channel PSM and data channel
 *                  PSM are not used by any other instances of the stack.
 *                  If the given p_reg->ctrl_psm is 0, this handle is INT only.
 *
 * Returns          0, if failed. Otherwise, the MCA handle.
 *
 ******************************************************************************/
extern tMCA_HANDLE MCA_Register(tMCA_REG* p_reg, tMCA_CTRL_CBACK* p_cback);

/*******************************************************************************
 *
 * Function         MCA_Deregister
 *
 * Description      Deregister an MCAP implementation. Before this function can
 *                  be called, all control and data channels must be removed
 *                  with MCA_DisconnectReq and MCA_CloseReq.
 *
 * Returns          void
 *
 ******************************************************************************/
extern void MCA_Deregister(tMCA_HANDLE handle);

/*******************************************************************************
 *
 * Function         MCA_CreateDep
 *
 * Description      Create a data endpoint.  If the MDEP is created
 *                  successfully, the MDEP ID is returned in *p_dep. After a
 *                  data endpoint is created, an application can initiate a
 *                  connection between this endpoint and an endpoint on a peer
 *                  device.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_CreateDep(tMCA_HANDLE handle, tMCA_DEP* p_dep,
                                 tMCA_CS* p_cs);

/*******************************************************************************
 *
 * Function         MCA_DeleteDep
 *
 * Description      Delete a data endpoint.  This function is called when
 *                  the implementation is no longer using a data endpoint.
 *                  If this function is called when the endpoint is connected
 *                  the connection is closed and the data endpoint
 *                  is removed.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_DeleteDep(tMCA_HANDLE handle, tMCA_DEP dep);

/*******************************************************************************
 *
 * Function         MCA_ConnectReq
 *
 * Description      This function initiates an MCAP control channel connection
 *                  to the peer device.  When the connection is completed, an
 *                  MCA_CONNECT_IND_EVT is reported to the application via its
 *                  control callback function.
 *                  This control channel is identified by tMCA_CL.
 *                  If the connection attempt fails, an MCA_DISCONNECT_IND_EVT
 *                  is reported. The security mask parameter overrides the
 *                  outgoing security mask set in MCA_Register().
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_ConnectReq(tMCA_HANDLE handle, const RawAddress& bd_addr,
                                  uint16_t ctrl_psm, uint16_t sec_mask);

/*******************************************************************************
 *
 * Function         MCA_DisconnectReq
 *
 * Description      This function disconnect an MCAP control channel
 *                  to the peer device.
 *                  If associated data channel exists, they are disconnected.
 *                  When the MCL is disconnected an MCA_DISCONNECT_IND_EVT is
 *                  reported to the application via its control callback
 *                  function.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_DisconnectReq(tMCA_CL mcl);

/*******************************************************************************
 *
 * Function         MCA_CreateMdl
 *
 * Description      This function sends a CREATE_MDL request to the peer device.
 *                  When the response is received, a MCA_CREATE_CFM_EVT is
 *                  reported with the given MDL ID.
 *                  If the response is successful, a data channel is open
 *                  with the given p_chnl_cfg
 *                  When the data channel is open successfully, a
 *                  MCA_OPEN_CFM_EVT is reported. This data channel is
 *                  identified as tMCA_DL.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_CreateMdl(tMCA_CL mcl, tMCA_DEP dep, uint16_t data_psm,
                                 uint16_t mdl_id, uint8_t peer_dep_id,
                                 uint8_t cfg, const tMCA_CHNL_CFG* p_chnl_cfg);

/*******************************************************************************
 *
 * Function         MCA_CreateMdlRsp
 *
 * Description      This function sends a CREATE_MDL response to the peer device
 *                  in response to a received MCA_CREATE_IND_EVT.
 *                  If the rsp_code is successful, a data channel is open
 *                  with the given p_chnl_cfg
 *                  When the data channel is open successfully, a
 *                  MCA_OPEN_IND_EVT is reported. This data channel is
 *                  identified as tMCA_DL.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_CreateMdlRsp(tMCA_CL mcl, tMCA_DEP dep, uint16_t mdl_id,
                                    uint8_t cfg, uint8_t rsp_code,
                                    const tMCA_CHNL_CFG* p_chnl_cfg);

/*******************************************************************************
 *
 * Function         MCA_CloseReq
 *
 * Description      Close a data channel.  When the channel is closed, an
 *                  MCA_CLOSE_CFM_EVT is sent to the application via the
 *                  control callback function for this handle.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_CloseReq(tMCA_DL mdl);

/*******************************************************************************
 *
 * Function         MCA_ReconnectMdl
 *
 * Description      This function sends a RECONNECT_MDL request to the peer
 *                  device. When the response is received, a
 *                  MCA_RECONNECT_CFM_EVT is reported. If the response is
 *                  successful, a data channel is open. When the data channel is
 *                  open successfully, a MCA_OPEN_CFM_EVT is reported.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_ReconnectMdl(tMCA_CL mcl, tMCA_DEP dep,
                                    uint16_t data_psm, uint16_t mdl_id,
                                    const tMCA_CHNL_CFG* p_chnl_cfg);

/*******************************************************************************
 *
 * Function         MCA_ReconnectMdlRsp
 *
 * Description      Send a RECONNECT_MDL response to the peer device in response
 *                  to a MCA_RECONNECT_IND_EVT event.
 *                  If the response is successful, a data channel is open.
 *                  When the data channel is open successfully, a
 *                  MCA_OPEN_IND_EVT is reported.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_ReconnectMdlRsp(tMCA_CL mcl, tMCA_DEP dep,
                                       uint16_t mdl_id, uint8_t rsp_code,
                                       const tMCA_CHNL_CFG* p_chnl_cfg);

/*******************************************************************************
 *
 * Function         MCA_DataChnlCfg
 *
 * Description      This function initiates a data channel connection toward the
 *                  connected peer device.
 *                  When the data channel is open successfully, a
 *                  MCA_OPEN_CFM_EVT is reported. This data channel is
 *                  identified as tMCA_DL.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_DataChnlCfg(tMCA_CL mcl,
                                   const tMCA_CHNL_CFG* p_chnl_cfg);

/*******************************************************************************
 *
 * Function         MCA_Abort
 *
 * Description      This function sends a ABORT_MDL request to the peer device.
 *                  When the response is received, a MCA_ABORT_CFM_EVT is
 *                  reported.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_Abort(tMCA_CL mcl);

/*******************************************************************************
 *
 * Function         MCA_Delete
 *
 * Description      This function sends a DELETE_MDL request to the peer device.
 *                  When the response is received, a MCA_DELETE_CFM_EVT is
 *                  reported.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_Delete(tMCA_CL mcl, uint16_t mdl_id);

/*******************************************************************************
 *
 * Function         MCA_WriteReq
 *
 * Description      Send a data packet to the peer device.
 *
 *                  The application passes the packet using the BT_HDR
 *                  structure. The offset field must be equal to or greater than
 *                  L2CAP_MIN_OFFSET. This allows enough space in the buffer for
 *                  the L2CAP header.
 *
 *                  The memory pointed to by p_pkt must be a GKI buffer
 *                  allocated by the application.  This buffer will be freed
 *                  by the protocol stack; the application must not free
 *                  this buffer.
 *
 * Returns          MCA_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern tMCA_RESULT MCA_WriteReq(tMCA_DL mdl, BT_HDR* p_pkt);

/*******************************************************************************
 *
 * Function         MCA_GetL2CapChannel
 *
 * Description      Get the L2CAP CID used by the given data channel handle.
 *
 * Returns          L2CAP channel ID if successful, otherwise 0.
 *
 ******************************************************************************/
extern uint16_t MCA_GetL2CapChannel(tMCA_DL mdl);

/**
 * The following definitions are for test interface only, they mirror function
 * definitions above. This struct allows an external application to load and
 * call these methods without linking against the core library.
 */
typedef struct {
  size_t size;
  void (*init)(void);
  tMCA_HANDLE (*register_application)(tMCA_REG* p_reg,
                                      tMCA_CTRL_CBACK* p_cback);
  void (*deregister_application)(tMCA_HANDLE handle);
  tMCA_RESULT (*create_mdep)(tMCA_HANDLE handle, tMCA_DEP* p_dep,
                             tMCA_CS* p_cs);
  tMCA_RESULT (*delete_mdep)(tMCA_HANDLE handle, tMCA_DEP dep);
  tMCA_RESULT (*connect_mcl)(tMCA_HANDLE handle, const RawAddress& bd_addr,
                             uint16_t ctrl_psm, uint16_t sec_mask);
  tMCA_RESULT (*disconnect_mcl)(tMCA_CL mcl);
  tMCA_RESULT (*create_mdl_request)(tMCA_CL mcl, tMCA_DEP dep,
                                    uint16_t data_psm, uint16_t mdl_id,
                                    uint8_t peer_dep_id, uint8_t cfg,
                                    const tMCA_CHNL_CFG* p_chnl_cfg);
  tMCA_RESULT (*create_mdl_response)(tMCA_CL mcl, tMCA_DEP dep, uint16_t mdl_id,
                                     uint8_t cfg, uint8_t rsp_code,
                                     const tMCA_CHNL_CFG* p_chnl_cfg);
  tMCA_RESULT (*close_mdl_request)(tMCA_DL mdl);
  tMCA_RESULT (*reconnect_mdl_request)(tMCA_CL mcl, tMCA_DEP dep,
                                       uint16_t data_psm, uint16_t mdl_id,
                                       const tMCA_CHNL_CFG* p_chnl_cfg);
  tMCA_RESULT (*reconnect_mdl_response)(tMCA_CL mcl, tMCA_DEP dep,
                                        uint16_t mdl_id, uint8_t rsp_code,
                                        const tMCA_CHNL_CFG* p_chnl_cfg);
  tMCA_RESULT (*data_channel_config)(tMCA_CL mcl,
                                     const tMCA_CHNL_CFG* p_chnl_cfg);
  tMCA_RESULT (*abort_mdl)(tMCA_CL mcl);
  tMCA_RESULT (*delete_mdl)(tMCA_CL mcl, uint16_t mdl_id);
  tMCA_RESULT (*write_mdl)(tMCA_DL mdl, BT_HDR* p_pkt);
  uint16_t (*get_l2cap_channel)(tMCA_DL mdl);
} btmcap_test_interface_t;

#endif /* MCA_API_H */
