1 /*
2 * Copyright (c) 2018, The OpenThread Authors.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. Neither the name of the copyright holder nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 /**
30 * @file
31 * This file implements the OpenThread logging related APIs.
32 */
33
34 #include "openthread-core-config.h"
35
36 #include "instance/instance.hpp"
37
38 using namespace ot;
39
otLoggingGetLevel(void)40 otLogLevel otLoggingGetLevel(void) { return static_cast<otLogLevel>(Instance::GetLogLevel()); }
41
42 #if OPENTHREAD_CONFIG_LOG_LEVEL_DYNAMIC_ENABLE
otLoggingSetLevel(otLogLevel aLogLevel)43 otError otLoggingSetLevel(otLogLevel aLogLevel)
44 {
45 Error error = kErrorNone;
46
47 VerifyOrExit(aLogLevel <= kLogLevelDebg && aLogLevel >= kLogLevelNone, error = kErrorInvalidArgs);
48 Instance::SetLogLevel(static_cast<LogLevel>(aLogLevel));
49
50 exit:
51 return error;
52 }
53 #endif
54
55 static const char kPlatformModuleName[] = "Platform";
56
otLogCritPlat(const char * aFormat,...)57 void otLogCritPlat(const char *aFormat, ...)
58 {
59 #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_CRIT) && OPENTHREAD_CONFIG_LOG_PLATFORM
60 va_list args;
61
62 va_start(args, aFormat);
63 Logger::LogVarArgs(kPlatformModuleName, kLogLevelCrit, aFormat, args);
64 va_end(args);
65 #else
66 OT_UNUSED_VARIABLE(aFormat);
67 OT_UNUSED_VARIABLE(kPlatformModuleName);
68 #endif
69 }
70
otLogWarnPlat(const char * aFormat,...)71 void otLogWarnPlat(const char *aFormat, ...)
72 {
73 #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_WARN) && OPENTHREAD_CONFIG_LOG_PLATFORM
74 va_list args;
75
76 va_start(args, aFormat);
77 Logger::LogVarArgs(kPlatformModuleName, kLogLevelWarn, aFormat, args);
78 va_end(args);
79 #else
80 OT_UNUSED_VARIABLE(aFormat);
81 #endif
82 }
83
otLogNotePlat(const char * aFormat,...)84 void otLogNotePlat(const char *aFormat, ...)
85 {
86 #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_NOTE) && OPENTHREAD_CONFIG_LOG_PLATFORM
87 va_list args;
88
89 va_start(args, aFormat);
90 Logger::LogVarArgs(kPlatformModuleName, kLogLevelNote, aFormat, args);
91 va_end(args);
92 #else
93 OT_UNUSED_VARIABLE(aFormat);
94 #endif
95 }
96
otLogInfoPlat(const char * aFormat,...)97 void otLogInfoPlat(const char *aFormat, ...)
98 {
99 #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_INFO) && OPENTHREAD_CONFIG_LOG_PLATFORM
100 va_list args;
101
102 va_start(args, aFormat);
103 Logger::LogVarArgs(kPlatformModuleName, kLogLevelInfo, aFormat, args);
104 va_end(args);
105 #else
106 OT_UNUSED_VARIABLE(aFormat);
107 #endif
108 }
109
otLogDebgPlat(const char * aFormat,...)110 void otLogDebgPlat(const char *aFormat, ...)
111 {
112 #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_DEBG) && OPENTHREAD_CONFIG_LOG_PLATFORM
113 va_list args;
114
115 va_start(args, aFormat);
116 Logger::LogVarArgs(kPlatformModuleName, kLogLevelDebg, aFormat, args);
117 va_end(args);
118 #else
119 OT_UNUSED_VARIABLE(aFormat);
120 #endif
121 }
122
otDumpCritPlat(const char * aText,const void * aData,uint16_t aDataLength)123 void otDumpCritPlat(const char *aText, const void *aData, uint16_t aDataLength)
124 {
125 #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_CRIT) && OPENTHREAD_CONFIG_LOG_PLATFORM && OPENTHREAD_CONFIG_LOG_PKT_DUMP
126 Logger::DumpInModule(kPlatformModuleName, kLogLevelCrit, aText, aData, aDataLength);
127 #else
128 OT_UNUSED_VARIABLE(aText);
129 OT_UNUSED_VARIABLE(aData);
130 OT_UNUSED_VARIABLE(aDataLength);
131 #endif
132 }
133
otDumpWarnPlat(const char * aText,const void * aData,uint16_t aDataLength)134 void otDumpWarnPlat(const char *aText, const void *aData, uint16_t aDataLength)
135 {
136 #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_WARN) && OPENTHREAD_CONFIG_LOG_PLATFORM && OPENTHREAD_CONFIG_LOG_PKT_DUMP
137 Logger::DumpInModule(kPlatformModuleName, kLogLevelWarn, aText, aData, aDataLength);
138 #else
139 OT_UNUSED_VARIABLE(aText);
140 OT_UNUSED_VARIABLE(aData);
141 OT_UNUSED_VARIABLE(aDataLength);
142 #endif
143 }
144
otDumpNotePlat(const char * aText,const void * aData,uint16_t aDataLength)145 void otDumpNotePlat(const char *aText, const void *aData, uint16_t aDataLength)
146 {
147 #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_NOTE) && OPENTHREAD_CONFIG_LOG_PLATFORM && OPENTHREAD_CONFIG_LOG_PKT_DUMP
148 Logger::DumpInModule(kPlatformModuleName, kLogLevelNote, aText, aData, aDataLength);
149 #else
150 OT_UNUSED_VARIABLE(aText);
151 OT_UNUSED_VARIABLE(aData);
152 OT_UNUSED_VARIABLE(aDataLength);
153 #endif
154 }
155
otDumpInfoPlat(const char * aText,const void * aData,uint16_t aDataLength)156 void otDumpInfoPlat(const char *aText, const void *aData, uint16_t aDataLength)
157 {
158 #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_INFO) && OPENTHREAD_CONFIG_LOG_PLATFORM && OPENTHREAD_CONFIG_LOG_PKT_DUMP
159 Logger::DumpInModule(kPlatformModuleName, kLogLevelInfo, aText, aData, aDataLength);
160 #else
161 OT_UNUSED_VARIABLE(aText);
162 OT_UNUSED_VARIABLE(aData);
163 OT_UNUSED_VARIABLE(aDataLength);
164 #endif
165 }
166
otDumpDebgPlat(const char * aText,const void * aData,uint16_t aDataLength)167 void otDumpDebgPlat(const char *aText, const void *aData, uint16_t aDataLength)
168 {
169 #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_DEBG) && OPENTHREAD_CONFIG_LOG_PLATFORM && OPENTHREAD_CONFIG_LOG_PKT_DUMP
170 Logger::DumpInModule(kPlatformModuleName, kLogLevelDebg, aText, aData, aDataLength);
171 #else
172 OT_UNUSED_VARIABLE(aText);
173 OT_UNUSED_VARIABLE(aData);
174 OT_UNUSED_VARIABLE(aDataLength);
175 #endif
176 }
177
otLogPlat(otLogLevel aLogLevel,const char * aPlatModuleName,const char * aFormat,...)178 void otLogPlat(otLogLevel aLogLevel, const char *aPlatModuleName, const char *aFormat, ...)
179 {
180 #if OPENTHREAD_CONFIG_LOG_PLATFORM
181 va_list args;
182
183 va_start(args, aFormat);
184 otLogPlatArgs(aLogLevel, aPlatModuleName, aFormat, args);
185 va_end(args);
186 #else
187 OT_UNUSED_VARIABLE(aLogLevel);
188 OT_UNUSED_VARIABLE(aPlatModuleName);
189 OT_UNUSED_VARIABLE(aFormat);
190 #endif
191 }
192
otLogPlatArgs(otLogLevel aLogLevel,const char * aPlatModuleName,const char * aFormat,va_list aArgs)193 void otLogPlatArgs(otLogLevel aLogLevel, const char *aPlatModuleName, const char *aFormat, va_list aArgs)
194 {
195 #if OT_SHOULD_LOG && OPENTHREAD_CONFIG_LOG_PLATFORM
196 String<kMaxLogModuleNameLength> moduleName;
197
198 OT_ASSERT(aLogLevel >= kLogLevelNone && aLogLevel <= kLogLevelDebg);
199
200 moduleName.Append("P-%s", aPlatModuleName);
201 Logger::LogVarArgs(moduleName.AsCString(), static_cast<LogLevel>(aLogLevel), aFormat, aArgs);
202 #else
203 OT_UNUSED_VARIABLE(aLogLevel);
204 OT_UNUSED_VARIABLE(aPlatModuleName);
205 OT_UNUSED_VARIABLE(aFormat);
206 OT_UNUSED_VARIABLE(aArgs);
207 #endif
208 }
209
otLogCli(otLogLevel aLogLevel,const char * aFormat,...)210 void otLogCli(otLogLevel aLogLevel, const char *aFormat, ...)
211 {
212 #if OT_SHOULD_LOG && OPENTHREAD_CONFIG_LOG_CLI
213 static const char kCliModuleName[] = "Cli";
214
215 va_list args;
216
217 OT_ASSERT(aLogLevel >= kLogLevelNone && aLogLevel <= kLogLevelDebg);
218 VerifyOrExit(aLogLevel >= kLogLevelNone && aLogLevel <= kLogLevelDebg);
219
220 va_start(args, aFormat);
221 Logger::LogVarArgs(kCliModuleName, static_cast<LogLevel>(aLogLevel), aFormat, args);
222 va_end(args);
223 exit:
224 #else
225 OT_UNUSED_VARIABLE(aLogLevel);
226 OT_UNUSED_VARIABLE(aFormat);
227 #endif
228 return;
229 }
230
otLogGenerateNextHexDumpLine(otLogHexDumpInfo * aInfo)231 otError otLogGenerateNextHexDumpLine(otLogHexDumpInfo *aInfo)
232 {
233 AssertPointerIsNotNull(aInfo);
234
235 return GenerateNextHexDumpLine(*aInfo);
236 }
237