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

SNMP编程

开发平台:

C/C++

  1. #ifdef OS_VXWORKS
  2. #include <global.h>
  3. #include <libsys/vos/vos_rtos.h>
  4. #endif
  5. #include <ip/socket.h>
  6. #include <libsys/memory.h>
  7. #include <libdev/interface.h>
  8. #include <ipacl/ipacl.h>
  9. #include "config.h"
  10. #include "types.h"
  11. #include "asn1.h"
  12. #include "config_struct.h"
  13. #include "snmp_debug.h"
  14. /*#include "snmp_util.h"*/
  15. static int32 snmp_get32(cp)
  16. register char *cp;
  17. {
  18. int32 rval;
  19. rval = (unsigned char)(*cp++);
  20. rval <<= 8;
  21. rval |= (unsigned char)(*cp++);
  22. rval <<= 8;
  23. rval |= (unsigned char)(*cp++);
  24. rval <<= 8;
  25. rval |= (unsigned char)(*cp);
  26. return rval;
  27. }
  28. int check_community(unsigned char *community, int community_len, unsigned long src_ip)
  29. {
  30. int count;
  31. struct acl_info acl_info;
  32. SNMP_DEBUG_ROUTINES("check_community()");
  33. for (count = 0; count < SNMP_MAX_COMMUNITY_NUM; count++) {
  34. if (community_len == strlen(snmp_para.community[count].name)
  35.         && !memcmp(snmp_para.community[count].name, community, community_len))
  36. break;
  37. }
  38. if (count >= SNMP_MAX_COMMUNITY_NUM)
  39. return -1;
  40. if (snmp_para.community[count].access_list[0]) {
  41. memset(&acl_info, 0, sizeof(struct acl_info));
  42. acl_info.src_ip = src_ip;
  43. if (ipacl_check(&acl_info, snmp_para.community[count].access_list) != IP_PERMIT)
  44. return -1;
  45. }
  46. return count;
  47. }
  48. int community_write(int community_id)
  49. {
  50. return (snmp_para.community[community_id].privilege == READWRITE);
  51. }
  52. #include <ip/target.h>
  53. #include <ip/ip_externs.h>
  54. void get_trapsrc_ip(unsigned long *ipaddr)
  55. {
  56. DEVICE_ETERNAL_ID trapsource;
  57. DEVICE_ID diID;
  58. ADDR_LINK *addr_list, *addr;
  59. *ipaddr = 0L;
  60. trapsource = snmp_para.trapsource;
  61. if (trapsource == DEVICE_INVALID_ETERNAL_ID) {
  62. return ;
  63. }
  64. /* 将eternalID转换为diID */
  65. if (INTERFACE_GLOBAL_SUCCESS != interface_omnivorous_callback_makemomentary(&diID, trapsource)) {
  66. return ;
  67. }
  68. /*
  69. 返回的是一个地址结构链表,其中端口的主地址在链表开始处。
  70. 注意:使用完毕后,必须释放所占用的内存空间!
  71. */
  72. addr_list = getipbyid(diID);
  73. if (addr_list) {
  74. addr = addr_list;
  75. *ipaddr = (unsigned long) snmp_get32(addr->addr.addr);
  76. while (addr_list) {
  77. addr = addr_list;
  78. addr_list = addr->next;
  79. sys_mem_free(addr);
  80. }
  81. }
  82. }
  83. long isquotation(char *ch)
  84. {
  85. register char *cp;
  86. int quotation_exist = FALSE;
  87. if (NULLCHAR == ch)
  88. return FALSE;
  89. cp = ch;
  90. while (*cp) {
  91. if (0x20 == *cp) {
  92. quotation_exist = TRUE;
  93. break;
  94. }
  95. cp++;
  96. }
  97. return quotation_exist;
  98. }
  99. int snmp_check_ipacl(char *ipacl, int ipaddr)
  100. {
  101. struct acl_info acl_info;
  102.     int rc;
  103.     if (ipacl == NULL || ipacl[0] == 0)
  104.         return 0;
  105.     acl_info.src_ip = ipaddr;
  106.     rc = ipacl_check(&acl_info, ipacl);
  107.     if ((rc & IP_PERMIT) == 0)
  108.         return -1;
  109.     return 0;
  110. }