1 /******************************************************************************
2 *
3 * Copyright 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 #define LOG_TAG "bt_bte"
20
21 #include <base/logging.h>
22 #include <stdarg.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <sys/time.h>
27 #include <time.h>
28
29 #include "avrc_api.h"
30 #include "bt_common.h"
31 #include "bta_api.h"
32 #include "bte.h"
33 #include "btm_api.h"
34 #include "btu.h"
35 #include "l2c_api.h"
36 #include "main_int.h"
37 #include "osi/include/config.h"
38 #include "osi/include/log.h"
39 #include "port_api.h"
40 #include "sdp_api.h"
41 #include "stack_config.h"
42
43 #include "avdt_api.h"
44 #include "a2dp_api.h"
45 #if (BNEP_INCLUDED == TRUE)
46 #include "bnep_api.h"
47 #endif
48 #if (PAN_INCLUDED == TRUE)
49 #include "pan_api.h"
50 #endif
51 #if (HID_HOST_INCLUDED == TRUE)
52 #include "hidh_api.h"
53 #endif
54 #if (HID_DEV_INCLUDED == TRUE)
55 #include "hidd_api.h"
56 #endif
57
58 #include "smp_api.h"
59
60 #include "gd/common/init_flags.h"
61
62 #ifndef DEFAULT_CONF_TRACE_LEVEL
63 #define DEFAULT_CONF_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
64 #endif
65
66 #ifndef BTE_LOG_BUF_SIZE
67 #define BTE_LOG_BUF_SIZE 256
68 #endif
69
70 #define BTE_LOG_MAX_SIZE (BTE_LOG_BUF_SIZE - 12)
71
72 #define MSG_BUFFER_OFFSET 0
73
74 /* LayerIDs for BTA, currently everything maps onto appl_trace_level */
75 static const char* const bt_layer_tags[] = {
76 "bt_btif",
77 "bt_usb",
78 "bt_serial",
79 "bt_socket",
80 "bt_rs232",
81 "bt_lc",
82 "bt_lm",
83 "bt_hci",
84 "bt_l2cap",
85 "bt_rfcomm",
86 "bt_sdp",
87 "bt_tcs",
88 "bt_obex",
89 "bt_btm",
90 "bt_gap",
91 "UNUSED",
92 "UNUSED",
93 "bt_icp",
94 "bt_hsp2",
95 "bt_spp",
96 "bt_ctp",
97 "bt_bpp",
98 "bt_hcrp",
99 "bt_ftp",
100 "bt_opp",
101 "bt_btu",
102 "bt_gki_deprecated",
103 "bt_bnep",
104 "bt_pan",
105 "bt_hfp",
106 "bt_hid",
107 "bt_bip",
108 "bt_avp",
109 "bt_a2d",
110 "bt_sap",
111 "bt_amp",
112 "bt_mca_deprecated",
113 "bt_att",
114 "bt_smp",
115 "bt_nfc",
116 "bt_nci",
117 "bt_idep",
118 "bt_ndep",
119 "bt_llcp",
120 "bt_rw",
121 "bt_ce",
122 "bt_snep",
123 "bt_ndef",
124 "bt_nfa",
125 };
126 static uint8_t BTAPP_SetTraceLevel(uint8_t new_level);
127 static uint8_t BTIF_SetTraceLevel(uint8_t new_level);
128 static uint8_t BTU_SetTraceLevel(uint8_t new_level);
129
130 /* make sure list is order by increasing layer id!!! */
131 static tBTTRC_FUNC_MAP bttrc_set_level_map[] = {
132 {BTTRC_ID_STK_BTU, BTTRC_ID_STK_HCI, BTU_SetTraceLevel, "TRC_HCI",
133 DEFAULT_CONF_TRACE_LEVEL},
134 {BTTRC_ID_STK_L2CAP, BTTRC_ID_STK_L2CAP, L2CA_SetTraceLevel, "TRC_L2CAP",
135 DEFAULT_CONF_TRACE_LEVEL},
136 {BTTRC_ID_STK_RFCOMM, BTTRC_ID_STK_RFCOMM_DATA, PORT_SetTraceLevel,
137 "TRC_RFCOMM", DEFAULT_CONF_TRACE_LEVEL},
138 {BTTRC_ID_STK_AVDT, BTTRC_ID_STK_AVDT, AVDT_SetTraceLevel, "TRC_AVDT",
139 DEFAULT_CONF_TRACE_LEVEL},
140 {BTTRC_ID_STK_AVRC, BTTRC_ID_STK_AVRC, AVRC_SetTraceLevel, "TRC_AVRC",
141 DEFAULT_CONF_TRACE_LEVEL},
142 {BTTRC_ID_STK_A2DP, BTTRC_ID_STK_A2DP, A2DP_SetTraceLevel, "TRC_A2D",
143 DEFAULT_CONF_TRACE_LEVEL},
144 #if (BNEP_INCLUDED == TRUE)
145 {BTTRC_ID_STK_BNEP, BTTRC_ID_STK_BNEP, BNEP_SetTraceLevel, "TRC_BNEP",
146 DEFAULT_CONF_TRACE_LEVEL},
147 #endif
148 {BTTRC_ID_STK_BTM_ACL, BTTRC_ID_STK_BTM_SEC, BTM_SetTraceLevel, "TRC_BTM",
149 DEFAULT_CONF_TRACE_LEVEL},
150 #if (HID_HOST_INCLUDED == TRUE)
151 {BTTRC_ID_STK_HID, BTTRC_ID_STK_HID, HID_HostSetTraceLevel, "TRC_HID_HOST",
152 DEFAULT_CONF_TRACE_LEVEL},
153 #endif
154 #if (PAN_INCLUDED == TRUE)
155 {BTTRC_ID_STK_PAN, BTTRC_ID_STK_PAN, PAN_SetTraceLevel, "TRC_PAN",
156 DEFAULT_CONF_TRACE_LEVEL},
157 #endif
158 {BTTRC_ID_STK_SDP, BTTRC_ID_STK_SDP, SDP_SetTraceLevel, "TRC_SDP",
159 DEFAULT_CONF_TRACE_LEVEL},
160 {BTTRC_ID_STK_SMP, BTTRC_ID_STK_SMP, SMP_SetTraceLevel, "TRC_SMP",
161 DEFAULT_CONF_TRACE_LEVEL},
162 #if (HID_DEV_INCLUDED == TRUE)
163 {BTTRC_ID_STK_HIDD, BTTRC_ID_STK_HIDD, HID_DevSetTraceLevel, "TRC_HID_DEV",
164 DEFAULT_CONF_TRACE_LEVEL},
165 #endif
166
167 /* LayerIDs for BTA, currently everything maps onto appl_trace_level.
168 */
169 {BTTRC_ID_BTA_ACC, BTTRC_ID_BTAPP, BTAPP_SetTraceLevel, "TRC_BTAPP",
170 DEFAULT_CONF_TRACE_LEVEL},
171 {BTTRC_ID_BTA_ACC, BTTRC_ID_BTAPP, BTIF_SetTraceLevel, "TRC_BTIF",
172 DEFAULT_CONF_TRACE_LEVEL},
173
174 {0, 0, NULL, NULL, DEFAULT_CONF_TRACE_LEVEL}};
175
LogMsg(uint32_t trace_set_mask,const char * fmt_str,...)176 void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...) {
177 char buffer[BTE_LOG_BUF_SIZE];
178 int trace_layer = TRACE_GET_LAYER(trace_set_mask);
179 if (trace_layer >= TRACE_LAYER_MAX_NUM) trace_layer = 0;
180
181 va_list ap;
182 va_start(ap, fmt_str);
183 vsnprintf(&buffer[MSG_BUFFER_OFFSET], BTE_LOG_MAX_SIZE, fmt_str, ap);
184 va_end(ap);
185
186 #undef LOG_TAG
187 #define LOG_TAG bt_layer_tags[trace_layer]
188
189 switch (TRACE_GET_TYPE(trace_set_mask)) {
190 case TRACE_TYPE_ERROR:
191 LOG_ERROR("%s", buffer);
192 break;
193 case TRACE_TYPE_WARNING:
194 LOG_WARN("%s", buffer);
195 break;
196 case TRACE_TYPE_API:
197 case TRACE_TYPE_EVENT:
198 LOG_INFO("%s", buffer);
199 break;
200 case TRACE_TYPE_DEBUG:
201 LOG_INFO("%s", buffer);
202 break;
203 default:
204 /* we should never get this */
205 LOG_ERROR("!BAD TRACE TYPE! %s", buffer);
206 CHECK(TRACE_GET_TYPE(trace_set_mask) == TRACE_TYPE_ERROR);
207 break;
208 }
209 #undef LOG_TAG
210 #define LOG_TAG "bt_bte"
211 }
212
213 /* this function should go into BTAPP_DM for example */
BTAPP_SetTraceLevel(uint8_t new_level)214 static uint8_t BTAPP_SetTraceLevel(uint8_t new_level) {
215 if (new_level != 0xFF) appl_trace_level = new_level;
216
217 return appl_trace_level;
218 }
219
BTIF_SetTraceLevel(uint8_t new_level)220 static uint8_t BTIF_SetTraceLevel(uint8_t new_level) {
221 if (new_level != 0xFF) btif_trace_level = new_level;
222
223 return btif_trace_level;
224 }
225
BTU_SetTraceLevel(uint8_t new_level)226 static uint8_t BTU_SetTraceLevel(uint8_t new_level) {
227 if (new_level != 0xFF) btu_trace_level = new_level;
228
229 return btu_trace_level;
230 }
231
load_levels_from_config(const config_t * config)232 static void load_levels_from_config(const config_t* config) {
233 CHECK(config != NULL);
234
235 for (tBTTRC_FUNC_MAP* functions = &bttrc_set_level_map[0];
236 functions->trc_name; ++functions) {
237 int value = config_get_int(*config, CONFIG_DEFAULT_SECTION,
238 functions->trc_name, -1);
239 if (value != -1) {
240 functions->trace_level = value;
241 }
242 if (bluetooth::common::InitFlags::IsDebugLoggingEnabledForAll()) {
243 LOG_INFO("Enable logging for %s because all debug logs are enabled",
244 functions->trc_name);
245 functions->trace_level = BT_TRACE_LEVEL_VERBOSE;
246 }
247 LOG_INFO("BTE_InitTraceLevels -- %s : Level %d", functions->trc_name,
248 functions->trace_level);
249 if (functions->p_f) functions->p_f(functions->trace_level);
250 }
251 }
252
init(void)253 static future_t* init(void) {
254 const stack_config_t* stack_config = stack_config_get_interface();
255 if (!stack_config->get_trace_config_enabled()) {
256 LOG_INFO("using compile default trace settings");
257 return NULL;
258 }
259
260 init_cpp_logging(stack_config->get_all());
261
262 load_levels_from_config(stack_config->get_all());
263 return NULL;
264 }
265
266 EXPORT_SYMBOL extern const module_t bte_logmsg_module = {
267 .name = BTE_LOGMSG_MODULE,
268 .init = init,
269 .start_up = NULL,
270 .shut_down = NULL,
271 .clean_up = NULL,
272 .dependencies = {STACK_CONFIG_MODULE, NULL}};
273