xref: /NextBSD/contrib/ofed/management/opensm/include/opensm/osm_log.h (revision eb1a5f8de9f7ea602c373a710f531abbf81141c4)
1 /*
2  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
3  * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved.
4  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5  *
6  * This software is available to you under a choice of one of two
7  * licenses.  You may choose to be licensed under the terms of the GNU
8  * General Public License (GPL) Version 2, available from the file
9  * COPYING in the main directory of this source tree, or the
10  * OpenIB.org BSD license below:
11  *
12  *     Redistribution and use in source and binary forms, with or
13  *     without modification, are permitted provided that the following
14  *     conditions are met:
15  *
16  *      - Redistributions of source code must retain the above
17  *        copyright notice, this list of conditions and the following
18  *        disclaimer.
19  *
20  *      - Redistributions in binary form must reproduce the above
21  *        copyright notice, this list of conditions and the following
22  *        disclaimer in the documentation and/or other materials
23  *        provided with the distribution.
24  *
25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32  * SOFTWARE.
33  *
34  */
35 
36 /*
37  * Abstract:
38  * 	Declaration of osm_log_t.
39  *	This object represents the log file.
40  *	This object is part of the OpenSM family of objects.
41  */
42 
43 #ifndef _OSM_LOG_H_
44 #define _OSM_LOG_H_
45 
46 #ifndef __WIN__
47 #include <syslog.h>
48 #endif
49 #include <complib/cl_spinlock.h>
50 #include <opensm/osm_base.h>
51 #include <iba/ib_types.h>
52 #include <stdio.h>
53 
54 #ifdef __GNUC__
55 #define STRICT_OSM_LOG_FORMAT __attribute__((format(printf, 3, 4)))
56 #else
57 #define STRICT_OSM_LOG_FORMAT
58 #endif
59 
60 #ifdef __cplusplus
61 #  define BEGIN_C_DECLS extern "C" {
62 #  define END_C_DECLS   }
63 #else				/* !__cplusplus */
64 #  define BEGIN_C_DECLS
65 #  define END_C_DECLS
66 #endif				/* __cplusplus */
67 
68 BEGIN_C_DECLS
69 #define LOG_ENTRY_SIZE_MAX		4096
70 #define BUF_SIZE			LOG_ENTRY_SIZE_MAX
71 #define __func__ __FUNCTION__
72 #define OSM_LOG_ENTER( OSM_LOG_PTR ) \
73 	osm_log( OSM_LOG_PTR, OSM_LOG_FUNCS, \
74 		 "%s: [\n", __func__);
75 #define OSM_LOG_EXIT( OSM_LOG_PTR ) \
76 	osm_log( OSM_LOG_PTR, OSM_LOG_FUNCS, \
77 		 "%s: ]\n", __func__);
78 /****h* OpenSM/Log
79 * NAME
80 *	Log
81 *
82 * DESCRIPTION
83 *
84 * AUTHOR
85 *
86 *********/
87 typedef uint8_t osm_log_level_t;
88 
89 #define OSM_LOG_NONE	0x00
90 #define OSM_LOG_ERROR	0x01
91 #define OSM_LOG_INFO	0x02
92 #define OSM_LOG_VERBOSE	0x04
93 #define OSM_LOG_DEBUG	0x08
94 #define OSM_LOG_FUNCS	0x10
95 #define OSM_LOG_FRAMES	0x20
96 #define OSM_LOG_ROUTING	0x40
97 #define OSM_LOG_ALL	0x7f
98 #define OSM_LOG_SYS	0x80
99 
100 /*
101 	DEFAULT - turn on ERROR and INFO only
102 */
103 #define OSM_LOG_DEFAULT_LEVEL		OSM_LOG_ERROR | OSM_LOG_INFO
104 
105 /****s* OpenSM: MAD Wrapper/osm_log_t
106 * NAME
107 *	osm_log_t
108 *
109 * DESCRIPTION
110 *
111 * SYNOPSIS
112 */
113 typedef struct osm_log {
114 	osm_log_level_t level;
115 	cl_spinlock_t lock;
116 	unsigned long count;
117 	unsigned long max_size;
118 	boolean_t flush;
119 	FILE *out_port;
120 	boolean_t accum_log_file;
121 	boolean_t daemon;
122 	char *log_file_name;
123 } osm_log_t;
124 /*********/
125 
126 /****f* OpenSM: Log/osm_log_construct
127 * NAME
128 *	osm_log_construct
129 *
130 * DESCRIPTION
131 *	This function constructs a Log object.
132 *
133 * SYNOPSIS
134 */
osm_log_construct(IN osm_log_t * const p_log)135 static inline void osm_log_construct(IN osm_log_t * const p_log)
136 {
137 	cl_spinlock_construct(&p_log->lock);
138 }
139 
140 /*
141 * PARAMETERS
142 *	p_log
143 *		[in] Pointer to a Log object to construct.
144 *
145 * RETURN VALUE
146 *	This function does not return a value.
147 *
148 * NOTES
149 *	Allows calling osm_log_init, osm_log_init_v2, osm_log_destroy
150 *
151 *	Calling osm_log_construct is a prerequisite to calling any other
152 *	method except osm_log_init or osm_log_init_v2.
153 *
154 * SEE ALSO
155 *	Log object, osm_log_init, osm_log_init_v2,
156 *	osm_log_destroy
157 *********/
158 
159 /****f* OpenSM: Log/osm_log_destroy
160 * NAME
161 *	osm_log_destroy
162 *
163 * DESCRIPTION
164 *	The osm_log_destroy function destroys the object, releasing
165 *	all resources.
166 *
167 * SYNOPSIS
168 */
osm_log_destroy(IN osm_log_t * const p_log)169 static inline void osm_log_destroy(IN osm_log_t * const p_log)
170 {
171 	cl_spinlock_destroy(&p_log->lock);
172 	if (p_log->out_port != stdout) {
173 		fclose(p_log->out_port);
174 		p_log->out_port = stdout;
175 	}
176 	closelog();
177 }
178 
179 /*
180 * PARAMETERS
181 *	p_log
182 *		[in] Pointer to the object to destroy.
183 *
184 * RETURN VALUE
185 *	This function does not return a value.
186 *
187 * NOTES
188 *	Performs any necessary cleanup of the specified
189 *	Log object.
190 *	Further operations should not be attempted on the destroyed object.
191 *	This function should only be called after a call to
192 *	osm_log_construct, osm_log_init, or osm_log_init_v2.
193 *
194 * SEE ALSO
195 *	Log object, osm_log_construct,
196 *	osm_log_init, osm_log_init_v2
197 *********/
198 
199 /****f* OpenSM: Log/osm_log_init_v2
200 * NAME
201 *	osm_log_init_v2
202 *
203 * DESCRIPTION
204 *	The osm_log_init_v2 function initializes a
205 *	Log object for use.
206 *
207 * SYNOPSIS
208 */
209 ib_api_status_t
210 osm_log_init_v2(IN osm_log_t * const p_log,
211 		IN const boolean_t flush,
212 		IN const uint8_t log_flags,
213 		IN const char *log_file,
214 		IN const unsigned long max_size,
215 		IN const boolean_t accum_log_file);
216 /*
217 * PARAMETERS
218 *	p_log
219 *		[in] Pointer to the log object.
220 *
221 *	flush
222 *		[in] Set to TRUE directs the log to flush all log messages
223 *		immediately.  This severely degrades log performance,
224 *		and is normally used for debugging only.
225 *
226 *	log_flags
227 *		[in] The log verbosity level to be used.
228 *
229 *	log_file
230 *		[in] if not NULL defines the name of the log file. Otherwise
231 *		it is stdout.
232 *
233 * RETURN VALUES
234 *	CL_SUCCESS if the Log object was initialized
235 *	successfully.
236 *
237 * NOTES
238 *	Allows calling other Log methods.
239 *
240 * SEE ALSO
241 *	Log object, osm_log_construct,
242 *	osm_log_destroy
243 *********/
244 
245 /****f* OpenSM: Log/osm_log_reopen_file
246 * NAME
247 *	osm_log_reopen_file
248 *
249 * DESCRIPTION
250 *	The osm_log_reopen_file function reopens the log file
251 *
252 * SYNOPSIS
253 */
254 int osm_log_reopen_file(osm_log_t * p_log);
255 /*
256 * PARAMETERS
257 *	p_log
258 *		[in] Pointer to the log object.
259 *
260 * RETURN VALUES
261 *	0 on success or nonzero value otherwise.
262 *********/
263 
264 /****f* OpenSM: Log/osm_log_init
265 * NAME
266 *	osm_log_init
267 *
268 * DESCRIPTION
269 *	The osm_log_init function initializes a
270 *	Log object for use. It is a wrapper for osm_log_init_v2().
271 *
272 * SYNOPSIS
273 */
274 ib_api_status_t
275 osm_log_init(IN osm_log_t * const p_log,
276 	     IN const boolean_t flush,
277 	     IN const uint8_t log_flags,
278 	     IN const char *log_file, IN const boolean_t accum_log_file);
279 /*
280  * Same as osm_log_init_v2() but without max_size parameter
281  */
282 
283 void
284 osm_log(IN osm_log_t * const p_log,
285 	IN const osm_log_level_t verbosity,
286 	IN const char *p_str, ...) STRICT_OSM_LOG_FORMAT;
287 
288 /****f* OpenSM: Log/osm_log_get_level
289 * NAME
290 *	osm_log_get_level
291 *
292 * DESCRIPTION
293 *	Returns the current log level.
294 *
295 * SYNOPSIS
296 */
297 static inline osm_log_level_t
osm_log_get_level(IN const osm_log_t * const p_log)298 osm_log_get_level(IN const osm_log_t * const p_log)
299 {
300 	return (p_log->level);
301 }
302 
303 /*
304 * PARAMETERS
305 *	p_log
306 *		[in] Pointer to the log object.
307 *
308 * RETURN VALUES
309 *	Returns the current log level.
310 *
311 * NOTES
312 *
313 * SEE ALSO
314 *	Log object, osm_log_construct,
315 *	osm_log_destroy
316 *********/
317 
318 /****f* OpenSM: Log/osm_log_set_level
319 * NAME
320 *	osm_log_set_level
321 *
322 * DESCRIPTION
323 *	Sets the current log level.
324 *
325 * SYNOPSIS
326 */
327 static inline void
osm_log_set_level(IN osm_log_t * const p_log,IN const osm_log_level_t level)328 osm_log_set_level(IN osm_log_t * const p_log, IN const osm_log_level_t level)
329 {
330 	p_log->level = level;
331 	osm_log(p_log, OSM_LOG_ALL, "Setting log level to: 0x%02x\n", level);
332 }
333 
334 /*
335 * PARAMETERS
336 *	p_log
337 *		[in] Pointer to the log object.
338 *
339 *	level
340 *		[in] New level to set.
341 *
342 * RETURN VALUES
343 *	Returns the current log level.
344 *
345 * NOTES
346 *
347 * SEE ALSO
348 *	Log object, osm_log_construct,
349 *	osm_log_destroy
350 *********/
351 
352 /****f* OpenSM: Log/osm_log_is_active
353 * NAME
354 *	osm_log_is_active
355 *
356 * DESCRIPTION
357 *	Returns TRUE if the specified log level would be logged.
358 *	FALSE otherwise.
359 *
360 * SYNOPSIS
361 */
362 static inline boolean_t
osm_log_is_active(IN const osm_log_t * const p_log,IN const osm_log_level_t level)363 osm_log_is_active(IN const osm_log_t * const p_log,
364 		  IN const osm_log_level_t level)
365 {
366 	return ((p_log->level & level) != 0);
367 }
368 
369 /*
370 * PARAMETERS
371 *	p_log
372 *		[in] Pointer to the log object.
373 *
374 *	level
375 *		[in] Level to check.
376 *
377 * RETURN VALUES
378 *	Returns TRUE if the specified log level would be logged.
379 *	FALSE otherwise.
380 *
381 * NOTES
382 *
383 * SEE ALSO
384 *	Log object, osm_log_construct,
385 *	osm_log_destroy
386 *********/
387 
388 extern void osm_log_msg_box(osm_log_t *log, osm_log_level_t level,
389 			    const char *func_name, const char *msg);
390 extern void osm_log_raw(IN osm_log_t * const p_log,
391 	    IN const osm_log_level_t verbosity, IN const char *p_buf);
392 
393 #define OSM_LOG(log, level, fmt, arg...) do { \
394 		if (osm_log_is_active(log, (level))) \
395 			osm_log(log, level, "%s: " fmt, __func__, ##arg); \
396 	} while (0)
397 
398 #define OSM_LOG_MSG_BOX(log, level, msg) \
399 		osm_log_msg_box(log, level, __func__, msg)
400 
401 #define DBG_CL_LOCK 0
402 
403 #define CL_PLOCK_EXCL_ACQUIRE( __exp__ )  \
404 {											    		\
405    if (DBG_CL_LOCK)                      \
406      printf("cl_plock_excl_acquire: Acquiring %p file %s, line %d\n", \
407           __exp__,__FILE__, __LINE__);            \
408    cl_plock_excl_acquire( __exp__ );      \
409    if (DBG_CL_LOCK)                      \
410      printf("cl_plock_excl_acquire: Acquired %p file %s, line %d\n", \
411           __exp__,__FILE__, __LINE__);            \
412 }
413 
414 #define CL_PLOCK_ACQUIRE( __exp__ )  \
415 {											    		\
416    if (DBG_CL_LOCK)                      \
417      printf("cl_plock_acquire: Acquiring %p file %s, line %d\n", \
418           __exp__,__FILE__, __LINE__);            \
419    cl_plock_acquire( __exp__ );      \
420    if (DBG_CL_LOCK)                      \
421      printf("cl_plock_acquire: Acquired %p file %s, line %d\n", \
422           __exp__,__FILE__, __LINE__);            \
423 }
424 
425 #define CL_PLOCK_RELEASE( __exp__ )  \
426 {											    		\
427    if (DBG_CL_LOCK)                      \
428      printf("cl_plock_release: Releasing %p file %s, line %d\n", \
429           __exp__,__FILE__, __LINE__);            \
430    cl_plock_release( __exp__ );      \
431    if (DBG_CL_LOCK)                      \
432      printf("cl_plock_release: Released  %p file %s, line %d\n", \
433           __exp__,__FILE__, __LINE__);            \
434 }
435 
436 #define DBG_CL_SPINLOCK 0
437 #define CL_SPINLOCK_RELEASE( __exp__ )  \
438 {											    		\
439    if (DBG_CL_SPINLOCK)                      \
440      printf("cl_spinlock_release: Releasing %p file %s, line %d\n", \
441           __exp__,__FILE__, __LINE__);            \
442    cl_spinlock_release( __exp__ );      \
443    if (DBG_CL_SPINLOCK)                      \
444      printf("cl_spinlock_release: Released  %p file %s, line %d\n", \
445           __exp__,__FILE__, __LINE__);            \
446 }
447 
448 #define CL_SPINLOCK_ACQUIRE( __exp__ )  \
449 {											    		\
450    if (DBG_CL_SPINLOCK)                      \
451      printf("cl_spinlock_acquire: Acquiring %p file %s, line %d\n", \
452           __exp__,__FILE__, __LINE__);            \
453    cl_spinlock_acquire( __exp__ );      \
454    if (DBG_CL_SPINLOCK)                      \
455      printf("cl_spinlock_acquire: Acquired %p file %s, line %d\n", \
456           __exp__,__FILE__, __LINE__);            \
457 }
458 
459 /****f* OpenSM: Helper/osm_is_debug
460 * NAME
461 *	osm_is_debug
462 *
463 * DESCRIPTION
464 *	The osm_is_debug function returns TRUE if the opensm was compiled
465 *	in debug mode, and FALSE otherwise.
466 *
467 * SYNOPSIS
468 */
469 boolean_t osm_is_debug(void);
470 /*
471 * PARAMETERS
472 *	None
473 *
474 * RETURN VALUE
475 *	TRUE if compiled in debug version. FALSE otherwise.
476 *
477 * NOTES
478 *
479 *********/
480 
481 END_C_DECLS
482 #endif				/* _OSM_LOG_H_ */
483