Revert "Revert "and added files""
[bcm963xx.git] / userapps / opensource / net-snmp / agent / mibgroup / mibII / kernel_linux.c
1 /*
2  *  Linux kernel interface
3  *
4  */
5
6 #include <net-snmp/net-snmp-config.h>
7 #include <net-snmp/net-snmp-includes.h>
8 #include <net-snmp/agent/net-snmp-agent-includes.h>
9
10 #include "util_funcs.h"
11
12 #if HAVE_STRING_H
13 #include <string.h>
14 #endif
15 #include <sys/types.h>
16 #if HAVE_SYS_PARAM_H
17 #include <sys/param.h>
18 #endif
19
20 #include "kernel_linux.h"
21
22 struct ip_mib   cached_ip_mib;
23 struct icmp_mib cached_icmp_mib;
24 struct tcp_mib  cached_tcp_mib;
25 struct udp_mib  cached_udp_mib;
26
27 #define IP_STATS_LINE   "Ip: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu"
28 #define ICMP_STATS_LINE "Icmp: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu"
29 #define TCP_STATS_LINE  "Tcp: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu"
30 #define UDP_STATS_LINE  "Udp: %lu %lu %lu %lu"
31
32 #define IP_STATS_PREFIX_LEN     4
33 #define ICMP_STATS_PREFIX_LEN   6
34 #define TCP_STATS_PREFIX_LEN    5
35 #define UDP_STATS_PREFIX_LEN    5
36
37 #ifndef MIB_STATS_CACHE_TIMEOUT
38 #define MIB_STATS_CACHE_TIMEOUT 5
39 #endif
40 #ifndef LINUX_STATS_CACHE_TIMEOUT
41 #define LINUX_STATS_CACHE_TIMEOUT       MIB_STATS_CACHE_TIMEOUT
42 #endif
43 marker_t        linux_mibII_stats_cache_marker = NULL;
44
45 int
46 linux_read_mibII_stats(void)
47 {
48     FILE           *in = fopen("/proc/net/snmp", "r");
49     char            line[1024];
50
51     if (!in) {
52         free(linux_mibII_stats_cache_marker);
53         linux_mibII_stats_cache_marker = NULL;
54         return -1;
55     }
56
57     if (linux_mibII_stats_cache_marker &&
58         (!atime_ready
59          (linux_mibII_stats_cache_marker,
60           LINUX_STATS_CACHE_TIMEOUT * 1000))) {
61         fclose(in);
62         return 0;
63     }
64
65     if (linux_mibII_stats_cache_marker)
66         atime_setMarker(linux_mibII_stats_cache_marker);
67     else
68         linux_mibII_stats_cache_marker = atime_newMarker();
69
70
71     while (line == fgets(line, sizeof(line), in)) {
72         if (!strncmp(line, IP_STATS_LINE, IP_STATS_PREFIX_LEN)) {
73             sscanf(line, IP_STATS_LINE,
74                    &cached_ip_mib.ipForwarding,
75                    &cached_ip_mib.ipDefaultTTL,
76                    &cached_ip_mib.ipInReceives,
77                    &cached_ip_mib.ipInHdrErrors,
78                    &cached_ip_mib.ipInAddrErrors,
79                    &cached_ip_mib.ipForwDatagrams,
80                    &cached_ip_mib.ipInUnknownProtos,
81                    &cached_ip_mib.ipInDiscards,
82                    &cached_ip_mib.ipInDelivers,
83                    &cached_ip_mib.ipOutRequests,
84                    &cached_ip_mib.ipOutDiscards,
85                    &cached_ip_mib.ipOutNoRoutes,
86                    &cached_ip_mib.ipReasmTimeout,
87                    &cached_ip_mib.ipReasmReqds,
88                    &cached_ip_mib.ipReasmOKs,
89                    &cached_ip_mib.ipReasmFails,
90                    &cached_ip_mib.ipFragOKs,
91                    &cached_ip_mib.ipFragFails,
92                    &cached_ip_mib.ipFragCreates);
93             cached_ip_mib.ipRoutingDiscards = 0;        /* XXX */
94         } else if (!strncmp(line, ICMP_STATS_LINE, ICMP_STATS_PREFIX_LEN)) {
95             sscanf(line, ICMP_STATS_LINE,
96                    &cached_icmp_mib.icmpInMsgs,
97                    &cached_icmp_mib.icmpInErrors,
98                    &cached_icmp_mib.icmpInDestUnreachs,
99                    &cached_icmp_mib.icmpInTimeExcds,
100                    &cached_icmp_mib.icmpInParmProbs,
101                    &cached_icmp_mib.icmpInSrcQuenchs,
102                    &cached_icmp_mib.icmpInRedirects,
103                    &cached_icmp_mib.icmpInEchos,
104                    &cached_icmp_mib.icmpInEchoReps,
105                    &cached_icmp_mib.icmpInTimestamps,
106                    &cached_icmp_mib.icmpInTimestampReps,
107                    &cached_icmp_mib.icmpInAddrMasks,
108                    &cached_icmp_mib.icmpInAddrMaskReps,
109                    &cached_icmp_mib.icmpOutMsgs,
110                    &cached_icmp_mib.icmpOutErrors,
111                    &cached_icmp_mib.icmpOutDestUnreachs,
112                    &cached_icmp_mib.icmpOutTimeExcds,
113                    &cached_icmp_mib.icmpOutParmProbs,
114                    &cached_icmp_mib.icmpOutSrcQuenchs,
115                    &cached_icmp_mib.icmpOutRedirects,
116                    &cached_icmp_mib.icmpOutEchos,
117                    &cached_icmp_mib.icmpOutEchoReps,
118                    &cached_icmp_mib.icmpOutTimestamps,
119                    &cached_icmp_mib.icmpOutTimestampReps,
120                    &cached_icmp_mib.icmpOutAddrMasks,
121                    &cached_icmp_mib.icmpOutAddrMaskReps);
122         } else if (!strncmp(line, TCP_STATS_LINE, TCP_STATS_PREFIX_LEN)) {
123             int             ret = sscanf(line, TCP_STATS_LINE,
124                                          &cached_tcp_mib.tcpRtoAlgorithm,
125                                          &cached_tcp_mib.tcpRtoMin,
126                                          &cached_tcp_mib.tcpRtoMax,
127                                          &cached_tcp_mib.tcpMaxConn,
128                                          &cached_tcp_mib.tcpActiveOpens,
129                                          &cached_tcp_mib.tcpPassiveOpens,
130                                          &cached_tcp_mib.tcpAttemptFails,
131                                          &cached_tcp_mib.tcpEstabResets,
132                                          &cached_tcp_mib.tcpCurrEstab,
133                                          &cached_tcp_mib.tcpInSegs,
134                                          &cached_tcp_mib.tcpOutSegs,
135                                          &cached_tcp_mib.tcpRetransSegs,
136                                          &cached_tcp_mib.tcpInErrs,
137                                          &cached_tcp_mib.tcpOutRsts);
138             cached_tcp_mib.tcpInErrsValid = (ret > 12) ? 1 : 0;
139             cached_tcp_mib.tcpOutRstsValid = (ret > 13) ? 1 : 0;
140         } else if (!strncmp(line, UDP_STATS_LINE, UDP_STATS_PREFIX_LEN)) {
141             sscanf(line, UDP_STATS_LINE,
142                    &cached_udp_mib.udpInDatagrams,
143                    &cached_udp_mib.udpNoPorts,
144                    &cached_udp_mib.udpInErrors,
145                    &cached_udp_mib.udpOutDatagrams);
146         }
147     }
148     fclose(in);
149
150     /*
151      * Tweak illegal values:
152      *
153      * valid values for ipForwarding are 1 == yup, 2 == nope
154      * a 0 is forbidden, so patch:
155      */
156     if (!cached_ip_mib.ipForwarding)
157         cached_ip_mib.ipForwarding = 2;
158
159     /*
160      * 0 is illegal for tcpRtoAlgorithm
161      * so assume `other' algorithm:
162      */
163     if (!cached_tcp_mib.tcpRtoAlgorithm)
164         cached_tcp_mib.tcpRtoAlgorithm = 1;
165     return 0;
166 }
167
168 int
169 linux_read_ip_stat(struct ip_mib *ipstat)
170 {
171     memset((char *) ipstat, (0), sizeof(*ipstat));
172     if (linux_read_mibII_stats() == -1)
173         return -1;
174     memcpy((char *) ipstat, (char *) &cached_ip_mib, sizeof(*ipstat));
175     return 0;
176 }
177
178 int
179 linux_read_icmp_stat(struct icmp_mib *icmpstat)
180 {
181     memset((char *) icmpstat, (0), sizeof(*icmpstat));
182     if (linux_read_mibII_stats() == -1)
183         return -1;
184     memcpy((char *) icmpstat, (char *) &cached_icmp_mib,
185            sizeof(*icmpstat));
186     return 0;
187 }
188
189 int
190 linux_read_tcp_stat(struct tcp_mib *tcpstat)
191 {
192     memset((char *) tcpstat, (0), sizeof(*tcpstat));
193     if (linux_read_mibII_stats() == -1)
194         return -1;
195     memcpy((char *) tcpstat, (char *) &cached_tcp_mib, sizeof(*tcpstat));
196     return 0;
197 }
198
199 int
200 linux_read_udp_stat(struct udp_mib *udpstat)
201 {
202     memset((char *) udpstat, (0), sizeof(*udpstat));
203     if (linux_read_mibII_stats() == -1)
204         return -1;
205     memcpy((char *) udpstat, (char *) &cached_udp_mib, sizeof(*udpstat));
206     return 0;
207 }