File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospf6d / ospf6_snmp.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jul 21 23:54:40 2013 UTC (11 years ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, HEAD
0.99.22

    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 */
   47: #define OSPFv3MIB 1,3,6,1,2,1,191
   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
   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
   75: 
   76: /* OSPFv3 MIB Area Table values: ospfv3AreaTable */
   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
   84: #define OSPFv3AREAROWSTATUS              9
   85: #define OSPFv3AREASTUBMETRIC            10
   86: #define OSPFv3AREANSSATRANSLATORROLE    11
   87: #define OSPFv3AREANSSATRANSLATORSTATE   12
   88: #define OSPFv3AREANSSATRANSLATORSTABINTERVAL    13
   89: #define OSPFv3AREANSSATRANSLATOREVENTS  14
   90: #define OSPFv3AREASTUBMETRICTYPE        15
   91: #define OSPFv3AREATEENABLED             16
   92: 
   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
  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
  197: #define UNSIGNED    ASN_UNSIGNED
  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 };
  207: oid ospfv3_trap_oid [] = { OSPFv3MIB, 0 };
  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 **);
  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 **);
  220: 
  221: struct variable ospfv3_variables[] =
  222: {
  223:   /* OSPF general variables */
  224:   {OSPFv3ROUTERID,             UNSIGNED,   RWRITE, ospfv3GeneralGroup,
  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}},
  236:   {OSPFv3ASSCOPELSACHECKSUMSUM,UNSIGNED,   RONLY,  ospfv3GeneralGroup,
  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}},
  246:   {OSPFv3EXITOVERFLOWINTERVAL, UNSIGNED,   RWRITE, ospfv3GeneralGroup,
  247:    3, {1, 1, 12}},
  248:   {OSPFv3DEMANDEXTENSIONS,      INTEGER,   RWRITE, ospfv3GeneralGroup,
  249:    3, {1, 1, 13}},
  250:   {OSPFv3REFERENCEBANDWIDTH,   UNSIGNED, RWRITE, ospfv3GeneralGroup,
  251:    3, {1, 1, 14}},
  252:   {OSPFv3RESTARTSUPPORT,        INTEGER, RWRITE, ospfv3GeneralGroup,
  253:    3, {1, 1, 15}},
  254:   {OSPFv3RESTARTINTERVAL,      UNSIGNED, RWRITE, ospfv3GeneralGroup,
  255:    3, {1, 1, 16}},
  256:   {OSPFv3RESTARTSTRICTLSACHECKING, INTEGER, RWRITE, ospfv3GeneralGroup,
  257:    3, {1, 1, 17}},
  258:   {OSPFv3RESTARTSTATUS,         INTEGER, RONLY,  ospfv3GeneralGroup,
  259:    3, {1, 1, 18}},
  260:   {OSPFv3RESTARTAGE,           UNSIGNED, RONLY,  ospfv3GeneralGroup,
  261:    3, {1, 1, 19}},
  262:   {OSPFv3RESTARTEXITREASON,     INTEGER, RONLY,  ospfv3GeneralGroup,
  263:    3, {1, 1, 20}},
  264:   {OSPFv3NOTIFICATIONENABLE,    INTEGER, RWRITE, ospfv3GeneralGroup,
  265:    3, {1, 1, 21}},
  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}},
  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}},
  286:   {OSPFv3AREASCOPELSACKSUMSUM, UNSIGNED,   RONLY,  ospfv3AreaEntry,
  287:    4, {1, 2, 1, 7}},
  288:   {OSPFv3AREASUMMARY,           INTEGER,   RWRITE, ospfv3AreaEntry,
  289:    4, {1, 2, 1, 8}},
  290:   {OSPFv3AREAROWSTATUS,         INTEGER,   RWRITE, ospfv3AreaEntry,
  291:    4, {1, 2, 1, 9}},
  292:   {OSPFv3AREASTUBMETRIC,        INTEGER,   RWRITE, ospfv3AreaEntry,
  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}},
  298:   {OSPFv3AREANSSATRANSLATORSTABINTERVAL, UNSIGNED, RWRITE, ospfv3AreaEntry,
  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}},
  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}},
  318: 
  319:   /* OSPFv3 Area LSDB */
  320:   {OSPFv3WWLSDBSEQUENCE | OSPFv3WWAREATABLE,      INTEGER,   RONLY,  ospfv3WwLsdbEntry,
  321:    4, {1, 4, 1, 5}},
  322:   {OSPFv3WWLSDBAGE | OSPFv3WWAREATABLE,           UNSIGNED,  RONLY,  ospfv3WwLsdbEntry,
  323:    4, {1, 4, 1, 6}},
  324:   {OSPFv3WWLSDBCHECKSUM | OSPFv3WWAREATABLE,      INTEGER,   RONLY,  ospfv3WwLsdbEntry,
  325:    4, {1, 4, 1, 7}},
  326:   {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWAREATABLE, STRING,    RONLY,  ospfv3WwLsdbEntry,
  327:    4, {1, 4, 1, 8}},
  328:   {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWAREATABLE,     INTEGER,   RONLY,  ospfv3WwLsdbEntry,
  329:    4, {1, 4, 1, 9}},
  330: 
  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}},
  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: {
  422:   u_int16_t sum;
  423:   u_int32_t count;
  424:   struct ospf6_lsa *lsa = NULL;
  425: 
  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:     {
  434:     case OSPFv3ROUTERID:
  435:       /* Router-ID of this OSPF instance. */
  436:       if (ospf6)
  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 */
  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;
  514:   struct ospf6_lsa *lsa = NULL;
  515:   u_int32_t area_id = 0;
  516:   u_int32_t count;
  517:   u_int16_t sum;
  518:   struct listnode *node;
  519:   unsigned int len;
  520:   char a[16];
  521:   struct ospf6_route *ro;
  522: 
  523:   if (ospf6 == NULL)
  524:     return NULL;
  525: 
  526:   if (smux_header_table(v, name, length, exact, var_len, write_method)
  527:       == MATCH_FAILED)
  528:     return NULL;
  529: 
  530:   len = *length - v->namelen;
  531:   len = (len >= 1 ? sizeof 1 : 0);
  532:   if (exact && len != 1)
  533:     return NULL;
  534:   if (len)
  535:     area_id  = htonl (name[v->namelen]);
  536: 
  537:   inet_ntop (AF_INET, &area_id, a, sizeof (a));
  538:   zlog_debug ("SNMP access by area: %s, exact=%d len=%d length=%lu",
  539: 	      a, exact, len, (u_long)*length);
  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: 
  557:   *length = v->namelen + 1;
  558:   name[v->namelen] = ntohl (area->area_id);
  559: 
  560:   inet_ntop (AF_INET, &area->area_id, a, sizeof (a));
  561:   zlog_debug ("SNMP found area: %s, exact=%d len=%d length=%lu",
  562: 	      a, exact, len, (u_long)*length);
  563: 
  564:   switch (v->magic)
  565:     {
  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. */
  606:       return NULL;
  607:     }
  608:   return NULL;
  609: }
  610: 
  611: static int
  612: if_icmp_func (struct interface *ifp1, struct interface *ifp2)
  613: {
  614:   return (ifp1->ifindex - ifp2->ifindex);
  615: }
  616: 
  617: static u_char *
  618: ospfv3WwLsdbEntry (struct variable *v, oid *name, size_t *length,
  619:                      int exact, size_t *var_len, WriteMethod **write_method)
  620: {
  621:   struct ospf6_lsa *lsa = NULL;
  622:   u_int32_t ifindex, area_id, id, instid, adv_router;
  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;
  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;
  637: 
  638:   instid = ifindex = area_id = type = id = adv_router = 0;
  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: 
  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)
  653:     return NULL;
  654: 
  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:     }
  680: 
  681:   /* Parse type */
  682:   len = (offsetlen < 1 ? 0 : 1);
  683:   if (len)
  684:     type = htons (*offset);
  685:   offset += len;
  686:   offsetlen -= len;
  687: 
  688:   /* Parse Router-ID */
  689:   len = (offsetlen < 1 ? 0 : 1);
  690:   if (len)
  691:     adv_router = htonl (*offset);
  692:   offset += len;
  693:   offsetlen -= len;
  694: 
  695:   /* Parse LS-ID */
  696:   len = (offsetlen < 1 ? 0 : 1);
  697:   if (len)
  698:     id = htonl (*offset);
  699:   offset += len;
  700:   offsetlen -= len;
  701: 
  702:   if (exact)
  703:     {
  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:         }
  720:     }
  721:   else
  722:     {
  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)
  744:         {
  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))
  753:             {
  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;
  764:               type = 0;
  765:               id = 0;
  766:               adv_router = 0;
  767:               oi = NULL;
  768:             }
  769: 
  770:           list_delete_all_node (ifslist);
  771:         }
  772:     }
  773: 
  774:   if (! lsa)
  775:       return NULL;
  776: 
  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:     }
  799:   *offset = ntohs (lsa->header->type);
  800:   offset++;
  801:   *offset = ntohl (lsa->header->adv_router);
  802:   offset++;
  803:   *offset = ntohl (lsa->header->id);
  804:   offset++;
  805: 
  806:   /* Return the current value of the variable */
  807:   switch (v->magic & OSPFv3WWCOLUMN)
  808:     {
  809:     case OSPFv3WWLSDBSEQUENCE:
  810:       return SNMP_INTEGER (ntohl (lsa->header->seqnum));
  811:       break;
  812:     case OSPFv3WWLSDBAGE:
  813:       ospf6_lsa_age_current (lsa);
  814:       return SNMP_INTEGER (ntohs (lsa->header->age));
  815:       break;
  816:     case OSPFv3WWLSDBCHECKSUM:
  817:       return SNMP_INTEGER (ntohs (lsa->header->checksum));
  818:       break;
  819:     case OSPFv3WWLSDBADVERTISEMENT:
  820:       *var_len = ntohs (lsa->header->length);
  821:       return (u_char *) lsa->header;
  822:       break;
  823:     case OSPFv3WWLSDBTYPEKNOWN:
  824:       return SNMP_INTEGER (OSPF6_LSA_IS_KNOWN (lsa->header->type) ?
  825:                            SNMP_TRUE : SNMP_FALSE);
  826:       break;
  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! */
  974:       return NULL;
  975:     }
  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: 
 1113:   return NULL;
 1114: }
 1115: 
 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: }
 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>