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.
24 #include <net-snmp/net-snmp-config.h>
25 #include <net-snmp/net-snmp-includes.h>
36 #include "ospf6_proto.h"
37 #include "ospf6_lsa.h"
38 #include "ospf6_lsdb.h"
39 #include "ospf6_route.h"
40 #include "ospf6_top.h"
41 #include "ospf6_area.h"
42 #include "ospf6_interface.h"
43 #include "ospf6_message.h"
44 #include "ospf6_neighbor.h"
45 #include "ospf6_abr.h"
46 #include "ospf6_asbr.h"
50 #define OSPFv3MIB 1,3,6,1,2,1,191
52 /* OSPFv3 MIB General Group values. */
53 #define OSPFv3ROUTERID 1
54 #define OSPFv3ADMINSTAT 2
55 #define OSPFv3VERSIONNUMBER 3
56 #define OSPFv3AREABDRRTRSTATUS 4
57 #define OSPFv3ASBDRRTRSTATUS 5
58 #define OSPFv3ASSCOPELSACOUNT 6
59 #define OSPFv3ASSCOPELSACHECKSUMSUM 7
60 #define OSPFv3ORIGINATENEWLSAS 8
61 #define OSPFv3RXNEWLSAS 9
62 #define OSPFv3EXTLSACOUNT 10
63 #define OSPFv3EXTAREALSDBLIMIT 11
64 #define OSPFv3EXITOVERFLOWINTERVAL 12
65 #define OSPFv3DEMANDEXTENSIONS 13
66 #define OSPFv3REFERENCEBANDWIDTH 14
67 #define OSPFv3RESTARTSUPPORT 15
68 #define OSPFv3RESTARTINTERVAL 16
69 #define OSPFv3RESTARTSTRICTLSACHECKING 17
70 #define OSPFv3RESTARTSTATUS 18
71 #define OSPFv3RESTARTAGE 19
72 #define OSPFv3RESTARTEXITREASON 20
73 #define OSPFv3NOTIFICATIONENABLE 21
74 #define OSPFv3STUBROUTERSUPPORT 22
75 #define OSPFv3STUBROUTERADVERTISEMENT 23
76 #define OSPFv3DISCONTINUITYTIME 24
77 #define OSPFv3RESTARTTIME 25
79 /* OSPFv3 MIB Area Table values: ospfv3AreaTable */
80 #define OSPFv3IMPORTASEXTERN 2
81 #define OSPFv3AREASPFRUNS 3
82 #define OSPFv3AREABDRRTRCOUNT 4
83 #define OSPFv3AREAASBDRRTRCOUNT 5
84 #define OSPFv3AREASCOPELSACOUNT 6
85 #define OSPFv3AREASCOPELSACKSUMSUM 7
86 #define OSPFv3AREASUMMARY 8
87 #define OSPFv3AREAROWSTATUS 9
88 #define OSPFv3AREASTUBMETRIC 10
89 #define OSPFv3AREANSSATRANSLATORROLE 11
90 #define OSPFv3AREANSSATRANSLATORSTATE 12
91 #define OSPFv3AREANSSATRANSLATORSTABINTERVAL 13
92 #define OSPFv3AREANSSATRANSLATOREVENTS 14
93 #define OSPFv3AREASTUBMETRICTYPE 15
94 #define OSPFv3AREATEENABLED 16
96 /* OSPFv3 MIB * Lsdb Table values: ospfv3*LsdbTable */
97 #define OSPFv3WWLSDBSEQUENCE 1
98 #define OSPFv3WWLSDBAGE 2
99 #define OSPFv3WWLSDBCHECKSUM 3
100 #define OSPFv3WWLSDBADVERTISEMENT 4
101 #define OSPFv3WWLSDBTYPEKNOWN 5
103 /* Three first bits are to identify column */
104 #define OSPFv3WWCOLUMN 0x7
105 /* Then we use other bits to identify table */
106 #define OSPFv3WWASTABLE (1 << 3)
107 #define OSPFv3WWAREATABLE (1 << 4)
108 #define OSPFv3WWLINKTABLE (1 << 5)
109 #define OSPFv3WWVIRTLINKTABLE (1 << 6)
111 /* OSPFv3 MIB Host Table values: ospfv3HostTable */
112 #define OSPFv3HOSTMETRIC 3
113 #define OSPFv3HOSTROWSTATUS 4
114 #define OSPFv3HOSTAREAID 5
116 /* OSPFv3 MIB Interface Table values: ospfv3IfTable */
117 #define OSPFv3IFAREAID 3
118 #define OSPFv3IFTYPE 4
119 #define OSPFv3IFADMINSTATUS 5
120 #define OSPFv3IFRTRPRIORITY 6
121 #define OSPFv3IFTRANSITDELAY 7
122 #define OSPFv3IFRETRANSINTERVAL 8
123 #define OSPFv3IFHELLOINTERVAL 9
124 #define OSPFv3IFRTRDEADINTERVAL 10
125 #define OSPFv3IFPOLLINTERVAL 11
126 #define OSPFv3IFSTATE 12
127 #define OSPFv3IFDESIGNATEDROUTER 13
128 #define OSPFv3IFBACKUPDESIGNATEDROUTER 14
129 #define OSPFv3IFEVENTS 15
130 #define OSPFv3IFROWSTATUS 16
131 #define OSPFv3IFDEMAND 17
132 #define OSPFv3IFMETRICVALUE 18
133 #define OSPFv3IFLINKSCOPELSACOUNT 19
134 #define OSPFv3IFLINKLSACKSUMSUM 20
135 #define OSPFv3IFDEMANDNBRPROBE 21
136 #define OSPFv3IFDEMANDNBRPROBERETRANSLIMIT 22
137 #define OSPFv3IFDEMANDNBRPROBEINTERVAL 23
138 #define OSPFv3IFTEDISABLED 24
139 #define OSPFv3IFLINKLSASUPPRESSION 25
141 /* OSPFv3 MIB Virtual Interface Table values: ospfv3VirtIfTable */
142 #define OSPFv3VIRTIFINDEX 3
143 #define OSPFv3VIRTIFINSTID 4
144 #define OSPFv3VIRTIFTRANSITDELAY 5
145 #define OSPFv3VIRTIFRETRANSINTERVAL 6
146 #define OSPFv3VIRTIFHELLOINTERVAL 7
147 #define OSPFv3VIRTIFRTRDEADINTERVAL 8
148 #define OSPFv3VIRTIFSTATE 9
149 #define OSPFv3VIRTIFEVENTS 10
150 #define OSPFv3VIRTIFROWSTATUS 11
151 #define OSPFv3VIRTIFLINKSCOPELSACOUNT 12
152 #define OSPFv3VIRTIFLINKLSACKSUMSUM 13
154 /* OSPFv3 MIB Neighbors Table values: ospfv3NbrTable */
155 #define OSPFv3NBRADDRESSTYPE 4
156 #define OSPFv3NBRADDRESS 5
157 #define OSPFv3NBROPTIONS 6
158 #define OSPFv3NBRPRIORITY 7
159 #define OSPFv3NBRSTATE 8
160 #define OSPFv3NBREVENTS 9
161 #define OSPFv3NBRLSRETRANSQLEN 10
162 #define OSPFv3NBRHELLOSUPPRESSED 11
163 #define OSPFv3NBRIFID 12
164 #define OSPFv3NBRRESTARTHELPERSTATUS 13
165 #define OSPFv3NBRRESTARTHELPERAGE 14
166 #define OSPFv3NBRRESTARTHELPEREXITREASON 15
168 /* OSPFv3 MIB Configured Neighbors Table values: ospfv3CfgNbrTable */
169 #define OSPFv3CFGNBRPRIORITY 5
170 #define OSPFv3CFGNBRROWSTATUS 6
172 /* OSPFv3 MIB Virtual Neighbors Table values: ospfv3VirtNbrTable */
173 #define OSPFv3VIRTNBRIFINDEX 3
174 #define OSPFv3VIRTNBRIFINSTID 4
175 #define OSPFv3VIRTNBRADDRESSTYPE 5
176 #define OSPFv3VIRTNBRADDRESS 6
177 #define OSPFv3VIRTNBROPTIONS 7
178 #define OSPFv3VIRTNBRSTATE 8
179 #define OSPFv3VIRTNBREVENTS 9
180 #define OSPFv3VIRTNBRLSRETRANSQLEN 10
181 #define OSPFv3VIRTNBRHELLOSUPPRESSED 11
182 #define OSPFv3VIRTNBRIFID 12
183 #define OSPFv3VIRTNBRRESTARTHELPERSTATUS 13
184 #define OSPFv3VIRTNBRRESTARTHELPERAGE 14
185 #define OSPFv3VIRTNBRRESTARTHELPEREXITREASON 15
187 /* OSPFv3 MIB Area Aggregate Table values: ospfv3AreaAggregateTable */
188 #define OSPFv3AREAAGGREGATEROWSTATUS 6
189 #define OSPFv3AREAAGGREGATEEFFECT 7
190 #define OSPFv3AREAAGGREGATEROUTETAG 8
192 /* SYNTAX Status from OSPF-MIB. */
193 #define OSPF_STATUS_ENABLED 1
194 #define OSPF_STATUS_DISABLED 2
196 /* SNMP value hack. */
197 #define COUNTER ASN_COUNTER
198 #define INTEGER ASN_INTEGER
199 #define GAUGE ASN_GAUGE
200 #define UNSIGNED ASN_UNSIGNED
201 #define TIMETICKS ASN_TIMETICKS
202 #define IPADDRESS ASN_IPADDRESS
203 #define STRING ASN_OCTET_STR
205 /* For return values e.g. SNMP_INTEGER macro */
208 /* OSPFv3-MIB instances. */
209 static oid ospfv3_oid
[] = { OSPFv3MIB
};
210 static oid ospfv3_trap_oid
[] = { OSPFv3MIB
, 0 };
212 /* Hook functions. */
213 static u_char
*ospfv3GeneralGroup (struct variable
*, oid
*, size_t *,
214 int, size_t *, WriteMethod
**);
215 static u_char
*ospfv3AreaEntry (struct variable
*, oid
*, size_t *,
216 int, size_t *, WriteMethod
**);
217 static u_char
*ospfv3WwLsdbEntry (struct variable
*, oid
*, size_t *,
218 int, size_t *, WriteMethod
**);
219 static u_char
*ospfv3NbrEntry (struct variable
*, oid
*, size_t *,
220 int, size_t *, WriteMethod
**);
221 static u_char
*ospfv3IfEntry (struct variable
*, oid
*, size_t *,
222 int, size_t *, WriteMethod
**);
224 static struct variable ospfv3_variables
[] =
226 /* OSPF general variables */
227 {OSPFv3ROUTERID
, UNSIGNED
, RWRITE
, ospfv3GeneralGroup
,
229 {OSPFv3ADMINSTAT
, INTEGER
, RWRITE
, ospfv3GeneralGroup
,
231 {OSPFv3VERSIONNUMBER
, INTEGER
, RONLY
, ospfv3GeneralGroup
,
233 {OSPFv3AREABDRRTRSTATUS
, INTEGER
, RONLY
, ospfv3GeneralGroup
,
235 {OSPFv3ASBDRRTRSTATUS
, INTEGER
, RWRITE
, ospfv3GeneralGroup
,
237 {OSPFv3ASSCOPELSACOUNT
, GAUGE
, RONLY
, ospfv3GeneralGroup
,
239 {OSPFv3ASSCOPELSACHECKSUMSUM
,UNSIGNED
, RONLY
, ospfv3GeneralGroup
,
241 {OSPFv3ORIGINATENEWLSAS
, COUNTER
, RONLY
, ospfv3GeneralGroup
,
243 {OSPFv3RXNEWLSAS
, COUNTER
, RONLY
, ospfv3GeneralGroup
,
245 {OSPFv3EXTLSACOUNT
, GAUGE
, RONLY
, ospfv3GeneralGroup
,
247 {OSPFv3EXTAREALSDBLIMIT
, INTEGER
, RWRITE
, ospfv3GeneralGroup
,
249 {OSPFv3EXITOVERFLOWINTERVAL
, UNSIGNED
, RWRITE
, ospfv3GeneralGroup
,
251 {OSPFv3DEMANDEXTENSIONS
, INTEGER
, RWRITE
, ospfv3GeneralGroup
,
253 {OSPFv3REFERENCEBANDWIDTH
, UNSIGNED
, RWRITE
, ospfv3GeneralGroup
,
255 {OSPFv3RESTARTSUPPORT
, INTEGER
, RWRITE
, ospfv3GeneralGroup
,
257 {OSPFv3RESTARTINTERVAL
, UNSIGNED
, RWRITE
, ospfv3GeneralGroup
,
259 {OSPFv3RESTARTSTRICTLSACHECKING
, INTEGER
, RWRITE
, ospfv3GeneralGroup
,
261 {OSPFv3RESTARTSTATUS
, INTEGER
, RONLY
, ospfv3GeneralGroup
,
263 {OSPFv3RESTARTAGE
, UNSIGNED
, RONLY
, ospfv3GeneralGroup
,
265 {OSPFv3RESTARTEXITREASON
, INTEGER
, RONLY
, ospfv3GeneralGroup
,
267 {OSPFv3NOTIFICATIONENABLE
, INTEGER
, RWRITE
, ospfv3GeneralGroup
,
269 {OSPFv3STUBROUTERSUPPORT
, INTEGER
, RONLY
, ospfv3GeneralGroup
,
271 {OSPFv3STUBROUTERADVERTISEMENT
, INTEGER
, RWRITE
, ospfv3GeneralGroup
,
273 {OSPFv3DISCONTINUITYTIME
, TIMETICKS
, RONLY
, ospfv3GeneralGroup
,
275 {OSPFv3RESTARTTIME
, TIMETICKS
, RONLY
, ospfv3GeneralGroup
,
278 /* OSPFv3 Area Data Structure */
279 {OSPFv3IMPORTASEXTERN
, INTEGER
, RWRITE
, ospfv3AreaEntry
,
281 {OSPFv3AREASPFRUNS
, COUNTER
, RONLY
, ospfv3AreaEntry
,
283 {OSPFv3AREABDRRTRCOUNT
, GAUGE
, RONLY
, ospfv3AreaEntry
,
285 {OSPFv3AREAASBDRRTRCOUNT
, GAUGE
, RONLY
, ospfv3AreaEntry
,
287 {OSPFv3AREASCOPELSACOUNT
, GAUGE
, RONLY
, ospfv3AreaEntry
,
289 {OSPFv3AREASCOPELSACKSUMSUM
, UNSIGNED
, RONLY
, ospfv3AreaEntry
,
291 {OSPFv3AREASUMMARY
, INTEGER
, RWRITE
, ospfv3AreaEntry
,
293 {OSPFv3AREAROWSTATUS
, INTEGER
, RWRITE
, ospfv3AreaEntry
,
295 {OSPFv3AREASTUBMETRIC
, INTEGER
, RWRITE
, ospfv3AreaEntry
,
297 {OSPFv3AREANSSATRANSLATORROLE
, INTEGER
, RWRITE
, ospfv3AreaEntry
,
299 {OSPFv3AREANSSATRANSLATORSTATE
, INTEGER
, RONLY
, ospfv3AreaEntry
,
301 {OSPFv3AREANSSATRANSLATORSTABINTERVAL
, UNSIGNED
, RWRITE
, ospfv3AreaEntry
,
303 {OSPFv3AREANSSATRANSLATOREVENTS
, COUNTER
, RONLY
, ospfv3AreaEntry
,
305 {OSPFv3AREASTUBMETRICTYPE
, INTEGER
, RWRITE
, ospfv3AreaEntry
,
307 {OSPFv3AREATEENABLED
, INTEGER
, RWRITE
, ospfv3AreaEntry
,
311 {OSPFv3WWLSDBSEQUENCE
| OSPFv3WWASTABLE
, INTEGER
, RONLY
, ospfv3WwLsdbEntry
,
313 {OSPFv3WWLSDBAGE
| OSPFv3WWASTABLE
, UNSIGNED
, RONLY
, ospfv3WwLsdbEntry
,
315 {OSPFv3WWLSDBCHECKSUM
| OSPFv3WWASTABLE
, INTEGER
, RONLY
, ospfv3WwLsdbEntry
,
317 {OSPFv3WWLSDBADVERTISEMENT
| OSPFv3WWASTABLE
, STRING
, RONLY
, ospfv3WwLsdbEntry
,
319 {OSPFv3WWLSDBTYPEKNOWN
| OSPFv3WWASTABLE
, INTEGER
, RONLY
, ospfv3WwLsdbEntry
,
322 /* OSPFv3 Area LSDB */
323 {OSPFv3WWLSDBSEQUENCE
| OSPFv3WWAREATABLE
, INTEGER
, RONLY
, ospfv3WwLsdbEntry
,
325 {OSPFv3WWLSDBAGE
| OSPFv3WWAREATABLE
, UNSIGNED
, RONLY
, ospfv3WwLsdbEntry
,
327 {OSPFv3WWLSDBCHECKSUM
| OSPFv3WWAREATABLE
, INTEGER
, RONLY
, ospfv3WwLsdbEntry
,
329 {OSPFv3WWLSDBADVERTISEMENT
| OSPFv3WWAREATABLE
, STRING
, RONLY
, ospfv3WwLsdbEntry
,
331 {OSPFv3WWLSDBTYPEKNOWN
| OSPFv3WWAREATABLE
, INTEGER
, RONLY
, ospfv3WwLsdbEntry
,
334 /* OSPFv3 Link LSDB */
335 {OSPFv3WWLSDBSEQUENCE
| OSPFv3WWLINKTABLE
, INTEGER
, RONLY
, ospfv3WwLsdbEntry
,
337 {OSPFv3WWLSDBAGE
| OSPFv3WWLINKTABLE
, UNSIGNED
, RONLY
, ospfv3WwLsdbEntry
,
339 {OSPFv3WWLSDBCHECKSUM
| OSPFv3WWLINKTABLE
, INTEGER
, RONLY
, ospfv3WwLsdbEntry
,
341 {OSPFv3WWLSDBADVERTISEMENT
| OSPFv3WWLINKTABLE
, STRING
, RONLY
, ospfv3WwLsdbEntry
,
343 {OSPFv3WWLSDBTYPEKNOWN
| OSPFv3WWLINKTABLE
, INTEGER
, RONLY
, ospfv3WwLsdbEntry
,
346 /* OSPFv3 interfaces */
347 {OSPFv3IFAREAID
, UNSIGNED
, RONLY
, ospfv3IfEntry
,
349 {OSPFv3IFTYPE
, INTEGER
, RONLY
, ospfv3IfEntry
,
351 {OSPFv3IFADMINSTATUS
, INTEGER
, RONLY
, ospfv3IfEntry
,
353 {OSPFv3IFRTRPRIORITY
, INTEGER
, RONLY
, ospfv3IfEntry
,
355 {OSPFv3IFTRANSITDELAY
, UNSIGNED
, RONLY
, ospfv3IfEntry
,
357 {OSPFv3IFRETRANSINTERVAL
, UNSIGNED
, RONLY
, ospfv3IfEntry
,
359 {OSPFv3IFHELLOINTERVAL
, INTEGER
, RONLY
, ospfv3IfEntry
,
361 {OSPFv3IFRTRDEADINTERVAL
, UNSIGNED
, RONLY
, ospfv3IfEntry
,
363 {OSPFv3IFPOLLINTERVAL
, UNSIGNED
, RONLY
, ospfv3IfEntry
,
365 {OSPFv3IFSTATE
, INTEGER
, RONLY
, ospfv3IfEntry
,
367 {OSPFv3IFDESIGNATEDROUTER
, UNSIGNED
, RONLY
, ospfv3IfEntry
,
369 {OSPFv3IFBACKUPDESIGNATEDROUTER
, UNSIGNED
, RONLY
, ospfv3IfEntry
,
371 {OSPFv3IFEVENTS
, COUNTER
, RONLY
, ospfv3IfEntry
,
373 {OSPFv3IFROWSTATUS
, INTEGER
, RONLY
, ospfv3IfEntry
,
375 {OSPFv3IFDEMAND
, INTEGER
, RONLY
, ospfv3IfEntry
,
377 {OSPFv3IFMETRICVALUE
, INTEGER
, RONLY
, ospfv3IfEntry
,
379 {OSPFv3IFLINKSCOPELSACOUNT
, GAUGE
, RONLY
, ospfv3IfEntry
,
381 {OSPFv3IFLINKLSACKSUMSUM
, UNSIGNED
, RONLY
, ospfv3IfEntry
,
383 {OSPFv3IFDEMANDNBRPROBE
, INTEGER
, RONLY
, ospfv3IfEntry
,
385 {OSPFv3IFDEMANDNBRPROBERETRANSLIMIT
, UNSIGNED
, RONLY
, ospfv3IfEntry
,
387 {OSPFv3IFDEMANDNBRPROBEINTERVAL
, UNSIGNED
, RONLY
, ospfv3IfEntry
,
389 {OSPFv3IFTEDISABLED
, INTEGER
, RONLY
, ospfv3IfEntry
,
391 {OSPFv3IFLINKLSASUPPRESSION
, INTEGER
, RONLY
, ospfv3IfEntry
,
394 /* OSPFv3 neighbors */
395 {OSPFv3NBRADDRESSTYPE
, INTEGER
, RONLY
, ospfv3NbrEntry
,
397 {OSPFv3NBRADDRESS
, STRING
, RONLY
, ospfv3NbrEntry
,
399 {OSPFv3NBROPTIONS
, INTEGER
, RONLY
, ospfv3NbrEntry
,
401 {OSPFv3NBRPRIORITY
, INTEGER
, RONLY
, ospfv3NbrEntry
,
403 {OSPFv3NBRSTATE
, INTEGER
, RONLY
, ospfv3NbrEntry
,
405 {OSPFv3NBREVENTS
, COUNTER
, RONLY
, ospfv3NbrEntry
,
407 {OSPFv3NBRLSRETRANSQLEN
, GAUGE
, RONLY
, ospfv3NbrEntry
,
409 {OSPFv3NBRHELLOSUPPRESSED
, INTEGER
, RONLY
, ospfv3NbrEntry
,
411 {OSPFv3NBRIFID
, INTEGER
, RONLY
, ospfv3NbrEntry
,
413 {OSPFv3NBRRESTARTHELPERSTATUS
, INTEGER
, RONLY
, ospfv3NbrEntry
,
415 {OSPFv3NBRRESTARTHELPERAGE
, UNSIGNED
, RONLY
, ospfv3NbrEntry
,
417 {OSPFv3NBRRESTARTHELPEREXITREASON
, INTEGER
, RONLY
, ospfv3NbrEntry
,
422 ospfv3GeneralGroup (struct variable
*v
, oid
*name
, size_t *length
,
423 int exact
, size_t *var_len
, WriteMethod
**write_method
)
427 struct ospf6_lsa
*lsa
= NULL
;
429 /* Check whether the instance identifier is valid */
430 if (smux_header_generic (v
, name
, length
, exact
, var_len
, write_method
)
434 /* Return the current value of the variable */
438 /* Router-ID of this OSPF instance. */
440 return SNMP_INTEGER (ntohl (ospf6
->router_id
));
441 return SNMP_INTEGER (0);
442 case OSPFv3ADMINSTAT
:
444 return SNMP_INTEGER (CHECK_FLAG (ospf6
->flag
, OSPF6_DISABLED
)?
445 OSPF_STATUS_DISABLED
:OSPF_STATUS_ENABLED
);
446 return SNMP_INTEGER (OSPF_STATUS_DISABLED
);
447 case OSPFv3VERSIONNUMBER
:
448 return SNMP_INTEGER (3);
449 case OSPFv3AREABDRRTRSTATUS
:
451 return SNMP_INTEGER (ospf6_is_router_abr (ospf6
)?SNMP_TRUE
:SNMP_FALSE
);
452 return SNMP_INTEGER (SNMP_FALSE
);
453 case OSPFv3ASBDRRTRSTATUS
:
455 return SNMP_INTEGER (ospf6_asbr_is_asbr (ospf6
)?SNMP_TRUE
:SNMP_FALSE
);
456 return SNMP_INTEGER (SNMP_FALSE
);
457 case OSPFv3ASSCOPELSACOUNT
:
459 return SNMP_INTEGER (ospf6
->lsdb
->count
);
460 return SNMP_INTEGER (0);
461 case OSPFv3ASSCOPELSACHECKSUMSUM
:
464 for (sum
= 0, lsa
= ospf6_lsdb_head (ospf6
->lsdb
);
466 lsa
= ospf6_lsdb_next (lsa
))
467 sum
+= ntohs (lsa
->header
->checksum
);
468 return SNMP_INTEGER (sum
);
470 return SNMP_INTEGER (0);
471 case OSPFv3ORIGINATENEWLSAS
:
472 return SNMP_INTEGER (0); /* Don't know where to get this value... */
473 case OSPFv3RXNEWLSAS
:
474 return SNMP_INTEGER (0); /* Don't know where to get this value... */
475 case OSPFv3EXTLSACOUNT
:
478 for (count
= 0, lsa
= ospf6_lsdb_type_head (htons (OSPF6_LSTYPE_AS_EXTERNAL
),
481 lsa
= ospf6_lsdb_type_next (htons (OSPF6_LSTYPE_AS_EXTERNAL
),
484 return SNMP_INTEGER (count
);
486 return SNMP_INTEGER (0);
487 case OSPFv3EXTAREALSDBLIMIT
:
488 return SNMP_INTEGER (-1);
489 case OSPFv3EXITOVERFLOWINTERVAL
:
490 return SNMP_INTEGER (0); /* Not supported */
491 case OSPFv3DEMANDEXTENSIONS
:
492 return SNMP_INTEGER (0); /* Not supported */
493 case OSPFv3REFERENCEBANDWIDTH
:
495 return SNMP_INTEGER (ospf6
->ref_bandwidth
);
496 /* Otherwise, like for "not implemented". */
497 case OSPFv3RESTARTSUPPORT
:
498 case OSPFv3RESTARTINTERVAL
:
499 case OSPFv3RESTARTSTRICTLSACHECKING
:
500 case OSPFv3RESTARTSTATUS
:
501 case OSPFv3RESTARTAGE
:
502 case OSPFv3RESTARTEXITREASON
:
503 case OSPFv3NOTIFICATIONENABLE
:
504 case OSPFv3STUBROUTERSUPPORT
:
505 case OSPFv3STUBROUTERADVERTISEMENT
:
506 case OSPFv3DISCONTINUITYTIME
:
507 case OSPFv3RESTARTTIME
:
508 /* TODO: Not implemented */
515 ospfv3AreaEntry (struct variable
*v
, oid
*name
, size_t *length
,
516 int exact
, size_t *var_len
, WriteMethod
**write_method
)
518 struct ospf6_area
*oa
, *area
= NULL
;
519 struct ospf6_lsa
*lsa
= NULL
;
520 u_int32_t area_id
= 0;
523 struct listnode
*node
;
526 struct ospf6_route
*ro
;
531 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
)
535 len
= *length
- v
->namelen
;
536 len
= (len
>= 1 ? 1 : 0);
537 if (exact
&& len
!= 1)
540 area_id
= htonl (name
[v
->namelen
]);
542 inet_ntop (AF_INET
, &area_id
, a
, sizeof (a
));
543 zlog_debug ("SNMP access by area: %s, exact=%d len=%d length=%lu",
544 a
, exact
, len
, (u_long
)*length
);
546 for (ALL_LIST_ELEMENTS_RO (ospf6
->area_list
, node
, oa
))
550 if (len
== 0) /* return first area entry */
552 else if (exact
&& ntohl (oa
->area_id
) == ntohl (area_id
))
554 else if (ntohl (oa
->area_id
) > ntohl (area_id
))
562 *length
= v
->namelen
+ 1;
563 name
[v
->namelen
] = ntohl (area
->area_id
);
565 inet_ntop (AF_INET
, &area
->area_id
, a
, sizeof (a
));
566 zlog_debug ("SNMP found area: %s, exact=%d len=%d length=%lu",
567 a
, exact
, len
, (u_long
)*length
);
571 case OSPFv3IMPORTASEXTERN
:
572 /* No NSSA support */
573 return SNMP_INTEGER (IS_AREA_STUB(area
)?2:1);
574 case OSPFv3AREASPFRUNS
:
575 return SNMP_INTEGER (area
->spf_calculation
);
576 case OSPFv3AREABDRRTRCOUNT
:
577 case OSPFv3AREAASBDRRTRCOUNT
:
579 for (ro
= ospf6_route_head (ospf6
->brouter_table
); ro
;
580 ro
= ospf6_route_next (ro
))
582 if (ntohl (ro
->path
.area_id
) != ntohl (area
->area_id
)) continue;
583 if (v
->magic
== OSPFv3AREABDRRTRCOUNT
&&
584 CHECK_FLAG (ro
->path
.router_bits
, OSPF6_ROUTER_BIT_B
))
586 if (v
->magic
== OSPFv3AREAASBDRRTRCOUNT
&&
587 CHECK_FLAG (ro
->path
.router_bits
, OSPF6_ROUTER_BIT_E
))
590 return SNMP_INTEGER (count
);
591 case OSPFv3AREASCOPELSACOUNT
:
592 return SNMP_INTEGER (area
->lsdb
->count
);
593 case OSPFv3AREASCOPELSACKSUMSUM
:
594 for (sum
= 0, lsa
= ospf6_lsdb_head (area
->lsdb
);
596 lsa
= ospf6_lsdb_next (lsa
))
597 sum
+= ntohs (lsa
->header
->checksum
);
598 return SNMP_INTEGER (sum
);
599 case OSPFv3AREASUMMARY
:
600 return SNMP_INTEGER (2); /* sendAreaSummary */
601 case OSPFv3AREAROWSTATUS
:
602 return SNMP_INTEGER (1); /* Active */
603 case OSPFv3AREASTUBMETRIC
:
604 case OSPFv3AREANSSATRANSLATORROLE
:
605 case OSPFv3AREANSSATRANSLATORSTATE
:
606 case OSPFv3AREANSSATRANSLATORSTABINTERVAL
:
607 case OSPFv3AREANSSATRANSLATOREVENTS
:
608 case OSPFv3AREASTUBMETRICTYPE
:
609 case OSPFv3AREATEENABLED
:
610 /* Not implemented. */
617 if_icmp_func (struct interface
*ifp1
, struct interface
*ifp2
)
619 return (ifp1
->ifindex
- ifp2
->ifindex
);
623 ospfv3WwLsdbEntry (struct variable
*v
, oid
*name
, size_t *length
,
624 int exact
, size_t *var_len
, WriteMethod
**write_method
)
626 struct ospf6_lsa
*lsa
= NULL
;
628 uint32_t area_id
, id
, instid
, adv_router
;
633 struct ospf6_area
*oa
= NULL
;
634 struct listnode
*node
;
635 struct interface
*iif
;
636 struct ospf6_interface
*oi
= NULL
;
637 struct list
*ifslist
;
639 if (smux_header_table(v
, name
, length
, exact
, var_len
, write_method
)
643 instid
= ifindex
= area_id
= type
= id
= adv_router
= 0;
645 /* Check OSPFv3 instance. */
649 /* Get variable length. */
650 offset
= name
+ v
->namelen
;
651 offsetlen
= *length
- v
->namelen
;
653 if (exact
&& (v
->magic
& OSPFv3WWASTABLE
) && offsetlen
!= 3)
655 if (exact
&& (v
->magic
& OSPFv3WWAREATABLE
) && offsetlen
!= 4)
657 if (exact
&& (v
->magic
& OSPFv3WWLINKTABLE
) && offsetlen
!= 5)
660 if (v
->magic
& OSPFv3WWLINKTABLE
)
663 len
= (offsetlen
< 1 ? 0 : 1);
669 /* Parse instance ID */
670 len
= (offsetlen
< 1 ? 0 : 1);
676 else if (v
->magic
& OSPFv3WWAREATABLE
)
679 len
= (offsetlen
< 1 ? 0 : 1);
681 area_id
= htonl (*offset
);
687 len
= (offsetlen
< 1 ? 0 : 1);
689 type
= htons (*offset
);
693 /* Parse Router-ID */
694 len
= (offsetlen
< 1 ? 0 : 1);
696 adv_router
= htonl (*offset
);
701 len
= (offsetlen
< 1 ? 0 : 1);
703 id
= htonl (*offset
);
709 if (v
->magic
& OSPFv3WWASTABLE
)
711 lsa
= ospf6_lsdb_lookup (type
, id
, adv_router
, ospf6
->lsdb
);
713 else if (v
->magic
& OSPFv3WWAREATABLE
)
715 oa
= ospf6_area_lookup (area_id
, ospf6
);
716 if (!oa
) return NULL
;
717 lsa
= ospf6_lsdb_lookup (type
, id
, adv_router
, oa
->lsdb
);
719 else if (v
->magic
& OSPFv3WWLINKTABLE
)
721 oi
= ospf6_interface_lookup_by_ifindex (ifindex
);
722 if (!oi
|| oi
->instance_id
!= instid
) return NULL
;
723 lsa
= ospf6_lsdb_lookup (type
, id
, adv_router
, oi
->lsdb
);
728 if (v
->magic
& OSPFv3WWASTABLE
)
730 if (ospf6
->lsdb
->count
)
731 lsa
= ospf6_lsdb_lookup_next (type
, id
, adv_router
,
734 else if (v
->magic
& OSPFv3WWAREATABLE
)
735 for (ALL_LIST_ELEMENTS_RO (ospf6
->area_list
, node
, oa
))
737 if (oa
->area_id
< area_id
)
741 lsa
= ospf6_lsdb_lookup_next (type
, id
, adv_router
,
748 else if (v
->magic
& OSPFv3WWLINKTABLE
)
750 /* We build a sorted list of interfaces */
751 ifslist
= list_new ();
752 if (!ifslist
) return NULL
;
753 ifslist
->cmp
= (int (*)(void *, void *))if_icmp_func
;
754 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), node
, iif
))
755 listnode_add_sort (ifslist
, iif
);
757 for (ALL_LIST_ELEMENTS_RO (ifslist
, node
, iif
))
759 if (!iif
->ifindex
) continue;
760 oi
= ospf6_interface_lookup_by_ifindex (iif
->ifindex
);
762 if (iif
->ifindex
< ifindex
) continue;
763 if (oi
->instance_id
< instid
) continue;
766 lsa
= ospf6_lsdb_lookup_next (type
, id
, adv_router
,
775 list_delete_all_node (ifslist
);
783 if (v
->magic
& OSPFv3WWASTABLE
)
785 *length
= v
->namelen
+ 3;
786 offset
= name
+ v
->namelen
;
788 else if (v
->magic
& OSPFv3WWAREATABLE
)
790 *length
= v
->namelen
+ 4;
791 offset
= name
+ v
->namelen
;
792 *offset
= ntohl (oa
->area_id
);
795 else if (v
->magic
& OSPFv3WWLINKTABLE
)
797 *length
= v
->namelen
+ 5;
798 offset
= name
+ v
->namelen
;
799 *offset
= oi
->interface
->ifindex
;
801 *offset
= oi
->instance_id
;
804 *offset
= ntohs (lsa
->header
->type
);
806 *offset
= ntohl (lsa
->header
->adv_router
);
808 *offset
= ntohl (lsa
->header
->id
);
811 /* Return the current value of the variable */
812 switch (v
->magic
& OSPFv3WWCOLUMN
)
814 case OSPFv3WWLSDBSEQUENCE
:
815 return SNMP_INTEGER (ntohl (lsa
->header
->seqnum
));
817 case OSPFv3WWLSDBAGE
:
818 ospf6_lsa_age_current (lsa
);
819 return SNMP_INTEGER (ntohs (lsa
->header
->age
));
821 case OSPFv3WWLSDBCHECKSUM
:
822 return SNMP_INTEGER (ntohs (lsa
->header
->checksum
));
824 case OSPFv3WWLSDBADVERTISEMENT
:
825 *var_len
= ntohs (lsa
->header
->length
);
826 return (u_char
*) lsa
->header
;
828 case OSPFv3WWLSDBTYPEKNOWN
:
829 return SNMP_INTEGER (OSPF6_LSA_IS_KNOWN (lsa
->header
->type
) ?
830 SNMP_TRUE
: SNMP_FALSE
);
837 ospfv3IfEntry (struct variable
*v
, oid
*name
, size_t *length
,
838 int exact
, size_t *var_len
, WriteMethod
**write_method
)
840 ifindex_t ifindex
= 0;
841 unsigned int instid
= 0;
842 struct ospf6_interface
*oi
= NULL
;
843 struct ospf6_lsa
*lsa
= NULL
;
844 struct interface
*iif
;
846 struct list
*ifslist
;
851 if (smux_header_table (v
, name
, length
, exact
, var_len
, write_method
)
855 /* Check OSPFv3 instance. */
859 /* Get variable length. */
860 offset
= name
+ v
->namelen
;
861 offsetlen
= *length
- v
->namelen
;
863 if (exact
&& offsetlen
!= 2)
867 len
= (offsetlen
< 1 ? 0 : 1);
873 /* Parse instance ID */
874 len
= (offsetlen
< 1 ? 0 : 1);
882 oi
= ospf6_interface_lookup_by_ifindex (ifindex
);
883 if (!oi
|| oi
->instance_id
!= instid
) return NULL
;
887 /* We build a sorted list of interfaces */
888 ifslist
= list_new ();
889 if (!ifslist
) return NULL
;
890 ifslist
->cmp
= (int (*)(void *, void *))if_icmp_func
;
891 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), i
, iif
))
892 listnode_add_sort (ifslist
, iif
);
894 for (ALL_LIST_ELEMENTS_RO (ifslist
, i
, iif
))
896 if (!iif
->ifindex
) continue;
897 oi
= ospf6_interface_lookup_by_ifindex (iif
->ifindex
);
899 if (iif
->ifindex
> ifindex
||
900 (iif
->ifindex
== ifindex
&&
901 (oi
->instance_id
> instid
)))
906 list_delete_all_node (ifslist
);
909 if (!oi
) return NULL
;
911 /* Add Index (IfIndex, IfInstId) */
912 *length
= v
->namelen
+ 2;
913 offset
= name
+ v
->namelen
;
914 *offset
= oi
->interface
->ifindex
;
916 *offset
= oi
->instance_id
;
919 /* Return the current value of the variable */
924 return SNMP_INTEGER (ntohl (oi
->area
->area_id
));
927 if (if_is_broadcast (oi
->interface
))
928 return SNMP_INTEGER (1);
929 else if (if_is_pointopoint (oi
->interface
))
930 return SNMP_INTEGER (3);
931 else break; /* Unknown, don't put anything */
932 case OSPFv3IFADMINSTATUS
:
934 return SNMP_INTEGER (OSPF_STATUS_ENABLED
);
935 return SNMP_INTEGER (OSPF_STATUS_DISABLED
);
936 case OSPFv3IFRTRPRIORITY
:
937 return SNMP_INTEGER (oi
->priority
);
938 case OSPFv3IFTRANSITDELAY
:
939 return SNMP_INTEGER (oi
->transdelay
);
940 case OSPFv3IFRETRANSINTERVAL
:
941 return SNMP_INTEGER (oi
->rxmt_interval
);
942 case OSPFv3IFHELLOINTERVAL
:
943 return SNMP_INTEGER (oi
->hello_interval
);
944 case OSPFv3IFRTRDEADINTERVAL
:
945 return SNMP_INTEGER (oi
->dead_interval
);
946 case OSPFv3IFPOLLINTERVAL
:
947 /* No support for NBMA */
950 return SNMP_INTEGER (oi
->state
);
951 case OSPFv3IFDESIGNATEDROUTER
:
952 return SNMP_INTEGER (ntohl (oi
->drouter
));
953 case OSPFv3IFBACKUPDESIGNATEDROUTER
:
954 return SNMP_INTEGER (ntohl (oi
->bdrouter
));
956 return SNMP_INTEGER (oi
->state_change
);
957 case OSPFv3IFROWSTATUS
:
958 return SNMP_INTEGER (1);
960 return SNMP_INTEGER (SNMP_FALSE
);
961 case OSPFv3IFMETRICVALUE
:
962 return SNMP_INTEGER (oi
->cost
);
963 case OSPFv3IFLINKSCOPELSACOUNT
:
964 return SNMP_INTEGER (oi
->lsdb
->count
);
965 case OSPFv3IFLINKLSACKSUMSUM
:
966 for (sum
= 0, lsa
= ospf6_lsdb_head (oi
->lsdb
);
968 lsa
= ospf6_lsdb_next (lsa
))
969 sum
+= ntohs (lsa
->header
->checksum
);
970 return SNMP_INTEGER (sum
);
971 case OSPFv3IFDEMANDNBRPROBE
:
972 case OSPFv3IFDEMANDNBRPROBERETRANSLIMIT
:
973 case OSPFv3IFDEMANDNBRPROBEINTERVAL
:
974 case OSPFv3IFTEDISABLED
:
975 case OSPFv3IFLINKLSASUPPRESSION
:
976 /* Not implemented. Only works if all the last ones are not
981 /* Try an internal getnext. Some columns are missing in this table. */
982 if (!exact
&& (name
[*length
-1] < MAX_SUBID
))
983 return ospfv3IfEntry(v
, name
, length
,
984 exact
, var_len
, write_method
);
989 ospfv3NbrEntry (struct variable
*v
, oid
*name
, size_t *length
,
990 int exact
, size_t *var_len
, WriteMethod
**write_method
)
992 ifindex_t ifindex
= 0;
993 unsigned int instid
, rtrid
;
994 struct ospf6_interface
*oi
= NULL
;
995 struct ospf6_neighbor
*on
= NULL
;
996 struct interface
*iif
;
997 struct listnode
*i
, *j
;
998 struct list
*ifslist
;
1002 if (smux_header_table (v
, name
, length
, exact
, var_len
, write_method
)
1008 /* Check OSPFv3 instance. */
1012 /* Get variable length. */
1013 offset
= name
+ v
->namelen
;
1014 offsetlen
= *length
- v
->namelen
;
1016 if (exact
&& offsetlen
!= 3)
1019 /* Parse if index */
1020 len
= (offsetlen
< 1 ? 0 : 1);
1026 /* Parse instance ID */
1027 len
= (offsetlen
< 1 ? 0 : 1);
1033 /* Parse router ID */
1034 len
= (offsetlen
< 1 ? 0 : 1);
1036 rtrid
= htonl (*offset
);
1042 oi
= ospf6_interface_lookup_by_ifindex (ifindex
);
1043 if (!oi
|| oi
->instance_id
!= instid
) return NULL
;
1044 on
= ospf6_neighbor_lookup (rtrid
, oi
);
1048 /* We build a sorted list of interfaces */
1049 ifslist
= list_new ();
1050 if (!ifslist
) return NULL
;
1051 ifslist
->cmp
= (int (*)(void *, void *))if_icmp_func
;
1052 for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT
), i
, iif
))
1053 listnode_add_sort (ifslist
, iif
);
1055 for (ALL_LIST_ELEMENTS_RO (ifslist
, i
, iif
))
1057 if (!iif
->ifindex
) continue;
1058 oi
= ospf6_interface_lookup_by_ifindex (iif
->ifindex
);
1060 for (ALL_LIST_ELEMENTS_RO (oi
->neighbor_list
, j
, on
)) {
1061 if (iif
->ifindex
> ifindex
||
1062 (iif
->ifindex
== ifindex
&&
1063 (oi
->instance_id
> instid
||
1064 (oi
->instance_id
== instid
&&
1065 ntohl (on
->router_id
) > ntohl (rtrid
)))))
1073 list_delete_all_node (ifslist
);
1076 if (!oi
|| !on
) return NULL
;
1078 /* Add Index (IfIndex, IfInstId, RtrId) */
1079 *length
= v
->namelen
+ 3;
1080 offset
= name
+ v
->namelen
;
1081 *offset
= oi
->interface
->ifindex
;
1083 *offset
= oi
->instance_id
;
1085 *offset
= ntohl (on
->router_id
);
1088 /* Return the current value of the variable */
1091 case OSPFv3NBRADDRESSTYPE
:
1092 return SNMP_INTEGER (2); /* IPv6 only */
1093 case OSPFv3NBRADDRESS
:
1094 *var_len
= sizeof (struct in6_addr
);
1095 return (u_char
*) &on
->linklocal_addr
;
1096 case OSPFv3NBROPTIONS
:
1097 return SNMP_INTEGER (on
->options
[2]);
1098 case OSPFv3NBRPRIORITY
:
1099 return SNMP_INTEGER (on
->priority
);
1100 case OSPFv3NBRSTATE
:
1101 return SNMP_INTEGER (on
->state
);
1102 case OSPFv3NBREVENTS
:
1103 return SNMP_INTEGER (on
->state_change
);
1104 case OSPFv3NBRLSRETRANSQLEN
:
1105 return SNMP_INTEGER (on
->retrans_list
->count
);
1106 case OSPFv3NBRHELLOSUPPRESSED
:
1107 return SNMP_INTEGER (SNMP_FALSE
);
1109 return SNMP_INTEGER (on
->ifindex
);
1110 case OSPFv3NBRRESTARTHELPERSTATUS
:
1111 case OSPFv3NBRRESTARTHELPERAGE
:
1112 case OSPFv3NBRRESTARTHELPEREXITREASON
:
1113 /* Not implemented. Only works if all the last ones are not
1122 #define NBRSTATECHANGE 2
1123 #define IFSTATECHANGE 10
1125 static struct trap_object ospf6NbrTrapList
[] =
1127 {-3, {1, 1, OSPFv3ROUTERID
}},
1128 {4, {1, 9, 1, OSPFv3NBRADDRESSTYPE
}},
1129 {4, {1, 9, 1, OSPFv3NBRADDRESS
}},
1130 {4, {1, 9, 1, OSPFv3NBRSTATE
}}
1133 static struct trap_object ospf6IfTrapList
[] =
1135 {-3, {1, 1, OSPFv3ROUTERID
}},
1136 {4, {1, 7, 1, OSPFv3IFSTATE
}},
1137 {4, {1, 7, 1, OSPFv3IFADMINSTATUS
}},
1138 {4, {1, 7, 1, OSPFv3IFAREAID
}}
1142 ospf6TrapNbrStateChange (struct ospf6_neighbor
*on
,
1143 int next_state
, int prev_state
)
1147 /* Terminal state or regression */
1148 if ((next_state
!= OSPF6_NEIGHBOR_FULL
) &&
1149 (next_state
!= OSPF6_NEIGHBOR_TWOWAY
) &&
1150 (next_state
>= prev_state
))
1153 index
[0] = on
->ospf6_if
->interface
->ifindex
;
1154 index
[1] = on
->ospf6_if
->instance_id
;
1155 index
[2] = ntohl (on
->router_id
);
1157 smux_trap (ospfv3_variables
, sizeof ospfv3_variables
/ sizeof (struct variable
),
1158 ospfv3_trap_oid
, sizeof ospfv3_trap_oid
/ sizeof (oid
),
1159 ospfv3_oid
, sizeof ospfv3_oid
/ sizeof (oid
),
1162 sizeof ospf6NbrTrapList
/ sizeof (struct trap_object
),
1168 ospf6TrapIfStateChange (struct ospf6_interface
*oi
,
1169 int next_state
, int prev_state
)
1173 /* Terminal state or regression */
1174 if ((next_state
!= OSPF6_INTERFACE_POINTTOPOINT
) &&
1175 (next_state
!= OSPF6_INTERFACE_DROTHER
) &&
1176 (next_state
!= OSPF6_INTERFACE_BDR
) &&
1177 (next_state
!= OSPF6_INTERFACE_DR
) &&
1178 (next_state
>= prev_state
))
1181 index
[0] = oi
->interface
->ifindex
;
1182 index
[1] = oi
->instance_id
;
1184 smux_trap (ospfv3_variables
, sizeof ospfv3_variables
/ sizeof (struct variable
),
1185 ospfv3_trap_oid
, sizeof ospfv3_trap_oid
/ sizeof (oid
),
1186 ospfv3_oid
, sizeof ospfv3_oid
/ sizeof (oid
),
1189 sizeof ospf6IfTrapList
/ sizeof (struct trap_object
),
1194 /* Register OSPFv3-MIB. */
1196 ospf6_snmp_init (struct thread_master
*master
)
1199 REGISTER_MIB ("OSPFv3MIB", ospfv3_variables
, variable
, ospfv3_oid
);
1204 ospf6_snmp_module_init (void)
1206 hook_register(ospf6_interface_change
, ospf6TrapIfStateChange
);
1207 hook_register(ospf6_neighbor_change
, ospf6TrapNbrStateChange
);
1208 hook_register(frr_late_init
, ospf6_snmp_init
);
1213 .name
= "ospf6d_snmp",
1214 .version
= FRR_VERSION
,
1215 .description
= "ospf6d AgentX SNMP module",
1216 .init
= ospf6_snmp_module_init
,