1/****************************************************************************** 2 * 3 * Copyright (C) 2001-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19#include <assert.h> 20#include <stdio.h> 21#include <stdlib.h> 22#include <string.h> 23#include <stdarg.h> 24#include <sys/time.h> 25#include <time.h> 26 27#include "bte.h" 28#include "bta_api.h" 29#include "btu.h" 30#include "osi/include/config.h" 31#include "gki.h" 32#include "l2c_api.h" 33#include "osi/include/log.h" 34#include "stack_config.h" 35 36#include "port_api.h" 37#if (AVDT_INCLUDED==TRUE) 38#include "avdt_api.h" 39#endif 40#include "avrc_api.h" 41#if (AVDT_INCLUDED==TRUE) 42#include "avdt_api.h" 43#endif 44#if (A2D_INCLUDED==TRUE) 45#include "a2d_api.h" 46#endif 47#if (BNEP_INCLUDED==TRUE) 48#include "bnep_api.h" 49#endif 50#include "btm_api.h" 51#include "gap_api.h" 52#if (PAN_INCLUDED==TRUE) 53#include "pan_api.h" 54#endif 55#include "sdp_api.h" 56 57#if (BLE_INCLUDED==TRUE) 58#include "gatt_api.h" 59#include "smp_api.h" 60#endif 61 62#define LOGI0(t,s) __android_log_write(ANDROID_LOG_INFO, t, s) 63#define LOGD0(t,s) __android_log_write(ANDROID_LOG_DEBUG, t, s) 64#define LOGW0(t,s) __android_log_write(ANDROID_LOG_WARN, t, s) 65#define LOGE0(t,s) __android_log_write(ANDROID_LOG_ERROR, t, s) 66 67#ifndef DEFAULT_CONF_TRACE_LEVEL 68#define DEFAULT_CONF_TRACE_LEVEL BT_TRACE_LEVEL_WARNING 69#endif 70 71#ifndef BTE_LOG_BUF_SIZE 72#define BTE_LOG_BUF_SIZE 1024 73#endif 74 75#define BTE_LOG_MAX_SIZE (BTE_LOG_BUF_SIZE - 12) 76 77#define MSG_BUFFER_OFFSET 0 78 79/* LayerIDs for BTA, currently everything maps onto appl_trace_level */ 80static const char * const bt_layer_tags[] = { 81 "bt_btif", 82 "bt_usb", 83 "bt_serial", 84 "bt_socket", 85 "bt_rs232", 86 "bt_lc", 87 "bt_lm", 88 "bt_hci", 89 "bt_l2cap", 90 "bt_rfcomm", 91 "bt_sdp", 92 "bt_tcs", 93 "bt_obex", 94 "bt_btm", 95 "bt_gap", 96 "UNUSED", 97 "UNUSED", 98 "bt_icp", 99 "bt_hsp2", 100 "bt_spp", 101 "bt_ctp", 102 "bt_bpp", 103 "bt_hcrp", 104 "bt_ftp", 105 "bt_opp", 106 "bt_btu", 107 "bt_gki", 108 "bt_bnep", 109 "bt_pan", 110 "bt_hfp", 111 "bt_hid", 112 "bt_bip", 113 "bt_avp", 114 "bt_a2d", 115 "bt_sap", 116 "bt_amp", 117 "bt_mca", 118 "bt_att", 119 "bt_smp", 120 "bt_nfc", 121 "bt_nci", 122 "bt_idep", 123 "bt_ndep", 124 "bt_llcp", 125 "bt_rw", 126 "bt_ce", 127 "bt_snep", 128 "bt_ndef", 129 "bt_nfa", 130}; 131static uint8_t BTAPP_SetTraceLevel(uint8_t new_level); 132static uint8_t BTIF_SetTraceLevel(uint8_t new_level); 133static uint8_t BTU_SetTraceLevel(uint8_t new_level); 134 135/* make sure list is order by increasing layer id!!! */ 136static tBTTRC_FUNC_MAP bttrc_set_level_map[] = { 137 {BTTRC_ID_STK_BTU, BTTRC_ID_STK_HCI, BTU_SetTraceLevel, "TRC_HCI", DEFAULT_CONF_TRACE_LEVEL}, 138 {BTTRC_ID_STK_L2CAP, BTTRC_ID_STK_L2CAP, L2CA_SetTraceLevel, "TRC_L2CAP", DEFAULT_CONF_TRACE_LEVEL}, 139 {BTTRC_ID_STK_RFCOMM, BTTRC_ID_STK_RFCOMM_DATA, PORT_SetTraceLevel, "TRC_RFCOMM", DEFAULT_CONF_TRACE_LEVEL}, 140#if (AVDT_INCLUDED==TRUE) 141 {BTTRC_ID_STK_AVDT, BTTRC_ID_STK_AVDT, AVDT_SetTraceLevel, "TRC_AVDT", DEFAULT_CONF_TRACE_LEVEL}, 142#endif 143 {BTTRC_ID_STK_AVRC, BTTRC_ID_STK_AVRC, AVRC_SetTraceLevel, "TRC_AVRC", DEFAULT_CONF_TRACE_LEVEL}, 144#if (AVDT_INCLUDED==TRUE) 145 //{BTTRC_ID_AVDT_SCB, BTTRC_ID_AVDT_CCB, NULL, "TRC_AVDT_SCB", DEFAULT_CONF_TRACE_LEVEL}, 146#endif 147#if (A2D_INCLUDED==TRUE) 148 {BTTRC_ID_STK_A2D, BTTRC_ID_STK_A2D, A2D_SetTraceLevel, "TRC_A2D", DEFAULT_CONF_TRACE_LEVEL}, 149#endif 150#if (BNEP_INCLUDED==TRUE) 151 {BTTRC_ID_STK_BNEP, BTTRC_ID_STK_BNEP, BNEP_SetTraceLevel, "TRC_BNEP", DEFAULT_CONF_TRACE_LEVEL}, 152#endif 153 {BTTRC_ID_STK_BTM_ACL, BTTRC_ID_STK_BTM_SEC, BTM_SetTraceLevel, "TRC_BTM", DEFAULT_CONF_TRACE_LEVEL}, 154 {BTTRC_ID_STK_GAP, BTTRC_ID_STK_GAP, GAP_SetTraceLevel, "TRC_GAP", DEFAULT_CONF_TRACE_LEVEL}, 155#if (PAN_INCLUDED==TRUE) 156 {BTTRC_ID_STK_PAN, BTTRC_ID_STK_PAN, PAN_SetTraceLevel, "TRC_PAN", DEFAULT_CONF_TRACE_LEVEL}, 157#endif 158 {BTTRC_ID_STK_SDP, BTTRC_ID_STK_SDP, SDP_SetTraceLevel, "TRC_SDP", DEFAULT_CONF_TRACE_LEVEL}, 159#if (BLE_INCLUDED==TRUE) 160 {BTTRC_ID_STK_GATT, BTTRC_ID_STK_GATT, GATT_SetTraceLevel, "TRC_GATT", DEFAULT_CONF_TRACE_LEVEL}, 161 {BTTRC_ID_STK_SMP, BTTRC_ID_STK_SMP, SMP_SetTraceLevel, "TRC_SMP", DEFAULT_CONF_TRACE_LEVEL}, 162#endif 163 164 /* LayerIDs for BTA, currently everything maps onto appl_trace_level. 165 */ 166 {BTTRC_ID_BTA_ACC, BTTRC_ID_BTAPP, BTAPP_SetTraceLevel, "TRC_BTAPP", DEFAULT_CONF_TRACE_LEVEL}, 167 {BTTRC_ID_BTA_ACC, BTTRC_ID_BTAPP, BTIF_SetTraceLevel, "TRC_BTIF", DEFAULT_CONF_TRACE_LEVEL}, 168 169 {0, 0, NULL, NULL, DEFAULT_CONF_TRACE_LEVEL} 170}; 171 172static const UINT16 bttrc_map_size = sizeof(bttrc_set_level_map)/sizeof(tBTTRC_FUNC_MAP); 173 174void LogMsg(uint32_t trace_set_mask, const char *fmt_str, ...) { 175 static char buffer[BTE_LOG_BUF_SIZE]; 176 int trace_layer = TRACE_GET_LAYER(trace_set_mask); 177 if (trace_layer >= TRACE_LAYER_MAX_NUM) 178 trace_layer = 0; 179 180 va_list ap; 181 va_start(ap, fmt_str); 182 vsnprintf(&buffer[MSG_BUFFER_OFFSET], BTE_LOG_MAX_SIZE, fmt_str, ap); 183 va_end(ap); 184 185 switch ( TRACE_GET_TYPE(trace_set_mask) ) { 186 case TRACE_TYPE_ERROR: 187 LOGE0(bt_layer_tags[trace_layer], buffer); 188 break; 189 case TRACE_TYPE_WARNING: 190 LOGW0(bt_layer_tags[trace_layer], buffer); 191 break; 192 case TRACE_TYPE_API: 193 case TRACE_TYPE_EVENT: 194 LOGI0(bt_layer_tags[trace_layer], buffer); 195 break; 196 case TRACE_TYPE_DEBUG: 197 LOGD0(bt_layer_tags[trace_layer], buffer); 198 break; 199 default: 200 LOGE0(bt_layer_tags[trace_layer], buffer); /* we should never get this */ 201 break; 202 } 203} 204 205/* this function should go into BTAPP_DM for example */ 206static uint8_t BTAPP_SetTraceLevel(uint8_t new_level) { 207 if (new_level != 0xFF) 208 appl_trace_level = new_level; 209 210 return appl_trace_level; 211} 212 213static uint8_t BTIF_SetTraceLevel(uint8_t new_level) { 214 if (new_level != 0xFF) 215 btif_trace_level = new_level; 216 217 return btif_trace_level; 218} 219 220static uint8_t BTU_SetTraceLevel(uint8_t new_level) { 221 if (new_level != 0xFF) 222 btu_cb.trace_level = new_level; 223 224 return btu_cb.trace_level; 225} 226 227static void load_levels_from_config(const config_t *config) { 228 assert(config != NULL); 229 230 for (tBTTRC_FUNC_MAP *functions = &bttrc_set_level_map[0]; functions->trc_name; ++functions) { 231 LOG_INFO("BTE_InitTraceLevels -- %s", functions->trc_name); 232 int value = config_get_int(config, CONFIG_DEFAULT_SECTION, functions->trc_name, -1); 233 if (value != -1) 234 functions->trace_level = value; 235 236 if (functions->p_f) 237 functions->p_f(functions->trace_level); 238 } 239} 240 241static future_t *init(void) { 242 const stack_config_t *stack_config = stack_config_get_interface(); 243 if (!stack_config->get_trace_config_enabled()) { 244 LOG_INFO("[bttrc] using compile default trace settings"); 245 return NULL; 246 } 247 248 load_levels_from_config(stack_config->get_all()); 249 return NULL; 250} 251 252const module_t bte_logmsg_module = { 253 .name = BTE_LOGMSG_MODULE, 254 .init = init, 255 .start_up = NULL, 256 .shut_down = NULL, 257 .clean_up = NULL, 258 .dependencies = { 259 STACK_CONFIG_MODULE, 260 NULL 261 } 262}; 263