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

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

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