debugfs.c revision 54590e4d4b369c9fc0dcbb3c7f39eb90fbddcbe2
19cfc7bd608b97463993b4f3e4775d99022253f8dSven Eckelmann/* Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
2c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann *
3c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * Marek Lindner
4c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann *
5c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * This program is free software; you can redistribute it and/or
6c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * modify it under the terms of version 2 of the GNU General Public
7c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * License as published by the Free Software Foundation.
8c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann *
9c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * This program is distributed in the hope that it will be useful, but
10c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * WITHOUT ANY WARRANTY; without even the implied warranty of
11c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * General Public License for more details.
13c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann *
14c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * You should have received a copy of the GNU General Public License
15c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * along with this program; if not, write to the Free Software
16c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann * 02110-1301, USA
18c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann */
19c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
20c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "main.h"
21c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
22c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include <linux/debugfs.h>
23c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
24c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "bat_debugfs.h"
25c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "translation-table.h"
26c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "originator.h"
27c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "hard-interface.h"
28c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "gateway_common.h"
29c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "gateway_client.h"
30c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "soft-interface.h"
31c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "vis.h"
32c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#include "icmp_socket.h"
339bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich#include "bridge_loop_avoidance.h"
34c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
359e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic struct dentry *batadv_debugfs;
36c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
37c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#ifdef CONFIG_BATMAN_ADV_DEBUG
38347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmann#define BATADV_LOG_BUFF_MASK (batadv_log_buff_len - 1)
39347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmann#define BATADV_LOG_BUFF(idx) (debug_log->log_buff[(idx) & BATADV_LOG_BUFF_MASK])
40c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
419e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_log_buff_len = LOG_BUF_LEN;
42c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
439e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic void batadv_emit_log_char(struct debug_log *debug_log, char c)
44c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
45347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmann	BATADV_LOG_BUFF(debug_log->log_end) = c;
46c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	debug_log->log_end++;
47c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
489e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	if (debug_log->log_end - debug_log->log_start > batadv_log_buff_len)
499e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		debug_log->log_start = debug_log->log_end - batadv_log_buff_len;
50c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
51c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
52d3a547be40008be590c169ff2d5d73cc7fada71dSven Eckelmann__printf(2, 3)
539e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_fdebug_log(struct debug_log *debug_log, const char *fmt, ...)
54c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
55c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	va_list args;
56c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	static char debug_log_buf[256];
57c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	char *p;
58c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
59c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	if (!debug_log)
60c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		return 0;
61c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
62c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	spin_lock_bh(&debug_log->lock);
63c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	va_start(args, fmt);
641299bdaa1cb522de940d912f661bef59b9a39dd7Sven Eckelmann	vscnprintf(debug_log_buf, sizeof(debug_log_buf), fmt, args);
65c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	va_end(args);
66c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
67c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	for (p = debug_log_buf; *p != 0; p++)
689e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		batadv_emit_log_char(debug_log, *p);
69c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
70c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	spin_unlock_bh(&debug_log->lock);
71c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
72c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	wake_up(&debug_log->queue_wait);
73c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
74c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return 0;
75c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
76c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
7740a072d777a4f417c0296e06f91297b0f3f2fa36Sven Eckelmannint batadv_debug_log(struct bat_priv *bat_priv, const char *fmt, ...)
78c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
79c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	va_list args;
80c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	char tmp_log_buf[256];
81c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
82c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	va_start(args, fmt);
83c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	vscnprintf(tmp_log_buf, sizeof(tmp_log_buf), fmt, args);
849e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	batadv_fdebug_log(bat_priv->debug_log, "[%10u] %s",
859e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann			  jiffies_to_msecs(jiffies), tmp_log_buf);
86c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	va_end(args);
87c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
88c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return 0;
89c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
90c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
919e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_log_open(struct inode *inode, struct file *file)
92c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
93c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	nonseekable_open(inode, file);
94c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	file->private_data = inode->i_private;
953193e8fdfa355289892661d206d1954114a7be95Sven Eckelmann	batadv_inc_module_count();
96c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return 0;
97c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
98c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
999e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_log_release(struct inode *inode, struct file *file)
100c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
1013193e8fdfa355289892661d206d1954114a7be95Sven Eckelmann	batadv_dec_module_count();
102c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return 0;
103c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
104c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
1059e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic ssize_t batadv_log_read(struct file *file, char __user *buf,
1069e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann			       size_t count, loff_t *ppos)
107c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
108c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct bat_priv *bat_priv = file->private_data;
109c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct debug_log *debug_log = bat_priv->debug_log;
110c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	int error, i = 0;
111c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	char c;
112c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
113c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	if ((file->f_flags & O_NONBLOCK) &&
114c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	    !(debug_log->log_end - debug_log->log_start))
115c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		return -EAGAIN;
116c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
11716f14b45c48f4f1be5857103ee3054114604d98cSven Eckelmann	if (!buf)
118c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		return -EINVAL;
119c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
120c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	if (count == 0)
121c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		return 0;
122c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
123c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	if (!access_ok(VERIFY_WRITE, buf, count))
124c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		return -EFAULT;
125c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
126c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	error = wait_event_interruptible(debug_log->queue_wait,
127c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann				(debug_log->log_start - debug_log->log_end));
128c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
129c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	if (error)
130c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		return error;
131c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
132c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	spin_lock_bh(&debug_log->lock);
133c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
134c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	while ((!error) && (i < count) &&
135c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	       (debug_log->log_start != debug_log->log_end)) {
136347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmann		c = BATADV_LOG_BUFF(debug_log->log_start);
137c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
138c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		debug_log->log_start++;
139c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
140c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		spin_unlock_bh(&debug_log->lock);
141c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
142c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		error = __put_user(c, buf);
143c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
144c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		spin_lock_bh(&debug_log->lock);
145c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
146c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		buf++;
147c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		i++;
148c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
149c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	}
150c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
151c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	spin_unlock_bh(&debug_log->lock);
152c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
153c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	if (!error)
154c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		return i;
155c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
156c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return error;
157c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
158c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
1599e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic unsigned int batadv_log_poll(struct file *file, poll_table *wait)
160c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
161c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct bat_priv *bat_priv = file->private_data;
162c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct debug_log *debug_log = bat_priv->debug_log;
163c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
164c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	poll_wait(file, &debug_log->queue_wait, wait);
165c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
166c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	if (debug_log->log_end - debug_log->log_start)
167c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		return POLLIN | POLLRDNORM;
168c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
169c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return 0;
170c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
171c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
1729e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic const struct file_operations batadv_log_fops = {
1739e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	.open           = batadv_log_open,
1749e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	.release        = batadv_log_release,
1759e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	.read           = batadv_log_read,
1769e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	.poll           = batadv_log_poll,
177c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	.llseek         = no_llseek,
178c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann};
179c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
1809e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_debug_log_setup(struct bat_priv *bat_priv)
181c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
182c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct dentry *d;
183c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
184c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	if (!bat_priv->debug_dir)
185c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		goto err;
186c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
187704509b8d44886cebfbaff1a9813c35dfa986954Sven Eckelmann	bat_priv->debug_log = kzalloc(sizeof(*bat_priv->debug_log), GFP_ATOMIC);
188c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	if (!bat_priv->debug_log)
189c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		goto err;
190c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
191c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	spin_lock_init(&bat_priv->debug_log->lock);
192c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	init_waitqueue_head(&bat_priv->debug_log->queue_wait);
193c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
194c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	d = debugfs_create_file("log", S_IFREG | S_IRUSR,
1959e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann				bat_priv->debug_dir, bat_priv,
1969e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann				&batadv_log_fops);
1975346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann	if (!d)
198c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		goto err;
199c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
200c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return 0;
201c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
202c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannerr:
2035346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann	return -ENOMEM;
204c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
205c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
2069e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic void batadv_debug_log_cleanup(struct bat_priv *bat_priv)
207c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
208c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	kfree(bat_priv->debug_log);
209c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	bat_priv->debug_log = NULL;
210c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
211c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#else /* CONFIG_BATMAN_ADV_DEBUG */
2129e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_debug_log_setup(struct bat_priv *bat_priv)
213c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
214c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	bat_priv->debug_log = NULL;
215c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return 0;
216c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
217c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
2189e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic void batadv_debug_log_cleanup(struct bat_priv *bat_priv)
219c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
220c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return;
221c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
222c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#endif
223c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
2249e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_algorithms_open(struct inode *inode, struct file *file)
2251c280471b013e26c833fc86acc231c73442cfa21Marek Lindner{
2263193e8fdfa355289892661d206d1954114a7be95Sven Eckelmann	return single_open(file, batadv_algo_seq_print_text, NULL);
2271c280471b013e26c833fc86acc231c73442cfa21Marek Lindner}
2281c280471b013e26c833fc86acc231c73442cfa21Marek Lindner
2299e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_originators_open(struct inode *inode, struct file *file)
230c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
231c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct net_device *net_dev = (struct net_device *)inode->i_private;
2327d211efc5087bc8870fa3374da88b4bf8159e79bSven Eckelmann	return single_open(file, batadv_orig_seq_print_text, net_dev);
233c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
234c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
2359e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_gateways_open(struct inode *inode, struct file *file)
236c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
237c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct net_device *net_dev = (struct net_device *)inode->i_private;
2387cf06bc6ff810178a7fb9f12aaa6b274fc520f6fSven Eckelmann	return single_open(file, batadv_gw_client_seq_print_text, net_dev);
239c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
240c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
2419e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_transtable_global_open(struct inode *inode, struct file *file)
242c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
243c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct net_device *net_dev = (struct net_device *)inode->i_private;
24408c36d3e8ad1f73d3b0322842363b23f6d203630Sven Eckelmann	return single_open(file, batadv_tt_global_seq_print_text, net_dev);
245c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
246c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
2477a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#ifdef CONFIG_BATMAN_ADV_BLA
2489e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_bla_claim_table_open(struct inode *inode, struct file *file)
2499bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich{
2509bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich	struct net_device *net_dev = (struct net_device *)inode->i_private;
25108adf1512298201a53b88bb0a3d67e0dbbe0ed9bSven Eckelmann	return single_open(file, batadv_bla_claim_table_seq_print_text,
25208adf1512298201a53b88bb0a3d67e0dbbe0ed9bSven Eckelmann			   net_dev);
2539bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich}
2547a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#endif
2559bf8e4d4254397684250eae29a0dc12d54a00251Simon Wunderlich
2569e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_transtable_local_open(struct inode *inode, struct file *file)
257c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
258c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct net_device *net_dev = (struct net_device *)inode->i_private;
25908c36d3e8ad1f73d3b0322842363b23f6d203630Sven Eckelmann	return single_open(file, batadv_tt_local_seq_print_text, net_dev);
260c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
261c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
2629e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic int batadv_vis_data_open(struct inode *inode, struct file *file)
263c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
264c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct net_device *net_dev = (struct net_device *)inode->i_private;
265d0f714f472967577067853acc8dabe0abc75ae8fSven Eckelmann	return single_open(file, batadv_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
273347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmann#define BATADV_DEBUGINFO(_name, _mode, _open)		\
2749e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstruct bat_debuginfo batadv_debuginfo_##_name = {	\
2759e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	.attr = { .name = __stringify(_name),		\
2769e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		  .mode = _mode, },			\
2779e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	.fops = { .owner = THIS_MODULE,			\
2789e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		  .open = _open,			\
2799e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		  .read	= seq_read,			\
2809e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		  .llseek = seq_lseek,			\
2819e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		  .release = single_release,		\
2829e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		}					\
283c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann};
284c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
285347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmannstatic BATADV_DEBUGINFO(routing_algos, S_IRUGO, batadv_algorithms_open);
286347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmannstatic BATADV_DEBUGINFO(originators, S_IRUGO, batadv_originators_open);
287347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmannstatic BATADV_DEBUGINFO(gateways, S_IRUGO, batadv_gateways_open);
288347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmannstatic BATADV_DEBUGINFO(transtable_global, S_IRUGO,
289347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmann			batadv_transtable_global_open);
2907a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#ifdef CONFIG_BATMAN_ADV_BLA
291347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmannstatic BATADV_DEBUGINFO(bla_claim_table, S_IRUGO, batadv_bla_claim_table_open);
2927a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#endif
293347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmannstatic BATADV_DEBUGINFO(transtable_local, S_IRUGO,
294347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmann			batadv_transtable_local_open);
295347c80f0fb9adbd5f3756bd8a612664492768808Sven Eckelmannstatic BATADV_DEBUGINFO(vis_data, S_IRUGO, batadv_vis_data_open);
296c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
2979e466250ede375482a9a65ca60765d24303099e9Sven Eckelmannstatic struct bat_debuginfo *batadv_mesh_debuginfos[] = {
2989e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	&batadv_debuginfo_originators,
2999e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	&batadv_debuginfo_gateways,
3009e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	&batadv_debuginfo_transtable_global,
3017a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#ifdef CONFIG_BATMAN_ADV_BLA
3029e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	&batadv_debuginfo_bla_claim_table,
3037a5cc24277b57ce38eb0afa6634b71d4d5cc671eSimon Wunderlich#endif
3049e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	&batadv_debuginfo_transtable_local,
3059e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	&batadv_debuginfo_vis_data,
306c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	NULL,
307c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann};
308c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
30940a072d777a4f417c0296e06f91297b0f3f2fa36Sven Eckelmannvoid batadv_debugfs_init(void)
310c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
3111c280471b013e26c833fc86acc231c73442cfa21Marek Lindner	struct bat_debuginfo *bat_debug;
3121c280471b013e26c833fc86acc231c73442cfa21Marek Lindner	struct dentry *file;
3131c280471b013e26c833fc86acc231c73442cfa21Marek Lindner
31454590e4d4b369c9fc0dcbb3c7f39eb90fbddcbe2Sven Eckelmann	batadv_debugfs = debugfs_create_dir(BATADV_DEBUGFS_SUBDIR, NULL);
3159e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	if (batadv_debugfs == ERR_PTR(-ENODEV))
3169e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		batadv_debugfs = NULL;
3171c280471b013e26c833fc86acc231c73442cfa21Marek Lindner
3189e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	if (!batadv_debugfs)
3191c280471b013e26c833fc86acc231c73442cfa21Marek Lindner		goto out;
3201c280471b013e26c833fc86acc231c73442cfa21Marek Lindner
3219e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	bat_debug = &batadv_debuginfo_routing_algos;
3221c280471b013e26c833fc86acc231c73442cfa21Marek Lindner	file = debugfs_create_file(bat_debug->attr.name,
3231c280471b013e26c833fc86acc231c73442cfa21Marek Lindner				   S_IFREG | bat_debug->attr.mode,
3249e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann				   batadv_debugfs, NULL, &bat_debug->fops);
3251c280471b013e26c833fc86acc231c73442cfa21Marek Lindner	if (!file)
3261c280471b013e26c833fc86acc231c73442cfa21Marek Lindner		pr_err("Can't add debugfs file: %s\n", bat_debug->attr.name);
3271c280471b013e26c833fc86acc231c73442cfa21Marek Lindner
3281c280471b013e26c833fc86acc231c73442cfa21Marek Lindnerout:
3291c280471b013e26c833fc86acc231c73442cfa21Marek Lindner	return;
330c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
331c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
33240a072d777a4f417c0296e06f91297b0f3f2fa36Sven Eckelmannvoid batadv_debugfs_destroy(void)
333c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
3349e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	if (batadv_debugfs) {
3359e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		debugfs_remove_recursive(batadv_debugfs);
3369e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann		batadv_debugfs = NULL;
337c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	}
338c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
339c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
34040a072d777a4f417c0296e06f91297b0f3f2fa36Sven Eckelmannint batadv_debugfs_add_meshif(struct net_device *dev)
341c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
342c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct bat_priv *bat_priv = netdev_priv(dev);
343c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct bat_debuginfo **bat_debug;
344c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct dentry *file;
345c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
3469e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	if (!batadv_debugfs)
347c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		goto out;
348c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
3499e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	bat_priv->debug_dir = debugfs_create_dir(dev->name, batadv_debugfs);
350c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	if (!bat_priv->debug_dir)
351c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		goto out;
352c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
3539039dc7e8a42864744665bf0905f48c2724f6e3eSven Eckelmann	if (batadv_socket_setup(bat_priv) < 0)
3545346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann		goto rem_attr;
3555346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann
3569e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	if (batadv_debug_log_setup(bat_priv) < 0)
3575346c35ebfbdb1727e60079456dd8071cb888059Sven Eckelmann		goto rem_attr;
358c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
3599e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	for (bat_debug = batadv_mesh_debuginfos; *bat_debug; ++bat_debug) {
360c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		file = debugfs_create_file(((*bat_debug)->attr).name,
361c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann					  S_IFREG | ((*bat_debug)->attr).mode,
362c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann					  bat_priv->debug_dir,
363c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann					  dev, &(*bat_debug)->fops);
364c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		if (!file) {
3653e34819e0eafaa6c873e9704bb478c0cdd6bb481Sven Eckelmann			batadv_err(dev, "Can't add debugfs file: %s/%s\n",
3663e34819e0eafaa6c873e9704bb478c0cdd6bb481Sven Eckelmann				   dev->name, ((*bat_debug)->attr).name);
367c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann			goto rem_attr;
368c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		}
369c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	}
370c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
371c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return 0;
372c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannrem_attr:
373c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	debugfs_remove_recursive(bat_priv->debug_dir);
374c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	bat_priv->debug_dir = NULL;
375c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmannout:
376c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#ifdef CONFIG_DEBUG_FS
377c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return -ENOMEM;
378c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#else
379c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	return 0;
380c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann#endif /* CONFIG_DEBUG_FS */
381c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
382c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
38340a072d777a4f417c0296e06f91297b0f3f2fa36Sven Eckelmannvoid batadv_debugfs_del_meshif(struct net_device *dev)
384c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann{
385c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	struct bat_priv *bat_priv = netdev_priv(dev);
386c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
3879e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	batadv_debug_log_cleanup(bat_priv);
388c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann
3899e466250ede375482a9a65ca60765d24303099e9Sven Eckelmann	if (batadv_debugfs) {
390c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		debugfs_remove_recursive(bat_priv->debug_dir);
391c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann		bat_priv->debug_dir = NULL;
392c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann	}
393c6c8fea29769d998d94fcec9b9f14d4b52b349d3Sven Eckelmann}
394