Commit | Line | Data |
---|---|---|
7db7d9f3 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
cfa55c6d | 2 | /* Copyright (C) B.A.T.M.A.N. contributors: |
ba412080 SE |
3 | * |
4 | * Marek Lindner, Simon Wunderlich | |
ba412080 SE |
5 | */ |
6 | ||
7 | #ifndef _NET_BATMAN_ADV_LOG_H_ | |
8 | #define _NET_BATMAN_ADV_LOG_H_ | |
9 | ||
10 | #include "main.h" | |
11 | ||
47d4522d | 12 | #include <linux/atomic.h> |
ba412080 SE |
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 | |
ba412080 SE |
37 | */ |
38 | enum batadv_dbg_level { | |
8b84cc4f | 39 | /** @BATADV_DBG_BATMAN: OGM and TQ computations related messages */ |
33a3bb4a | 40 | BATADV_DBG_BATMAN = BIT(0), |
8b84cc4f SE |
41 | |
42 | /** @BATADV_DBG_ROUTES: route added / changed / deleted */ | |
33a3bb4a | 43 | BATADV_DBG_ROUTES = BIT(1), |
8b84cc4f SE |
44 | |
45 | /** @BATADV_DBG_TT: translation table messages */ | |
33a3bb4a | 46 | BATADV_DBG_TT = BIT(2), |
8b84cc4f SE |
47 | |
48 | /** @BATADV_DBG_BLA: bridge loop avoidance messages */ | |
33a3bb4a | 49 | BATADV_DBG_BLA = BIT(3), |
8b84cc4f SE |
50 | |
51 | /** @BATADV_DBG_DAT: ARP snooping and DAT related messages */ | |
33a3bb4a | 52 | BATADV_DBG_DAT = BIT(4), |
8b84cc4f SE |
53 | |
54 | /** @BATADV_DBG_NC: network coding related messages */ | |
33a3bb4a | 55 | BATADV_DBG_NC = BIT(5), |
8b84cc4f SE |
56 | |
57 | /** @BATADV_DBG_MCAST: multicast related messages */ | |
33a3bb4a | 58 | BATADV_DBG_MCAST = BIT(6), |
8b84cc4f SE |
59 | |
60 | /** @BATADV_DBG_TP_METER: throughput meter messages */ | |
33a3bb4a | 61 | BATADV_DBG_TP_METER = BIT(7), |
8b84cc4f SE |
62 | |
63 | /** @BATADV_DBG_ALL: the union of all the above log levels */ | |
611b975b | 64 | BATADV_DBG_ALL = 255, |
ba412080 SE |
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 | ||
e57acf8e | 71 | /** |
bccb48c8 | 72 | * _batadv_dbg() - Store debug output with(out) rate limiting |
e57acf8e SE |
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 | |
f4191c6d | 77 | * @arg: variable arguments |
e57acf8e | 78 | */ |
4c7da0f6 SE |
79 | #define _batadv_dbg(type, bat_priv, ratelimited, fmt, arg...) \ |
80 | do { \ | |
a09c94d0 SE |
81 | struct batadv_priv *__batpriv = (bat_priv); \ |
82 | if (atomic_read(&__batpriv->log_level) & (type) && \ | |
4c7da0f6 | 83 | (!(ratelimited) || net_ratelimit())) \ |
a09c94d0 | 84 | batadv_debug_log(__batpriv, fmt, ## arg); \ |
4c7da0f6 | 85 | } \ |
ba412080 SE |
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 | ||
e57acf8e | 97 | /** |
bccb48c8 | 98 | * batadv_dbg() - Store debug output without rate limiting |
e57acf8e SE |
99 | * @type: type of debug message |
100 | * @bat_priv: the bat priv with all the soft interface information | |
f4191c6d | 101 | * @arg: format string and variable arguments |
e57acf8e | 102 | */ |
ba412080 SE |
103 | #define batadv_dbg(type, bat_priv, arg...) \ |
104 | _batadv_dbg(type, bat_priv, 0, ## arg) | |
e57acf8e SE |
105 | |
106 | /** | |
bccb48c8 | 107 | * batadv_dbg_ratelimited() - Store debug output with rate limiting |
e57acf8e SE |
108 | * @type: type of debug message |
109 | * @bat_priv: the bat priv with all the soft interface information | |
f4191c6d | 110 | * @arg: format string and variable arguments |
e57acf8e | 111 | */ |
ba412080 SE |
112 | #define batadv_dbg_ratelimited(type, bat_priv, arg...) \ |
113 | _batadv_dbg(type, bat_priv, 1, ## arg) | |
114 | ||
e57acf8e SE |
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 | |
f4191c6d | 119 | * @arg: variable arguments |
e57acf8e | 120 | */ |
ba412080 SE |
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) | |
e57acf8e SE |
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 | |
f4191c6d | 133 | * @arg: variable arguments |
e57acf8e | 134 | */ |
ba412080 SE |
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_ */ |