15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2001-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 BNEP utility functions 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bnep_int.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 325cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* L O C A L F U N C T I O N P R O T O T Y P E S */ 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 *bnepu_init_hdr (BT_HDR *p_buf, UINT16 hdr_len, UINT8 pkt_type); 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_process_peer_multicast_filter_set (tBNEP_CONN *p_bcb, UINT8 *p_filters, UINT16 len); 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_send_peer_multicast_filter_rsp (tBNEP_CONN *p_bcb, UINT16 response_code); 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_find_bcb_by_cid 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function searches the bcb table for an entry with the 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passed CID. 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the BCB address, or NULL if not found. 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_CONN *bnepu_find_bcb_by_cid (UINT16 cid) 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Look through each connection control block */ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0, p_bcb = bnep_cb.bcb; xx < BNEP_MAX_CONNECTIONS; xx++, p_bcb++) 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_state != BNEP_STATE_IDLE) && (p_bcb->l2cap_cid == cid)) 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_bcb); 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, not found */ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_find_bcb_by_bd_addr 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function searches the BCB table for an entry with the 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passed Bluetooth Address. 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the BCB address, or NULL if not found. 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_CONN *bnepu_find_bcb_by_bd_addr (UINT8 *p_bda) 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Look through each connection control block */ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0, p_bcb = bnep_cb.bcb; xx < BNEP_MAX_CONNECTIONS; xx++, p_bcb++) 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state != BNEP_STATE_IDLE) 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp ((UINT8 *)(p_bcb->rem_bda), p_bda, BD_ADDR_LEN)) 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_bcb); 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, not found */ 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_allocate_bcb 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function allocates a new BCB. 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BCB address, or NULL if none available. 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_CONN *bnepu_allocate_bcb (BD_ADDR p_rem_bda) 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Look through each connection control block for a free one */ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0, p_bcb = bnep_cb.bcb; xx < BNEP_MAX_CONNECTIONS; xx++, p_bcb++) 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state == BNEP_STATE_IDLE) 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset ((UINT8 *)p_bcb, 0, sizeof (tBNEP_CONN)); 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->conn_tle.param = (UINT32) p_bcb; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)(p_bcb->rem_bda), (UINT8 *)p_rem_bda, BD_ADDR_LEN); 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->handle = xx + 1; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_bcb); 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, no free BCB found */ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_release_bcb 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function releases a BCB. 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_release_bcb (tBNEP_CONN *p_bcb) 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ensure timer is stopped */ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&p_bcb->conn_tle); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Drop any response pointer we may be holding */ 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_IDLE; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->p_pending_data = NULL; 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Free transmit queue */ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_bcb->xmit_q.count) 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (GKI_dequeue (&p_bcb->xmit_q)); 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_send_conn_req 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a BNEP connection request to peer 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_send_conn_req (tBNEP_CONN *p_bcb) 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p, *p_start; 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 176d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP sending setup req with dst uuid %x", p_bcb->dst_uuid.uu.uuid16); 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL) 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 179d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - not able to send connection request"); 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_start = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in BNEP frame type - filter control */ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in filter message type - set filters */ 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_SETUP_CONNECTION_REQUEST_MSG); 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, p_bcb->dst_uuid.len); 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->dst_uuid.len == 2) 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p, p_bcb->dst_uuid.uu.uuid16); 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p, p_bcb->src_uuid.uu.uuid16); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_ALL_UUID_LENGTHS) && BNEP_SUPPORTS_ALL_UUID_LENGTHS == TRUE) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_bcb->dst_uuid.len == 4) 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM (p, p_bcb->dst_uuid.uu.uuid32); 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM (p, p_bcb->src_uuid.uu.uuid32); 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_bcb->dst_uuid.uu.uuid128, p_bcb->dst_uuid.len); 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += p_bcb->dst_uuid.len; 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_bcb->src_uuid.uu.uuid128, p_bcb->dst_uuid.len); 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += p_bcb->dst_uuid.len; 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = (UINT16)(p - p_start); 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_check_send_packet (p_bcb, p_buf); 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_send_conn_responce 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a BNEP setup response to peer 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_send_conn_responce (tBNEP_CONN *p_bcb, UINT16 resp_code) 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 234d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - bnep_send_conn_responce for CID: 0x%x", p_bcb->l2cap_cid); 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL) 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 237d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - not able to send connection response"); 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in BNEP frame type - filter control */ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL); 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in filter message type - set filters */ 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_SETUP_CONNECTION_RESPONSE_MSG); 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p, resp_code); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 4; 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_check_send_packet (p_bcb, p_buf); 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_send_peer_our_filters 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends our filters to a peer 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_send_peer_our_filters (tBNEP_CONN *p_bcb) 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_PROT_FILTERS) && BNEP_SUPPORTS_PROT_FILTERS == TRUE) 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP sending peer our filters"); 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL) 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 279d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - no buffer send filters"); 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in BNEP frame type - filter control */ 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL); 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in filter message type - set filters */ 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FILTER_NET_TYPE_SET_MSG); 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p, (4 * p_bcb->sent_num_filters)); 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < p_bcb->sent_num_filters; xx++) 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p, p_bcb->sent_prot_filter_start[xx]); 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p, p_bcb->sent_prot_filter_end[xx]); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 4 + (4 * p_bcb->sent_num_filters); 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_check_send_packet (p_bcb, p_buf); 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags |= BNEP_FLAGS_FILTER_RESP_PEND; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer waiting for setup response */ 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_FILTER_SET_TIMEOUT); 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_send_peer_our_multi_filters 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends our multicast filters to a peer 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_send_peer_our_multi_filters (tBNEP_CONN *p_bcb) 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_MULTI_FILTERS) && BNEP_SUPPORTS_MULTI_FILTERS == TRUE) 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 327d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP sending peer our multicast filters"); 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL) 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 331d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - no buffer to send multicast filters"); 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in BNEP frame type - filter control */ 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL); 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in filter message type - set filters */ 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FILTER_MULTI_ADDR_SET_MSG); 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p, (2 * BD_ADDR_LEN * p_bcb->sent_mcast_filters)); 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < p_bcb->sent_mcast_filters; xx++) 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_bcb->sent_mcast_filter_start[xx], BD_ADDR_LEN); 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_bcb->sent_mcast_filter_end[xx], BD_ADDR_LEN); 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 4 + (2 * BD_ADDR_LEN * p_bcb->sent_mcast_filters); 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_check_send_packet (p_bcb, p_buf); 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags |= BNEP_FLAGS_MULTI_RESP_PEND; 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer waiting for setup response */ 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_FILTER_SET_TIMEOUT); 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_send_peer_filter_rsp 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a filter response to a peer 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_send_peer_filter_rsp (tBNEP_CONN *p_bcb, UINT16 response_code) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 379d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP sending filter response"); 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL) 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 382d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - no buffer filter rsp"); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in BNEP frame type - filter control */ 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL); 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in filter message type - set filters */ 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FILTER_NET_TYPE_RESPONSE_MSG); 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p, response_code); 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 4; 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_check_send_packet (p_bcb, p_buf); 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_send_command_not_understood 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a BNEP command not understood message 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_send_command_not_understood (tBNEP_CONN *p_bcb, UINT8 cmd_code) 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 417d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - bnep_send_command_not_understood for CID: 0x%x, cmd 0x%x", p_bcb->l2cap_cid, cmd_code); 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL) 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 420d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - not able to send connection response"); 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in BNEP frame type - filter control */ 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in filter message type - set filters */ 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD); 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, cmd_code); 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 3; 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_check_send_packet (p_bcb, p_buf); 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_check_send_packet 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function tries to send a packet to L2CAP. 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If L2CAP is flow controlled, it enqueues the 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** packet to the transmit queue 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_check_send_packet (tBNEP_CONN *p_bcb, BT_HDR *p_buf) 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 455d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - bnepu_check_send_packet for CID: 0x%x", p_bcb->l2cap_cid); 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_L2CAP_CONGESTED) 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->xmit_q.count >= BNEP_MAX_XMITQ_DEPTH) 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 460d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - congested, dropping buf, CID: 0x%x", p_bcb->l2cap_cid); 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue (&p_bcb->xmit_q, p_buf); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DataWrite (p_bcb->l2cap_cid, p_buf); 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_build_bnep_hdr 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function builds the BNEP header for a packet 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Extension headers are not sent yet, so there is no 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** check for that. 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_build_bnep_hdr (tBNEP_CONN *p_bcb, BT_HDR *p_buf, UINT16 protocol, 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_src_addr, UINT8 *p_dest_addr, BOOLEAN fw_ext_present) 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ext_bit, *p = (UINT8 *)NULL; 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 type = BNEP_FRAME_COMPRESSED_ETHERNET; 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_bit = fw_ext_present ? 0x80 : 0x00; 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_src_addr) && (memcmp (p_src_addr, bnep_cb.my_bda, BD_ADDR_LEN))) 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = BNEP_FRAME_COMPRESSED_ETHERNET_SRC_ONLY; 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp (p_dest_addr, p_bcb->rem_bda, BD_ADDR_LEN)) 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = (type == BNEP_FRAME_COMPRESSED_ETHERNET) ? BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY : BNEP_FRAME_GENERAL_ETHERNET; 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_src_addr) 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_src_addr = (UINT8 *)bnep_cb.my_bda; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (type) 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FRAME_GENERAL_ETHERNET: 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = bnepu_init_hdr (p_buf, 15, (UINT8)(ext_bit | BNEP_FRAME_GENERAL_ETHERNET)); 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_dest_addr, BD_ADDR_LEN); 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_src_addr, BD_ADDR_LEN); 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FRAME_COMPRESSED_ETHERNET: 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = bnepu_init_hdr (p_buf, 3, (UINT8)(ext_bit | BNEP_FRAME_COMPRESSED_ETHERNET)); 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FRAME_COMPRESSED_ETHERNET_SRC_ONLY: 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = bnepu_init_hdr (p_buf, 9, (UINT8)(ext_bit | BNEP_FRAME_COMPRESSED_ETHERNET_SRC_ONLY)); 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_src_addr, BD_ADDR_LEN); 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY: 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = bnepu_init_hdr (p_buf, 9, (UINT8)(ext_bit | BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY)); 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_dest_addr, BD_ADDR_LEN); 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p, protocol); 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_init_hdr 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initializes the BNEP header 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to header in buffer 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 *bnepu_init_hdr (BT_HDR *p_buf, UINT16 hdr_len, UINT8 pkt_type) 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = (UINT8 *)(p_buf + 1) + p_buf->offset; 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if we need to make space in the buffer */ 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf->offset < (hdr_len + L2CAP_MIN_OFFSET)) 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx, diff = BNEP_MINIMUM_OFFSET - p_buf->offset; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p + p_buf->len - 1; 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < p_buf->len; xx++, p--) 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p[diff] = *p; 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = BNEP_MINIMUM_OFFSET; 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + p_buf->offset; 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += hdr_len; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset -= hdr_len; 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p -= hdr_len; 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = pkt_type; 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p); 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_process_setup_conn_req 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes a peer's setup connection request 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** message. The destination UUID is verified and response sent 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Connection open indication will be given to PAN profile 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_process_setup_conn_req (tBNEP_CONN *p_bcb, UINT8 *p_setup, UINT8 len) 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 587d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - bnep_process_setup_conn_req for CID: 0x%x", p_bcb->l2cap_cid); 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state != BNEP_STATE_CONN_SETUP && 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state != BNEP_STATE_SEC_CHECKING && 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state != BNEP_STATE_CONNECTED) 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 593d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - setup request in bad state %d", p_bcb->con_state); 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_NOT_ALLOWED); 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if we already initiated security check or if waiting for user responce */ 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD) 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 601d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - Duplicate Setup message received while doing security check"); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if peer is the originator */ 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state != BNEP_STATE_CONNECTED && 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)) && 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_bcb->con_flags & BNEP_FLAGS_IS_ORIG)) 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 610d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - setup request when we are originator", p_bcb->con_state); 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_NOT_ALLOWED); 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state == BNEP_STATE_CONNECTED) 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->prv_src_uuid), (UINT8 *)&(p_bcb->src_uuid), sizeof (tBT_UUID)); 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->prv_dst_uuid), (UINT8 *)&(p_bcb->dst_uuid), sizeof (tBT_UUID)); 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->dst_uuid.len = p_bcb->src_uuid.len = len; 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->dst_uuid.len == 2) 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* because peer initiated connection keep src uuid as dst uuid */ 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (p_bcb->src_uuid.uu.uuid16, p_setup); 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (p_bcb->dst_uuid.uu.uuid16, p_setup); 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If nothing has changed don't bother the profile */ 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state == BNEP_STATE_CONNECTED && 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->src_uuid.uu.uuid16 == p_bcb->prv_src_uuid.uu.uuid16 && 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->dst_uuid.uu.uuid16 == p_bcb->prv_dst_uuid.uu.uuid16) 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_OK); 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_ALL_UUID_LENGTHS) && BNEP_SUPPORTS_ALL_UUID_LENGTHS == TRUE) 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_bcb->dst_uuid.len == 4) 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT32 (p_bcb->src_uuid.uu.uuid32, p_setup); 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT32 (p_bcb->dst_uuid.uu.uuid32, p_setup); 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_bcb->dst_uuid.len == 16) 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_bcb->src_uuid.uu.uuid128, p_setup, p_bcb->src_uuid.len); 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup += p_bcb->src_uuid.len; 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_bcb->dst_uuid.uu.uuid128, p_setup, p_bcb->dst_uuid.len); 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup += p_bcb->dst_uuid.len; 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 654d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - Bad UID len %d in ConnReq", p_bcb->dst_uuid.len); 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_conn_responce (p_bcb, BNEP_SETUP_INVALID_UUID_SIZE); 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_SEC_CHECKING; 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags |= BNEP_FLAGS_SETUP_RCVD; 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 662d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP initiating security check for incoming call for uuid 0x%x", p_bcb->src_uuid.uu.uuid16); 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined (BNEP_DO_AUTH_FOR_ROLE_SWITCH) || BNEP_DO_AUTH_FOR_ROLE_SWITCH == FALSE) 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED) 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_sec_check_complete (p_bcb->rem_bda, p_bcb, BTM_SUCCESS); 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_mx_access_request (p_bcb->rem_bda, BT_PSM_BNEP, FALSE, 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_PROTO_BNEP, bnep_get_uuid32(&(p_bcb->src_uuid)), 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &bnep_sec_check_complete, p_bcb); 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_process_setup_conn_responce 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes a peer's setup connection response 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** message. The response code is verified and 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Connection open indication will be given to PAN profile 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_process_setup_conn_responce (tBNEP_CONN *p_bcb, UINT8 *p_setup) 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_RESULT resp; 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 resp_code; 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 692d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP received setup responce"); 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The state should be either SETUP or CONNECTED */ 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state != BNEP_STATE_CONN_SETUP) 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Should we disconnect ? */ 697d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - setup response in bad state %d", p_bcb->con_state); 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if we are the originator */ 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_bcb->con_flags & BNEP_FLAGS_IS_ORIG)) 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 704d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - setup response when we are not originator", p_bcb->con_state); 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (resp_code, p_setup); 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (resp_code) 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_SETUP_INVALID_SRC_UUID: 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp = BNEP_CONN_FAILED_SRC_UUID; 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_SETUP_INVALID_DEST_UUID: 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp = BNEP_CONN_FAILED_DST_UUID; 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_SETUP_INVALID_UUID_SIZE: 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp = BNEP_CONN_FAILED_UUID_SIZE; 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_SETUP_CONN_NOT_ALLOWED: 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp = BNEP_CONN_FAILED; 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the responce code */ 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (resp_code != BNEP_SETUP_CONN_OK) 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED) 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 735d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - role change response is %d", resp_code); 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Restore the earlier BNEP status */ 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_CONNECTED; 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD); 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)&(p_bcb->prv_src_uuid), sizeof (tBT_UUID)); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)&(p_bcb->prv_dst_uuid), sizeof (tBT_UUID)); 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ensure timer is stopped */ 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&p_bcb->conn_tle); 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->re_transmits = 0; 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the user if he has a callback */ 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_conn_state_cb) 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, resp, TRUE); 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 755d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - setup response %d is not OK", resp_code); 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_bcb->l2cap_cid); 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the user if he has a callback */ 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_flags & BNEP_FLAGS_IS_ORIG) && (bnep_cb.p_conn_state_cb)) 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, resp, FALSE); 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Received successful responce */ 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_connected (p_bcb); 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_process_control_packet 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes a peer's setup connection request 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** message. The destination UUID is verified and response sent 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Connection open indication will be given to PAN profile 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *bnep_process_control_packet (tBNEP_CONN *p_bcb, UINT8 *p, UINT16 *rem_len, BOOLEAN is_ext) 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 control_type; 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN bad_pkt = FALSE; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len, ext_len = 0; 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_ext) 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_len = *p++; 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len = *rem_len - 1; 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project control_type = *p++; 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len = *rem_len - 1; 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 799d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP processing control packet rem_len %d, is_ext %d, ctrl_type %d", *rem_len, is_ext, control_type); 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (control_type) 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD: 804d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP Received Cmd not understood for ctl pkt type: %d", *p); 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p++; 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len = *rem_len - 1; 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_SETUP_CONNECTION_REQUEST_MSG: 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = *p++; 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*rem_len < ((2 * len) + 1)) 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bad_pkt = TRUE; 814d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP Received Setup message with bad length"); 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_ext) 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_process_setup_conn_req (p_bcb, p, (UINT8)len); 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += (2 * len); 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len = *rem_len - (2 * len) - 1; 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_SETUP_CONNECTION_RESPONSE_MSG: 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_ext) 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_process_setup_conn_responce (p_bcb, p); 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += 2; 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len = *rem_len - 2; 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FILTER_NET_TYPE_SET_MSG: 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (len, p); 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*rem_len < (len + 2)) 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bad_pkt = TRUE; 835d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP Received Filter set message with bad length"); 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_process_peer_filter_set (p_bcb, p, len); 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += len; 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len = *rem_len - len - 2; 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FILTER_NET_TYPE_RESPONSE_MSG: 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_process_peer_filter_rsp (p_bcb, p); 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += 2; 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len = *rem_len - 2; 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FILTER_MULTI_ADDR_SET_MSG: 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (len, p); 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*rem_len < (len + 2)) 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bad_pkt = TRUE; 854d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP Received Multicast Filter Set message with bad length"); 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_process_peer_multicast_filter_set (p_bcb, p, len); 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += len; 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len = *rem_len - len - 2; 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FILTER_MULTI_ADDR_RESPONSE_MSG: 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_process_multicast_filter_rsp (p_bcb, p); 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += 2; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len = *rem_len - 2; 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default : 869d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - bad ctl pkt type: %d", control_type); 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_command_not_understood (p_bcb, control_type); 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_ext) 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += (ext_len - 1); 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len -= (ext_len - 1); 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bad_pkt) 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 881d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - bad ctl pkt length: %d", *rem_len); 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *rem_len = 0; 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p; 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_process_peer_filter_set 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes a peer's filter control 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 'set' message. The filters are stored in the BCB, 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and an appropriate filter response message sent. 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_process_peer_filter_set (tBNEP_CONN *p_bcb, UINT8 *p_filters, UINT16 len) 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_PROT_FILTERS) && BNEP_SUPPORTS_PROT_FILTERS == TRUE) 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 num_filters = 0; 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx, resp_code = BNEP_FILTER_CRL_OK; 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 start, end; 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_temp_filters; 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED))) 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 912d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP received filter set from peer when there is no connection"); 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 916d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP received filter set from peer"); 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check for length not a multiple of 4 */ 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len & 3) 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 920d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - bad filter len: %d", len); 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_filter_rsp (p_bcb, BNEP_FILTER_CRL_BAD_RANGE); 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len) 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_filters = (UINT16) (len >> 2); 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Validate filter values */ 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (num_filters <= BNEP_MAX_PROT_FILTERS) 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_temp_filters = p_filters; 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < num_filters; xx++) 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (start, p_temp_filters); 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (end, p_temp_filters); 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (start > end) 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp_code = BNEP_FILTER_CRL_BAD_RANGE; 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp_code = BNEP_FILTER_CRL_MAX_REACHED; 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (resp_code != BNEP_FILTER_CRL_OK) 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_filter_rsp (p_bcb, resp_code); 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_filter_ind_cb) 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_filter_ind_cb) (p_bcb->handle, TRUE, 0, len, p_filters); 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rcvd_num_filters = num_filters; 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < num_filters; xx++) 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (start, p_filters); 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (end, p_filters); 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rcvd_prot_filter_start[xx] = start; 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rcvd_prot_filter_end[xx] = end; 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_filter_rsp (p_bcb, resp_code); 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_filter_rsp (p_bcb, BNEP_FILTER_CRL_UNSUPPORTED); 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_process_peer_filter_rsp 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes a peer's filter control 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 'response' message. 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_process_peer_filter_rsp (tBNEP_CONN *p_bcb, UINT8 *p_data) 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_PROT_FILTERS) && BNEP_SUPPORTS_PROT_FILTERS == TRUE) 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 resp_code; 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_RESULT result; 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 989d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP received filter responce"); 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The state should be CONNECTED */ 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED))) 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 994d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - filter response in bad state %d", p_bcb->con_state); 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if we are the originator */ 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_bcb->con_flags & BNEP_FLAGS_FILTER_RESP_PEND)) 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1001d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - filter response when not expecting"); 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ensure timer is stopped */ 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&p_bcb->conn_tle); 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags &= ~BNEP_FLAGS_FILTER_RESP_PEND; 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->re_transmits = 0; 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (resp_code, p_data); 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = BNEP_SUCCESS; 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (resp_code != BNEP_FILTER_CRL_OK) 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = BNEP_SET_FILTER_FAIL; 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_filter_ind_cb) 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_filter_ind_cb) (p_bcb->handle, FALSE, result, 0, NULL); 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_process_multicast_filter_rsp 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes multicast filter control 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 'response' message. 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_process_multicast_filter_rsp (tBNEP_CONN *p_bcb, UINT8 *p_data) 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_MULTI_FILTERS) && BNEP_SUPPORTS_MULTI_FILTERS == TRUE) 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 resp_code; 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_RESULT result; 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1041d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP received multicast filter responce"); 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The state should be CONNECTED */ 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED))) 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1046d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - multicast filter response in bad state %d", p_bcb->con_state); 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if we are the originator */ 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_bcb->con_flags & BNEP_FLAGS_MULTI_RESP_PEND)) 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1053d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - multicast filter response when not expecting"); 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ensure timer is stopped */ 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&p_bcb->conn_tle); 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags &= ~BNEP_FLAGS_MULTI_RESP_PEND; 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->re_transmits = 0; 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (resp_code, p_data); 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = BNEP_SUCCESS; 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (resp_code != BNEP_FILTER_CRL_OK) 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = BNEP_SET_FILTER_FAIL; 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_mfilter_ind_cb) 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_mfilter_ind_cb) (p_bcb->handle, FALSE, result, 0, NULL); 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_process_peer_multicast_filter_set 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes a peer's filter control 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 'set' message. The filters are stored in the BCB, 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and an appropriate filter response message sent. 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_process_peer_multicast_filter_set (tBNEP_CONN *p_bcb, UINT8 *p_filters, UINT16 len) 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_MULTI_FILTERS) && BNEP_SUPPORTS_MULTI_FILTERS == TRUE) 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 resp_code = BNEP_FILTER_CRL_OK; 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 num_filters, xx; 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_temp_filters, null_bda[BD_ADDR_LEN] = {0,0,0,0,0,0}; 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED))) 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1098d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP received multicast filter set from peer when there is no connection"); 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len % 12) 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1104d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - bad filter len: %d", len); 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_BAD_RANGE); 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len > (BNEP_MAX_MULTI_FILTERS * 2 * BD_ADDR_LEN)) 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1111d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - Too many filters"); 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_MAX_REACHED); 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_filters = 0; 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len) 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_filters = (UINT16) (len / 12); 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Validate filter values */ 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (num_filters <= BNEP_MAX_MULTI_FILTERS) 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_temp_filters = p_filters; 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < num_filters; xx++) 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp (p_temp_filters, p_temp_filters + BD_ADDR_LEN, BD_ADDR_LEN) > 0) 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_BAD_RANGE); 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_temp_filters += (BD_ADDR_LEN * 2); 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rcvd_mcast_filters = num_filters; 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < num_filters; xx++) 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_bcb->rcvd_mcast_filter_start[xx], p_filters, BD_ADDR_LEN); 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_bcb->rcvd_mcast_filter_end[xx], p_filters + BD_ADDR_LEN, BD_ADDR_LEN); 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_filters += (BD_ADDR_LEN * 2); 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if any of the ranges have all zeros as both starting and ending addresses */ 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((memcmp (null_bda, p_bcb->rcvd_mcast_filter_start[xx], BD_ADDR_LEN) == 0) && 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (memcmp (null_bda, p_bcb->rcvd_mcast_filter_end[xx], BD_ADDR_LEN) == 0)) 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rcvd_mcast_filters = 0xFFFF; 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1152d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP multicast filters %d", p_bcb->rcvd_mcast_filters); 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_multicast_filter_rsp (p_bcb, resp_code); 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_mfilter_ind_cb) 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_mfilter_ind_cb) (p_bcb->handle, TRUE, 0, len, p_filters); 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_UNSUPPORTED); 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnepu_send_peer_multicast_filter_rsp 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a filter response to a peer 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_send_peer_multicast_filter_rsp (tBNEP_CONN *p_bcb, UINT16 response_code) 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1177d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP sending multicast filter response %d", response_code); 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL) 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1180d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - no buffer filter rsp"); 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in BNEP frame type - filter control */ 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL); 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Put in filter message type - set filters */ 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, BNEP_FILTER_MULTI_ADDR_RESPONSE_MSG); 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p, response_code); 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 4; 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_check_send_packet (p_bcb, p_buf); 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_sec_check_complete 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is registered with BTM and will be called 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** after completing the security procedures 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12128fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid bnep_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT trasnport, 12138fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta void *p_ref_data, UINT8 result) 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb = (tBNEP_CONN *)p_ref_data; 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 resp_code = BNEP_SETUP_CONN_OK; 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_role_change; 12185cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(bd_addr); 12198fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UNUSED(trasnport); 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1221d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP security callback returned result %d", result); 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED) 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_role_change = TRUE; 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_role_change = FALSE; 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if the port is still waiting for security to complete */ 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state != BNEP_STATE_SEC_CHECKING) 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1230d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP Connection in wrong state %d when security is completed", p_bcb->con_state); 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if it is outgoing call and result is FAILURE return security fail error */ 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)) 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != BTM_SUCCESS) 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED) 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the user that role change is failed because of security */ 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_conn_state_cb) 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_SECURITY_FAIL, is_role_change); 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_CONNECTED; 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)&(p_bcb->prv_src_uuid), sizeof (tBT_UUID)); 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)&(p_bcb->prv_dst_uuid), sizeof (tBT_UUID)); 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_bcb->l2cap_cid); 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the user if he has a callback */ 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_conn_state_cb) 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_SECURITY_FAIL, is_role_change); 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Transition to the next appropriate state, waiting for connection confirm. */ 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_CONN_SETUP; 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_conn_req (p_bcb); 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_CONN_TIMEOUT); 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* it is an incoming call respond appropriately */ 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != BTM_SUCCESS) 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_NOT_ALLOWED); 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED) 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Role change is failed because of security. Revert back to connected state */ 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_CONNECTED; 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD); 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)&(p_bcb->prv_src_uuid), sizeof (tBT_UUID)); 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)&(p_bcb->prv_dst_uuid), sizeof (tBT_UUID)); 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_bcb->l2cap_cid); 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_conn_ind_cb) 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_CONN_SETUP; 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_ind_cb) (p_bcb->handle, p_bcb->rem_bda, &p_bcb->dst_uuid, &p_bcb->src_uuid, is_role_change); 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Profile didn't register connection indication call back */ 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_conn_responce (p_bcb, resp_code); 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_connected (p_bcb); 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_is_packet_allowed 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function verifies whether the protocol passes through 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the protocol filters set by the peer 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BNEP_SUCCESS - if the protocol is allowed 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_IGNORE_CMD - if the protocol is filtered out 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT bnep_is_packet_allowed (tBNEP_CONN *p_bcb, 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR p_dest_addr, 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 protocol, 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN fw_ext_present, 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_data) 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_PROT_FILTERS) && BNEP_SUPPORTS_PROT_FILTERS == TRUE) 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->rcvd_num_filters) 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 i, proto; 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Findout the actual protocol to check for the filtering */ 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto = protocol; 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (proto == BNEP_802_1_P_PROTOCOL) 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (fw_ext_present) 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 len, ext; 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* parse the extension headers and findout actual protocol */ 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do { 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext = *p_data++; 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = *p_data++; 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data += len; 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (ext & 0x80); 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data += 2; 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (proto, p_data); 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<p_bcb->rcvd_num_filters; i++) 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->rcvd_prot_filter_start[i] <= proto) && 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (proto <= p_bcb->rcvd_prot_filter_end[i])) 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i == p_bcb->rcvd_num_filters) 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1356d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("Ignoring protocol 0x%x in BNEP data write", proto); 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_IGNORE_CMD; 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_MULTI_FILTERS) && BNEP_SUPPORTS_MULTI_FILTERS == TRUE) 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ckeck for multicast address filtering */ 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dest_addr[0] & 0x01) && 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rcvd_mcast_filters) 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 i; 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if every multicast should be filtered */ 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->rcvd_mcast_filters != 0xFFFF) 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the address is mentioned in the filter range */ 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < p_bcb->rcvd_mcast_filters; i++) 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((memcmp (p_bcb->rcvd_mcast_filter_start[i], p_dest_addr, BD_ADDR_LEN) <= 0) && 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (memcmp (p_bcb->rcvd_mcast_filter_end[i], p_dest_addr, BD_ADDR_LEN) >= 0)) 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** If every multicast should be filtered or the address is not in the filter range 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** drop the packet 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->rcvd_mcast_filters == 0xFFFF) || (i == p_bcb->rcvd_mcast_filters)) 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1387d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("Ignoring multicast address %x.%x.%x.%x.%x.%x in BNEP data write", 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dest_addr[0], p_dest_addr[1], p_dest_addr[2], 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dest_addr[3], p_dest_addr[4], p_dest_addr[5]); 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_IGNORE_CMD; 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_SUCCESS; 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_get_uuid32 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the 32 bit equivalent of the given UUID 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns UINT32 - 32 bit equivalent of the UUID 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 bnep_get_uuid32 (tBT_UUID *src_uuid) 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 result; 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (src_uuid->len == 2) 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((UINT32)src_uuid->uu.uuid16); 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (src_uuid->len == 4) 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (src_uuid->uu.uuid32 & 0x0000FFFF); 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = src_uuid->uu.uuid128[2]; 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = (result << 8) | (src_uuid->uu.uuid128[3]); 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_dump_status 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function dumps the bnep control block and connection 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** blocks information 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_dump_status (void) 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_DEBUG_DUMP) && BNEP_SUPPORTS_DEBUG_DUMP == TRUE) 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 i; 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char buff[200]; 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1447d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP my BD Addr %x.%x.%x.%x.%x.%x", 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.my_bda[0], bnep_cb.my_bda[1], bnep_cb.my_bda[2], 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.my_bda[3], bnep_cb.my_bda[4], bnep_cb.my_bda[5]); 1450d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("profile registered %d, trace %d, got_my_bd_addr %d", 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.profile_registered, bnep_cb.trace_level, bnep_cb.got_my_bd_addr); 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0, p_bcb = bnep_cb.bcb; i < BNEP_MAX_CONNECTIONS; i++, p_bcb++) 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sprintf (buff, "%d state %d, flags 0x%x, cid %d, pfilts %d, mfilts %d, src 0x%x, dst 0x%x, BD %x.%x.%x.%x.%x.%x", 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i, p_bcb->con_state, p_bcb->con_flags, p_bcb->l2cap_cid, 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rcvd_num_filters, p_bcb->rcvd_mcast_filters, 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->src_uuid.uu.uuid16, p_bcb->dst_uuid.uu.uuid16, 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rem_bda[0], p_bcb->rem_bda[1], p_bcb->rem_bda[2], 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rem_bda[3], p_bcb->rem_bda[4], p_bcb->rem_bda[5]); 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1462d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG (buff); 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1468