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

SNMP编程

开发平台:

C/C++

  1. #ifdef OS_VXWORKS
  2. #include <libsys/vos/vos_rtos.h>
  3. #include <libsys/vos/vos_msgq.h>
  4. #endif
  5. #include "config.h"
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <assert.h>
  9. #include <libcmd/cmdparse.h>
  10. #include <sys/types.h>
  11. #include <ip/socket.h>
  12. #include <ip/in.h>
  13. #include <ip/inet.h>
  14. #include <ip/msg.h>
  15. #include <libsys/misc.h>
  16. #ifdef SWITCH
  17. #include <sys_conf.h>
  18. #else
  19. #include <../bsps/pub/bsps.h>
  20. #endif
  21. #include "asn1.h"
  22. #include "snmp_api.h"
  23. #include "snmp_impl.h"
  24. #include "system.h"
  25. #include "read_config.h"
  26. #include "snmp.h"
  27. #include "mib.h"
  28. #include "m2m.h"
  29. #include "snmp_vars.h"
  30. #include "agent_read_config.h"
  31. #include "snmpv3.h"
  32. #include "callback.h"
  33. #include "snmp_alarm.h"
  34. #include "default_store.h"
  35. #include "mib_module_config.h"
  36. #include "snmpd.h"
  37. #include "snmp_main.h"
  38. #include "config_struct.h"
  39. #include "snmp_debug.h"
  40. #include "snmp_timer.h"/*** sun define 2000.03.25 ***/
  41. #include "libres/resource.h"
  42. #include "var_struct.h"
  43. #include <objects.h>
  44. #include <boot/convert.h>
  45. #include <bspfuncs.h>
  46. #include <libsysverctl.h>
  47. #define sockadd_in soaddr_in
  48. #define sockaddr soaddr
  49. uint32 snmp_qid;/*snmp main queue identifier*/
  50. struct SNMPtimer   t,*snmptimer=&t;/*** sun define 2000.03.25 ***/
  51. SNMP_PARA snmp_para;
  52. ULONG snmp_source_ip;
  53. void snmpd_timeout(void);
  54. extern void hostname_callback (RESOURCE_ID id, uint32 arg1, uint32 arg2, uint32 param1, uint32 param2);
  55. extern int receive(void);
  56. int register_snmp(unsigned long mibgourp,void (*init_mib)());
  57. extern int snmpd_init(void);
  58. void dispatch_voip_oid(void);
  59. void snmp_version_register(void);
  60. void snmp_enterprise_oid_set(void);
  61. /*Function prototype*/
  62. /********************************************************
  63.  *
  64.  * Routine: snmp
  65.  *
  66.  * Description:
  67.  * This is the main loop of the SNMP module.
  68.  *
  69.  * Arguments:
  70.  *
  71.  * Return code:
  72.  *
  73.  * Side effects:
  74.  *
  75.  ********************************************************/
  76. void snmp_main()
  77. {
  78. #ifdef   OS_VXWORKS  /*SWITCH by yangyuhua 2005/7/22*/
  79. snmp_trace("snmp initn");
  80. snmpd_init();
  81. #endif 
  82. snmp_trace("snmp startn");      
  83. #ifndef OS_VXWORKS
  84. start_SNMPtimer(snmptimer);
  85. #endif
  86. #ifdef OLD_SNMP   
  87.     while (1){
  88.      if ((rc = q_receive(snmp_qid, Q_WAIT, 0, msg)) != 0){
  89. vty_console_output("SNMP:q_receive() error (rc %d)n",rc);
  90. continue;
  91. }
  92. msg_type = msg[0];
  93. switch(msg_type){
  94. /*收到数据*/
  95. case SOCKET_DATARCVD:
  96.  socketd  = msg[1];
  97.  sd_length = msg[2];
  98.        receive(socketd,sd_length);
  99.  break;
  100. /*连接建立*/
  101. case SOCKET_CONNECTED:
  102. /*连接正在断开*/
  103. case SOCKET_DISCONNECTING:
  104. /*连接已经断开*/
  105. case SOCKET_DISCONNECTED:
  106. /*socket不能再发送数据*/
  107. case SOCKET_CANTSENDMORE:
  108. /*socket不能再接收数据*/
  109. case SOCKET_CANTRCVMORE:
  110. break;
  111. case SNMP_TIMEOUT:
  112. break;
  113. default :
  114. break;
  115. }
  116. }
  117. #endif
  118. receive();
  119. }
  120. #include "snmp_vars.h"
  121. #include "mibgroup/mibII/system_mib.h"
  122. #include "mibgroup/mibII/snmp_mib.h"
  123. #ifndef OS_VXWORKS
  124. #include <boot/convert.h>
  125. #endif
  126. extern int do_snmp(int argc, char *argv[], struct user *u);
  127. static  struct topcmds snmp_topcmd = 
  128. { "snmp-server", cmdPref(PF_CMDNO, 0, 0) | cmdPriv(0, PV_SUBCMDSET, 0, 0), IF_ANY, ~FG_CFG_ST, IF_NULL, FG_CONFIG, 
  129. do_snmp, NULL, NULL, 2, 0,
  130. "snmp-server      -- Modify SNMP parameters", 
  131. "snmp-server      -- 设置 SNMP 参数 ", 
  132. NULLCHAR, NULLCHAR
  133. };
  134. extern long snmp_showrunning(DEVICE_ID diID);
  135. extern struct cmds debug_snmp_cmds[];
  136. extern struct cmds snmp_show_cmds[];
  137. #ifdef SWITCH
  138. #define DEFAULT_PRODUCT_ID 100 /* switch product id is based on this value */
  139. #else
  140. #define DEFAULT_PRODUCT_ID 32 /* router product id is based on this value */
  141. #endif
  142. oid default_enterprise[10] = {1, 3, 6, 1, 4, 1, ENTERPRISE_NUMBER, PRODUCEID, DEFAULT_PRODUCT_ID, 0};
  143. size_t default_enterprise_len = 10;
  144. unsigned char def_syscontact[SNMP_MAX_SYSCON_LEN];
  145. unsigned char def_syslocation[SNMP_MAX_SYSLOC_LEN];
  146. char version_descr[2048] = VERS_DESC;
  147. void snmp_module_init()
  148. {
  149. int    rc;
  150. RESOURCE_ID id;
  151. registercmd(&snmp_topcmd);
  152. interface_set_showrunning_service(MODULE_TYPE_SNMP,(INT32 (*)(DEVICE_ID))snmp_showrunning);
  153. register_snmp(1,init_system_mib);
  154. register_snmp(11,init_snmp_mib);
  155. rc =register_subcmd_tab("debug", cmdPref(PF_CMDNO, 0, 0), IF_NULL, FG_ENABLE,debug_snmp_cmds,1);
  156. assert(rc==1);
  157. rc = register_subcmd_tab("show", 0, IF_NULL, FG_ENABLE, snmp_show_cmds, 1);
  158. assert(rc == 1);
  159. memset(&snmp_para,0,sizeof(SNMP_PARA));
  160. snmp_para.packetsize = SNMP_DEFAULT_PACKETSIZE;
  161. snmp_para.queuelen = SNMP_DEFAULT_TRAP_QUEUELEN;
  162. snmp_para.timeout = SNMP_DEFAULT_TRAP_TIMEOUT;
  163.     /* Initialize timer 
  164.     snmptimer->func = (void (*)(void*))snmpd_timeout;
  165.     set_SNMPtimer(snmptimer, SNMPTIMER_TIMEOUT);
  166.     create_SNMPtimer(snmptimer);*/
  167. /* start_SNMPtimer(snmptimer);
  168.     stop_SNMPtimer(snmptimer);*/
  169. #ifdef OLD_SNMP
  170. if ((rc = q_create(SNMP_QUEUE_NAME, SNMP_QUEUE_LEN, Q_FIFO | Q_LIMIT, &snmp_qid)) != NOERR)
  171. vty_console_output("SNMP: q_create() error (rc %d)n",rc);
  172. #endif
  173. #ifndef OS_VXWORKS
  174. snmp_trace("snmp initn");/*add by yangyuhua, 2005-7-22*/
  175. snmpd_init();
  176. #endif
  177. rc = resource_register_synchronizer_callback (&id, RESOURCE_TYPE_HOSTNAME,
  178. RESOURCE_INDEX_TYPE_NONE, NULL, hostname_callback, 0, 0);
  179. assert(rc==0);
  180. #ifdef SWITCH
  181. sys_task_delay(1);
  182. #endif
  183. #ifdef OS_VXWORKS
  184.     /*finally, spawn snmp_main*/
  185.     sys_task_spawn(TASK_NAME_SNMP, SYS_TASK_PRI_NORMAL, 0,1024*64, snmp_main, NULL, 0);
  186. #endif
  187. snmp_version_register();
  188. }
  189. /********************************************************
  190.  *
  191.  * Routine:     snmp_wait_reset
  192.  *
  193.  * Description:
  194.  *      Wait until the SNMP module is initialized.
  195.  *      Loop until SNMP module is initialized:
  196.  *      Discard any message received until a RESET
  197.  *      action request is received and executed
  198.  *      sucessfully.
  199.  *
  200.  * Arguments:
  201.  *
  202.  * Return code:
  203.  *
  204.  * Side effects:
  205.  *
  206.  ********************************************************/
  207. void snmpd_timeout(void)
  208. {
  209. snmp_timeout();
  210. /*由于使用了循环定时器,不用每次超时重新启动定时器,孙希2003.1.8
  211. start_SNMPtimer(snmptimer);*/
  212. }
  213. #include "snmp/snmpreg.h"
  214. struct snmp_list *SnmpMibList=NULL;
  215. long    subtrees_enable = FALSE;/*** sun define 2000.07.27 ***/
  216. int register_snmp(unsigned long mibgourp,void (*init_mib)(void))
  217. {
  218.     struct snmp_list *vp;
  219.     if(subtrees_enable){/*** sun define 2000.07.27 ***/
  220.         (*init_mib)();
  221.         return 0;
  222.     }
  223.     
  224.     if((vp = (struct snmp_list *)sys_mem_malloc(sizeof(struct snmp_list)))==NULL){
  225.      return 0;
  226. }
  227. memset((void *)vp, 0, sizeof(struct snmp_list));
  228. vp->mibgroup = mibgourp;
  229. vp->init_mib = init_mib;
  230.     vp->next = SnmpMibList;
  231.     SnmpMibList = vp;
  232.     return 0;
  233. }
  234. void snmp_miblist_init(void)
  235. {
  236. SnmpMibList=NULL;
  237.     subtrees_enable = FALSE;/*** sun define 2000.07.27 ***/
  238.     snmp_enterprise_oid_set();
  239. }
  240. #ifndef SWITCH
  241. /*add by zhaoyonggang, 2004-12-14*/
  242. void dispatch_voip_oid(void)
  243. {
  244. USHORT t;
  245. char router_series[20];
  246. t = sys_get_router_type();
  247. if(get_extend_info_string(INFO_ROUTER_SERIES,router_series))
  248. strcpy(router_series,"");
  249. if(t==ROUTER_TYPE_V100)
  250. default_enterprise[8] = 251; /*IP phone V100*/
  251. else if (t==ROUTER_TYPE_V200)
  252. default_enterprise[8] = 252; /*IP phone V200*/
  253. else if (t==ROUTER_TYPE_V300)
  254. default_enterprise[8] = 253; /*IP phone V300*/
  255. else if (t==ROUTER_TYPE_V500)
  256. default_enterprise[8] = 254; /*IP phone V500*/
  257. else
  258. {
  259. if(strcmp(router_series, "SuperB GW300") == 0)
  260. default_enterprise[8] = 260;
  261. else if(strcmp(router_series, "SuperB GW500") == 0)
  262. default_enterprise[8] = 261;
  263. else if(strcmp(router_series, "SuperB GW204") == 0)
  264. default_enterprise[8] = 262;
  265. else if(strcmp(router_series, "SuperB GW232") == 0)
  266. default_enterprise[8] = 263;
  267. else if(strcmp(router_series, "SuperB MINI") == 0)
  268. default_enterprise[8] = 270;
  269. else if(strcmp(router_series, "SuperB GW1000") == 0)
  270. default_enterprise[8] = 280;
  271. else if(strcmp(router_series, "SuperB GW2000") == 0)
  272. default_enterprise[8] = 281;
  273. else if(strcmp(router_series, "SuperB GK300") == 0)
  274. default_enterprise[8] = 290;
  275. else if(strcmp(router_series, "SuperB GK1000") == 0)
  276. default_enterprise[8] = 291;
  277. else if(strcmp(router_series, "SuperB PROXY300") == 0)
  278. default_enterprise[8] = 300;
  279. else if(strcmp(router_series, "SuperB PROXY1000") == 0)
  280. default_enterprise[8] = 301;
  281. /* else
  282. default_enterprise[8] = 0;*/
  283. }
  284. }
  285. #endif
  286. /************************************************************************/
  287. /* DATE: 2006/1/13 */
  288. /* PURPOSE: rmon version                              */
  289. /* */
  290. /************************************************************************/
  291. void snmp_version_register(void)
  292. {
  293. struct version_list ver;
  294. /*register module cmd version*/
  295. ver.module_type = MODULE_TYPE_SNMP;
  296. ver.version = 0x00010003;
  297. strcpy(ver.module_name,"SNMP");
  298. sprintf(ver.module_description,"Simple Network Management Protocol(May23.2008)");
  299. ver.next = NULL;
  300. register_module_version(&ver);
  301. }
  302. void snmp_enterprise_oid_old_set(void)
  303. {
  304. unsigned char short_company_name[30];
  305. unsigned short switch_type;
  306. #ifdef SWITCH
  307. switch_type = sys_get_switch_type();
  308. if(switch_type < SWITCH_TYPE_BASE)
  309. switch_type = SWITCH_TYPE_BASE;
  310. switch_type -= SWITCH_TYPE_BASE;
  311. switch_type += DEFAULT_PRODUCT_ID;
  312. default_enterprise[8] = (oid) switch_type;
  313. #ifdef S3424
  314. if (!get_extend_info_string(INFO_SHORT_COMPANY_NAME, short_company_name)
  315. && stricmp(short_company_name, KYLAND_SHORT_VENDOR_NAME) == 0)
  316. {
  317. default_enterprise[6] = KYLAND_ENTERPRISE_NUMBER;
  318. default_enterprise[7] = 6;
  319. default_enterprise[8] = 5;
  320. default_enterprise_len = 9;
  321. memcpy(def_syslocation, "No 95 Building,Southeast Corner of XisanqiBridge,Haidian,Beijing,china", SNMP_MAX_SYSLOC_LEN);
  322. memcpy(def_syscontact, "+86-10-82900771", SNMP_MAX_SYSCON_LEN);
  323. memcpy(version_descr, "KYLAND", 10);
  324. }
  325. #endif
  326. #else
  327.      switch(sys_get_router_type()){
  328.       case ROUTER_TYPE_1760:
  329.       default_enterprise[8]=83;
  330.       break;
  331.       case ROUTER_TYPE_1750:
  332.       default_enterprise[8]=82;
  333.       break;
  334.         case ROUTER_TYPE_2750:
  335.             default_enterprise[8]=20;
  336.             break;
  337.         case ROUTER_TYPE_3700:
  338.             default_enterprise[8]=30;
  339.             break;
  340. case ROUTER_TYPE_3720:
  341. default_enterprise[8]=32;
  342. break;
  343.         case ROUTER_TYPE_5000:
  344.             default_enterprise[8]=50;       
  345.             break;
  346. case ROUTER_TYPE_V100:
  347. default_enterprise[8]=71;
  348. break;
  349. case ROUTER_TYPE_V200:
  350. default_enterprise[8]=72;
  351. break;
  352. case ROUTER_TYPE_V300:
  353. default_enterprise[8]=73;
  354. break;
  355. case ROUTER_TYPE_V500:
  356. default_enterprise[8]=75;
  357. break;
  358.         case ROUTER_TYPE_3660:
  359.             default_enterprise[8]=93;       
  360.             break;
  361.         case ROUTER_TYPE_3680:
  362.             default_enterprise[8]=98;       
  363.             break;
  364.         case ROUTER_TYPE_2640:
  365.             default_enterprise[8]=64;       
  366.             break;
  367.         case ROUTER_TYPE_2621:
  368. {
  369. EPPROM_INFO     *rom_info;
  370. rom_info = (EPPROM_INFO *)(sys_get_epprom_infoaddr()+0x40);/*by xujiasheng(a) 2006-7-19*/
  371. if (rom_info->hw_version == 0x10)
  372. {
  373. default_enterprise[8]=60;  /*this is 2621*/
  374.     break;
  375. }
  376. if (rom_info->hw_version == 0x20)
  377. {
  378.           default_enterprise[8]=61;  /*this is 2611*/
  379.    break;
  380. }
  381.   } 
  382.             break;
  383.  case ROUTER_TYPE_2650:
  384.    case ROUTER_TYPE_2650B:
  385.             default_enterprise[8]=88;       
  386.             break;
  387.  case ROUTER_TYPE_1720:
  388.             default_enterprise[8]=81;       
  389.             break;
  390.  case ROUTER_TYPE_1721:
  391. {
  392. EPPROM_INFO     *rom_info;
  393. rom_info = (EPPROM_INFO *)sys_get_epprom_infoaddr();
  394. if ((rom_info->hw_version == 0x10)||(rom_info->hw_version == 0x30))
  395. {
  396. default_enterprise[8]=84;  /*this is 1721*/
  397.     break;
  398. }
  399. if ((rom_info->hw_version == 0x20)||(rom_info->hw_version == 0x40))
  400. {
  401.           default_enterprise[8]=85;  /*this is 1710*/
  402.    break;
  403. }
  404.   }         
  405.             break;
  406.  case ROUTER_TYPE_2630:
  407.             default_enterprise[8]=62;       
  408.             break;
  409.      default:
  410.             default_enterprise[8]=sys_get_router_type();
  411.             break;
  412.      }
  413. memset (short_company_name, 0, sizeof(short_company_name));
  414.    if (!get_extend_info_string(INFO_SHORT_COMPANY_NAME, short_company_name))
  415. {
  416.    if (stricmp(short_company_name, DIGITAL_CHINA_SHORT_VENDOR_NAME) == 0) {
  417.    default_enterprise[6] = DIGITAL_CHINA_ENTERPRISE_NUMBER;
  418. }
  419. else if (stricmp(short_company_name, DLINK_SHORT_VENDOR_NAME) == 0) {
  420.     default_enterprise[6] = DLINK_ENTERPRISE_NUMBER;
  421.     default_enterprise[7] = 10;
  422.     default_enterprise[8] = 56;
  423.     switch(sys_get_router_type()) {
  424.     case ROUTER_TYPE_1750:
  425.         default_enterprise[9] = 1;
  426.         break;
  427.             case ROUTER_TYPE_2630:
  428.                 default_enterprise[9] = 2;
  429.                 break;
  430.         case ROUTER_TYPE_3660:
  431.             default_enterprise[9] = 3;
  432.             break;
  433.             default:
  434.             default_enterprise[9] = 0;
  435.                 break;
  436.     }
  437.     }
  438.     else if (stricmp(short_company_name, LEGEND_SHORT_VENDOR_NAME) == 0) 
  439.     {
  440.    default_enterprise[6] = LEGEND_ENTERPRISE_NUMBER;
  441. switch(sys_get_router_type()) 
  442. {
  443. case ROUTER_TYPE_1750:
  444. default_enterprise[8] = 1705;
  445.          break;
  446. default:
  447. default_enterprise[8] = 0;
  448. break;
  449. }
  450.     }
  451. }
  452. #ifndef SWITCH
  453. /*add by zhaoyonggang, 2004-12-14*/
  454. dispatch_voip_oid();
  455. #endif
  456. #endif
  457. }
  458. void snmp_enterprise_oid_set(void)
  459. {
  460. oid sys_id[10];
  461. int rc=0;
  462. int i=0;
  463.   if (!eprom_extend())
  464.     {
  465. get_sys_info(version_descr, SNMP_MAX_DESCR_LEN);
  466. snmp_enterprise_oid_old_set();
  467. return;
  468.     }
  469. else
  470. {
  471. get_extend_info_string(INFO_COMPANY_SNMP_SYSLOCATION,def_syslocation);
  472. get_extend_info_string(INFO_COMPANY_SNMP_SYSCONTACT,def_syscontact);
  473. if (get_extend_info_string(INFO_COMPANY_SNMP_SYSDESCR,version_descr))
  474. {
  475. get_sys_info(version_descr, SNMP_MAX_DESCR_LEN);
  476. }
  477. }
  478. rc = eprom_system_id((unsigned long *)sys_id);
  479. if (rc > 10)
  480. {
  481. Print("ERROR :snmp trace system_id, length =%dn",rc);
  482. rc =10;
  483. }
  484. if (rc > 0)
  485. {
  486. for (i=0;i<rc;i++)
  487. {
  488. default_enterprise[i]=sys_id[i];
  489. }
  490. for (i=rc; i<10; i++)
  491. {
  492. default_enterprise[i]=0;
  493. }
  494. default_enterprise_len = rc;
  495. }
  496. else 
  497. {
  498. rc = eprom_vendor_id();
  499. if (rc >0)
  500. default_enterprise[6] = rc;/*otherwise use the default value(3320)*/
  501. rc = eprom_product_id();
  502. if (rc >0)
  503. default_enterprise[8] = rc;
  504. else
  505. snmp_enterprise_oid_old_set();
  506. }
  507. }