2 * radius_snmp.c Radius SNMP support
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 * Copyright 2000,2006 The FreeRADIUS server project
21 * Copyright 2000 Jochen Friedrich <jochen@scram.de>
24 #include <freeradius-devel/ident.h>
27 #include <freeradius-devel/radiusd.h>
31 #include <freeradius-devel/smux.h>
32 #include <freeradius-devel/radius_snmp.h>
35 * More globals (sigh);
40 #define RADACCOID 1,3,6,1,2,1,67,2,1,1,1
41 #define RADAUTHOID 1,3,6,1,2,1,67,1,1,1,1
42 #define RADIUSOID 1,3,6,1,4,1,11344,1,1,1
44 static const oid radacc_oid [] = { RADACCOID };
45 static const oid radauth_oid [] = { RADAUTHOID };
46 static const oid radius_oid [] = { RADIUSOID };
48 #define COUNTER ASN_COUNTER
49 #define INTEGER ASN_INTEGER
50 #define GAUGE ASN_GAUGE
51 #define TIMETICKS ASN_TIMETICKS
52 #define IPADDRESS ASN_IPADDRESS
53 #define STRING ASN_OCTET_STR
55 #define RADIUSACCSERVIDENT 1
56 #define RADIUSACCSERVUPTIME 2
57 #define RADIUSACCSERVRESETTIME 3
58 #define RADIUSACCSERVCONFIGRESET 4
59 #define RADIUSACCSERVTOTALREQUESTS 5
60 #define RADIUSACCSERVTOTALINVALIDREQUESTS 6
61 #define RADIUSACCSERVTOTALDUPREQUESTS 7
62 #define RADIUSACCSERVTOTALRESPONSES 8
63 #define RADIUSACCSERVTOTALMALFORMEDREQUESTS 9
64 #define RADIUSACCSERVTOTALBADAUTHENTICATORS 10
65 #define RADIUSACCSERVTOTALPACKETSDROPPED 11
66 #define RADIUSACCSERVTOTALNORECORDS 12
67 #define RADIUSACCSERVTOTALUNKNOWNTYPES 13
69 #define RADIUSACCCLIENTADDRESS 2
70 #define RADIUSACCCLIENTID 3
71 #define RADIUSACCSERVPACKETSDROPPED 4
72 #define RADIUSACCSERVREQUESTS 5
73 #define RADIUSACCSERVDUPREQUESTS 6
74 #define RADIUSACCSERVRESPONSES 7
75 #define RADIUSACCSERVBADAUTHENTICATORS 8
76 #define RADIUSACCSERVMALFORMEDREQUESTS 9
77 #define RADIUSACCSERVNORECORDS 10
78 #define RADIUSACCSERVUNKNOWNTYPES 11
80 #define RADIUSAUTHSERVIDENT 1
81 #define RADIUSAUTHSERVUPTIME 2
82 #define RADIUSAUTHSERVRESETTIME 3
83 #define RADIUSAUTHSERVCONFIGRESET 4
84 #define RADIUSAUTHSERVTOTALACCESSREQUESTS 5
85 #define RADIUSAUTHSERVTOTALINVALIDREQUESTS 6
86 #define RADIUSAUTHSERVTOTALDUPACCESSREQUESTS 7
87 #define RADIUSAUTHSERVTOTALACCESSACCEPTS 8
88 #define RADIUSAUTHSERVTOTALACCESSREJECTS 9
89 #define RADIUSAUTHSERVTOTALACCESSCHALLENGES 10
90 #define RADIUSAUTHSERVTOTALMALFORMEDACCESSREQUESTS 11
91 #define RADIUSAUTHSERVTOTALBADAUTHENTICATORS 12
92 #define RADIUSAUTHSERVTOTALPACKETSDROPPED 13
93 #define RADIUSAUTHSERVTOTALUNKNOWNTYPES 14
95 #define RADIUSAUTHCLIENTADDRESS 2
96 #define RADIUSAUTHCLIENTID 3
97 #define RADIUSAUTHSERVACCESSREQUESTS 4
98 #define RADIUSAUTHSERVDUPACCESSREQUESTS 5
99 #define RADIUSAUTHSERVACCESSACCEPTS 6
100 #define RADIUSAUTHSERVACCESSREJECTS 7
101 #define RADIUSAUTHSERVACCESSCHALLENGES 8
102 #define RADIUSAUTHSERVMALFORMEDACCESSREQUESTS 9
103 #define RADIUSAUTHSERVBADAUTHENTICATORS 10
104 #define RADIUSAUTHSERVPACKETSDROPPED 11
105 #define RADIUSAUTHSERVUNKNOWNTYPES 12
107 /* Hook functions. */
108 #ifdef WITH_ACCOUNTING
109 static const u_char *radAccServ(struct variable *vp,
114 WriteMethod **write_method);
115 static const u_char *radAccEntry(struct variable *vp,
120 WriteMethod **write_method);
122 static const u_char *radAuthServ(struct variable *vp,
127 WriteMethod **write_method);
128 static const u_char *radAuthEntry(struct variable *vp,
133 WriteMethod **write_method);
135 #ifdef WITH_ACCOUNTING
136 static const struct variable radiusacc_variables[] =
138 {RADIUSACCSERVIDENT, STRING, RONLY, radAccServ, 1, {1}},
139 {RADIUSACCSERVUPTIME, TIMETICKS, RONLY, radAccServ, 1, {2}},
140 {RADIUSACCSERVRESETTIME, TIMETICKS, RONLY, radAccServ, 1, {3}},
141 {RADIUSACCSERVCONFIGRESET, INTEGER, RWRITE, radAccServ, 1, {4}},
142 {RADIUSACCSERVTOTALREQUESTS, COUNTER, RONLY, radAccServ, 1, {5}},
143 {RADIUSACCSERVTOTALINVALIDREQUESTS, COUNTER, RONLY, radAccServ, 1, {6}},
144 {RADIUSACCSERVTOTALDUPREQUESTS, COUNTER, RONLY, radAccServ, 1, {7}},
145 {RADIUSACCSERVTOTALRESPONSES, COUNTER, RONLY, radAccServ, 1, {8}},
146 {RADIUSACCSERVTOTALMALFORMEDREQUESTS, COUNTER, RONLY, radAccServ, 1, {9}},
147 {RADIUSACCSERVTOTALBADAUTHENTICATORS, COUNTER, RONLY, radAccServ, 1, {10}},
148 {RADIUSACCSERVTOTALPACKETSDROPPED, COUNTER, RONLY, radAccServ, 1, {11}},
149 {RADIUSACCSERVTOTALNORECORDS, COUNTER, RONLY, radAccServ, 1, {12}},
150 {RADIUSACCSERVTOTALUNKNOWNTYPES, COUNTER, RONLY, radAccServ, 1, {13}},
151 {RADIUSACCCLIENTADDRESS, IPADDRESS, RONLY, radAccEntry, 3, {14,1,2}},
152 {RADIUSACCCLIENTID, STRING, RONLY, radAccEntry, 3, {14,1,3}},
153 {RADIUSACCSERVPACKETSDROPPED, COUNTER, RONLY, radAccEntry, 3, {14,1,4}},
154 {RADIUSACCSERVREQUESTS, COUNTER, RONLY, radAccEntry, 3, {14,1,5}},
155 {RADIUSACCSERVDUPREQUESTS, COUNTER, RONLY, radAccEntry, 3, {14,1,6}},
156 {RADIUSACCSERVRESPONSES, COUNTER, RONLY, radAccEntry, 3, {14,1,7}},
157 {RADIUSACCSERVBADAUTHENTICATORS, COUNTER, RONLY, radAccEntry, 3, {14,1,8}},
158 {RADIUSACCSERVMALFORMEDREQUESTS, COUNTER, RONLY, radAccEntry, 3, {14,1,9}},
159 {RADIUSACCSERVNORECORDS, COUNTER, RONLY, radAccEntry, 3, {14,1,10}},
160 {RADIUSACCSERVUNKNOWNTYPES, COUNTER, RONLY, radAccEntry, 3, {14,1,11}},
164 static const struct variable radiusauth_variables[] =
166 {RADIUSAUTHSERVIDENT, STRING, RONLY, radAuthServ, 1, {1}},
167 {RADIUSAUTHSERVUPTIME, TIMETICKS, RONLY, radAuthServ, 1, {2}},
168 {RADIUSAUTHSERVRESETTIME, TIMETICKS, RONLY, radAuthServ, 1, {3}},
169 {RADIUSAUTHSERVCONFIGRESET, INTEGER, RWRITE, radAuthServ, 1, {4}},
170 {RADIUSAUTHSERVTOTALACCESSREQUESTS, COUNTER, RONLY, radAuthServ, 1, {5}},
171 {RADIUSAUTHSERVTOTALINVALIDREQUESTS, COUNTER, RONLY, radAuthServ, 1, {6}},
172 {RADIUSAUTHSERVTOTALDUPACCESSREQUESTS, COUNTER, RONLY, radAuthServ, 1, {7}},
173 {RADIUSAUTHSERVTOTALACCESSACCEPTS, COUNTER, RONLY, radAuthServ, 1, {8}},
174 {RADIUSAUTHSERVTOTALACCESSREJECTS, COUNTER, RONLY, radAuthServ, 1, {9}},
175 {RADIUSAUTHSERVTOTALACCESSCHALLENGES, COUNTER, RONLY, radAuthServ, 1, {10}},
176 {RADIUSAUTHSERVTOTALMALFORMEDACCESSREQUESTS, COUNTER, RONLY, radAuthServ, 1, {11}},
177 {RADIUSAUTHSERVTOTALBADAUTHENTICATORS, COUNTER, RONLY, radAuthServ, 1, {12}},
178 {RADIUSAUTHSERVTOTALPACKETSDROPPED, COUNTER, RONLY, radAuthServ, 1, {13}},
179 {RADIUSAUTHSERVTOTALUNKNOWNTYPES, COUNTER, RONLY, radAuthServ, 1, {14}},
180 {RADIUSAUTHCLIENTADDRESS, IPADDRESS, RONLY, radAuthEntry, 3, {15,1,2}},
181 {RADIUSAUTHCLIENTID, STRING, RONLY, radAuthEntry, 3, {15,1,3}},
182 {RADIUSAUTHSERVACCESSREQUESTS, COUNTER, RONLY, radAuthEntry, 3, {15,1,4}},
183 {RADIUSAUTHSERVDUPACCESSREQUESTS, COUNTER, RONLY, radAuthEntry, 3, {15,1,5}},
184 {RADIUSAUTHSERVACCESSACCEPTS, COUNTER, RONLY, radAuthEntry, 3, {15,1,6}},
185 {RADIUSAUTHSERVACCESSREJECTS, COUNTER, RONLY, radAuthEntry, 3, {15,1,7}},
186 {RADIUSAUTHSERVACCESSCHALLENGES, COUNTER, RONLY, radAuthEntry, 3, {15,1,8}},
187 {RADIUSAUTHSERVMALFORMEDACCESSREQUESTS, COUNTER, RONLY, radAuthEntry, 3, {15,1,9}},
188 {RADIUSAUTHSERVBADAUTHENTICATORS, COUNTER, RONLY, radAuthEntry, 3, {15,1,10}},
189 {RADIUSAUTHSERVPACKETSDROPPED, COUNTER, RONLY, radAuthEntry, 3, {15,1,11}},
190 {RADIUSAUTHSERVUNKNOWNTYPES, COUNTER, RONLY, radAuthEntry, 3, {15,1,12}},
194 get_client(struct variable *v, oid objid[], size_t *objid_len, int exact)
199 len = *objid_len - v->namelen;
202 /* Check the length. */
205 if (objid[v->namelen] == 0)
208 i = objid[v->namelen]-1;
210 return client_findbynumber(NULL, i);
212 *objid_len = v->namelen + 1;
213 if (!len || (objid[v->namelen] == 0)) {
215 return client_findbynumber(NULL, 0);
218 i = objid[v->namelen]-1;
219 c = client_findbynumber(NULL, i);
227 radServReset(int action, u_char *var_val, u_char var_val_type,
228 size_t var_val_len, UNUSED const u_char *statP,
229 UNUSED oid *name, UNUSED size_t name_len)
232 size_t big = SNMP_MAX_LEN;
236 if (var_val_type != INTEGER)
237 return SNMP_ERR_WRONGTYPE;
238 if (var_val_len != sizeof (long))
239 return SNMP_ERR_WRONGLENGTH;
240 if (! asn_parse_int(var_val, &big, &var_val_type, &i, sizeof(long)))
241 return SNMP_ERR_WRONGENCODING;
243 return SNMP_ERR_WRONGVALUE;
246 radius_signal_self(RADIUS_SIGNAL_SELF_HUP);
251 return SNMP_ERR_GENERR;
253 return SNMP_ERR_NOERROR;
256 #ifdef WITH_ACCOUNTING
257 static const u_char *
258 radAccServ(struct variable *vp, oid *name, size_t *length, int exact,
259 size_t *var_len, WriteMethod **write_method) {
263 /* check whether the instance identifier is valid */
264 if (smux_header_generic(vp, name, length, exact, var_len,
265 write_method) == MATCH_FAILED) {
269 /* return the current value of the variable */
271 case RADIUSACCSERVIDENT:
272 *var_len = strlen(rad_snmp.acct.ident);
273 return (const u_char *) rad_snmp.acct.ident;
275 case RADIUSACCSERVUPTIME:
276 rad_snmp.acct.uptime = (time(NULL) - rad_snmp.acct.start_time) * 100;
277 *var_len = sizeof(int32_t);
278 return (u_char *) &rad_snmp.acct.uptime;
280 case RADIUSACCSERVRESETTIME:
281 rad_snmp.acct.reset_time = (time(NULL) - rad_snmp.acct.last_reset_time) * 100;
282 *var_len = sizeof(int32_t);
283 return (u_char *) &rad_snmp.acct.reset_time;
285 case RADIUSACCSERVCONFIGRESET:
286 *write_method = radServReset;
288 return (u_char *) &result;
290 case RADIUSACCSERVTOTALREQUESTS:
291 *var_len = sizeof(int32_t);
292 return (u_char *) &rad_snmp.acct.total_requests;
294 case RADIUSACCSERVTOTALINVALIDREQUESTS:
295 *var_len = sizeof(int32_t);
296 return (u_char *) &rad_snmp.acct.total_invalid_requests;
298 case RADIUSACCSERVTOTALDUPREQUESTS:
299 *var_len = sizeof(int32_t);
300 return (u_char *) &rad_snmp.acct.total_dup_requests;
302 case RADIUSACCSERVTOTALRESPONSES:
303 *var_len = sizeof(int32_t);
304 return (u_char *) &rad_snmp.acct.total_responses;
306 case RADIUSACCSERVTOTALMALFORMEDREQUESTS:
307 *var_len = sizeof(int32_t);
308 return (u_char *) &rad_snmp.acct.total_malformed_requests;
310 case RADIUSACCSERVTOTALBADAUTHENTICATORS:
311 *var_len = sizeof(int32_t);
312 return (u_char *) &rad_snmp.acct.total_bad_authenticators;
314 case RADIUSACCSERVTOTALPACKETSDROPPED:
315 *var_len = sizeof(int32_t);
316 return (u_char *) &rad_snmp.acct.total_packets_dropped;
318 case RADIUSACCSERVTOTALNORECORDS:
319 *var_len = sizeof(int32_t);
320 return (u_char *) &rad_snmp.acct.total_no_records;
322 case RADIUSACCSERVTOTALUNKNOWNTYPES:
323 *var_len = sizeof(int32_t);
324 return (u_char *) &rad_snmp.acct.total_unknown_types;
331 static const u_char *
332 radAccEntry(struct variable *vp, oid *name, size_t *length, int exact,
333 size_t *var_len, WriteMethod **write_method) {
336 static uint32_t zero = 0;
338 *write_method = NULL; /* table is read only */
339 c = get_client(vp, name, length, exact);
343 /* return the current value of the variable */
346 case RADIUSACCCLIENTADDRESS:
347 if (c->ipaddr.af != AF_INET) return NULL;
349 *var_len = sizeof(c->ipaddr.ipaddr.ip4addr);
350 return (u_char *)&(c->ipaddr.ipaddr.ip4addr);
352 case RADIUSACCCLIENTID:
353 if (c->shortname && c->shortname[0]) {
354 *var_len = strlen(c->shortname);
355 return (u_char *) c->shortname;
357 *var_len = strlen(c->longname);
358 return (u_char *) c->longname;
360 case RADIUSACCSERVPACKETSDROPPED:
361 *var_len = sizeof(int32_t);
362 return (u_char *) &c->acct->packets_dropped;
364 case RADIUSACCSERVREQUESTS:
365 *var_len = sizeof(int32_t);
366 return (u_char *) &c->acct->requests;
368 case RADIUSACCSERVDUPREQUESTS:
369 *var_len = sizeof(int32_t);
370 return (u_char *) &c->acct->dup_requests;
372 case RADIUSACCSERVRESPONSES:
373 *var_len = sizeof(int32_t);
374 return (u_char *) &c->acct->responses;
376 case RADIUSACCSERVBADAUTHENTICATORS:
377 *var_len = sizeof(int32_t);
378 return (u_char *) &c->acct->bad_authenticators;
380 case RADIUSACCSERVMALFORMEDREQUESTS:
381 *var_len = sizeof(int32_t);
382 return (u_char *) &c->acct->malformed_requests;
385 * Received && responded to, but not
386 * recorded anywhere. This is always
389 case RADIUSACCSERVNORECORDS:
390 *var_len = sizeof(int32_t);
391 return (u_char *) &zero;
393 case RADIUSACCSERVUNKNOWNTYPES:
394 *var_len = sizeof(int32_t);
395 return (u_char *) &c->acct->unknown_types;
401 static const u_char *
402 radAuthServ(struct variable *vp, oid *name, size_t *length, int exact,
403 size_t *var_len, WriteMethod **write_method) {
406 /* check whether the instance identifier is valid */
408 if (smux_header_generic(vp, name, length, exact, var_len,
409 write_method) == MATCH_FAILED) {
413 /* return the current value of the variable */
416 case RADIUSAUTHSERVIDENT:
417 *var_len = strlen(rad_snmp.auth.ident);
418 return (const u_char *) rad_snmp.auth.ident;
420 case RADIUSAUTHSERVUPTIME:
421 rad_snmp.auth.uptime = (time(NULL) - rad_snmp.auth.start_time) * 100;
422 *var_len = sizeof(int32_t);
423 return (u_char *) &rad_snmp.auth.uptime;
425 case RADIUSAUTHSERVRESETTIME:
426 rad_snmp.auth.reset_time = (time(NULL) - rad_snmp.auth.last_reset_time) * 100;
427 *var_len = sizeof(int32_t);
428 return (u_char *) &rad_snmp.auth.reset_time;
430 case RADIUSAUTHSERVCONFIGRESET:
431 *write_method = radServReset;
433 return (u_char *) &result;
435 case RADIUSAUTHSERVTOTALACCESSREQUESTS:
436 *var_len = sizeof(int32_t);
437 return (u_char *) &rad_snmp.auth.total_requests;
439 case RADIUSAUTHSERVTOTALINVALIDREQUESTS:
440 *var_len = sizeof(int32_t);
441 return (u_char *) &rad_snmp.auth.total_invalid_requests;
443 case RADIUSAUTHSERVTOTALDUPACCESSREQUESTS:
444 *var_len = sizeof(int32_t);
445 return (u_char *) &rad_snmp.auth.total_dup_requests;
447 case RADIUSAUTHSERVTOTALACCESSACCEPTS:
448 *var_len = sizeof(int32_t);
449 return (u_char *) &rad_snmp.auth.total_access_accepts;
451 case RADIUSAUTHSERVTOTALACCESSREJECTS:
452 *var_len = sizeof(int32_t);
453 return (u_char *) &rad_snmp.auth.total_access_rejects;
455 case RADIUSAUTHSERVTOTALACCESSCHALLENGES:
456 *var_len = sizeof(int32_t);
457 return (u_char *) &rad_snmp.auth.total_access_challenges;
459 case RADIUSAUTHSERVTOTALMALFORMEDACCESSREQUESTS:
460 *var_len = sizeof(int32_t);
461 return (u_char *) &rad_snmp.auth.total_malformed_requests;
463 case RADIUSAUTHSERVTOTALBADAUTHENTICATORS:
464 *var_len = sizeof(int32_t);
465 return (u_char *) &rad_snmp.auth.total_bad_authenticators;
467 case RADIUSAUTHSERVTOTALPACKETSDROPPED:
468 *var_len = sizeof(int32_t);
469 return (u_char *) &rad_snmp.auth.total_packets_dropped;
471 case RADIUSAUTHSERVTOTALUNKNOWNTYPES:
472 *var_len = sizeof(int32_t);
473 return (u_char *) &rad_snmp.auth.total_unknown_types;
480 static const u_char *
481 radAuthEntry(struct variable *vp, oid *name, size_t *length, int exact,
482 size_t *var_len, WriteMethod **write_method) {
486 *write_method = NULL; /* table is read only */
487 c = get_client(vp, name, length, exact);
491 /* return the current value of the variable */
495 case RADIUSAUTHCLIENTADDRESS:
496 if (c->ipaddr.af != AF_INET) return NULL;
498 *var_len = sizeof(c->ipaddr.ipaddr.ip4addr);
499 return (u_char *)&(c->ipaddr.ipaddr.ip4addr);
501 case RADIUSAUTHCLIENTID:
502 if (c->shortname && c->shortname[0]) {
503 *var_len = strlen(c->shortname);
504 return (u_char *) c->shortname;
506 *var_len = strlen(c->longname);
507 return (u_char *) c->longname;
509 case RADIUSAUTHSERVACCESSREQUESTS:
510 *var_len = sizeof(int32_t);
511 return (u_char *) &c->auth->requests;
513 case RADIUSAUTHSERVDUPACCESSREQUESTS:
514 *var_len = sizeof(int32_t);
515 return (u_char *) &c->auth->dup_requests;
517 case RADIUSAUTHSERVACCESSACCEPTS:
518 *var_len = sizeof(int32_t);
519 return (u_char *) &c->auth->accepts;
521 case RADIUSAUTHSERVACCESSREJECTS:
522 *var_len = sizeof(int32_t);
523 return (u_char *) &c->auth->rejects;
525 case RADIUSAUTHSERVACCESSCHALLENGES:
526 *var_len = sizeof(int32_t);
527 return (u_char *) &c->auth->challenges;
529 case RADIUSAUTHSERVMALFORMEDACCESSREQUESTS:
530 *var_len = sizeof(int32_t);
531 return (u_char *) &c->auth->malformed_requests;
533 case RADIUSAUTHSERVBADAUTHENTICATORS:
534 *var_len = sizeof(int32_t);
535 return (u_char *) &c->auth->bad_authenticators;
537 case RADIUSAUTHSERVPACKETSDROPPED:
538 *var_len = sizeof(int32_t);
539 return (u_char *) &c->auth->packets_dropped;
541 case RADIUSAUTHSERVUNKNOWNTYPES:
542 *var_len = sizeof(int32_t);
543 return (u_char *) &c->auth->unknown_types;
549 static const CONF_PARSER snmp_config[] = {
550 { "snmp", PW_TYPE_BOOLEAN,
551 0, &mainconfig.do_snmp, "no" },
552 { "smux_password", PW_TYPE_STRING_PTR,
553 0, &rad_snmp.smux_password, "" },
554 { "snmp_write_access", PW_TYPE_BOOLEAN,
555 0, &rad_snmp.snmp_write_access, "no" },
556 { NULL, -1, 0, NULL, NULL }
560 /* Register RADIUS MIBs. */
562 radius_snmp_init (CONF_SECTION *cs)
564 static int initialized = FALSE;
568 * Initialize the RADIUS SNMP data structure.
570 memset(&rad_snmp, 0, sizeof(rad_snmp));
572 rad_snmp.auth.ident = radiusd_version;
573 #ifdef WITH_ACCOUNTING
574 rad_snmp.acct.ident = radiusd_version;
578 rad_snmp.smux_event = SMUX_NONE;
579 rad_snmp.smux_password = NULL;
580 rad_snmp.snmp_write_access = FALSE;
581 rad_snmp.smux_fd = -1;
582 rad_snmp.smux_max_failures = 3; /* FIXME! get from config */
583 rad_snmp.smux_failures = 0;
585 rad_snmp.auth.start_time = time(NULL);
586 rad_snmp.auth.last_reset_time = rad_snmp.auth.start_time;
588 #ifdef WITH_ACCOUNTING
589 rad_snmp.acct.start_time = rad_snmp.auth.start_time;
590 rad_snmp.acct.last_reset_time = rad_snmp.auth.start_time;
593 rad_snmp.auth.last_reset_time = time(NULL);
594 #ifdef WITH_ACCOUNTING
595 rad_snmp.acct.last_reset_time = rad_snmp.auth.last_reset_time;
597 rad_snmp.smux_failures = 0;
601 * Parse the SNMP configuration information.
603 cf_section_parse(cs, NULL, snmp_config);
607 if (!mainconfig.do_snmp) return 0;
610 * Do SMUX initialization.
612 smux_init (radius_oid, sizeof (radius_oid) / sizeof (oid));
615 #ifdef WITH_ACCOUNTING
616 SMUX_REGISTER_MIB("mibII/radius-acc-server", radiusacc_variables, variable, radacc_oid);
618 SMUX_REGISTER_MIB("mibII/radius-auth-server", radiusauth_variables, variable, radauth_oid);
628 #endif /* WITH_SNMP */