snmp_ospf.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:12k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: snmp_ospf.c,v 5.0 2002/04/20 07:30:06 hardaker Exp $ 
  3.  */
  4. /*
  5.  * Smux module authored by Rohit Dube.
  6.  */
  7. #include <net-snmp/net-snmp-config.h>
  8. #include <stdio.h>
  9. #if HAVE_STDLIB_H
  10. #include <stdlib.h>
  11. #endif
  12. #if HAVE_STRING_H
  13. #include <string.h>
  14. #else
  15. #include <strings.h>
  16. #endif
  17. #if HAVE_UNISTD_H
  18. #include <unistd.h>
  19. #endif
  20. #if HAVE_ERR_H
  21. #include <err.h>
  22. #endif
  23. #if TIME_WITH_SYS_TIME
  24. # include <sys/time.h>
  25. # include <time.h>
  26. #else
  27. # if HAVE_SYS_TIME_H
  28. #  include <sys/time.h>
  29. # else
  30. #  include <time.h>
  31. # endif
  32. #endif
  33. #include <errno.h>
  34. #include <netdb.h>
  35. #include <sys/stat.h>
  36. #include <sys/socket.h>
  37. #if HAVE_SYS_FILIO_H
  38. #include <sys/filio.h>
  39. #endif
  40. #if HAVE_NETINET_IN_H
  41. #include <netinet/in.h>
  42. #endif
  43. #include <net-snmp/net-snmp-includes.h>
  44. #include <net-snmp/agent/net-snmp-agent-includes.h>
  45. #include "smux.h"
  46. #include "snmp_ospf.h"
  47. static oid      max_ospf_mib[] = { 1, 3, 6, 1, 2, 1, 14, 14, 1, 6, 0 };
  48. static oid      min_ospf_mib[] =
  49.     { 1, 3, 6, 1, 2, 1, 14, 1, 1, 0, 0, 0, 0 };
  50. extern u_char   smux_type;
  51. struct variable13 ospf_variables[] = {
  52.     {ospfRouterId, ASN_IPADDRESS, RWRITE, var_ospf, 3, {1, 1, 1}},
  53.     {ospfAdminStat, ASN_INTEGER, RWRITE, var_ospf, 3, {1, 1, 2}},
  54.     {ospfVersionNumber, ASN_INTEGER, RONLY, var_ospf, 3, {1, 1, 3}},
  55.     {ospfAreaBdrRtrStatus, ASN_INTEGER, RONLY, var_ospf, 3, {1, 1, 4}},
  56.     {ospfASBdrRtrStatus, ASN_INTEGER, RWRITE, var_ospf, 3, {1, 1, 5}},
  57.     {ospfExternLsaCount, ASN_GAUGE, RONLY, var_ospf, 3, {1, 1, 6}},
  58.     {ospfExternLsaCksumSum, ASN_INTEGER, RONLY, var_ospf, 3, {1, 1, 7}},
  59.     {ospfTOSSupport, ASN_INTEGER, RWRITE, var_ospf, 3, {1, 1, 8}},
  60.     {ospfOriginateNewLsas, ASN_COUNTER, RONLY, var_ospf, 3, {1, 1, 9}},
  61.     {ospfRxNewLsas, ASN_COUNTER, RONLY, var_ospf, 3, {1, 1, 10, 0}},
  62.     {ospfExtLsdbLimit, ASN_INTEGER, RWRITE, var_ospf, 3, {1, 1, 11}},
  63.     {ospfMulticastExtensions, ASN_INTEGER, RWRITE, var_ospf, 3,
  64.      {1, 1, 12}},
  65.     {ospfAreaId, ASN_IPADDRESS, RONLY, var_ospf, 3, {2, 1, 1}},
  66.     {ospfAuthType, ASN_INTEGER, RWRITE, var_ospf, 3, {2, 1, 2}},
  67.     {ospfImportAsExtern, ASN_INTEGER, RWRITE, var_ospf, 3, {2, 1, 3}},
  68.     {ospfSpfRuns, ASN_COUNTER, RONLY, var_ospf, 3, {2, 1, 4}},
  69.     {ospfAreaBdrRtrCount, ASN_GAUGE, RONLY, var_ospf, 3, {2, 1, 5}},
  70.     {ospfAsBdrRtrCount, ASN_GAUGE, RONLY, var_ospf, 3, {2, 1, 6}},
  71.     {ospfAreaLsaCount, ASN_GAUGE, RONLY, var_ospf, 3, {2, 1, 7}},
  72.     {ospfAreaLsaCksumSum, ASN_INTEGER, RONLY, var_ospf, 3, {2, 1, 8}},
  73.     {ospfAreaSummary, ASN_INTEGER, RWRITE, var_ospf, 3, {2, 1, 9}},
  74.     {ospfAreaStatus, ASN_INTEGER, RWRITE, var_ospf, 3, {2, 1, 10}},
  75.     {ospfStubAreaId, ASN_IPADDRESS, RONLY, var_ospf, 3, {3, 1, 1}},
  76.     {ospfStubTOS, ASN_INTEGER, RONLY, var_ospf, 3, {3, 1, 2}},
  77.     {ospfStubMetric, ASN_INTEGER, RWRITE, var_ospf, 3, {3, 1, 3}},
  78.     {ospfStubStatus, ASN_INTEGER, RWRITE, var_ospf, 3, {3, 1, 4}},
  79.     {ospfStubMetricType, ASN_INTEGER, RWRITE, var_ospf, 3, {3, 1, 5}},
  80.     {ospfLsdbAreaId, ASN_IPADDRESS, RONLY, var_ospf, 3, {4, 1, 1}},
  81.     {ospfLsdbType, ASN_INTEGER, RONLY, var_ospf, 3, {4, 1, 2}},
  82.     {ospfLsdbLsid, ASN_IPADDRESS, RONLY, var_ospf, 3, {4, 1, 3}},
  83.     {ospfLsdbRouterId, ASN_IPADDRESS, RONLY, var_ospf, 3, {4, 1, 4}},
  84.     {ospfLsdbSequence, ASN_INTEGER, RONLY, var_ospf, 3, {4, 1, 5}},
  85.     {ospfLsdbAge, ASN_INTEGER, RONLY, var_ospf, 3, {4, 1, 6}},
  86.     {ospfLsdbChecksum, ASN_INTEGER, RONLY, var_ospf, 3, {4, 1, 7}},
  87.     {ospfLsdbAdvertisement, ASN_OCTET_STR, RONLY, var_ospf, 3, {4, 1, 8}},
  88.     {ospfAreaRangeAreaId, ASN_IPADDRESS, RONLY, var_ospf, 3, {5, 1, 1}},
  89.     {ospfAreaRangeNet, ASN_IPADDRESS, RONLY, var_ospf, 3, {5, 1, 2}},
  90.     {ospfAreaRangeMask, ASN_IPADDRESS, RWRITE, var_ospf, 3, {5, 1, 3}},
  91.     {ospfAreaRangeStatus, ASN_INTEGER, RWRITE, var_ospf, 3, {5, 1, 4}},
  92.     {ospfAreaRangeEffect, ASN_INTEGER, RWRITE, var_ospf, 3, {5, 1, 5}},
  93.     {ospfHostIpAddress, ASN_IPADDRESS, RONLY, var_ospf, 3, {6, 1, 1}},
  94.     {ospfHostTOS, ASN_INTEGER, RONLY, var_ospf, 3, {6, 1, 2}},
  95.     {ospfHostMetric, ASN_INTEGER, RWRITE, var_ospf, 3, {6, 1, 3}},
  96.     {ospfHostStatus, ASN_INTEGER, RWRITE, var_ospf, 3, {6, 1, 4}},
  97.     {ospfHostAreaID, ASN_IPADDRESS, RONLY, var_ospf, 3, {6, 1, 5}},
  98.     {ospfIfIpAddress, ASN_IPADDRESS, RONLY, var_ospf, 3, {7, 1, 1}},
  99.     {ospfAddressLessIf, ASN_INTEGER, RONLY, var_ospf, 3, {7, 1, 2}},
  100.     {ospfIfAreaId, ASN_IPADDRESS, RWRITE, var_ospf, 3, {7, 1, 3}},
  101.     {ospfIfType, ASN_INTEGER, RWRITE, var_ospf, 3, {7, 1, 4}},
  102.     {ospfIfAdminStat, ASN_INTEGER, RWRITE, var_ospf, 3, {7, 1, 5}},
  103.     {ospfIfRtrPriority, ASN_INTEGER, RWRITE, var_ospf, 3, {7, 1, 6}},
  104.     {ospfIfTransitDelay, ASN_INTEGER, RWRITE, var_ospf, 3, {7, 1, 7}},
  105.     {ospfIfRetransInterval, ASN_INTEGER, RWRITE, var_ospf, 3, {7, 1, 8}},
  106.     {ospfIfHelloInterval, ASN_INTEGER, RWRITE, var_ospf, 3, {7, 1, 9}},
  107.     {ospfIfRtrDeadInterval, ASN_INTEGER, RWRITE, var_ospf, 3, {7, 1, 10}},
  108.     {ospfIfPollInterval, ASN_INTEGER, RWRITE, var_ospf, 3, {7, 1, 11}},
  109.     {ospfIfState, ASN_INTEGER, RONLY, var_ospf, 3, {7, 1, 12}},
  110.     {ospfIfDesignatedRouter, ASN_IPADDRESS, RONLY, var_ospf, 3,
  111.      {7, 1, 13}},
  112.     {ospfIfBackupDesignatedRouter, ASN_IPADDRESS, RONLY, var_ospf, 3,
  113.      {7, 1, 14}},
  114.     {ospfIfEvents, ASN_COUNTER, RONLY, var_ospf, 3, {7, 1, 15}},
  115.     {ospfIfAuthKey, ASN_OCTET_STR, RWRITE, var_ospf, 3, {7, 1, 16}},
  116.     {ospfIfStatus, ASN_INTEGER, RWRITE, var_ospf, 3, {7, 1, 17}},
  117.     {ospfIfMulticastForwarding, ASN_INTEGER, RWRITE, var_ospf, 3,
  118.      {7, 1, 18}},
  119.     {ospfIfMetricIpAddress, ASN_IPADDRESS, RONLY, var_ospf, 3, {8, 1, 1}},
  120.     {ospfIfMetricAddressLessIf, ASN_INTEGER, RONLY, var_ospf, 3,
  121.      {8, 1, 2}},
  122.     {ospfIfMetricTOS, ASN_INTEGER, RONLY, var_ospf, 3, {8, 1, 3}},
  123.     {ospfIfMetricValue, ASN_INTEGER, RWRITE, var_ospf, 3, {8, 1, 4}},
  124.     {ospfIfMetricStatus, ASN_INTEGER, RWRITE, var_ospf, 3, {8, 1, 5}},
  125.     {ospfVirtIfAreaId, ASN_IPADDRESS, RONLY, var_ospf, 3, {9, 1, 1}},
  126.     {ospfVirtIfNeighbor, ASN_IPADDRESS, RONLY, var_ospf, 3, {9, 1, 2}},
  127.     {ospfVirtIfTransitDelay, ASN_INTEGER, RWRITE, var_ospf, 3, {9, 1, 3}},
  128.     {ospfVirtIfRetransInterval, ASN_INTEGER, RWRITE, var_ospf, 3,
  129.      {9, 1, 4}},
  130.     {ospfVirtIfHelloInterval, ASN_INTEGER, RWRITE, var_ospf, 3, {9, 1, 5}},
  131.     {ospfVirtIfRtrDeadInterval, ASN_INTEGER, RWRITE, var_ospf, 3,
  132.      {9, 1, 6}},
  133.     {ospfVirtIfState, ASN_INTEGER, RONLY, var_ospf, 3, {9, 1, 7}},
  134.     {ospfVirtIfEvents, ASN_COUNTER, RONLY, var_ospf, 3, {9, 1, 8}},
  135.     {ospfVirtIfAuthKey, ASN_OCTET_STR, RWRITE, var_ospf, 3, {9, 1, 9}},
  136.     {ospfVirtIfStatus, ASN_INTEGER, RWRITE, var_ospf, 3, {9, 1, 10}},
  137.     {ospfNbrIpAddr, ASN_IPADDRESS, RONLY, var_ospf, 3, {10, 1, 1}},
  138.     {ospfNbrAddressLessIndex, ASN_INTEGER, RONLY, var_ospf, 3, {10, 1, 2}},
  139.     {ospfNbrRtrId, ASN_IPADDRESS, RONLY, var_ospf, 3, {10, 1, 3}},
  140.     {ospfNbrOptions, ASN_INTEGER, RONLY, var_ospf, 3, {10, 1, 4}},
  141.     {ospfNbrPriority, ASN_INTEGER, RWRITE, var_ospf, 3, {10, 1, 5}},
  142.     {ospfNbrState, ASN_INTEGER, RONLY, var_ospf, 3, {10, 1, 6}},
  143.     {ospfNbrEvents, ASN_COUNTER, RONLY, var_ospf, 3, {10, 1, 7}},
  144.     {ospfNbrLsRetransQLen, ASN_GAUGE, RONLY, var_ospf, 3, {10, 1, 8}},
  145.     {ospfNbmaNbrStatus, ASN_INTEGER, RWRITE, var_ospf, 3, {10, 1, 9}},
  146.     {ospfNbmaNbrPermanence, ASN_INTEGER, RWRITE, var_ospf, 3, {10, 1, 10}},
  147.     {ospfVirtNbrArea, ASN_IPADDRESS, RONLY, var_ospf, 3, {11, 1, 1}},
  148.     {ospfVirtNbrRtrId, ASN_IPADDRESS, RONLY, var_ospf, 3, {11, 1, 2}},
  149.     {ospfVirtNbrIpAddr, ASN_IPADDRESS, RONLY, var_ospf, 3, {11, 1, 3}},
  150.     {ospfVirtNbrOptions, ASN_INTEGER, RONLY, var_ospf, 3, {11, 1, 4}},
  151.     {ospfVirtNbrState, ASN_INTEGER, RONLY, var_ospf, 3, {11, 1, 5}},
  152.     {ospfVirtNbrEvents, ASN_COUNTER, RONLY, var_ospf, 3, {11, 1, 6}},
  153.     {ospfVirtNbrLsRetransQLen, ASN_GAUGE, RONLY, var_ospf, 3, {11, 1, 7}},
  154.     {ospfExtLsdbType, ASN_INTEGER, RONLY, var_ospf, 3, {12, 1, 1}},
  155.     {ospfExtLsdbLsid, ASN_IPADDRESS, RONLY, var_ospf, 3, {12, 1, 2}},
  156.     {ospfExtLsdbRouterId, ASN_IPADDRESS, RONLY, var_ospf, 3, {12, 1, 3}},
  157.     {ospfExtLsdbSequence, ASN_INTEGER, RONLY, var_ospf, 3, {12, 1, 4}},
  158.     {ospfExtLsdbAge, ASN_INTEGER, RONLY, var_ospf, 3, {12, 1, 5}},
  159.     {ospfExtLsdbChecksum, ASN_INTEGER, RONLY, var_ospf, 3, {12, 1, 6}},
  160.     {ospfExtLsdbAdvertisement, ASN_OCTET_STR, RONLY, var_ospf, 3,
  161.      {12, 1, 7}},
  162.     {ospfAreaAggregateAreaID, ASN_IPADDRESS, RONLY, var_ospf, 3,
  163.      {14, 1, 1}},
  164.     {ospfAreaAggregateLsdbType, ASN_INTEGER, RONLY, var_ospf, 3,
  165.      {14, 1, 2}},
  166.     {ospfAreaAggregateNet, ASN_IPADDRESS, RONLY, var_ospf, 3, {14, 1, 3}},
  167.     {ospfAreaAggregateMask, ASN_IPADDRESS, RWRITE, var_ospf, 3,
  168.      {14, 1, 4}},
  169.     {ospfAreaAggregateStatus, ASN_INTEGER, RWRITE, var_ospf, 3,
  170.      {14, 1, 5}},
  171.     {ospfAreaAggregateEffect, ASN_INTEGER, RWRITE, var_ospf, 3, {14, 1, 6}}
  172. };
  173. oid             ospf_variables_oid[] = { MIB, 14 };
  174. void
  175. init_snmp_ospf(void)
  176. {
  177.     REGISTER_MIB("smux/snmp_ospf", ospf_variables, variable13,
  178.                  ospf_variables_oid);
  179. }
  180. u_char         *
  181. var_ospf(struct variable *vp,
  182.          oid * name,
  183.          int *length, int exact, int *var_len, WriteMethod ** write_method)
  184. {
  185.     u_char         *var;
  186.     int             result;
  187.     DEBUGMSGTL(("smux/snmp_ospf",
  188.                 "[var_ospf] var len %d, oid requested Len %d-", *var_len,
  189.                 *length));
  190.     DEBUGMSGOID(("smux/snmp_ospf", name, *length));
  191.     DEBUGMSG(("smux/snmp_ospf", "n"));
  192.     /*
  193.      * Pass on the request to Gated.
  194.      * If the request sent out was a get next, check to see if
  195.      * it lies in the ospf range. If it doesn't, return NULL.
  196.      * In either case, make sure that errors are checked on the
  197.      * returned packets.
  198.      */
  199.     /*
  200.      * No writes for now 
  201.      */
  202.     *write_method = NULL;
  203.     /*
  204.      * Donot allow access to the peer stuff as it crashes gated.
  205.      * However A GetNext on the last 23.3.1.9 variable will force gated into
  206.      * the peer stuff and cause it to crash.
  207.      * The only way to fix this is to either solve the Gated problem, or 
  208.      * remove the peer variables from Gated itself and cause it to return
  209.      * NULL at the crossing. Currently doing the later.
  210.      */
  211.     /*
  212.      * Reject GET and GETNEXT for anything above ospfifconf range 
  213.      */
  214.     result = snmp_oid_compare(name, *length, max_ospf_mib,
  215.                               sizeof(max_ospf_mib) / sizeof(u_int));
  216.     if (result >= 0) {
  217.         DEBUGMSGTL(("smux/snmp_ospf", "Over shotn"));
  218.         return NULL;
  219.     }
  220.     /*
  221.      * for GETs we need to be in the ospf range so reject anything below 
  222.      */
  223.     result = snmp_oid_compare(name, *length, min_ospf_mib,
  224.                               sizeof(min_ospf_mib) / sizeof(u_int));
  225.     if (exact && (result < 0)) {
  226.         DEBUGMSGTL(("smux/snmp_ospf",
  227.                     "Exact but doesn't match length %d, size %dn",
  228.                     *length, sizeof(min_ospf_mib)));
  229.         return NULL;
  230.     }
  231.     /*
  232.      * On return, 'var' points to the value returned which is of length
  233.      * '*var_len'. 'name' points to the new (same as the one passed in for 
  234.      * GETs) oid which has 'length' suboids.
  235.      * 'smux_type' contains the type of the variable.
  236.      */
  237.     var = smux_snmp_process(exact, name, length, var_len);
  238.     DEBUGMSGTL(("smux/snmp_ospf",
  239.                 "[var_ospf] var len %d, oid obtained Len %d-", *var_len,
  240.                 *length));
  241.     DEBUGMSGOID(("smux/snmp_ospf", name, *length));
  242.     DEBUGMSG(("smux/snmp_ospf", "n"));
  243.     vp->type = smux_type;
  244.     /*
  245.      * XXX Need a mechanism to return errors in gated's responses 
  246.      */
  247.     if (var == NULL)
  248.         return NULL;
  249.     /*
  250.      * Any resullt returned should be within the ospf tree.
  251.      * ospf_mib - static u_int ospf_mib[] = {1, 3, 6, 1, 2, 1, 14};
  252.      */
  253.     if (memcmp(ospf_mib, name, sizeof(ospf_mib)) != 0) {
  254.         return NULL;
  255.     } else {
  256.         return var;
  257.     }
  258. }