15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains definitions internal to the RFC unit 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef RFC_INT_H 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_INT_H 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_int.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Define RFCOMM result codes 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_SUCCESS 0 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_ERROR 1 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_LOW_RESOURCES 2 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_TRY_LATER 3 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_USER_ERR 111 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_SECURITY_ERR 112 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Define max and min RFCOMM MTU (N1) 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_MIN_MTU 23 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_MAX_MTU 32767 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_StartReq (tRFC_MCB *p_mcb); 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_StartRsp (tRFC_MCB *p_mcb, UINT16 result); 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_DlcEstablishReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu); 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_DlcEstablishRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 result); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_DataReq (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf); 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_DlcReleaseReq (tRFC_MCB *p_mcb, UINT8 dlci); 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_ParNegReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu); 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_ParNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_TestReq (UINT8 *p_data, UINT16 len); 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_FLOW_STATE_DISABLE 0 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_FLOW_STATE_ENABLE 1 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_FlowReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 state); 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_PortNegReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars); 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_PortNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 param_mask); 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_ControlReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars); 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_ControlRsp (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars); 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void RFCOMM_LineStatusReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 line_status); 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Define logical struct used for sending and decoding MX frames 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dlci; 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 type; 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cr; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ea; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 pf; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 credit; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project union 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dlci; 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 frame_type; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 conv_layer; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 priority; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 t1; 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 n2; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 k; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } pn; 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_data; 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 data_len; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } test; 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dlci; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 signals; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 break_present; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 break_duration; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } msc; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ea; 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cr; 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 type; 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } nsc; 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dlci; 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 is_request; 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 baud_rate; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 byte_size; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 stop_bits; 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 parity; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 parity_type; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 fc_type; 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xon_char; 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xoff_char; 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 param_mask; 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } rpn; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dlci; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 line_status; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } rls; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } u; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} MX_FRAME; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LINE_STATUS_NO_ERROR 0x00 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LINE_STATUS_OVERRUN 0x02 /* Receive Overrun Error */ 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LINE_STATUS_RXPARITY 0x04 /* Receive Parity Error */ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LINE_STATUS_FRAME 0x08 /* Receive Framing error */ 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LINE_STATUS_FAILED 0x10 /* Connection Failed */ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Define states and events for the RFC multiplexer state machine 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_STATE_IDLE 0 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_STATE_WAIT_CONN_CNF 1 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_STATE_CONFIGURE 2 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_STATE_SABME_WAIT_UA 3 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_STATE_WAIT_SABME 4 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_STATE_CONNECTED 5 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_STATE_DISC_WAIT_UA 6 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Define port states 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_STATE_CLOSED 0 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_STATE_SABME_WAIT_UA 1 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_STATE_ORIG_WAIT_SEC_CHECK 2 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_STATE_TERM_WAIT_SEC_CHECK 3 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_STATE_OPENED 4 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_STATE_DISC_WAIT_UA 5 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Events that can be received by multiplexer as well as port state machines 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_SABME 0 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_UA 1 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_DM 2 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_DISC 3 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_UIH 4 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_TIMEOUT 5 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_BAD_FRAME 50 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Multiplexer events 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_START_REQ 6 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_START_RSP 7 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_CLOSE_REQ 8 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_CONN_CNF 9 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_CONN_IND 10 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_CONF_CNF 11 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_CONF_IND 12 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_QOS_VIOLATION_IND 13 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_DISC_IND 14 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_TEST_CMD 15 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_TEST_RSP 16 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_FCON_CMD 17 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_FCOFF_CMD 18 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_NSC 19 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MX_EVENT_NSC_RSP 20 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Port events 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_OPEN 9 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_ESTABLISH_RSP 11 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_CLOSE 12 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_CLEAR 13 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_DATA 14 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_EVENT_SEC_COMPLETE 15 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++ 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_T1_TIMEOUT 20 /* seconds to wait for reply with Poll bit */ 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_PORT_T1_TIMEOUT 60 /* seconds to wait for reply with Poll bit other than MX */ 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_T2_TIMEOUT 20 /* timeout to wait for Mx UIH */ 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific -- 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_DISC_TIMEOUT 3 /* If something goes wrong and we send DISC we should not wait for min */ 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_CLOSE_TIMEOUT 10 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_CONN_TIMEOUT 120 /* first connection to be established on Mx */ 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Define RFComm control block 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MX_FRAME rx_frame; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_APPL_INFO reg_info; /* L2CAP Registration info */ 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_rfc_lcid_mcb[MAX_L2CAP_CHANNELS]; /* MCB based on the L2CAP's lcid */ 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN peer_rx_disabled; /* If TRUE peer sent FCOFF */ 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 last_mux; /* Last mux allocated */ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 last_port; /* Last port allocated */ 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tRFCOMM_CB; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Main Control Block for the RFCOMM Layer (PORT and RFC) */ 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFCOMM_CB rfc; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT_CB port; 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 trace_level; 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tRFC_CB; 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if RFC_DYNAMIC_MEMORY == FALSE 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectRFC_API extern tRFC_CB rfc_cb; 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectRFC_API extern tRFC_CB *rfc_cb_ptr; 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define rfc_cb (*rfc_cb_ptr) 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Timer running on the multiplexor channel while no DLCI connection is opened */ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MCB_INIT_INACT_TIMER 60 /* in seconds */ 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Timer running on the multiplexor channel after last DLCI is released */ 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFC_MCB_RELEASE_INACT_TIMER 2 /* in seconds */ 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Define RFCOMM frame processing errors 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_ERR_BAD_SABME 1 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_ERR_BAD_UA 2 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_ERR_BAD_DM 3 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_ERR_BAD_DISC 4 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_ERR_BAD_UIH 5 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef RFCOMM_PRECALC_FCS 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_SABME_FCS(p_data, cr, dlci) rfc_sabme_fcs[cr][dlci] 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_UA_FCS(p_data, cr, dlci) rfc_ua_fcs[cr][dlci] 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_DM_FCS(p_data, cr, dlci) rfc_dm_fcs[cr][dlci] 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_DISC_FCS(p_data, cr, dlci) rfc_disc_fcs[cr][dlci] 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_UIH_FCS(p_data, dlci) rfc_uih_fcs[dlci] 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern UINT8 rfc_calc_fcs (UINT16 len, UINT8 *p); 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_SABME_FCS(p_data, cr, dlci) rfc_calc_fcs(3, p_data) 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_UA_FCS(p_data, cr, dlci) rfc_calc_fcs(3, p_data) 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_DM_FCS(p_data, cr, dlci) rfc_calc_fcs(3, p_data) 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_DISC_FCS(p_data, cr, dlci) rfc_calc_fcs(3, p_data) 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define RFCOMM_UIH_FCS(p_data, dlci) rfc_calc_fcs(2, p_data) 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef __cplusplus 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern "C" { 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_mx_sm_execute (tRFC_MCB *p_mcb, UINT16 event, void *p_data); 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Functions provided by the rfc_port_fsm.c 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_port_sm_execute (tPORT *p_port, UINT16 event, void *p_data); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_process_pn (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, MX_FRAME *p_frame); 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_process_msc (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, MX_FRAME *p_frame); 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_process_rpn (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, BOOLEAN is_request, MX_FRAME *p_frame); 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_process_rls (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, MX_FRAME *p_frame); 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_process_nsc (tRFC_MCB *p_rfc_mcb, MX_FRAME *p_frame); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_process_test_rsp (tRFC_MCB *p_rfc_mcb, BT_HDR *p_buf); 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_process_fcon (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command); 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_process_fcoff (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command); 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_process_l2cap_congestion (tRFC_MCB *p_mcb, BOOLEAN is_congested); 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Functions provided by the rfc_utils.c 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttRFC_MCB *rfc_alloc_multiplexer_channel (BD_ADDR bd_addr, BOOLEAN is_initiator); 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_release_multiplexer_channel (tRFC_MCB *p_rfc_mcb); 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_timer_start (tRFC_MCB *p_rfc_mcb, UINT16 timeout); 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_timer_stop (tRFC_MCB *p_rfc_mcb); 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_port_timer_start (tPORT *p_port, UINT16 tout); 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_port_timer_stop (tPORT *p_port); 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN rfc_check_uih_fcs (UINT8 dlci, UINT8 received_fcs); 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN rfc_check_fcs (UINT16 len, UINT8 *p, UINT8 received_fcs); 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttRFC_MCB *rfc_find_lcid_mcb (UINT16 lcid); 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_save_lcid_mcb (tRFC_MCB *p_rfc_mcb, UINT16 lcid); 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_check_mcb_active (tRFC_MCB *p_mcb); 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_port_closed (tPORT *p_port); 3187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battaextern void rfc_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport,void *p_ref_data, UINT8 res); 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_inc_credit (tPORT *p_port, UINT8 credit); 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_dec_credit (tPORT *p_port); 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_check_send_cmd(tRFC_MCB *p_mcb, BT_HDR *p_buf); 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Functions provided by the rfc_ts_frames.c 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_sabme (tRFC_MCB *p_rfc_mcb, UINT8 dlci); 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_ua (tRFC_MCB *p_rfc_mcb, UINT8 dlci); 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_dm (tRFC_MCB *p_rfc_mcb, UINT8 dlci, BOOLEAN pf); 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_disc (tRFC_MCB *p_rfc_mcb, UINT8 dlci); 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_pn (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, UINT16 mtu, 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cl, UINT8 k); 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_test (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, BT_HDR *p_buf); 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_msc (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT_CTRL *p_pars); 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_rls (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, UINT8 status); 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_rpn (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT_STATE *p_pars, UINT16 mask); 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_fcon (tRFC_MCB *p_mcb, BOOLEAN is_command); 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_fcoff (tRFC_MCB *p_mcb, BOOLEAN is_command); 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_buf_uih (tRFC_MCB *p_rfc_mcb, UINT8 dlci, BT_HDR *p_buf); 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_send_credit(tRFC_MCB *p_mcb, UINT8 dlci, UINT8 credit); 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfc_process_mx_message (tRFC_MCB *p_rfc_mcb, BT_HDR *p_buf); 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern UINT8 rfc_parse_data (tRFC_MCB *p_rfc_mcb, MX_FRAME *p_frame, BT_HDR *p_buf); 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Functions provided by the rfc_disp.c 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Call back functions from RFCOMM */ 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void rfcomm_l2cap_if_init (void); 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_StartInd (tRFC_MCB *p_mcb); 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_StartCnf (tRFC_MCB *p_mcb, UINT16 result); 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_CloseInd (tRFC_MCB *p_mcb); 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void Port_TimeOutCloseMux (tRFC_MCB *p_mcb); 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_DlcEstablishInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu); 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_DlcEstablishCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 result); 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_DataInd (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf); 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_DlcReleaseInd (tRFC_MCB *p_mcb, UINT8 dlci); 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_ParNegInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k); 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_ParNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k); 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_TestCnf (tRFC_MCB *p_mcb, UINT8 *p_data, UINT16 len); 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_FlowInd (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN fc); 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_PortNegInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 param_mask); 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_PortNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 result); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_ControlInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_ControlCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars); 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void PORT_LineStatusInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 line_status); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef __cplusplus 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 388