Home | History | Annotate | Download | only in rfcomm
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 1999-2012 Broadcom Corporation
      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 /*****************************************************************************
     20  *
     21  *  This file contains definitions internal to the PORT unit
     22  *
     23  *****************************************************************************/
     24 
     25 #ifndef PORT_INT_H
     26 #define PORT_INT_H
     27 
     28 #include "bt_target.h"
     29 #include "osi/include/alarm.h"
     30 #include "osi/include/fixed_queue.h"
     31 #include "bt_common.h"
     32 #include "rfcdefs.h"
     33 #include "port_api.h"
     34 
     35 /* Local events passed when application event is sent from the api to PORT */
     36 /* ???*/
     37 #define PORT_EVENT_OPEN         (1  | BT_EVT_TO_BTU_SP_EVT)
     38 #define PORT_EVENT_CONTROL      (2  | BT_EVT_TO_BTU_SP_EVT)
     39 #define PORT_EVENT_SET_STATE    (3  | BT_EVT_TO_BTU_SP_EVT)
     40 #define PORT_EVENT_SET_CALLBACK (5  | BT_EVT_TO_BTU_SP_EVT)
     41 #define PORT_EVENT_WRITE        (6  | BT_EVT_TO_BTU_SP_EVT)
     42 #define PORT_EVENT_PURGE        (7  | BT_EVT_TO_BTU_SP_EVT)
     43 #define PORT_EVENT_SEND_ERROR   (8  | BT_EVT_TO_BTU_SP_EVT)
     44 #define PORT_EVENT_FLOW_CONTROL (9  | BT_EVT_TO_BTU_SP_EVT)
     45 
     46 /*
     47 ** Flow control configuration values for the mux
     48 */
     49 #define PORT_FC_UNDEFINED       0   /* mux flow control mechanism not defined yet */
     50 #define PORT_FC_TS710           1   /* use TS 07.10 flow control  */
     51 #define PORT_FC_CREDIT          2   /* use RFCOMM credit based flow control */
     52 
     53 /*
     54 ** Define Port Data Transfere control block
     55 */
     56 typedef struct
     57 {
     58     fixed_queue_t *queue;   /* Queue of buffers waiting to be sent */
     59     BOOLEAN  peer_fc;       /* TRUE if flow control is set based on peer's request */
     60     BOOLEAN  user_fc;       /* TRUE if flow control is set based on user's request  */
     61     UINT32   queue_size;    /* Number of data bytes in the queue */
     62     tPORT_CALLBACK *p_callback;  /* Address of the callback function */
     63 } tPORT_DATA;
     64 
     65 /*
     66 ** Port control structure used to pass modem info
     67 */
     68 typedef struct
     69 {
     70 #define MODEM_SIGNAL_DTRDSR        0x01
     71 #define MODEM_SIGNAL_RTSCTS        0x02
     72 #define MODEM_SIGNAL_RI            0x04
     73 #define MODEM_SIGNAL_DCD           0x08
     74 
     75     UINT8   modem_signal;       /* [DTR/DSR | RTS/CTS | RI | DCD ] */
     76 
     77     UINT8   break_signal;       /* 0-3 s in steps of 200 ms */
     78 
     79     UINT8   discard_buffers;    /* 0 - do not discard, 1 - discard */
     80 
     81 #define RFCOMM_CTRL_BREAK_ASAP      0
     82 #define RFCOMM_CTRL_BREAK_IN_SEQ    1
     83 
     84     UINT8   break_signal_seq;   /* as soon as possible | in sequence (default) */
     85 
     86     BOOLEAN fc;                 /* TRUE when the device is unable to accept frames */
     87 } tPORT_CTRL;
     88 
     89 
     90 /*
     91 ** RFCOMM multiplexer Control Block
     92 */
     93 typedef struct
     94 {
     95     alarm_t *mcb_timer;       /* MCB timer */
     96     fixed_queue_t *cmd_q;     /* Queue for command messages on this mux */
     97     UINT8     port_inx[RFCOMM_MAX_DLCI + 1];  /* Array for quick access to  */
     98                                               /* tPORT based on dlci        */
     99     BD_ADDR   bd_addr;        /* BD ADDR of the peer if initiator */
    100     UINT16    lcid;           /* Local cid used for this channel */
    101     UINT16    peer_l2cap_mtu; /* Max frame that can be sent to peer L2CAP */
    102     UINT8     state;          /* Current multiplexer channel state */
    103     UINT8     is_initiator;   /* TRUE if this side sends SABME (dlci=0) */
    104     BOOLEAN   local_cfg_sent;
    105     BOOLEAN   peer_cfg_rcvd;
    106     BOOLEAN   restart_required; /* TRUE if has to restart channel after disc */
    107     BOOLEAN   peer_ready;      /* True if other side can accept frames */
    108     UINT8     flow;            /* flow control mechanism for this mux */
    109     BOOLEAN   l2cap_congested; /* TRUE if L2CAP is congested */
    110     BOOLEAN   is_disc_initiator; /* TRUE if initiated disc of port */
    111     UINT16    pending_lcid;    /* store LCID for incoming connection while connecting */
    112     UINT8     pending_id;      /* store l2cap ID for incoming connection while connecting */
    113 } tRFC_MCB;
    114 
    115 
    116 /*
    117 ** RFCOMM Port Connection Control Block
    118 */
    119 typedef struct {
    120 #define RFC_PORT_STATE_IDLE          0
    121 #define RFC_PORT_STATE_WAIT_START    1
    122 #define RFC_PORT_STATE_OPENING       2
    123 #define RFC_PORT_STATE_OPENED        3
    124 #define RFC_PORT_STATE_CLOSING       4
    125 
    126     UINT8     state;          /* Current state of the connection */
    127 
    128 #define RFC_RSP_PN                  0x01
    129 #define RFC_RSP_RPN_REPLY           0x02
    130 #define RFC_RSP_RPN                 0x04
    131 #define RFC_RSP_MSC                 0x08
    132 #define RFC_RSP_RLS                 0x10
    133 
    134     UINT8    expected_rsp;
    135 
    136     tRFC_MCB *p_mcb;
    137 
    138     alarm_t  *port_timer;
    139 } tRFC_PORT;
    140 
    141 
    142 /*
    143 ** Define control block containing information about PORT connection
    144 */
    145 typedef struct
    146 {
    147     UINT8   inx;            /* Index of this control block in the port_info array */
    148     BOOLEAN in_use;         /* True when structure is allocated */
    149 
    150 #define PORT_STATE_CLOSED   0
    151 #define PORT_STATE_OPENING  1
    152 #define PORT_STATE_OPENED   2
    153 #define PORT_STATE_CLOSING  3
    154 
    155     UINT8   state;          /* State of the application */
    156 
    157     UINT8   scn;            /* Service channel number */
    158     UINT16  uuid;           /* Service UUID */
    159 
    160     BD_ADDR bd_addr;        /* BD ADDR of the device for the multiplexer channel */
    161     BOOLEAN is_server;      /* TRUE if the server application */
    162     UINT8   dlci;           /* DLCI of the connection */
    163 
    164     UINT8   error;          /* Last error detected */
    165 
    166     UINT8   line_status;    /* Line status as reported by peer */
    167 
    168     UINT8   default_signal_state; /* Initial signal state depending on uuid */
    169 
    170     UINT16  mtu;            /* Max MTU that port can receive */
    171     UINT16  peer_mtu;       /* Max MTU that port can send */
    172 
    173     tPORT_DATA tx;          /* Control block for data from app to peer */
    174     tPORT_DATA rx;          /* Control block for data from peer to app */
    175 
    176     tPORT_STATE user_port_pars;  /* Port parameters for user connection */
    177     tPORT_STATE peer_port_pars;  /* Port parameters for user connection */
    178 
    179     tPORT_CTRL  local_ctrl;
    180     tPORT_CTRL  peer_ctrl;
    181 
    182 #define PORT_CTRL_REQ_SENT          0x01
    183 #define PORT_CTRL_REQ_CONFIRMED     0x02
    184 #define PORT_CTRL_IND_RECEIVED      0x04
    185 #define PORT_CTRL_IND_RESPONDED     0x08
    186 
    187     UINT8       port_ctrl;                  /* Modem Status Command  */
    188 
    189     BOOLEAN     rx_flag_ev_pending;         /* RXFLAG Character is received */
    190 
    191     tRFC_PORT   rfc;                        /* RFCOMM port control block */
    192 
    193     UINT32      ev_mask;                    /* Event mask for the callback */
    194     tPORT_CALLBACK      *p_callback;        /* Pointer to users callback function */
    195     tPORT_CALLBACK      *p_mgmt_callback;   /* Callback function to receive connection up/down */
    196     tPORT_DATA_CALLBACK *p_data_callback;   /* Callback function to receive data indications */
    197     tPORT_DATA_CO_CALLBACK *p_data_co_callback;   /* Callback function with callouts and flowctrl */
    198     UINT16      credit_tx;                  /* Flow control credits for tx path */
    199     UINT16      credit_rx;                  /* Flow control credits for rx path, this is */
    200                                             /* number of buffers peer is allowed to sent */
    201     UINT16      credit_rx_max;              /* Max number of credits we will allow this guy to sent */
    202     UINT16      credit_rx_low;              /* Number of credits when we send credit update */
    203     UINT16      rx_buf_critical;            /* port receive queue critical watermark level */
    204     BOOLEAN     keep_port_handle;           /* TRUE if port is not deallocated when closing */
    205                                             /* it is set to TRUE for server when allocating port */
    206     UINT16      keep_mtu;                   /* Max MTU that port can receive by server */
    207 } tPORT;
    208 
    209 
    210 /* Define the PORT/RFCOMM control structure
    211 */
    212 typedef struct
    213 {
    214     tPORT        port[MAX_RFC_PORTS];            /* Port info pool */
    215     tRFC_MCB     rfc_mcb[MAX_BD_CONNECTIONS];    /* RFCOMM bd_connections pool */
    216 } tPORT_CB;
    217 
    218 #ifdef __cplusplus
    219 extern "C" {
    220 #endif
    221 
    222 /*
    223 ** Functions provided by the port_utils.c
    224 */
    225 extern tPORT    *port_allocate_port (UINT8 dlci, BD_ADDR bd_addr);
    226 extern void     port_set_defaults (tPORT *p_port);
    227 extern void     port_select_mtu (tPORT *p_port);
    228 extern void     port_release_port (tPORT *p_port);
    229 extern tPORT    *port_find_mcb_dlci_port (tRFC_MCB *p_mcb, UINT8 dlci);
    230 extern tRFC_MCB *port_find_mcb (BD_ADDR bd_addr);
    231 extern tPORT    *port_find_dlci_port (UINT8 dlci);
    232 extern tPORT    *port_find_port (UINT8 dlci, BD_ADDR bd_addr);
    233 extern UINT32   port_get_signal_changes (tPORT *p_port, UINT8 old_signals, UINT8 signal);
    234 extern UINT32   port_flow_control_user (tPORT *p_port);
    235 extern void     port_flow_control_peer(tPORT *p_port, BOOLEAN enable, UINT16 count);
    236 
    237 /*
    238 ** Functions provided by the port_rfc.c
    239 */
    240 extern int  port_open_continue (tPORT *p_port);
    241 extern void port_start_port_open (tPORT *p_port);
    242 extern void port_start_par_neg (tPORT *p_port);
    243 extern void port_start_control (tPORT *p_port);
    244 extern void port_start_close (tPORT *p_port);
    245 extern void port_rfc_closed (tPORT *p_port, UINT8 res);
    246 
    247 #ifdef __cplusplus
    248 }
    249 #endif
    250 
    251 #endif
    252