File: /usr/src/linux/include/net/snmp.h

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      
26     /*
27      *	We use all unsigned longs. Linux will soon be so reliable that even these
28      *	will rapidly get too small 8-). Seriously consider the IpInReceives count
29      *	on the 20Gb/s + networks people expect in a few years time!
30      */
31     
32     /* 
33      * The rule for padding: 
34      * Best is power of two because then the right structure can be found by a simple
35      * shift. The structure should be always cache line aligned.
36      * gcc needs n=alignto(cachelinesize, popcnt(sizeof(bla_mib))) shift/add instructions
37      * to emulate multiply in case it is not power-of-two. Currently n is always <=3 for
38      * all sizes so simple cache line alignment is enough. 
39      * 
40      * The best solution would be a global CPU local area , especially on 64 and 128byte 
41      * cacheline machine it makes a *lot* of sense -AK
42      */ 
43     
44      
45     struct ip_mib
46     {
47      	unsigned long	IpInReceives;
48      	unsigned long	IpInHdrErrors;
49      	unsigned long	IpInAddrErrors;
50      	unsigned long	IpForwDatagrams;
51      	unsigned long	IpInUnknownProtos;
52      	unsigned long	IpInDiscards;
53      	unsigned long	IpInDelivers;
54      	unsigned long	IpOutRequests;
55      	unsigned long	IpOutDiscards;
56      	unsigned long	IpOutNoRoutes;
57      	unsigned long	IpReasmTimeout;
58      	unsigned long	IpReasmReqds;
59      	unsigned long	IpReasmOKs;
60      	unsigned long	IpReasmFails;
61      	unsigned long	IpFragOKs;
62      	unsigned long	IpFragFails;
63      	unsigned long	IpFragCreates;
64     	unsigned long   __pad[0]; 
65     } ____cacheline_aligned;
66      
67     struct ipv6_mib
68     {
69     	unsigned long	Ip6InReceives;
70      	unsigned long	Ip6InHdrErrors;
71      	unsigned long	Ip6InTooBigErrors;
72      	unsigned long	Ip6InNoRoutes;
73      	unsigned long	Ip6InAddrErrors;
74      	unsigned long	Ip6InUnknownProtos;
75      	unsigned long	Ip6InTruncatedPkts;
76      	unsigned long	Ip6InDiscards;
77      	unsigned long	Ip6InDelivers;
78      	unsigned long	Ip6OutForwDatagrams;
79      	unsigned long	Ip6OutRequests;
80      	unsigned long	Ip6OutDiscards;
81      	unsigned long	Ip6OutNoRoutes;
82      	unsigned long	Ip6ReasmTimeout;
83      	unsigned long	Ip6ReasmReqds;
84      	unsigned long	Ip6ReasmOKs;
85      	unsigned long	Ip6ReasmFails;
86      	unsigned long	Ip6FragOKs;
87      	unsigned long	Ip6FragFails;
88      	unsigned long	Ip6FragCreates;
89      	unsigned long	Ip6InMcastPkts;
90      	unsigned long	Ip6OutMcastPkts;
91     	unsigned long   __pad[0]; 
92     } ____cacheline_aligned;
93      
94     struct icmp_mib
95     {
96      	unsigned long	IcmpInMsgs;
97      	unsigned long	IcmpInErrors;
98       	unsigned long	IcmpInDestUnreachs;
99      	unsigned long	IcmpInTimeExcds;
100      	unsigned long	IcmpInParmProbs;
101      	unsigned long	IcmpInSrcQuenchs;
102      	unsigned long	IcmpInRedirects;
103      	unsigned long	IcmpInEchos;
104      	unsigned long	IcmpInEchoReps;
105      	unsigned long	IcmpInTimestamps;
106      	unsigned long	IcmpInTimestampReps;
107      	unsigned long	IcmpInAddrMasks;
108      	unsigned long	IcmpInAddrMaskReps;
109      	unsigned long	IcmpOutMsgs;
110      	unsigned long	IcmpOutErrors;
111      	unsigned long	IcmpOutDestUnreachs;
112      	unsigned long	IcmpOutTimeExcds;
113      	unsigned long	IcmpOutParmProbs;
114      	unsigned long	IcmpOutSrcQuenchs;
115      	unsigned long	IcmpOutRedirects;
116      	unsigned long	IcmpOutEchos;
117      	unsigned long	IcmpOutEchoReps;
118      	unsigned long	IcmpOutTimestamps;
119      	unsigned long	IcmpOutTimestampReps;
120      	unsigned long	IcmpOutAddrMasks;
121      	unsigned long	IcmpOutAddrMaskReps;
122     	unsigned long	dummy;
123     	unsigned long   __pad[0]; 
124     } ____cacheline_aligned;
125     
126     struct icmpv6_mib
127     {
128     	unsigned long	Icmp6InMsgs;
129     	unsigned long	Icmp6InErrors;
130     
131     	unsigned long	Icmp6InDestUnreachs;
132     	unsigned long	Icmp6InPktTooBigs;
133     	unsigned long	Icmp6InTimeExcds;
134     	unsigned long	Icmp6InParmProblems;
135     
136     	unsigned long	Icmp6InEchos;
137     	unsigned long	Icmp6InEchoReplies;
138     	unsigned long	Icmp6InGroupMembQueries;
139     	unsigned long	Icmp6InGroupMembResponses;
140     	unsigned long	Icmp6InGroupMembReductions;
141     	unsigned long	Icmp6InRouterSolicits;
142     	unsigned long	Icmp6InRouterAdvertisements;
143     	unsigned long	Icmp6InNeighborSolicits;
144     	unsigned long	Icmp6InNeighborAdvertisements;
145     	unsigned long	Icmp6InRedirects;
146     
147     	unsigned long	Icmp6OutMsgs;
148     
149     	unsigned long	Icmp6OutDestUnreachs;
150     	unsigned long	Icmp6OutPktTooBigs;
151     	unsigned long	Icmp6OutTimeExcds;
152     	unsigned long	Icmp6OutParmProblems;
153     
154     	unsigned long	Icmp6OutEchoReplies;
155     	unsigned long	Icmp6OutRouterSolicits;
156     	unsigned long	Icmp6OutNeighborSolicits;
157     	unsigned long	Icmp6OutNeighborAdvertisements;
158     	unsigned long	Icmp6OutRedirects;
159     	unsigned long	Icmp6OutGroupMembResponses;
160     	unsigned long	Icmp6OutGroupMembReductions;
161     	unsigned long   __pad[0]; 
162     } ____cacheline_aligned;
163      
164     struct tcp_mib
165     {
166      	unsigned long	TcpRtoAlgorithm;
167      	unsigned long	TcpRtoMin;
168      	unsigned long	TcpRtoMax;
169      	unsigned long	TcpMaxConn;
170      	unsigned long	TcpActiveOpens;
171      	unsigned long	TcpPassiveOpens;
172      	unsigned long	TcpAttemptFails;
173      	unsigned long	TcpEstabResets;
174      	unsigned long	TcpCurrEstab;
175      	unsigned long	TcpInSegs;
176      	unsigned long	TcpOutSegs;
177      	unsigned long	TcpRetransSegs;
178      	unsigned long	TcpInErrs;
179      	unsigned long	TcpOutRsts;
180     	unsigned long   __pad[0]; 
181     } ____cacheline_aligned;
182      
183     struct udp_mib
184     {
185      	unsigned long	UdpInDatagrams;
186      	unsigned long	UdpNoPorts;
187      	unsigned long	UdpInErrors;
188      	unsigned long	UdpOutDatagrams;
189     	unsigned long   __pad[0];
190     } ____cacheline_aligned; 
191     
192     struct linux_mib 
193     {
194     	unsigned long	SyncookiesSent;
195     	unsigned long	SyncookiesRecv;
196     	unsigned long	SyncookiesFailed;
197     	unsigned long	EmbryonicRsts;
198     	unsigned long	PruneCalled; 
199     	unsigned long	RcvPruned;
200     	unsigned long	OfoPruned;
201     	unsigned long	OutOfWindowIcmps; 
202     	unsigned long	LockDroppedIcmps; 
203             unsigned long   ArpFilter;
204     	unsigned long	TimeWaited; 
205     	unsigned long	TimeWaitRecycled; 
206     	unsigned long	TimeWaitKilled; 
207     	unsigned long	PAWSPassiveRejected; 
208     	unsigned long	PAWSActiveRejected; 
209     	unsigned long	PAWSEstabRejected; 
210     	unsigned long	DelayedACKs;
211     	unsigned long	DelayedACKLocked;
212     	unsigned long	DelayedACKLost;
213     	unsigned long	ListenOverflows;
214     	unsigned long	ListenDrops;
215     	unsigned long	TCPPrequeued;
216     	unsigned long	TCPDirectCopyFromBacklog;
217     	unsigned long	TCPDirectCopyFromPrequeue;
218     	unsigned long	TCPPrequeueDropped;
219     	unsigned long	TCPHPHits;
220     	unsigned long	TCPHPHitsToUser;
221     	unsigned long	TCPPureAcks;
222     	unsigned long	TCPHPAcks;
223     	unsigned long	TCPRenoRecovery;
224     	unsigned long	TCPSackRecovery;
225     	unsigned long	TCPSACKReneging;
226     	unsigned long	TCPFACKReorder;
227     	unsigned long	TCPSACKReorder;
228     	unsigned long	TCPRenoReorder;
229     	unsigned long	TCPTSReorder;
230     	unsigned long	TCPFullUndo;
231     	unsigned long	TCPPartialUndo;
232     	unsigned long	TCPDSACKUndo;
233     	unsigned long	TCPLossUndo;
234     	unsigned long	TCPLoss;
235     	unsigned long	TCPLostRetransmit;
236     	unsigned long	TCPRenoFailures;
237     	unsigned long	TCPSackFailures;
238     	unsigned long	TCPLossFailures;
239     	unsigned long	TCPFastRetrans;
240     	unsigned long	TCPForwardRetrans;
241     	unsigned long	TCPSlowStartRetrans;
242     	unsigned long	TCPTimeouts;
243     	unsigned long	TCPRenoRecoveryFail;
244     	unsigned long	TCPSackRecoveryFail;
245     	unsigned long	TCPSchedulerFailed;
246     	unsigned long	TCPRcvCollapsed;
247     	unsigned long	TCPDSACKOldSent;
248     	unsigned long	TCPDSACKOfoSent;
249     	unsigned long	TCPDSACKRecv;
250     	unsigned long	TCPDSACKOfoRecv;
251     	unsigned long	TCPAbortOnSyn;
252     	unsigned long	TCPAbortOnData;
253     	unsigned long	TCPAbortOnClose;
254     	unsigned long	TCPAbortOnMemory;
255     	unsigned long	TCPAbortOnTimeout;
256     	unsigned long	TCPAbortOnLinger;
257     	unsigned long	TCPAbortFailed;
258     	unsigned long	TCPMemoryPressures;
259     	unsigned long   __pad[0];
260     } ____cacheline_aligned;
261     
262     
263     /* 
264      * FIXME: On x86 and some other CPUs the split into user and softirq parts is not needed because 
265      * addl $1,memory is atomic against interrupts (but atomic_inc would be overkill because of the lock 
266      * cycles). Wants new nonlocked_atomic_inc() primitives -AK
267      */ 
268     #define SNMP_INC_STATS(mib, field) ((mib)[2*smp_processor_id()+!in_softirq()].field++)
269     #define SNMP_INC_STATS_BH(mib, field) ((mib)[2*smp_processor_id()].field++)
270     #define SNMP_INC_STATS_USER(mib, field) ((mib)[2*smp_processor_id()+1].field++)
271      	
272     #endif
273