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

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: #ifdef HAVE_NETSNMP
        !            27: #include <net-snmp/net-snmp-config.h>
        !            28: #include <net-snmp/net-snmp-includes.h>
        !            29: #else
        !            30: #include <asn1.h>
        !            31: #include <snmp.h>
        !            32: #include <snmp_impl.h>
        !            33: #endif
        !            34: 
        !            35: #include "log.h"
        !            36: #include "vty.h"
        !            37: #include "linklist.h"
        !            38: #include "smux.h"
        !            39: 
        !            40: #include "ospf6_proto.h"
        !            41: #include "ospf6_lsa.h"
        !            42: #include "ospf6_lsdb.h"
        !            43: #include "ospf6_route.h"
        !            44: #include "ospf6_top.h"
        !            45: #include "ospf6_area.h"
        !            46: #include "ospf6_interface.h"
        !            47: #include "ospf6_message.h"
        !            48: #include "ospf6_neighbor.h"
        !            49: #include "ospf6d.h"
        !            50: #include "ospf6_snmp.h"
        !            51: 
        !            52: /* OSPFv3-MIB */
        !            53: #define OSPFv3MIB 1,3,6,1,3,102
        !            54: 
        !            55: /* OSPFv3 MIB General Group values. */
        !            56: #define OSPFv3ROUTERID                   1
        !            57: #define OSPFv3ADMINSTAT                  2
        !            58: #define OSPFv3VERSIONNUMBER              3
        !            59: #define OSPFv3AREABDRRTRSTATUS           4
        !            60: #define OSPFv3ASBDRRTRSTATUS             5
        !            61: #define OSPFv3ASSCOPELSACOUNT            6
        !            62: #define OSPFv3ASSCOPELSACHECKSUMSUM      7
        !            63: #define OSPFv3ORIGINATENEWLSAS           8
        !            64: #define OSPFv3RXNEWLSAS                  9
        !            65: #define OSPFv3EXTLSACOUNT               10
        !            66: #define OSPFv3EXTAREALSDBLIMIT          11
        !            67: #define OSPFv3MULTICASTEXTENSIONS       12
        !            68: #define OSPFv3EXITOVERFLOWINTERVAL      13
        !            69: #define OSPFv3DEMANDEXTENSIONS          14
        !            70: #define OSPFv3TRAFFICENGINEERINGSUPPORT 15
        !            71: #define OSPFv3REFERENCEBANDWIDTH        16
        !            72: #define OSPFv3RESTARTSUPPORT            17
        !            73: #define OSPFv3RESTARTINTERVAL           18
        !            74: #define OSPFv3RESTARTSTATUS             19
        !            75: #define OSPFv3RESTARTAGE                20
        !            76: #define OSPFv3RESTARTEXITREASON         21
        !            77: 
        !            78: /* OSPFv3 MIB Area Table values. */
        !            79: #define OSPFv3AREAID                     1
        !            80: #define OSPFv3IMPORTASEXTERN             2
        !            81: #define OSPFv3AREASPFRUNS                3
        !            82: #define OSPFv3AREABDRRTRCOUNT            4
        !            83: #define OSPFv3AREAASBDRRTRCOUNT          5
        !            84: #define OSPFv3AREASCOPELSACOUNT          6
        !            85: #define OSPFv3AREASCOPELSACKSUMSUM       7
        !            86: #define OSPFv3AREASUMMARY                8
        !            87: #define OSPFv3AREASTATUS                 9
        !            88: #define OSPFv3STUBMETRIC                10
        !            89: #define OSPFv3AREANSSATRANSLATORROLE    11
        !            90: #define OSPFv3AREANSSATRANSLATORSTATE   12
        !            91: #define OSPFv3AREANSSATRANSLATORSTABILITYINTERVAL    13
        !            92: #define OSPFv3AREANSSATRANSLATOREVENTS  14
        !            93: #define OSPFv3AREASTUBMETRICTYPE        15
        !            94: 
        !            95: /* OSPFv3 MIB Area Lsdb Table values. */
        !            96: #define OSPFv3AREALSDBAREAID             1
        !            97: #define OSPFv3AREALSDBTYPE               2
        !            98: #define OSPFv3AREALSDBROUTERID           3
        !            99: #define OSPFv3AREALSDBLSID               4
        !           100: #define OSPFv3AREALSDBSEQUENCE           5
        !           101: #define OSPFv3AREALSDBAGE                6
        !           102: #define OSPFv3AREALSDBCHECKSUM           7
        !           103: #define OSPFv3AREALSDBADVERTISEMENT      8
        !           104: #define OSPFv3AREALSDBTYPEKNOWN          9
        !           105: 
        !           106: /* SYNTAX Status from OSPF-MIB. */
        !           107: #define OSPF_STATUS_ENABLED  1
        !           108: #define OSPF_STATUS_DISABLED 2
        !           109: 
        !           110: /* SNMP value hack. */
        !           111: #define COUNTER     ASN_COUNTER
        !           112: #define INTEGER     ASN_INTEGER
        !           113: #define GAUGE       ASN_GAUGE
        !           114: #define TIMETICKS   ASN_TIMETICKS
        !           115: #define IPADDRESS   ASN_IPADDRESS
        !           116: #define STRING      ASN_OCTET_STR
        !           117: 
        !           118: /* For return values e.g. SNMP_INTEGER macro */
        !           119: SNMP_LOCAL_VARIABLES
        !           120: 
        !           121: static struct in_addr tmp;
        !           122: #define INT32_INADDR(x) \
        !           123:   (tmp.s_addr = (x), tmp)
        !           124: 
        !           125: /* OSPFv3-MIB instances. */
        !           126: oid ospfv3_oid [] = { OSPFv3MIB };
        !           127: 
        !           128: /* empty ID 0.0.0.0 e.g. empty router-id */
        !           129: static struct in_addr ospf6_empty_id = {0};
        !           130: 
        !           131: /* Hook functions. */
        !           132: static u_char *ospfv3GeneralGroup (struct variable *, oid *, size_t *,
        !           133:                                   int, size_t *, WriteMethod **);
        !           134: static u_char *ospfv3AreaEntry (struct variable *, oid *, size_t *,
        !           135:                                int, size_t *, WriteMethod **);
        !           136: static u_char *ospfv3AreaLsdbEntry (struct variable *, oid *, size_t *,
        !           137:                                    int, size_t *, WriteMethod **);
        !           138: 
        !           139: struct variable ospfv3_variables[] =
        !           140: {
        !           141:   /* OSPF general variables */
        !           142:   {OSPFv3ROUTERID,              IPADDRESS, RWRITE, ospfv3GeneralGroup,
        !           143:    3, {1, 1, 1}},
        !           144:   {OSPFv3ADMINSTAT,             INTEGER,   RWRITE, ospfv3GeneralGroup,
        !           145:    3, {1, 1, 2}},
        !           146:   {OSPFv3VERSIONNUMBER,         INTEGER,   RONLY,  ospfv3GeneralGroup,
        !           147:    3, {1, 1, 3}},
        !           148:   {OSPFv3AREABDRRTRSTATUS,      INTEGER,   RONLY,  ospfv3GeneralGroup,
        !           149:    3, {1, 1, 4}},
        !           150:   {OSPFv3ASBDRRTRSTATUS,        INTEGER,   RWRITE, ospfv3GeneralGroup,
        !           151:    3, {1, 1, 5}},
        !           152:   {OSPFv3ASSCOPELSACOUNT,       GAUGE,     RONLY,  ospfv3GeneralGroup,
        !           153:    3, {1, 1, 6}},
        !           154:   {OSPFv3ASSCOPELSACHECKSUMSUM, INTEGER,   RONLY,  ospfv3GeneralGroup,
        !           155:    3, {1, 1, 7}},
        !           156:   {OSPFv3ORIGINATENEWLSAS,      COUNTER,   RONLY,  ospfv3GeneralGroup,
        !           157:    3, {1, 1, 8}},
        !           158:   {OSPFv3RXNEWLSAS,             COUNTER,   RONLY,  ospfv3GeneralGroup,
        !           159:    3, {1, 1, 9}},
        !           160:   {OSPFv3EXTLSACOUNT,           GAUGE,     RONLY,  ospfv3GeneralGroup,
        !           161:    3, {1, 1, 10}},
        !           162:   {OSPFv3EXTAREALSDBLIMIT,      INTEGER,   RWRITE, ospfv3GeneralGroup,
        !           163:    3, {1, 1, 11}},
        !           164:   {OSPFv3MULTICASTEXTENSIONS,   INTEGER,   RWRITE, ospfv3GeneralGroup,
        !           165:    3, {1, 1, 12}},
        !           166:   {OSPFv3EXITOVERFLOWINTERVAL,  INTEGER,   RWRITE, ospfv3GeneralGroup,
        !           167:    3, {1, 1, 13}},
        !           168:   {OSPFv3DEMANDEXTENSIONS,      INTEGER,   RWRITE, ospfv3GeneralGroup,
        !           169:    3, {1, 1, 14}},
        !           170:   {OSPFv3TRAFFICENGINEERINGSUPPORT, INTEGER, RWRITE, ospfv3GeneralGroup,
        !           171:    3, {1, 1, 15}},
        !           172:   {OSPFv3REFERENCEBANDWIDTH,    INTEGER, RWRITE, ospfv3GeneralGroup,
        !           173:    3, {1, 1, 16}},
        !           174:   {OSPFv3RESTARTSUPPORT,        INTEGER, RWRITE, ospfv3GeneralGroup,
        !           175:    3, {1, 1, 17}},
        !           176:   {OSPFv3RESTARTINTERVAL,       INTEGER, RWRITE, ospfv3GeneralGroup,
        !           177:    3, {1, 1, 18}},
        !           178:   {OSPFv3RESTARTSTATUS,         INTEGER, RONLY,  ospfv3GeneralGroup,
        !           179:    3, {1, 1, 19}},
        !           180:   {OSPFv3RESTARTAGE,            INTEGER, RONLY,  ospfv3GeneralGroup,
        !           181:    3, {1, 1, 20}},
        !           182:   {OSPFv3RESTARTEXITREASON,     INTEGER, RONLY,  ospfv3GeneralGroup,
        !           183:    3, {1, 1, 21}},
        !           184: 
        !           185:   /* OSPFv3 Area Data Structure */
        !           186:   {OSPFv3AREAID,                IPADDRESS, RONLY,  ospfv3AreaEntry,
        !           187:    4, {1, 2, 1, 1}},
        !           188:   {OSPFv3IMPORTASEXTERN,        INTEGER,   RWRITE, ospfv3AreaEntry,
        !           189:    4, {1, 2, 1, 2}},
        !           190:   {OSPFv3AREASPFRUNS,           COUNTER,   RONLY,  ospfv3AreaEntry,
        !           191:    4, {1, 2, 1, 3}},
        !           192:   {OSPFv3AREABDRRTRCOUNT,       GAUGE,     RONLY,  ospfv3AreaEntry,
        !           193:    4, {1, 2, 1, 4}},
        !           194:   {OSPFv3AREAASBDRRTRCOUNT,     GAUGE,     RONLY,  ospfv3AreaEntry,
        !           195:    4, {1, 2, 1, 5}},
        !           196:   {OSPFv3AREASCOPELSACOUNT,     GAUGE,     RONLY,  ospfv3AreaEntry,
        !           197:    4, {1, 2, 1, 6}},
        !           198:   {OSPFv3AREASCOPELSACKSUMSUM,  INTEGER,   RONLY,  ospfv3AreaEntry,
        !           199:    4, {1, 2, 1, 7}},
        !           200:   {OSPFv3AREASUMMARY,           INTEGER,   RWRITE, ospfv3AreaEntry,
        !           201:    4, {1, 2, 1, 8}},
        !           202:   {OSPFv3AREASTATUS,            INTEGER,   RWRITE, ospfv3AreaEntry,
        !           203:    4, {1, 2, 1, 9}},
        !           204:   {OSPFv3STUBMETRIC,            INTEGER,   RWRITE, ospfv3AreaEntry,
        !           205:    4, {1, 2, 1, 10}},
        !           206:   {OSPFv3AREANSSATRANSLATORROLE, INTEGER,  RWRITE, ospfv3AreaEntry,
        !           207:    4, {1, 2, 1, 11}},
        !           208:   {OSPFv3AREANSSATRANSLATORSTATE, INTEGER, RONLY,  ospfv3AreaEntry,
        !           209:    4, {1, 2, 1, 12}},
        !           210:   {OSPFv3AREANSSATRANSLATORSTABILITYINTERVAL, INTEGER, RWRITE, ospfv3AreaEntry,
        !           211:    4, {1, 2, 1, 13}},
        !           212:   {OSPFv3AREANSSATRANSLATOREVENTS, COUNTER, RONLY, ospfv3AreaEntry,
        !           213:    4, {1, 2, 1, 14}},
        !           214:   {OSPFv3AREASTUBMETRICTYPE,    INTEGER, RWRITE, ospfv3AreaEntry,
        !           215:    4, {1, 2, 1, 15}},
        !           216: 
        !           217:   {OSPFv3AREALSDBAREAID,        IPADDRESS, RONLY,  ospfv3AreaLsdbEntry,
        !           218:    4, {1, 4, 1, 1}},
        !           219:   {OSPFv3AREALSDBTYPE,          GAUGE,     RONLY,  ospfv3AreaLsdbEntry,
        !           220:    4, {1, 4, 1, 2}},
        !           221:   {OSPFv3AREALSDBROUTERID,      IPADDRESS, RONLY,  ospfv3AreaLsdbEntry,
        !           222:    4, {1, 4, 1, 3}},
        !           223:   {OSPFv3AREALSDBLSID,          IPADDRESS, RONLY,  ospfv3AreaLsdbEntry,
        !           224:    4, {1, 4, 1, 4}},
        !           225:   {OSPFv3AREALSDBSEQUENCE,      INTEGER,   RONLY,  ospfv3AreaLsdbEntry,
        !           226:    4, {1, 4, 1, 5}},
        !           227:   {OSPFv3AREALSDBAGE,           INTEGER,   RONLY,  ospfv3AreaLsdbEntry,
        !           228:    4, {1, 4, 1, 6}},
        !           229:   {OSPFv3AREALSDBCHECKSUM,      INTEGER,   RONLY,  ospfv3AreaLsdbEntry,
        !           230:    4, {1, 4, 1, 7}},
        !           231:   {OSPFv3AREALSDBADVERTISEMENT, STRING,    RONLY,  ospfv3AreaLsdbEntry,
        !           232:    4, {1, 4, 1, 8}},
        !           233:   {OSPFv3AREALSDBTYPEKNOWN,     INTEGER,   RONLY,  ospfv3AreaLsdbEntry,
        !           234:    4, {1, 4, 1, 9}},
        !           235: 
        !           236: };
        !           237: 
        !           238: static u_char *
        !           239: ospfv3GeneralGroup (struct variable *v, oid *name, size_t *length,
        !           240:                     int exact, size_t *var_len, WriteMethod **write_method)
        !           241: {
        !           242:   /* Check whether the instance identifier is valid */
        !           243:   if (smux_header_generic (v, name, length, exact, var_len, write_method)
        !           244:       == MATCH_FAILED)
        !           245:     return NULL;
        !           246: 
        !           247:   /* Return the current value of the variable */
        !           248:   switch (v->magic)
        !           249:     {
        !           250:     case OSPFv3ROUTERID:                  /* 1*/
        !           251:       /* Router-ID of this OSPF instance. */
        !           252:       if (ospf6)
        !           253:        return SNMP_IPADDRESS (INT32_INADDR (ospf6->router_id));
        !           254:       else
        !           255:        return SNMP_IPADDRESS (ospf6_empty_id);
        !           256:       break;
        !           257:     case OSPFv3ADMINSTAT:                 /* 2*/
        !           258:       break;
        !           259:     case OSPFv3VERSIONNUMBER:             /* 3*/
        !           260:       break;
        !           261:     case OSPFv3AREABDRRTRSTATUS:          /* 4*/
        !           262:       break;
        !           263:     case OSPFv3ASBDRRTRSTATUS:            /* 5*/
        !           264:       break;
        !           265:     case OSPFv3ASSCOPELSACOUNT:           /* 6*/
        !           266:       break;
        !           267:     case OSPFv3ASSCOPELSACHECKSUMSUM:     /* 7*/
        !           268:       break;
        !           269:     case OSPFv3ORIGINATENEWLSAS:          /* 8*/
        !           270:       break;
        !           271:     case OSPFv3RXNEWLSAS:                 /* 9*/
        !           272:       break;
        !           273:     case OSPFv3EXTLSACOUNT:               /*10*/
        !           274:       break;
        !           275:     case OSPFv3EXTAREALSDBLIMIT:          /*11*/
        !           276:       break;
        !           277:     case OSPFv3MULTICASTEXTENSIONS:       /*12*/
        !           278:       break;
        !           279:     case OSPFv3EXITOVERFLOWINTERVAL:      /*13*/
        !           280:       break;
        !           281:     case OSPFv3DEMANDEXTENSIONS:          /*14*/
        !           282:       break;
        !           283:     case OSPFv3TRAFFICENGINEERINGSUPPORT: /*15*/
        !           284:       break;
        !           285:     case OSPFv3REFERENCEBANDWIDTH:        /*16*/
        !           286:       break;
        !           287:     case OSPFv3RESTARTSUPPORT:            /*17*/
        !           288:       break;
        !           289:     case OSPFv3RESTARTINTERVAL:           /*18*/
        !           290:       break;
        !           291:     case OSPFv3RESTARTSTATUS:             /*19*/
        !           292:       break;
        !           293:     case OSPFv3RESTARTAGE:                /*20*/
        !           294:       break;
        !           295:     case OSPFv3RESTARTEXITREASON:         /*21*/
        !           296:       break;
        !           297:     default:
        !           298:       return NULL;
        !           299:     }
        !           300:   return NULL;
        !           301: }
        !           302: 
        !           303: static u_char *
        !           304: ospfv3AreaEntry (struct variable *v, oid *name, size_t *length,
        !           305:                  int exact, size_t *var_len, WriteMethod **write_method)
        !           306: {
        !           307:   struct ospf6_area *oa, *area = NULL;
        !           308:   u_int32_t area_id = 0;
        !           309:   struct listnode *node;
        !           310:   unsigned int len;
        !           311: 
        !           312:   if (ospf6 == NULL)
        !           313:     return NULL;
        !           314: 
        !           315:   len = *length - v->namelen;
        !           316:   len = (len >= sizeof (u_int32_t) ? sizeof (u_int32_t) : 0);
        !           317:   if (exact && len != sizeof (u_int32_t))
        !           318:     return NULL;
        !           319:   if (len)
        !           320:     oid2in_addr (name + v->namelen, len, (struct in_addr *) &area_id);
        !           321: 
        !           322:   zlog_debug ("SNMP access by area: %s, exact=%d len=%d length=%lu",
        !           323:              inet_ntoa (* (struct in_addr *) &area_id),
        !           324:              exact, len, (u_long)*length);
        !           325: 
        !           326:   for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
        !           327:     {
        !           328:       if (area == NULL)
        !           329:         {
        !           330:           if (len == 0) /* return first area entry */
        !           331:             area = oa;
        !           332:           else if (exact && ntohl (oa->area_id) == ntohl (area_id))
        !           333:             area = oa;
        !           334:           else if (ntohl (oa->area_id) > ntohl (area_id))
        !           335:             area = oa;
        !           336:         }
        !           337:     }
        !           338: 
        !           339:   if (area == NULL)
        !           340:     return NULL;
        !           341: 
        !           342:   *length = v->namelen + sizeof (u_int32_t);
        !           343:   oid_copy_addr (name + v->namelen, (struct in_addr *) &area->area_id,
        !           344:                  sizeof (u_int32_t));
        !           345: 
        !           346:   zlog_debug ("SNMP found area: %s, exact=%d len=%d length=%lu",
        !           347:              inet_ntoa (* (struct in_addr *) &area->area_id),
        !           348:              exact, len, (u_long)*length);
        !           349: 
        !           350:   switch (v->magic)
        !           351:     {
        !           352:     case OSPFv3AREAID:                   /* 1*/
        !           353:       return SNMP_IPADDRESS (INT32_INADDR (area->area_id));
        !           354:       break;
        !           355:     case OSPFv3IMPORTASEXTERN:           /* 2*/
        !           356:       return SNMP_INTEGER (ospf6->external_table->count);
        !           357:       break;
        !           358:     default:
        !           359:       return NULL;
        !           360:       break;
        !           361:     }
        !           362:   return NULL;
        !           363: }
        !           364: 
        !           365: static u_char *
        !           366: ospfv3AreaLsdbEntry (struct variable *v, oid *name, size_t *length,
        !           367:                      int exact, size_t *var_len, WriteMethod **write_method)
        !           368: {
        !           369:   struct ospf6_lsa *lsa = NULL;
        !           370:   struct in_addr area_id;
        !           371:   u_int16_t type;
        !           372:   struct in_addr id;
        !           373:   struct in_addr adv_router;
        !           374:   int len;
        !           375:   oid *offset;
        !           376:   int offsetlen;
        !           377:   char a[16], b[16], c[16];
        !           378:   struct ospf6_area *oa;
        !           379:   struct listnode *node;
        !           380: 
        !           381:   memset (&area_id, 0, sizeof (struct in_addr));
        !           382:   type = 0;
        !           383:   memset (&id, 0, sizeof (struct in_addr));
        !           384:   memset (&adv_router, 0, sizeof (struct in_addr));
        !           385: 
        !           386:   /* Check OSPFv3 instance. */
        !           387:   if (ospf6 == NULL)
        !           388:     return NULL;
        !           389: 
        !           390:   /* Get variable length. */
        !           391:   offset = name + v->namelen;
        !           392:   offsetlen = *length - v->namelen;
        !           393: 
        !           394: #define OSPFV3_AREA_LSDB_ENTRY_EXACT_OFFSET \
        !           395:   (IN_ADDR_SIZE + 1 + IN_ADDR_SIZE + IN_ADDR_SIZE)
        !           396: 
        !           397:   if (exact && offsetlen != OSPFV3_AREA_LSDB_ENTRY_EXACT_OFFSET)
        !           398:     return NULL;
        !           399: 
        !           400:   /* Parse area-id */
        !           401:   len = (offsetlen < IN_ADDR_SIZE ? offsetlen : IN_ADDR_SIZE);
        !           402:   if (len)
        !           403:     oid2in_addr (offset, len, &area_id);
        !           404:   offset += len;
        !           405:   offsetlen -= len;
        !           406: 
        !           407:   /* Parse type */
        !           408:   len = (offsetlen < 1 ? offsetlen : 1);
        !           409:   if (len)
        !           410:     type = htons (*offset);
        !           411:   offset += len;
        !           412:   offsetlen -= len;
        !           413: 
        !           414:   /* Parse Router-ID */
        !           415:   len = (offsetlen < IN_ADDR_SIZE ? offsetlen : IN_ADDR_SIZE);
        !           416:   if (len)
        !           417:     oid2in_addr (offset, len, &adv_router);
        !           418:   offset += len;
        !           419:   offsetlen -= len;
        !           420: 
        !           421:   /* Parse LS-ID */
        !           422:   len = (offsetlen < IN_ADDR_SIZE ? offsetlen : IN_ADDR_SIZE);
        !           423:   if (len)
        !           424:     oid2in_addr (offset, len, &id);
        !           425:   offset += len;
        !           426:   offsetlen -= len;
        !           427: 
        !           428:   inet_ntop (AF_INET, &area_id, a, sizeof (a));
        !           429:   inet_ntop (AF_INET, &adv_router, b, sizeof (b));
        !           430:   inet_ntop (AF_INET, &id, c, sizeof (c));
        !           431:   zlog_debug ("SNMP access by lsdb: area=%s exact=%d length=%lu magic=%d"
        !           432:              " type=%#x adv_router=%s id=%s",
        !           433:              a, exact, (u_long)*length, v->magic, ntohs (type), b, c);
        !           434: 
        !           435:   if (exact)
        !           436:     {
        !           437:       oa = ospf6_area_lookup (area_id.s_addr, ospf6);
        !           438:       lsa = ospf6_lsdb_lookup (type, id.s_addr, adv_router.s_addr, oa->lsdb);
        !           439:     }
        !           440:   else
        !           441:     {
        !           442:       for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
        !           443:         {
        !           444:           if (lsa)
        !           445:             continue;
        !           446:           if (ntohl (oa->area_id) < ntohl (area_id.s_addr))
        !           447:             continue;
        !           448: 
        !           449:           lsa = ospf6_lsdb_lookup_next (type, id.s_addr, adv_router.s_addr,
        !           450:                                         oa->lsdb);
        !           451:           if (! lsa)
        !           452:             {
        !           453:               type = 0;
        !           454:               memset (&id, 0, sizeof (struct in_addr));
        !           455:               memset (&adv_router, 0, sizeof (struct in_addr));
        !           456:             }
        !           457:         }
        !           458:     }
        !           459: 
        !           460:   if (! lsa)
        !           461:     {
        !           462:       zlog_debug ("SNMP respond: No LSA to return");
        !           463:       return NULL;
        !           464:     }
        !           465:   oa = OSPF6_AREA (lsa->lsdb->data);
        !           466: 
        !           467:   zlog_debug ("SNMP respond: area: %s lsa: %s", oa->name, lsa->name);
        !           468: 
        !           469:   /* Add Index (AreaId, Type, RouterId, Lsid) */
        !           470:   *length = v->namelen + OSPFV3_AREA_LSDB_ENTRY_EXACT_OFFSET;
        !           471:   offset = name + v->namelen;
        !           472:   oid_copy_addr (offset, (struct in_addr *) &oa->area_id, IN_ADDR_SIZE);
        !           473:   offset += IN_ADDR_SIZE;
        !           474:   *offset = ntohs (lsa->header->type);
        !           475:   offset++;
        !           476:   oid_copy_addr (offset, (struct in_addr *) &lsa->header->adv_router,
        !           477:                  IN_ADDR_SIZE);
        !           478:   offset += IN_ADDR_SIZE;
        !           479:   oid_copy_addr (offset, (struct in_addr *) &lsa->header->id, IN_ADDR_SIZE);
        !           480:   offset += IN_ADDR_SIZE;
        !           481: 
        !           482:   /* Return the current value of the variable */
        !           483:   switch (v->magic)
        !           484:     {
        !           485:     case OSPFv3AREALSDBAREAID:        /* 1 */
        !           486:       area_id.s_addr = OSPF6_AREA (lsa->lsdb->data)->area_id;
        !           487:       return SNMP_IPADDRESS (area_id);
        !           488:       break;
        !           489:     case OSPFv3AREALSDBTYPE:          /* 2 */
        !           490:       return SNMP_INTEGER (ntohs (lsa->header->type));
        !           491:       break;
        !           492:     case OSPFv3AREALSDBROUTERID:      /* 3 */
        !           493:       adv_router.s_addr = lsa->header->adv_router;
        !           494:       return SNMP_IPADDRESS (adv_router);
        !           495:       break;
        !           496:     case OSPFv3AREALSDBLSID:          /* 4 */
        !           497:       id.s_addr = lsa->header->id;
        !           498:       return SNMP_IPADDRESS (id);
        !           499:       break;
        !           500:     case OSPFv3AREALSDBSEQUENCE:      /* 5 */
        !           501:       return SNMP_INTEGER (lsa->header->seqnum);
        !           502:       break;
        !           503:     case OSPFv3AREALSDBAGE:           /* 6 */
        !           504:       ospf6_lsa_age_current (lsa);
        !           505:       return SNMP_INTEGER (lsa->header->age);
        !           506:       break;
        !           507:     case OSPFv3AREALSDBCHECKSUM:      /* 7 */
        !           508:       return SNMP_INTEGER (lsa->header->checksum);
        !           509:       break;
        !           510:     case OSPFv3AREALSDBADVERTISEMENT: /* 8 */
        !           511:       *var_len = ntohs (lsa->header->length);
        !           512:       return (u_char *) lsa->header;
        !           513:       break;
        !           514:     case OSPFv3AREALSDBTYPEKNOWN:     /* 9 */
        !           515:       return SNMP_INTEGER (OSPF6_LSA_IS_KNOWN (lsa->header->type) ?
        !           516:                            SNMP_TRUE : SNMP_FALSE);
        !           517:       break;
        !           518:     default:
        !           519:       return NULL;
        !           520:       break;
        !           521:     }
        !           522:   return NULL;
        !           523: }
        !           524: 
        !           525: 
        !           526: /* Register OSPFv3-MIB. */
        !           527: void
        !           528: ospf6_snmp_init (struct thread_master *master)
        !           529: {
        !           530:   smux_init (master);
        !           531:   REGISTER_MIB ("OSPFv3MIB", ospfv3_variables, variable, ospfv3_oid);
        !           532: }
        !           533: 
        !           534: #endif /* HAVE_SNMP */
        !           535: 

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