2017-11-19 17:05:11 +03:00
// SPDX-License-Identifier: GPL-2.0
2019-01-01 01:59:59 +03:00
/* Copyright (C) 2010-2019 B.A.T.M.A.N. contributors:
2010-12-13 14:19:28 +03:00
*
* Marek Lindner
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2013-11-03 23:40:48 +04:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2010-12-13 14:19:28 +03:00
*/
2015-04-17 20:40:28 +03:00
# include "debugfs.h"
2010-12-13 14:19:28 +03:00
# include "main.h"
2018-10-21 12:30:29 +03:00
# include <asm/current.h>
2018-06-01 20:24:23 +03:00
# include <linux/dcache.h>
2010-12-13 14:19:28 +03:00
# include <linux/debugfs.h>
2017-01-28 12:23:30 +03:00
# include <linux/err.h>
2015-04-17 20:40:28 +03:00
# include <linux/errno.h>
# include <linux/export.h>
# include <linux/fs.h>
# include <linux/netdevice.h>
# include <linux/printk.h>
2018-10-21 12:30:29 +03:00
# include <linux/sched.h>
2015-04-17 20:40:28 +03:00
# include <linux/seq_file.h>
# include <linux/stat.h>
# include <linux/stddef.h>
# include <linux/stringify.h>
# include <linux/sysfs.h>
2016-07-03 14:31:34 +03:00
# include <net/net_namespace.h>
2010-12-13 14:19:28 +03:00
2016-05-15 12:07:44 +03:00
# include "bat_algo.h"
2012-01-22 23:00:21 +04:00
# include "bridge_loop_avoidance.h"
2012-06-30 22:01:19 +04:00
# include "distributed-arp-table.h"
2015-04-17 20:40:28 +03:00
# include "gateway_client.h"
# include "icmp_socket.h"
2016-05-16 00:48:31 +03:00
# include "log.h"
2016-05-10 19:41:27 +03:00
# include "multicast.h"
2013-01-25 14:12:39 +04:00
# include "network-coding.h"
2015-04-17 20:40:28 +03:00
# include "originator.h"
# include "translation-table.h"
2010-12-13 14:19:28 +03:00
2012-05-12 20:33:50 +04:00
static struct dentry * batadv_debugfs ;
2010-12-13 14:19:28 +03:00
2018-08-11 00:36:15 +03:00
/**
* batadv_debugfs_deprecated ( ) - Log use of deprecated batadv debugfs access
* @ file : file which was accessed
* @ alt : explanation what can be used as alternative
*/
void batadv_debugfs_deprecated ( struct file * file , const char * alt )
{
struct dentry * dentry = file_dentry ( file ) ;
const char * name = dentry - > d_name . name ;
pr_warn_ratelimited ( DEPRECATED " %s (pid %d) Use of debugfs file \" %s \" . \n %s " ,
current - > comm , task_pid_nr ( current ) , name , alt ) ;
}
2012-05-12 20:33:50 +04:00
static int batadv_algorithms_open ( struct inode * inode , struct file * file )
2011-11-28 13:40:17 +04:00
{
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_ROUTING_ALGOS instead \n " ) ;
2012-05-12 04:09:42 +04:00
return single_open ( file , batadv_algo_seq_print_text , NULL ) ;
2011-11-28 13:40:17 +04:00
}
2015-08-04 16:09:57 +03:00
static int neighbors_open ( struct inode * inode , struct file * file )
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_NEIGHBORS instead \n " ) ;
2015-08-04 16:09:57 +03:00
return single_open ( file , batadv_hardif_neigh_seq_print_text , net_dev ) ;
}
2012-05-12 20:33:50 +04:00
static int batadv_originators_open ( struct inode * inode , struct file * file )
2010-12-13 14:19:28 +03:00
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2014-05-10 20:56:37 +04:00
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_ORIGINATORS instead \n " ) ;
2012-05-12 04:09:34 +04:00
return single_open ( file , batadv_orig_seq_print_text , net_dev ) ;
2010-12-13 14:19:28 +03:00
}
2013-11-21 14:52:16 +04:00
/**
2017-12-02 21:51:47 +03:00
* batadv_originators_hardif_open ( ) - handles debugfs output for the originator
* table of an hard interface
2013-11-21 14:52:16 +04:00
* @ inode : inode pointer to debugfs file
* @ file : pointer to the seq_file
2015-10-31 14:29:29 +03:00
*
* Return : 0 on success or negative error number in case of failure
2013-11-21 14:52:16 +04:00
*/
static int batadv_originators_hardif_open ( struct inode * inode ,
struct file * file )
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2014-05-10 20:56:37 +04:00
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_HARDIFS instead \n " ) ;
2013-11-21 14:52:16 +04:00
return single_open ( file , batadv_orig_hardif_seq_print_text , net_dev ) ;
}
2012-05-12 20:33:50 +04:00
static int batadv_gateways_open ( struct inode * inode , struct file * file )
2010-12-13 14:19:28 +03:00
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2014-05-10 20:56:37 +04:00
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_GATEWAYS instead \n " ) ;
2012-05-12 04:09:29 +04:00
return single_open ( file , batadv_gw_client_seq_print_text , net_dev ) ;
2010-12-13 14:19:28 +03:00
}
2012-05-12 20:33:50 +04:00
static int batadv_transtable_global_open ( struct inode * inode , struct file * file )
2010-12-13 14:19:28 +03:00
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2014-05-10 20:56:37 +04:00
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_TRANSTABLE_GLOBAL instead \n " ) ;
2012-05-12 04:09:39 +04:00
return single_open ( file , batadv_tt_global_seq_print_text , net_dev ) ;
2010-12-13 14:19:28 +03:00
}
2012-01-22 23:00:27 +04:00
# ifdef CONFIG_BATMAN_ADV_BLA
2012-05-12 20:33:50 +04:00
static int batadv_bla_claim_table_open ( struct inode * inode , struct file * file )
2012-01-22 23:00:21 +04:00
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2014-05-10 20:56:37 +04:00
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_BLA_CLAIM instead \n " ) ;
2012-05-12 15:38:47 +04:00
return single_open ( file , batadv_bla_claim_table_seq_print_text ,
net_dev ) ;
2012-01-22 23:00:21 +04:00
}
2012-06-18 20:39:26 +04:00
static int batadv_bla_backbone_table_open ( struct inode * inode ,
struct file * file )
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2014-05-10 20:56:37 +04:00
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_BLA_BACKBONE instead \n " ) ;
2012-06-18 20:39:26 +04:00
return single_open ( file , batadv_bla_backbone_table_seq_print_text ,
net_dev ) ;
}
2012-01-22 23:00:27 +04:00
# endif
2012-01-22 23:00:21 +04:00
2011-11-06 15:23:55 +04:00
# ifdef CONFIG_BATMAN_ADV_DAT
2012-06-30 22:01:19 +04:00
/**
2018-07-05 15:42:49 +03:00
* batadv_dat_cache_open ( ) - Prepare file handler for reads from dat_cache
2012-06-30 22:01:19 +04:00
* @ inode : inode which was opened
* @ file : file handle to be initialized
2015-10-31 14:29:29 +03:00
*
* Return : 0 on success or negative error number in case of failure
2012-06-30 22:01:19 +04:00
*/
static int batadv_dat_cache_open ( struct inode * inode , struct file * file )
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2014-05-10 20:56:37 +04:00
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_DAT_CACHE instead \n " ) ;
2012-06-30 22:01:19 +04:00
return single_open ( file , batadv_dat_cache_seq_print_text , net_dev ) ;
}
2011-11-06 15:23:55 +04:00
# endif
2012-06-30 22:01:19 +04:00
2012-05-12 20:33:50 +04:00
static int batadv_transtable_local_open ( struct inode * inode , struct file * file )
2010-12-13 14:19:28 +03:00
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2014-05-10 20:56:37 +04:00
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_TRANSTABLE_LOCAL instead \n " ) ;
2012-05-12 04:09:39 +04:00
return single_open ( file , batadv_tt_local_seq_print_text , net_dev ) ;
2010-12-13 14:19:28 +03:00
}
2012-06-06 00:31:27 +04:00
struct batadv_debuginfo {
2010-12-13 14:19:28 +03:00
struct attribute attr ;
const struct file_operations fops ;
} ;
2013-01-25 14:12:39 +04:00
# ifdef CONFIG_BATMAN_ADV_NC
static int batadv_nc_nodes_open ( struct inode * inode , struct file * file )
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2014-05-10 20:56:37 +04:00
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file , " " ) ;
2013-01-25 14:12:39 +04:00
return single_open ( file , batadv_nc_nodes_seq_print_text , net_dev ) ;
}
# endif
2016-05-10 19:41:27 +03:00
# ifdef CONFIG_BATMAN_ADV_MCAST
/**
2017-12-02 21:51:47 +03:00
* batadv_mcast_flags_open ( ) - prepare file handler for reads from mcast_flags
2016-05-10 19:41:27 +03:00
* @ inode : inode which was opened
* @ file : file handle to be initialized
*
* Return : 0 on success or negative error number in case of failure
*/
static int batadv_mcast_flags_open ( struct inode * inode , struct file * file )
{
struct net_device * net_dev = ( struct net_device * ) inode - > i_private ;
2018-08-11 00:36:15 +03:00
batadv_debugfs_deprecated ( file ,
" Use genl command BATADV_CMD_GET_MCAST_FLAGS instead \n " ) ;
2016-05-10 19:41:27 +03:00
return single_open ( file , batadv_mcast_flags_seq_print_text , net_dev ) ;
}
# endif
2012-06-04 00:19:07 +04:00
# define BATADV_DEBUGINFO(_name, _mode, _open) \
2012-06-06 00:31:27 +04:00
struct batadv_debuginfo batadv_debuginfo_ # # _name = { \
2016-03-11 16:01:11 +03:00
. attr = { \
. name = __stringify ( _name ) , \
. mode = _mode , \
} , \
. fops = { \
. owner = THIS_MODULE , \
. open = _open , \
. read = seq_read , \
. llseek = seq_lseek , \
. release = single_release , \
} , \
2014-05-15 13:24:26 +04:00
}
2010-12-13 14:19:28 +03:00
2012-10-16 12:04:39 +04:00
/* the following attributes are general and therefore they will be directly
* placed in the BATADV_DEBUGFS_SUBDIR subdirectory of debugfs
*/
2016-09-01 11:25:12 +03:00
static BATADV_DEBUGINFO ( routing_algos , 0444 , batadv_algorithms_open ) ;
2012-10-16 12:04:39 +04:00
static struct batadv_debuginfo * batadv_general_debuginfos [ ] = {
& batadv_debuginfo_routing_algos ,
NULL ,
} ;
/* The following attributes are per soft interface */
2016-09-01 11:25:12 +03:00
static BATADV_DEBUGINFO ( neighbors , 0444 , neighbors_open ) ;
static BATADV_DEBUGINFO ( originators , 0444 , batadv_originators_open ) ;
static BATADV_DEBUGINFO ( gateways , 0444 , batadv_gateways_open ) ;
static BATADV_DEBUGINFO ( transtable_global , 0444 , batadv_transtable_global_open ) ;
2012-01-22 23:00:27 +04:00
# ifdef CONFIG_BATMAN_ADV_BLA
2016-09-01 11:25:12 +03:00
static BATADV_DEBUGINFO ( bla_claim_table , 0444 , batadv_bla_claim_table_open ) ;
static BATADV_DEBUGINFO ( bla_backbone_table , 0444 ,
2012-06-18 20:39:26 +04:00
batadv_bla_backbone_table_open ) ;
2012-01-22 23:00:27 +04:00
# endif
2011-11-06 15:23:55 +04:00
# ifdef CONFIG_BATMAN_ADV_DAT
2016-09-01 11:25:12 +03:00
static BATADV_DEBUGINFO ( dat_cache , 0444 , batadv_dat_cache_open ) ;
2011-11-06 15:23:55 +04:00
# endif
2016-09-01 11:25:12 +03:00
static BATADV_DEBUGINFO ( transtable_local , 0444 , batadv_transtable_local_open ) ;
2013-01-25 14:12:39 +04:00
# ifdef CONFIG_BATMAN_ADV_NC
2016-09-01 11:25:12 +03:00
static BATADV_DEBUGINFO ( nc_nodes , 0444 , batadv_nc_nodes_open ) ;
2013-01-25 14:12:39 +04:00
# endif
2016-05-10 19:41:27 +03:00
# ifdef CONFIG_BATMAN_ADV_MCAST
2016-09-01 11:25:12 +03:00
static BATADV_DEBUGINFO ( mcast_flags , 0444 , batadv_mcast_flags_open ) ;
2016-05-10 19:41:27 +03:00
# endif
2010-12-13 14:19:28 +03:00
2012-06-06 00:31:27 +04:00
static struct batadv_debuginfo * batadv_mesh_debuginfos [ ] = {
2015-08-04 16:09:57 +03:00
& batadv_debuginfo_neighbors ,
2012-05-12 20:33:50 +04:00
& batadv_debuginfo_originators ,
& batadv_debuginfo_gateways ,
& batadv_debuginfo_transtable_global ,
2012-01-22 23:00:27 +04:00
# ifdef CONFIG_BATMAN_ADV_BLA
2012-05-12 20:33:50 +04:00
& batadv_debuginfo_bla_claim_table ,
2012-06-18 20:39:26 +04:00
& batadv_debuginfo_bla_backbone_table ,
2012-01-22 23:00:27 +04:00
# endif
2011-11-06 15:23:55 +04:00
# ifdef CONFIG_BATMAN_ADV_DAT
2012-06-30 22:01:19 +04:00
& batadv_debuginfo_dat_cache ,
2011-11-06 15:23:55 +04:00
# endif
2012-05-12 20:33:50 +04:00
& batadv_debuginfo_transtable_local ,
2013-01-25 14:12:39 +04:00
# ifdef CONFIG_BATMAN_ADV_NC
& batadv_debuginfo_nc_nodes ,
2016-05-10 19:41:27 +03:00
# endif
# ifdef CONFIG_BATMAN_ADV_MCAST
& batadv_debuginfo_mcast_flags ,
2013-01-25 14:12:39 +04:00
# endif
2010-12-13 14:19:28 +03:00
NULL ,
} ;
2013-11-21 17:16:12 +04:00
# define BATADV_HARDIF_DEBUGINFO(_name, _mode, _open) \
struct batadv_debuginfo batadv_hardif_debuginfo_ # # _name = { \
. attr = { \
. name = __stringify ( _name ) , \
. mode = _mode , \
} , \
. fops = { \
. owner = THIS_MODULE , \
. open = _open , \
. read = seq_read , \
. llseek = seq_lseek , \
. release = single_release , \
} , \
2014-05-15 13:24:26 +04:00
}
2014-09-01 16:37:27 +04:00
2016-09-01 11:25:12 +03:00
static BATADV_HARDIF_DEBUGINFO ( originators , 0444 ,
2013-11-21 14:52:16 +04:00
batadv_originators_hardif_open ) ;
2013-11-21 17:16:12 +04:00
static struct batadv_debuginfo * batadv_hardif_debuginfos [ ] = {
2013-11-21 14:52:16 +04:00
& batadv_hardif_debuginfo_originators ,
2013-11-21 17:16:12 +04:00
NULL ,
} ;
2017-12-02 21:51:53 +03:00
/**
* batadv_debugfs_init ( ) - Initialize soft interface independent debugfs entries
*/
2012-05-12 04:09:23 +04:00
void batadv_debugfs_init ( void )
2010-12-13 14:19:28 +03:00
{
2012-10-16 12:04:39 +04:00
struct batadv_debuginfo * * bat_debug ;
2011-11-28 13:40:17 +04:00
struct dentry * file ;
2012-06-04 00:19:08 +04:00
batadv_debugfs = debugfs_create_dir ( BATADV_DEBUGFS_SUBDIR , NULL ) ;
2012-05-12 20:33:50 +04:00
if ( batadv_debugfs = = ERR_PTR ( - ENODEV ) )
batadv_debugfs = NULL ;
2011-11-28 13:40:17 +04:00
2012-05-12 20:33:50 +04:00
if ( ! batadv_debugfs )
2012-10-16 12:04:39 +04:00
goto err ;
2011-11-28 13:40:17 +04:00
2012-10-16 12:04:39 +04:00
for ( bat_debug = batadv_general_debuginfos ; * bat_debug ; + + bat_debug ) {
file = debugfs_create_file ( ( ( * bat_debug ) - > attr ) . name ,
S_IFREG | ( ( * bat_debug ) - > attr ) . mode ,
batadv_debugfs , NULL ,
& ( * bat_debug ) - > fops ) ;
if ( ! file ) {
pr_err ( " Can't add general debugfs file: %s \n " ,
( ( * bat_debug ) - > attr ) . name ) ;
goto err ;
}
}
2011-11-28 13:40:17 +04:00
return ;
2012-10-16 12:04:39 +04:00
err :
debugfs_remove_recursive ( batadv_debugfs ) ;
2013-11-21 17:16:12 +04:00
batadv_debugfs = NULL ;
2010-12-13 14:19:28 +03:00
}
2017-12-02 21:51:53 +03:00
/**
* batadv_debugfs_destroy ( ) - Remove all debugfs entries
*/
2012-05-12 04:09:23 +04:00
void batadv_debugfs_destroy ( void )
2010-12-13 14:19:28 +03:00
{
2012-11-29 04:03:31 +04:00
debugfs_remove_recursive ( batadv_debugfs ) ;
batadv_debugfs = NULL ;
2010-12-13 14:19:28 +03:00
}
2013-11-21 17:16:12 +04:00
/**
2017-12-02 21:51:47 +03:00
* batadv_debugfs_add_hardif ( ) - creates the base directory for a hard interface
2013-11-21 17:16:12 +04:00
* in debugfs .
* @ hard_iface : hard interface which should be added .
2015-10-31 14:29:29 +03:00
*
* Return : 0 on success or negative error number in case of failure
2013-11-21 17:16:12 +04:00
*/
int batadv_debugfs_add_hardif ( struct batadv_hard_iface * hard_iface )
{
2016-07-03 14:31:34 +03:00
struct net * net = dev_net ( hard_iface - > net_dev ) ;
2013-11-21 17:16:12 +04:00
struct batadv_debuginfo * * bat_debug ;
struct dentry * file ;
if ( ! batadv_debugfs )
goto out ;
2016-07-03 14:31:34 +03:00
if ( net ! = & init_net )
return 0 ;
2013-11-21 17:16:12 +04:00
hard_iface - > debug_dir = debugfs_create_dir ( hard_iface - > net_dev - > name ,
batadv_debugfs ) ;
if ( ! hard_iface - > debug_dir )
goto out ;
for ( bat_debug = batadv_hardif_debuginfos ; * bat_debug ; + + bat_debug ) {
file = debugfs_create_file ( ( ( * bat_debug ) - > attr ) . name ,
S_IFREG | ( ( * bat_debug ) - > attr ) . mode ,
hard_iface - > debug_dir ,
hard_iface - > net_dev ,
& ( * bat_debug ) - > fops ) ;
if ( ! file )
goto rem_attr ;
}
return 0 ;
rem_attr :
debugfs_remove_recursive ( hard_iface - > debug_dir ) ;
hard_iface - > debug_dir = NULL ;
out :
return - ENOMEM ;
}
2018-06-01 20:24:23 +03:00
/**
* batadv_debugfs_rename_hardif ( ) - Fix debugfs path for renamed hardif
* @ hard_iface : hard interface which was renamed
*/
void batadv_debugfs_rename_hardif ( struct batadv_hard_iface * hard_iface )
{
const char * name = hard_iface - > net_dev - > name ;
struct dentry * dir ;
struct dentry * d ;
dir = hard_iface - > debug_dir ;
if ( ! dir )
return ;
d = debugfs_rename ( dir - > d_parent , dir , dir - > d_parent , name ) ;
if ( ! d )
pr_err ( " Can't rename debugfs dir to %s \n " , name ) ;
}
2013-11-21 17:16:12 +04:00
/**
2017-12-02 21:51:47 +03:00
* batadv_debugfs_del_hardif ( ) - delete the base directory for a hard interface
2013-11-21 17:16:12 +04:00
* in debugfs .
* @ hard_iface : hard interface which is deleted .
*/
void batadv_debugfs_del_hardif ( struct batadv_hard_iface * hard_iface )
{
2016-07-03 14:31:34 +03:00
struct net * net = dev_net ( hard_iface - > net_dev ) ;
if ( net ! = & init_net )
return ;
2013-11-21 17:16:12 +04:00
if ( batadv_debugfs ) {
debugfs_remove_recursive ( hard_iface - > debug_dir ) ;
hard_iface - > debug_dir = NULL ;
}
}
2017-12-02 21:51:53 +03:00
/**
* batadv_debugfs_add_meshif ( ) - Initialize interface dependent debugfs entries
* @ dev : netdev struct of the soft interface
*
* Return : 0 on success or negative error number in case of failure
*/
2012-05-12 04:09:23 +04:00
int batadv_debugfs_add_meshif ( struct net_device * dev )
2010-12-13 14:19:28 +03:00
{
2012-06-06 00:31:31 +04:00
struct batadv_priv * bat_priv = netdev_priv ( dev ) ;
2012-06-06 00:31:27 +04:00
struct batadv_debuginfo * * bat_debug ;
2016-07-03 14:31:34 +03:00
struct net * net = dev_net ( dev ) ;
2010-12-13 14:19:28 +03:00
struct dentry * file ;
2012-05-12 20:33:50 +04:00
if ( ! batadv_debugfs )
2010-12-13 14:19:28 +03:00
goto out ;
2016-07-03 14:31:34 +03:00
if ( net ! = & init_net )
return 0 ;
2012-05-12 20:33:50 +04:00
bat_priv - > debug_dir = debugfs_create_dir ( dev - > name , batadv_debugfs ) ;
2010-12-13 14:19:28 +03:00
if ( ! bat_priv - > debug_dir )
goto out ;
2012-05-12 04:09:33 +04:00
if ( batadv_socket_setup ( bat_priv ) < 0 )
2012-05-05 15:27:28 +04:00
goto rem_attr ;
2012-05-12 20:33:50 +04:00
if ( batadv_debug_log_setup ( bat_priv ) < 0 )
2012-05-05 15:27:28 +04:00
goto rem_attr ;
2010-12-13 14:19:28 +03:00
2012-05-12 20:33:50 +04:00
for ( bat_debug = batadv_mesh_debuginfos ; * bat_debug ; + + bat_debug ) {
2010-12-13 14:19:28 +03:00
file = debugfs_create_file ( ( ( * bat_debug ) - > attr ) . name ,
2012-06-19 22:26:30 +04:00
S_IFREG | ( ( * bat_debug ) - > attr ) . mode ,
bat_priv - > debug_dir ,
dev , & ( * bat_debug ) - > fops ) ;
2010-12-13 14:19:28 +03:00
if ( ! file ) {
2012-05-16 22:23:22 +04:00
batadv_err ( dev , " Can't add debugfs file: %s/%s \n " ,
dev - > name , ( ( * bat_debug ) - > attr ) . name ) ;
2010-12-13 14:19:28 +03:00
goto rem_attr ;
}
}
2013-01-25 14:12:39 +04:00
if ( batadv_nc_init_debugfs ( bat_priv ) < 0 )
goto rem_attr ;
2010-12-13 14:19:28 +03:00
return 0 ;
rem_attr :
debugfs_remove_recursive ( bat_priv - > debug_dir ) ;
bat_priv - > debug_dir = NULL ;
out :
return - ENOMEM ;
}
2018-06-01 20:24:24 +03:00
/**
* batadv_debugfs_rename_meshif ( ) - Fix debugfs path for renamed softif
* @ dev : net_device which was renamed
*/
void batadv_debugfs_rename_meshif ( struct net_device * dev )
{
struct batadv_priv * bat_priv = netdev_priv ( dev ) ;
const char * name = dev - > name ;
struct dentry * dir ;
struct dentry * d ;
dir = bat_priv - > debug_dir ;
if ( ! dir )
return ;
d = debugfs_rename ( dir - > d_parent , dir , dir - > d_parent , name ) ;
if ( ! d )
pr_err ( " Can't rename debugfs dir to %s \n " , name ) ;
}
2017-12-02 21:51:53 +03:00
/**
* batadv_debugfs_del_meshif ( ) - Remove interface dependent debugfs entries
* @ dev : netdev struct of the soft interface
*/
2012-05-12 04:09:23 +04:00
void batadv_debugfs_del_meshif ( struct net_device * dev )
2010-12-13 14:19:28 +03:00
{
2012-06-06 00:31:31 +04:00
struct batadv_priv * bat_priv = netdev_priv ( dev ) ;
2016-07-03 14:31:34 +03:00
struct net * net = dev_net ( dev ) ;
if ( net ! = & init_net )
return ;
2010-12-13 14:19:28 +03:00
2012-05-12 20:33:50 +04:00
batadv_debug_log_cleanup ( bat_priv ) ;
2010-12-13 14:19:28 +03:00
2012-05-12 20:33:50 +04:00
if ( batadv_debugfs ) {
2010-12-13 14:19:28 +03:00
debugfs_remove_recursive ( bat_priv - > debug_dir ) ;
bat_priv - > debug_dir = NULL ;
}
}