You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
8.6 KiB
241 lines
8.6 KiB
/****************************************************************************** |
|
* |
|
* 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 PORT unit |
|
* |
|
*****************************************************************************/ |
|
|
|
#ifndef PORT_INT_H |
|
#define PORT_INT_H |
|
|
|
#include "bt_common.h" |
|
#include "bt_target.h" |
|
#include "osi/include/alarm.h" |
|
#include "osi/include/fixed_queue.h" |
|
#include "port_api.h" |
|
#include "rfcdefs.h" |
|
|
|
/* Local events passed when application event is sent from the api to PORT */ |
|
/* ???*/ |
|
#define PORT_EVENT_OPEN (1 | BT_EVT_TO_BTU_SP_EVT) |
|
#define PORT_EVENT_CONTROL (2 | BT_EVT_TO_BTU_SP_EVT) |
|
#define PORT_EVENT_SET_STATE (3 | BT_EVT_TO_BTU_SP_EVT) |
|
#define PORT_EVENT_SET_CALLBACK (5 | BT_EVT_TO_BTU_SP_EVT) |
|
#define PORT_EVENT_WRITE (6 | BT_EVT_TO_BTU_SP_EVT) |
|
#define PORT_EVENT_PURGE (7 | BT_EVT_TO_BTU_SP_EVT) |
|
#define PORT_EVENT_SEND_ERROR (8 | BT_EVT_TO_BTU_SP_EVT) |
|
#define PORT_EVENT_FLOW_CONTROL (9 | BT_EVT_TO_BTU_SP_EVT) |
|
|
|
/* |
|
* Flow control configuration values for the mux |
|
*/ |
|
#define PORT_FC_UNDEFINED 0 /* mux flow control mechanism not defined yet */ |
|
#define PORT_FC_TS710 1 /* use TS 07.10 flow control */ |
|
#define PORT_FC_CREDIT 2 /* use RFCOMM credit based flow control */ |
|
|
|
/* |
|
* Define Port Data Transfere control block |
|
*/ |
|
typedef struct { |
|
fixed_queue_t* queue; /* Queue of buffers waiting to be sent */ |
|
bool peer_fc; /* true if flow control is set based on peer's request */ |
|
bool user_fc; /* true if flow control is set based on user's request */ |
|
uint32_t queue_size; /* Number of data bytes in the queue */ |
|
tPORT_CALLBACK* p_callback; /* Address of the callback function */ |
|
} tPORT_DATA; |
|
|
|
/* |
|
* Port control structure used to pass modem info |
|
*/ |
|
typedef struct { |
|
#define MODEM_SIGNAL_DTRDSR 0x01 |
|
#define MODEM_SIGNAL_RTSCTS 0x02 |
|
#define MODEM_SIGNAL_RI 0x04 |
|
#define MODEM_SIGNAL_DCD 0x08 |
|
|
|
uint8_t modem_signal; /* [DTR/DSR | RTS/CTS | RI | DCD ] */ |
|
|
|
uint8_t break_signal; /* 0-3 s in steps of 200 ms */ |
|
|
|
uint8_t discard_buffers; /* 0 - do not discard, 1 - discard */ |
|
|
|
#define RFCOMM_CTRL_BREAK_ASAP 0 |
|
#define RFCOMM_CTRL_BREAK_IN_SEQ 1 |
|
|
|
uint8_t break_signal_seq; /* as soon as possible | in sequence (default) */ |
|
|
|
bool fc; /* true when the device is unable to accept frames */ |
|
} tPORT_CTRL; |
|
|
|
/* |
|
* RFCOMM multiplexer Control Block |
|
*/ |
|
typedef struct { |
|
alarm_t* mcb_timer; /* MCB timer */ |
|
fixed_queue_t* cmd_q; /* Queue for command messages on this mux */ |
|
uint8_t port_inx[RFCOMM_MAX_DLCI + 1]; /* Array for quick access to */ |
|
/* tPORT based on dlci */ |
|
RawAddress bd_addr; /* BD ADDR of the peer if initiator */ |
|
uint16_t lcid; /* Local cid used for this channel */ |
|
uint16_t peer_l2cap_mtu; /* Max frame that can be sent to peer L2CAP */ |
|
uint8_t state; /* Current multiplexer channel state */ |
|
uint8_t is_initiator; /* true if this side sends SABME (dlci=0) */ |
|
bool local_cfg_sent; |
|
bool peer_cfg_rcvd; |
|
bool restart_required; /* true if has to restart channel after disc */ |
|
bool peer_ready; /* True if other side can accept frames */ |
|
uint8_t flow; /* flow control mechanism for this mux */ |
|
bool l2cap_congested; /* true if L2CAP is congested */ |
|
bool is_disc_initiator; /* true if initiated disc of port */ |
|
uint16_t |
|
pending_lcid; /* store LCID for incoming connection while connecting */ |
|
uint8_t |
|
pending_id; /* store l2cap ID for incoming connection while connecting */ |
|
} tRFC_MCB; |
|
|
|
/* |
|
* RFCOMM Port Connection Control Block |
|
*/ |
|
typedef struct { |
|
#define RFC_PORT_STATE_IDLE 0 |
|
#define RFC_PORT_STATE_WAIT_START 1 |
|
#define RFC_PORT_STATE_OPENING 2 |
|
#define RFC_PORT_STATE_OPENED 3 |
|
#define RFC_PORT_STATE_CLOSING 4 |
|
|
|
uint8_t state; /* Current state of the connection */ |
|
|
|
#define RFC_RSP_PN 0x01 |
|
#define RFC_RSP_RPN_REPLY 0x02 |
|
#define RFC_RSP_RPN 0x04 |
|
#define RFC_RSP_MSC 0x08 |
|
#define RFC_RSP_RLS 0x10 |
|
|
|
uint8_t expected_rsp; |
|
|
|
tRFC_MCB* p_mcb; |
|
|
|
alarm_t* port_timer; |
|
} tRFC_PORT; |
|
|
|
/* |
|
* Define control block containing information about PORT connection |
|
*/ |
|
typedef struct { |
|
uint8_t inx; /* Index of this control block in the port_info array */ |
|
bool in_use; /* True when structure is allocated */ |
|
|
|
#define PORT_STATE_CLOSED 0 |
|
#define PORT_STATE_OPENING 1 |
|
#define PORT_STATE_OPENED 2 |
|
#define PORT_STATE_CLOSING 3 |
|
|
|
uint8_t state; /* State of the application */ |
|
|
|
uint8_t scn; /* Service channel number */ |
|
uint16_t uuid; /* Service UUID */ |
|
|
|
RawAddress bd_addr; /* BD ADDR of the device for the multiplexer channel */ |
|
bool is_server; /* true if the server application */ |
|
uint8_t dlci; /* DLCI of the connection */ |
|
|
|
uint8_t error; /* Last error detected */ |
|
|
|
uint8_t line_status; /* Line status as reported by peer */ |
|
|
|
uint8_t default_signal_state; /* Initial signal state depending on uuid */ |
|
|
|
uint16_t mtu; /* Max MTU that port can receive */ |
|
uint16_t peer_mtu; /* Max MTU that port can send */ |
|
|
|
tPORT_DATA tx; /* Control block for data from app to peer */ |
|
tPORT_DATA rx; /* Control block for data from peer to app */ |
|
|
|
tPORT_STATE user_port_pars; /* Port parameters for user connection */ |
|
tPORT_STATE peer_port_pars; /* Port parameters for user connection */ |
|
|
|
tPORT_CTRL local_ctrl; |
|
tPORT_CTRL peer_ctrl; |
|
|
|
#define PORT_CTRL_REQ_SENT 0x01 |
|
#define PORT_CTRL_REQ_CONFIRMED 0x02 |
|
#define PORT_CTRL_IND_RECEIVED 0x04 |
|
#define PORT_CTRL_IND_RESPONDED 0x08 |
|
|
|
uint8_t port_ctrl; /* Modem Status Command */ |
|
|
|
bool rx_flag_ev_pending; /* RXFLAG Character is received */ |
|
|
|
tRFC_PORT rfc; /* RFCOMM port control block */ |
|
|
|
uint32_t ev_mask; /* Event mask for the callback */ |
|
tPORT_CALLBACK* p_callback; /* Pointer to users callback function */ |
|
tPORT_CALLBACK* |
|
p_mgmt_callback; /* Callback function to receive connection up/down */ |
|
tPORT_DATA_CALLBACK* |
|
p_data_callback; /* Callback function to receive data indications */ |
|
tPORT_DATA_CO_CALLBACK* |
|
p_data_co_callback; /* Callback function with callouts and flowctrl */ |
|
uint16_t credit_tx; /* Flow control credits for tx path */ |
|
uint16_t credit_rx; /* Flow control credits for rx path, this is */ |
|
/* number of buffers peer is allowed to sent */ |
|
uint16_t |
|
credit_rx_max; /* Max number of credits we will allow this guy to sent */ |
|
uint16_t credit_rx_low; /* Number of credits when we send credit update */ |
|
uint16_t rx_buf_critical; /* port receive queue critical watermark level */ |
|
bool keep_port_handle; /* true if port is not deallocated when closing */ |
|
/* it is set to true for server when allocating port */ |
|
uint16_t keep_mtu; /* Max MTU that port can receive by server */ |
|
} tPORT; |
|
|
|
/* Define the PORT/RFCOMM control structure |
|
*/ |
|
typedef struct { |
|
tPORT port[MAX_RFC_PORTS]; /* Port info pool */ |
|
tRFC_MCB rfc_mcb[MAX_BD_CONNECTIONS]; /* RFCOMM bd_connections pool */ |
|
} tPORT_CB; |
|
|
|
/* |
|
* Functions provided by the port_utils.cc |
|
*/ |
|
extern tPORT* port_allocate_port(uint8_t dlci, const RawAddress& bd_addr); |
|
extern void port_set_defaults(tPORT* p_port); |
|
extern void port_select_mtu(tPORT* p_port); |
|
extern void port_release_port(tPORT* p_port); |
|
extern tPORT* port_find_mcb_dlci_port(tRFC_MCB* p_mcb, uint8_t dlci); |
|
extern tRFC_MCB* port_find_mcb(const RawAddress& bd_addr); |
|
extern tPORT* port_find_dlci_port(uint8_t dlci); |
|
extern tPORT* port_find_port(uint8_t dlci, const RawAddress& bd_addr); |
|
extern uint32_t port_get_signal_changes(tPORT* p_port, uint8_t old_signals, |
|
uint8_t signal); |
|
extern uint32_t port_flow_control_user(tPORT* p_port); |
|
extern void port_flow_control_peer(tPORT* p_port, bool enable, uint16_t count); |
|
|
|
/* |
|
* Functions provided by the port_rfc.cc |
|
*/ |
|
extern int port_open_continue(tPORT* p_port); |
|
extern void port_start_port_open(tPORT* p_port); |
|
extern void port_start_par_neg(tPORT* p_port); |
|
extern void port_start_control(tPORT* p_port); |
|
extern void port_start_close(tPORT* p_port); |
|
extern void port_rfc_closed(tPORT* p_port, uint8_t res); |
|
|
|
#endif
|
|
|