Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * xfrm_proc.c
0004  *
0005  * Copyright (C)2006-2007 USAGI/WIDE Project
0006  *
0007  * Authors: Masahide NAKAMURA <nakam@linux-ipv6.org>
0008  */
0009 #include <linux/proc_fs.h>
0010 #include <linux/seq_file.h>
0011 #include <linux/export.h>
0012 #include <net/snmp.h>
0013 #include <net/xfrm.h>
0014 
0015 static const struct snmp_mib xfrm_mib_list[] = {
0016     SNMP_MIB_ITEM("XfrmInError", LINUX_MIB_XFRMINERROR),
0017     SNMP_MIB_ITEM("XfrmInBufferError", LINUX_MIB_XFRMINBUFFERERROR),
0018     SNMP_MIB_ITEM("XfrmInHdrError", LINUX_MIB_XFRMINHDRERROR),
0019     SNMP_MIB_ITEM("XfrmInNoStates", LINUX_MIB_XFRMINNOSTATES),
0020     SNMP_MIB_ITEM("XfrmInStateProtoError", LINUX_MIB_XFRMINSTATEPROTOERROR),
0021     SNMP_MIB_ITEM("XfrmInStateModeError", LINUX_MIB_XFRMINSTATEMODEERROR),
0022     SNMP_MIB_ITEM("XfrmInStateSeqError", LINUX_MIB_XFRMINSTATESEQERROR),
0023     SNMP_MIB_ITEM("XfrmInStateExpired", LINUX_MIB_XFRMINSTATEEXPIRED),
0024     SNMP_MIB_ITEM("XfrmInStateMismatch", LINUX_MIB_XFRMINSTATEMISMATCH),
0025     SNMP_MIB_ITEM("XfrmInStateInvalid", LINUX_MIB_XFRMINSTATEINVALID),
0026     SNMP_MIB_ITEM("XfrmInTmplMismatch", LINUX_MIB_XFRMINTMPLMISMATCH),
0027     SNMP_MIB_ITEM("XfrmInNoPols", LINUX_MIB_XFRMINNOPOLS),
0028     SNMP_MIB_ITEM("XfrmInPolBlock", LINUX_MIB_XFRMINPOLBLOCK),
0029     SNMP_MIB_ITEM("XfrmInPolError", LINUX_MIB_XFRMINPOLERROR),
0030     SNMP_MIB_ITEM("XfrmOutError", LINUX_MIB_XFRMOUTERROR),
0031     SNMP_MIB_ITEM("XfrmOutBundleGenError", LINUX_MIB_XFRMOUTBUNDLEGENERROR),
0032     SNMP_MIB_ITEM("XfrmOutBundleCheckError", LINUX_MIB_XFRMOUTBUNDLECHECKERROR),
0033     SNMP_MIB_ITEM("XfrmOutNoStates", LINUX_MIB_XFRMOUTNOSTATES),
0034     SNMP_MIB_ITEM("XfrmOutStateProtoError", LINUX_MIB_XFRMOUTSTATEPROTOERROR),
0035     SNMP_MIB_ITEM("XfrmOutStateModeError", LINUX_MIB_XFRMOUTSTATEMODEERROR),
0036     SNMP_MIB_ITEM("XfrmOutStateSeqError", LINUX_MIB_XFRMOUTSTATESEQERROR),
0037     SNMP_MIB_ITEM("XfrmOutStateExpired", LINUX_MIB_XFRMOUTSTATEEXPIRED),
0038     SNMP_MIB_ITEM("XfrmOutPolBlock", LINUX_MIB_XFRMOUTPOLBLOCK),
0039     SNMP_MIB_ITEM("XfrmOutPolDead", LINUX_MIB_XFRMOUTPOLDEAD),
0040     SNMP_MIB_ITEM("XfrmOutPolError", LINUX_MIB_XFRMOUTPOLERROR),
0041     SNMP_MIB_ITEM("XfrmFwdHdrError", LINUX_MIB_XFRMFWDHDRERROR),
0042     SNMP_MIB_ITEM("XfrmOutStateInvalid", LINUX_MIB_XFRMOUTSTATEINVALID),
0043     SNMP_MIB_ITEM("XfrmAcquireError", LINUX_MIB_XFRMACQUIREERROR),
0044     SNMP_MIB_SENTINEL
0045 };
0046 
0047 static int xfrm_statistics_seq_show(struct seq_file *seq, void *v)
0048 {
0049     unsigned long buff[LINUX_MIB_XFRMMAX];
0050     struct net *net = seq->private;
0051     int i;
0052 
0053     memset(buff, 0, sizeof(unsigned long) * LINUX_MIB_XFRMMAX);
0054 
0055     snmp_get_cpu_field_batch(buff, xfrm_mib_list,
0056                  net->mib.xfrm_statistics);
0057     for (i = 0; xfrm_mib_list[i].name; i++)
0058         seq_printf(seq, "%-24s\t%lu\n", xfrm_mib_list[i].name,
0059                         buff[i]);
0060 
0061     return 0;
0062 }
0063 
0064 int __net_init xfrm_proc_init(struct net *net)
0065 {
0066     if (!proc_create_net_single("xfrm_stat", 0444, net->proc_net,
0067              xfrm_statistics_seq_show, NULL))
0068         return -ENOMEM;
0069     return 0;
0070 }
0071 
0072 void xfrm_proc_fini(struct net *net)
0073 {
0074     remove_proc_entry("xfrm_stat", net->proc_net);
0075 }