snmpEngine.c
上传用户:cxs890
上传日期:2021-05-22
资源大小:347k
文件大小:6k
源码类别:

SNMP编程

开发平台:

C/C++

  1. /* snmpEngine.c: implement's the SNMP-FRAMEWORK-MIB. */
  2. #include <config.h>
  3. #ifdef OS_VXWORKS
  4. #include <sys/times.h>
  5. #endif
  6. #if HAVE_WINSOCK_H
  7. #include <ip/socket.h>
  8. #endif
  9. #include "mibincl.h"
  10. #include "snmpv3.h"
  11. #include "util_funcs.h"
  12. #include "lcd_time.h"
  13. #include "../mibII/sysORTable.h"
  14. #include "snmpEngine.h"
  15. #ifdef OS_VXWORKS
  16. #include "asn1.h"
  17. #endif
  18. #include "config_struct.h"
  19. struct variable2 snmpEngine_variables[] = {
  20.   { SNMPENGINEID        , ASN_OCTET_STR  , RONLY , var_snmpEngine, 1, { 1 } },
  21. #ifdef SNMP_TESTING_CODE 
  22.   { SNMPENGINEBOOTS     , ASN_INTEGER    , RWRITE, var_snmpEngine, 1, { 2 } },
  23.   { SNMPENGINETIME      , ASN_INTEGER    , RWRITE, var_snmpEngine, 1, { 3 } },
  24. #else /* !SNMP_TESTING_CODE */ 
  25.   { SNMPENGINEBOOTS     , ASN_INTEGER    , RONLY , var_snmpEngine, 1, { 2 } },
  26.   { SNMPENGINETIME      , ASN_INTEGER    , RONLY , var_snmpEngine, 1, { 3 } },
  27. #endif /* SNMP_TESTING_CODE */
  28.   { SNMPENGINEMAXMESSAGESIZE, ASN_INTEGER, RONLY , var_snmpEngine, 1, { 4 } },
  29. };
  30. /* now load this mib into the agents mib table */
  31. oid snmpEngine_variables_oid[] = {1,3,6,1,6,3,10,2,1};
  32. void init_snmpEngine (void) {
  33. #ifdef USING_MIBII_SYSORTABLE_MODULE
  34.   static oid reg[] = {1,3,6,1,6,3,10,3,1,1};
  35.   register_sysORTable(reg,10,"The SNMP Management Architecture MIB.");
  36. #endif
  37.   REGISTER_MIB("snmpv3/snmpEngine", snmpEngine_variables, variable2, 
  38.  snmpEngine_variables_oid);
  39. /* place any initialization routines needed here */
  40. }
  41. #ifdef SNMP_TESTING_CODE
  42. int write_engineBoots(int, u_char *,u_char, int, u_char *,oid*, int);
  43. int write_engineTime(int, u_char *,u_char, int, u_char *,oid*, int);
  44. #endif /* SNMP_TESTING_CODE */
  45. u_char *
  46. var_snmpEngine(
  47.     struct variable *vp,
  48.     oid     *name,
  49.     int  *length,
  50.     int     exact,
  51.     int  *var_len,
  52.     WriteMethod **write_method)
  53. {
  54.   /* variables we may use later */
  55.   static long long_ret;
  56.   static unsigned char engineID[SNMP_MAXBUF];
  57.   *write_method = 0;           /* assume it isnt writable for the time being */
  58.   *var_len = sizeof(long_ret); /* assume an integer and change later if not */
  59.   if (header_generic(vp,name,length,exact,var_len,write_method))
  60.       return 0;
  61.   /* this is where we do the value assignments for the mib results. */
  62.   switch(vp->magic) {
  63.     case SNMPENGINEID:
  64.       *var_len = snmpv3_get_engineID(engineID, SNMP_MAXBUF);
  65.       /* XXX  Set ERROR_MSG() upon error? */
  66.       return (unsigned char *) engineID;
  67.     case SNMPENGINEBOOTS:
  68. #ifdef SNMP_TESTING_CODE
  69.       *write_method = write_engineBoots;
  70. #endif /* SNMP_TESTING_CODE */
  71.       long_ret = snmpv3_local_snmpEngineBoots();
  72.       return (unsigned char *) &long_ret;
  73.     case SNMPENGINETIME:
  74. #ifdef SNMP_TESTING_CODE
  75.       *write_method = write_engineTime;
  76. #endif /* SNMP_TESTING_CODE */
  77.       long_ret = snmpv3_local_snmpEngineTime();
  78.       return (unsigned char *) &long_ret;
  79.     case SNMPENGINEMAXMESSAGESIZE:
  80.       long_ret = snmp_para.packetsize;
  81.       return (unsigned char *) &long_ret;
  82.     default:
  83.       DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_snmpEnginen", vp->magic));
  84.   }
  85.   return 0;
  86. }
  87. #ifdef SNMP_TESTING_CODE
  88. /* write_engineBoots():
  89.    This is technically not writable a writable mib object, but we
  90.    allow it so we can run some time synchronization tests.
  91. */
  92. int
  93. write_engineBoots(
  94.    int      action,
  95.    u_char   *var_val,
  96.    u_char   var_val_type,
  97.    int   var_val_len,
  98.    u_char   *statP,
  99.    oid      *name,
  100.    int   name_len)
  101. {
  102.   /* variables we may use later */
  103.   static long long_ret;
  104.   int size;
  105.   int bigsize=SNMP_MAXBUF_MEDIUM;
  106.   u_char engineIDBuf[SNMP_MAXBUF_MEDIUM];
  107.   int engineIDBufLen = 0;
  108.   if (var_val_type != ASN_INTEGER){
  109.       DEBUGMSGTL(("snmpEngine","write to engineBoots not ASN_INTEGERn"));
  110.       return SNMP_ERR_WRONGTYPE;
  111.   }
  112.   if (var_val_len > sizeof(long_ret)){
  113.       DEBUGMSGTL(("snmpEngine","write to engineBoots: bad lengthn"));
  114.       return SNMP_ERR_WRONGLENGTH;
  115.   }
  116.   long_ret = *((long *) var_val);
  117.   if (action == COMMIT) {
  118.     engineIDBufLen = snmpv3_get_engineID(engineIDBuf, SNMP_MAXBUF_MEDIUM);
  119.     /* set our local engineTime in the LCD timing cache */
  120.     snmpv3_set_engineBootsAndTime(long_ret, snmpv3_local_snmpEngineTime());
  121.     set_enginetime(engineIDBuf, engineIDBufLen, 
  122.                    snmpv3_local_snmpEngineBoots(), 
  123.                    snmpv3_local_snmpEngineTime(),
  124.                    TRUE);
  125.   }
  126.   return SNMP_ERR_NOERROR;
  127. }
  128. /* write_engineTime():
  129.    This is technically not writable a writable mib object, but we
  130.    allow it so we can run some time synchronization tests.
  131. */
  132. int
  133. write_engineTime(
  134.    int      action,
  135.    u_char   *var_val,
  136.    u_char   var_val_type,
  137.    int   var_val_len,
  138.    u_char   *statP,
  139.    oid      *name,
  140.    int   name_len)
  141. {
  142.   /* variables we may use later */
  143.   static long long_ret;
  144.   int size;
  145.   int bigsize=SNMP_MAXBUF_MEDIUM;
  146.   u_char engineIDBuf[SNMP_MAXBUF_MEDIUM];
  147.   int engineIDBufLen = 0;
  148.   if (var_val_type != ASN_INTEGER){
  149.       DEBUGMSGTL(("snmpEngine","write to engineTime not ASN_INTEGERn"));
  150.       return SNMP_ERR_WRONGTYPE;
  151.   }
  152.   if (var_val_len > sizeof(long_ret)){
  153.       DEBUGMSGTL(("snmpEngine","write to engineTime: bad lengthn"));
  154.       return SNMP_ERR_WRONGLENGTH;
  155.   }
  156.   long_ret = *((long *) var_val);
  157.   if (action == COMMIT) {
  158.     engineIDBufLen = snmpv3_get_engineID(engineIDBuf, SNMP_MAXBUF_MEDIUM);
  159.     /* set our local engineTime in the LCD timing cache */
  160.     snmpv3_set_engineBootsAndTime(snmpv3_local_snmpEngineBoots(), long_ret);
  161.     set_enginetime(engineIDBuf, engineIDBufLen, 
  162.                    snmpv3_local_snmpEngineBoots(), 
  163.                    snmpv3_local_snmpEngineTime(),
  164.                    TRUE);
  165.   }
  166.   return SNMP_ERR_NOERROR;
  167. }
  168. #endif /* SNMP_TESTING_CODE */