Annotation of embedaddon/quagga/ospf6d/ospf6_snmp.c, revision 1.1.1.2

1.1       misho       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:  *
                     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.  
                     20:  */
                     21: 
                     22: #include <zebra.h>
                     23: 
                     24: #ifdef HAVE_SNMP
                     25: 
                     26: #include <net-snmp/net-snmp-config.h>
                     27: #include <net-snmp/net-snmp-includes.h>
                     28: 
                     29: #include "log.h"
                     30: #include "vty.h"
                     31: #include "linklist.h"
                     32: #include "smux.h"
                     33: 
                     34: #include "ospf6_proto.h"
                     35: #include "ospf6_lsa.h"
                     36: #include "ospf6_lsdb.h"
                     37: #include "ospf6_route.h"
                     38: #include "ospf6_top.h"
                     39: #include "ospf6_area.h"
                     40: #include "ospf6_interface.h"
                     41: #include "ospf6_message.h"
                     42: #include "ospf6_neighbor.h"
                     43: #include "ospf6d.h"
                     44: #include "ospf6_snmp.h"
                     45: 
                     46: /* OSPFv3-MIB */
1.1.1.2 ! misho      47: #define OSPFv3MIB 1,3,6,1,2,1,191
1.1       misho      48: 
                     49: /* OSPFv3 MIB General Group values. */
                     50: #define OSPFv3ROUTERID                   1
                     51: #define OSPFv3ADMINSTAT                  2
                     52: #define OSPFv3VERSIONNUMBER              3
                     53: #define OSPFv3AREABDRRTRSTATUS           4
                     54: #define OSPFv3ASBDRRTRSTATUS             5
                     55: #define OSPFv3ASSCOPELSACOUNT            6
                     56: #define OSPFv3ASSCOPELSACHECKSUMSUM      7
                     57: #define OSPFv3ORIGINATENEWLSAS           8
                     58: #define OSPFv3RXNEWLSAS                  9
                     59: #define OSPFv3EXTLSACOUNT               10
                     60: #define OSPFv3EXTAREALSDBLIMIT          11
1.1.1.2 ! misho      61: #define OSPFv3EXITOVERFLOWINTERVAL      12
        !            62: #define OSPFv3DEMANDEXTENSIONS          13
        !            63: #define OSPFv3REFERENCEBANDWIDTH        14
        !            64: #define OSPFv3RESTARTSUPPORT            15
        !            65: #define OSPFv3RESTARTINTERVAL           16
        !            66: #define OSPFv3RESTARTSTRICTLSACHECKING  17
        !            67: #define OSPFv3RESTARTSTATUS             18
        !            68: #define OSPFv3RESTARTAGE                19
        !            69: #define OSPFv3RESTARTEXITREASON         20
        !            70: #define OSPFv3NOTIFICATIONENABLE        21
        !            71: #define OSPFv3STUBROUTERSUPPORT         22
        !            72: #define OSPFv3STUBROUTERADVERTISEMENT   23
        !            73: #define OSPFv3DISCONTINUITYTIME         24
        !            74: #define OSPFv3RESTARTTIME               25
1.1       misho      75: 
1.1.1.2 ! misho      76: /* OSPFv3 MIB Area Table values: ospfv3AreaTable */
1.1       misho      77: #define OSPFv3IMPORTASEXTERN             2
                     78: #define OSPFv3AREASPFRUNS                3
                     79: #define OSPFv3AREABDRRTRCOUNT            4
                     80: #define OSPFv3AREAASBDRRTRCOUNT          5
                     81: #define OSPFv3AREASCOPELSACOUNT          6
                     82: #define OSPFv3AREASCOPELSACKSUMSUM       7
                     83: #define OSPFv3AREASUMMARY                8
1.1.1.2 ! misho      84: #define OSPFv3AREAROWSTATUS              9
        !            85: #define OSPFv3AREASTUBMETRIC            10
1.1       misho      86: #define OSPFv3AREANSSATRANSLATORROLE    11
                     87: #define OSPFv3AREANSSATRANSLATORSTATE   12
1.1.1.2 ! misho      88: #define OSPFv3AREANSSATRANSLATORSTABINTERVAL    13
1.1       misho      89: #define OSPFv3AREANSSATRANSLATOREVENTS  14
                     90: #define OSPFv3AREASTUBMETRICTYPE        15
1.1.1.2 ! misho      91: #define OSPFv3AREATEENABLED             16
1.1       misho      92: 
1.1.1.2 ! misho      93: /* OSPFv3 MIB * Lsdb Table values: ospfv3*LsdbTable */
        !            94: #define OSPFv3WWLSDBSEQUENCE             1
        !            95: #define OSPFv3WWLSDBAGE                  2
        !            96: #define OSPFv3WWLSDBCHECKSUM             3
        !            97: #define OSPFv3WWLSDBADVERTISEMENT        4
        !            98: #define OSPFv3WWLSDBTYPEKNOWN            5
        !            99: 
        !           100: /* Three first bits are to identify column */
        !           101: #define OSPFv3WWCOLUMN 0x7
        !           102: /* Then we use other bits to identify table */
        !           103: #define OSPFv3WWASTABLE   (1 << 3)
        !           104: #define OSPFv3WWAREATABLE (1 << 4)
        !           105: #define OSPFv3WWLINKTABLE (1 << 5)
        !           106: #define OSPFv3WWVIRTLINKTABLE (1 << 6)
        !           107: 
        !           108: /* OSPFv3 MIB Host Table values: ospfv3HostTable */
        !           109: #define OSPFv3HOSTMETRIC                 3
        !           110: #define OSPFv3HOSTROWSTATUS              4
        !           111: #define OSPFv3HOSTAREAID                 5
        !           112: 
        !           113: /* OSPFv3 MIB Interface Table values: ospfv3IfTable */
        !           114: #define OSPFv3IFAREAID                   3
        !           115: #define OSPFv3IFTYPE                     4
        !           116: #define OSPFv3IFADMINSTATUS              5
        !           117: #define OSPFv3IFRTRPRIORITY              6
        !           118: #define OSPFv3IFTRANSITDELAY             7
        !           119: #define OSPFv3IFRETRANSINTERVAL          8
        !           120: #define OSPFv3IFHELLOINTERVAL            9
        !           121: #define OSPFv3IFRTRDEADINTERVAL         10
        !           122: #define OSPFv3IFPOLLINTERVAL            11
        !           123: #define OSPFv3IFSTATE                   12
        !           124: #define OSPFv3IFDESIGNATEDROUTER        13
        !           125: #define OSPFv3IFBACKUPDESIGNATEDROUTER  14
        !           126: #define OSPFv3IFEVENTS                  15
        !           127: #define OSPFv3IFROWSTATUS               16
        !           128: #define OSPFv3IFDEMAND                  17
        !           129: #define OSPFv3IFMETRICVALUE             18
        !           130: #define OSPFv3IFLINKSCOPELSACOUNT       19
        !           131: #define OSPFv3IFLINKLSACKSUMSUM         20
        !           132: #define OSPFv3IFDEMANDNBRPROBE          21
        !           133: #define OSPFv3IFDEMANDNBRPROBERETRANSLIMIT 22
        !           134: #define OSPFv3IFDEMANDNBRPROBEINTERVAL  23
        !           135: #define OSPFv3IFTEDISABLED              24
        !           136: #define OSPFv3IFLINKLSASUPPRESSION      25
        !           137: 
        !           138: /* OSPFv3 MIB Virtual Interface Table values: ospfv3VirtIfTable */
        !           139: #define OSPFv3VIRTIFINDEX           3
        !           140: #define OSPFv3VIRTIFINSTID          4
        !           141: #define OSPFv3VIRTIFTRANSITDELAY    5
        !           142: #define OSPFv3VIRTIFRETRANSINTERVAL 6
        !           143: #define OSPFv3VIRTIFHELLOINTERVAL   7
        !           144: #define OSPFv3VIRTIFRTRDEADINTERVAL 8
        !           145: #define OSPFv3VIRTIFSTATE           9
        !           146: #define OSPFv3VIRTIFEVENTS         10
        !           147: #define OSPFv3VIRTIFROWSTATUS      11
        !           148: #define OSPFv3VIRTIFLINKSCOPELSACOUNT 12
        !           149: #define OSPFv3VIRTIFLINKLSACKSUMSUM   13
        !           150: 
        !           151: /* OSPFv3 MIB Neighbors Table values: ospfv3NbrTable */
        !           152: #define OSPFv3NBRADDRESSTYPE      4
        !           153: #define OSPFv3NBRADDRESS          5
        !           154: #define OSPFv3NBROPTIONS          6
        !           155: #define OSPFv3NBRPRIORITY         7
        !           156: #define OSPFv3NBRSTATE            8
        !           157: #define OSPFv3NBREVENTS           9
        !           158: #define OSPFv3NBRLSRETRANSQLEN   10
        !           159: #define OSPFv3NBRHELLOSUPPRESSED 11
        !           160: #define OSPFv3NBRIFID            12
        !           161: #define OSPFv3NBRRESTARTHELPERSTATUS     13
        !           162: #define OSPFv3NBRRESTARTHELPERAGE        14
        !           163: #define OSPFv3NBRRESTARTHELPEREXITREASON 15
        !           164: 
        !           165: /* OSPFv3 MIB Configured Neighbors Table values: ospfv3CfgNbrTable */
        !           166: #define OSPFv3CFGNBRPRIORITY  5
        !           167: #define OSPFv3CFGNBRROWSTATUS 6
        !           168: 
        !           169: /* OSPFv3 MIB Virtual Neighbors Table values: ospfv3VirtNbrTable */
        !           170: #define OSPFv3VIRTNBRIFINDEX          3
        !           171: #define OSPFv3VIRTNBRIFINSTID         4
        !           172: #define OSPFv3VIRTNBRADDRESSTYPE      5
        !           173: #define OSPFv3VIRTNBRADDRESS          6
        !           174: #define OSPFv3VIRTNBROPTIONS          7
        !           175: #define OSPFv3VIRTNBRSTATE            8
        !           176: #define OSPFv3VIRTNBREVENTS           9
        !           177: #define OSPFv3VIRTNBRLSRETRANSQLEN   10
        !           178: #define OSPFv3VIRTNBRHELLOSUPPRESSED 11
        !           179: #define OSPFv3VIRTNBRIFID            12
        !           180: #define OSPFv3VIRTNBRRESTARTHELPERSTATUS     13
        !           181: #define OSPFv3VIRTNBRRESTARTHELPERAGE        14
        !           182: #define OSPFv3VIRTNBRRESTARTHELPEREXITREASON 15
        !           183: 
        !           184: /* OSPFv3 MIB Area Aggregate Table values: ospfv3AreaAggregateTable */
        !           185: #define OSPFv3AREAAGGREGATEROWSTATUS  6
        !           186: #define OSPFv3AREAAGGREGATEEFFECT     7
        !           187: #define OSPFv3AREAAGGREGATEROUTETAG   8
1.1       misho     188: 
                    189: /* SYNTAX Status from OSPF-MIB. */
                    190: #define OSPF_STATUS_ENABLED  1
                    191: #define OSPF_STATUS_DISABLED 2
                    192: 
                    193: /* SNMP value hack. */
                    194: #define COUNTER     ASN_COUNTER
                    195: #define INTEGER     ASN_INTEGER
                    196: #define GAUGE       ASN_GAUGE
1.1.1.2 ! misho     197: #define UNSIGNED    ASN_UNSIGNED
1.1       misho     198: #define TIMETICKS   ASN_TIMETICKS
                    199: #define IPADDRESS   ASN_IPADDRESS
                    200: #define STRING      ASN_OCTET_STR
                    201: 
                    202: /* For return values e.g. SNMP_INTEGER macro */
                    203: SNMP_LOCAL_VARIABLES
                    204: 
                    205: /* OSPFv3-MIB instances. */
                    206: oid ospfv3_oid [] = { OSPFv3MIB };
1.1.1.2 ! misho     207: oid ospfv3_trap_oid [] = { OSPFv3MIB, 0 };
1.1       misho     208: 
                    209: /* Hook functions. */
                    210: static u_char *ospfv3GeneralGroup (struct variable *, oid *, size_t *,
                    211:                                   int, size_t *, WriteMethod **);
                    212: static u_char *ospfv3AreaEntry (struct variable *, oid *, size_t *,
                    213:                                int, size_t *, WriteMethod **);
1.1.1.2 ! misho     214: static u_char *ospfv3WwLsdbEntry (struct variable *, oid *, size_t *,
        !           215:                                  int, size_t *, WriteMethod **);
        !           216: static u_char *ospfv3NbrEntry (struct variable *, oid *, size_t *,
        !           217:                               int, size_t *, WriteMethod **);
        !           218: static u_char *ospfv3IfEntry (struct variable *, oid *, size_t *,
        !           219:                              int, size_t *, WriteMethod **);
1.1       misho     220: 
                    221: struct variable ospfv3_variables[] =
                    222: {
                    223:   /* OSPF general variables */
1.1.1.2 ! misho     224:   {OSPFv3ROUTERID,             UNSIGNED,   RWRITE, ospfv3GeneralGroup,
1.1       misho     225:    3, {1, 1, 1}},
                    226:   {OSPFv3ADMINSTAT,             INTEGER,   RWRITE, ospfv3GeneralGroup,
                    227:    3, {1, 1, 2}},
                    228:   {OSPFv3VERSIONNUMBER,         INTEGER,   RONLY,  ospfv3GeneralGroup,
                    229:    3, {1, 1, 3}},
                    230:   {OSPFv3AREABDRRTRSTATUS,      INTEGER,   RONLY,  ospfv3GeneralGroup,
                    231:    3, {1, 1, 4}},
                    232:   {OSPFv3ASBDRRTRSTATUS,        INTEGER,   RWRITE, ospfv3GeneralGroup,
                    233:    3, {1, 1, 5}},
                    234:   {OSPFv3ASSCOPELSACOUNT,       GAUGE,     RONLY,  ospfv3GeneralGroup,
                    235:    3, {1, 1, 6}},
1.1.1.2 ! misho     236:   {OSPFv3ASSCOPELSACHECKSUMSUM,UNSIGNED,   RONLY,  ospfv3GeneralGroup,
1.1       misho     237:    3, {1, 1, 7}},
                    238:   {OSPFv3ORIGINATENEWLSAS,      COUNTER,   RONLY,  ospfv3GeneralGroup,
                    239:    3, {1, 1, 8}},
                    240:   {OSPFv3RXNEWLSAS,             COUNTER,   RONLY,  ospfv3GeneralGroup,
                    241:    3, {1, 1, 9}},
                    242:   {OSPFv3EXTLSACOUNT,           GAUGE,     RONLY,  ospfv3GeneralGroup,
                    243:    3, {1, 1, 10}},
                    244:   {OSPFv3EXTAREALSDBLIMIT,      INTEGER,   RWRITE, ospfv3GeneralGroup,
                    245:    3, {1, 1, 11}},
1.1.1.2 ! misho     246:   {OSPFv3EXITOVERFLOWINTERVAL, UNSIGNED,   RWRITE, ospfv3GeneralGroup,
1.1       misho     247:    3, {1, 1, 12}},
                    248:   {OSPFv3DEMANDEXTENSIONS,      INTEGER,   RWRITE, ospfv3GeneralGroup,
1.1.1.2 ! misho     249:    3, {1, 1, 13}},
        !           250:   {OSPFv3REFERENCEBANDWIDTH,   UNSIGNED, RWRITE, ospfv3GeneralGroup,
1.1       misho     251:    3, {1, 1, 14}},
1.1.1.2 ! misho     252:   {OSPFv3RESTARTSUPPORT,        INTEGER, RWRITE, ospfv3GeneralGroup,
1.1       misho     253:    3, {1, 1, 15}},
1.1.1.2 ! misho     254:   {OSPFv3RESTARTINTERVAL,      UNSIGNED, RWRITE, ospfv3GeneralGroup,
1.1       misho     255:    3, {1, 1, 16}},
1.1.1.2 ! misho     256:   {OSPFv3RESTARTSTRICTLSACHECKING, INTEGER, RWRITE, ospfv3GeneralGroup,
1.1       misho     257:    3, {1, 1, 17}},
                    258:   {OSPFv3RESTARTSTATUS,         INTEGER, RONLY,  ospfv3GeneralGroup,
1.1.1.2 ! misho     259:    3, {1, 1, 18}},
        !           260:   {OSPFv3RESTARTAGE,           UNSIGNED, RONLY,  ospfv3GeneralGroup,
1.1       misho     261:    3, {1, 1, 19}},
                    262:   {OSPFv3RESTARTEXITREASON,     INTEGER, RONLY,  ospfv3GeneralGroup,
1.1.1.2 ! misho     263:    3, {1, 1, 20}},
        !           264:   {OSPFv3NOTIFICATIONENABLE,    INTEGER, RWRITE, ospfv3GeneralGroup,
1.1       misho     265:    3, {1, 1, 21}},
1.1.1.2 ! misho     266:   {OSPFv3STUBROUTERSUPPORT,     INTEGER, RONLY,  ospfv3GeneralGroup,
        !           267:    3, {1, 1, 22}},
        !           268:   {OSPFv3STUBROUTERADVERTISEMENT, INTEGER, RWRITE, ospfv3GeneralGroup,
        !           269:    3, {1, 1, 23}},
        !           270:   {OSPFv3DISCONTINUITYTIME,     TIMETICKS, RONLY,  ospfv3GeneralGroup,
        !           271:    3, {1, 1, 24}},
        !           272:   {OSPFv3RESTARTTIME,           TIMETICKS, RONLY,  ospfv3GeneralGroup,
        !           273:    3, {1, 1, 25}},
1.1       misho     274: 
                    275:   /* OSPFv3 Area Data Structure */
                    276:   {OSPFv3IMPORTASEXTERN,        INTEGER,   RWRITE, ospfv3AreaEntry,
                    277:    4, {1, 2, 1, 2}},
                    278:   {OSPFv3AREASPFRUNS,           COUNTER,   RONLY,  ospfv3AreaEntry,
                    279:    4, {1, 2, 1, 3}},
                    280:   {OSPFv3AREABDRRTRCOUNT,       GAUGE,     RONLY,  ospfv3AreaEntry,
                    281:    4, {1, 2, 1, 4}},
                    282:   {OSPFv3AREAASBDRRTRCOUNT,     GAUGE,     RONLY,  ospfv3AreaEntry,
                    283:    4, {1, 2, 1, 5}},
                    284:   {OSPFv3AREASCOPELSACOUNT,     GAUGE,     RONLY,  ospfv3AreaEntry,
                    285:    4, {1, 2, 1, 6}},
1.1.1.2 ! misho     286:   {OSPFv3AREASCOPELSACKSUMSUM, UNSIGNED,   RONLY,  ospfv3AreaEntry,
1.1       misho     287:    4, {1, 2, 1, 7}},
                    288:   {OSPFv3AREASUMMARY,           INTEGER,   RWRITE, ospfv3AreaEntry,
                    289:    4, {1, 2, 1, 8}},
1.1.1.2 ! misho     290:   {OSPFv3AREAROWSTATUS,         INTEGER,   RWRITE, ospfv3AreaEntry,
1.1       misho     291:    4, {1, 2, 1, 9}},
1.1.1.2 ! misho     292:   {OSPFv3AREASTUBMETRIC,        INTEGER,   RWRITE, ospfv3AreaEntry,
1.1       misho     293:    4, {1, 2, 1, 10}},
                    294:   {OSPFv3AREANSSATRANSLATORROLE, INTEGER,  RWRITE, ospfv3AreaEntry,
                    295:    4, {1, 2, 1, 11}},
                    296:   {OSPFv3AREANSSATRANSLATORSTATE, INTEGER, RONLY,  ospfv3AreaEntry,
                    297:    4, {1, 2, 1, 12}},
1.1.1.2 ! misho     298:   {OSPFv3AREANSSATRANSLATORSTABINTERVAL, UNSIGNED, RWRITE, ospfv3AreaEntry,
1.1       misho     299:    4, {1, 2, 1, 13}},
                    300:   {OSPFv3AREANSSATRANSLATOREVENTS, COUNTER, RONLY, ospfv3AreaEntry,
                    301:    4, {1, 2, 1, 14}},
                    302:   {OSPFv3AREASTUBMETRICTYPE,    INTEGER, RWRITE, ospfv3AreaEntry,
                    303:    4, {1, 2, 1, 15}},
1.1.1.2 ! misho     304:   {OSPFv3AREATEENABLED,         INTEGER, RWRITE, ospfv3AreaEntry,
        !           305:    4, {1, 2, 1, 16}},
        !           306: 
        !           307:   /* OSPFv3 AS LSDB */
        !           308:   {OSPFv3WWLSDBSEQUENCE | OSPFv3WWASTABLE,      INTEGER,   RONLY,  ospfv3WwLsdbEntry,
        !           309:    4, {1, 3, 1, 4}},
        !           310:   {OSPFv3WWLSDBAGE | OSPFv3WWASTABLE,           UNSIGNED,  RONLY,  ospfv3WwLsdbEntry,
        !           311:    4, {1, 3, 1, 5}},
        !           312:   {OSPFv3WWLSDBCHECKSUM | OSPFv3WWASTABLE,      INTEGER,   RONLY,  ospfv3WwLsdbEntry,
        !           313:    4, {1, 3, 1, 6}},
        !           314:   {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWASTABLE, STRING,    RONLY,  ospfv3WwLsdbEntry,
        !           315:    4, {1, 3, 1, 7}},
        !           316:   {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWASTABLE,     INTEGER,   RONLY,  ospfv3WwLsdbEntry,
        !           317:    4, {1, 3, 1, 8}},
1.1       misho     318: 
1.1.1.2 ! misho     319:   /* OSPFv3 Area LSDB */
        !           320:   {OSPFv3WWLSDBSEQUENCE | OSPFv3WWAREATABLE,      INTEGER,   RONLY,  ospfv3WwLsdbEntry,
1.1       misho     321:    4, {1, 4, 1, 5}},
1.1.1.2 ! misho     322:   {OSPFv3WWLSDBAGE | OSPFv3WWAREATABLE,           UNSIGNED,  RONLY,  ospfv3WwLsdbEntry,
1.1       misho     323:    4, {1, 4, 1, 6}},
1.1.1.2 ! misho     324:   {OSPFv3WWLSDBCHECKSUM | OSPFv3WWAREATABLE,      INTEGER,   RONLY,  ospfv3WwLsdbEntry,
1.1       misho     325:    4, {1, 4, 1, 7}},
1.1.1.2 ! misho     326:   {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWAREATABLE, STRING,    RONLY,  ospfv3WwLsdbEntry,
1.1       misho     327:    4, {1, 4, 1, 8}},
1.1.1.2 ! misho     328:   {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWAREATABLE,     INTEGER,   RONLY,  ospfv3WwLsdbEntry,
1.1       misho     329:    4, {1, 4, 1, 9}},
                    330: 
1.1.1.2 ! misho     331:   /* OSPFv3 Link LSDB */
        !           332:   {OSPFv3WWLSDBSEQUENCE | OSPFv3WWLINKTABLE,      INTEGER,   RONLY,  ospfv3WwLsdbEntry,
        !           333:    4, {1, 5, 1, 6}},
        !           334:   {OSPFv3WWLSDBAGE | OSPFv3WWLINKTABLE,           UNSIGNED,  RONLY,  ospfv3WwLsdbEntry,
        !           335:    4, {1, 5, 1, 7}},
        !           336:   {OSPFv3WWLSDBCHECKSUM | OSPFv3WWLINKTABLE,      INTEGER,   RONLY,  ospfv3WwLsdbEntry,
        !           337:    4, {1, 5, 1, 8}},
        !           338:   {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWLINKTABLE, STRING,    RONLY,  ospfv3WwLsdbEntry,
        !           339:    4, {1, 5, 1, 9}},
        !           340:   {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWLINKTABLE,     INTEGER,   RONLY,  ospfv3WwLsdbEntry,
        !           341:    4, {1, 5, 1, 10}},
        !           342: 
        !           343:   /* OSPFv3 interfaces */
        !           344:   {OSPFv3IFAREAID,             UNSIGNED, RONLY, ospfv3IfEntry,
        !           345:    4, {1, 7, 1, 3}},
        !           346:   {OSPFv3IFTYPE,               INTEGER,  RONLY, ospfv3IfEntry,
        !           347:    4, {1, 7, 1, 4}},
        !           348:   {OSPFv3IFADMINSTATUS,        INTEGER,  RONLY, ospfv3IfEntry,
        !           349:    4, {1, 7, 1, 5}},
        !           350:   {OSPFv3IFRTRPRIORITY,        INTEGER,  RONLY, ospfv3IfEntry,
        !           351:    4, {1, 7, 1, 6}},
        !           352:   {OSPFv3IFTRANSITDELAY,       UNSIGNED, RONLY, ospfv3IfEntry,
        !           353:    4, {1, 7, 1, 7}},
        !           354:   {OSPFv3IFRETRANSINTERVAL,    UNSIGNED, RONLY, ospfv3IfEntry,
        !           355:    4, {1, 7, 1, 8}},
        !           356:   {OSPFv3IFHELLOINTERVAL,      INTEGER,  RONLY, ospfv3IfEntry,
        !           357:    4, {1, 7, 1, 9}},
        !           358:   {OSPFv3IFRTRDEADINTERVAL,    UNSIGNED, RONLY, ospfv3IfEntry,
        !           359:    4, {1, 7, 1, 10}},
        !           360:   {OSPFv3IFPOLLINTERVAL,       UNSIGNED, RONLY, ospfv3IfEntry,
        !           361:    4, {1, 7, 1, 11}},
        !           362:   {OSPFv3IFSTATE,              INTEGER,  RONLY, ospfv3IfEntry,
        !           363:    4, {1, 7, 1, 12}},
        !           364:   {OSPFv3IFDESIGNATEDROUTER,   UNSIGNED, RONLY, ospfv3IfEntry,
        !           365:    4, {1, 7, 1, 13}},
        !           366:   {OSPFv3IFBACKUPDESIGNATEDROUTER, UNSIGNED, RONLY, ospfv3IfEntry,
        !           367:    4, {1, 7, 1, 14}},
        !           368:   {OSPFv3IFEVENTS,             COUNTER,  RONLY, ospfv3IfEntry,
        !           369:    4, {1, 7, 1, 15}},
        !           370:   {OSPFv3IFROWSTATUS,          INTEGER,  RONLY, ospfv3IfEntry,
        !           371:    4, {1, 7, 1, 16}},
        !           372:   {OSPFv3IFDEMAND,             INTEGER,  RONLY, ospfv3IfEntry,
        !           373:    4, {1, 7, 1, 17}},
        !           374:   {OSPFv3IFMETRICVALUE,        INTEGER,  RONLY, ospfv3IfEntry,
        !           375:    4, {1, 7, 1, 18}},
        !           376:   {OSPFv3IFLINKSCOPELSACOUNT,  GAUGE,    RONLY, ospfv3IfEntry,
        !           377:    4, {1, 7, 1, 19}},
        !           378:   {OSPFv3IFLINKLSACKSUMSUM,    UNSIGNED, RONLY, ospfv3IfEntry,
        !           379:    4, {1, 7, 1, 20}},
        !           380:   {OSPFv3IFDEMANDNBRPROBE,     INTEGER,  RONLY, ospfv3IfEntry,
        !           381:    4, {1, 7, 1, 21}},
        !           382:   {OSPFv3IFDEMANDNBRPROBERETRANSLIMIT, UNSIGNED, RONLY, ospfv3IfEntry,
        !           383:    4, {1, 7, 1, 22}},
        !           384:   {OSPFv3IFDEMANDNBRPROBEINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
        !           385:    4, {1, 7, 1, 23}},
        !           386:   {OSPFv3IFTEDISABLED,         INTEGER,  RONLY, ospfv3IfEntry,
        !           387:    4, {1, 7, 1, 24}},
        !           388:   {OSPFv3IFLINKLSASUPPRESSION, INTEGER,  RONLY, ospfv3IfEntry,
        !           389:    4, {1, 7, 1, 25}},
        !           390: 
        !           391:   /* OSPFv3 neighbors */
        !           392:   {OSPFv3NBRADDRESSTYPE,        INTEGER,   RONLY,  ospfv3NbrEntry,
        !           393:    4, {1, 9, 1, 4}},
        !           394:   {OSPFv3NBRADDRESS,            STRING,    RONLY,  ospfv3NbrEntry,
        !           395:    4, {1, 9, 1, 5}},
        !           396:   {OSPFv3NBROPTIONS,            INTEGER,   RONLY,  ospfv3NbrEntry,
        !           397:    4, {1, 9, 1, 6}},
        !           398:   {OSPFv3NBRPRIORITY,           INTEGER,   RONLY,  ospfv3NbrEntry,
        !           399:    4, {1, 9, 1, 7}},
        !           400:   {OSPFv3NBRSTATE,              INTEGER,   RONLY,  ospfv3NbrEntry,
        !           401:    4, {1, 9, 1, 8}},
        !           402:   {OSPFv3NBREVENTS,             COUNTER,   RONLY,  ospfv3NbrEntry,
        !           403:    4, {1, 9, 1, 9}},
        !           404:   {OSPFv3NBRLSRETRANSQLEN,        GAUGE,   RONLY,  ospfv3NbrEntry,
        !           405:    4, {1, 9, 1, 10}},
        !           406:   {OSPFv3NBRHELLOSUPPRESSED,    INTEGER,   RONLY,  ospfv3NbrEntry,
        !           407:    4, {1, 9, 1, 11}},
        !           408:   {OSPFv3NBRIFID,               INTEGER,   RONLY,  ospfv3NbrEntry,
        !           409:    4, {1, 9, 1, 12}},
        !           410:   {OSPFv3NBRRESTARTHELPERSTATUS, INTEGER,  RONLY,  ospfv3NbrEntry,
        !           411:    4, {1, 9, 1, 13}},
        !           412:   {OSPFv3NBRRESTARTHELPERAGE,  UNSIGNED,   RONLY,  ospfv3NbrEntry,
        !           413:    4, {1, 9, 1, 14}},
        !           414:   {OSPFv3NBRRESTARTHELPEREXITREASON, INTEGER, RONLY, ospfv3NbrEntry,
        !           415:    4, {1, 9, 1, 15}},
1.1       misho     416: };
                    417: 
                    418: static u_char *
                    419: ospfv3GeneralGroup (struct variable *v, oid *name, size_t *length,
                    420:                     int exact, size_t *var_len, WriteMethod **write_method)
                    421: {
1.1.1.2 ! misho     422:   u_int16_t sum;
        !           423:   u_int32_t count;
        !           424:   struct ospf6_lsa *lsa = NULL;
        !           425: 
1.1       misho     426:   /* Check whether the instance identifier is valid */
                    427:   if (smux_header_generic (v, name, length, exact, var_len, write_method)
                    428:       == MATCH_FAILED)
                    429:     return NULL;
                    430: 
                    431:   /* Return the current value of the variable */
                    432:   switch (v->magic)
                    433:     {
1.1.1.2 ! misho     434:     case OSPFv3ROUTERID:
1.1       misho     435:       /* Router-ID of this OSPF instance. */
                    436:       if (ospf6)
1.1.1.2 ! misho     437:        return SNMP_INTEGER (ntohl (ospf6->router_id));
        !           438:       return SNMP_INTEGER (0);
        !           439:     case OSPFv3ADMINSTAT:
        !           440:       if (ospf6)
        !           441:        return SNMP_INTEGER (CHECK_FLAG (ospf6->flag, OSPF6_DISABLED)?
        !           442:                             OSPF_STATUS_DISABLED:OSPF_STATUS_ENABLED);
        !           443:       return SNMP_INTEGER (OSPF_STATUS_DISABLED);
        !           444:     case OSPFv3VERSIONNUMBER:
        !           445:       return SNMP_INTEGER (3);
        !           446:     case OSPFv3AREABDRRTRSTATUS:
        !           447:       if (ospf6)
        !           448:        return SNMP_INTEGER (ospf6_is_router_abr (ospf6)?SNMP_TRUE:SNMP_FALSE);
        !           449:       return SNMP_INTEGER (SNMP_FALSE);
        !           450:     case OSPFv3ASBDRRTRSTATUS:
        !           451:       if (ospf6)
        !           452:        return SNMP_INTEGER (ospf6_asbr_is_asbr (ospf6)?SNMP_TRUE:SNMP_FALSE);
        !           453:       return SNMP_INTEGER (SNMP_FALSE);
        !           454:     case OSPFv3ASSCOPELSACOUNT:
        !           455:       if (ospf6)
        !           456:        return SNMP_INTEGER (ospf6->lsdb->count);
        !           457:       return SNMP_INTEGER (0);
        !           458:     case OSPFv3ASSCOPELSACHECKSUMSUM:
        !           459:       if (ospf6)
        !           460:         {
        !           461:           for (sum = 0, lsa = ospf6_lsdb_head (ospf6->lsdb);
        !           462:                lsa;
        !           463:                lsa = ospf6_lsdb_next (lsa))
        !           464:             sum += ntohs (lsa->header->checksum);
        !           465:           return SNMP_INTEGER (sum);
        !           466:         }
        !           467:       return SNMP_INTEGER (0);
        !           468:     case OSPFv3ORIGINATENEWLSAS:
        !           469:       return SNMP_INTEGER (0); /* Don't know where to get this value... */
        !           470:     case OSPFv3RXNEWLSAS:
        !           471:       return SNMP_INTEGER (0); /* Don't know where to get this value... */
        !           472:     case OSPFv3EXTLSACOUNT:
        !           473:       if (ospf6)
        !           474:         {
        !           475:           for (count = 0, lsa = ospf6_lsdb_type_head (htons (OSPF6_LSTYPE_AS_EXTERNAL),
        !           476:                                                       ospf6->lsdb);
        !           477:                lsa;
        !           478:                lsa = ospf6_lsdb_type_next (htons (OSPF6_LSTYPE_AS_EXTERNAL),
        !           479:                                            lsa))
        !           480:             count += 1;
        !           481:           return SNMP_INTEGER (count);
        !           482:         }
        !           483:       return SNMP_INTEGER (0);
        !           484:     case OSPFv3EXTAREALSDBLIMIT:
        !           485:       return SNMP_INTEGER (-1);
        !           486:     case OSPFv3EXITOVERFLOWINTERVAL:
        !           487:       return SNMP_INTEGER (0); /* Not supported */
        !           488:     case OSPFv3DEMANDEXTENSIONS:
        !           489:       return SNMP_INTEGER (0); /* Not supported */
        !           490:     case OSPFv3REFERENCEBANDWIDTH:
        !           491:       return SNMP_INTEGER (100000);
        !           492:     case OSPFv3RESTARTSUPPORT:
        !           493:     case OSPFv3RESTARTINTERVAL:
        !           494:     case OSPFv3RESTARTSTRICTLSACHECKING:
        !           495:     case OSPFv3RESTARTSTATUS:
        !           496:     case OSPFv3RESTARTAGE:
        !           497:     case OSPFv3RESTARTEXITREASON:
        !           498:     case OSPFv3NOTIFICATIONENABLE:
        !           499:     case OSPFv3STUBROUTERSUPPORT:
        !           500:     case OSPFv3STUBROUTERADVERTISEMENT:
        !           501:     case OSPFv3DISCONTINUITYTIME:
        !           502:     case OSPFv3RESTARTTIME:
        !           503:       /* TODO: Not implemented */
1.1       misho     504:       return NULL;
                    505:     }
                    506:   return NULL;
                    507: }
                    508: 
                    509: static u_char *
                    510: ospfv3AreaEntry (struct variable *v, oid *name, size_t *length,
                    511:                  int exact, size_t *var_len, WriteMethod **write_method)
                    512: {
                    513:   struct ospf6_area *oa, *area = NULL;
1.1.1.2 ! misho     514:   struct ospf6_lsa *lsa = NULL;
1.1       misho     515:   u_int32_t area_id = 0;
1.1.1.2 ! misho     516:   u_int32_t count;
        !           517:   u_int16_t sum;
1.1       misho     518:   struct listnode *node;
                    519:   unsigned int len;
1.1.1.2 ! misho     520:   char a[16];
        !           521:   struct ospf6_route *ro;
1.1       misho     522: 
                    523:   if (ospf6 == NULL)
                    524:     return NULL;
                    525: 
1.1.1.2 ! misho     526:   if (smux_header_table(v, name, length, exact, var_len, write_method)
        !           527:       == MATCH_FAILED)
        !           528:     return NULL;
        !           529: 
1.1       misho     530:   len = *length - v->namelen;
1.1.1.2 ! misho     531:   len = (len >= 1 ? sizeof 1 : 0);
        !           532:   if (exact && len != 1)
1.1       misho     533:     return NULL;
                    534:   if (len)
1.1.1.2 ! misho     535:     area_id  = htonl (name[v->namelen]);
1.1       misho     536: 
1.1.1.2 ! misho     537:   inet_ntop (AF_INET, &area_id, a, sizeof (a));
1.1       misho     538:   zlog_debug ("SNMP access by area: %s, exact=%d len=%d length=%lu",
1.1.1.2 ! misho     539:              a, exact, len, (u_long)*length);
1.1       misho     540: 
                    541:   for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
                    542:     {
                    543:       if (area == NULL)
                    544:         {
                    545:           if (len == 0) /* return first area entry */
                    546:             area = oa;
                    547:           else if (exact && ntohl (oa->area_id) == ntohl (area_id))
                    548:             area = oa;
                    549:           else if (ntohl (oa->area_id) > ntohl (area_id))
                    550:             area = oa;
                    551:         }
                    552:     }
                    553: 
                    554:   if (area == NULL)
                    555:     return NULL;
                    556: 
1.1.1.2 ! misho     557:   *length = v->namelen + 1;
        !           558:   name[v->namelen] = ntohl (area->area_id);
1.1       misho     559: 
1.1.1.2 ! misho     560:   inet_ntop (AF_INET, &area->area_id, a, sizeof (a));
1.1       misho     561:   zlog_debug ("SNMP found area: %s, exact=%d len=%d length=%lu",
1.1.1.2 ! misho     562:              a, exact, len, (u_long)*length);
1.1       misho     563: 
                    564:   switch (v->magic)
                    565:     {
1.1.1.2 ! misho     566:     case OSPFv3IMPORTASEXTERN:
        !           567:       /* No NSSA support */
        !           568:       return SNMP_INTEGER (IS_AREA_STUB(area)?2:1);
        !           569:     case OSPFv3AREASPFRUNS:
        !           570:       return SNMP_INTEGER (area->spf_calculation);
        !           571:     case OSPFv3AREABDRRTRCOUNT:
        !           572:     case OSPFv3AREAASBDRRTRCOUNT:
        !           573:       count = 0;
        !           574:       for (ro = ospf6_route_head (ospf6->brouter_table); ro;
        !           575:           ro = ospf6_route_next (ro))
        !           576:         {
        !           577:           if (ntohl (ro->path.area_id) != ntohl (area->area_id)) continue;
        !           578:           if (v->magic == OSPFv3AREABDRRTRCOUNT &&
        !           579:               CHECK_FLAG (ro->path.router_bits, OSPF6_ROUTER_BIT_B))
        !           580:             count++;
        !           581:           if (v->magic == OSPFv3AREAASBDRRTRCOUNT &&
        !           582:               CHECK_FLAG (ro->path.router_bits, OSPF6_ROUTER_BIT_E))
        !           583:             count++;
        !           584:         }
        !           585:       return SNMP_INTEGER (count);
        !           586:     case OSPFv3AREASCOPELSACOUNT:
        !           587:       return SNMP_INTEGER (area->lsdb->count);
        !           588:     case OSPFv3AREASCOPELSACKSUMSUM:
        !           589:       for (sum = 0, lsa = ospf6_lsdb_head (area->lsdb);
        !           590:           lsa;
        !           591:           lsa = ospf6_lsdb_next (lsa))
        !           592:        sum += ntohs (lsa->header->checksum);
        !           593:       return SNMP_INTEGER (sum);
        !           594:     case OSPFv3AREASUMMARY:
        !           595:       return SNMP_INTEGER (2); /* sendAreaSummary */
        !           596:     case OSPFv3AREAROWSTATUS:
        !           597:       return SNMP_INTEGER (1); /* Active */
        !           598:     case OSPFv3AREASTUBMETRIC:
        !           599:     case OSPFv3AREANSSATRANSLATORROLE:
        !           600:     case OSPFv3AREANSSATRANSLATORSTATE:
        !           601:     case OSPFv3AREANSSATRANSLATORSTABINTERVAL:
        !           602:     case OSPFv3AREANSSATRANSLATOREVENTS:
        !           603:     case OSPFv3AREASTUBMETRICTYPE:
        !           604:     case OSPFv3AREATEENABLED:
        !           605:       /* Not implemented. */
1.1       misho     606:       return NULL;
                    607:     }
                    608:   return NULL;
                    609: }
                    610: 
1.1.1.2 ! misho     611: static int
        !           612: if_icmp_func (struct interface *ifp1, struct interface *ifp2)
        !           613: {
        !           614:   return (ifp1->ifindex - ifp2->ifindex);
        !           615: }
        !           616: 
1.1       misho     617: static u_char *
1.1.1.2 ! misho     618: ospfv3WwLsdbEntry (struct variable *v, oid *name, size_t *length,
1.1       misho     619:                      int exact, size_t *var_len, WriteMethod **write_method)
                    620: {
                    621:   struct ospf6_lsa *lsa = NULL;
1.1.1.2 ! misho     622:   u_int32_t ifindex, area_id, id, instid, adv_router;
1.1       misho     623:   u_int16_t type;
                    624:   int len;
                    625:   oid *offset;
                    626:   int offsetlen;
                    627:   char a[16], b[16], c[16];
                    628:   struct ospf6_area *oa;
                    629:   struct listnode *node;
1.1.1.2 ! misho     630:   struct interface *iif;
        !           631:   struct ospf6_interface *oi = NULL;
        !           632:   struct list *ifslist;
        !           633: 
        !           634:   if (smux_header_table(v, name, length, exact, var_len, write_method)
        !           635:       == MATCH_FAILED)
        !           636:     return NULL;
1.1       misho     637: 
1.1.1.2 ! misho     638:   instid = ifindex = area_id = type = id = adv_router = 0;
1.1       misho     639: 
                    640:   /* Check OSPFv3 instance. */
                    641:   if (ospf6 == NULL)
                    642:     return NULL;
                    643: 
                    644:   /* Get variable length. */
                    645:   offset = name + v->namelen;
                    646:   offsetlen = *length - v->namelen;
                    647: 
1.1.1.2 ! misho     648:   if (exact && (v->magic & OSPFv3WWASTABLE) && offsetlen != 3)
        !           649:     return NULL;
        !           650:   if (exact && (v->magic & OSPFv3WWAREATABLE) && offsetlen != 4)
        !           651:     return NULL;
        !           652:   if (exact && (v->magic & OSPFv3WWLINKTABLE) && offsetlen != 5)
1.1       misho     653:     return NULL;
                    654: 
1.1.1.2 ! misho     655:   if (v->magic & OSPFv3WWLINKTABLE)
        !           656:     {
        !           657:       /* Parse ifindex */
        !           658:       len = (offsetlen < 1 ? 0 : 1);
        !           659:       if (len)
        !           660:         ifindex = *offset;
        !           661:       offset += len;
        !           662:       offsetlen -= len;
        !           663: 
        !           664:       /* Parse instance ID */
        !           665:       len = (offsetlen < 1 ? 0 : 1);
        !           666:       if (len)
        !           667:         instid = *offset;
        !           668:       offset += len;
        !           669:       offsetlen -= len;
        !           670:     }
        !           671:   else if (v->magic & OSPFv3WWAREATABLE)
        !           672:     {
        !           673:       /* Parse area-id */
        !           674:       len = (offsetlen < 1 ? 0 : 1);
        !           675:       if (len)
        !           676:         area_id = htonl (*offset);
        !           677:       offset += len;
        !           678:       offsetlen -= len;
        !           679:     }
1.1       misho     680: 
                    681:   /* Parse type */
1.1.1.2 ! misho     682:   len = (offsetlen < 1 ? 0 : 1);
1.1       misho     683:   if (len)
                    684:     type = htons (*offset);
                    685:   offset += len;
                    686:   offsetlen -= len;
                    687: 
                    688:   /* Parse Router-ID */
1.1.1.2 ! misho     689:   len = (offsetlen < 1 ? 0 : 1);
1.1       misho     690:   if (len)
1.1.1.2 ! misho     691:     adv_router = htonl (*offset);
1.1       misho     692:   offset += len;
                    693:   offsetlen -= len;
                    694: 
                    695:   /* Parse LS-ID */
1.1.1.2 ! misho     696:   len = (offsetlen < 1 ? 0 : 1);
1.1       misho     697:   if (len)
1.1.1.2 ! misho     698:     id = htonl (*offset);
1.1       misho     699:   offset += len;
                    700:   offsetlen -= len;
                    701: 
                    702:   if (exact)
                    703:     {
1.1.1.2 ! misho     704:       if (v->magic & OSPFv3WWASTABLE)
        !           705:         {
        !           706:           lsa = ospf6_lsdb_lookup (type, id, adv_router, ospf6->lsdb);
        !           707:         }
        !           708:       else if (v->magic & OSPFv3WWAREATABLE)
        !           709:         {
        !           710:           oa = ospf6_area_lookup (area_id, ospf6);
        !           711:           if (!oa) return NULL;
        !           712:           lsa = ospf6_lsdb_lookup (type, id, adv_router, oa->lsdb);
        !           713:         }
        !           714:       else if (v->magic & OSPFv3WWLINKTABLE)
        !           715:         {
        !           716:           oi = ospf6_interface_lookup_by_ifindex (ifindex);
        !           717:           if (!oi || oi->instance_id != instid) return NULL;
        !           718:           lsa = ospf6_lsdb_lookup (type, id, adv_router, oi->lsdb);
        !           719:         }
1.1       misho     720:     }
                    721:   else
                    722:     {
1.1.1.2 ! misho     723:       if (v->magic & OSPFv3WWASTABLE)
        !           724:        {
        !           725:          if (ospf6->lsdb->count)
        !           726:            lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
        !           727:                                          ospf6->lsdb);
        !           728:        }
        !           729:       else if (v->magic & OSPFv3WWAREATABLE)
        !           730:        for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
        !           731:           {
        !           732:             if (oa->area_id < area_id)
        !           733:               continue;
        !           734: 
        !           735:             if (oa->lsdb->count)
        !           736:               lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
        !           737:                                             oa->lsdb);
        !           738:             if (lsa) break;
        !           739:             type = 0;
        !           740:             id = 0;
        !           741:             adv_router = 0;
        !           742:           }
        !           743:       else if (v->magic & OSPFv3WWLINKTABLE)
1.1       misho     744:         {
1.1.1.2 ! misho     745:           /* We build a sorted list of interfaces */
        !           746:           ifslist = list_new ();
        !           747:           if (!ifslist) return NULL;
        !           748:           ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
        !           749:           for (ALL_LIST_ELEMENTS_RO (iflist, node, iif))
        !           750:             listnode_add_sort (ifslist, iif);
        !           751:           
        !           752:           for (ALL_LIST_ELEMENTS_RO (ifslist, node, iif))
1.1       misho     753:             {
1.1.1.2 ! misho     754:               if (!iif->ifindex) continue;
        !           755:               oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
        !           756:               if (!oi) continue;
        !           757:               if (iif->ifindex < ifindex) continue;
        !           758:               if (oi->instance_id < instid) continue;
        !           759:               
        !           760:               if (oi->lsdb->count)
        !           761:                 lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
        !           762:                                             oi->lsdb);
        !           763:               if (lsa) break;
1.1       misho     764:               type = 0;
1.1.1.2 ! misho     765:               id = 0;
        !           766:               adv_router = 0;
        !           767:               oi = NULL;
1.1       misho     768:             }
1.1.1.2 ! misho     769: 
        !           770:           list_delete_all_node (ifslist);
1.1       misho     771:         }
                    772:     }
                    773: 
                    774:   if (! lsa)
                    775:       return NULL;
                    776: 
1.1.1.2 ! misho     777:   /* Add indexes */
        !           778:   if (v->magic & OSPFv3WWASTABLE)
        !           779:     {
        !           780:       *length = v->namelen + 3;
        !           781:       offset = name + v->namelen;
        !           782:     }
        !           783:   else if (v->magic & OSPFv3WWAREATABLE)
        !           784:     {
        !           785:       *length = v->namelen + 4;
        !           786:       offset = name + v->namelen;
        !           787:       *offset = ntohl (oa->area_id);
        !           788:       offset++;
        !           789:     }
        !           790:   else if (v->magic & OSPFv3WWLINKTABLE)
        !           791:     {
        !           792:       *length = v->namelen + 5;
        !           793:       offset = name + v->namelen;
        !           794:       *offset = oi->interface->ifindex;
        !           795:       offset++;
        !           796:       *offset = oi->instance_id;
        !           797:       offset++;
        !           798:     }
1.1       misho     799:   *offset = ntohs (lsa->header->type);
                    800:   offset++;
1.1.1.2 ! misho     801:   *offset = ntohl (lsa->header->adv_router);
        !           802:   offset++;
        !           803:   *offset = ntohl (lsa->header->id);
        !           804:   offset++;
1.1       misho     805: 
                    806:   /* Return the current value of the variable */
1.1.1.2 ! misho     807:   switch (v->magic & OSPFv3WWCOLUMN)
1.1       misho     808:     {
1.1.1.2 ! misho     809:     case OSPFv3WWLSDBSEQUENCE:
        !           810:       return SNMP_INTEGER (ntohl (lsa->header->seqnum));
1.1       misho     811:       break;
1.1.1.2 ! misho     812:     case OSPFv3WWLSDBAGE:
1.1       misho     813:       ospf6_lsa_age_current (lsa);
1.1.1.2 ! misho     814:       return SNMP_INTEGER (ntohs (lsa->header->age));
1.1       misho     815:       break;
1.1.1.2 ! misho     816:     case OSPFv3WWLSDBCHECKSUM:
        !           817:       return SNMP_INTEGER (ntohs (lsa->header->checksum));
1.1       misho     818:       break;
1.1.1.2 ! misho     819:     case OSPFv3WWLSDBADVERTISEMENT:
1.1       misho     820:       *var_len = ntohs (lsa->header->length);
                    821:       return (u_char *) lsa->header;
                    822:       break;
1.1.1.2 ! misho     823:     case OSPFv3WWLSDBTYPEKNOWN:
1.1       misho     824:       return SNMP_INTEGER (OSPF6_LSA_IS_KNOWN (lsa->header->type) ?
                    825:                            SNMP_TRUE : SNMP_FALSE);
                    826:       break;
1.1.1.2 ! misho     827:     }
        !           828:   return NULL;
        !           829: }
        !           830: 
        !           831: static u_char *
        !           832: ospfv3IfEntry (struct variable *v, oid *name, size_t *length,
        !           833:                int exact, size_t *var_len, WriteMethod **write_method)
        !           834: {
        !           835:   unsigned int ifindex, instid;
        !           836:   struct ospf6_interface *oi = NULL;
        !           837:   struct ospf6_lsa *lsa = NULL;
        !           838:   struct interface      *iif;
        !           839:   struct listnode *i;
        !           840:   struct list *ifslist;
        !           841:   oid *offset;
        !           842:   int offsetlen, len;
        !           843:   u_int32_t sum;
        !           844: 
        !           845:   if (smux_header_table (v, name, length, exact, var_len, write_method)
        !           846:       == MATCH_FAILED)
        !           847:     return NULL;
        !           848: 
        !           849:   ifindex = instid = 0;
        !           850: 
        !           851:   /* Check OSPFv3 instance. */
        !           852:   if (ospf6 == NULL)
        !           853:     return NULL;
        !           854: 
        !           855:   /* Get variable length. */
        !           856:   offset = name + v->namelen;
        !           857:   offsetlen = *length - v->namelen;
        !           858: 
        !           859:   if (exact && offsetlen != 2)
        !           860:     return NULL;
        !           861: 
        !           862:   /* Parse if index */
        !           863:   len = (offsetlen < 1 ? 0 : 1);
        !           864:   if (len)
        !           865:     ifindex = *offset;
        !           866:   offset += len;
        !           867:   offsetlen -= len;
        !           868: 
        !           869:   /* Parse instance ID */
        !           870:   len = (offsetlen < 1 ? 0 : 1);
        !           871:   if (len)
        !           872:     instid = *offset;
        !           873:   offset += len;
        !           874:   offsetlen -= len;
        !           875: 
        !           876:   if (exact)
        !           877:     {
        !           878:       oi = ospf6_interface_lookup_by_ifindex (ifindex);
        !           879:       if (!oi || oi->instance_id != instid) return NULL;
        !           880:     }
        !           881:   else
        !           882:     {
        !           883:       /* We build a sorted list of interfaces */
        !           884:       ifslist = list_new ();
        !           885:       if (!ifslist) return NULL;
        !           886:       ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
        !           887:       for (ALL_LIST_ELEMENTS_RO (iflist, i, iif))
        !           888:        listnode_add_sort (ifslist, iif);
        !           889: 
        !           890:       for (ALL_LIST_ELEMENTS_RO (ifslist, i, iif))
        !           891:         {
        !           892:           if (!iif->ifindex) continue;
        !           893:           oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
        !           894:           if (!oi) continue;
        !           895:           if (iif->ifindex > ifindex ||
        !           896:               (iif->ifindex == ifindex &&
        !           897:                (oi->instance_id > instid)))
        !           898:             break;
        !           899:           oi = NULL;
        !           900:         }
        !           901: 
        !           902:       list_delete_all_node (ifslist);
        !           903:     }
        !           904: 
        !           905:   if (!oi) return NULL;
        !           906: 
        !           907:   /* Add Index (IfIndex, IfInstId) */
        !           908:   *length = v->namelen + 2;
        !           909:   offset = name + v->namelen;
        !           910:   *offset = oi->interface->ifindex;
        !           911:   offset++;
        !           912:   *offset = oi->instance_id;
        !           913:   offset++;
        !           914: 
        !           915:   /* Return the current value of the variable */
        !           916:   switch (v->magic)
        !           917:     {
        !           918:     case OSPFv3IFAREAID:
        !           919:       if (oi->area)
        !           920:        return SNMP_INTEGER (ntohl (oi->area->area_id));
        !           921:       break;
        !           922:     case OSPFv3IFTYPE:
        !           923:       if (if_is_broadcast (oi->interface))
        !           924:        return SNMP_INTEGER (1);
        !           925:       else if (if_is_pointopoint (oi->interface))
        !           926:        return SNMP_INTEGER (3);
        !           927:       else break;              /* Unknown, don't put anything */
        !           928:     case OSPFv3IFADMINSTATUS:
        !           929:       if (oi->area)
        !           930:        return SNMP_INTEGER (OSPF_STATUS_ENABLED);
        !           931:       return SNMP_INTEGER (OSPF_STATUS_DISABLED);
        !           932:     case OSPFv3IFRTRPRIORITY:
        !           933:       return SNMP_INTEGER (oi->priority);
        !           934:     case OSPFv3IFTRANSITDELAY:
        !           935:       return SNMP_INTEGER (oi->transdelay);
        !           936:     case OSPFv3IFRETRANSINTERVAL:
        !           937:       return SNMP_INTEGER (oi->rxmt_interval);
        !           938:     case OSPFv3IFHELLOINTERVAL:
        !           939:       return SNMP_INTEGER (oi->hello_interval);
        !           940:     case OSPFv3IFRTRDEADINTERVAL:
        !           941:       return SNMP_INTEGER (oi->dead_interval);
        !           942:     case OSPFv3IFPOLLINTERVAL:
        !           943:       /* No support for NBMA */
        !           944:       break;
        !           945:     case OSPFv3IFSTATE:
        !           946:       return SNMP_INTEGER (oi->state);
        !           947:     case OSPFv3IFDESIGNATEDROUTER:
        !           948:       return SNMP_INTEGER (ntohl (oi->drouter));
        !           949:     case OSPFv3IFBACKUPDESIGNATEDROUTER:
        !           950:       return SNMP_INTEGER (ntohl (oi->bdrouter));
        !           951:     case OSPFv3IFEVENTS:
        !           952:       return SNMP_INTEGER (oi->state_change);
        !           953:     case OSPFv3IFROWSTATUS:
        !           954:       return SNMP_INTEGER (1);
        !           955:     case OSPFv3IFDEMAND:
        !           956:       return SNMP_INTEGER (SNMP_FALSE);
        !           957:     case OSPFv3IFMETRICVALUE:
        !           958:       return SNMP_INTEGER (oi->cost);
        !           959:     case OSPFv3IFLINKSCOPELSACOUNT:
        !           960:       return SNMP_INTEGER (oi->lsdb->count);
        !           961:     case OSPFv3IFLINKLSACKSUMSUM:
        !           962:       for (sum = 0, lsa = ospf6_lsdb_head (oi->lsdb);
        !           963:           lsa;
        !           964:           lsa = ospf6_lsdb_next (lsa))
        !           965:        sum += ntohs (lsa->header->checksum);
        !           966:       return SNMP_INTEGER (sum);
        !           967:     case OSPFv3IFDEMANDNBRPROBE:
        !           968:     case OSPFv3IFDEMANDNBRPROBERETRANSLIMIT:
        !           969:     case OSPFv3IFDEMANDNBRPROBEINTERVAL:
        !           970:     case OSPFv3IFTEDISABLED:
        !           971:     case OSPFv3IFLINKLSASUPPRESSION:
        !           972:       /* Not implemented. Only works if all the last ones are not
        !           973:         implemented! */
1.1       misho     974:       return NULL;
                    975:     }
1.1.1.2 ! misho     976: 
        !           977:   /* Try an internal getnext. Some columns are missing in this table. */
        !           978:   if (!exact && (name[*length-1] < MAX_SUBID))
        !           979:     return ospfv3IfEntry(v, name, length,
        !           980:                         exact, var_len, write_method);
        !           981:   return NULL;
        !           982: }
        !           983: 
        !           984: static u_char *
        !           985: ospfv3NbrEntry (struct variable *v, oid *name, size_t *length,
        !           986:                int exact, size_t *var_len, WriteMethod **write_method)
        !           987: {
        !           988:   unsigned int ifindex, instid, rtrid;
        !           989:   struct ospf6_interface *oi = NULL;
        !           990:   struct ospf6_neighbor  *on = NULL;
        !           991:   struct interface      *iif;
        !           992:   struct listnode *i, *j;
        !           993:   struct list *ifslist;
        !           994:   oid *offset;
        !           995:   int offsetlen, len;
        !           996: 
        !           997:   if (smux_header_table (v, name, length, exact, var_len, write_method)
        !           998:       == MATCH_FAILED)
        !           999:     return NULL;
        !          1000: 
        !          1001:   ifindex = instid = rtrid = 0;
        !          1002: 
        !          1003:   /* Check OSPFv3 instance. */
        !          1004:   if (ospf6 == NULL)
        !          1005:     return NULL;
        !          1006: 
        !          1007:   /* Get variable length. */
        !          1008:   offset = name + v->namelen;
        !          1009:   offsetlen = *length - v->namelen;
        !          1010: 
        !          1011:   if (exact && offsetlen != 3)
        !          1012:     return NULL;
        !          1013: 
        !          1014:   /* Parse if index */
        !          1015:   len = (offsetlen < 1 ? 0 : 1);
        !          1016:   if (len)
        !          1017:     ifindex = *offset;
        !          1018:   offset += len;
        !          1019:   offsetlen -= len;
        !          1020: 
        !          1021:   /* Parse instance ID */
        !          1022:   len = (offsetlen < 1 ? 0 : 1);
        !          1023:   if (len)
        !          1024:     instid = *offset;
        !          1025:   offset += len;
        !          1026:   offsetlen -= len;
        !          1027: 
        !          1028:   /* Parse router ID */
        !          1029:   len = (offsetlen < 1 ? 0 : 1);
        !          1030:   if (len)
        !          1031:     rtrid = htonl (*offset);
        !          1032:   offset += len;
        !          1033:   offsetlen -= len;
        !          1034: 
        !          1035:   if (exact)
        !          1036:     {
        !          1037:       oi = ospf6_interface_lookup_by_ifindex (ifindex);
        !          1038:       if (!oi || oi->instance_id != instid) return NULL;
        !          1039:       on = ospf6_neighbor_lookup (rtrid, oi);
        !          1040:     }
        !          1041:   else
        !          1042:     {
        !          1043:       /* We build a sorted list of interfaces */
        !          1044:       ifslist = list_new ();
        !          1045:       if (!ifslist) return NULL;
        !          1046:       ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
        !          1047:       for (ALL_LIST_ELEMENTS_RO (iflist, i, iif))
        !          1048:        listnode_add_sort (ifslist, iif);
        !          1049: 
        !          1050:       for (ALL_LIST_ELEMENTS_RO (ifslist, i, iif))
        !          1051:         {
        !          1052:           if (!iif->ifindex) continue;
        !          1053:           oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
        !          1054:           if (!oi) continue;
        !          1055:           for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, j, on)) {
        !          1056:             if (iif->ifindex > ifindex ||
        !          1057:                 (iif->ifindex == ifindex &&
        !          1058:                  (oi->instance_id > instid ||
        !          1059:                   (oi->instance_id == instid &&
        !          1060:                    ntohl (on->router_id) > ntohl (rtrid)))))
        !          1061:               break;
        !          1062:           }
        !          1063:           if (on) break;
        !          1064:           oi = NULL;
        !          1065:           on = NULL;
        !          1066:         }
        !          1067: 
        !          1068:       list_delete_all_node (ifslist);
        !          1069:     }
        !          1070: 
        !          1071:   if (!oi || !on) return NULL;
        !          1072: 
        !          1073:   /* Add Index (IfIndex, IfInstId, RtrId) */
        !          1074:   *length = v->namelen + 3;
        !          1075:   offset = name + v->namelen;
        !          1076:   *offset = oi->interface->ifindex;
        !          1077:   offset++;
        !          1078:   *offset = oi->instance_id;
        !          1079:   offset++;
        !          1080:   *offset = ntohl (on->router_id);
        !          1081:   offset++;
        !          1082: 
        !          1083:   /* Return the current value of the variable */
        !          1084:   switch (v->magic)
        !          1085:     {
        !          1086:     case OSPFv3NBRADDRESSTYPE:
        !          1087:       return SNMP_INTEGER (2); /* IPv6 only */
        !          1088:     case OSPFv3NBRADDRESS:
        !          1089:       *var_len = sizeof (struct in6_addr);
        !          1090:       return (u_char *) &on->linklocal_addr;
        !          1091:     case OSPFv3NBROPTIONS:
        !          1092:       return SNMP_INTEGER (on->options[2]);
        !          1093:     case OSPFv3NBRPRIORITY:
        !          1094:       return SNMP_INTEGER (on->priority);
        !          1095:     case OSPFv3NBRSTATE:
        !          1096:       return SNMP_INTEGER (on->state);
        !          1097:     case OSPFv3NBREVENTS:
        !          1098:       return SNMP_INTEGER (on->state_change);
        !          1099:     case OSPFv3NBRLSRETRANSQLEN:
        !          1100:       return SNMP_INTEGER (on->retrans_list->count);
        !          1101:     case OSPFv3NBRHELLOSUPPRESSED:
        !          1102:       return SNMP_INTEGER (SNMP_FALSE);
        !          1103:     case OSPFv3NBRIFID:
        !          1104:       return SNMP_INTEGER (on->ifindex);
        !          1105:     case OSPFv3NBRRESTARTHELPERSTATUS:
        !          1106:     case OSPFv3NBRRESTARTHELPERAGE:
        !          1107:     case OSPFv3NBRRESTARTHELPEREXITREASON:
        !          1108:       /* Not implemented. Only works if all the last ones are not
        !          1109:         implemented! */
        !          1110:       return NULL;
        !          1111:     }
        !          1112: 
1.1       misho    1113:   return NULL;
                   1114: }
                   1115: 
1.1.1.2 ! misho    1116: /* OSPF Traps. */
        !          1117: #define NBRSTATECHANGE      2
        !          1118: #define IFSTATECHANGE      10
        !          1119: 
        !          1120: static struct trap_object ospf6NbrTrapList[] =
        !          1121: {
        !          1122:   {-3, {1, 1, OSPFv3ROUTERID}},
        !          1123:   {4, {1, 9, 1, OSPFv3NBRADDRESSTYPE}},
        !          1124:   {4, {1, 9, 1, OSPFv3NBRADDRESS}},
        !          1125:   {4, {1, 9, 1, OSPFv3NBRSTATE}}
        !          1126: };
        !          1127: 
        !          1128: static struct trap_object ospf6IfTrapList[] =
        !          1129: {
        !          1130:   {-3, {1, 1, OSPFv3ROUTERID}},
        !          1131:   {4, {1, 7, 1, OSPFv3IFSTATE}},
        !          1132:   {4, {1, 7, 1, OSPFv3IFADMINSTATUS}},
        !          1133:   {4, {1, 7, 1, OSPFv3IFAREAID}}
        !          1134: };
        !          1135: 
        !          1136: void
        !          1137: ospf6TrapNbrStateChange (struct ospf6_neighbor *on)
        !          1138: {
        !          1139:   oid index[3];
        !          1140: 
        !          1141:   index[0] = on->ospf6_if->interface->ifindex;
        !          1142:   index[1] = on->ospf6_if->instance_id;
        !          1143:   index[2] = ntohl (on->router_id);
        !          1144: 
        !          1145:   smux_trap (ospfv3_variables, sizeof ospfv3_variables / sizeof (struct variable),
        !          1146:             ospfv3_trap_oid, sizeof ospfv3_trap_oid / sizeof (oid),
        !          1147:             ospfv3_oid, sizeof ospfv3_oid / sizeof (oid),
        !          1148:              index,  3,
        !          1149:              ospf6NbrTrapList, 
        !          1150:              sizeof ospf6NbrTrapList / sizeof (struct trap_object),
        !          1151:              NBRSTATECHANGE);
        !          1152: }
        !          1153: 
        !          1154: void
        !          1155: ospf6TrapIfStateChange (struct ospf6_interface *oi)
        !          1156: {
        !          1157:   oid index[2];
        !          1158: 
        !          1159:   index[0] = oi->interface->ifindex;
        !          1160:   index[1] = oi->instance_id;
        !          1161: 
        !          1162:   smux_trap (ospfv3_variables, sizeof ospfv3_variables / sizeof (struct variable),
        !          1163:             ospfv3_trap_oid, sizeof ospfv3_trap_oid / sizeof (oid),
        !          1164:             ospfv3_oid, sizeof ospfv3_oid / sizeof (oid),
        !          1165:              index,  2,
        !          1166:              ospf6IfTrapList, 
        !          1167:              sizeof ospf6IfTrapList / sizeof (struct trap_object),
        !          1168:              IFSTATECHANGE);
        !          1169: }
1.1       misho    1170: 
                   1171: /* Register OSPFv3-MIB. */
                   1172: void
                   1173: ospf6_snmp_init (struct thread_master *master)
                   1174: {
                   1175:   smux_init (master);
                   1176:   REGISTER_MIB ("OSPFv3MIB", ospfv3_variables, variable, ospfv3_oid);
                   1177: }
                   1178: 
                   1179: #endif /* HAVE_SNMP */
                   1180: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>