LCOV - code coverage report
Current view: top level - include/net - snmp.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 7 7 100.0 %
Date: 2017-01-25 Functions: 0 0 -

          Line data    Source code
       1             : /*
       2             :  *
       3             :  *              SNMP MIB entries for the IP subsystem.
       4             :  *              
       5             :  *              Alan Cox <gw4pts@gw4pts.ampr.org>
       6             :  *
       7             :  *              We don't chose to implement SNMP in the kernel (this would
       8             :  *              be silly as SNMP is a pain in the backside in places). We do
       9             :  *              however need to collect the MIB statistics and export them
      10             :  *              out of /proc (eventually)
      11             :  *
      12             :  *              This program is free software; you can redistribute it and/or
      13             :  *              modify it under the terms of the GNU General Public License
      14             :  *              as published by the Free Software Foundation; either version
      15             :  *              2 of the License, or (at your option) any later version.
      16             :  *
      17             :  */
      18             :  
      19             : #ifndef _SNMP_H
      20             : #define _SNMP_H
      21             : 
      22             : #include <linux/cache.h>
      23             : #include <linux/snmp.h>
      24             : #include <linux/smp.h>
      25             : 
      26             : /*
      27             :  * Mibs are stored in array of unsigned long.
      28             :  */
      29             : /*
      30             :  * struct snmp_mib{}
      31             :  *  - list of entries for particular API (such as /proc/net/snmp)
      32             :  *  - name of entries.
      33             :  */
      34             : struct snmp_mib {
      35             :         char *name;
      36             :         int entry;
      37             : };
      38           1 : 
      39             : #define SNMP_MIB_ITEM(_name,_entry)     {       \
      40             :         .name = _name,                          \
      41             :         .entry = _entry,                        \
      42             : }
      43             : 
      44             : #define SNMP_MIB_SENTINEL {     \
      45             :         .name = NULL,           \
      46             :         .entry = 0,             \
      47             : }
      48             : 
      49             : /*
      50             :  * We use all unsigned longs. Linux will soon be so reliable that even 
      51             :  * these will rapidly get too small 8-). Seriously consider the IpInReceives 
      52             :  * count on the 20Gb/s + networks people expect in a few years time!
      53             :  */
      54             : 
      55             : /* 
      56             :  * The rule for padding: 
      57             :  * Best is power of two because then the right structure can be found by a 
      58             :  * simple shift. The structure should be always cache line aligned.
      59             :  * gcc needs n=alignto(cachelinesize, popcnt(sizeof(bla_mib))) shift/add 
      60             :  * instructions to emulate multiply in case it is not power-of-two. 
      61             :  * Currently n is always <=3 for all sizes so simple cache line alignment 
      62             :  * is enough. 
      63             :  * 
      64             :  * The best solution would be a global CPU local area , especially on 64 
      65             :  * and 128byte cacheline machine it makes a *lot* of sense -AK
      66             :  */ 
      67             : 
      68             : #define __SNMP_MIB_ALIGN__      ____cacheline_aligned
      69             : 
      70             : /* IPstats */
      71             : #define IPSTATS_MIB_MAX __IPSTATS_MIB_MAX
      72             : struct ipstats_mib {
      73             :         unsigned long   mibs[IPSTATS_MIB_MAX];
      74             : } __SNMP_MIB_ALIGN__;
      75           1 : 
      76             : /* ICMP */
      77             : #define ICMP_MIB_DUMMY  __ICMP_MIB_MAX
      78             : #define ICMP_MIB_MAX    (__ICMP_MIB_MAX + 1)
      79             : 
      80             : struct icmp_mib {
      81             :         unsigned long   mibs[ICMP_MIB_MAX];
      82             : } __SNMP_MIB_ALIGN__;
      83           1 : 
      84             : #define ICMPMSG_MIB_MAX __ICMPMSG_MIB_MAX
      85             : struct icmpmsg_mib {
      86             :         unsigned long   mibs[ICMPMSG_MIB_MAX];
      87             : } __SNMP_MIB_ALIGN__;
      88             : 
      89             : /* ICMP6 (IPv6-ICMP) */
      90             : #define ICMP6_MIB_MAX   __ICMP6_MIB_MAX
      91             : struct icmpv6_mib {
      92             :         unsigned long   mibs[ICMP6_MIB_MAX];
      93             : } __SNMP_MIB_ALIGN__;
      94             : 
      95             : #define ICMP6MSG_MIB_MAX  __ICMP6MSG_MIB_MAX
      96             : struct icmpv6msg_mib {
      97             :         unsigned long   mibs[ICMP6MSG_MIB_MAX];
      98             : } __SNMP_MIB_ALIGN__;
      99           1 : 
     100             : 
     101             : /* TCP */
     102             : #define TCP_MIB_MAX     __TCP_MIB_MAX
     103             : struct tcp_mib {
     104             :         unsigned long   mibs[TCP_MIB_MAX];
     105             : } __SNMP_MIB_ALIGN__;
     106           1 : 
     107             : /* UDP */
     108             : #define UDP_MIB_MAX     __UDP_MIB_MAX
     109             : struct udp_mib {
     110             :         unsigned long   mibs[UDP_MIB_MAX];
     111             : } __SNMP_MIB_ALIGN__;
     112           1 : 
     113             : /* Linux */
     114             : #define LINUX_MIB_MAX   __LINUX_MIB_MAX
     115             : struct linux_mib {
     116             :         unsigned long   mibs[LINUX_MIB_MAX];
     117             : };
     118             : 
     119             : /* Linux Xfrm */
     120             : #define LINUX_MIB_XFRMMAX       __LINUX_MIB_XFRMMAX
     121             : struct linux_xfrm_mib {
     122             :         unsigned long   mibs[LINUX_MIB_XFRMMAX];
     123             : };
     124           1 : 
     125             : /* 
     126             :  * FIXME: On x86 and some other CPUs the split into user and softirq parts
     127             :  * is not needed because addl $1,memory is atomic against interrupts (but 
     128             :  * atomic_inc would be overkill because of the lock cycles). Wants new 
     129             :  * nonlocked_atomic_inc() primitives -AK
     130             :  */ 
     131             : #define DEFINE_SNMP_STAT(type, name)    \
     132             :         __typeof__(type) *name[2]
     133             : #define DECLARE_SNMP_STAT(type, name)   \
     134             :         extern __typeof__(type) *name[2]
     135             : 
     136             : #define SNMP_STAT_BHPTR(name)   (name[0])
     137             : #define SNMP_STAT_USRPTR(name)  (name[1])
     138             : 
     139             : #define SNMP_INC_STATS_BH(mib, field)   \
     140             :                         __this_cpu_inc(mib[0]->mibs[field])
     141             : #define SNMP_INC_STATS_USER(mib, field) \
     142             :                         this_cpu_inc(mib[1]->mibs[field])
     143             : #define SNMP_INC_STATS(mib, field)      \
     144             :                         this_cpu_inc(mib[!in_softirq()]->mibs[field])
     145             : #define SNMP_DEC_STATS(mib, field)      \
     146             :                         this_cpu_dec(mib[!in_softirq()]->mibs[field])
     147             : #define SNMP_ADD_STATS_BH(mib, field, addend)   \
     148             :                         __this_cpu_add(mib[0]->mibs[field], addend)
     149             : #define SNMP_ADD_STATS_USER(mib, field, addend) \
     150             :                         this_cpu_add(mib[1]->mibs[field], addend)
     151             : #define SNMP_UPD_PO_STATS(mib, basefield, addend)       \
     152             :         do { \
     153             :                 __typeof__(mib[0]) ptr; \
     154             :                 preempt_disable(); \
     155             :                 ptr = this_cpu_ptr((mib)[!in_softirq()]); \
     156             :                 ptr->mibs[basefield##PKTS]++; \
     157             :                 ptr->mibs[basefield##OCTETS] += addend;\
     158             :                 preempt_enable(); \
     159             :         } while (0)
     160             : #define SNMP_UPD_PO_STATS_BH(mib, basefield, addend)    \
     161             :         do { \
     162             :                 __typeof__(mib[0]) ptr = \
     163             :                         __this_cpu_ptr((mib)[!in_softirq()]); \
     164             :                 ptr->mibs[basefield##PKTS]++; \
     165             :                 ptr->mibs[basefield##OCTETS] += addend;\
     166             :         } while (0)
     167             : #endif

Generated by: LCOV version 1.10