• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef DEFAULT_CONF_TRACE_LEVEL
61 #define DEFAULT_CONF_TRACE_LEVEL BT_TRACE_LEVEL_WARNING
62 #endif
63 
64 #ifndef BTE_LOG_BUF_SIZE
65 #define BTE_LOG_BUF_SIZE 256
66 #endif
67 
68 #define BTE_LOG_MAX_SIZE (BTE_LOG_BUF_SIZE - 12)
69 
70 #define MSG_BUFFER_OFFSET 0
71 
72 /* LayerIDs for BTA, currently everything maps onto appl_trace_level */
73 static const char* const bt_layer_tags[] = {
74     "bt_btif",
75     "bt_usb",
76     "bt_serial",
77     "bt_socket",
78     "bt_rs232",
79     "bt_lc",
80     "bt_lm",
81     "bt_hci",
82     "bt_l2cap",
83     "bt_rfcomm",
84     "bt_sdp",
85     "bt_tcs",
86     "bt_obex",
87     "bt_btm",
88     "bt_gap",
89     "UNUSED",
90     "UNUSED",
91     "bt_icp",
92     "bt_hsp2",
93     "bt_spp",
94     "bt_ctp",
95     "bt_bpp",
96     "bt_hcrp",
97     "bt_ftp",
98     "bt_opp",
99     "bt_btu",
100     "bt_gki_deprecated",
101     "bt_bnep",
102     "bt_pan",
103     "bt_hfp",
104     "bt_hid",
105     "bt_bip",
106     "bt_avp",
107     "bt_a2d",
108     "bt_sap",
109     "bt_amp",
110     "bt_mca_deprecated",
111     "bt_att",
112     "bt_smp",
113     "bt_nfc",
114     "bt_nci",
115     "bt_idep",
116     "bt_ndep",
117     "bt_llcp",
118     "bt_rw",
119     "bt_ce",
120     "bt_snep",
121     "bt_ndef",
122     "bt_nfa",
123 };
124 static uint8_t BTAPP_SetTraceLevel(uint8_t new_level);
125 static uint8_t BTIF_SetTraceLevel(uint8_t new_level);
126 static uint8_t BTU_SetTraceLevel(uint8_t new_level);
127 
128 /* make sure list is order by increasing layer id!!! */
129 static tBTTRC_FUNC_MAP bttrc_set_level_map[] = {
130     {BTTRC_ID_STK_BTU, BTTRC_ID_STK_HCI, BTU_SetTraceLevel, "TRC_HCI",
131      DEFAULT_CONF_TRACE_LEVEL},
132     {BTTRC_ID_STK_L2CAP, BTTRC_ID_STK_L2CAP, L2CA_SetTraceLevel, "TRC_L2CAP",
133      DEFAULT_CONF_TRACE_LEVEL},
134     {BTTRC_ID_STK_RFCOMM, BTTRC_ID_STK_RFCOMM_DATA, PORT_SetTraceLevel,
135      "TRC_RFCOMM", DEFAULT_CONF_TRACE_LEVEL},
136     {BTTRC_ID_STK_AVDT, BTTRC_ID_STK_AVDT, AVDT_SetTraceLevel, "TRC_AVDT",
137      DEFAULT_CONF_TRACE_LEVEL},
138     {BTTRC_ID_STK_AVRC, BTTRC_ID_STK_AVRC, AVRC_SetTraceLevel, "TRC_AVRC",
139      DEFAULT_CONF_TRACE_LEVEL},
140     {BTTRC_ID_STK_A2DP, BTTRC_ID_STK_A2DP, A2DP_SetTraceLevel, "TRC_A2D",
141      DEFAULT_CONF_TRACE_LEVEL},
142 #if (BNEP_INCLUDED == TRUE)
143     {BTTRC_ID_STK_BNEP, BTTRC_ID_STK_BNEP, BNEP_SetTraceLevel, "TRC_BNEP",
144      DEFAULT_CONF_TRACE_LEVEL},
145 #endif
146     {BTTRC_ID_STK_BTM_ACL, BTTRC_ID_STK_BTM_SEC, BTM_SetTraceLevel, "TRC_BTM",
147      DEFAULT_CONF_TRACE_LEVEL},
148 #if (HID_HOST_INCLUDED == TRUE)
149     {BTTRC_ID_STK_HID, BTTRC_ID_STK_HID, HID_HostSetTraceLevel, "TRC_HID_HOST",
150      DEFAULT_CONF_TRACE_LEVEL},
151 #endif
152 #if (PAN_INCLUDED == TRUE)
153     {BTTRC_ID_STK_PAN, BTTRC_ID_STK_PAN, PAN_SetTraceLevel, "TRC_PAN",
154      DEFAULT_CONF_TRACE_LEVEL},
155 #endif
156     {BTTRC_ID_STK_SDP, BTTRC_ID_STK_SDP, SDP_SetTraceLevel, "TRC_SDP",
157      DEFAULT_CONF_TRACE_LEVEL},
158     {BTTRC_ID_STK_SMP, BTTRC_ID_STK_SMP, SMP_SetTraceLevel, "TRC_SMP",
159      DEFAULT_CONF_TRACE_LEVEL},
160 #if (HID_DEV_INCLUDED == TRUE)
161     {BTTRC_ID_STK_HIDD, BTTRC_ID_STK_HIDD, HID_DevSetTraceLevel, "TRC_HID_DEV",
162      DEFAULT_CONF_TRACE_LEVEL},
163 #endif
164 
165     /* LayerIDs for BTA, currently everything maps onto appl_trace_level.
166      */
167     {BTTRC_ID_BTA_ACC, BTTRC_ID_BTAPP, BTAPP_SetTraceLevel, "TRC_BTAPP",
168      DEFAULT_CONF_TRACE_LEVEL},
169     {BTTRC_ID_BTA_ACC, BTTRC_ID_BTAPP, BTIF_SetTraceLevel, "TRC_BTIF",
170      DEFAULT_CONF_TRACE_LEVEL},
171 
172     {0, 0, NULL, NULL, DEFAULT_CONF_TRACE_LEVEL}};
173 
LogMsg(uint32_t trace_set_mask,const char * fmt_str,...)174 void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...) {
175   char buffer[BTE_LOG_BUF_SIZE];
176   int trace_layer = TRACE_GET_LAYER(trace_set_mask);
177   if (trace_layer >= TRACE_LAYER_MAX_NUM) trace_layer = 0;
178 
179   va_list ap;
180   va_start(ap, fmt_str);
181   vsnprintf(&buffer[MSG_BUFFER_OFFSET], BTE_LOG_MAX_SIZE, fmt_str, ap);
182   va_end(ap);
183 
184   switch (TRACE_GET_TYPE(trace_set_mask)) {
185     case TRACE_TYPE_ERROR:
186       LOG_ERROR(bt_layer_tags[trace_layer], "%s", buffer);
187       break;
188     case TRACE_TYPE_WARNING:
189       LOG_WARN(bt_layer_tags[trace_layer], "%s", buffer);
190       break;
191     case TRACE_TYPE_API:
192     case TRACE_TYPE_EVENT:
193       LOG_INFO(bt_layer_tags[trace_layer], "%s", buffer);
194       break;
195     case TRACE_TYPE_DEBUG:
196       LOG_DEBUG(bt_layer_tags[trace_layer], "%s", buffer);
197       break;
198     default:
199       /* we should never get this */
200       LOG_ERROR(bt_layer_tags[trace_layer], "!BAD TRACE TYPE! %s", buffer);
201       CHECK(TRACE_GET_TYPE(trace_set_mask) == TRACE_TYPE_ERROR);
202       break;
203   }
204 }
205 
206 /* this function should go into BTAPP_DM for example */
BTAPP_SetTraceLevel(uint8_t new_level)207 static uint8_t BTAPP_SetTraceLevel(uint8_t new_level) {
208   if (new_level != 0xFF) appl_trace_level = new_level;
209 
210   return appl_trace_level;
211 }
212 
BTIF_SetTraceLevel(uint8_t new_level)213 static uint8_t BTIF_SetTraceLevel(uint8_t new_level) {
214   if (new_level != 0xFF) btif_trace_level = new_level;
215 
216   return btif_trace_level;
217 }
218 
BTU_SetTraceLevel(uint8_t new_level)219 static uint8_t BTU_SetTraceLevel(uint8_t new_level) {
220   if (new_level != 0xFF) btu_trace_level = new_level;
221 
222   return btu_trace_level;
223 }
224 
load_levels_from_config(const config_t * config)225 static void load_levels_from_config(const config_t* config) {
226   CHECK(config != NULL);
227 
228   for (tBTTRC_FUNC_MAP* functions = &bttrc_set_level_map[0];
229        functions->trc_name; ++functions) {
230     int value = config_get_int(*config, CONFIG_DEFAULT_SECTION,
231                                functions->trc_name, -1);
232     if (value != -1) functions->trace_level = value;
233     LOG_INFO(LOG_TAG, "BTE_InitTraceLevels -- %s : Level %d",
234              functions->trc_name, functions->trace_level);
235     if (functions->p_f) functions->p_f(functions->trace_level);
236   }
237 }
238 
init(void)239 static future_t* init(void) {
240   const stack_config_t* stack_config = stack_config_get_interface();
241   if (!stack_config->get_trace_config_enabled()) {
242     LOG_INFO(LOG_TAG, "using compile default trace settings");
243     return NULL;
244   }
245 
246   init_cpp_logging(stack_config->get_all());
247 
248   load_levels_from_config(stack_config->get_all());
249   return NULL;
250 }
251 
252 EXPORT_SYMBOL extern const 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 = {STACK_CONFIG_MODULE, NULL}};
259