/******************************************************************************
 *
 *  Copyright (C) 1999-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 file contains definitions internal to the RFC unit
 *
 *****************************************************************************/

#ifndef RFC_INT_H
#define RFC_INT_H

#include "l2c_api.h"
#include "port_int.h"

/*
** Define RFCOMM result codes
*/
#define RFCOMM_SUCCESS          0
#define RFCOMM_ERROR            1
#define RFCOMM_LOW_RESOURCES    2
#define RFCOMM_TRY_LATER        3

#define RFCOMM_USER_ERR         111
#define RFCOMM_SECURITY_ERR     112

/*
** Define max and min RFCOMM MTU (N1)
*/
#define RFCOMM_MIN_MTU          23
#define RFCOMM_MAX_MTU          32767

extern void RFCOMM_StartReq (tRFC_MCB *p_mcb);
extern void RFCOMM_StartRsp (tRFC_MCB *p_mcb, UINT16 result);

extern void RFCOMM_DlcEstablishReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu);
extern void RFCOMM_DlcEstablishRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 result);

extern void RFCOMM_DataReq (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf);

extern void RFCOMM_DlcReleaseReq (tRFC_MCB *p_mcb, UINT8 dlci);

extern void RFCOMM_ParNegReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu);
extern void RFCOMM_ParNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k);

extern void RFCOMM_TestReq (UINT8 *p_data, UINT16 len);

#define RFCOMM_FLOW_STATE_DISABLE       0
#define RFCOMM_FLOW_STATE_ENABLE        1

extern void RFCOMM_FlowReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 state);

extern void RFCOMM_PortNegReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars);
extern void RFCOMM_PortNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 param_mask);

extern void RFCOMM_ControlReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars);
extern void RFCOMM_ControlRsp (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars);

extern void RFCOMM_LineStatusReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 line_status);
/*
** Define logical struct used for sending and decoding MX frames
*/
typedef struct
{
    UINT8   dlci;
    UINT8   type;
    UINT8   cr;
    UINT8   ea;
    UINT8   pf;
    UINT8   credit;

    union
    {
        struct
        {
            UINT8 dlci;
            UINT8 frame_type;
            UINT8 conv_layer;
            UINT8 priority;
            UINT8 t1;
            UINT16 mtu;
            UINT8 n2;
            UINT8 k;
        } pn;
        struct
        {
            UINT8   *p_data;
            UINT16  data_len;
        } test;
        struct
        {
            UINT8 dlci;
            UINT8 signals;
            UINT8 break_present;
            UINT8 break_duration;
        } msc;
        struct
        {
            UINT8 ea;
            UINT8 cr;
            UINT8 type;
        } nsc;
        struct
        {
            UINT8 dlci;
            UINT8 is_request;
            UINT8 baud_rate;
            UINT8 byte_size;
            UINT8 stop_bits;
            UINT8 parity;
            UINT8 parity_type;
            UINT8 fc_type;
            UINT8 xon_char;
            UINT8 xoff_char;
            UINT16 param_mask;
        } rpn;
        struct
        {
            UINT8 dlci;
            UINT8 line_status;
        } rls;
    } u;
} MX_FRAME;

#define LINE_STATUS_NO_ERROR       0x00
#define LINE_STATUS_OVERRUN        0x02  /* Receive Overrun Error   */
#define LINE_STATUS_RXPARITY       0x04  /* Receive Parity Error    */
#define LINE_STATUS_FRAME          0x08  /* Receive Framing error   */
#define LINE_STATUS_FAILED         0x10  /* Connection Failed       */

/*
** Define states and events for the RFC multiplexer state machine
*/
#define RFC_MX_STATE_IDLE           0
#define RFC_MX_STATE_WAIT_CONN_CNF  1
#define RFC_MX_STATE_CONFIGURE      2
#define RFC_MX_STATE_SABME_WAIT_UA  3
#define RFC_MX_STATE_WAIT_SABME     4
#define RFC_MX_STATE_CONNECTED      5
#define RFC_MX_STATE_DISC_WAIT_UA   6

/*
** Define port states
*/
#define RFC_STATE_CLOSED                0
#define RFC_STATE_SABME_WAIT_UA         1
#define RFC_STATE_ORIG_WAIT_SEC_CHECK   2
#define RFC_STATE_TERM_WAIT_SEC_CHECK   3
#define RFC_STATE_OPENED                4
#define RFC_STATE_DISC_WAIT_UA          5

/*
** Events that can be received by multiplexer as well as port state machines
*/
#define RFC_EVENT_SABME                 0
#define RFC_EVENT_UA                    1
#define RFC_EVENT_DM                    2
#define RFC_EVENT_DISC                  3
#define RFC_EVENT_UIH                   4
#define RFC_EVENT_TIMEOUT               5
#define RFC_EVENT_BAD_FRAME             50
/*
** Multiplexer events
*/
#define RFC_MX_EVENT_START_REQ          6
#define RFC_MX_EVENT_START_RSP          7
#define RFC_MX_EVENT_CLOSE_REQ          8
#define RFC_MX_EVENT_CONN_CNF           9
#define RFC_MX_EVENT_CONN_IND           10
#define RFC_MX_EVENT_CONF_CNF           11
#define RFC_MX_EVENT_CONF_IND           12
#define RFC_MX_EVENT_QOS_VIOLATION_IND  13
#define RFC_MX_EVENT_DISC_IND           14
#define RFC_MX_EVENT_TEST_CMD           15
#define RFC_MX_EVENT_TEST_RSP           16
#define RFC_MX_EVENT_FCON_CMD           17
#define RFC_MX_EVENT_FCOFF_CMD          18
#define RFC_MX_EVENT_NSC                19
#define RFC_MX_EVENT_NSC_RSP            20

/*
** Port events
*/
#define RFC_EVENT_OPEN                  9
#define RFC_EVENT_ESTABLISH_RSP         11
#define RFC_EVENT_CLOSE                 12
#define RFC_EVENT_CLEAR                 13
#define RFC_EVENT_DATA                  14
#define RFC_EVENT_SEC_COMPLETE          15

// btla-specific ++
#define RFC_T1_TIMEOUT                  20   /* seconds to wait for reply with Poll bit */
#define RFC_PORT_T1_TIMEOUT             60   /* seconds to wait for reply with Poll bit other than MX */
#define RFC_T2_TIMEOUT                  20   /* timeout to wait for Mx UIH */
// btla-specific --
#define RFC_DISC_TIMEOUT                3    /* If something goes wrong and we send DISC we should not wait for min */
#define RFC_CLOSE_TIMEOUT               10
#define RFCOMM_CONN_TIMEOUT            120   /* first connection to be established on Mx */


/* Define RFComm control block
*/
typedef struct
{
    MX_FRAME  rx_frame;
    tL2CAP_APPL_INFO  reg_info;              /* L2CAP Registration info */
    tRFC_MCB *p_rfc_lcid_mcb[MAX_L2CAP_CHANNELS];     /* MCB based on the L2CAP's lcid */
    BOOLEAN   peer_rx_disabled;              /* If TRUE peer sent FCOFF */
    UINT8     last_mux;                      /* Last mux allocated */
    UINT8     last_port;                     /* Last port allocated */
} tRFCOMM_CB;

/* Main Control Block for the RFCOMM Layer (PORT and RFC) */
typedef struct
{
    tRFCOMM_CB  rfc;
    tPORT_CB    port;
    UINT8       trace_level;
} tRFC_CB;


#if RFC_DYNAMIC_MEMORY == FALSE
RFC_API extern tRFC_CB  rfc_cb;
#else
RFC_API extern tRFC_CB *rfc_cb_ptr;
#define rfc_cb (*rfc_cb_ptr)
#endif

/* Timer running on the multiplexor channel while no DLCI connection is opened */
#define RFC_MCB_INIT_INACT_TIMER    60  /* in seconds */

/* Timer running on the multiplexor channel after last DLCI is released */
#define RFC_MCB_RELEASE_INACT_TIMER 2   /* in seconds */

/*
** Define RFCOMM frame processing errors
*/
#define RFCOMM_ERR_BAD_SABME        1
#define RFCOMM_ERR_BAD_UA           2
#define RFCOMM_ERR_BAD_DM           3
#define RFCOMM_ERR_BAD_DISC         4
#define RFCOMM_ERR_BAD_UIH          5

#ifdef RFCOMM_PRECALC_FCS

#define RFCOMM_SABME_FCS(p_data, cr, dlci) rfc_sabme_fcs[cr][dlci]
#define RFCOMM_UA_FCS(p_data, cr, dlci)    rfc_ua_fcs[cr][dlci]
#define RFCOMM_DM_FCS(p_data, cr, dlci)    rfc_dm_fcs[cr][dlci]
#define RFCOMM_DISC_FCS(p_data, cr, dlci)  rfc_disc_fcs[cr][dlci]
#define RFCOMM_UIH_FCS(p_data, dlci)       rfc_uih_fcs[dlci]

#else

extern  UINT8 rfc_calc_fcs (UINT16 len, UINT8 *p);

#define RFCOMM_SABME_FCS(p_data, cr, dlci) rfc_calc_fcs(3, p_data)
#define RFCOMM_UA_FCS(p_data, cr, dlci)    rfc_calc_fcs(3, p_data)
#define RFCOMM_DM_FCS(p_data, cr, dlci)    rfc_calc_fcs(3, p_data)
#define RFCOMM_DISC_FCS(p_data, cr, dlci)  rfc_calc_fcs(3, p_data)
#define RFCOMM_UIH_FCS(p_data, dlci)       rfc_calc_fcs(2, p_data)

#endif


#ifdef __cplusplus
extern "C" {
#endif

extern void rfc_mx_sm_execute (tRFC_MCB *p_mcb, UINT16 event, void *p_data);

/*
** Functions provided by the rfc_port_fsm.c
*/
extern void rfc_port_sm_execute (tPORT *p_port, UINT16 event, void *p_data);


extern void rfc_process_pn (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, MX_FRAME *p_frame);
extern void rfc_process_msc (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, MX_FRAME *p_frame);
extern void rfc_process_rpn (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, BOOLEAN is_request, MX_FRAME *p_frame);
extern void rfc_process_rls (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, MX_FRAME *p_frame);
extern void rfc_process_nsc (tRFC_MCB *p_rfc_mcb, MX_FRAME *p_frame);
extern void rfc_process_test_rsp (tRFC_MCB *p_rfc_mcb, BT_HDR *p_buf);
extern void rfc_process_fcon (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command);
extern void rfc_process_fcoff (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command);
extern void rfc_process_l2cap_congestion (tRFC_MCB *p_mcb, BOOLEAN is_congested);

/*
** Functions provided by the rfc_utils.c
*/
tRFC_MCB  *rfc_alloc_multiplexer_channel (BD_ADDR bd_addr, BOOLEAN is_initiator);
extern void      rfc_release_multiplexer_channel (tRFC_MCB *p_rfc_mcb);
extern void      rfc_timer_start (tRFC_MCB *p_rfc_mcb, UINT16 timeout);
extern void      rfc_timer_stop (tRFC_MCB *p_rfc_mcb);
extern void      rfc_port_timer_start (tPORT *p_port, UINT16 tout);
extern void      rfc_port_timer_stop (tPORT *p_port);

BOOLEAN   rfc_check_uih_fcs (UINT8 dlci, UINT8 received_fcs);
BOOLEAN   rfc_check_fcs (UINT16 len, UINT8 *p, UINT8 received_fcs);
tRFC_MCB  *rfc_find_lcid_mcb (UINT16 lcid);
extern void      rfc_save_lcid_mcb (tRFC_MCB *p_rfc_mcb, UINT16 lcid);
extern void      rfc_check_mcb_active (tRFC_MCB *p_mcb);
extern void      rfc_port_closed (tPORT *p_port);
extern void      rfc_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 res);
extern void      rfc_inc_credit (tPORT *p_port, UINT8 credit);
extern void      rfc_dec_credit (tPORT *p_port);
extern void      rfc_check_send_cmd(tRFC_MCB *p_mcb, BT_HDR *p_buf);

/*
** Functions provided by the rfc_ts_frames.c
*/
extern void     rfc_send_sabme (tRFC_MCB *p_rfc_mcb, UINT8 dlci);
extern void     rfc_send_ua (tRFC_MCB *p_rfc_mcb, UINT8 dlci);
extern void     rfc_send_dm (tRFC_MCB *p_rfc_mcb, UINT8 dlci, BOOLEAN pf);
extern void     rfc_send_disc (tRFC_MCB *p_rfc_mcb, UINT8 dlci);
extern void     rfc_send_pn (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, UINT16 mtu,
                             UINT8 cl, UINT8 k);
extern void     rfc_send_test (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, BT_HDR *p_buf);
extern void     rfc_send_msc (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command,
                              tPORT_CTRL *p_pars);
extern void     rfc_send_rls (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, UINT8 status);
extern void     rfc_send_rpn (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command,
                              tPORT_STATE *p_pars, UINT16 mask);
extern void     rfc_send_fcon (tRFC_MCB *p_mcb, BOOLEAN is_command);
extern void     rfc_send_fcoff (tRFC_MCB *p_mcb, BOOLEAN is_command);
extern void     rfc_send_buf_uih (tRFC_MCB *p_rfc_mcb, UINT8 dlci, BT_HDR *p_buf);
extern void     rfc_send_credit(tRFC_MCB *p_mcb, UINT8 dlci, UINT8 credit);
extern void     rfc_process_mx_message (tRFC_MCB *p_rfc_mcb, BT_HDR *p_buf);
extern UINT8    rfc_parse_data (tRFC_MCB *p_rfc_mcb, MX_FRAME *p_frame, BT_HDR *p_buf);

/*
** Functions provided by the rfc_disp.c
*/



/* Call back functions from RFCOMM */
extern void rfcomm_l2cap_if_init (void);

extern void PORT_StartInd (tRFC_MCB *p_mcb);
extern void PORT_StartCnf (tRFC_MCB *p_mcb, UINT16 result);

extern void PORT_CloseInd (tRFC_MCB *p_mcb);
extern void Port_TimeOutCloseMux (tRFC_MCB *p_mcb);

extern void PORT_DlcEstablishInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu);
extern void PORT_DlcEstablishCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 result);

extern void PORT_DataInd (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf);

extern void PORT_DlcReleaseInd (tRFC_MCB *p_mcb, UINT8 dlci);

extern void PORT_ParNegInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k);
extern void PORT_ParNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k);

extern void PORT_TestCnf (tRFC_MCB *p_mcb, UINT8 *p_data, UINT16 len);

extern void PORT_FlowInd (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN fc);

extern void PORT_PortNegInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 param_mask);
extern void PORT_PortNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 result);

extern void PORT_ControlInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars);
extern void PORT_ControlCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars);

extern void PORT_LineStatusInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 line_status);

#ifdef __cplusplus
}
#endif

#endif

