2007-12-21 07:42:57 +03:00
/*
* xfrm_proc . c
*
* Copyright ( C ) 2006 - 2007 USAGI / WIDE Project
*
* Authors : Masahide NAKAMURA < nakam @ linux - ipv6 . org >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
# include <linux/proc_fs.h>
# include <linux/seq_file.h>
2011-07-15 19:47:34 +04:00
# include <linux/export.h>
2007-12-21 07:42:57 +03:00
# include <net/snmp.h>
# include <net/xfrm.h>
2010-01-22 13:17:26 +03:00
static const struct snmp_mib xfrm_mib_list [ ] = {
2007-12-21 07:42:57 +03:00
SNMP_MIB_ITEM ( " XfrmInError " , LINUX_MIB_XFRMINERROR ) ,
SNMP_MIB_ITEM ( " XfrmInBufferError " , LINUX_MIB_XFRMINBUFFERERROR ) ,
SNMP_MIB_ITEM ( " XfrmInHdrError " , LINUX_MIB_XFRMINHDRERROR ) ,
SNMP_MIB_ITEM ( " XfrmInNoStates " , LINUX_MIB_XFRMINNOSTATES ) ,
SNMP_MIB_ITEM ( " XfrmInStateProtoError " , LINUX_MIB_XFRMINSTATEPROTOERROR ) ,
SNMP_MIB_ITEM ( " XfrmInStateModeError " , LINUX_MIB_XFRMINSTATEMODEERROR ) ,
2008-02-01 04:14:58 +03:00
SNMP_MIB_ITEM ( " XfrmInStateSeqError " , LINUX_MIB_XFRMINSTATESEQERROR ) ,
2007-12-21 07:42:57 +03:00
SNMP_MIB_ITEM ( " XfrmInStateExpired " , LINUX_MIB_XFRMINSTATEEXPIRED ) ,
SNMP_MIB_ITEM ( " XfrmInStateMismatch " , LINUX_MIB_XFRMINSTATEMISMATCH ) ,
SNMP_MIB_ITEM ( " XfrmInStateInvalid " , LINUX_MIB_XFRMINSTATEINVALID ) ,
SNMP_MIB_ITEM ( " XfrmInTmplMismatch " , LINUX_MIB_XFRMINTMPLMISMATCH ) ,
SNMP_MIB_ITEM ( " XfrmInNoPols " , LINUX_MIB_XFRMINNOPOLS ) ,
SNMP_MIB_ITEM ( " XfrmInPolBlock " , LINUX_MIB_XFRMINPOLBLOCK ) ,
SNMP_MIB_ITEM ( " XfrmInPolError " , LINUX_MIB_XFRMINPOLERROR ) ,
SNMP_MIB_ITEM ( " XfrmOutError " , LINUX_MIB_XFRMOUTERROR ) ,
SNMP_MIB_ITEM ( " XfrmOutBundleGenError " , LINUX_MIB_XFRMOUTBUNDLEGENERROR ) ,
SNMP_MIB_ITEM ( " XfrmOutBundleCheckError " , LINUX_MIB_XFRMOUTBUNDLECHECKERROR ) ,
SNMP_MIB_ITEM ( " XfrmOutNoStates " , LINUX_MIB_XFRMOUTNOSTATES ) ,
SNMP_MIB_ITEM ( " XfrmOutStateProtoError " , LINUX_MIB_XFRMOUTSTATEPROTOERROR ) ,
SNMP_MIB_ITEM ( " XfrmOutStateModeError " , LINUX_MIB_XFRMOUTSTATEMODEERROR ) ,
2008-02-01 04:14:58 +03:00
SNMP_MIB_ITEM ( " XfrmOutStateSeqError " , LINUX_MIB_XFRMOUTSTATESEQERROR ) ,
2007-12-21 07:42:57 +03:00
SNMP_MIB_ITEM ( " XfrmOutStateExpired " , LINUX_MIB_XFRMOUTSTATEEXPIRED ) ,
SNMP_MIB_ITEM ( " XfrmOutPolBlock " , LINUX_MIB_XFRMOUTPOLBLOCK ) ,
SNMP_MIB_ITEM ( " XfrmOutPolDead " , LINUX_MIB_XFRMOUTPOLDEAD ) ,
SNMP_MIB_ITEM ( " XfrmOutPolError " , LINUX_MIB_XFRMOUTPOLERROR ) ,
2010-02-18 06:35:07 +03:00
SNMP_MIB_ITEM ( " XfrmFwdHdrError " , LINUX_MIB_XFRMFWDHDRERROR ) ,
2012-12-28 12:06:28 +04:00
SNMP_MIB_ITEM ( " XfrmOutStateInvalid " , LINUX_MIB_XFRMOUTSTATEINVALID ) ,
2013-06-06 06:15:54 +04:00
SNMP_MIB_ITEM ( " XfrmAcquireError " , LINUX_MIB_XFRMACQUIREERROR ) ,
2007-12-21 07:42:57 +03:00
SNMP_MIB_SENTINEL
} ;
static int xfrm_statistics_seq_show ( struct seq_file * seq , void * v )
{
2016-09-30 06:29:02 +03:00
unsigned long buff [ LINUX_MIB_XFRMMAX ] ;
2008-11-26 05:00:14 +03:00
struct net * net = seq - > private ;
2007-12-21 07:42:57 +03:00
int i ;
2016-09-30 06:29:02 +03:00
memset ( buff , 0 , sizeof ( unsigned long ) * LINUX_MIB_XFRMMAX ) ;
snmp_get_cpu_field_batch ( buff , xfrm_mib_list ,
net - > mib . xfrm_statistics ) ;
2013-12-24 05:43:46 +04:00
for ( i = 0 ; xfrm_mib_list [ i ] . name ; i + + )
2007-12-21 07:42:57 +03:00
seq_printf ( seq , " %-24s \t %lu \n " , xfrm_mib_list [ i ] . name ,
2016-09-30 06:29:02 +03:00
buff [ i ] ) ;
2007-12-21 07:42:57 +03:00
return 0 ;
}
static int xfrm_statistics_seq_open ( struct inode * inode , struct file * file )
{
2008-11-26 05:00:14 +03:00
return single_open_net ( inode , file , xfrm_statistics_seq_show ) ;
2007-12-21 07:42:57 +03:00
}
2009-09-01 23:25:05 +04:00
static const struct file_operations xfrm_statistics_seq_fops = {
2007-12-21 07:42:57 +03:00
. owner = THIS_MODULE ,
. open = xfrm_statistics_seq_open ,
. read = seq_read ,
. llseek = seq_lseek ,
2008-11-26 05:00:14 +03:00
. release = single_release_net ,
2007-12-21 07:42:57 +03:00
} ;
2008-11-26 05:00:14 +03:00
int __net_init xfrm_proc_init ( struct net * net )
2007-12-21 07:42:57 +03:00
{
2013-02-18 05:34:54 +04:00
if ( ! proc_create ( " xfrm_stat " , S_IRUGO , net - > proc_net ,
& xfrm_statistics_seq_fops ) )
2008-11-26 05:00:14 +03:00
return - ENOMEM ;
return 0 ;
}
2007-12-21 07:42:57 +03:00
2008-11-26 05:00:14 +03:00
void xfrm_proc_fini ( struct net * net )
{
2013-02-18 05:34:56 +04:00
remove_proc_entry ( " xfrm_stat " , net - > proc_net ) ;
2007-12-21 07:42:57 +03:00
}