12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178 |
- /* OSPFv3 SNMP support
- * Copyright (C) 2004 Yasuhiro Ohara
- *
- * This file is part of GNU Zebra.
- *
- * GNU Zebra is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * GNU Zebra is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING. If not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
- #include <zebra.h>
- #ifdef HAVE_SNMP
- #include <net-snmp/net-snmp-config.h>
- #include <net-snmp/net-snmp-includes.h>
- #include "log.h"
- #include "vty.h"
- #include "linklist.h"
- #include "smux.h"
- #include "ospf6_proto.h"
- #include "ospf6_lsa.h"
- #include "ospf6_lsdb.h"
- #include "ospf6_route.h"
- #include "ospf6_top.h"
- #include "ospf6_area.h"
- #include "ospf6_interface.h"
- #include "ospf6_message.h"
- #include "ospf6_neighbor.h"
- #include "ospf6d.h"
- #include "ospf6_snmp.h"
- /* OSPFv3-MIB */
- #define OSPFv3MIB 1,3,6,1,2,1,191
- /* OSPFv3 MIB General Group values. */
- #define OSPFv3ROUTERID 1
- #define OSPFv3ADMINSTAT 2
- #define OSPFv3VERSIONNUMBER 3
- #define OSPFv3AREABDRRTRSTATUS 4
- #define OSPFv3ASBDRRTRSTATUS 5
- #define OSPFv3ASSCOPELSACOUNT 6
- #define OSPFv3ASSCOPELSACHECKSUMSUM 7
- #define OSPFv3ORIGINATENEWLSAS 8
- #define OSPFv3RXNEWLSAS 9
- #define OSPFv3EXTLSACOUNT 10
- #define OSPFv3EXTAREALSDBLIMIT 11
- #define OSPFv3EXITOVERFLOWINTERVAL 12
- #define OSPFv3DEMANDEXTENSIONS 13
- #define OSPFv3REFERENCEBANDWIDTH 14
- #define OSPFv3RESTARTSUPPORT 15
- #define OSPFv3RESTARTINTERVAL 16
- #define OSPFv3RESTARTSTRICTLSACHECKING 17
- #define OSPFv3RESTARTSTATUS 18
- #define OSPFv3RESTARTAGE 19
- #define OSPFv3RESTARTEXITREASON 20
- #define OSPFv3NOTIFICATIONENABLE 21
- #define OSPFv3STUBROUTERSUPPORT 22
- #define OSPFv3STUBROUTERADVERTISEMENT 23
- #define OSPFv3DISCONTINUITYTIME 24
- #define OSPFv3RESTARTTIME 25
- /* OSPFv3 MIB Area Table values: ospfv3AreaTable */
- #define OSPFv3IMPORTASEXTERN 2
- #define OSPFv3AREASPFRUNS 3
- #define OSPFv3AREABDRRTRCOUNT 4
- #define OSPFv3AREAASBDRRTRCOUNT 5
- #define OSPFv3AREASCOPELSACOUNT 6
- #define OSPFv3AREASCOPELSACKSUMSUM 7
- #define OSPFv3AREASUMMARY 8
- #define OSPFv3AREAROWSTATUS 9
- #define OSPFv3AREASTUBMETRIC 10
- #define OSPFv3AREANSSATRANSLATORROLE 11
- #define OSPFv3AREANSSATRANSLATORSTATE 12
- #define OSPFv3AREANSSATRANSLATORSTABINTERVAL 13
- #define OSPFv3AREANSSATRANSLATOREVENTS 14
- #define OSPFv3AREASTUBMETRICTYPE 15
- #define OSPFv3AREATEENABLED 16
- /* OSPFv3 MIB * Lsdb Table values: ospfv3*LsdbTable */
- #define OSPFv3WWLSDBSEQUENCE 1
- #define OSPFv3WWLSDBAGE 2
- #define OSPFv3WWLSDBCHECKSUM 3
- #define OSPFv3WWLSDBADVERTISEMENT 4
- #define OSPFv3WWLSDBTYPEKNOWN 5
- /* Three first bits are to identify column */
- #define OSPFv3WWCOLUMN 0x7
- /* Then we use other bits to identify table */
- #define OSPFv3WWASTABLE (1 << 3)
- #define OSPFv3WWAREATABLE (1 << 4)
- #define OSPFv3WWLINKTABLE (1 << 5)
- #define OSPFv3WWVIRTLINKTABLE (1 << 6)
- /* OSPFv3 MIB Host Table values: ospfv3HostTable */
- #define OSPFv3HOSTMETRIC 3
- #define OSPFv3HOSTROWSTATUS 4
- #define OSPFv3HOSTAREAID 5
- /* OSPFv3 MIB Interface Table values: ospfv3IfTable */
- #define OSPFv3IFAREAID 3
- #define OSPFv3IFTYPE 4
- #define OSPFv3IFADMINSTATUS 5
- #define OSPFv3IFRTRPRIORITY 6
- #define OSPFv3IFTRANSITDELAY 7
- #define OSPFv3IFRETRANSINTERVAL 8
- #define OSPFv3IFHELLOINTERVAL 9
- #define OSPFv3IFRTRDEADINTERVAL 10
- #define OSPFv3IFPOLLINTERVAL 11
- #define OSPFv3IFSTATE 12
- #define OSPFv3IFDESIGNATEDROUTER 13
- #define OSPFv3IFBACKUPDESIGNATEDROUTER 14
- #define OSPFv3IFEVENTS 15
- #define OSPFv3IFROWSTATUS 16
- #define OSPFv3IFDEMAND 17
- #define OSPFv3IFMETRICVALUE 18
- #define OSPFv3IFLINKSCOPELSACOUNT 19
- #define OSPFv3IFLINKLSACKSUMSUM 20
- #define OSPFv3IFDEMANDNBRPROBE 21
- #define OSPFv3IFDEMANDNBRPROBERETRANSLIMIT 22
- #define OSPFv3IFDEMANDNBRPROBEINTERVAL 23
- #define OSPFv3IFTEDISABLED 24
- #define OSPFv3IFLINKLSASUPPRESSION 25
- /* OSPFv3 MIB Virtual Interface Table values: ospfv3VirtIfTable */
- #define OSPFv3VIRTIFINDEX 3
- #define OSPFv3VIRTIFINSTID 4
- #define OSPFv3VIRTIFTRANSITDELAY 5
- #define OSPFv3VIRTIFRETRANSINTERVAL 6
- #define OSPFv3VIRTIFHELLOINTERVAL 7
- #define OSPFv3VIRTIFRTRDEADINTERVAL 8
- #define OSPFv3VIRTIFSTATE 9
- #define OSPFv3VIRTIFEVENTS 10
- #define OSPFv3VIRTIFROWSTATUS 11
- #define OSPFv3VIRTIFLINKSCOPELSACOUNT 12
- #define OSPFv3VIRTIFLINKLSACKSUMSUM 13
- /* OSPFv3 MIB Neighbors Table values: ospfv3NbrTable */
- #define OSPFv3NBRADDRESSTYPE 4
- #define OSPFv3NBRADDRESS 5
- #define OSPFv3NBROPTIONS 6
- #define OSPFv3NBRPRIORITY 7
- #define OSPFv3NBRSTATE 8
- #define OSPFv3NBREVENTS 9
- #define OSPFv3NBRLSRETRANSQLEN 10
- #define OSPFv3NBRHELLOSUPPRESSED 11
- #define OSPFv3NBRIFID 12
- #define OSPFv3NBRRESTARTHELPERSTATUS 13
- #define OSPFv3NBRRESTARTHELPERAGE 14
- #define OSPFv3NBRRESTARTHELPEREXITREASON 15
- /* OSPFv3 MIB Configured Neighbors Table values: ospfv3CfgNbrTable */
- #define OSPFv3CFGNBRPRIORITY 5
- #define OSPFv3CFGNBRROWSTATUS 6
- /* OSPFv3 MIB Virtual Neighbors Table values: ospfv3VirtNbrTable */
- #define OSPFv3VIRTNBRIFINDEX 3
- #define OSPFv3VIRTNBRIFINSTID 4
- #define OSPFv3VIRTNBRADDRESSTYPE 5
- #define OSPFv3VIRTNBRADDRESS 6
- #define OSPFv3VIRTNBROPTIONS 7
- #define OSPFv3VIRTNBRSTATE 8
- #define OSPFv3VIRTNBREVENTS 9
- #define OSPFv3VIRTNBRLSRETRANSQLEN 10
- #define OSPFv3VIRTNBRHELLOSUPPRESSED 11
- #define OSPFv3VIRTNBRIFID 12
- #define OSPFv3VIRTNBRRESTARTHELPERSTATUS 13
- #define OSPFv3VIRTNBRRESTARTHELPERAGE 14
- #define OSPFv3VIRTNBRRESTARTHELPEREXITREASON 15
- /* OSPFv3 MIB Area Aggregate Table values: ospfv3AreaAggregateTable */
- #define OSPFv3AREAAGGREGATEROWSTATUS 6
- #define OSPFv3AREAAGGREGATEEFFECT 7
- #define OSPFv3AREAAGGREGATEROUTETAG 8
- /* SYNTAX Status from OSPF-MIB. */
- #define OSPF_STATUS_ENABLED 1
- #define OSPF_STATUS_DISABLED 2
- /* SNMP value hack. */
- #define COUNTER ASN_COUNTER
- #define INTEGER ASN_INTEGER
- #define GAUGE ASN_GAUGE
- #define UNSIGNED ASN_UNSIGNED
- #define TIMETICKS ASN_TIMETICKS
- #define IPADDRESS ASN_IPADDRESS
- #define STRING ASN_OCTET_STR
- /* For return values e.g. SNMP_INTEGER macro */
- SNMP_LOCAL_VARIABLES
- /* OSPFv3-MIB instances. */
- oid ospfv3_oid [] = { OSPFv3MIB };
- oid ospfv3_trap_oid [] = { OSPFv3MIB, 0 };
- /* Hook functions. */
- static u_char *ospfv3GeneralGroup (struct variable *, oid *, size_t *,
- int, size_t *, WriteMethod **);
- static u_char *ospfv3AreaEntry (struct variable *, oid *, size_t *,
- int, size_t *, WriteMethod **);
- static u_char *ospfv3WwLsdbEntry (struct variable *, oid *, size_t *,
- int, size_t *, WriteMethod **);
- static u_char *ospfv3NbrEntry (struct variable *, oid *, size_t *,
- int, size_t *, WriteMethod **);
- static u_char *ospfv3IfEntry (struct variable *, oid *, size_t *,
- int, size_t *, WriteMethod **);
- struct variable ospfv3_variables[] =
- {
- /* OSPF general variables */
- {OSPFv3ROUTERID, UNSIGNED, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 1}},
- {OSPFv3ADMINSTAT, INTEGER, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 2}},
- {OSPFv3VERSIONNUMBER, INTEGER, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 3}},
- {OSPFv3AREABDRRTRSTATUS, INTEGER, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 4}},
- {OSPFv3ASBDRRTRSTATUS, INTEGER, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 5}},
- {OSPFv3ASSCOPELSACOUNT, GAUGE, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 6}},
- {OSPFv3ASSCOPELSACHECKSUMSUM,UNSIGNED, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 7}},
- {OSPFv3ORIGINATENEWLSAS, COUNTER, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 8}},
- {OSPFv3RXNEWLSAS, COUNTER, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 9}},
- {OSPFv3EXTLSACOUNT, GAUGE, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 10}},
- {OSPFv3EXTAREALSDBLIMIT, INTEGER, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 11}},
- {OSPFv3EXITOVERFLOWINTERVAL, UNSIGNED, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 12}},
- {OSPFv3DEMANDEXTENSIONS, INTEGER, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 13}},
- {OSPFv3REFERENCEBANDWIDTH, UNSIGNED, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 14}},
- {OSPFv3RESTARTSUPPORT, INTEGER, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 15}},
- {OSPFv3RESTARTINTERVAL, UNSIGNED, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 16}},
- {OSPFv3RESTARTSTRICTLSACHECKING, INTEGER, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 17}},
- {OSPFv3RESTARTSTATUS, INTEGER, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 18}},
- {OSPFv3RESTARTAGE, UNSIGNED, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 19}},
- {OSPFv3RESTARTEXITREASON, INTEGER, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 20}},
- {OSPFv3NOTIFICATIONENABLE, INTEGER, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 21}},
- {OSPFv3STUBROUTERSUPPORT, INTEGER, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 22}},
- {OSPFv3STUBROUTERADVERTISEMENT, INTEGER, RWRITE, ospfv3GeneralGroup,
- 3, {1, 1, 23}},
- {OSPFv3DISCONTINUITYTIME, TIMETICKS, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 24}},
- {OSPFv3RESTARTTIME, TIMETICKS, RONLY, ospfv3GeneralGroup,
- 3, {1, 1, 25}},
- /* OSPFv3 Area Data Structure */
- {OSPFv3IMPORTASEXTERN, INTEGER, RWRITE, ospfv3AreaEntry,
- 4, {1, 2, 1, 2}},
- {OSPFv3AREASPFRUNS, COUNTER, RONLY, ospfv3AreaEntry,
- 4, {1, 2, 1, 3}},
- {OSPFv3AREABDRRTRCOUNT, GAUGE, RONLY, ospfv3AreaEntry,
- 4, {1, 2, 1, 4}},
- {OSPFv3AREAASBDRRTRCOUNT, GAUGE, RONLY, ospfv3AreaEntry,
- 4, {1, 2, 1, 5}},
- {OSPFv3AREASCOPELSACOUNT, GAUGE, RONLY, ospfv3AreaEntry,
- 4, {1, 2, 1, 6}},
- {OSPFv3AREASCOPELSACKSUMSUM, UNSIGNED, RONLY, ospfv3AreaEntry,
- 4, {1, 2, 1, 7}},
- {OSPFv3AREASUMMARY, INTEGER, RWRITE, ospfv3AreaEntry,
- 4, {1, 2, 1, 8}},
- {OSPFv3AREAROWSTATUS, INTEGER, RWRITE, ospfv3AreaEntry,
- 4, {1, 2, 1, 9}},
- {OSPFv3AREASTUBMETRIC, INTEGER, RWRITE, ospfv3AreaEntry,
- 4, {1, 2, 1, 10}},
- {OSPFv3AREANSSATRANSLATORROLE, INTEGER, RWRITE, ospfv3AreaEntry,
- 4, {1, 2, 1, 11}},
- {OSPFv3AREANSSATRANSLATORSTATE, INTEGER, RONLY, ospfv3AreaEntry,
- 4, {1, 2, 1, 12}},
- {OSPFv3AREANSSATRANSLATORSTABINTERVAL, UNSIGNED, RWRITE, ospfv3AreaEntry,
- 4, {1, 2, 1, 13}},
- {OSPFv3AREANSSATRANSLATOREVENTS, COUNTER, RONLY, ospfv3AreaEntry,
- 4, {1, 2, 1, 14}},
- {OSPFv3AREASTUBMETRICTYPE, INTEGER, RWRITE, ospfv3AreaEntry,
- 4, {1, 2, 1, 15}},
- {OSPFv3AREATEENABLED, INTEGER, RWRITE, ospfv3AreaEntry,
- 4, {1, 2, 1, 16}},
- /* OSPFv3 AS LSDB */
- {OSPFv3WWLSDBSEQUENCE | OSPFv3WWASTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 3, 1, 4}},
- {OSPFv3WWLSDBAGE | OSPFv3WWASTABLE, UNSIGNED, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 3, 1, 5}},
- {OSPFv3WWLSDBCHECKSUM | OSPFv3WWASTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 3, 1, 6}},
- {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWASTABLE, STRING, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 3, 1, 7}},
- {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWASTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 3, 1, 8}},
- /* OSPFv3 Area LSDB */
- {OSPFv3WWLSDBSEQUENCE | OSPFv3WWAREATABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 4, 1, 5}},
- {OSPFv3WWLSDBAGE | OSPFv3WWAREATABLE, UNSIGNED, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 4, 1, 6}},
- {OSPFv3WWLSDBCHECKSUM | OSPFv3WWAREATABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 4, 1, 7}},
- {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWAREATABLE, STRING, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 4, 1, 8}},
- {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWAREATABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 4, 1, 9}},
- /* OSPFv3 Link LSDB */
- {OSPFv3WWLSDBSEQUENCE | OSPFv3WWLINKTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 5, 1, 6}},
- {OSPFv3WWLSDBAGE | OSPFv3WWLINKTABLE, UNSIGNED, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 5, 1, 7}},
- {OSPFv3WWLSDBCHECKSUM | OSPFv3WWLINKTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 5, 1, 8}},
- {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWLINKTABLE, STRING, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 5, 1, 9}},
- {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWLINKTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
- 4, {1, 5, 1, 10}},
- /* OSPFv3 interfaces */
- {OSPFv3IFAREAID, UNSIGNED, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 3}},
- {OSPFv3IFTYPE, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 4}},
- {OSPFv3IFADMINSTATUS, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 5}},
- {OSPFv3IFRTRPRIORITY, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 6}},
- {OSPFv3IFTRANSITDELAY, UNSIGNED, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 7}},
- {OSPFv3IFRETRANSINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 8}},
- {OSPFv3IFHELLOINTERVAL, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 9}},
- {OSPFv3IFRTRDEADINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 10}},
- {OSPFv3IFPOLLINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 11}},
- {OSPFv3IFSTATE, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 12}},
- {OSPFv3IFDESIGNATEDROUTER, UNSIGNED, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 13}},
- {OSPFv3IFBACKUPDESIGNATEDROUTER, UNSIGNED, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 14}},
- {OSPFv3IFEVENTS, COUNTER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 15}},
- {OSPFv3IFROWSTATUS, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 16}},
- {OSPFv3IFDEMAND, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 17}},
- {OSPFv3IFMETRICVALUE, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 18}},
- {OSPFv3IFLINKSCOPELSACOUNT, GAUGE, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 19}},
- {OSPFv3IFLINKLSACKSUMSUM, UNSIGNED, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 20}},
- {OSPFv3IFDEMANDNBRPROBE, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 21}},
- {OSPFv3IFDEMANDNBRPROBERETRANSLIMIT, UNSIGNED, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 22}},
- {OSPFv3IFDEMANDNBRPROBEINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 23}},
- {OSPFv3IFTEDISABLED, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 24}},
- {OSPFv3IFLINKLSASUPPRESSION, INTEGER, RONLY, ospfv3IfEntry,
- 4, {1, 7, 1, 25}},
- /* OSPFv3 neighbors */
- {OSPFv3NBRADDRESSTYPE, INTEGER, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 4}},
- {OSPFv3NBRADDRESS, STRING, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 5}},
- {OSPFv3NBROPTIONS, INTEGER, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 6}},
- {OSPFv3NBRPRIORITY, INTEGER, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 7}},
- {OSPFv3NBRSTATE, INTEGER, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 8}},
- {OSPFv3NBREVENTS, COUNTER, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 9}},
- {OSPFv3NBRLSRETRANSQLEN, GAUGE, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 10}},
- {OSPFv3NBRHELLOSUPPRESSED, INTEGER, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 11}},
- {OSPFv3NBRIFID, INTEGER, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 12}},
- {OSPFv3NBRRESTARTHELPERSTATUS, INTEGER, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 13}},
- {OSPFv3NBRRESTARTHELPERAGE, UNSIGNED, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 14}},
- {OSPFv3NBRRESTARTHELPEREXITREASON, INTEGER, RONLY, ospfv3NbrEntry,
- 4, {1, 9, 1, 15}},
- };
- static u_char *
- ospfv3GeneralGroup (struct variable *v, oid *name, size_t *length,
- int exact, size_t *var_len, WriteMethod **write_method)
- {
- u_int16_t sum;
- u_int32_t count;
- struct ospf6_lsa *lsa = NULL;
- /* Check whether the instance identifier is valid */
- if (smux_header_generic (v, name, length, exact, var_len, write_method)
- == MATCH_FAILED)
- return NULL;
- /* Return the current value of the variable */
- switch (v->magic)
- {
- case OSPFv3ROUTERID:
- /* Router-ID of this OSPF instance. */
- if (ospf6)
- return SNMP_INTEGER (ntohl (ospf6->router_id));
- return SNMP_INTEGER (0);
- case OSPFv3ADMINSTAT:
- if (ospf6)
- return SNMP_INTEGER (CHECK_FLAG (ospf6->flag, OSPF6_DISABLED)?
- OSPF_STATUS_DISABLED:OSPF_STATUS_ENABLED);
- return SNMP_INTEGER (OSPF_STATUS_DISABLED);
- case OSPFv3VERSIONNUMBER:
- return SNMP_INTEGER (3);
- case OSPFv3AREABDRRTRSTATUS:
- if (ospf6)
- return SNMP_INTEGER (ospf6_is_router_abr (ospf6)?SNMP_TRUE:SNMP_FALSE);
- return SNMP_INTEGER (SNMP_FALSE);
- case OSPFv3ASBDRRTRSTATUS:
- if (ospf6)
- return SNMP_INTEGER (ospf6_asbr_is_asbr (ospf6)?SNMP_TRUE:SNMP_FALSE);
- return SNMP_INTEGER (SNMP_FALSE);
- case OSPFv3ASSCOPELSACOUNT:
- if (ospf6)
- return SNMP_INTEGER (ospf6->lsdb->count);
- return SNMP_INTEGER (0);
- case OSPFv3ASSCOPELSACHECKSUMSUM:
- if (ospf6)
- {
- for (sum = 0, lsa = ospf6_lsdb_head (ospf6->lsdb);
- lsa;
- lsa = ospf6_lsdb_next (lsa))
- sum += ntohs (lsa->header->checksum);
- return SNMP_INTEGER (sum);
- }
- return SNMP_INTEGER (0);
- case OSPFv3ORIGINATENEWLSAS:
- return SNMP_INTEGER (0); /* Don't know where to get this value... */
- case OSPFv3RXNEWLSAS:
- return SNMP_INTEGER (0); /* Don't know where to get this value... */
- case OSPFv3EXTLSACOUNT:
- if (ospf6)
- {
- for (count = 0, lsa = ospf6_lsdb_type_head (htons (OSPF6_LSTYPE_AS_EXTERNAL),
- ospf6->lsdb);
- lsa;
- lsa = ospf6_lsdb_type_next (htons (OSPF6_LSTYPE_AS_EXTERNAL),
- lsa))
- count += 1;
- return SNMP_INTEGER (count);
- }
- return SNMP_INTEGER (0);
- case OSPFv3EXTAREALSDBLIMIT:
- return SNMP_INTEGER (-1);
- case OSPFv3EXITOVERFLOWINTERVAL:
- return SNMP_INTEGER (0); /* Not supported */
- case OSPFv3DEMANDEXTENSIONS:
- return SNMP_INTEGER (0); /* Not supported */
- case OSPFv3REFERENCEBANDWIDTH:
- return SNMP_INTEGER (100000);
- case OSPFv3RESTARTSUPPORT:
- case OSPFv3RESTARTINTERVAL:
- case OSPFv3RESTARTSTRICTLSACHECKING:
- case OSPFv3RESTARTSTATUS:
- case OSPFv3RESTARTAGE:
- case OSPFv3RESTARTEXITREASON:
- case OSPFv3NOTIFICATIONENABLE:
- case OSPFv3STUBROUTERSUPPORT:
- case OSPFv3STUBROUTERADVERTISEMENT:
- case OSPFv3DISCONTINUITYTIME:
- case OSPFv3RESTARTTIME:
- /* TODO: Not implemented */
- return NULL;
- }
- return NULL;
- }
- static u_char *
- ospfv3AreaEntry (struct variable *v, oid *name, size_t *length,
- int exact, size_t *var_len, WriteMethod **write_method)
- {
- struct ospf6_area *oa, *area = NULL;
- struct ospf6_lsa *lsa = NULL;
- u_int32_t area_id = 0;
- u_int32_t count;
- u_int16_t sum;
- struct listnode *node;
- unsigned int len;
- char a[16];
- struct ospf6_route *ro;
- if (ospf6 == NULL)
- return NULL;
- if (smux_header_table(v, name, length, exact, var_len, write_method)
- == MATCH_FAILED)
- return NULL;
- len = *length - v->namelen;
- len = (len >= 1 ? sizeof 1 : 0);
- if (exact && len != 1)
- return NULL;
- if (len)
- area_id = htonl (name[v->namelen]);
- inet_ntop (AF_INET, &area_id, a, sizeof (a));
- zlog_debug ("SNMP access by area: %s, exact=%d len=%d length=%lu",
- a, exact, len, (u_long)*length);
- for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
- {
- if (area == NULL)
- {
- if (len == 0) /* return first area entry */
- area = oa;
- else if (exact && ntohl (oa->area_id) == ntohl (area_id))
- area = oa;
- else if (ntohl (oa->area_id) > ntohl (area_id))
- area = oa;
- }
- }
- if (area == NULL)
- return NULL;
- *length = v->namelen + 1;
- name[v->namelen] = ntohl (area->area_id);
- inet_ntop (AF_INET, &area->area_id, a, sizeof (a));
- zlog_debug ("SNMP found area: %s, exact=%d len=%d length=%lu",
- a, exact, len, (u_long)*length);
- switch (v->magic)
- {
- case OSPFv3IMPORTASEXTERN:
- /* No NSSA support */
- return SNMP_INTEGER (IS_AREA_STUB(area)?2:1);
- case OSPFv3AREASPFRUNS:
- return SNMP_INTEGER (area->spf_calculation);
- case OSPFv3AREABDRRTRCOUNT:
- case OSPFv3AREAASBDRRTRCOUNT:
- count = 0;
- for (ro = ospf6_route_head (ospf6->brouter_table); ro;
- ro = ospf6_route_next (ro))
- {
- if (ntohl (ro->path.area_id) != ntohl (area->area_id)) continue;
- if (v->magic == OSPFv3AREABDRRTRCOUNT &&
- CHECK_FLAG (ro->path.router_bits, OSPF6_ROUTER_BIT_B))
- count++;
- if (v->magic == OSPFv3AREAASBDRRTRCOUNT &&
- CHECK_FLAG (ro->path.router_bits, OSPF6_ROUTER_BIT_E))
- count++;
- }
- return SNMP_INTEGER (count);
- case OSPFv3AREASCOPELSACOUNT:
- return SNMP_INTEGER (area->lsdb->count);
- case OSPFv3AREASCOPELSACKSUMSUM:
- for (sum = 0, lsa = ospf6_lsdb_head (area->lsdb);
- lsa;
- lsa = ospf6_lsdb_next (lsa))
- sum += ntohs (lsa->header->checksum);
- return SNMP_INTEGER (sum);
- case OSPFv3AREASUMMARY:
- return SNMP_INTEGER (2); /* sendAreaSummary */
- case OSPFv3AREAROWSTATUS:
- return SNMP_INTEGER (1); /* Active */
- case OSPFv3AREASTUBMETRIC:
- case OSPFv3AREANSSATRANSLATORROLE:
- case OSPFv3AREANSSATRANSLATORSTATE:
- case OSPFv3AREANSSATRANSLATORSTABINTERVAL:
- case OSPFv3AREANSSATRANSLATOREVENTS:
- case OSPFv3AREASTUBMETRICTYPE:
- case OSPFv3AREATEENABLED:
- /* Not implemented. */
- return NULL;
- }
- return NULL;
- }
- static int
- if_icmp_func (struct interface *ifp1, struct interface *ifp2)
- {
- return (ifp1->ifindex - ifp2->ifindex);
- }
- static u_char *
- ospfv3WwLsdbEntry (struct variable *v, oid *name, size_t *length,
- int exact, size_t *var_len, WriteMethod **write_method)
- {
- struct ospf6_lsa *lsa = NULL;
- u_int32_t ifindex, area_id, id, instid, adv_router;
- u_int16_t type;
- int len;
- oid *offset;
- int offsetlen;
- char a[16], b[16], c[16];
- struct ospf6_area *oa;
- struct listnode *node;
- struct interface *iif;
- struct ospf6_interface *oi = NULL;
- struct list *ifslist;
- if (smux_header_table(v, name, length, exact, var_len, write_method)
- == MATCH_FAILED)
- return NULL;
- instid = ifindex = area_id = type = id = adv_router = 0;
- /* Check OSPFv3 instance. */
- if (ospf6 == NULL)
- return NULL;
- /* Get variable length. */
- offset = name + v->namelen;
- offsetlen = *length - v->namelen;
- if (exact && (v->magic & OSPFv3WWASTABLE) && offsetlen != 3)
- return NULL;
- if (exact && (v->magic & OSPFv3WWAREATABLE) && offsetlen != 4)
- return NULL;
- if (exact && (v->magic & OSPFv3WWLINKTABLE) && offsetlen != 5)
- return NULL;
- if (v->magic & OSPFv3WWLINKTABLE)
- {
- /* Parse ifindex */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- ifindex = *offset;
- offset += len;
- offsetlen -= len;
- /* Parse instance ID */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- instid = *offset;
- offset += len;
- offsetlen -= len;
- }
- else if (v->magic & OSPFv3WWAREATABLE)
- {
- /* Parse area-id */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- area_id = htonl (*offset);
- offset += len;
- offsetlen -= len;
- }
- /* Parse type */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- type = htons (*offset);
- offset += len;
- offsetlen -= len;
- /* Parse Router-ID */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- adv_router = htonl (*offset);
- offset += len;
- offsetlen -= len;
- /* Parse LS-ID */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- id = htonl (*offset);
- offset += len;
- offsetlen -= len;
- if (exact)
- {
- if (v->magic & OSPFv3WWASTABLE)
- {
- lsa = ospf6_lsdb_lookup (type, id, adv_router, ospf6->lsdb);
- }
- else if (v->magic & OSPFv3WWAREATABLE)
- {
- oa = ospf6_area_lookup (area_id, ospf6);
- lsa = ospf6_lsdb_lookup (type, id, adv_router, oa->lsdb);
- }
- else if (v->magic & OSPFv3WWLINKTABLE)
- {
- oi = ospf6_interface_lookup_by_ifindex (ifindex);
- if (oi->instance_id != instid) return NULL;
- lsa = ospf6_lsdb_lookup (type, id, adv_router, oi->lsdb);
- }
- }
- else
- {
- if (v->magic & OSPFv3WWASTABLE)
- {
- if (ospf6->lsdb->count)
- lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
- ospf6->lsdb);
- }
- else if (v->magic & OSPFv3WWAREATABLE)
- for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
- {
- if (oa->area_id < area_id)
- continue;
- if (oa->lsdb->count)
- lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
- oa->lsdb);
- if (lsa) break;
- type = 0;
- id = 0;
- adv_router = 0;
- }
- else if (v->magic & OSPFv3WWLINKTABLE)
- {
- /* We build a sorted list of interfaces */
- ifslist = list_new ();
- if (!ifslist) return NULL;
- ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
- for (ALL_LIST_ELEMENTS_RO (iflist, node, iif))
- listnode_add_sort (ifslist, iif);
-
- for (ALL_LIST_ELEMENTS_RO (ifslist, node, iif))
- {
- if (!iif->ifindex) continue;
- oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
- if (!oi) continue;
- if (iif->ifindex < ifindex) continue;
- if (oi->instance_id < instid) continue;
-
- if (oi->lsdb->count)
- lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
- oi->lsdb);
- if (lsa) break;
- type = 0;
- id = 0;
- adv_router = 0;
- oi = NULL;
- }
- list_delete_all_node (ifslist);
- }
- }
- if (! lsa)
- return NULL;
- /* Add indexes */
- if (v->magic & OSPFv3WWASTABLE)
- {
- *length = v->namelen + 3;
- offset = name + v->namelen;
- }
- else if (v->magic & OSPFv3WWAREATABLE)
- {
- *length = v->namelen + 4;
- offset = name + v->namelen;
- *offset = ntohl (oa->area_id);
- offset++;
- }
- else if (v->magic & OSPFv3WWLINKTABLE)
- {
- *length = v->namelen + 5;
- offset = name + v->namelen;
- *offset = oi->interface->ifindex;
- offset++;
- *offset = oi->instance_id;
- offset++;
- }
- *offset = ntohs (lsa->header->type);
- offset++;
- *offset = ntohl (lsa->header->adv_router);
- offset++;
- *offset = ntohl (lsa->header->id);
- offset++;
- /* Return the current value of the variable */
- switch (v->magic & OSPFv3WWCOLUMN)
- {
- case OSPFv3WWLSDBSEQUENCE:
- return SNMP_INTEGER (ntohl (lsa->header->seqnum));
- break;
- case OSPFv3WWLSDBAGE:
- ospf6_lsa_age_current (lsa);
- return SNMP_INTEGER (ntohs (lsa->header->age));
- break;
- case OSPFv3WWLSDBCHECKSUM:
- return SNMP_INTEGER (ntohs (lsa->header->checksum));
- break;
- case OSPFv3WWLSDBADVERTISEMENT:
- *var_len = ntohs (lsa->header->length);
- return (u_char *) lsa->header;
- break;
- case OSPFv3WWLSDBTYPEKNOWN:
- return SNMP_INTEGER (OSPF6_LSA_IS_KNOWN (lsa->header->type) ?
- SNMP_TRUE : SNMP_FALSE);
- break;
- }
- return NULL;
- }
- static u_char *
- ospfv3IfEntry (struct variable *v, oid *name, size_t *length,
- int exact, size_t *var_len, WriteMethod **write_method)
- {
- unsigned int ifindex, instid;
- struct ospf6_interface *oi = NULL;
- struct ospf6_lsa *lsa = NULL;
- struct interface *iif;
- struct listnode *i;
- struct list *ifslist;
- oid *offset;
- int offsetlen, len;
- u_int32_t sum;
- if (smux_header_table (v, name, length, exact, var_len, write_method)
- == MATCH_FAILED)
- return NULL;
- ifindex = instid = 0;
- /* Check OSPFv3 instance. */
- if (ospf6 == NULL)
- return NULL;
- /* Get variable length. */
- offset = name + v->namelen;
- offsetlen = *length - v->namelen;
- if (exact && offsetlen != 2)
- return NULL;
- /* Parse if index */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- ifindex = *offset;
- offset += len;
- offsetlen -= len;
- /* Parse instance ID */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- instid = *offset;
- offset += len;
- offsetlen -= len;
- if (exact)
- {
- oi = ospf6_interface_lookup_by_ifindex (ifindex);
- if (oi->instance_id != instid) return NULL;
- }
- else
- {
- /* We build a sorted list of interfaces */
- ifslist = list_new ();
- if (!ifslist) return NULL;
- ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
- for (ALL_LIST_ELEMENTS_RO (iflist, i, iif))
- listnode_add_sort (ifslist, iif);
- for (ALL_LIST_ELEMENTS_RO (ifslist, i, iif))
- {
- if (!iif->ifindex) continue;
- oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
- if (!oi) continue;
- if (iif->ifindex > ifindex ||
- (iif->ifindex == ifindex &&
- (oi->instance_id > instid)))
- break;
- oi = NULL;
- }
- list_delete_all_node (ifslist);
- }
- if (!oi) return NULL;
- /* Add Index (IfIndex, IfInstId) */
- *length = v->namelen + 2;
- offset = name + v->namelen;
- *offset = oi->interface->ifindex;
- offset++;
- *offset = oi->instance_id;
- offset++;
- /* Return the current value of the variable */
- switch (v->magic)
- {
- case OSPFv3IFAREAID:
- if (oi->area)
- return SNMP_INTEGER (ntohl (oi->area->area_id));
- break;
- case OSPFv3IFTYPE:
- if (if_is_broadcast (oi->interface))
- return SNMP_INTEGER (1);
- else if (if_is_pointopoint (oi->interface))
- return SNMP_INTEGER (3);
- else break; /* Unknown, don't put anything */
- case OSPFv3IFADMINSTATUS:
- if (oi->area)
- return SNMP_INTEGER (OSPF_STATUS_ENABLED);
- return SNMP_INTEGER (OSPF_STATUS_DISABLED);
- case OSPFv3IFRTRPRIORITY:
- return SNMP_INTEGER (oi->priority);
- case OSPFv3IFTRANSITDELAY:
- return SNMP_INTEGER (oi->transdelay);
- case OSPFv3IFRETRANSINTERVAL:
- return SNMP_INTEGER (oi->rxmt_interval);
- case OSPFv3IFHELLOINTERVAL:
- return SNMP_INTEGER (oi->hello_interval);
- case OSPFv3IFRTRDEADINTERVAL:
- return SNMP_INTEGER (oi->dead_interval);
- case OSPFv3IFPOLLINTERVAL:
- /* No support for NBMA */
- break;
- case OSPFv3IFSTATE:
- return SNMP_INTEGER (oi->state);
- case OSPFv3IFDESIGNATEDROUTER:
- return SNMP_INTEGER (ntohl (oi->drouter));
- case OSPFv3IFBACKUPDESIGNATEDROUTER:
- return SNMP_INTEGER (ntohl (oi->bdrouter));
- case OSPFv3IFEVENTS:
- return SNMP_INTEGER (oi->state_change);
- case OSPFv3IFROWSTATUS:
- return SNMP_INTEGER (1);
- case OSPFv3IFDEMAND:
- return SNMP_INTEGER (SNMP_FALSE);
- case OSPFv3IFMETRICVALUE:
- return SNMP_INTEGER (oi->cost);
- case OSPFv3IFLINKSCOPELSACOUNT:
- return SNMP_INTEGER (oi->lsdb->count);
- case OSPFv3IFLINKLSACKSUMSUM:
- for (sum = 0, lsa = ospf6_lsdb_head (oi->lsdb);
- lsa;
- lsa = ospf6_lsdb_next (lsa))
- sum += ntohs (lsa->header->checksum);
- return SNMP_INTEGER (sum);
- case OSPFv3IFDEMANDNBRPROBE:
- case OSPFv3IFDEMANDNBRPROBERETRANSLIMIT:
- case OSPFv3IFDEMANDNBRPROBEINTERVAL:
- case OSPFv3IFTEDISABLED:
- case OSPFv3IFLINKLSASUPPRESSION:
- /* Not implemented. Only works if all the last ones are not
- implemented! */
- return NULL;
- }
- /* Try an internal getnext. Some columns are missing in this table. */
- if (!exact && (name[*length-1] < MAX_SUBID))
- return ospfv3IfEntry(v, name, length,
- exact, var_len, write_method);
- return NULL;
- }
- static u_char *
- ospfv3NbrEntry (struct variable *v, oid *name, size_t *length,
- int exact, size_t *var_len, WriteMethod **write_method)
- {
- unsigned int ifindex, instid, rtrid;
- struct ospf6_interface *oi = NULL;
- struct ospf6_neighbor *on = NULL;
- struct interface *iif;
- struct listnode *i, *j;
- struct list *ifslist;
- oid *offset;
- int offsetlen, len;
- if (smux_header_table (v, name, length, exact, var_len, write_method)
- == MATCH_FAILED)
- return NULL;
- ifindex = instid = rtrid = 0;
- /* Check OSPFv3 instance. */
- if (ospf6 == NULL)
- return NULL;
- /* Get variable length. */
- offset = name + v->namelen;
- offsetlen = *length - v->namelen;
- if (exact && offsetlen != 3)
- return NULL;
- /* Parse if index */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- ifindex = *offset;
- offset += len;
- offsetlen -= len;
- /* Parse instance ID */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- instid = *offset;
- offset += len;
- offsetlen -= len;
- /* Parse router ID */
- len = (offsetlen < 1 ? 0 : 1);
- if (len)
- rtrid = htonl (*offset);
- offset += len;
- offsetlen -= len;
- if (exact)
- {
- oi = ospf6_interface_lookup_by_ifindex (ifindex);
- on = ospf6_neighbor_lookup (rtrid, oi);
- if (oi->instance_id != instid) return NULL;
- }
- else
- {
- /* We build a sorted list of interfaces */
- ifslist = list_new ();
- if (!ifslist) return NULL;
- ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
- for (ALL_LIST_ELEMENTS_RO (iflist, i, iif))
- listnode_add_sort (ifslist, iif);
- for (ALL_LIST_ELEMENTS_RO (ifslist, i, iif))
- {
- if (!iif->ifindex) continue;
- oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
- if (!oi) continue;
- for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, j, on)) {
- if (iif->ifindex > ifindex ||
- (iif->ifindex == ifindex &&
- (oi->instance_id > instid ||
- (oi->instance_id == instid &&
- ntohl (on->router_id) > ntohl (rtrid)))))
- break;
- }
- if (on) break;
- oi = on = NULL;
- }
- list_delete_all_node (ifslist);
- }
- if (!oi || !on) return NULL;
- /* Add Index (IfIndex, IfInstId, RtrId) */
- *length = v->namelen + 3;
- offset = name + v->namelen;
- *offset = oi->interface->ifindex;
- offset++;
- *offset = oi->instance_id;
- offset++;
- *offset = ntohl (on->router_id);
- offset++;
- /* Return the current value of the variable */
- switch (v->magic)
- {
- case OSPFv3NBRADDRESSTYPE:
- return SNMP_INTEGER (2); /* IPv6 only */
- case OSPFv3NBRADDRESS:
- *var_len = sizeof (struct in6_addr);
- return (u_char *) &on->linklocal_addr;
- case OSPFv3NBROPTIONS:
- return SNMP_INTEGER (on->options[2]);
- case OSPFv3NBRPRIORITY:
- return SNMP_INTEGER (on->priority);
- case OSPFv3NBRSTATE:
- return SNMP_INTEGER (on->state);
- case OSPFv3NBREVENTS:
- return SNMP_INTEGER (on->state_change);
- case OSPFv3NBRLSRETRANSQLEN:
- return SNMP_INTEGER (on->retrans_list->count);
- case OSPFv3NBRHELLOSUPPRESSED:
- return SNMP_INTEGER (SNMP_FALSE);
- case OSPFv3NBRIFID:
- return SNMP_INTEGER (on->ifindex);
- case OSPFv3NBRRESTARTHELPERSTATUS:
- case OSPFv3NBRRESTARTHELPERAGE:
- case OSPFv3NBRRESTARTHELPEREXITREASON:
- /* Not implemented. Only works if all the last ones are not
- implemented! */
- return NULL;
- }
- return NULL;
- }
- /* OSPF Traps. */
- #define NBRSTATECHANGE 2
- #define IFSTATECHANGE 10
- static struct trap_object ospf6NbrTrapList[] =
- {
- {-3, {1, 1, OSPFv3ROUTERID}},
- {4, {1, 9, 1, OSPFv3NBRADDRESSTYPE}},
- {4, {1, 9, 1, OSPFv3NBRADDRESS}},
- {4, {1, 9, 1, OSPFv3NBRSTATE}}
- };
- static struct trap_object ospf6IfTrapList[] =
- {
- {-3, {1, 1, OSPFv3ROUTERID}},
- {4, {1, 7, 1, OSPFv3IFSTATE}},
- {4, {1, 7, 1, OSPFv3IFADMINSTATUS}},
- {4, {1, 7, 1, OSPFv3IFAREAID}}
- };
- void
- ospf6TrapNbrStateChange (struct ospf6_neighbor *on)
- {
- oid index[3];
- index[0] = on->ospf6_if->interface->ifindex;
- index[1] = on->ospf6_if->instance_id;
- index[2] = ntohl (on->router_id);
- smux_trap (ospfv3_variables, sizeof ospfv3_variables / sizeof (struct variable),
- ospfv3_trap_oid, sizeof ospfv3_trap_oid / sizeof (oid),
- ospfv3_oid, sizeof ospfv3_oid / sizeof (oid),
- index, 3,
- ospf6NbrTrapList,
- sizeof ospf6NbrTrapList / sizeof (struct trap_object),
- NBRSTATECHANGE);
- }
- void
- ospf6TrapIfStateChange (struct ospf6_interface *oi)
- {
- oid index[2];
- index[0] = oi->interface->ifindex;
- index[1] = oi->instance_id;
- smux_trap (ospfv3_variables, sizeof ospfv3_variables / sizeof (struct variable),
- ospfv3_trap_oid, sizeof ospfv3_trap_oid / sizeof (oid),
- ospfv3_oid, sizeof ospfv3_oid / sizeof (oid),
- index, 2,
- ospf6IfTrapList,
- sizeof ospf6IfTrapList / sizeof (struct trap_object),
- IFSTATECHANGE);
- }
- /* Register OSPFv3-MIB. */
- void
- ospf6_snmp_init (struct thread_master *master)
- {
- smux_init (master);
- REGISTER_MIB ("OSPFv3MIB", ospfv3_variables, variable, ospfv3_oid);
- }
- #endif /* HAVE_SNMP */
|