1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (C) 2007-2020 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 19 int batadv_debug_log_setup(struct batadv_priv *bat_priv); 20 void batadv_debug_log_cleanup(struct batadv_priv *bat_priv); 21 22 #else 23 24 static inline int batadv_debug_log_setup(struct batadv_priv *bat_priv) 25 { 26 return 0; 27 } 28 29 static 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 */ 38 enum 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 68 int 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) ratelimiting 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) 89 static 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 ratelimiting 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 ratelimiting 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_ */ 144