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

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: snmp_bgp.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_bgp.h"
  47. struct variable13 bgp_variables[] = {
  48.     {BGPVERSION, ASN_OCTET_STR, RONLY, var_bgp, 1, {1}},
  49.     {BGPLOCALAS, ASN_INTEGER, RONLY, var_bgp, 1, {2}},
  50.     {BGPIDENTIFIER, ASN_IPADDRESS, RONLY, var_bgp, 1, {4}},
  51.     {BGPPEERIDENTIFIER, ASN_IPADDRESS, RONLY, var_bgp, 3, {3, 1, 1}},
  52.     {BGPPEERSTATE, ASN_INTEGER, RONLY, var_bgp, 3, {3, 1, 2}},
  53.     {BGPPEERADMINSTATUS, ASN_INTEGER, RONLY, var_bgp, 3, {3, 1, 3}},
  54.     {BGPPEERNEGOTIATEDVERSION, ASN_INTEGER, RONLY, var_bgp, 3, {3, 1, 4}},
  55.     {BGPPEERLOCALADDR, ASN_IPADDRESS, RONLY, var_bgp, 3, {3, 1, 5}},
  56.     {BGPPEERLOCALPORT, ASN_INTEGER, RONLY, var_bgp, 3, {3, 1, 6}},
  57.     {BGPPEERREMOTEADDR, ASN_IPADDRESS, RONLY, var_bgp, 3, {3, 1, 7}},
  58.     {BGPPEERREMOTEPORT, ASN_INTEGER, RONLY, var_bgp, 3, {3, 1, 8}},
  59.     {BGPPEERREMOTEAS, ASN_INTEGER, RONLY, var_bgp, 3, {3, 1, 9}},
  60.     {BGPPEERINUPDATES, ASN_COUNTER, RONLY, var_bgp, 3, {3, 1, 10}},
  61.     {BGPPEEROUTUPDATES, ASN_COUNTER, RONLY, var_bgp, 3, {3, 1, 11}},
  62.     {BGPPEERINTOTALMESSAGES, ASN_COUNTER, RONLY, var_bgp, 3, {3, 1, 12}},
  63.     {BGPPEEROUTTOTALMESSAGES, ASN_COUNTER, RONLY, var_bgp, 3, {3, 1, 13}},
  64.     {BGPPEERLASTERROR, ASN_OCTET_STR, RONLY, var_bgp, 3, {3, 1, 14}},
  65.     {BGPPATHATTRPEER, ASN_IPADDRESS, RONLY, var_bgp, 3, {5, 1, 1}},
  66.     {BGPPATHATTRDESTNETWORK, ASN_IPADDRESS, RONLY, var_bgp, 3, {5, 1, 2}},
  67.     {BGPPATHATTRORIGIN, ASN_INTEGER, RONLY, var_bgp, 3, {5, 1, 3}},
  68.     {BGPPATHATTRASPATH, ASN_OCTET_STR, RONLY, var_bgp, 3, {5, 1, 4}},
  69.     {BGPPATHATTRNEXTHOP, ASN_INTEGER, RONLY, var_bgp, 3, {5, 1, 5}},
  70.     {BGPPATHATTRINTERASMETRIC, ASN_OCTET_STR, RONLY, var_bgp, 3, {5, 1, 6}}
  71. };
  72. oid             bgp_variables_oid[] = { MIB, 15 };
  73. void
  74. init_snmp_bdp(void)
  75. {
  76.     REGISTER_MIB("smux/snmp_bgp", bgp_variables, variable13,
  77.                  bgp_variables_oid);
  78. }
  79. #endif
  80. static oid      max_bgp_mib[] =
  81.     { 1, 3, 6, 1, 2, 1, 15, 5, 1, 6, 255, 255, 255, 255 };
  82. static oid      min_bgp_mib[] = { 1, 3, 6, 1, 2, 1, 15, 1, 0 };
  83. extern u_char   smux_type;
  84. u_char         *
  85. var_bgp(struct variable *vp,
  86.         oid * name,
  87.         int *length, int exact, int *var_len, WriteMethod ** write_method)
  88. {
  89.     u_char         *var;
  90.     int             result;
  91.     DEBUGMSGTL(("smux/snmp_bgp",
  92.                 "[var_bgp] var len %d, oid requested Len %d-", *var_len,
  93.                 *length));
  94.     DEBUGMSGOID(("smux/snmp_bgp", name, *length));
  95.     DEBUGMSG(("smux/snmp_bgp", "n"));
  96.     /*
  97.      * Pass on the request to Gated.
  98.      * If the request sent out was a get next, check to see if
  99.      * it lies in the bgp range. If it doesn't, return NULL.
  100.      * In either case, make sure that errors are checked on the
  101.      * returned packets.
  102.      */
  103.     /*
  104.      * No writes for now 
  105.      */
  106.     *write_method = NULL;
  107.     /*
  108.      * Donot allow access to the peer stuff as it crashes gated.
  109.      * However A GetNext on the last 23.3.1.9 variable will force gated into
  110.      * the peer stuff and cause it to crash.
  111.      * The only way to fix this is to either solve the Gated problem, or 
  112.      * remove the peer variables from Gated itself and cause it to return
  113.      * NULL at the crossing. Currently doing the later.
  114.      */
  115.     /*
  116.      * Reject GET and GETNEXT for anything above bgpifconf range 
  117.      */
  118.     result = snmp_oid_compare(name, *length, max_bgp_mib,
  119.                               sizeof(max_bgp_mib) / sizeof(u_int));
  120.     if (result >= 0) {
  121.         DEBUGMSGTL(("smux/snmp_bgp", "Over shotn"));
  122.         return NULL;
  123.     }
  124.     /*
  125.      * for GETs we need to be in the bgp range so reject anything below 
  126.      */
  127.     result = snmp_oid_compare(name, *length, min_bgp_mib,
  128.                               sizeof(min_bgp_mib) / sizeof(u_int));
  129.     if (exact && (result < 0)) {
  130.         DEBUGMSGTL(("smux/snmp_bgp",
  131.                     "Exact but doesn't match length %d, size %dn",
  132.                     *length, sizeof(min_bgp_mib)));
  133.         return NULL;
  134.     }
  135.     /*
  136.      * On return, 'var' points to the value returned which is of length
  137.      * '*var_len'. 'name' points to the new (same as the one passed in for 
  138.      * GETs) oid which has 'length' suboids.
  139.      * 'smux_type' contains the type of the variable.
  140.      */
  141.     var = smux_snmp_process(exact, name, length, var_len);
  142.     DEBUGMSGTL(("smux/snmp_bgp",
  143.                 "[var_bgp] var len %d, oid obtained Len %d-", *var_len,
  144.                 *length));
  145.     DEBUGMSGOID(("smux/snmp_bgp", name, *length));
  146.     DEBUGMSG(("smux/snmp_bgp", "n"));
  147.     vp->type = smux_type;
  148.     /*
  149.      * XXX Need a mechanism to return errors in gated's responses 
  150.      */
  151.     if (var == NULL)
  152.         return NULL;
  153.     /*
  154.      * Any resullt returned should be within the bgp tree.
  155.      * bgp_mib - static u_int bgp_mib[] = {1, 3, 6, 1, 2, 1, 15};
  156.      */
  157.     if (memcmp(bgp_mib, name, sizeof(bgp_mib)) != 0) {
  158.         return NULL;
  159.     } else {
  160.         return var;
  161.     }
  162. }