ospf6_snmp.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:17k
源码类别:

网络

开发平台:

Unix_Linux

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