btsnoop.c revision 5738f83aeb59361a0a2eda2460113f6dc919427
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-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 * Name: btsnoopdisp.c 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Function: this file contains functions to generate a BTSNOOP file 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ****************************************************************************/ 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <dlfcn.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <pthread.h> 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/prctl.h> 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h> 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <ctype.h> 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h> 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <arpa/inet.h> 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <netinet/in.h> 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <netdb.h> 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* for gettimeofday */ 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/time.h> 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* for the S_* open parameters */ 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/stat.h> 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* for write */ 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h> 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* for O_* open parameters */ 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h> 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* defines the O_* open parameters */ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h> 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_TAG "BTSNOOP-DISP" 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <cutils/log.h> 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_hci_bdroid.h" 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utils.h" 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTSNOOP_DBG 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTSNOOP_DBG FALSE 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTSNOOP_DBG == TRUE) 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SNOOPDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);} 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SNOOPDBG(param, ...) {} 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* file descriptor of the BT snoop file (by default, -1 means disabled) */ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint hci_btsnoop_fd = -1; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Macro to perform a multiplication of 2 unsigned 32bit values and store the result 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * in an unsigned 64 bit value (as two 32 bit variables): 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * u64 = u32In1 * u32In2 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * u32OutLow = u64[31:0] 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * u32OutHi = u64[63:32] 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * basically the algorithm: 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * (hi1*2^16 + lo1)*(hi2*2^16 + lo2) = lo1*lo2 + (hi1*hi2)*2^32 + (hi1*lo2 + hi2*lo1)*2^16 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * and the carry is propagated 16 bit by 16 bit: 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * result[15:0] = lo1*lo2 & 0xFFFF 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * result[31:16] = ((lo1*lo2) >> 16) + (hi1*lo2 + hi2*lo1) 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * and so on 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define HCIDISP_MULT_64(u32In1, u32In2, u32OutLo, u32OutHi) \ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectdo { \ 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t u32In1Tmp = u32In1; \ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t u32In2Tmp = u32In2; \ 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t u32Tmp, u32Carry; \ 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32OutLo = (u32In1Tmp & 0xFFFF) * (u32In2Tmp & 0xFFFF); /*lo1*lo2*/ \ 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32OutHi = ((u32In1Tmp >> 16) & 0xFFFF) * ((u32In2Tmp >> 16) & 0xFFFF); /*hi1*hi2*/ \ 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32Tmp = (u32In1Tmp & 0xFFFF) * ((u32In2Tmp >> 16) & 0xFFFF); /*lo1*hi2*/ \ 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32Carry = (uint32_t)((u32OutLo>>16)&0xFFFF); \ 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32Carry += (u32Tmp&0xFFFF); \ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32OutLo += (u32Tmp << 16) ; \ 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32OutHi += (u32Tmp >> 16); \ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32Tmp = ((u32In1Tmp >> 16) & 0xFFFF) * (u32In2Tmp & 0xFFFF); \ 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32Carry += (u32Tmp)&0xFFFF; \ 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32Carry>>=16; \ 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32OutLo += (u32Tmp << 16); \ 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32OutHi += (u32Tmp >> 16); \ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project u32OutHi += u32Carry; \ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} while (0) 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Macro to make an addition of 2 64 bit values: 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * result = (u32OutHi & u32OutLo) + (u32InHi & u32InLo) 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * u32OutHi = result[63:32] 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * u32OutLo = result[31:0] 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define HCIDISP_ADD_64(u32InLo, u32InHi, u32OutLo, u32OutHi) \ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectdo { \ 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (u32OutLo) += (u32InLo); \ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((u32OutLo) < (u32InLo)) (u32OutHi)++; \ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (u32OutHi) += (u32InHi); \ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} while (0) 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* EPOCH in microseconds since 01/01/0000 : 0x00dcddb3.0f2f8000 */ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTSNOOP_EPOCH_HI 0x00dcddb3U 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTSNOOP_EPOCH_LO 0x0f2f8000U 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function tv_to_btsnoop_ts 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This function generate a BT Snoop timestamp. 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** NOTE 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** The return value is 64 bit as 2 32 bit variables out_lo and * out_hi. 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** A BT Snoop timestamp is the number of microseconds since 01/01/0000. 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** The timeval structure contains the number of microseconds since EPOCH 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** (01/01/1970) encoded as: tv.tv_sec, number of seconds since EPOCH and 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** tv_usec, number of microseconds in current second 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Therefore the algorithm is: 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** result = tv.tv_sec * 1000000 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** result += tv.tv_usec 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** result += EPOCH_OFFSET 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void tv_to_btsnoop_ts(uint32_t *out_lo, uint32_t *out_hi, struct timeval *tv) 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* multiply the seconds by 1000000 */ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCIDISP_MULT_64(tv->tv_sec, 0xf4240, *out_lo, *out_hi); 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add the microseconds */ 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCIDISP_ADD_64((uint32_t)tv->tv_usec, 0, *out_lo, *out_hi); 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add the epoch */ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCIDISP_ADD_64(BTSNOOP_EPOCH_LO, BTSNOOP_EPOCH_HI, *out_lo, *out_hi); 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function l_to_be 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Function to convert a 32 bit value into big endian format 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns 32 bit value in big endian format 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic uint32_t l_to_be(uint32_t x) 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #if __BIG_ENDIAN != TRUE 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project x = (x >> 24) | 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((x >> 8) & 0xFF00) | 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((x << 8) & 0xFF0000) | 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (x << 24); 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #endif 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return x; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btsnoop_is_open 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Function to check if BTSNOOP is open 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns 1 if open otherwise 0 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint btsnoop_is_open(void) 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE) 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("btsnoop_is_open: snoop fd = %d\n", hci_btsnoop_fd); 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hci_btsnoop_fd != -1) 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 1; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 2; /* Snoop not available */ 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btsnoop_log_open 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Function to open the BTSNOOP file 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns None 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int btsnoop_log_open(char *btsnoop_logfile) 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE) 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hci_btsnoop_fd = -1; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("btsnoop_log_open: snoop log file = %s\n", btsnoop_logfile); 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* write the BT snoop header */ 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btsnoop_logfile != NULL) && (strlen(btsnoop_logfile) != 0)) 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hci_btsnoop_fd = open(btsnoop_logfile, \ 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project O_WRONLY|O_CREAT|O_TRUNC, \ 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH); 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hci_btsnoop_fd == -1) 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perror("open"); 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("btsnoop_log_open: Unable to open snoop log file\n"); 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hci_btsnoop_fd = -1; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, "btsnoop\0\0\0\0\1\0\0\x3\xea", 16); 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 1; 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 2; /* Snoop not available */ 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btsnoop_log_close 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Function to close the BTSNOOP file 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns None 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int btsnoop_log_close(void) 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE) 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* write the BT snoop header */ 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hci_btsnoop_fd != -1) 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("btsnoop_log_close: Closing snoop log file\n"); 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project close(hci_btsnoop_fd); 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hci_btsnoop_fd = -1; 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 1; 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 2; /* Snoop not available */ 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btsnoop_hci_cmd 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Function to add a command in the BTSNOOP file 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns None 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnoop_hci_cmd(uint8_t *p) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("btsnoop_hci_cmd: fd = %d", hci_btsnoop_fd); 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hci_btsnoop_fd != -1) 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t value, value_hi; 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct timeval tv; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* since these display functions are called from different contexts */ 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utils_lock(); 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store the length in both original and included fields */ 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(p[2] + 4); 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* flags: command sent from the host */ 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(2); 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drops: none */ 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = 0; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* time */ 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gettimeofday(&tv, NULL); 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tv_to_btsnoop_ts(&value, &value_hi, &tv); 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value_hi = l_to_be(value_hi); 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(value); 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value_hi, 4); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* data */ 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, "\x1", 1); 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, p, p[2] + 3); 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* since these display functions are called from different contexts */ 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utils_unlock(); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btsnoop_hci_evt 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Function to add a event in the BTSNOOP file 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns None 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnoop_hci_evt(uint8_t *p) 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("btsnoop_hci_evt: fd = %d", hci_btsnoop_fd); 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hci_btsnoop_fd != -1) 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t value, value_hi; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct timeval tv; 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* since these display functions are called from different contexts */ 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utils_lock(); 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store the length in both original and included fields */ 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(p[1] + 3); 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* flags: event received in the host */ 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(3); 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drops: none */ 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = 0; 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* time */ 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gettimeofday(&tv, NULL); 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tv_to_btsnoop_ts(&value, &value_hi, &tv); 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value_hi = l_to_be(value_hi); 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(value); 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value_hi, 4); 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* data */ 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, "\x4", 1); 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, p, p[1] + 2); 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* since these display functions are called from different contexts */ 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utils_unlock(); 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btsnoop_sco_data 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Function to add a SCO data packet in the BTSNOOP file 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns None 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnoop_sco_data(uint8_t *p, uint8_t is_rcvd) 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("btsnoop_sco_data: fd = %d", hci_btsnoop_fd); 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hci_btsnoop_fd != -1) 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t value, value_hi; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct timeval tv; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* since these display functions are called from different contexts */ 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utils_lock(); 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store the length in both original and included fields */ 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(p[2] + 4); 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* flags: data can be sent or received */ 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(is_rcvd?1:0); 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drops: none */ 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = 0; 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* time */ 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gettimeofday(&tv, NULL); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tv_to_btsnoop_ts(&value, &value_hi, &tv); 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value_hi = l_to_be(value_hi); 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(value); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value_hi, 4); 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* data */ 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, "\x3", 1); 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, p, p[2] + 3); 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* since these display functions are called from different contexts */ 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utils_unlock(); 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btsnoop_acl_data 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Function to add an ACL data packet in the BTSNOOP file 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns None 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnoop_acl_data(uint8_t *p, uint8_t is_rcvd) 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("btsnoop_acl_data: fd = %d", hci_btsnoop_fd); 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hci_btsnoop_fd != -1) 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t value, value_hi; 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct timeval tv; 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* since these display functions are called from different contexts */ 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utils_lock(); 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store the length in both original and included fields */ 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be((p[3]<<8) + p[2] + 5); 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* flags: data can be sent or received */ 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(is_rcvd?1:0); 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drops: none */ 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = 0; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* time */ 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gettimeofday(&tv, NULL); 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tv_to_btsnoop_ts(&value, &value_hi, &tv); 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value_hi = l_to_be(value_hi); 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project value = l_to_be(value); 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value_hi, 4); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, &value, 4); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* data */ 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, "\x2", 1); 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project write(hci_btsnoop_fd, p, (p[3]<<8) + p[2] + 4); 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* since these display functions are called from different contexts */ 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utils_unlock(); 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************** 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** API allow external realtime parsing of output using e.g hcidump 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *********************************************************************************/ 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define EXT_PARSER_PORT 4330 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic pthread_t thread_id; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int s_listen = -1; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int ext_parser_fd = -1; 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void ext_parser_detached(void); 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int ext_parser_accept(int port) 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project socklen_t clilen; 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct sockaddr_in cliaddr, servaddr; 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int s, srvlen; 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int n = 1; 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int size_n; 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int result = 0; 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("waiting for connection on port %d", port); 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_listen = socket(AF_INET, SOCK_STREAM, 0); 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s_listen < 0) 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGE("listener not created: listen fd %d", s_listen); 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return -1; 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bzero(&servaddr, sizeof(servaddr)); 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project servaddr.sin_family = AF_INET; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project servaddr.sin_port = htons(port); 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project srvlen = sizeof(servaddr); 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allow reuse of sock addr upon bind */ 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = setsockopt(s_listen, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n)); 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result<0) 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perror("setsockopt"); 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = bind(s_listen, (struct sockaddr *) &servaddr, srvlen); 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result < 0) 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perror("bind"); 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = listen(s_listen, 1); 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result < 0) 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perror("listen"); 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project clilen = sizeof(struct sockaddr_in); 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s = accept(s_listen, (struct sockaddr *) &cliaddr, &clilen); 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s < 0) 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perror("accept"); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return -1; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("connected (%d)", s); 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return s; 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int send_ext_parser(char *p, int len) 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int n; 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if io socket is connected */ 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ext_parser_fd == -1) 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("write %d to snoop socket\n", len); 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project n = write(ext_parser_fd, p, len); 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (n<=0) 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_parser_detached(); 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return n; 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void ext_parser_detached(void) 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("ext parser detached"); 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ext_parser_fd>0) 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project close(ext_parser_fd); 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s_listen > 0) 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project close(s_listen); 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_parser_fd = -1; 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_listen = -1; 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void interruptFn (int sig) 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("interruptFn"); 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_exit(0); 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void ext_parser_thread(void* param) 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int fd; 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int sig = SIGUSR2; 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sigset_t sigSet; 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sigemptyset (&sigSet); 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sigaddset (&sigSet, sig); 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("ext_parser_thread"); 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project prctl(PR_SET_NAME, (unsigned long)"BtsnoopExtParser", 0, 0, 0); 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_sigmask (SIG_UNBLOCK, &sigSet, NULL); 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct sigaction act; 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project act.sa_handler = interruptFn; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sigaction (sig, &act, NULL ); 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fd = ext_parser_accept(EXT_PARSER_PORT); 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_parser_fd = fd; 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("ext parser attached on fd %d\n", ext_parser_fd); 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (1); 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnoop_stop_listener(void) 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("btsnoop_init"); 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_parser_detached(); 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnoop_init(void) 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTSNOOP_EXT_PARSER_INCLUDED) && (BTSNOOP_EXT_PARSER_INCLUDED == TRUE) 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("btsnoop_init"); 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* always setup ext listener port */ 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pthread_create(&thread_id, NULL, 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (void*)ext_parser_thread,NULL)!=0) 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perror("pthread_create"); 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnoop_open(char *p_path) 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE) 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("btsnoop_open"); 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnoop_log_open(p_path); 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif // BTSNOOPDISP_INCLUDED 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnoop_close(void) 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE) 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("btsnoop_close"); 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnoop_log_close(); 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnoop_cleanup (void) 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTSNOOP_EXT_PARSER_INCLUDED) && (BTSNOOP_EXT_PARSER_INCLUDED == TRUE) 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGD("btsnoop_cleanup"); 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_kill(thread_id, SIGUSR2); 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_join(thread_id, NULL); 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_parser_detached(); 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define HCIT_TYPE_COMMAND 1 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define HCIT_TYPE_ACL_DATA 2 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define HCIT_TYPE_SCO_DATA 3 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define HCIT_TYPE_EVENT 4 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnoop_capture(HC_BT_HDR *p_buf, uint8_t is_rcvd) 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint8_t *p = (uint8_t *)(p_buf + 1) + p_buf->offset; 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("btsnoop_capture: fd = %d, type %x, rcvd %d, ext %d", \ 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hci_btsnoop_fd, p_buf->event, is_rcvd, ext_parser_fd); 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTSNOOP_EXT_PARSER_INCLUDED) && (BTSNOOP_EXT_PARSER_INCLUDED == TRUE) 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ext_parser_fd > 0) 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint8_t tmp = *p; 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* borrow one byte for H4 packet type indicator */ 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p--; 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_buf->event & MSG_EVT_MASK) 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_HC_TO_STACK_HCI_EVT: 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = HCIT_TYPE_EVENT; 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_HC_TO_STACK_HCI_ACL: 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_STACK_TO_HC_HCI_ACL: 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = HCIT_TYPE_ACL_DATA; 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_HC_TO_STACK_HCI_SCO: 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_STACK_TO_HC_HCI_SCO: 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = HCIT_TYPE_SCO_DATA; 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_STACK_TO_HC_HCI_CMD: 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = HCIT_TYPE_COMMAND; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project send_ext_parser((char*)p, p_buf->len+1); 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(++p) = tmp; 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE) 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hci_btsnoop_fd == -1) 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_buf->event & MSG_EVT_MASK) 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_HC_TO_STACK_HCI_EVT: 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("TYPE : EVT"); 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnoop_hci_evt(p); 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_HC_TO_STACK_HCI_ACL: 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_STACK_TO_HC_HCI_ACL: 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("TYPE : ACL"); 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnoop_acl_data(p, is_rcvd); 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_HC_TO_STACK_HCI_SCO: 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_STACK_TO_HC_HCI_SCO: 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("TYPE : SCO"); 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnoop_sco_data(p, is_rcvd); 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case MSG_STACK_TO_HC_HCI_CMD: 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SNOOPDBG("TYPE : CMD"); 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnoop_hci_cmd(p); 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif // BTSNOOPDISP_INCLUDED 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 695