log.h (4085B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* Copyright (C) B.A.T.M.A.N. contributors: 3 * 4 * Marek Lindner, Simon Wunderlich 5 */ 6 7#ifndef _NET_BATMAN_ADV_LOG_H_ 8#define _NET_BATMAN_ADV_LOG_H_ 9 10#include "main.h" 11 12#include <linux/atomic.h> 13#include <linux/bitops.h> 14#include <linux/compiler.h> 15#include <linux/printk.h> 16 17#ifdef CONFIG_BATMAN_ADV_DEBUG 18 19int batadv_debug_log_setup(struct batadv_priv *bat_priv); 20void batadv_debug_log_cleanup(struct batadv_priv *bat_priv); 21 22#else 23 24static inline int batadv_debug_log_setup(struct batadv_priv *bat_priv) 25{ 26 return 0; 27} 28 29static inline void batadv_debug_log_cleanup(struct batadv_priv *bat_priv) 30{ 31} 32 33#endif 34 35/** 36 * enum batadv_dbg_level - available log levels 37 */ 38enum batadv_dbg_level { 39 /** @BATADV_DBG_BATMAN: OGM and TQ computations related messages */ 40 BATADV_DBG_BATMAN = BIT(0), 41 42 /** @BATADV_DBG_ROUTES: route added / changed / deleted */ 43 BATADV_DBG_ROUTES = BIT(1), 44 45 /** @BATADV_DBG_TT: translation table messages */ 46 BATADV_DBG_TT = BIT(2), 47 48 /** @BATADV_DBG_BLA: bridge loop avoidance messages */ 49 BATADV_DBG_BLA = BIT(3), 50 51 /** @BATADV_DBG_DAT: ARP snooping and DAT related messages */ 52 BATADV_DBG_DAT = BIT(4), 53 54 /** @BATADV_DBG_NC: network coding related messages */ 55 BATADV_DBG_NC = BIT(5), 56 57 /** @BATADV_DBG_MCAST: multicast related messages */ 58 BATADV_DBG_MCAST = BIT(6), 59 60 /** @BATADV_DBG_TP_METER: throughput meter messages */ 61 BATADV_DBG_TP_METER = BIT(7), 62 63 /** @BATADV_DBG_ALL: the union of all the above log levels */ 64 BATADV_DBG_ALL = 255, 65}; 66 67#ifdef CONFIG_BATMAN_ADV_DEBUG 68int batadv_debug_log(struct batadv_priv *bat_priv, const char *fmt, ...) 69__printf(2, 3); 70 71/** 72 * _batadv_dbg() - Store debug output with(out) rate limiting 73 * @type: type of debug message 74 * @bat_priv: the bat priv with all the soft interface information 75 * @ratelimited: whether output should be rate limited 76 * @fmt: format string 77 * @arg: variable arguments 78 */ 79#define _batadv_dbg(type, bat_priv, ratelimited, fmt, arg...) \ 80 do { \ 81 struct batadv_priv *__batpriv = (bat_priv); \ 82 if (atomic_read(&__batpriv->log_level) & (type) && \ 83 (!(ratelimited) || net_ratelimit())) \ 84 batadv_debug_log(__batpriv, fmt, ## arg); \ 85 } \ 86 while (0) 87#else /* !CONFIG_BATMAN_ADV_DEBUG */ 88__printf(4, 5) 89static inline void _batadv_dbg(int type __always_unused, 90 struct batadv_priv *bat_priv __always_unused, 91 int ratelimited __always_unused, 92 const char *fmt __always_unused, ...) 93{ 94} 95#endif 96 97/** 98 * batadv_dbg() - Store debug output without rate limiting 99 * @type: type of debug message 100 * @bat_priv: the bat priv with all the soft interface information 101 * @arg: format string and variable arguments 102 */ 103#define batadv_dbg(type, bat_priv, arg...) \ 104 _batadv_dbg(type, bat_priv, 0, ## arg) 105 106/** 107 * batadv_dbg_ratelimited() - Store debug output with rate limiting 108 * @type: type of debug message 109 * @bat_priv: the bat priv with all the soft interface information 110 * @arg: format string and variable arguments 111 */ 112#define batadv_dbg_ratelimited(type, bat_priv, arg...) \ 113 _batadv_dbg(type, bat_priv, 1, ## arg) 114 115/** 116 * batadv_info() - Store message in debug buffer and print it to kmsg buffer 117 * @net_dev: the soft interface net device 118 * @fmt: format string 119 * @arg: variable arguments 120 */ 121#define batadv_info(net_dev, fmt, arg...) \ 122 do { \ 123 struct net_device *_netdev = (net_dev); \ 124 struct batadv_priv *_batpriv = netdev_priv(_netdev); \ 125 batadv_dbg(BATADV_DBG_ALL, _batpriv, fmt, ## arg); \ 126 pr_info("%s: " fmt, _netdev->name, ## arg); \ 127 } while (0) 128 129/** 130 * batadv_err() - Store error in debug buffer and print it to kmsg buffer 131 * @net_dev: the soft interface net device 132 * @fmt: format string 133 * @arg: variable arguments 134 */ 135#define batadv_err(net_dev, fmt, arg...) \ 136 do { \ 137 struct net_device *_netdev = (net_dev); \ 138 struct batadv_priv *_batpriv = netdev_priv(_netdev); \ 139 batadv_dbg(BATADV_DBG_ALL, _batpriv, fmt, ## arg); \ 140 pr_err("%s: " fmt, _netdev->name, ## arg); \ 141 } while (0) 142 143#endif /* _NET_BATMAN_ADV_LOG_H_ */