Root/
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 | const char *name; |
36 | int entry; |
37 | }; |
38 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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) __percpu *name[2] |
133 | #define DECLARE_SNMP_STAT(type, name) \ |
134 | extern __typeof__(type) __percpu *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 | /* |
152 | * Use "__typeof__(*mib[0]) *ptr" instead of "__typeof__(mib[0]) ptr" |
153 | * to make @ptr a non-percpu pointer. |
154 | */ |
155 | #define SNMP_UPD_PO_STATS(mib, basefield, addend) \ |
156 | do { \ |
157 | __typeof__(*mib[0]) *ptr; \ |
158 | preempt_disable(); \ |
159 | ptr = this_cpu_ptr((mib)[!in_softirq()]); \ |
160 | ptr->mibs[basefield##PKTS]++; \ |
161 | ptr->mibs[basefield##OCTETS] += addend;\ |
162 | preempt_enable(); \ |
163 | } while (0) |
164 | #define SNMP_UPD_PO_STATS_BH(mib, basefield, addend) \ |
165 | do { \ |
166 | __typeof__(*mib[0]) *ptr = \ |
167 | __this_cpu_ptr((mib)[!in_softirq()]); \ |
168 | ptr->mibs[basefield##PKTS]++; \ |
169 | ptr->mibs[basefield##OCTETS] += addend;\ |
170 | } while (0) |
171 | #endif |
172 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9