]> git.proxmox.com Git - mirror_frr.git/blame - ospf6d/ospf6_snmp.c
ospf6d: Make ospf6_lsa_lock follow normal FRR pattern
[mirror_frr.git] / ospf6d / ospf6_snmp.c
CommitLineData
ef1bbf5c 1/* OSPFv3 SNMP support
2 * Copyright (C) 2004 Yasuhiro Ohara
3 *
4 * This file is part of GNU Zebra.
5 *
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
9 * later version.
10 *
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.
15 *
896014f4
DL
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
ef1bbf5c 19 */
20
21#include <zebra.h>
22
ef1bbf5c 23#include <net-snmp/net-snmp-config.h>
fb62a3ce 24#include <net-snmp/net-snmp-includes.h>
ef1bbf5c 25
26#include "log.h"
27#include "vty.h"
28#include "linklist.h"
d11f748b
DL
29#include "vector.h"
30#include "vrf.h"
ef1bbf5c 31#include "smux.h"
5986b66b
DL
32#include "libfrr.h"
33#include "version.h"
ef1bbf5c 34
35#include "ospf6_proto.h"
36#include "ospf6_lsa.h"
37#include "ospf6_lsdb.h"
38#include "ospf6_route.h"
39#include "ospf6_top.h"
40#include "ospf6_area.h"
41#include "ospf6_interface.h"
42#include "ospf6_message.h"
43#include "ospf6_neighbor.h"
1cc5e682
DL
44#include "ospf6_abr.h"
45#include "ospf6_asbr.h"
ef1bbf5c 46#include "ospf6d.h"
3012671f 47
ef1bbf5c 48/* OSPFv3-MIB */
0f0ab518 49#define OSPFv3MIB 1,3,6,1,2,1,191
ef1bbf5c 50
ef1bbf5c 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
0f0ab518
VB
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
77
78/* OSPFv3 MIB Area Table values: ospfv3AreaTable */
ef1bbf5c 79#define OSPFv3IMPORTASEXTERN 2
2680aa2b 80#define OSPFv3AREASPFRUNS 3
81#define OSPFv3AREABDRRTRCOUNT 4
82#define OSPFv3AREAASBDRRTRCOUNT 5
83#define OSPFv3AREASCOPELSACOUNT 6
84#define OSPFv3AREASCOPELSACKSUMSUM 7
85#define OSPFv3AREASUMMARY 8
0f0ab518
VB
86#define OSPFv3AREAROWSTATUS 9
87#define OSPFv3AREASTUBMETRIC 10
2680aa2b 88#define OSPFv3AREANSSATRANSLATORROLE 11
89#define OSPFv3AREANSSATRANSLATORSTATE 12
0f0ab518 90#define OSPFv3AREANSSATRANSLATORSTABINTERVAL 13
2680aa2b 91#define OSPFv3AREANSSATRANSLATOREVENTS 14
92#define OSPFv3AREASTUBMETRICTYPE 15
0f0ab518 93#define OSPFv3AREATEENABLED 16
2680aa2b 94
c349bb86
VB
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
101
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)
0f0ab518
VB
109
110/* OSPFv3 MIB Host Table values: ospfv3HostTable */
111#define OSPFv3HOSTMETRIC 3
112#define OSPFv3HOSTROWSTATUS 4
113#define OSPFv3HOSTAREAID 5
114
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
139
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
152
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
166
167/* OSPFv3 MIB Configured Neighbors Table values: ospfv3CfgNbrTable */
168#define OSPFv3CFGNBRPRIORITY 5
169#define OSPFv3CFGNBRROWSTATUS 6
170
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
185
186/* OSPFv3 MIB Area Aggregate Table values: ospfv3AreaAggregateTable */
187#define OSPFv3AREAAGGREGATEROWSTATUS 6
188#define OSPFv3AREAAGGREGATEEFFECT 7
189#define OSPFv3AREAAGGREGATEROUTETAG 8
190
ef1bbf5c 191/* SYNTAX Status from OSPF-MIB. */
192#define OSPF_STATUS_ENABLED 1
193#define OSPF_STATUS_DISABLED 2
194
195/* SNMP value hack. */
196#define COUNTER ASN_COUNTER
197#define INTEGER ASN_INTEGER
198#define GAUGE ASN_GAUGE
0f0ab518 199#define UNSIGNED ASN_UNSIGNED
ef1bbf5c 200#define TIMETICKS ASN_TIMETICKS
201#define IPADDRESS ASN_IPADDRESS
202#define STRING ASN_OCTET_STR
203
204/* For return values e.g. SNMP_INTEGER macro */
205SNMP_LOCAL_VARIABLES
206
ef1bbf5c 207/* OSPFv3-MIB instances. */
d62a17ae 208static oid ospfv3_oid[] = {OSPFv3MIB};
209static oid ospfv3_trap_oid[] = {OSPFv3MIB, 0};
ef1bbf5c 210
ef1bbf5c 211/* Hook functions. */
d7c0a89a
QY
212static uint8_t *ospfv3GeneralGroup(struct variable *, oid *, size_t *, int,
213 size_t *, WriteMethod **);
214static uint8_t *ospfv3AreaEntry(struct variable *, oid *, size_t *, int,
215 size_t *, WriteMethod **);
216static uint8_t *ospfv3WwLsdbEntry(struct variable *, oid *, size_t *, int,
d62a17ae 217 size_t *, WriteMethod **);
d7c0a89a 218static uint8_t *ospfv3NbrEntry(struct variable *, oid *, size_t *, int,
d62a17ae 219 size_t *, WriteMethod **);
d7c0a89a 220static uint8_t *ospfv3IfEntry(struct variable *, oid *, size_t *, int, size_t *,
d62a17ae 221 WriteMethod **);
d62a17ae 222
223static struct variable ospfv3_variables[] = {
224 /* OSPF general variables */
225 {OSPFv3ROUTERID, UNSIGNED, RWRITE, ospfv3GeneralGroup, 3, {1, 1, 1}},
226 {OSPFv3ADMINSTAT, INTEGER, RWRITE, ospfv3GeneralGroup, 3, {1, 1, 2}},
227 {OSPFv3VERSIONNUMBER, INTEGER, RONLY, ospfv3GeneralGroup, 3, {1, 1, 3}},
228 {OSPFv3AREABDRRTRSTATUS,
229 INTEGER,
230 RONLY,
231 ospfv3GeneralGroup,
232 3,
233 {1, 1, 4}},
234 {OSPFv3ASBDRRTRSTATUS,
235 INTEGER,
236 RWRITE,
237 ospfv3GeneralGroup,
238 3,
239 {1, 1, 5}},
240 {OSPFv3ASSCOPELSACOUNT, GAUGE, RONLY, ospfv3GeneralGroup, 3, {1, 1, 6}},
241 {OSPFv3ASSCOPELSACHECKSUMSUM,
242 UNSIGNED,
243 RONLY,
244 ospfv3GeneralGroup,
245 3,
246 {1, 1, 7}},
247 {OSPFv3ORIGINATENEWLSAS,
248 COUNTER,
249 RONLY,
250 ospfv3GeneralGroup,
251 3,
252 {1, 1, 8}},
253 {OSPFv3RXNEWLSAS, COUNTER, RONLY, ospfv3GeneralGroup, 3, {1, 1, 9}},
254 {OSPFv3EXTLSACOUNT, GAUGE, RONLY, ospfv3GeneralGroup, 3, {1, 1, 10}},
255 {OSPFv3EXTAREALSDBLIMIT,
256 INTEGER,
257 RWRITE,
258 ospfv3GeneralGroup,
259 3,
260 {1, 1, 11}},
261 {OSPFv3EXITOVERFLOWINTERVAL,
262 UNSIGNED,
263 RWRITE,
264 ospfv3GeneralGroup,
265 3,
266 {1, 1, 12}},
267 {OSPFv3DEMANDEXTENSIONS,
268 INTEGER,
269 RWRITE,
270 ospfv3GeneralGroup,
271 3,
272 {1, 1, 13}},
273 {OSPFv3REFERENCEBANDWIDTH,
274 UNSIGNED,
275 RWRITE,
276 ospfv3GeneralGroup,
277 3,
278 {1, 1, 14}},
279 {OSPFv3RESTARTSUPPORT,
280 INTEGER,
281 RWRITE,
282 ospfv3GeneralGroup,
283 3,
284 {1, 1, 15}},
285 {OSPFv3RESTARTINTERVAL,
286 UNSIGNED,
287 RWRITE,
288 ospfv3GeneralGroup,
289 3,
290 {1, 1, 16}},
291 {OSPFv3RESTARTSTRICTLSACHECKING,
292 INTEGER,
293 RWRITE,
294 ospfv3GeneralGroup,
295 3,
296 {1, 1, 17}},
297 {OSPFv3RESTARTSTATUS,
298 INTEGER,
299 RONLY,
300 ospfv3GeneralGroup,
301 3,
302 {1, 1, 18}},
303 {OSPFv3RESTARTAGE, UNSIGNED, RONLY, ospfv3GeneralGroup, 3, {1, 1, 19}},
304 {OSPFv3RESTARTEXITREASON,
305 INTEGER,
306 RONLY,
307 ospfv3GeneralGroup,
308 3,
309 {1, 1, 20}},
310 {OSPFv3NOTIFICATIONENABLE,
311 INTEGER,
312 RWRITE,
313 ospfv3GeneralGroup,
314 3,
315 {1, 1, 21}},
316 {OSPFv3STUBROUTERSUPPORT,
317 INTEGER,
318 RONLY,
319 ospfv3GeneralGroup,
320 3,
321 {1, 1, 22}},
322 {OSPFv3STUBROUTERADVERTISEMENT,
323 INTEGER,
324 RWRITE,
325 ospfv3GeneralGroup,
326 3,
327 {1, 1, 23}},
328 {OSPFv3DISCONTINUITYTIME,
329 TIMETICKS,
330 RONLY,
331 ospfv3GeneralGroup,
332 3,
333 {1, 1, 24}},
334 {OSPFv3RESTARTTIME,
335 TIMETICKS,
336 RONLY,
337 ospfv3GeneralGroup,
338 3,
339 {1, 1, 25}},
340
341 /* OSPFv3 Area Data Structure */
342 {OSPFv3IMPORTASEXTERN,
343 INTEGER,
344 RWRITE,
345 ospfv3AreaEntry,
346 4,
347 {1, 2, 1, 2}},
348 {OSPFv3AREASPFRUNS, COUNTER, RONLY, ospfv3AreaEntry, 4, {1, 2, 1, 3}},
349 {OSPFv3AREABDRRTRCOUNT, GAUGE, RONLY, ospfv3AreaEntry, 4, {1, 2, 1, 4}},
350 {OSPFv3AREAASBDRRTRCOUNT,
351 GAUGE,
352 RONLY,
353 ospfv3AreaEntry,
354 4,
355 {1, 2, 1, 5}},
356 {OSPFv3AREASCOPELSACOUNT,
357 GAUGE,
358 RONLY,
359 ospfv3AreaEntry,
360 4,
361 {1, 2, 1, 6}},
362 {OSPFv3AREASCOPELSACKSUMSUM,
363 UNSIGNED,
364 RONLY,
365 ospfv3AreaEntry,
366 4,
367 {1, 2, 1, 7}},
368 {OSPFv3AREASUMMARY, INTEGER, RWRITE, ospfv3AreaEntry, 4, {1, 2, 1, 8}},
369 {OSPFv3AREAROWSTATUS,
370 INTEGER,
371 RWRITE,
372 ospfv3AreaEntry,
373 4,
374 {1, 2, 1, 9}},
375 {OSPFv3AREASTUBMETRIC,
376 INTEGER,
377 RWRITE,
378 ospfv3AreaEntry,
379 4,
380 {1, 2, 1, 10}},
381 {OSPFv3AREANSSATRANSLATORROLE,
382 INTEGER,
383 RWRITE,
384 ospfv3AreaEntry,
385 4,
386 {1, 2, 1, 11}},
387 {OSPFv3AREANSSATRANSLATORSTATE,
388 INTEGER,
389 RONLY,
390 ospfv3AreaEntry,
391 4,
392 {1, 2, 1, 12}},
393 {OSPFv3AREANSSATRANSLATORSTABINTERVAL,
394 UNSIGNED,
395 RWRITE,
396 ospfv3AreaEntry,
397 4,
398 {1, 2, 1, 13}},
399 {OSPFv3AREANSSATRANSLATOREVENTS,
400 COUNTER,
401 RONLY,
402 ospfv3AreaEntry,
403 4,
404 {1, 2, 1, 14}},
405 {OSPFv3AREASTUBMETRICTYPE,
406 INTEGER,
407 RWRITE,
408 ospfv3AreaEntry,
409 4,
410 {1, 2, 1, 15}},
411 {OSPFv3AREATEENABLED,
412 INTEGER,
413 RWRITE,
414 ospfv3AreaEntry,
415 4,
416 {1, 2, 1, 16}},
417
418 /* OSPFv3 AS LSDB */
419 {OSPFv3WWLSDBSEQUENCE | OSPFv3WWASTABLE,
420 INTEGER,
421 RONLY,
422 ospfv3WwLsdbEntry,
423 4,
424 {1, 3, 1, 4}},
425 {OSPFv3WWLSDBAGE | OSPFv3WWASTABLE,
426 UNSIGNED,
427 RONLY,
428 ospfv3WwLsdbEntry,
429 4,
430 {1, 3, 1, 5}},
431 {OSPFv3WWLSDBCHECKSUM | OSPFv3WWASTABLE,
432 INTEGER,
433 RONLY,
434 ospfv3WwLsdbEntry,
435 4,
436 {1, 3, 1, 6}},
437 {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWASTABLE,
438 STRING,
439 RONLY,
440 ospfv3WwLsdbEntry,
441 4,
442 {1, 3, 1, 7}},
443 {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWASTABLE,
444 INTEGER,
445 RONLY,
446 ospfv3WwLsdbEntry,
447 4,
448 {1, 3, 1, 8}},
449
450 /* OSPFv3 Area LSDB */
451 {OSPFv3WWLSDBSEQUENCE | OSPFv3WWAREATABLE,
452 INTEGER,
453 RONLY,
454 ospfv3WwLsdbEntry,
455 4,
456 {1, 4, 1, 5}},
457 {OSPFv3WWLSDBAGE | OSPFv3WWAREATABLE,
458 UNSIGNED,
459 RONLY,
460 ospfv3WwLsdbEntry,
461 4,
462 {1, 4, 1, 6}},
463 {OSPFv3WWLSDBCHECKSUM | OSPFv3WWAREATABLE,
464 INTEGER,
465 RONLY,
466 ospfv3WwLsdbEntry,
467 4,
468 {1, 4, 1, 7}},
469 {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWAREATABLE,
470 STRING,
471 RONLY,
472 ospfv3WwLsdbEntry,
473 4,
474 {1, 4, 1, 8}},
475 {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWAREATABLE,
476 INTEGER,
477 RONLY,
478 ospfv3WwLsdbEntry,
479 4,
480 {1, 4, 1, 9}},
481
482 /* OSPFv3 Link LSDB */
483 {OSPFv3WWLSDBSEQUENCE | OSPFv3WWLINKTABLE,
484 INTEGER,
485 RONLY,
486 ospfv3WwLsdbEntry,
487 4,
488 {1, 5, 1, 6}},
489 {OSPFv3WWLSDBAGE | OSPFv3WWLINKTABLE,
490 UNSIGNED,
491 RONLY,
492 ospfv3WwLsdbEntry,
493 4,
494 {1, 5, 1, 7}},
495 {OSPFv3WWLSDBCHECKSUM | OSPFv3WWLINKTABLE,
496 INTEGER,
497 RONLY,
498 ospfv3WwLsdbEntry,
499 4,
500 {1, 5, 1, 8}},
501 {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWLINKTABLE,
502 STRING,
503 RONLY,
504 ospfv3WwLsdbEntry,
505 4,
506 {1, 5, 1, 9}},
507 {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWLINKTABLE,
508 INTEGER,
509 RONLY,
510 ospfv3WwLsdbEntry,
511 4,
512 {1, 5, 1, 10}},
513
514 /* OSPFv3 interfaces */
515 {OSPFv3IFAREAID, UNSIGNED, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 3}},
516 {OSPFv3IFTYPE, INTEGER, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 4}},
517 {OSPFv3IFADMINSTATUS, INTEGER, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 5}},
518 {OSPFv3IFRTRPRIORITY, INTEGER, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 6}},
519 {OSPFv3IFTRANSITDELAY, UNSIGNED, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 7}},
520 {OSPFv3IFRETRANSINTERVAL,
521 UNSIGNED,
522 RONLY,
523 ospfv3IfEntry,
524 4,
525 {1, 7, 1, 8}},
526 {OSPFv3IFHELLOINTERVAL, INTEGER, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 9}},
527 {OSPFv3IFRTRDEADINTERVAL,
528 UNSIGNED,
529 RONLY,
530 ospfv3IfEntry,
531 4,
532 {1, 7, 1, 10}},
533 {OSPFv3IFPOLLINTERVAL,
534 UNSIGNED,
535 RONLY,
536 ospfv3IfEntry,
537 4,
538 {1, 7, 1, 11}},
539 {OSPFv3IFSTATE, INTEGER, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 12}},
540 {OSPFv3IFDESIGNATEDROUTER,
541 UNSIGNED,
542 RONLY,
543 ospfv3IfEntry,
544 4,
545 {1, 7, 1, 13}},
546 {OSPFv3IFBACKUPDESIGNATEDROUTER,
547 UNSIGNED,
548 RONLY,
549 ospfv3IfEntry,
550 4,
551 {1, 7, 1, 14}},
552 {OSPFv3IFEVENTS, COUNTER, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 15}},
553 {OSPFv3IFROWSTATUS, INTEGER, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 16}},
554 {OSPFv3IFDEMAND, INTEGER, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 17}},
555 {OSPFv3IFMETRICVALUE, INTEGER, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 18}},
556 {OSPFv3IFLINKSCOPELSACOUNT,
557 GAUGE,
558 RONLY,
559 ospfv3IfEntry,
560 4,
561 {1, 7, 1, 19}},
562 {OSPFv3IFLINKLSACKSUMSUM,
563 UNSIGNED,
564 RONLY,
565 ospfv3IfEntry,
566 4,
567 {1, 7, 1, 20}},
568 {OSPFv3IFDEMANDNBRPROBE,
569 INTEGER,
570 RONLY,
571 ospfv3IfEntry,
572 4,
573 {1, 7, 1, 21}},
574 {OSPFv3IFDEMANDNBRPROBERETRANSLIMIT,
575 UNSIGNED,
576 RONLY,
577 ospfv3IfEntry,
578 4,
579 {1, 7, 1, 22}},
580 {OSPFv3IFDEMANDNBRPROBEINTERVAL,
581 UNSIGNED,
582 RONLY,
583 ospfv3IfEntry,
584 4,
585 {1, 7, 1, 23}},
586 {OSPFv3IFTEDISABLED, INTEGER, RONLY, ospfv3IfEntry, 4, {1, 7, 1, 24}},
587 {OSPFv3IFLINKLSASUPPRESSION,
588 INTEGER,
589 RONLY,
590 ospfv3IfEntry,
591 4,
592 {1, 7, 1, 25}},
593
594 /* OSPFv3 neighbors */
595 {OSPFv3NBRADDRESSTYPE, INTEGER, RONLY, ospfv3NbrEntry, 4, {1, 9, 1, 4}},
596 {OSPFv3NBRADDRESS, STRING, RONLY, ospfv3NbrEntry, 4, {1, 9, 1, 5}},
597 {OSPFv3NBROPTIONS, INTEGER, RONLY, ospfv3NbrEntry, 4, {1, 9, 1, 6}},
598 {OSPFv3NBRPRIORITY, INTEGER, RONLY, ospfv3NbrEntry, 4, {1, 9, 1, 7}},
599 {OSPFv3NBRSTATE, INTEGER, RONLY, ospfv3NbrEntry, 4, {1, 9, 1, 8}},
600 {OSPFv3NBREVENTS, COUNTER, RONLY, ospfv3NbrEntry, 4, {1, 9, 1, 9}},
601 {OSPFv3NBRLSRETRANSQLEN,
602 GAUGE,
603 RONLY,
604 ospfv3NbrEntry,
605 4,
606 {1, 9, 1, 10}},
607 {OSPFv3NBRHELLOSUPPRESSED,
608 INTEGER,
609 RONLY,
610 ospfv3NbrEntry,
611 4,
612 {1, 9, 1, 11}},
613 {OSPFv3NBRIFID, INTEGER, RONLY, ospfv3NbrEntry, 4, {1, 9, 1, 12}},
614 {OSPFv3NBRRESTARTHELPERSTATUS,
615 INTEGER,
616 RONLY,
617 ospfv3NbrEntry,
618 4,
619 {1, 9, 1, 13}},
620 {OSPFv3NBRRESTARTHELPERAGE,
621 UNSIGNED,
622 RONLY,
623 ospfv3NbrEntry,
624 4,
625 {1, 9, 1, 14}},
626 {OSPFv3NBRRESTARTHELPEREXITREASON,
627 INTEGER,
628 RONLY,
629 ospfv3NbrEntry,
630 4,
631 {1, 9, 1, 15}},
ef1bbf5c 632};
633
d7c0a89a
QY
634static uint8_t *ospfv3GeneralGroup(struct variable *v, oid *name,
635 size_t *length, int exact, size_t *var_len,
636 WriteMethod **write_method)
ef1bbf5c 637{
d7c0a89a
QY
638 uint16_t sum;
639 uint32_t count;
d62a17ae 640 struct ospf6_lsa *lsa = NULL;
641
642 /* Check whether the instance identifier is valid */
643 if (smux_header_generic(v, name, length, exact, var_len, write_method)
644 == MATCH_FAILED)
645 return NULL;
646
647 /* Return the current value of the variable */
648 switch (v->magic) {
649 case OSPFv3ROUTERID:
650 /* Router-ID of this OSPF instance. */
651 if (ospf6)
652 return SNMP_INTEGER(ntohl(ospf6->router_id));
653 return SNMP_INTEGER(0);
654 case OSPFv3ADMINSTAT:
655 if (ospf6)
656 return SNMP_INTEGER(
657 CHECK_FLAG(ospf6->flag, OSPF6_DISABLED)
658 ? OSPF_STATUS_DISABLED
659 : OSPF_STATUS_ENABLED);
660 return SNMP_INTEGER(OSPF_STATUS_DISABLED);
661 case OSPFv3VERSIONNUMBER:
662 return SNMP_INTEGER(3);
663 case OSPFv3AREABDRRTRSTATUS:
664 if (ospf6)
665 return SNMP_INTEGER(ospf6_is_router_abr(ospf6)
666 ? SNMP_TRUE
667 : SNMP_FALSE);
668 return SNMP_INTEGER(SNMP_FALSE);
669 case OSPFv3ASBDRRTRSTATUS:
670 if (ospf6)
671 return SNMP_INTEGER(ospf6_asbr_is_asbr(ospf6)
672 ? SNMP_TRUE
673 : SNMP_FALSE);
674 return SNMP_INTEGER(SNMP_FALSE);
675 case OSPFv3ASSCOPELSACOUNT:
676 if (ospf6)
677 return SNMP_INTEGER(ospf6->lsdb->count);
678 return SNMP_INTEGER(0);
679 case OSPFv3ASSCOPELSACHECKSUMSUM:
680 if (ospf6) {
681 sum = 0;
682 for (ALL_LSDB(ospf6->lsdb, lsa))
683 sum += ntohs(lsa->header->checksum);
684 return SNMP_INTEGER(sum);
685 }
686 return SNMP_INTEGER(0);
687 case OSPFv3ORIGINATENEWLSAS:
688 return SNMP_INTEGER(
689 0); /* Don't know where to get this value... */
690 case OSPFv3RXNEWLSAS:
691 return SNMP_INTEGER(
692 0); /* Don't know where to get this value... */
693 case OSPFv3EXTLSACOUNT:
694 if (ospf6) {
695 count = 0;
696 for (ALL_LSDB_TYPED(ospf6->lsdb,
697 htons(OSPF6_LSTYPE_AS_EXTERNAL),
698 lsa))
699 count += 1;
700 return SNMP_INTEGER(count);
701 }
702 return SNMP_INTEGER(0);
703 case OSPFv3EXTAREALSDBLIMIT:
704 return SNMP_INTEGER(-1);
705 case OSPFv3EXITOVERFLOWINTERVAL:
706 return SNMP_INTEGER(0); /* Not supported */
707 case OSPFv3DEMANDEXTENSIONS:
708 return SNMP_INTEGER(0); /* Not supported */
709 case OSPFv3REFERENCEBANDWIDTH:
710 if (ospf6)
711 return SNMP_INTEGER(ospf6->ref_bandwidth);
712 /* Otherwise, like for "not implemented". */
713 /* fallthru */
714 case OSPFv3RESTARTSUPPORT:
715 case OSPFv3RESTARTINTERVAL:
716 case OSPFv3RESTARTSTRICTLSACHECKING:
717 case OSPFv3RESTARTSTATUS:
718 case OSPFv3RESTARTAGE:
719 case OSPFv3RESTARTEXITREASON:
720 case OSPFv3NOTIFICATIONENABLE:
721 case OSPFv3STUBROUTERSUPPORT:
722 case OSPFv3STUBROUTERADVERTISEMENT:
723 case OSPFv3DISCONTINUITYTIME:
724 case OSPFv3RESTARTTIME:
725 /* TODO: Not implemented */
726 return NULL;
727 }
728 return NULL;
ef1bbf5c 729}
730
d7c0a89a
QY
731static uint8_t *ospfv3AreaEntry(struct variable *v, oid *name, size_t *length,
732 int exact, size_t *var_len,
733 WriteMethod **write_method)
ef1bbf5c 734{
d62a17ae 735 struct ospf6_area *oa, *area = NULL;
736 struct ospf6_lsa *lsa = NULL;
d7c0a89a
QY
737 uint32_t area_id = 0;
738 uint32_t count;
739 uint16_t sum;
d62a17ae 740 struct listnode *node;
741 unsigned int len;
742 char a[16];
743 struct ospf6_route *ro;
744
745 if (ospf6 == NULL)
746 return NULL;
747
748 if (smux_header_table(v, name, length, exact, var_len, write_method)
749 == MATCH_FAILED)
750 return NULL;
751
752 len = *length - v->namelen;
753 len = (len >= 1 ? 1 : 0);
754 if (exact && len != 1)
755 return NULL;
756 if (len)
757 area_id = htonl(name[v->namelen]);
758
759 inet_ntop(AF_INET, &area_id, a, sizeof(a));
760 zlog_debug("SNMP access by area: %s, exact=%d len=%d length=%lu", a,
d7c0a89a 761 exact, len, (unsigned long)*length);
d62a17ae 762
763 for (ALL_LIST_ELEMENTS_RO(ospf6->area_list, node, oa)) {
764 if (area == NULL) {
765 if (len == 0) /* return first area entry */
766 area = oa;
767 else if (exact && ntohl(oa->area_id) == ntohl(area_id))
768 area = oa;
769 else if (ntohl(oa->area_id) > ntohl(area_id))
770 area = oa;
771 }
772 }
773
774 if (area == NULL)
775 return NULL;
776
777 *length = v->namelen + 1;
778 name[v->namelen] = ntohl(area->area_id);
779
780 inet_ntop(AF_INET, &area->area_id, a, sizeof(a));
781 zlog_debug("SNMP found area: %s, exact=%d len=%d length=%lu", a, exact,
d7c0a89a 782 len, (unsigned long)*length);
d62a17ae 783
784 switch (v->magic) {
785 case OSPFv3IMPORTASEXTERN:
786 /* No NSSA support */
787 return SNMP_INTEGER(IS_AREA_STUB(area) ? 2 : 1);
788 case OSPFv3AREASPFRUNS:
789 return SNMP_INTEGER(area->spf_calculation);
790 case OSPFv3AREABDRRTRCOUNT:
791 case OSPFv3AREAASBDRRTRCOUNT:
792 count = 0;
793 for (ro = ospf6_route_head(ospf6->brouter_table); ro;
794 ro = ospf6_route_next(ro)) {
795 if (ntohl(ro->path.area_id) != ntohl(area->area_id))
796 continue;
797 if (v->magic == OSPFv3AREABDRRTRCOUNT
798 && CHECK_FLAG(ro->path.router_bits,
799 OSPF6_ROUTER_BIT_B))
800 count++;
801 if (v->magic == OSPFv3AREAASBDRRTRCOUNT
802 && CHECK_FLAG(ro->path.router_bits,
803 OSPF6_ROUTER_BIT_E))
804 count++;
805 }
806 return SNMP_INTEGER(count);
807 case OSPFv3AREASCOPELSACOUNT:
808 return SNMP_INTEGER(area->lsdb->count);
809 case OSPFv3AREASCOPELSACKSUMSUM:
810 sum = 0;
811 for (ALL_LSDB(area->lsdb, lsa))
812 sum += ntohs(lsa->header->checksum);
813 return SNMP_INTEGER(sum);
814 case OSPFv3AREASUMMARY:
815 return SNMP_INTEGER(2); /* sendAreaSummary */
816 case OSPFv3AREAROWSTATUS:
817 return SNMP_INTEGER(1); /* Active */
818 case OSPFv3AREASTUBMETRIC:
819 case OSPFv3AREANSSATRANSLATORROLE:
820 case OSPFv3AREANSSATRANSLATORSTATE:
821 case OSPFv3AREANSSATRANSLATORSTABINTERVAL:
822 case OSPFv3AREANSSATRANSLATOREVENTS:
823 case OSPFv3AREASTUBMETRICTYPE:
824 case OSPFv3AREATEENABLED:
825 /* Not implemented. */
826 return NULL;
827 }
828 return NULL;
ef1bbf5c 829}
830
d62a17ae 831static int if_icmp_func(struct interface *ifp1, struct interface *ifp2)
c349bb86 832{
d62a17ae 833 return (ifp1->ifindex - ifp2->ifindex);
c349bb86
VB
834}
835
d7c0a89a
QY
836static uint8_t *ospfv3WwLsdbEntry(struct variable *v, oid *name, size_t *length,
837 int exact, size_t *var_len,
838 WriteMethod **write_method)
2680aa2b 839{
c5d28568 840 struct vrf *vrf;
d62a17ae 841 struct ospf6_lsa *lsa = NULL;
842 ifindex_t ifindex;
843 uint32_t area_id, id, instid, adv_router;
d7c0a89a 844 uint16_t type;
d62a17ae 845 int len;
846 oid *offset;
847 int offsetlen;
848 struct ospf6_area *oa = NULL;
849 struct listnode *node;
850 struct interface *iif;
851 struct ospf6_interface *oi = NULL;
852 struct list *ifslist;
853
854 if (smux_header_table(v, name, length, exact, var_len, write_method)
855 == MATCH_FAILED)
856 return NULL;
857
858 instid = ifindex = area_id = type = id = adv_router = 0;
859
860 /* Check OSPFv3 instance. */
861 if (ospf6 == NULL)
862 return NULL;
863
c5d28568 864 vrf = vrf_lookup_by_id(ospf6->vrf_id);
d62a17ae 865 /* Get variable length. */
866 offset = name + v->namelen;
867 offsetlen = *length - v->namelen;
868
869 if (exact && (v->magic & OSPFv3WWASTABLE) && offsetlen != 3)
870 return NULL;
871 if (exact && (v->magic & OSPFv3WWAREATABLE) && offsetlen != 4)
872 return NULL;
873 if (exact && (v->magic & OSPFv3WWLINKTABLE) && offsetlen != 5)
874 return NULL;
875
876 if (v->magic & OSPFv3WWLINKTABLE) {
877 /* Parse ifindex */
878 len = (offsetlen < 1 ? 0 : 1);
879 if (len)
880 ifindex = *offset;
881 offset += len;
882 offsetlen -= len;
883
884 /* Parse instance ID */
885 len = (offsetlen < 1 ? 0 : 1);
886 if (len)
887 instid = *offset;
888 offset += len;
889 offsetlen -= len;
890 } else if (v->magic & OSPFv3WWAREATABLE) {
891 /* Parse area-id */
892 len = (offsetlen < 1 ? 0 : 1);
893 if (len)
894 area_id = htonl(*offset);
895 offset += len;
896 offsetlen -= len;
c349bb86 897 }
d62a17ae 898
899 /* Parse type */
900 len = (offsetlen < 1 ? 0 : 1);
901 if (len)
902 type = htons(*offset);
903 offset += len;
904 offsetlen -= len;
905
906 /* Parse Router-ID */
907 len = (offsetlen < 1 ? 0 : 1);
908 if (len)
909 adv_router = htonl(*offset);
910 offset += len;
911 offsetlen -= len;
912
913 /* Parse LS-ID */
914 len = (offsetlen < 1 ? 0 : 1);
915 if (len)
916 id = htonl(*offset);
917 offset += len;
996c9314 918 // offsetlen -= len; // Add back in if we need it again
d62a17ae 919
920 if (exact) {
921 if (v->magic & OSPFv3WWASTABLE) {
922 lsa = ospf6_lsdb_lookup(type, id, adv_router,
923 ospf6->lsdb);
924 } else if (v->magic & OSPFv3WWAREATABLE) {
925 oa = ospf6_area_lookup(area_id, ospf6);
926 if (!oa)
927 return NULL;
928 lsa = ospf6_lsdb_lookup(type, id, adv_router, oa->lsdb);
929 } else if (v->magic & OSPFv3WWLINKTABLE) {
c5d28568
K
930 oi = ospf6_interface_lookup_by_ifindex(ifindex,
931 ospf6->vrf_id);
d62a17ae 932 if (!oi || oi->instance_id != instid)
933 return NULL;
934 lsa = ospf6_lsdb_lookup(type, id, adv_router, oi->lsdb);
935 }
936 } else {
937 if (v->magic & OSPFv3WWASTABLE) {
938 if (ospf6->lsdb->count)
939 lsa = ospf6_lsdb_lookup_next(
940 type, id, adv_router, ospf6->lsdb);
941 } else if (v->magic & OSPFv3WWAREATABLE)
942 for (ALL_LIST_ELEMENTS_RO(ospf6->area_list, node, oa)) {
943 if (oa->area_id < area_id)
944 continue;
945
946 if (oa->lsdb->count)
947 lsa = ospf6_lsdb_lookup_next(
948 type, id, adv_router, oa->lsdb);
949 if (lsa)
950 break;
951 type = 0;
952 id = 0;
953 adv_router = 0;
954 }
955 else if (v->magic & OSPFv3WWLINKTABLE) {
956 /* We build a sorted list of interfaces */
957 ifslist = list_new();
958 if (!ifslist)
959 return NULL;
960 ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
451fda4f 961 FOR_ALL_INTERFACES (vrf, iif)
d62a17ae 962 listnode_add_sort(ifslist, iif);
963
964 for (ALL_LIST_ELEMENTS_RO(ifslist, node, iif)) {
965 if (!iif->ifindex)
966 continue;
967 oi = ospf6_interface_lookup_by_ifindex(
c5d28568 968 iif->ifindex, iif->vrf_id);
d62a17ae 969 if (!oi)
970 continue;
971 if (iif->ifindex < ifindex)
972 continue;
973 if (oi->instance_id < instid)
974 continue;
975
976 if (oi->lsdb->count)
977 lsa = ospf6_lsdb_lookup_next(
978 type, id, adv_router, oi->lsdb);
979 if (lsa)
980 break;
981 type = 0;
982 id = 0;
983 adv_router = 0;
984 oi = NULL;
985 }
986
987 list_delete_all_node(ifslist);
988 }
989 }
990
991 if (!lsa)
992 return NULL;
993
994 /* Add indexes */
995 if (v->magic & OSPFv3WWASTABLE) {
996 *length = v->namelen + 3;
997 offset = name + v->namelen;
998 } else if (v->magic & OSPFv3WWAREATABLE) {
999 *length = v->namelen + 4;
1000 offset = name + v->namelen;
1001 *offset = ntohl(oa->area_id);
1002 offset++;
1003 } else if (v->magic & OSPFv3WWLINKTABLE) {
1004 *length = v->namelen + 5;
1005 offset = name + v->namelen;
1006 *offset = oi->interface->ifindex;
1007 offset++;
1008 *offset = oi->instance_id;
1009 offset++;
1010 }
1011 *offset = ntohs(lsa->header->type);
1012 offset++;
1013 *offset = ntohl(lsa->header->adv_router);
1014 offset++;
1015 *offset = ntohl(lsa->header->id);
1016 offset++;
1017
1018 /* Return the current value of the variable */
1019 switch (v->magic & OSPFv3WWCOLUMN) {
1020 case OSPFv3WWLSDBSEQUENCE:
1021 return SNMP_INTEGER(ntohl(lsa->header->seqnum));
d62a17ae 1022 case OSPFv3WWLSDBAGE:
1023 ospf6_lsa_age_current(lsa);
1024 return SNMP_INTEGER(ntohs(lsa->header->age));
d62a17ae 1025 case OSPFv3WWLSDBCHECKSUM:
1026 return SNMP_INTEGER(ntohs(lsa->header->checksum));
d62a17ae 1027 case OSPFv3WWLSDBADVERTISEMENT:
1028 *var_len = ntohs(lsa->header->length);
d7c0a89a 1029 return (uint8_t *)lsa->header;
d62a17ae 1030 case OSPFv3WWLSDBTYPEKNOWN:
1031 return SNMP_INTEGER(OSPF6_LSA_IS_KNOWN(lsa->header->type)
1032 ? SNMP_TRUE
1033 : SNMP_FALSE);
1034 break;
1035 }
1036 return NULL;
2680aa2b 1037}
1038
d7c0a89a
QY
1039static uint8_t *ospfv3IfEntry(struct variable *v, oid *name, size_t *length,
1040 int exact, size_t *var_len,
1041 WriteMethod **write_method)
3bc4f84e 1042{
c5d28568 1043 struct vrf *vrf;
d62a17ae 1044 ifindex_t ifindex = 0;
1045 unsigned int instid = 0;
1046 struct ospf6_interface *oi = NULL;
1047 struct ospf6_lsa *lsa = NULL;
1048 struct interface *iif;
1049 struct listnode *i;
1050 struct list *ifslist;
1051 oid *offset;
1052 int offsetlen, len;
d7c0a89a 1053 uint32_t sum;
d62a17ae 1054
1055 if (smux_header_table(v, name, length, exact, var_len, write_method)
1056 == MATCH_FAILED)
1057 return NULL;
1058
1059 /* Check OSPFv3 instance. */
1060 if (ospf6 == NULL)
1061 return NULL;
1062
c5d28568 1063 vrf = vrf_lookup_by_id(ospf6->vrf_id);
d62a17ae 1064 /* Get variable length. */
1065 offset = name + v->namelen;
1066 offsetlen = *length - v->namelen;
1067
1068 if (exact && offsetlen != 2)
1069 return NULL;
1070
1071 /* Parse if index */
1072 len = (offsetlen < 1 ? 0 : 1);
1073 if (len)
1074 ifindex = *offset;
1075 offset += len;
1076 offsetlen -= len;
1077
1078 /* Parse instance ID */
1079 len = (offsetlen < 1 ? 0 : 1);
1080 if (len)
1081 instid = *offset;
996c9314
LB
1082 // offset += len; // Add back in if we ever start using again
1083 // offsetlen -= len;
d62a17ae 1084
1085 if (exact) {
c5d28568 1086 oi = ospf6_interface_lookup_by_ifindex(ifindex, ospf6->vrf_id);
d62a17ae 1087 if (!oi || oi->instance_id != instid)
1088 return NULL;
1089 } else {
1090 /* We build a sorted list of interfaces */
1091 ifslist = list_new();
1092 if (!ifslist)
1093 return NULL;
1094 ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
451fda4f 1095 FOR_ALL_INTERFACES (vrf, iif)
d62a17ae 1096 listnode_add_sort(ifslist, iif);
1097
1098 for (ALL_LIST_ELEMENTS_RO(ifslist, i, iif)) {
1099 if (!iif->ifindex)
1100 continue;
c5d28568
K
1101 oi = ospf6_interface_lookup_by_ifindex(iif->ifindex,
1102 iif->vrf_id);
d62a17ae 1103 if (!oi)
1104 continue;
1105 if (iif->ifindex > ifindex
1106 || (iif->ifindex == ifindex
1107 && (oi->instance_id > instid)))
1108 break;
1109 oi = NULL;
1110 }
1111
1112 list_delete_all_node(ifslist);
1113 }
1114
1115 if (!oi)
1116 return NULL;
1117
1118 /* Add Index (IfIndex, IfInstId) */
1119 *length = v->namelen + 2;
1120 offset = name + v->namelen;
1121 *offset = oi->interface->ifindex;
1122 offset++;
1123 *offset = oi->instance_id;
1124 offset++;
1125
1126 /* Return the current value of the variable */
1127 switch (v->magic) {
1128 case OSPFv3IFAREAID:
1129 if (oi->area)
1130 return SNMP_INTEGER(ntohl(oi->area->area_id));
1131 break;
1132 case OSPFv3IFTYPE:
e5973353 1133 if (oi->type == OSPF_IFTYPE_BROADCAST)
d62a17ae 1134 return SNMP_INTEGER(1);
e5973353 1135 else if (oi->type == OSPF_IFTYPE_POINTOPOINT)
d62a17ae 1136 return SNMP_INTEGER(3);
1137 else
1138 break; /* Unknown, don't put anything */
1139 case OSPFv3IFADMINSTATUS:
1140 if (oi->area)
1141 return SNMP_INTEGER(OSPF_STATUS_ENABLED);
1142 return SNMP_INTEGER(OSPF_STATUS_DISABLED);
1143 case OSPFv3IFRTRPRIORITY:
1144 return SNMP_INTEGER(oi->priority);
1145 case OSPFv3IFTRANSITDELAY:
1146 return SNMP_INTEGER(oi->transdelay);
1147 case OSPFv3IFRETRANSINTERVAL:
1148 return SNMP_INTEGER(oi->rxmt_interval);
1149 case OSPFv3IFHELLOINTERVAL:
1150 return SNMP_INTEGER(oi->hello_interval);
1151 case OSPFv3IFRTRDEADINTERVAL:
1152 return SNMP_INTEGER(oi->dead_interval);
1153 case OSPFv3IFPOLLINTERVAL:
1154 /* No support for NBMA */
1155 break;
1156 case OSPFv3IFSTATE:
1157 return SNMP_INTEGER(oi->state);
1158 case OSPFv3IFDESIGNATEDROUTER:
1159 return SNMP_INTEGER(ntohl(oi->drouter));
1160 case OSPFv3IFBACKUPDESIGNATEDROUTER:
1161 return SNMP_INTEGER(ntohl(oi->bdrouter));
1162 case OSPFv3IFEVENTS:
1163 return SNMP_INTEGER(oi->state_change);
1164 case OSPFv3IFROWSTATUS:
1165 return SNMP_INTEGER(1);
1166 case OSPFv3IFDEMAND:
1167 return SNMP_INTEGER(SNMP_FALSE);
1168 case OSPFv3IFMETRICVALUE:
1169 return SNMP_INTEGER(oi->cost);
1170 case OSPFv3IFLINKSCOPELSACOUNT:
1171 return SNMP_INTEGER(oi->lsdb->count);
1172 case OSPFv3IFLINKLSACKSUMSUM:
1173 sum = 0;
1174 for (ALL_LSDB(oi->lsdb, lsa))
1175 sum += ntohs(lsa->header->checksum);
1176 return SNMP_INTEGER(sum);
1177 case OSPFv3IFDEMANDNBRPROBE:
1178 case OSPFv3IFDEMANDNBRPROBERETRANSLIMIT:
1179 case OSPFv3IFDEMANDNBRPROBEINTERVAL:
1180 case OSPFv3IFTEDISABLED:
1181 case OSPFv3IFLINKLSASUPPRESSION:
1182 /* Not implemented. Only works if all the last ones are not
1183 implemented! */
1184 return NULL;
1185 }
1186
1187 /* Try an internal getnext. Some columns are missing in this table. */
1188 if (!exact && (name[*length - 1] < MAX_SUBID))
1189 return ospfv3IfEntry(v, name, length, exact, var_len,
1190 write_method);
1191 return NULL;
3bc4f84e
VB
1192}
1193
d7c0a89a
QY
1194static uint8_t *ospfv3NbrEntry(struct variable *v, oid *name, size_t *length,
1195 int exact, size_t *var_len,
1196 WriteMethod **write_method)
061bc735 1197{
c5d28568 1198 struct vrf *vrf;
d62a17ae 1199 ifindex_t ifindex = 0;
1200 unsigned int instid, rtrid;
1201 struct ospf6_interface *oi = NULL;
1202 struct ospf6_neighbor *on = NULL;
1203 struct interface *iif;
1204 struct listnode *i, *j;
1205 struct list *ifslist;
1206 oid *offset;
1207 int offsetlen, len;
1208
1209 if (smux_header_table(v, name, length, exact, var_len, write_method)
1210 == MATCH_FAILED)
1211 return NULL;
1212
1213 instid = rtrid = 0;
1214
1215 /* Check OSPFv3 instance. */
1216 if (ospf6 == NULL)
1217 return NULL;
1218
c5d28568 1219 vrf = vrf_lookup_by_id(ospf6->vrf_id);
d62a17ae 1220 /* Get variable length. */
1221 offset = name + v->namelen;
1222 offsetlen = *length - v->namelen;
1223
1224 if (exact && offsetlen != 3)
1225 return NULL;
1226
1227 /* Parse if index */
1228 len = (offsetlen < 1 ? 0 : 1);
1229 if (len)
1230 ifindex = *offset;
1231 offset += len;
1232 offsetlen -= len;
1233
1234 /* Parse instance ID */
1235 len = (offsetlen < 1 ? 0 : 1);
1236 if (len)
1237 instid = *offset;
1238 offset += len;
1239 offsetlen -= len;
1240
1241 /* Parse router ID */
1242 len = (offsetlen < 1 ? 0 : 1);
1243 if (len)
1244 rtrid = htonl(*offset);
996c9314
LB
1245 // offset += len; // Add back in if we ever start looking at data
1246 // offsetlen -= len;
d62a17ae 1247
1248 if (exact) {
c5d28568 1249 oi = ospf6_interface_lookup_by_ifindex(ifindex, ospf6->vrf_id);
d62a17ae 1250 if (!oi || oi->instance_id != instid)
1251 return NULL;
1252 on = ospf6_neighbor_lookup(rtrid, oi);
1253 } else {
1254 /* We build a sorted list of interfaces */
1255 ifslist = list_new();
1256 if (!ifslist)
1257 return NULL;
1258 ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
451fda4f 1259 FOR_ALL_INTERFACES (vrf, iif)
d62a17ae 1260 listnode_add_sort(ifslist, iif);
1261
1262 for (ALL_LIST_ELEMENTS_RO(ifslist, i, iif)) {
1263 if (!iif->ifindex)
1264 continue;
c5d28568
K
1265 oi = ospf6_interface_lookup_by_ifindex(iif->ifindex,
1266 iif->vrf_id);
d62a17ae 1267 if (!oi)
1268 continue;
1269 for (ALL_LIST_ELEMENTS_RO(oi->neighbor_list, j, on)) {
1270 if (iif->ifindex > ifindex
1271 || (iif->ifindex == ifindex
1272 && (oi->instance_id > instid
1273 || (oi->instance_id == instid
1274 && ntohl(on->router_id)
1275 > ntohl(rtrid)))))
1276 break;
1277 }
1278 if (on)
1279 break;
1280 oi = NULL;
1281 on = NULL;
1282 }
1283
1284 list_delete_all_node(ifslist);
1285 }
1286
1287 if (!oi || !on)
1288 return NULL;
1289
1290 /* Add Index (IfIndex, IfInstId, RtrId) */
1291 *length = v->namelen + 3;
1292 offset = name + v->namelen;
1293 *offset = oi->interface->ifindex;
1294 offset++;
1295 *offset = oi->instance_id;
1296 offset++;
1297 *offset = ntohl(on->router_id);
1298 offset++;
1299
1300 /* Return the current value of the variable */
1301 switch (v->magic) {
1302 case OSPFv3NBRADDRESSTYPE:
1303 return SNMP_INTEGER(2); /* IPv6 only */
1304 case OSPFv3NBRADDRESS:
1305 *var_len = sizeof(struct in6_addr);
d7c0a89a 1306 return (uint8_t *)&on->linklocal_addr;
d62a17ae 1307 case OSPFv3NBROPTIONS:
1308 return SNMP_INTEGER(on->options[2]);
1309 case OSPFv3NBRPRIORITY:
1310 return SNMP_INTEGER(on->priority);
1311 case OSPFv3NBRSTATE:
1312 return SNMP_INTEGER(on->state);
1313 case OSPFv3NBREVENTS:
1314 return SNMP_INTEGER(on->state_change);
1315 case OSPFv3NBRLSRETRANSQLEN:
1316 return SNMP_INTEGER(on->retrans_list->count);
1317 case OSPFv3NBRHELLOSUPPRESSED:
1318 return SNMP_INTEGER(SNMP_FALSE);
1319 case OSPFv3NBRIFID:
1320 return SNMP_INTEGER(on->ifindex);
1321 case OSPFv3NBRRESTARTHELPERSTATUS:
1322 case OSPFv3NBRRESTARTHELPERAGE:
1323 case OSPFv3NBRRESTARTHELPEREXITREASON:
1324 /* Not implemented. Only works if all the last ones are not
1325 implemented! */
1326 return NULL;
1327 }
1328
1329 return NULL;
061bc735
VB
1330}
1331
bf836661
VB
1332/* OSPF Traps. */
1333#define NBRSTATECHANGE 2
1334#define IFSTATECHANGE 10
1335
d62a17ae 1336static struct trap_object ospf6NbrTrapList[] = {
1337 {-3, {1, 1, OSPFv3ROUTERID}},
1338 {4, {1, 9, 1, OSPFv3NBRADDRESSTYPE}},
1339 {4, {1, 9, 1, OSPFv3NBRADDRESS}},
1340 {4, {1, 9, 1, OSPFv3NBRSTATE}}};
bf836661 1341
d62a17ae 1342static struct trap_object ospf6IfTrapList[] = {
1343 {-3, {1, 1, OSPFv3ROUTERID}},
1344 {4, {1, 7, 1, OSPFv3IFSTATE}},
1345 {4, {1, 7, 1, OSPFv3IFADMINSTATUS}},
1346 {4, {1, 7, 1, OSPFv3IFAREAID}}};
bf836661 1347
d62a17ae 1348static int ospf6TrapNbrStateChange(struct ospf6_neighbor *on, int next_state,
1349 int prev_state)
bf836661 1350{
d62a17ae 1351 oid index[3];
1352
1353 /* Terminal state or regression */
1354 if ((next_state != OSPF6_NEIGHBOR_FULL)
1355 && (next_state != OSPF6_NEIGHBOR_TWOWAY)
1356 && (next_state >= prev_state))
1357 return 0;
1358
1359 index[0] = on->ospf6_if->interface->ifindex;
1360 index[1] = on->ospf6_if->instance_id;
1361 index[2] = ntohl(on->router_id);
1362
97b5d752
QY
1363 smux_trap(ospfv3_variables, array_size(ospfv3_variables),
1364 ospfv3_trap_oid, array_size(ospfv3_trap_oid), ospfv3_oid,
0d6f7fd6 1365 sizeof(ospfv3_oid) / sizeof(oid), index, 3, ospf6NbrTrapList,
97b5d752 1366 array_size(ospf6NbrTrapList), NBRSTATECHANGE);
d62a17ae 1367 return 0;
bf836661
VB
1368}
1369
d62a17ae 1370static int ospf6TrapIfStateChange(struct ospf6_interface *oi, int next_state,
1371 int prev_state)
bf836661 1372{
d62a17ae 1373 oid index[2];
1374
1375 /* Terminal state or regression */
1376 if ((next_state != OSPF6_INTERFACE_POINTTOPOINT)
1377 && (next_state != OSPF6_INTERFACE_DROTHER)
1378 && (next_state != OSPF6_INTERFACE_BDR)
1379 && (next_state != OSPF6_INTERFACE_DR) && (next_state >= prev_state))
1380 return 0;
1381
1382 index[0] = oi->interface->ifindex;
1383 index[1] = oi->instance_id;
1384
97b5d752
QY
1385 smux_trap(ospfv3_variables, array_size(ospfv3_variables),
1386 ospfv3_trap_oid, array_size(ospfv3_trap_oid), ospfv3_oid,
0d6f7fd6 1387 sizeof(ospfv3_oid) / sizeof(oid), index, 2, ospf6IfTrapList,
97b5d752 1388 array_size(ospf6IfTrapList), IFSTATECHANGE);
d62a17ae 1389 return 0;
bf836661
VB
1390}
1391
ef1bbf5c 1392/* Register OSPFv3-MIB. */
d62a17ae 1393static int ospf6_snmp_init(struct thread_master *master)
ef1bbf5c 1394{
d62a17ae 1395 smux_init(master);
1396 REGISTER_MIB("OSPFv3MIB", ospfv3_variables, variable, ospfv3_oid);
1397 return 0;
ef1bbf5c 1398}
1399
d62a17ae 1400static int ospf6_snmp_module_init(void)
5986b66b 1401{
d62a17ae 1402 hook_register(ospf6_interface_change, ospf6TrapIfStateChange);
1403 hook_register(ospf6_neighbor_change, ospf6TrapNbrStateChange);
1404 hook_register(frr_late_init, ospf6_snmp_init);
1405 return 0;
5986b66b 1406}
ef1bbf5c 1407
d62a17ae 1408FRR_MODULE_SETUP(.name = "ospf6d_snmp", .version = FRR_VERSION,
1409 .description = "ospf6d AgentX SNMP module",
1410 .init = ospf6_snmp_module_init, )