File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospf6d / ospf6_snmp.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 5 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

    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>