home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / net / snmp.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  4.0 KB  |  146 lines

  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.  *        $Id: snmp.h,v 1.19 2001/06/14 13:40:46 davem Exp $
  18.  *
  19.  */
  20.  
  21. #ifndef _SNMP_H
  22. #define _SNMP_H
  23.  
  24. #include <linux/cache.h>
  25. #include <linux/snmp.h>
  26.  
  27. /*
  28.  * Mibs are stored in array of unsigned long.
  29.  */
  30. /*
  31.  * struct snmp_mib{}
  32.  *  - list of entries for particular API (such as /proc/net/snmp)
  33.  *  - name of entries.
  34.  */
  35. struct snmp_mib {
  36.     char *name;
  37.     int entry;
  38. };
  39.  
  40. #define SNMP_MIB_ITEM(_name,_entry)    {    \
  41.     .name = _name,                \
  42.     .entry = _entry,            \
  43. }
  44.  
  45. #define SNMP_MIB_SENTINEL {    \
  46.     .name = NULL,        \
  47.     .entry = 0,        \
  48. }
  49.  
  50. /*
  51.  * We use all unsigned longs. Linux will soon be so reliable that even 
  52.  * these will rapidly get too small 8-). Seriously consider the IpInReceives 
  53.  * count on the 20Gb/s + networks people expect in a few years time!
  54.  */
  55.  
  56. /* 
  57.  * The rule for padding: 
  58.  * Best is power of two because then the right structure can be found by a 
  59.  * simple shift. The structure should be always cache line aligned.
  60.  * gcc needs n=alignto(cachelinesize, popcnt(sizeof(bla_mib))) shift/add 
  61.  * instructions to emulate multiply in case it is not power-of-two. 
  62.  * Currently n is always <=3 for all sizes so simple cache line alignment 
  63.  * is enough. 
  64.  * 
  65.  * The best solution would be a global CPU local area , especially on 64 
  66.  * and 128byte cacheline machine it makes a *lot* of sense -AK
  67.  */ 
  68.  
  69. #define __SNMP_MIB_ALIGN__    ____cacheline_aligned
  70.  
  71. /* IPstats */
  72. #define IPSTATS_MIB_MAX    __IPSTATS_MIB_MAX
  73. struct ipstats_mib {
  74.     unsigned long    mibs[IPSTATS_MIB_MAX];
  75. } __SNMP_MIB_ALIGN__;
  76.  
  77. /* ICMP */
  78. #define ICMP_MIB_DUMMY    __ICMP_MIB_MAX
  79. #define ICMP_MIB_MAX    (__ICMP_MIB_MAX + 1)
  80.  
  81. struct icmp_mib {
  82.     unsigned long    mibs[ICMP_MIB_MAX];
  83. } __SNMP_MIB_ALIGN__;
  84.  
  85. /* ICMP6 (IPv6-ICMP) */
  86. #define ICMP6_MIB_MAX    __ICMP6_MIB_MAX
  87. struct icmpv6_mib {
  88.     unsigned long    mibs[ICMP6_MIB_MAX];
  89. } __SNMP_MIB_ALIGN__;
  90.  
  91. /* TCP */
  92. #define TCP_MIB_MAX    __TCP_MIB_MAX
  93. struct tcp_mib {
  94.     unsigned long    mibs[TCP_MIB_MAX];
  95. } __SNMP_MIB_ALIGN__;
  96.  
  97. /* UDP */
  98. #define UDP_MIB_MAX    __UDP_MIB_MAX
  99. struct udp_mib {
  100.     unsigned long    mibs[UDP_MIB_MAX];
  101. } __SNMP_MIB_ALIGN__;
  102.  
  103. /* SCTP */
  104. #define SCTP_MIB_MAX    __SCTP_MIB_MAX
  105. struct sctp_mib {
  106.     unsigned long    mibs[SCTP_MIB_MAX];
  107. } __SNMP_MIB_ALIGN__;
  108.  
  109. /* Linux */
  110. #define LINUX_MIB_MAX    __LINUX_MIB_MAX
  111. struct linux_mib {
  112.     unsigned long    mibs[LINUX_MIB_MAX];
  113. };
  114.  
  115.  
  116. /* 
  117.  * FIXME: On x86 and some other CPUs the split into user and softirq parts
  118.  * is not needed because addl $1,memory is atomic against interrupts (but 
  119.  * atomic_inc would be overkill because of the lock cycles). Wants new 
  120.  * nonlocked_atomic_inc() primitives -AK
  121.  */ 
  122. #define DEFINE_SNMP_STAT(type, name)    \
  123.     __typeof__(type) *name[2]
  124. #define DECLARE_SNMP_STAT(type, name)    \
  125.     extern __typeof__(type) *name[2]
  126.  
  127. #define SNMP_STAT_BHPTR(name)    (name[0])
  128. #define SNMP_STAT_USRPTR(name)    (name[1])
  129.  
  130. #define SNMP_INC_STATS_BH(mib, field)     \
  131.     (per_cpu_ptr(mib[0], raw_smp_processor_id())->mibs[field]++)
  132. #define SNMP_INC_STATS_OFFSET_BH(mib, field, offset)    \
  133.     (per_cpu_ptr(mib[0], raw_smp_processor_id())->mibs[field + (offset)]++)
  134. #define SNMP_INC_STATS_USER(mib, field) \
  135.     (per_cpu_ptr(mib[1], raw_smp_processor_id())->mibs[field]++)
  136. #define SNMP_INC_STATS(mib, field)     \
  137.     (per_cpu_ptr(mib[!in_softirq()], raw_smp_processor_id())->mibs[field]++)
  138. #define SNMP_DEC_STATS(mib, field)     \
  139.     (per_cpu_ptr(mib[!in_softirq()], raw_smp_processor_id())->mibs[field]--)
  140. #define SNMP_ADD_STATS_BH(mib, field, addend)     \
  141.     (per_cpu_ptr(mib[0], raw_smp_processor_id())->mibs[field] += addend)
  142. #define SNMP_ADD_STATS_USER(mib, field, addend)     \
  143.     (per_cpu_ptr(mib[1], raw_smp_processor_id())->mibs[field] += addend)
  144.  
  145. #endif
  146.