debugfs.c revision 40a072d777a4f417c0296e06f91297b0f3f2fa36
1c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann/* 2567db7b0b7c0a94cc62846f8ebb429bdda2884bcSven Eckelmann * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors: 3c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * 4c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * Marek Lindner 5c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * 6c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * This program is free software; you can redistribute it and/or 7c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * modify it under the terms of version 2 of the GNU General Public 8c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * License as published by the Free Software Foundation. 9c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * 10c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * This program is distributed in the hope that it will be useful, but 11c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * WITHOUT ANY WARRANTY; without even the implied warranty of 12c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * General Public License for more details. 14c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * 15c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * You should have received a copy of the GNU General Public License 16c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * along with this program; if not, write to the Free Software 17c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * 02110-1301, USA 19c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * 20c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann */ 21c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 22c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "main.h" 23c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 24c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include <linux/debugfs.h> 25c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 26c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "bat_debugfs.h" 27c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "translation-table.h" 28c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "originator.h" 29c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "hard-interface.h" 30c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "gateway_common.h" 31c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "gateway_client.h" 32c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "soft-interface.h" 33c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "vis.h" 34c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "icmp_socket.h" 359bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich#include "bridge_loop_avoidance.h" 36c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 37c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic struct dentry *bat_debugfs; 38c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 39c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#ifdef CONFIG_BATMAN_ADV_DEBUG 40c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#define LOG_BUFF_MASK (log_buff_len-1) 41c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#define LOG_BUFF(idx) (debug_log->log_buff[(idx) & LOG_BUFF_MASK]) 42c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 43c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic int log_buff_len = LOG_BUF_LEN; 44c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 45c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic void emit_log_char(struct debug_log *debug_log, char c) 46c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 47c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann LOG_BUFF(debug_log->log_end) = c; 48c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann debug_log->log_end++; 49c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 50c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (debug_log->log_end - debug_log->log_start > log_buff_len) 51c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann debug_log->log_start = debug_log->log_end - log_buff_len; 52c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 53c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 54d3a547be40008be590c169ff2d5d73cc7fada71dSven Eckelmann__printf(2, 3) 55747e4221a03cde62402b614ca1f8e961b8416130Sven Eckelmannstatic int fdebug_log(struct debug_log *debug_log, const char *fmt, ...) 56c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 57c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann va_list args; 58c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann static char debug_log_buf[256]; 59c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann char *p; 60c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 61c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (!debug_log) 62c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 63c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 64c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann spin_lock_bh(&debug_log->lock); 65c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann va_start(args, fmt); 661299bdaa1cb522de940d912f661bef59b9a39dd7Sven Eckelmann vscnprintf(debug_log_buf, sizeof(debug_log_buf), fmt, args); 67c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann va_end(args); 68c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 69c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann for (p = debug_log_buf; *p != 0; p++) 70c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann emit_log_char(debug_log, *p); 71c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 72c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann spin_unlock_bh(&debug_log->lock); 73c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 74c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann wake_up(&debug_log->queue_wait); 75c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 76c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 77c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 78c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 7940a072d777a4f417c0296e06f91297b0f3f2fa36Sven Eckelmannint batadv_debug_log(struct bat_priv *bat_priv, const char *fmt, ...) 80c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 81c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann va_list args; 82c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann char tmp_log_buf[256]; 83c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 84c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann va_start(args, fmt); 85c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann vscnprintf(tmp_log_buf, sizeof(tmp_log_buf), fmt, args); 860b0094e000840115b5baece2293c5fb1aab4fdedMarek Lindner fdebug_log(bat_priv->debug_log, "[%10u] %s", 870b0094e000840115b5baece2293c5fb1aab4fdedMarek Lindner jiffies_to_msecs(jiffies), tmp_log_buf); 88c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann va_end(args); 89c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 90c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 91c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 92c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 93c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic int log_open(struct inode *inode, struct file *file) 94c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 95c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann nonseekable_open(inode, file); 96c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann file->private_data = inode->i_private; 97c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann inc_module_count(); 98c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 99c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 100c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 101c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic int log_release(struct inode *inode, struct file *file) 102c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 103c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann dec_module_count(); 104c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 105c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 106c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 107c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic ssize_t log_read(struct file *file, char __user *buf, 108c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann size_t count, loff_t *ppos) 109c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 110c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct bat_priv *bat_priv = file->private_data; 111c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct debug_log *debug_log = bat_priv->debug_log; 112c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann int error, i = 0; 113c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann char c; 114c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 115c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if ((file->f_flags & O_NONBLOCK) && 116c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann !(debug_log->log_end - debug_log->log_start)) 117c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return -EAGAIN; 118c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 11916f14b45c48f4f1be5857103ee3054114604d98cSven Eckelmann if (!buf) 120c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return -EINVAL; 121c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 122c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (count == 0) 123c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 124c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 125c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (!access_ok(VERIFY_WRITE, buf, count)) 126c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return -EFAULT; 127c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 128c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann error = wait_event_interruptible(debug_log->queue_wait, 129c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann (debug_log->log_start - debug_log->log_end)); 130c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 131c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (error) 132c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return error; 133c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 134c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann spin_lock_bh(&debug_log->lock); 135c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 136c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann while ((!error) && (i < count) && 137c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann (debug_log->log_start != debug_log->log_end)) { 138c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann c = LOG_BUFF(debug_log->log_start); 139c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 140c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann debug_log->log_start++; 141c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 142c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann spin_unlock_bh(&debug_log->lock); 143c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 144c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann error = __put_user(c, buf); 145c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 146c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann spin_lock_bh(&debug_log->lock); 147c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 148c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann buf++; 149c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann i++; 150c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 151c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann } 152c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 153c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann spin_unlock_bh(&debug_log->lock); 154c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 155c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (!error) 156c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return i; 157c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 158c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return error; 159c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 160c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 161c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic unsigned int log_poll(struct file *file, poll_table *wait) 162c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 163c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct bat_priv *bat_priv = file->private_data; 164c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct debug_log *debug_log = bat_priv->debug_log; 165c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 166c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann poll_wait(file, &debug_log->queue_wait, wait); 167c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 168c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (debug_log->log_end - debug_log->log_start) 169c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return POLLIN | POLLRDNORM; 170c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 171c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 172c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 173c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 174c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic const struct file_operations log_fops = { 175c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .open = log_open, 176c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .release = log_release, 177c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .read = log_read, 178c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .poll = log_poll, 179c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .llseek = no_llseek, 180c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}; 181c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 182c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic int debug_log_setup(struct bat_priv *bat_priv) 183c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 184c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct dentry *d; 185c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 186c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (!bat_priv->debug_dir) 187c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann goto err; 188c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 189704509b8d44886cebfbaff1a9813c35dfa986954Sven Eckelmann bat_priv->debug_log = kzalloc(sizeof(*bat_priv->debug_log), GFP_ATOMIC); 190c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (!bat_priv->debug_log) 191c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann goto err; 192c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 193c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann spin_lock_init(&bat_priv->debug_log->lock); 194c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann init_waitqueue_head(&bat_priv->debug_log->queue_wait); 195c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 196c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann d = debugfs_create_file("log", S_IFREG | S_IRUSR, 197c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_priv->debug_dir, bat_priv, &log_fops); 1985346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann if (!d) 199c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann goto err; 200c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 201c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 202c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 203c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannerr: 2045346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann return -ENOMEM; 205c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 206c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 207c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic void debug_log_cleanup(struct bat_priv *bat_priv) 208c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 209c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann kfree(bat_priv->debug_log); 210c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_priv->debug_log = NULL; 211c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 212c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#else /* CONFIG_BATMAN_ADV_DEBUG */ 213c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic int debug_log_setup(struct bat_priv *bat_priv) 214c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 215c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_priv->debug_log = NULL; 216c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 217c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 218c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 219c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic void debug_log_cleanup(struct bat_priv *bat_priv) 220c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 221c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return; 222c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 223c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#endif 224c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 2251c280471b013e26c833fc86acc231c73442cfa21Marek Lindnerstatic int bat_algorithms_open(struct inode *inode, struct file *file) 2261c280471b013e26c833fc86acc231c73442cfa21Marek Lindner{ 2271c280471b013e26c833fc86acc231c73442cfa21Marek Lindner return single_open(file, bat_algo_seq_print_text, NULL); 2281c280471b013e26c833fc86acc231c73442cfa21Marek Lindner} 2291c280471b013e26c833fc86acc231c73442cfa21Marek Lindner 230c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic int originators_open(struct inode *inode, struct file *file) 231c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 232c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct net_device *net_dev = (struct net_device *)inode->i_private; 233c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return single_open(file, orig_seq_print_text, net_dev); 234c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 235c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 236c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic int gateways_open(struct inode *inode, struct file *file) 237c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 238c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct net_device *net_dev = (struct net_device *)inode->i_private; 239c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return single_open(file, gw_client_seq_print_text, net_dev); 240c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 241c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 242c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic int transtable_global_open(struct inode *inode, struct file *file) 243c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 244c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct net_device *net_dev = (struct net_device *)inode->i_private; 2452dafb49d84a9195193b28ac5047df1bbab6053b9Antonio Quartulli return single_open(file, tt_global_seq_print_text, net_dev); 246c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 247c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 2487a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#ifdef CONFIG_BATMAN_ADV_BLA 2499bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlichstatic int bla_claim_table_open(struct inode *inode, struct file *file) 2509bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich{ 2519bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich struct net_device *net_dev = (struct net_device *)inode->i_private; 2529bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich return single_open(file, bla_claim_table_seq_print_text, net_dev); 2539bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich} 2547a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#endif 2559bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich 256c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic int transtable_local_open(struct inode *inode, struct file *file) 257c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 258c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct net_device *net_dev = (struct net_device *)inode->i_private; 2592dafb49d84a9195193b28ac5047df1bbab6053b9Antonio Quartulli return single_open(file, tt_local_seq_print_text, net_dev); 260c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 261c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 262c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic int vis_data_open(struct inode *inode, struct file *file) 263c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 264c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct net_device *net_dev = (struct net_device *)inode->i_private; 265c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return single_open(file, vis_seq_print_text, net_dev); 266c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 267c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 268c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstruct bat_debuginfo { 269c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct attribute attr; 270c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann const struct file_operations fops; 271c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}; 272c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 273c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#define BAT_DEBUGINFO(_name, _mode, _open) \ 274c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstruct bat_debuginfo bat_debuginfo_##_name = { \ 275c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .attr = { .name = __stringify(_name), \ 276c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .mode = _mode, }, \ 277c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .fops = { .owner = THIS_MODULE, \ 278c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .open = _open, \ 279c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .read = seq_read, \ 280c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .llseek = seq_lseek, \ 281c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann .release = single_release, \ 282c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann } \ 283c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}; 284c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 2851c280471b013e26c833fc86acc231c73442cfa21Marek Lindnerstatic BAT_DEBUGINFO(routing_algos, S_IRUGO, bat_algorithms_open); 286c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic BAT_DEBUGINFO(originators, S_IRUGO, originators_open); 287c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic BAT_DEBUGINFO(gateways, S_IRUGO, gateways_open); 288c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic BAT_DEBUGINFO(transtable_global, S_IRUGO, transtable_global_open); 2897a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#ifdef CONFIG_BATMAN_ADV_BLA 2909bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlichstatic BAT_DEBUGINFO(bla_claim_table, S_IRUGO, bla_claim_table_open); 2917a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#endif 292c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic BAT_DEBUGINFO(transtable_local, S_IRUGO, transtable_local_open); 293c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic BAT_DEBUGINFO(vis_data, S_IRUGO, vis_data_open); 294c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 295c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannstatic struct bat_debuginfo *mesh_debuginfos[] = { 296c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann &bat_debuginfo_originators, 297c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann &bat_debuginfo_gateways, 298c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann &bat_debuginfo_transtable_global, 2997a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#ifdef CONFIG_BATMAN_ADV_BLA 3009bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich &bat_debuginfo_bla_claim_table, 3017a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#endif 302c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann &bat_debuginfo_transtable_local, 303c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann &bat_debuginfo_vis_data, 304c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann NULL, 305c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}; 306c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 30740a072d777a4f417c0296e06f91297b0f3f2fa36Sven Eckelmannvoid batadv_debugfs_init(void) 308c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 3091c280471b013e26c833fc86acc231c73442cfa21Marek Lindner struct bat_debuginfo *bat_debug; 3101c280471b013e26c833fc86acc231c73442cfa21Marek Lindner struct dentry *file; 3111c280471b013e26c833fc86acc231c73442cfa21Marek Lindner 312c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_debugfs = debugfs_create_dir(DEBUGFS_BAT_SUBDIR, NULL); 313c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (bat_debugfs == ERR_PTR(-ENODEV)) 314c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_debugfs = NULL; 3151c280471b013e26c833fc86acc231c73442cfa21Marek Lindner 3161c280471b013e26c833fc86acc231c73442cfa21Marek Lindner if (!bat_debugfs) 3171c280471b013e26c833fc86acc231c73442cfa21Marek Lindner goto out; 3181c280471b013e26c833fc86acc231c73442cfa21Marek Lindner 3191c280471b013e26c833fc86acc231c73442cfa21Marek Lindner bat_debug = &bat_debuginfo_routing_algos; 3201c280471b013e26c833fc86acc231c73442cfa21Marek Lindner file = debugfs_create_file(bat_debug->attr.name, 3211c280471b013e26c833fc86acc231c73442cfa21Marek Lindner S_IFREG | bat_debug->attr.mode, 3221c280471b013e26c833fc86acc231c73442cfa21Marek Lindner bat_debugfs, NULL, &bat_debug->fops); 3231c280471b013e26c833fc86acc231c73442cfa21Marek Lindner if (!file) 3241c280471b013e26c833fc86acc231c73442cfa21Marek Lindner pr_err("Can't add debugfs file: %s\n", bat_debug->attr.name); 3251c280471b013e26c833fc86acc231c73442cfa21Marek Lindner 3261c280471b013e26c833fc86acc231c73442cfa21Marek Lindnerout: 3271c280471b013e26c833fc86acc231c73442cfa21Marek Lindner return; 328c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 329c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 33040a072d777a4f417c0296e06f91297b0f3f2fa36Sven Eckelmannvoid batadv_debugfs_destroy(void) 331c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 332c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (bat_debugfs) { 333c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann debugfs_remove_recursive(bat_debugfs); 334c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_debugfs = NULL; 335c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann } 336c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 337c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 33840a072d777a4f417c0296e06f91297b0f3f2fa36Sven Eckelmannint batadv_debugfs_add_meshif(struct net_device *dev) 339c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 340c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct bat_priv *bat_priv = netdev_priv(dev); 341c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct bat_debuginfo **bat_debug; 342c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct dentry *file; 343c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 344c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (!bat_debugfs) 345c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann goto out; 346c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 347c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_priv->debug_dir = debugfs_create_dir(dev->name, bat_debugfs); 348c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (!bat_priv->debug_dir) 349c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann goto out; 350c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 3515346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann if (bat_socket_setup(bat_priv) < 0) 3525346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann goto rem_attr; 3535346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann 3545346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann if (debug_log_setup(bat_priv) < 0) 3555346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann goto rem_attr; 356c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 357c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann for (bat_debug = mesh_debuginfos; *bat_debug; ++bat_debug) { 358c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann file = debugfs_create_file(((*bat_debug)->attr).name, 359c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann S_IFREG | ((*bat_debug)->attr).mode, 360c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_priv->debug_dir, 361c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann dev, &(*bat_debug)->fops); 362c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (!file) { 363c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_err(dev, "Can't add debugfs file: %s/%s\n", 364c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann dev->name, ((*bat_debug)->attr).name); 365c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann goto rem_attr; 366c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann } 367c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann } 368c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 369c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 370c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannrem_attr: 371c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann debugfs_remove_recursive(bat_priv->debug_dir); 372c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_priv->debug_dir = NULL; 373c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannout: 374c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#ifdef CONFIG_DEBUG_FS 375c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return -ENOMEM; 376c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#else 377c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann return 0; 378c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#endif /* CONFIG_DEBUG_FS */ 379c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 380c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 38140a072d777a4f417c0296e06f91297b0f3f2fa36Sven Eckelmannvoid batadv_debugfs_del_meshif(struct net_device *dev) 382c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{ 383c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann struct bat_priv *bat_priv = netdev_priv(dev); 384c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 385c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann debug_log_cleanup(bat_priv); 386c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann 387c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann if (bat_debugfs) { 388c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann debugfs_remove_recursive(bat_priv->debug_dir); 389c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann bat_priv->debug_dir = NULL; 390c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann } 391c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann} 392