2 * Copyright (C) 2004 Yasuhiro Ohara
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GNU Zebra; see the file COPYING. If not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
26 #include <net-snmp/net-snmp-config.h>
27 #include <net-snmp/net-snmp-includes.h>
34 #include "ospf6_proto.h"
35 #include "ospf6_lsa.h"
36 #include "ospf6_lsdb.h"
37 #include "ospf6_route.h"
38 #include "ospf6_top.h"
39 #include "ospf6_area.h"
40 #include "ospf6_interface.h"
41 #include "ospf6_message.h"
42 #include "ospf6_neighbor.h"
43 #include "ospf6_abr.h"
44 #include "ospf6_asbr.h"
46 #include "ospf6_snmp.h"
49 #define OSPFv3MIB 1,3,6,1,2,1,191
51 /* OSPFv3 MIB General Group values. */
52 #define OSPFv3ROUTERID 1
53 #define OSPFv3ADMINSTAT 2
54 #define OSPFv3VERSIONNUMBER 3
55 #define OSPFv3AREABDRRTRSTATUS 4
56 #define OSPFv3ASBDRRTRSTATUS 5
57 #define OSPFv3ASSCOPELSACOUNT 6
58 #define OSPFv3ASSCOPELSACHECKSUMSUM 7
59 #define OSPFv3ORIGINATENEWLSAS 8
60 #define OSPFv3RXNEWLSAS 9
61 #define OSPFv3EXTLSACOUNT 10
62 #define OSPFv3EXTAREALSDBLIMIT 11
63 #define OSPFv3EXITOVERFLOWINTERVAL 12
64 #define OSPFv3DEMANDEXTENSIONS 13
65 #define OSPFv3REFERENCEBANDWIDTH 14
66 #define OSPFv3RESTARTSUPPORT 15
67 #define OSPFv3RESTARTINTERVAL 16
68 #define OSPFv3RESTARTSTRICTLSACHECKING 17
69 #define OSPFv3RESTARTSTATUS 18
70 #define OSPFv3RESTARTAGE 19
71 #define OSPFv3RESTARTEXITREASON 20
72 #define OSPFv3NOTIFICATIONENABLE 21
73 #define OSPFv3STUBROUTERSUPPORT 22
74 #define OSPFv3STUBROUTERADVERTISEMENT 23
75 #define OSPFv3DISCONTINUITYTIME 24
76 #define OSPFv3RESTARTTIME 25
78 /* OSPFv3 MIB Area Table values: ospfv3AreaTable */
79 #define OSPFv3IMPORTASEXTERN 2
80 #define OSPFv3AREASPFRUNS 3
81 #define OSPFv3AREABDRRTRCOUNT 4
82 #define OSPFv3AREAASBDRRTRCOUNT 5
83 #define OSPFv3AREASCOPELSACOUNT 6
84 #define OSPFv3AREASCOPELSACKSUMSUM 7
85 #define OSPFv3AREASUMMARY 8
86 #define OSPFv3AREAROWSTATUS 9
87 #define OSPFv3AREASTUBMETRIC 10
88 #define OSPFv3AREANSSATRANSLATORROLE 11
89 #define OSPFv3AREANSSATRANSLATORSTATE 12
90 #define OSPFv3AREANSSATRANSLATORSTABINTERVAL 13
91 #define OSPFv3AREANSSATRANSLATOREVENTS 14
92 #define OSPFv3AREASTUBMETRICTYPE 15
93 #define OSPFv3AREATEENABLED 16
95 /* OSPFv3 MIB * Lsdb Table values: ospfv3*LsdbTable */
96 #define OSPFv3WWLSDBSEQUENCE 1
97 #define OSPFv3WWLSDBAGE 2
98 #define OSPFv3WWLSDBCHECKSUM 3
99 #define OSPFv3WWLSDBADVERTISEMENT 4
100 #define OSPFv3WWLSDBTYPEKNOWN 5
102 /* Three first bits are to identify column */
103 #define OSPFv3WWCOLUMN 0x7
104 /* Then we use other bits to identify table */
105 #define OSPFv3WWASTABLE (1 << 3)
106 #define OSPFv3WWAREATABLE (1 << 4)
107 #define OSPFv3WWLINKTABLE (1 << 5)
108 #define OSPFv3WWVIRTLINKTABLE (1 << 6)
110 /* OSPFv3 MIB Host Table values: ospfv3HostTable */
111 #define OSPFv3HOSTMETRIC 3
112 #define OSPFv3HOSTROWSTATUS 4
113 #define OSPFv3HOSTAREAID 5
115 /* OSPFv3 MIB Interface Table values: ospfv3IfTable */
116 #define OSPFv3IFAREAID 3
117 #define OSPFv3IFTYPE 4
118 #define OSPFv3IFADMINSTATUS 5
119 #define OSPFv3IFRTRPRIORITY 6
120 #define OSPFv3IFTRANSITDELAY 7
121 #define OSPFv3IFRETRANSINTERVAL 8
122 #define OSPFv3IFHELLOINTERVAL 9
123 #define OSPFv3IFRTRDEADINTERVAL 10
124 #define OSPFv3IFPOLLINTERVAL 11
125 #define OSPFv3IFSTATE 12
126 #define OSPFv3IFDESIGNATEDROUTER 13
127 #define OSPFv3IFBACKUPDESIGNATEDROUTER 14
128 #define OSPFv3IFEVENTS 15
129 #define OSPFv3IFROWSTATUS 16
130 #define OSPFv3IFDEMAND 17
131 #define OSPFv3IFMETRICVALUE 18
132 #define OSPFv3IFLINKSCOPELSACOUNT 19
133 #define OSPFv3IFLINKLSACKSUMSUM 20
134 #define OSPFv3IFDEMANDNBRPROBE 21
135 #define OSPFv3IFDEMANDNBRPROBERETRANSLIMIT 22
136 #define OSPFv3IFDEMANDNBRPROBEINTERVAL 23
137 #define OSPFv3IFTEDISABLED 24
138 #define OSPFv3IFLINKLSASUPPRESSION 25
140 /* OSPFv3 MIB Virtual Interface Table values: ospfv3VirtIfTable */
141 #define OSPFv3VIRTIFINDEX 3
142 #define OSPFv3VIRTIFINSTID 4
143 #define OSPFv3VIRTIFTRANSITDELAY 5
144 #define OSPFv3VIRTIFRETRANSINTERVAL 6
145 #define OSPFv3VIRTIFHELLOINTERVAL 7
146 #define OSPFv3VIRTIFRTRDEADINTERVAL 8
147 #define OSPFv3VIRTIFSTATE 9
148 #define OSPFv3VIRTIFEVENTS 10
149 #define OSPFv3VIRTIFROWSTATUS 11
150 #define OSPFv3VIRTIFLINKSCOPELSACOUNT 12
151 #define OSPFv3VIRTIFLINKLSACKSUMSUM 13
153 /* OSPFv3 MIB Neighbors Table values: ospfv3NbrTable */
154 #define OSPFv3NBRADDRESSTYPE 4
155 #define OSPFv3NBRADDRESS 5
156 #define OSPFv3NBROPTIONS 6
157 #define OSPFv3NBRPRIORITY 7
158 #define OSPFv3NBRSTATE 8
159 #define OSPFv3NBREVENTS 9
160 #define OSPFv3NBRLSRETRANSQLEN 10
161 #define OSPFv3NBRHELLOSUPPRESSED 11
162 #define OSPFv3NBRIFID 12
163 #define OSPFv3NBRRESTARTHELPERSTATUS 13
164 #define OSPFv3NBRRESTARTHELPERAGE 14
165 #define OSPFv3NBRRESTARTHELPEREXITREASON 15
167 /* OSPFv3 MIB Configured Neighbors Table values: ospfv3CfgNbrTable */
168 #define OSPFv3CFGNBRPRIORITY 5
169 #define OSPFv3CFGNBRROWSTATUS 6
171 /* OSPFv3 MIB Virtual Neighbors Table values: ospfv3VirtNbrTable */
172 #define OSPFv3VIRTNBRIFINDEX 3
173 #define OSPFv3VIRTNBRIFINSTID 4
174 #define OSPFv3VIRTNBRADDRESSTYPE 5
175 #define OSPFv3VIRTNBRADDRESS 6
176 #define OSPFv3VIRTNBROPTIONS 7
177 #define OSPFv3VIRTNBRSTATE 8
178 #define OSPFv3VIRTNBREVENTS 9
179 #define OSPFv3VIRTNBRLSRETRANSQLEN 10
180 #define OSPFv3VIRTNBRHELLOSUPPRESSED 11
181 #define OSPFv3VIRTNBRIFID 12
182 #define OSPFv3VIRTNBRRESTARTHELPERSTATUS 13
183 #define OSPFv3VIRTNBRRESTARTHELPERAGE 14
184 #define OSPFv3VIRTNBRRESTARTHELPEREXITREASON 15
186 /* OSPFv3 MIB Area Aggregate Table values: ospfv3AreaAggregateTable */
187 #define OSPFv3AREAAGGREGATEROWSTATUS 6
188 #define OSPFv3AREAAGGREGATEEFFECT 7
189 #define OSPFv3AREAAGGREGATEROUTETAG 8
191 /* SYNTAX Status from OSPF-MIB. */
192 #define OSPF_STATUS_ENABLED 1
193 #define OSPF_STATUS_DISABLED 2
195 /* SNMP value hack. */
196 #define COUNTER ASN_COUNTER
197 #define INTEGER ASN_INTEGER
198 #define GAUGE ASN_GAUGE
199 #define UNSIGNED ASN_UNSIGNED
200 #define TIMETICKS ASN_TIMETICKS
201 #define IPADDRESS ASN_IPADDRESS
202 #define STRING ASN_OCTET_STR
204 /* For return values e.g. SNMP_INTEGER macro */
207 /* OSPFv3-MIB instances. */
208 oid ospfv3_oid [] = { OSPFv3MIB };
209 oid ospfv3_trap_oid [] = { OSPFv3MIB, 0 };
211 /* Hook functions. */
212 static u_char *ospfv3GeneralGroup (struct variable *, oid *, size_t *,
213 int, size_t *, WriteMethod **);
214 static u_char *ospfv3AreaEntry (struct variable *, oid *, size_t *,
215 int, size_t *, WriteMethod **);
216 static u_char *ospfv3WwLsdbEntry (struct variable *, oid *, size_t *,
217 int, size_t *, WriteMethod **);
218 static u_char *ospfv3NbrEntry (struct variable *, oid *, size_t *,
219 int, size_t *, WriteMethod **);
220 static u_char *ospfv3IfEntry (struct variable *, oid *, size_t *,
221 int, size_t *, WriteMethod **);
223 struct variable ospfv3_variables[] =
225 /* OSPF general variables */
226 {OSPFv3ROUTERID, UNSIGNED, RWRITE, ospfv3GeneralGroup,
228 {OSPFv3ADMINSTAT, INTEGER, RWRITE, ospfv3GeneralGroup,
230 {OSPFv3VERSIONNUMBER, INTEGER, RONLY, ospfv3GeneralGroup,
232 {OSPFv3AREABDRRTRSTATUS, INTEGER, RONLY, ospfv3GeneralGroup,
234 {OSPFv3ASBDRRTRSTATUS, INTEGER, RWRITE, ospfv3GeneralGroup,
236 {OSPFv3ASSCOPELSACOUNT, GAUGE, RONLY, ospfv3GeneralGroup,
238 {OSPFv3ASSCOPELSACHECKSUMSUM,UNSIGNED, RONLY, ospfv3GeneralGroup,
240 {OSPFv3ORIGINATENEWLSAS, COUNTER, RONLY, ospfv3GeneralGroup,
242 {OSPFv3RXNEWLSAS, COUNTER, RONLY, ospfv3GeneralGroup,
244 {OSPFv3EXTLSACOUNT, GAUGE, RONLY, ospfv3GeneralGroup,
246 {OSPFv3EXTAREALSDBLIMIT, INTEGER, RWRITE, ospfv3GeneralGroup,
248 {OSPFv3EXITOVERFLOWINTERVAL, UNSIGNED, RWRITE, ospfv3GeneralGroup,
250 {OSPFv3DEMANDEXTENSIONS, INTEGER, RWRITE, ospfv3GeneralGroup,
252 {OSPFv3REFERENCEBANDWIDTH, UNSIGNED, RWRITE, ospfv3GeneralGroup,
254 {OSPFv3RESTARTSUPPORT, INTEGER, RWRITE, ospfv3GeneralGroup,
256 {OSPFv3RESTARTINTERVAL, UNSIGNED, RWRITE, ospfv3GeneralGroup,
258 {OSPFv3RESTARTSTRICTLSACHECKING, INTEGER, RWRITE, ospfv3GeneralGroup,
260 {OSPFv3RESTARTSTATUS, INTEGER, RONLY, ospfv3GeneralGroup,
262 {OSPFv3RESTARTAGE, UNSIGNED, RONLY, ospfv3GeneralGroup,
264 {OSPFv3RESTARTEXITREASON, INTEGER, RONLY, ospfv3GeneralGroup,
266 {OSPFv3NOTIFICATIONENABLE, INTEGER, RWRITE, ospfv3GeneralGroup,
268 {OSPFv3STUBROUTERSUPPORT, INTEGER, RONLY, ospfv3GeneralGroup,
270 {OSPFv3STUBROUTERADVERTISEMENT, INTEGER, RWRITE, ospfv3GeneralGroup,
272 {OSPFv3DISCONTINUITYTIME, TIMETICKS, RONLY, ospfv3GeneralGroup,
274 {OSPFv3RESTARTTIME, TIMETICKS, RONLY, ospfv3GeneralGroup,
277 /* OSPFv3 Area Data Structure */
278 {OSPFv3IMPORTASEXTERN, INTEGER, RWRITE, ospfv3AreaEntry,
280 {OSPFv3AREASPFRUNS, COUNTER, RONLY, ospfv3AreaEntry,
282 {OSPFv3AREABDRRTRCOUNT, GAUGE, RONLY, ospfv3AreaEntry,
284 {OSPFv3AREAASBDRRTRCOUNT, GAUGE, RONLY, ospfv3AreaEntry,
286 {OSPFv3AREASCOPELSACOUNT, GAUGE, RONLY, ospfv3AreaEntry,
288 {OSPFv3AREASCOPELSACKSUMSUM, UNSIGNED, RONLY, ospfv3AreaEntry,
290 {OSPFv3AREASUMMARY, INTEGER, RWRITE, ospfv3AreaEntry,
292 {OSPFv3AREAROWSTATUS, INTEGER, RWRITE, ospfv3AreaEntry,
294 {OSPFv3AREASTUBMETRIC, INTEGER, RWRITE, ospfv3AreaEntry,
296 {OSPFv3AREANSSATRANSLATORROLE, INTEGER, RWRITE, ospfv3AreaEntry,
298 {OSPFv3AREANSSATRANSLATORSTATE, INTEGER, RONLY, ospfv3AreaEntry,
300 {OSPFv3AREANSSATRANSLATORSTABINTERVAL, UNSIGNED, RWRITE, ospfv3AreaEntry,
302 {OSPFv3AREANSSATRANSLATOREVENTS, COUNTER, RONLY, ospfv3AreaEntry,
304 {OSPFv3AREASTUBMETRICTYPE, INTEGER, RWRITE, ospfv3AreaEntry,
306 {OSPFv3AREATEENABLED, INTEGER, RWRITE, ospfv3AreaEntry,
310 {OSPFv3WWLSDBSEQUENCE | OSPFv3WWASTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
312 {OSPFv3WWLSDBAGE | OSPFv3WWASTABLE, UNSIGNED, RONLY, ospfv3WwLsdbEntry,
314 {OSPFv3WWLSDBCHECKSUM | OSPFv3WWASTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
316 {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWASTABLE, STRING, RONLY, ospfv3WwLsdbEntry,
318 {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWASTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
321 /* OSPFv3 Area LSDB */
322 {OSPFv3WWLSDBSEQUENCE | OSPFv3WWAREATABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
324 {OSPFv3WWLSDBAGE | OSPFv3WWAREATABLE, UNSIGNED, RONLY, ospfv3WwLsdbEntry,
326 {OSPFv3WWLSDBCHECKSUM | OSPFv3WWAREATABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
328 {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWAREATABLE, STRING, RONLY, ospfv3WwLsdbEntry,
330 {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWAREATABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
333 /* OSPFv3 Link LSDB */
334 {OSPFv3WWLSDBSEQUENCE | OSPFv3WWLINKTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
336 {OSPFv3WWLSDBAGE | OSPFv3WWLINKTABLE, UNSIGNED, RONLY, ospfv3WwLsdbEntry,
338 {OSPFv3WWLSDBCHECKSUM | OSPFv3WWLINKTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
340 {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWLINKTABLE, STRING, RONLY, ospfv3WwLsdbEntry,
342 {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWLINKTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
345 /* OSPFv3 interfaces */
346 {OSPFv3IFAREAID, UNSIGNED, RONLY, ospfv3IfEntry,
348 {OSPFv3IFTYPE, INTEGER, RONLY, ospfv3IfEntry,
350 {OSPFv3IFADMINSTATUS, INTEGER, RONLY, ospfv3IfEntry,
352 {OSPFv3IFRTRPRIORITY, INTEGER, RONLY, ospfv3IfEntry,
354 {OSPFv3IFTRANSITDELAY, UNSIGNED, RONLY, ospfv3IfEntry,
356 {OSPFv3IFRETRANSINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
358 {OSPFv3IFHELLOINTERVAL, INTEGER, RONLY, ospfv3IfEntry,
360 {OSPFv3IFRTRDEADINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
362 {OSPFv3IFPOLLINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
364 {OSPFv3IFSTATE, INTEGER, RONLY, ospfv3IfEntry,
366 {OSPFv3IFDESIGNATEDROUTER, UNSIGNED, RONLY, ospfv3IfEntry,
368 {OSPFv3IFBACKUPDESIGNATEDROUTER, UNSIGNED, RONLY, ospfv3IfEntry,
370 {OSPFv3IFEVENTS, COUNTER, RONLY, ospfv3IfEntry,
372 {OSPFv3IFROWSTATUS, INTEGER, RONLY, ospfv3IfEntry,
374 {OSPFv3IFDEMAND, INTEGER, RONLY, ospfv3IfEntry,
376 {OSPFv3IFMETRICVALUE, INTEGER, RONLY, ospfv3IfEntry,
378 {OSPFv3IFLINKSCOPELSACOUNT, GAUGE, RONLY, ospfv3IfEntry,
380 {OSPFv3IFLINKLSACKSUMSUM, UNSIGNED, RONLY, ospfv3IfEntry,
382 {OSPFv3IFDEMANDNBRPROBE, INTEGER, RONLY, ospfv3IfEntry,
384 {OSPFv3IFDEMANDNBRPROBERETRANSLIMIT, UNSIGNED, RONLY, ospfv3IfEntry,
386 {OSPFv3IFDEMANDNBRPROBEINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
388 {OSPFv3IFTEDISABLED, INTEGER, RONLY, ospfv3IfEntry,
390 {OSPFv3IFLINKLSASUPPRESSION, INTEGER, RONLY, ospfv3IfEntry,
393 /* OSPFv3 neighbors */
394 {OSPFv3NBRADDRESSTYPE, INTEGER, RONLY, ospfv3NbrEntry,
396 {OSPFv3NBRADDRESS, STRING, RONLY, ospfv3NbrEntry,
398 {OSPFv3NBROPTIONS, INTEGER, RONLY, ospfv3NbrEntry,
400 {OSPFv3NBRPRIORITY, INTEGER, RONLY, ospfv3NbrEntry,
402 {OSPFv3NBRSTATE, INTEGER, RONLY, ospfv3NbrEntry,
404 {OSPFv3NBREVENTS, COUNTER, RONLY, ospfv3NbrEntry,
406 {OSPFv3NBRLSRETRANSQLEN, GAUGE, RONLY, ospfv3NbrEntry,
408 {OSPFv3NBRHELLOSUPPRESSED, INTEGER, RONLY, ospfv3NbrEntry,
410 {OSPFv3NBRIFID, INTEGER, RONLY, ospfv3NbrEntry,
412 {OSPFv3NBRRESTARTHELPERSTATUS, INTEGER, RONLY, ospfv3NbrEntry,
414 {OSPFv3NBRRESTARTHELPERAGE, UNSIGNED, RONLY, ospfv3NbrEntry,
416 {OSPFv3NBRRESTARTHELPEREXITREASON, INTEGER, RONLY, ospfv3NbrEntry,
421 ospfv3GeneralGroup (struct variable *v, oid *name, size_t *length,
422 int exact, size_t *var_len, WriteMethod **write_method)
426 struct ospf6_lsa *lsa = NULL;
428 /* Check whether the instance identifier is valid */
429 if (smux_header_generic (v, name, length, exact, var_len, write_method)
433 /* Return the current value of the variable */
437 /* Router-ID of this OSPF instance. */
439 return SNMP_INTEGER (ntohl (ospf6->router_id));
440 return SNMP_INTEGER (0);
441 case OSPFv3ADMINSTAT:
443 return SNMP_INTEGER (CHECK_FLAG (ospf6->flag, OSPF6_DISABLED)?
444 OSPF_STATUS_DISABLED:OSPF_STATUS_ENABLED);
445 return SNMP_INTEGER (OSPF_STATUS_DISABLED);
446 case OSPFv3VERSIONNUMBER:
447 return SNMP_INTEGER (3);
448 case OSPFv3AREABDRRTRSTATUS:
450 return SNMP_INTEGER (ospf6_is_router_abr (ospf6)?SNMP_TRUE:SNMP_FALSE);
451 return SNMP_INTEGER (SNMP_FALSE);
452 case OSPFv3ASBDRRTRSTATUS:
454 return SNMP_INTEGER (ospf6_asbr_is_asbr (ospf6)?SNMP_TRUE:SNMP_FALSE);
455 return SNMP_INTEGER (SNMP_FALSE);
456 case OSPFv3ASSCOPELSACOUNT:
458 return SNMP_INTEGER (ospf6->lsdb->count);
459 return SNMP_INTEGER (0);
460 case OSPFv3ASSCOPELSACHECKSUMSUM:
463 for (sum = 0, lsa = ospf6_lsdb_head (ospf6->lsdb);
465 lsa = ospf6_lsdb_next (lsa))
466 sum += ntohs (lsa->header->checksum);
467 return SNMP_INTEGER (sum);
469 return SNMP_INTEGER (0);
470 case OSPFv3ORIGINATENEWLSAS:
471 return SNMP_INTEGER (0); /* Don't know where to get this value... */
472 case OSPFv3RXNEWLSAS:
473 return SNMP_INTEGER (0); /* Don't know where to get this value... */
474 case OSPFv3EXTLSACOUNT:
477 for (count = 0, lsa = ospf6_lsdb_type_head (htons (OSPF6_LSTYPE_AS_EXTERNAL),
480 lsa = ospf6_lsdb_type_next (htons (OSPF6_LSTYPE_AS_EXTERNAL),
483 return SNMP_INTEGER (count);
485 return SNMP_INTEGER (0);
486 case OSPFv3EXTAREALSDBLIMIT:
487 return SNMP_INTEGER (-1);
488 case OSPFv3EXITOVERFLOWINTERVAL:
489 return SNMP_INTEGER (0); /* Not supported */
490 case OSPFv3DEMANDEXTENSIONS:
491 return SNMP_INTEGER (0); /* Not supported */
492 case OSPFv3REFERENCEBANDWIDTH:
494 return SNMP_INTEGER (ospf6->ref_bandwidth);
495 /* Otherwise, like for "not implemented". */
496 case OSPFv3RESTARTSUPPORT:
497 case OSPFv3RESTARTINTERVAL:
498 case OSPFv3RESTARTSTRICTLSACHECKING:
499 case OSPFv3RESTARTSTATUS:
500 case OSPFv3RESTARTAGE:
501 case OSPFv3RESTARTEXITREASON:
502 case OSPFv3NOTIFICATIONENABLE:
503 case OSPFv3STUBROUTERSUPPORT:
504 case OSPFv3STUBROUTERADVERTISEMENT:
505 case OSPFv3DISCONTINUITYTIME:
506 case OSPFv3RESTARTTIME:
507 /* TODO: Not implemented */
514 ospfv3AreaEntry (struct variable *v, oid *name, size_t *length,
515 int exact, size_t *var_len, WriteMethod **write_method)
517 struct ospf6_area *oa, *area = NULL;
518 struct ospf6_lsa *lsa = NULL;
519 u_int32_t area_id = 0;
522 struct listnode *node;
525 struct ospf6_route *ro;
530 if (smux_header_table(v, name, length, exact, var_len, write_method)
534 len = *length - v->namelen;
535 len = (len >= 1 ? 1 : 0);
536 if (exact && len != 1)
539 area_id = htonl (name[v->namelen]);
541 inet_ntop (AF_INET, &area_id, a, sizeof (a));
542 zlog_debug ("SNMP access by area: %s, exact=%d len=%d length=%lu",
543 a, exact, len, (u_long)*length);
545 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
549 if (len == 0) /* return first area entry */
551 else if (exact && ntohl (oa->area_id) == ntohl (area_id))
553 else if (ntohl (oa->area_id) > ntohl (area_id))
561 *length = v->namelen + 1;
562 name[v->namelen] = ntohl (area->area_id);
564 inet_ntop (AF_INET, &area->area_id, a, sizeof (a));
565 zlog_debug ("SNMP found area: %s, exact=%d len=%d length=%lu",
566 a, exact, len, (u_long)*length);
570 case OSPFv3IMPORTASEXTERN:
571 /* No NSSA support */
572 return SNMP_INTEGER (IS_AREA_STUB(area)?2:1);
573 case OSPFv3AREASPFRUNS:
574 return SNMP_INTEGER (area->spf_calculation);
575 case OSPFv3AREABDRRTRCOUNT:
576 case OSPFv3AREAASBDRRTRCOUNT:
578 for (ro = ospf6_route_head (ospf6->brouter_table); ro;
579 ro = ospf6_route_next (ro))
581 if (ntohl (ro->path.area_id) != ntohl (area->area_id)) continue;
582 if (v->magic == OSPFv3AREABDRRTRCOUNT &&
583 CHECK_FLAG (ro->path.router_bits, OSPF6_ROUTER_BIT_B))
585 if (v->magic == OSPFv3AREAASBDRRTRCOUNT &&
586 CHECK_FLAG (ro->path.router_bits, OSPF6_ROUTER_BIT_E))
589 return SNMP_INTEGER (count);
590 case OSPFv3AREASCOPELSACOUNT:
591 return SNMP_INTEGER (area->lsdb->count);
592 case OSPFv3AREASCOPELSACKSUMSUM:
593 for (sum = 0, lsa = ospf6_lsdb_head (area->lsdb);
595 lsa = ospf6_lsdb_next (lsa))
596 sum += ntohs (lsa->header->checksum);
597 return SNMP_INTEGER (sum);
598 case OSPFv3AREASUMMARY:
599 return SNMP_INTEGER (2); /* sendAreaSummary */
600 case OSPFv3AREAROWSTATUS:
601 return SNMP_INTEGER (1); /* Active */
602 case OSPFv3AREASTUBMETRIC:
603 case OSPFv3AREANSSATRANSLATORROLE:
604 case OSPFv3AREANSSATRANSLATORSTATE:
605 case OSPFv3AREANSSATRANSLATORSTABINTERVAL:
606 case OSPFv3AREANSSATRANSLATOREVENTS:
607 case OSPFv3AREASTUBMETRICTYPE:
608 case OSPFv3AREATEENABLED:
609 /* Not implemented. */
616 if_icmp_func (struct interface *ifp1, struct interface *ifp2)
618 return (ifp1->ifindex - ifp2->ifindex);
622 ospfv3WwLsdbEntry (struct variable *v, oid *name, size_t *length,
623 int exact, size_t *var_len, WriteMethod **write_method)
625 struct ospf6_lsa *lsa = NULL;
626 ifindex_t ifindex, area_id, id, instid, adv_router;
631 struct ospf6_area *oa = NULL;
632 struct listnode *node;
633 struct interface *iif;
634 struct ospf6_interface *oi = NULL;
635 struct list *ifslist;
637 if (smux_header_table(v, name, length, exact, var_len, write_method)
641 instid = ifindex = area_id = type = id = adv_router = 0;
643 /* Check OSPFv3 instance. */
647 /* Get variable length. */
648 offset = name + v->namelen;
649 offsetlen = *length - v->namelen;
651 if (exact && (v->magic & OSPFv3WWASTABLE) && offsetlen != 3)
653 if (exact && (v->magic & OSPFv3WWAREATABLE) && offsetlen != 4)
655 if (exact && (v->magic & OSPFv3WWLINKTABLE) && offsetlen != 5)
658 if (v->magic & OSPFv3WWLINKTABLE)
661 len = (offsetlen < 1 ? 0 : 1);
667 /* Parse instance ID */
668 len = (offsetlen < 1 ? 0 : 1);
674 else if (v->magic & OSPFv3WWAREATABLE)
677 len = (offsetlen < 1 ? 0 : 1);
679 area_id = htonl (*offset);
685 len = (offsetlen < 1 ? 0 : 1);
687 type = htons (*offset);
691 /* Parse Router-ID */
692 len = (offsetlen < 1 ? 0 : 1);
694 adv_router = htonl (*offset);
699 len = (offsetlen < 1 ? 0 : 1);
701 id = htonl (*offset);
707 if (v->magic & OSPFv3WWASTABLE)
709 lsa = ospf6_lsdb_lookup (type, id, adv_router, ospf6->lsdb);
711 else if (v->magic & OSPFv3WWAREATABLE)
713 oa = ospf6_area_lookup (area_id, ospf6);
714 if (!oa) return NULL;
715 lsa = ospf6_lsdb_lookup (type, id, adv_router, oa->lsdb);
717 else if (v->magic & OSPFv3WWLINKTABLE)
719 oi = ospf6_interface_lookup_by_ifindex (ifindex);
720 if (!oi || oi->instance_id != instid) return NULL;
721 lsa = ospf6_lsdb_lookup (type, id, adv_router, oi->lsdb);
726 if (v->magic & OSPFv3WWASTABLE)
728 if (ospf6->lsdb->count)
729 lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
732 else if (v->magic & OSPFv3WWAREATABLE)
733 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
735 if (oa->area_id < area_id)
739 lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
746 else if (v->magic & OSPFv3WWLINKTABLE)
748 /* We build a sorted list of interfaces */
749 ifslist = list_new ();
750 if (!ifslist) return NULL;
751 ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
752 for (ALL_LIST_ELEMENTS_RO (iflist, node, iif))
753 listnode_add_sort (ifslist, iif);
755 for (ALL_LIST_ELEMENTS_RO (ifslist, node, iif))
757 if (!iif->ifindex) continue;
758 oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
760 if (iif->ifindex < ifindex) continue;
761 if (oi->instance_id < instid) continue;
764 lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
773 list_delete_all_node (ifslist);
781 if (v->magic & OSPFv3WWASTABLE)
783 *length = v->namelen + 3;
784 offset = name + v->namelen;
786 else if (v->magic & OSPFv3WWAREATABLE)
788 *length = v->namelen + 4;
789 offset = name + v->namelen;
790 *offset = ntohl (oa->area_id);
793 else if (v->magic & OSPFv3WWLINKTABLE)
795 *length = v->namelen + 5;
796 offset = name + v->namelen;
797 *offset = oi->interface->ifindex;
799 *offset = oi->instance_id;
802 *offset = ntohs (lsa->header->type);
804 *offset = ntohl (lsa->header->adv_router);
806 *offset = ntohl (lsa->header->id);
809 /* Return the current value of the variable */
810 switch (v->magic & OSPFv3WWCOLUMN)
812 case OSPFv3WWLSDBSEQUENCE:
813 return SNMP_INTEGER (ntohl (lsa->header->seqnum));
815 case OSPFv3WWLSDBAGE:
816 ospf6_lsa_age_current (lsa);
817 return SNMP_INTEGER (ntohs (lsa->header->age));
819 case OSPFv3WWLSDBCHECKSUM:
820 return SNMP_INTEGER (ntohs (lsa->header->checksum));
822 case OSPFv3WWLSDBADVERTISEMENT:
823 *var_len = ntohs (lsa->header->length);
824 return (u_char *) lsa->header;
826 case OSPFv3WWLSDBTYPEKNOWN:
827 return SNMP_INTEGER (OSPF6_LSA_IS_KNOWN (lsa->header->type) ?
828 SNMP_TRUE : SNMP_FALSE);
835 ospfv3IfEntry (struct variable *v, oid *name, size_t *length,
836 int exact, size_t *var_len, WriteMethod **write_method)
838 ifindex_t ifindex = 0;
839 unsigned int instid = 0;
840 struct ospf6_interface *oi = NULL;
841 struct ospf6_lsa *lsa = NULL;
842 struct interface *iif;
844 struct list *ifslist;
849 if (smux_header_table (v, name, length, exact, var_len, write_method)
853 /* Check OSPFv3 instance. */
857 /* Get variable length. */
858 offset = name + v->namelen;
859 offsetlen = *length - v->namelen;
861 if (exact && offsetlen != 2)
865 len = (offsetlen < 1 ? 0 : 1);
871 /* Parse instance ID */
872 len = (offsetlen < 1 ? 0 : 1);
880 oi = ospf6_interface_lookup_by_ifindex (ifindex);
881 if (!oi || oi->instance_id != instid) return NULL;
885 /* We build a sorted list of interfaces */
886 ifslist = list_new ();
887 if (!ifslist) return NULL;
888 ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
889 for (ALL_LIST_ELEMENTS_RO (iflist, i, iif))
890 listnode_add_sort (ifslist, iif);
892 for (ALL_LIST_ELEMENTS_RO (ifslist, i, iif))
894 if (!iif->ifindex) continue;
895 oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
897 if (iif->ifindex > ifindex ||
898 (iif->ifindex == ifindex &&
899 (oi->instance_id > instid)))
904 list_delete_all_node (ifslist);
907 if (!oi) return NULL;
909 /* Add Index (IfIndex, IfInstId) */
910 *length = v->namelen + 2;
911 offset = name + v->namelen;
912 *offset = oi->interface->ifindex;
914 *offset = oi->instance_id;
917 /* Return the current value of the variable */
922 return SNMP_INTEGER (ntohl (oi->area->area_id));
925 if (if_is_broadcast (oi->interface))
926 return SNMP_INTEGER (1);
927 else if (if_is_pointopoint (oi->interface))
928 return SNMP_INTEGER (3);
929 else break; /* Unknown, don't put anything */
930 case OSPFv3IFADMINSTATUS:
932 return SNMP_INTEGER (OSPF_STATUS_ENABLED);
933 return SNMP_INTEGER (OSPF_STATUS_DISABLED);
934 case OSPFv3IFRTRPRIORITY:
935 return SNMP_INTEGER (oi->priority);
936 case OSPFv3IFTRANSITDELAY:
937 return SNMP_INTEGER (oi->transdelay);
938 case OSPFv3IFRETRANSINTERVAL:
939 return SNMP_INTEGER (oi->rxmt_interval);
940 case OSPFv3IFHELLOINTERVAL:
941 return SNMP_INTEGER (oi->hello_interval);
942 case OSPFv3IFRTRDEADINTERVAL:
943 return SNMP_INTEGER (oi->dead_interval);
944 case OSPFv3IFPOLLINTERVAL:
945 /* No support for NBMA */
948 return SNMP_INTEGER (oi->state);
949 case OSPFv3IFDESIGNATEDROUTER:
950 return SNMP_INTEGER (ntohl (oi->drouter));
951 case OSPFv3IFBACKUPDESIGNATEDROUTER:
952 return SNMP_INTEGER (ntohl (oi->bdrouter));
954 return SNMP_INTEGER (oi->state_change);
955 case OSPFv3IFROWSTATUS:
956 return SNMP_INTEGER (1);
958 return SNMP_INTEGER (SNMP_FALSE);
959 case OSPFv3IFMETRICVALUE:
960 return SNMP_INTEGER (oi->cost);
961 case OSPFv3IFLINKSCOPELSACOUNT:
962 return SNMP_INTEGER (oi->lsdb->count);
963 case OSPFv3IFLINKLSACKSUMSUM:
964 for (sum = 0, lsa = ospf6_lsdb_head (oi->lsdb);
966 lsa = ospf6_lsdb_next (lsa))
967 sum += ntohs (lsa->header->checksum);
968 return SNMP_INTEGER (sum);
969 case OSPFv3IFDEMANDNBRPROBE:
970 case OSPFv3IFDEMANDNBRPROBERETRANSLIMIT:
971 case OSPFv3IFDEMANDNBRPROBEINTERVAL:
972 case OSPFv3IFTEDISABLED:
973 case OSPFv3IFLINKLSASUPPRESSION:
974 /* Not implemented. Only works if all the last ones are not
979 /* Try an internal getnext. Some columns are missing in this table. */
980 if (!exact && (name[*length-1] < MAX_SUBID))
981 return ospfv3IfEntry(v, name, length,
982 exact, var_len, write_method);
987 ospfv3NbrEntry (struct variable *v, oid *name, size_t *length,
988 int exact, size_t *var_len, WriteMethod **write_method)
990 ifindex_t ifindex = 0;
991 unsigned int instid, rtrid;
992 struct ospf6_interface *oi = NULL;
993 struct ospf6_neighbor *on = NULL;
994 struct interface *iif;
995 struct listnode *i, *j;
996 struct list *ifslist;
1000 if (smux_header_table (v, name, length, exact, var_len, write_method)
1006 /* Check OSPFv3 instance. */
1010 /* Get variable length. */
1011 offset = name + v->namelen;
1012 offsetlen = *length - v->namelen;
1014 if (exact && offsetlen != 3)
1017 /* Parse if index */
1018 len = (offsetlen < 1 ? 0 : 1);
1024 /* Parse instance ID */
1025 len = (offsetlen < 1 ? 0 : 1);
1031 /* Parse router ID */
1032 len = (offsetlen < 1 ? 0 : 1);
1034 rtrid = htonl (*offset);
1040 oi = ospf6_interface_lookup_by_ifindex (ifindex);
1041 if (!oi || oi->instance_id != instid) return NULL;
1042 on = ospf6_neighbor_lookup (rtrid, oi);
1046 /* We build a sorted list of interfaces */
1047 ifslist = list_new ();
1048 if (!ifslist) return NULL;
1049 ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
1050 for (ALL_LIST_ELEMENTS_RO (iflist, i, iif))
1051 listnode_add_sort (ifslist, iif);
1053 for (ALL_LIST_ELEMENTS_RO (ifslist, i, iif))
1055 if (!iif->ifindex) continue;
1056 oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
1058 for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, j, on)) {
1059 if (iif->ifindex > ifindex ||
1060 (iif->ifindex == ifindex &&
1061 (oi->instance_id > instid ||
1062 (oi->instance_id == instid &&
1063 ntohl (on->router_id) > ntohl (rtrid)))))
1071 list_delete_all_node (ifslist);
1074 if (!oi || !on) return NULL;
1076 /* Add Index (IfIndex, IfInstId, RtrId) */
1077 *length = v->namelen + 3;
1078 offset = name + v->namelen;
1079 *offset = oi->interface->ifindex;
1081 *offset = oi->instance_id;
1083 *offset = ntohl (on->router_id);
1086 /* Return the current value of the variable */
1089 case OSPFv3NBRADDRESSTYPE:
1090 return SNMP_INTEGER (2); /* IPv6 only */
1091 case OSPFv3NBRADDRESS:
1092 *var_len = sizeof (struct in6_addr);
1093 return (u_char *) &on->linklocal_addr;
1094 case OSPFv3NBROPTIONS:
1095 return SNMP_INTEGER (on->options[2]);
1096 case OSPFv3NBRPRIORITY:
1097 return SNMP_INTEGER (on->priority);
1098 case OSPFv3NBRSTATE:
1099 return SNMP_INTEGER (on->state);
1100 case OSPFv3NBREVENTS:
1101 return SNMP_INTEGER (on->state_change);
1102 case OSPFv3NBRLSRETRANSQLEN:
1103 return SNMP_INTEGER (on->retrans_list->count);
1104 case OSPFv3NBRHELLOSUPPRESSED:
1105 return SNMP_INTEGER (SNMP_FALSE);
1107 return SNMP_INTEGER (on->ifindex);
1108 case OSPFv3NBRRESTARTHELPERSTATUS:
1109 case OSPFv3NBRRESTARTHELPERAGE:
1110 case OSPFv3NBRRESTARTHELPEREXITREASON:
1111 /* Not implemented. Only works if all the last ones are not
1120 #define NBRSTATECHANGE 2
1121 #define IFSTATECHANGE 10
1123 static struct trap_object ospf6NbrTrapList[] =
1125 {-3, {1, 1, OSPFv3ROUTERID}},
1126 {4, {1, 9, 1, OSPFv3NBRADDRESSTYPE}},
1127 {4, {1, 9, 1, OSPFv3NBRADDRESS}},
1128 {4, {1, 9, 1, OSPFv3NBRSTATE}}
1131 static struct trap_object ospf6IfTrapList[] =
1133 {-3, {1, 1, OSPFv3ROUTERID}},
1134 {4, {1, 7, 1, OSPFv3IFSTATE}},
1135 {4, {1, 7, 1, OSPFv3IFADMINSTATUS}},
1136 {4, {1, 7, 1, OSPFv3IFAREAID}}
1140 ospf6TrapNbrStateChange (struct ospf6_neighbor *on)
1144 index[0] = on->ospf6_if->interface->ifindex;
1145 index[1] = on->ospf6_if->instance_id;
1146 index[2] = ntohl (on->router_id);
1148 smux_trap (ospfv3_variables, sizeof ospfv3_variables / sizeof (struct variable),
1149 ospfv3_trap_oid, sizeof ospfv3_trap_oid / sizeof (oid),
1150 ospfv3_oid, sizeof ospfv3_oid / sizeof (oid),
1153 sizeof ospf6NbrTrapList / sizeof (struct trap_object),
1158 ospf6TrapIfStateChange (struct ospf6_interface *oi)
1162 index[0] = oi->interface->ifindex;
1163 index[1] = oi->instance_id;
1165 smux_trap (ospfv3_variables, sizeof ospfv3_variables / sizeof (struct variable),
1166 ospfv3_trap_oid, sizeof ospfv3_trap_oid / sizeof (oid),
1167 ospfv3_oid, sizeof ospfv3_oid / sizeof (oid),
1170 sizeof ospf6IfTrapList / sizeof (struct trap_object),
1174 /* Register OSPFv3-MIB. */
1176 ospf6_snmp_init (struct thread_master *master)
1179 REGISTER_MIB ("OSPFv3MIB", ospfv3_variables, variable, ospfv3_oid);
1182 #endif /* HAVE_SNMP */