1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_NET_DEBUG_H 3 #define _LINUX_NET_DEBUG_H 4 5 #include <linux/bug.h> 6 #include <linux/kern_levels.h> 7 8 struct net_device; 9 10 __printf(3, 4) __cold 11 void netdev_printk(const char *level, const struct net_device *dev, 12 const char *format, ...); 13 __printf(2, 3) __cold 14 void netdev_emerg(const struct net_device *dev, const char *format, ...); 15 __printf(2, 3) __cold 16 void netdev_alert(const struct net_device *dev, const char *format, ...); 17 __printf(2, 3) __cold 18 void netdev_crit(const struct net_device *dev, const char *format, ...); 19 __printf(2, 3) __cold 20 void netdev_err(const struct net_device *dev, const char *format, ...); 21 __printf(2, 3) __cold 22 void netdev_warn(const struct net_device *dev, const char *format, ...); 23 __printf(2, 3) __cold 24 void netdev_notice(const struct net_device *dev, const char *format, ...); 25 __printf(2, 3) __cold 26 void netdev_info(const struct net_device *dev, const char *format, ...); 27 28 #define netdev_level_once(level, dev, fmt, ...) \ 29 do { \ 30 static bool __section(".data.once") __print_once; \ 31 \ 32 if (!__print_once) { \ 33 __print_once = true; \ 34 netdev_printk(level, dev, fmt, ##__VA_ARGS__); \ 35 } \ 36 } while (0) 37 38 #define netdev_emerg_once(dev, fmt, ...) \ 39 netdev_level_once(KERN_EMERG, dev, fmt, ##__VA_ARGS__) 40 #define netdev_alert_once(dev, fmt, ...) \ 41 netdev_level_once(KERN_ALERT, dev, fmt, ##__VA_ARGS__) 42 #define netdev_crit_once(dev, fmt, ...) \ 43 netdev_level_once(KERN_CRIT, dev, fmt, ##__VA_ARGS__) 44 #define netdev_err_once(dev, fmt, ...) \ 45 netdev_level_once(KERN_ERR, dev, fmt, ##__VA_ARGS__) 46 #define netdev_warn_once(dev, fmt, ...) \ 47 netdev_level_once(KERN_WARNING, dev, fmt, ##__VA_ARGS__) 48 #define netdev_notice_once(dev, fmt, ...) \ 49 netdev_level_once(KERN_NOTICE, dev, fmt, ##__VA_ARGS__) 50 #define netdev_info_once(dev, fmt, ...) \ 51 netdev_level_once(KERN_INFO, dev, fmt, ##__VA_ARGS__) 52 53 #if defined(CONFIG_DYNAMIC_DEBUG) || \ 54 (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) 55 #define netdev_dbg(__dev, format, args...) \ 56 do { \ 57 dynamic_netdev_dbg(__dev, format, ##args); \ 58 } while (0) 59 #elif defined(DEBUG) 60 #define netdev_dbg(__dev, format, args...) \ 61 netdev_printk(KERN_DEBUG, __dev, format, ##args) 62 #else 63 #define netdev_dbg(__dev, format, args...) \ 64 ({ \ 65 if (0) \ 66 netdev_printk(KERN_DEBUG, __dev, format, ##args); \ 67 }) 68 #endif 69 70 #if defined(VERBOSE_DEBUG) 71 #define netdev_vdbg netdev_dbg 72 #else 73 74 #define netdev_vdbg(dev, format, args...) \ 75 ({ \ 76 if (0) \ 77 netdev_printk(KERN_DEBUG, dev, format, ##args); \ 78 0; \ 79 }) 80 #endif 81 82 /* netif printk helpers, similar to netdev_printk */ 83 84 #define netif_printk(priv, type, level, dev, fmt, args...) \ 85 do { \ 86 if (netif_msg_##type(priv)) \ 87 netdev_printk(level, (dev), fmt, ##args); \ 88 } while (0) 89 90 #define netif_level(level, priv, type, dev, fmt, args...) \ 91 do { \ 92 if (netif_msg_##type(priv)) \ 93 netdev_##level(dev, fmt, ##args); \ 94 } while (0) 95 96 #define netif_emerg(priv, type, dev, fmt, args...) \ 97 netif_level(emerg, priv, type, dev, fmt, ##args) 98 #define netif_alert(priv, type, dev, fmt, args...) \ 99 netif_level(alert, priv, type, dev, fmt, ##args) 100 #define netif_crit(priv, type, dev, fmt, args...) \ 101 netif_level(crit, priv, type, dev, fmt, ##args) 102 #define netif_err(priv, type, dev, fmt, args...) \ 103 netif_level(err, priv, type, dev, fmt, ##args) 104 #define netif_warn(priv, type, dev, fmt, args...) \ 105 netif_level(warn, priv, type, dev, fmt, ##args) 106 #define netif_notice(priv, type, dev, fmt, args...) \ 107 netif_level(notice, priv, type, dev, fmt, ##args) 108 #define netif_info(priv, type, dev, fmt, args...) \ 109 netif_level(info, priv, type, dev, fmt, ##args) 110 111 #if defined(CONFIG_DYNAMIC_DEBUG) || \ 112 (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) 113 #define netif_dbg(priv, type, netdev, format, args...) \ 114 do { \ 115 if (netif_msg_##type(priv)) \ 116 dynamic_netdev_dbg(netdev, format, ##args); \ 117 } while (0) 118 #elif defined(DEBUG) 119 #define netif_dbg(priv, type, dev, format, args...) \ 120 netif_printk(priv, type, KERN_DEBUG, dev, format, ##args) 121 #else 122 #define netif_dbg(priv, type, dev, format, args...) \ 123 ({ \ 124 if (0) \ 125 netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \ 126 0; \ 127 }) 128 #endif 129 130 /* if @cond then downgrade to debug, else print at @level */ 131 #define netif_cond_dbg(priv, type, netdev, cond, level, fmt, args...) \ 132 do { \ 133 if (cond) \ 134 netif_dbg(priv, type, netdev, fmt, ##args); \ 135 else \ 136 netif_ ## level(priv, type, netdev, fmt, ##args); \ 137 } while (0) 138 139 #if defined(VERBOSE_DEBUG) 140 #define netif_vdbg netif_dbg 141 #else 142 #define netif_vdbg(priv, type, dev, format, args...) \ 143 ({ \ 144 if (0) \ 145 netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \ 146 0; \ 147 }) 148 #endif 149 150 151 #if defined(CONFIG_DEBUG_NET) 152 #define DEBUG_NET_WARN_ON_ONCE(cond) (void)WARN_ON_ONCE(cond) 153 #else 154 #define DEBUG_NET_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond) 155 #endif 156 157 #endif /* _LINUX_NET_DEBUG_H */ 158