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