Agent.c
上传用户:shgx688
上传日期:2009-12-27
资源大小:855k
文件大小:25k
源码类别:

SNMP编程

开发平台:

MultiPlatform

  1. #include <lljgeneral.h>
  2. /* globals */
  3. extern xdata mib_object_t *MibRoot;
  4. extern xdata union netcard rxdnet;
  5. extern xdata union netcard txdnet;
  6. u32 snmpAuthEnable = AGENT_AUTH_DISABLE; /* enable/disable snmp authentication */
  7. /* space allocated for snmp hosts/communities for authentication purposes */
  8. struct snmpComm_t authComms[AUTH_MAX_COMMS]; /* space for all communities allowed */
  9. struct snmpHost_t authHosts[AUTH_MAX_HOSTS]; /* space for all hosts allowed       */
  10. /* space allocated for snmp hosts/communities for traps */
  11. struct snmpComm_t trapComms[TRAP_MAX_COMMS]; /* space for all communities allowed */
  12. struct snmpHost_t trapHosts[TRAP_MAX_HOSTS]; /* space for all hosts allowed       */
  13. u32 snmpAuthMaxComms = AUTH_MAX_COMMS; /* max communities for auth group */
  14. u32 snmpAuthMaxHosts = AUTH_MAX_HOSTS; /* max hosts for auth group       */
  15. u32 snmpTrapMaxComms = TRAP_MAX_COMMS; /* max communities for trap group */
  16. u32 snmpTrapMaxHosts = TRAP_MAX_HOSTS; /* max hosts for trap group       */
  17. /**************************************************
  18. SNMP proc parameters
  19. **************************************************/
  20. xdata system_t system;
  21. xdata txfxDevice_t txfxDevice;
  22. xdata txfxModule_t modules[MAX_MOUDLE_NUM];
  23. // insert here SNMP modules in order to find the faults
  24. /* defines */
  25. #define SNMP_IPA    0 /* Ipaddress, APPLICATION (0) */
  26. #define SNMP_CNT    1 /* Counter,   APPLICATION (1) */
  27. #define SNMP_GGE    2 /* Gauge,     APPLICATION (2) */
  28. #define SNMP_TIT    3 /* TimeTicks  APPLICATION (3) */
  29. #define SNMP_OPQ    4 /* Opaque,    APPLICATION (4) */
  30. /* typedefs */
  31. typedef struct snmp_cnv_s snmp_cnv_t;
  32. struct snmp_cnv_s
  33. {
  34. u32 Class;
  35. u32 Tag;
  36. i32 Syntax;
  37. };
  38. /* globals */
  39. i32 snmpErrStatus = SNMP_NOERROR;
  40. i32 snmpErrIndex = 0;
  41. asn1_sck_t snmpErrAsn1Status;
  42. asn1_sck_t snmpErrAsn1Index;
  43. asn1_sck_t snmpErrAsn1Resp;
  44. snmp_stat_t SnmpStat;
  45. const i8 *SnmpTrap[] =
  46. {
  47. "cold start",
  48. "warm start",
  49. "link down",
  50. "link up",
  51. "authentication failure",
  52. "neighbor loss",
  53. "enterprise specific"
  54. };
  55. /* locals */
  56. static snmp_cnv_t SnmpCnv[] =
  57. {
  58. {ASN1_UNI, ASN1_NUL, SNMP_NULL},
  59. {ASN1_UNI, ASN1_INT, SNMP_INTEGER},
  60. {ASN1_UNI, ASN1_OTS, SNMP_OCTETSTR},
  61. {ASN1_UNI, ASN1_OTS, SNMP_DISPLAYSTR},
  62. {ASN1_UNI, ASN1_OJI, SNMP_OBJECTID},
  63. {ASN1_APL, SNMP_IPA, SNMP_IPADDR},
  64. {ASN1_APL, SNMP_CNT, SNMP_COUNTER},
  65. {ASN1_APL, SNMP_GGE, SNMP_GAUGE},
  66. {ASN1_APL, SNMP_TIT, SNMP_TIMETICKS},
  67. {ASN1_APL, SNMP_OPQ, SNMP_OPAQUE},
  68. {0, 0, -1}
  69. };
  70. /* forward declarations */
  71. static int SnmpSyn2TagCls(u32 * Tag, u32 * Cls, i32 Syn);
  72. static int SnmpTagCls2Syn(u32 Tag, u32 Cls, u16 * Syn);
  73. static int SnmpObjEnc(asn1_sck_t * Asn1, snmp_object_t * Obj);
  74. static int SnmpObjDec(asn1_sck_t * Asn1, snmp_object_t * Obj);
  75. static int SnmpLstEnc(asn1_sck_t * Asn1, snmp_object_t * Lst, u32 LstLen);
  76. static int SnmpLstDec(asn1_sck_t * Asn1, snmp_object_t * Lst, u32 LstSze, u32 * LstLen);
  77. static int SnmpRqsEnc(asn1_sck_t * Asn1, snmp_pdu_t * Rqs);
  78. static int SnmpRqsDec(asn1_sck_t * Asn1, snmp_pdu_t * Rqs);
  79. static int SnmpPduEnc(asn1_sck_t * Asn1, snmp_pdu_t * Pdu, snmp_object_t * Lst, u32 LstLen);
  80. static int SnmpPduDec(asn1_sck_t * Asn1, snmp_pdu_t * Pdu, snmp_object_t * Lst, u32 LstSze, u32 * LstLen);
  81. int SnmpSyn2TagCls
  82.     (
  83.     u32 * Tag, 
  84.     u32 * Cls, 
  85.     i32   Syn
  86.     )
  87. {
  88. snmp_cnv_t *Cnv;
  89. Cnv = SnmpCnv;
  90. while (Cnv->Syntax != -1)
  91. {
  92. if (Cnv->Syntax == Syn)
  93. {
  94. *Tag = Cnv->Tag;
  95. *Cls = Cnv->Class;
  96. return TRUE;
  97. }
  98. Cnv++;
  99. }
  100. snmpErrStatus = SNMP_BADVALUE;
  101. SnmpStat.OutBadValues++;
  102. return FALSE;
  103. }
  104. int SnmpTagCls2Syn
  105.     (
  106.     u32   Tag, 
  107.     u32   Cls, 
  108.     u16 * Syn
  109.     )
  110. {
  111. snmp_cnv_t *Cnv;
  112. Cnv = SnmpCnv;
  113. while (Cnv->Syntax != -1)
  114. {
  115. if (Cnv->Tag == Tag && Cnv->Class == Cls)
  116. {
  117. *Syn = (u16) Cnv->Syntax;
  118. return TRUE;
  119. }
  120. Cnv++;
  121. }
  122. snmpErrStatus = SNMP_BADVALUE;
  123. SnmpStat.OutBadValues++;
  124. return FALSE;
  125. }
  126. int SnmpObjEnc
  127.     (
  128.     asn1_sck_t *    Asn1, 
  129.     snmp_object_t * Obj
  130.     )
  131. {
  132. u32 Cls, Tag;
  133. u8 *Eoc, *End;
  134. if (!Asn1EocEnc(Asn1, &Eoc))
  135. {
  136. return FALSE;
  137. }
  138. switch (Obj->Type)
  139. {
  140. case SNMP_INTEGER:
  141. if (!Asn1IntEncLng(Asn1, &End, Obj->Syntax.LngInt))
  142. {
  143. return FALSE;
  144. }
  145. break;
  146. case SNMP_OCTETSTR:
  147. case SNMP_OPAQUE:
  148. if (!Asn1OtsEnc(Asn1, &End, Obj->Syntax.BufChr, Obj->SyntaxLen))
  149. {
  150. return FALSE;
  151. }
  152. break;
  153. case SNMP_NULL:
  154. if (!Asn1NulEnc(Asn1, &End))
  155. {
  156. return FALSE;
  157. }
  158. break;
  159. case SNMP_OBJECTID:
  160. if (!Asn1OjiEnc(Asn1, &End, (u32 *) Obj->Syntax.BufInt, Obj->SyntaxLen))
  161. {
  162. return FALSE;
  163. }
  164. break;
  165. case SNMP_IPADDR:
  166. if (!Asn1OtsEnc(Asn1, &End, (u8 *) & Obj->Syntax.LngUns, 4))
  167. {
  168. return FALSE;
  169. }
  170. break;
  171. case SNMP_COUNTER:
  172. case SNMP_GAUGE:
  173. case SNMP_TIMETICKS:
  174. if (!Asn1IntEncLngUns(Asn1, &End, Obj->Syntax.LngUns))
  175. {
  176. return FALSE;
  177. }
  178. break;
  179. default:
  180. snmpErrStatus = SNMP_BADVALUE;
  181. SnmpStat.OutBadValues++;
  182. return FALSE;
  183. }
  184. if (!SnmpSyn2TagCls(&Tag, &Cls, Obj->Type))
  185. {
  186. return FALSE;
  187. }
  188. if (!Asn1HdrEnc(Asn1, End, Cls, ASN1_PRI, Tag))
  189. {
  190. return FALSE;
  191. }
  192. if (!Asn1OjiEnc(Asn1, &End, (u32 *) Obj->Id, Obj->IdLen))
  193. {
  194. return FALSE;
  195. }
  196. if (!Asn1HdrEnc(Asn1, End, ASN1_UNI, ASN1_PRI, ASN1_OJI))
  197. {
  198. return FALSE;
  199. }
  200. if (!Asn1HdrEnc(Asn1, Eoc, ASN1_UNI, ASN1_CON, ASN1_SEQ))
  201. {
  202. return FALSE;
  203. }
  204. return TRUE;
  205. }
  206. int SnmpObjDec
  207.     (
  208.     asn1_sck_t *    Asn1, 
  209.     snmp_object_t * Obj
  210.     )
  211. {
  212. u32 Cls, Con, Tag;
  213. u8 *Eoc, *End;
  214. if (!Asn1HdrDec(Asn1, &Eoc, &Cls, &Con, &Tag))
  215. return FALSE;
  216. if (Cls != ASN1_UNI || Con != ASN1_CON || Tag != ASN1_SEQ)
  217. return FALSE;
  218. if (!Asn1HdrDec(Asn1, &End, &Cls, &Con, &Tag))
  219. return FALSE;
  220. if (Cls != ASN1_UNI || Con != ASN1_PRI || Tag != ASN1_OJI)
  221. return FALSE;
  222. if (!Asn1OjiDec(Asn1, End, (u32 *) Obj->Id, SNMP_SIZE_OBJECTID, &Obj->IdLen))
  223. return FALSE;
  224. if (!Asn1HdrDec(Asn1, &End, &Cls, &Con, &Tag))
  225. return FALSE;
  226. if (Con != ASN1_PRI)
  227. {
  228. snmpErrStatus = SNMP_BADVALUE;
  229. SnmpStat.OutBadValues++;
  230. return FALSE;
  231. }
  232. if (!SnmpTagCls2Syn(Tag, Cls, &Obj->Type))
  233. return FALSE;
  234. switch (Obj->Type)
  235. {
  236. case SNMP_INTEGER:
  237. if (!Asn1IntDecLng(Asn1, End, (i32 *) & Obj->Syntax.LngInt))
  238. return FALSE;
  239. break;
  240. case SNMP_OCTETSTR:
  241. case SNMP_OPAQUE:
  242. if (!Asn1OtsDec(Asn1, End, Obj->Syntax.BufChr, SNMP_SIZE_BUFCHR,
  243. &Obj->SyntaxLen))
  244. return FALSE;
  245. break;
  246. case SNMP_NULL:
  247. if (!Asn1NulDec(Asn1, End))
  248. return FALSE;
  249. break;
  250. case SNMP_OBJECTID:
  251. if (!Asn1OjiDec(Asn1, End, (u32 *) Obj->Syntax.BufInt, SNMP_SIZE_BUFINT,
  252. &Obj->SyntaxLen))
  253. return FALSE;
  254. break;
  255. case SNMP_IPADDR:
  256. if (!Asn1OtsDec(Asn1, End, (u8 *) & Obj->Syntax.LngUns, 4,
  257. &Obj->SyntaxLen))
  258. return FALSE;
  259. if (Obj->SyntaxLen != 4)
  260. return FALSE;
  261. break;
  262. case SNMP_COUNTER:
  263. case SNMP_GAUGE:
  264. case SNMP_TIMETICKS:
  265. if (!Asn1IntDecLngUns(Asn1, End, (u32 *) & Obj->Syntax.LngUns))
  266. return FALSE;
  267. break;
  268. default:
  269. snmpErrStatus = SNMP_BADVALUE;
  270. SnmpStat.OutBadValues++;
  271. return FALSE;
  272. }
  273. if (!Asn1EocDec(Asn1, Eoc))
  274. return FALSE;
  275. return TRUE;
  276. }
  277. int SnmpLstEnc
  278.     (
  279.     asn1_sck_t *    Asn1, 
  280.     snmp_object_t * Lst, 
  281.     u32             LstLen
  282.     )
  283. {
  284. u8 *Eoc;
  285. if (!Asn1EocEnc(Asn1, &Eoc))
  286. {
  287. return FALSE;
  288. }
  289. Lst += LstLen;
  290. while (LstLen-- > 0)
  291. {
  292. if (!SnmpObjEnc(Asn1, --Lst))
  293. {
  294. return FALSE;
  295. }
  296. }
  297. if (!Asn1HdrEnc(Asn1, Eoc, ASN1_UNI, ASN1_CON, ASN1_SEQ))
  298. {
  299. return FALSE;
  300. }
  301. return TRUE;
  302. }
  303. int SnmpLstDec
  304.     (
  305.     asn1_sck_t *    Asn1, 
  306.     snmp_object_t * Lst, 
  307.     u32             LstSze, 
  308.     u32 *           LstLen
  309.     )
  310. {
  311. u32 Cls, Con, Tag;
  312. u8 *Eoc;
  313. if (!Asn1HdrDec(Asn1, &Eoc, &Cls, &Con, &Tag))
  314. return FALSE;
  315. if (Cls != ASN1_UNI || Con != ASN1_CON || Tag != ASN1_SEQ)
  316. return FALSE;
  317. *LstLen = 0;
  318. while (!Asn1Eoc(Asn1, Eoc))
  319. {
  320. if (++(*LstLen) > LstSze)
  321. {
  322. snmpErrStatus = SNMP_TOOBIG;
  323. SnmpStat.OutTooBigs++;
  324. return FALSE;
  325. }
  326. if (!SnmpObjDec(Asn1, Lst++))
  327. {
  328. snmpErrIndex = (i32) * LstLen;
  329. return FALSE;
  330. }
  331. }
  332. if (!Asn1EocDec(Asn1, Eoc))
  333. return FALSE;
  334. return TRUE;
  335. }
  336. int SnmpRqsEnc
  337.     (
  338.     asn1_sck_t *     Asn1, 
  339.     snmp_pdu_t * Rqs
  340.     )
  341. {
  342. u8 *End;
  343. if (!Asn1IntEncUns(Asn1, &End, Rqs->ErrorIndex))
  344. return FALSE;
  345. if (!Asn1HdrEnc(Asn1, End, ASN1_UNI, ASN1_PRI, ASN1_INT))
  346. return FALSE;
  347. if (!Asn1IntEncUns(Asn1, &End, Rqs->ErrorStatus))
  348. return FALSE;
  349. if (!Asn1HdrEnc(Asn1, End, ASN1_UNI, ASN1_PRI, ASN1_INT))
  350. return FALSE;
  351. if (!Asn1IntEncLngUns(Asn1, &End, Rqs->Id))
  352. return FALSE;
  353. if (!Asn1HdrEnc(Asn1, End, ASN1_UNI, ASN1_PRI, ASN1_INT))
  354. return FALSE;
  355. return TRUE;
  356. }
  357. int SnmpRqsDec
  358.     (
  359.     asn1_sck_t *     Asn1, 
  360.     snmp_pdu_t * Rqs
  361.     )
  362. {
  363. u32 Cls, Con, Tag;
  364. u8 *End;
  365. if (!Asn1HdrDec(Asn1, &End, &Cls, &Con, &Tag))
  366. return FALSE;
  367. if (Cls != ASN1_UNI || Con != ASN1_PRI || Tag != ASN1_INT)
  368. return FALSE;
  369. if (!Asn1IntDecLngUns(Asn1, End, (u32 *) & Rqs->Id))
  370. return FALSE;
  371. if (!Asn1HdrDec(Asn1, &End, &Cls, &Con, &Tag))
  372. return FALSE;
  373. if (Cls != ASN1_UNI || Con != ASN1_PRI || Tag != ASN1_INT)
  374. return FALSE;
  375. if (!Asn1IntDecUns(Asn1, End, &Rqs->ErrorStatus))
  376. return FALSE;
  377. memcpy(&snmpErrAsn1Status, Asn1, sizeof(asn1_sck_t));
  378. if (!Asn1HdrDec(Asn1, &End, &Cls, &Con, &Tag))
  379. return FALSE;
  380. if (Cls != ASN1_UNI || Con != ASN1_PRI || Tag != ASN1_INT)
  381. return FALSE;
  382. if (!Asn1IntDecUns(Asn1, End, &Rqs->ErrorIndex))
  383. return FALSE;
  384. /*
  385.  * Should not receive any error status
  386.  */
  387. if (Rqs->ErrorStatus != SNMP_NOERROR)
  388. {
  389. switch (Rqs->ErrorStatus)
  390. {
  391. case SNMP_TOOBIG:
  392. SnmpStat.InTooBigs++;
  393. break;
  394. case SNMP_NOSUCHNAME:
  395. SnmpStat.InNoSuchNames++;
  396. break;
  397. case SNMP_BADVALUE:
  398. SnmpStat.InBadValues++;
  399. break;
  400. case SNMP_READONLY:
  401. SnmpStat.InReadOnlys++;
  402. break;
  403. default:
  404. SnmpStat.InGenErrs++;
  405. break;
  406. }
  407. return FALSE;
  408. }
  409. #if 0
  410. if (!Asn1HdrDec(Asn1, &End, &Cls, &Con, &Tag))
  411. return FALSE;
  412. if (Cls != ASN1_UNI || Con != ASN1_PRI || Tag != ASN1_INT)
  413. return FALSE;
  414. if (!Asn1IntDecUns(Asn1, End, &Rqs->ErrorIndex))
  415. return FALSE;
  416. #endif
  417. memcpy(&snmpErrAsn1Index, Asn1, sizeof(asn1_sck_t));
  418. return TRUE;
  419. }
  420. int SnmpPduEnc
  421.     (
  422.     asn1_sck_t *    Asn1, 
  423.     snmp_pdu_t *    Pdu, 
  424.     snmp_object_t * Lst, 
  425.     u32             LstLen
  426.     )
  427. {
  428. u8 *Eoc;
  429. if (!Asn1EocEnc(Asn1, &Eoc))
  430. {
  431. return FALSE;
  432. }
  433. if (!SnmpLstEnc(Asn1, Lst, LstLen))
  434. {
  435. return FALSE;
  436. }
  437. switch (Pdu->Type)
  438. {
  439. case SNMP_PDU_GET:
  440. case SNMP_PDU_NEXT:
  441. case SNMP_PDU_RESPONSE:
  442. case SNMP_PDU_SET:
  443. case SNMP_PDU_TRAP:
  444. if (!SnmpRqsEnc(Asn1, Pdu))
  445. {
  446. return FALSE;
  447. }
  448. break;
  449. default:
  450. return FALSE;
  451. }
  452. if (!Asn1HdrEnc(Asn1, Eoc, ASN1_CTX, ASN1_CON, Pdu->Type))
  453. {
  454. return FALSE;
  455. }
  456. return TRUE;
  457. }
  458. int SnmpPduDec
  459.     (
  460.     asn1_sck_t *    Asn1, 
  461.     snmp_pdu_t *    Pdu, 
  462.     snmp_object_t * Lst, 
  463.     u32             LstSze, 
  464.     u32 *           LstLen
  465.     )
  466. {
  467. u32 Cls, Con;
  468. u8 *Eoc;
  469. if (!Asn1HdrDec(Asn1, &Eoc, &Cls, &Con, &Pdu->Type))
  470. return FALSE;
  471. memcpy(&snmpErrAsn1Resp, Asn1, sizeof(asn1_sck_t));
  472. if (Cls != ASN1_CTX || Con != ASN1_CON)
  473. return FALSE;
  474. switch (Pdu->Type)
  475. {
  476. case SNMP_PDU_GET:
  477. case SNMP_PDU_NEXT:
  478. case SNMP_PDU_RESPONSE:
  479. case SNMP_PDU_SET:
  480. case SNMP_PDU_TRAP:
  481. if (!SnmpRqsDec(Asn1, Pdu))
  482. return FALSE;
  483. break;
  484. default:
  485. SnmpStat.InBadTypes++;
  486. return FALSE;
  487. }
  488. if (!SnmpLstDec(Asn1, Lst, LstSze, LstLen))
  489. return FALSE;
  490. if (!Asn1EocDec(Asn1, Eoc))
  491. return FALSE;
  492. return TRUE;
  493. }
  494. int SnmpMsgEnc
  495.     (
  496.     asn1_sck_t *    Asn1, 
  497.     snmp_pdu_t *    Pdu, 
  498.     u8 *            Com, 
  499.     u32             ComLen, 
  500.     snmp_object_t * Lst, 
  501.     u32             LstLen
  502.     )
  503. {
  504. u8 *Eoc, *End;
  505. if (!Asn1EocEnc(Asn1, &Eoc))
  506. {
  507. return FALSE;
  508. }
  509. if (!SnmpPduEnc(Asn1, Pdu, Lst, LstLen))
  510. {
  511. return FALSE;
  512. }
  513. if (!Asn1OtsEnc(Asn1, &End, Com, ComLen))
  514. {
  515. return FALSE;
  516. }
  517. if (!Asn1HdrEnc(Asn1, End, ASN1_UNI, ASN1_PRI, ASN1_OTS))
  518. {
  519. return FALSE;
  520. }
  521. if (!Asn1IntEncUns(Asn1, &End, SNMP_VERSION))
  522. {
  523. return FALSE;
  524. }
  525. if (!Asn1HdrEnc(Asn1, End, ASN1_UNI, ASN1_PRI, ASN1_INT))
  526. {
  527. return FALSE;
  528. }
  529. if (!Asn1HdrEnc(Asn1, Eoc, ASN1_UNI, ASN1_CON, ASN1_SEQ))
  530. {
  531. return FALSE;
  532. }
  533. return TRUE;
  534. }
  535. int SnmpMsgDec
  536.     (
  537.     asn1_sck_t *    Asn1, 
  538.     snmp_pdu_t *    Pdu, 
  539.     u8 *            Com, 
  540.     u32             ComSze, 
  541.     u32 *           ComLen, 
  542.     snmp_object_t * Lst, 
  543.     u32             LstSze, 
  544.     u32 *           LstLen
  545.     )
  546. {
  547. u32 Cls, Con, Tag, Ver;
  548. u8 *Eoc, *End;
  549. if (!Asn1HdrDec(Asn1, &Eoc, &Cls, &Con, &Tag))
  550. {
  551. return FALSE;
  552. }
  553. if (Cls != ASN1_UNI || Con != ASN1_CON || Tag != ASN1_SEQ)
  554. {
  555. return FALSE;
  556. }
  557. if (!Asn1HdrDec(Asn1, &End, &Cls, &Con, &Tag))
  558. {
  559. return FALSE;
  560. }
  561. if (Cls != ASN1_UNI || Con != ASN1_PRI || Tag != ASN1_INT)
  562. {
  563. return FALSE;
  564. }
  565. if (!Asn1IntDecUns(Asn1, End, &Ver))
  566. {
  567. return FALSE;
  568. }
  569. if (!Asn1HdrDec(Asn1, &End, &Cls, &Con, &Tag))
  570. {
  571. return FALSE;
  572. }
  573. if (Cls != ASN1_UNI || Con != ASN1_PRI || Tag != ASN1_OTS)
  574. {
  575. return FALSE;
  576. }
  577. if (!Asn1OtsDec(Asn1, End, Com, ComSze, ComLen))
  578. {
  579. return FALSE;
  580. }
  581. if (Ver != SNMP_VERSION)
  582. {
  583. SnmpStat.InBadVersions++;
  584. return FALSE;
  585. }
  586. if (!SnmpPduDec(Asn1, Pdu, Lst, LstSze, LstLen))
  587. {
  588. return FALSE;
  589. }
  590. if (!Asn1EocDec(Asn1, Eoc))
  591. {
  592. return FALSE;
  593. }
  594. return TRUE;
  595. }
  596. int SnmpEnc
  597.     (
  598.     u8 **           Snmp, 
  599.     u32 *           SnmpLen, 
  600.     snmp_pdu_t *    Pdu, 
  601.     u8 *            Com, 
  602.     u32             ComLen, 
  603.     snmp_object_t * Lst, 
  604.     u32             LstLen
  605.     )
  606. {
  607. static asn1_sck_t SnmpEncAsn1;
  608. snmpErrStatus = SNMP_NOERROR;
  609. snmpErrIndex = 0;
  610. Asn1Opn(&SnmpEncAsn1, *Snmp, *SnmpLen, ASN1_ENC);
  611. if (!SnmpMsgEnc(&SnmpEncAsn1, Pdu, Com, ComLen, Lst, LstLen))
  612. {
  613. if (snmpErrStatus == SNMP_NOERROR)
  614. {
  615. switch (asn1ErrStatus)
  616. {
  617. case ASN1_ERR_ENC_FULL:
  618. case ASN1_ERR_NOERROR:
  619. case ASN1_ERR_DEC_EMPTY:
  620. case ASN1_ERR_DEC_EOC_MISMATCH:
  621. case ASN1_ERR_DEC_LENGTH_MISMATCH:
  622. case ASN1_ERR_DEC_BADVALUE:
  623. case ASN1_ERR_ENC_BADVALUE:
  624. default:
  625. //PrintStr("rnSnmpEnc: GENERROR, asn1ErrStatus = %d", asn1ErrStatus);
  626. snmpErrStatus = SNMP_GENERROR;
  627. SnmpStat.OutGenErrs++;
  628. break;
  629. }
  630. }
  631. return FALSE;
  632. }
  633. Asn1Cls(&SnmpEncAsn1, Snmp, SnmpLen);
  634. SnmpStat.OutPkts++;
  635. switch (Pdu->Type)
  636. {
  637. case SNMP_PDU_GET:
  638. SnmpStat.OutGetRequests++;
  639. break;
  640. case SNMP_PDU_NEXT:
  641. SnmpStat.OutGetNexts++;
  642. break;
  643. case SNMP_PDU_RESPONSE:
  644. SnmpStat.OutGetResponses++;
  645. break;
  646. case SNMP_PDU_SET:
  647. SnmpStat.OutSetRequests++;
  648. break;
  649. case SNMP_PDU_TRAP:
  650. SnmpStat.OutTraps++;
  651. break;
  652. default:
  653. break;
  654. }
  655. return TRUE;
  656. }
  657. int SnmpDec
  658.     (
  659.     u8 *            Snmp, 
  660.     u32             SnmpLen, 
  661.     snmp_pdu_t *    Pdu, 
  662.     u8 *            Com, 
  663.     u32             ComSze, 
  664.     u32 *           ComLen, 
  665.     snmp_object_t * Lst, 
  666.     u32             LstSze, 
  667.     u32 *           LstLen
  668.     )
  669. {
  670. static asn1_sck_t SnmpDecAsn1;
  671. snmpErrStatus = SNMP_NOERROR;
  672. snmpErrIndex = 0;
  673. Asn1Opn(&SnmpDecAsn1, Snmp, SnmpLen, ASN1_DEC);
  674. if (!SnmpMsgDec(&SnmpDecAsn1, Pdu, Com, ComSze, ComLen, Lst, LstSze, LstLen))
  675. {
  676. if (snmpErrStatus == SNMP_NOERROR)
  677. {
  678. switch (asn1ErrStatus)
  679. {
  680. case ASN1_ERR_DEC_BADVALUE:
  681. case ASN1_ERR_DEC_EOC_MISMATCH:
  682. case ASN1_ERR_DEC_LENGTH_MISMATCH:
  683. case ASN1_ERR_DEC_EMPTY:
  684. snmpErrStatus = SNMP_BADVALUE;
  685. SnmpStat.OutBadValues++;
  686. SnmpStat.InASNParseErrs++;
  687. break;
  688. case ASN1_ERR_ENC_FULL:
  689. case ASN1_ERR_NOERROR:
  690. case ASN1_ERR_ENC_BADVALUE:
  691. default:
  692. snmpErrStatus = SNMP_GENERROR;
  693. SnmpStat.OutGenErrs++;
  694. break;
  695. }
  696. }
  697. return FALSE;
  698. }
  699. Asn1Cls(&SnmpDecAsn1, &Snmp, &SnmpLen);
  700. SnmpStat.InPkts++;
  701. switch (Pdu->Type)
  702. {
  703. case SNMP_PDU_GET:
  704. SnmpStat.InGetRequests++;
  705. break;
  706. case SNMP_PDU_NEXT:
  707. SnmpStat.InGetNexts++;
  708. break;
  709. case SNMP_PDU_RESPONSE:
  710. SnmpStat.InGetResponses++;
  711. break;
  712. case SNMP_PDU_SET:
  713. SnmpStat.InSetRequests++;
  714. break;
  715. case SNMP_PDU_TRAP:
  716. SnmpStat.InTraps++;
  717. break;
  718. default:
  719. break;
  720. }
  721. return TRUE;
  722. }
  723. int SnmpErrEnc
  724.     (
  725.     snmp_pdu_t * Rqs
  726.     )
  727. {
  728. u8 *End;
  729. /* asn1_sck_t *Asn1 = &snmpErrAsn1; */
  730. if (!Asn1IntEncUns(&snmpErrAsn1Index, &End, Rqs->ErrorIndex))
  731. return FALSE;
  732. if (!Asn1HdrEnc(&snmpErrAsn1Index, End, ASN1_UNI, ASN1_PRI, ASN1_INT))
  733. return FALSE;
  734. if (!Asn1IntEncUns(&snmpErrAsn1Status, &End, Rqs->ErrorStatus))
  735. return FALSE;
  736. if (!Asn1HdrEnc(&snmpErrAsn1Status, End, ASN1_UNI, ASN1_PRI, ASN1_INT))
  737. return FALSE;
  738. /*    if(!Asn1IntEncLngUns(&snmpErrAsn1Status, &End, Rqs->Id))
  739.  * return FALSE;
  740.  * if(!Asn1HdrEnc(Asn1, End, ASN1_UNI, ASN1_PRI, ASN1_INT))
  741.  * return FALSE; 
  742.  */
  743. if (!Asn1HdrEnc(&snmpErrAsn1Resp, snmpErrAsn1Resp.End, ASN1_CTX, ASN1_CON, Rqs->Type))
  744. return FALSE;
  745. return TRUE;
  746. }
  747. // all above from SNMP.c file
  748. static 
  749. int MsgRequest(u8 * rqsBuffer, u32 rqsLen,u8 ** rspBuffer,u32 * rspLen,ul32  addr);
  750. void dword2mem
  751.     (
  752.     u8 * mem, 
  753.     ul32 val
  754.     )
  755. {
  756. *(ul32 *) mem = val;
  757. }
  758. void bzero(u8* str, i32 len)
  759. {
  760. i32 i;
  761. for(i=0;i<len-1;i++)
  762. {
  763. str[i] = 0;
  764. }
  765. }
  766. STATUS initAgentTables()
  767. {
  768. u32 i;
  769. for (i = 0; i < AUTH_MAX_COMMS; i++)
  770. {
  771. authComms[i].index = i;
  772. authComms[i].name[0] = '';;
  773. authComms[i].access = AGENT_READ_ONLY;
  774. authComms[i].traps = 0;
  775. authComms[i].state = AGENT_VAL_INVALID;
  776. }
  777. for (i = 0; i < AUTH_MAX_HOSTS; i++)
  778. {
  779. authHosts[i].index = i;
  780. authHosts[i].name[0] = '';;
  781. authHosts[i].commName[0] = '';;
  782. authHosts[i].addr = 0;
  783. authHosts[i].mask = 0xffffff00;
  784. authHosts[i].state = AGENT_VAL_INVALID;
  785. }
  786. for (i = 0; i < TRAP_MAX_COMMS; i++)
  787. {
  788. trapComms[i].index = i;
  789. trapComms[i].name[0] = '';;
  790. trapComms[i].access = AGENT_READ_ONLY;
  791. trapComms[i].traps = 0;
  792. trapComms[i].state = AGENT_VAL_INVALID;
  793. }
  794. for (i = 0; i < TRAP_MAX_HOSTS; i++)
  795. {
  796. trapHosts[i].index = i;
  797. trapHosts[i].name[0] = '';;
  798. trapHosts[i].commName[0] = '';;
  799. trapHosts[i].addr = 0;
  800. trapHosts[i].mask = 0xffffff00;
  801. trapHosts[i].state = AGENT_VAL_INVALID;
  802. }
  803. return OK;
  804. }
  805. int authCommFind
  806.     (
  807.     char * name
  808.     )
  809. {
  810. int i;
  811. for(i=0; i<snmpAuthMaxComms; i++)
  812. {
  813. if (strcmp(authComms[i].name, name) == 0)
  814. {
  815. if (authComms[i].state == AGENT_VAL_ENABLE)
  816. return i+1;
  817. else
  818. return 0;
  819. }
  820. }
  821. return 0;
  822. }
  823. STATUS authHostInComm
  824.     (   
  825. u8*  comm, 
  826.     ul32                 addr
  827.     )
  828. {
  829.  int i;
  830. for(i=0; i< snmpAuthMaxHosts; i++)
  831. {
  832. if ((authHosts[i].addr == addr)&&(!strcmp(authHosts[i].commName,comm)))
  833. {
  834. if (authHosts[i].state == AGENT_VAL_ENABLE)
  835. return OK;
  836. else
  837. return ERROR;
  838. }
  839. }
  840. return ERROR;
  841. }
  842. int trapCommFind
  843.     (
  844.     char * name
  845.     )
  846. {
  847. int i;
  848. for(i=0; i<snmpTrapMaxComms; i++)
  849. {
  850.   if (strcmp(trapComms[i].name, name) == 0)
  851. {
  852. if (trapComms[i].state == AGENT_VAL_ENABLE)
  853. return i+1;
  854. else
  855. return 0;
  856. }
  857. }
  858. return 0;
  859. }
  860. STATUS agentSnmpTrapSupport
  861.     (
  862.     u32   index, 
  863.     u32             snmpTrapType
  864.     )
  865. {
  866. switch (snmpTrapType)
  867. {
  868. case SNMP_TRAP_COLDSTART:
  869. if (trapComms[index].traps & AGENT_COLD_START)
  870. return OK;
  871. break;
  872. case SNMP_TRAP_LINKDOWN:
  873. if (trapComms[index].traps & AGENT_LINK_DOWN)
  874. return OK;
  875. break;
  876. case SNMP_TRAP_LINKUP:
  877. if (trapComms[index].traps & AGENT_LINK_UP)
  878. return OK;
  879. break;
  880. case SNMP_TRAP_AUTFAILURE:
  881. if (trapComms[index].traps & AGENT_AUTHEN)
  882. return OK;
  883. break;
  884. case SNMP_TRAP_ENTSPECIFIC:
  885. break;
  886. case SNMP_TRAP_EQPNEIGHBORLOSS:
  887. case SNMP_TRAP_WARMSTART:
  888. default:
  889. break;
  890. }
  891. return ERROR;
  892. }
  893. /**************************************************************************
  894. SNMP protocol procedures
  895. ***************************************************************************/
  896. int AgentSendTrap
  897.     (
  898.     u8 *            comm, 
  899.     u16             commLen, 
  900.     u16             gen, 
  901.     snmp_object_t * list, 
  902.     u16             listLen
  903.     )
  904. {
  905. u8 *                 trapBuffer;
  906. u32                  trapLen;
  907. static u8            sendTrapBuffer[AGENT_BUFFER_SIZE];
  908. static snmp_pdu_t    sendTrappdu;
  909. int   descr;
  910. int                 success = FALSE;
  911. u16                  dummy;
  912. int i;
  913. if (MibRequest (listLen, list, &dummy) == SNMP_NOERROR)
  914. {
  915. sendTrappdu.Type = SNMP_PDU_TRAP;
  916. comm[commLen] = '';
  917. descr = trapCommFind (comm);
  918. if (descr != 0)
  919. {
  920. if (agentSnmpTrapSupport (descr, gen) == ERROR)
  921. {
  922. return FALSE;
  923. }
  924. success = TRUE;
  925. for (i=0; i<snmpTrapMaxHosts; i++)
  926. if ((!strcmp(trapHosts[i].commName, comm))&&(!trapHosts[i].addr) || (trapHosts[i].state != AGENT_VAL_ENABLE))
  927. continue;
  928. trapBuffer                 = sendTrapBuffer;
  929. trapLen                    = sizeof(sendTrapBuffer);
  930. if (SnmpEnc (&trapBuffer, &trapLen, &sendTrappdu, comm, commLen,
  931.  list, listLen))
  932. {   
  933. // udp_request1(trapHosts[i].addr, 162,trapBuffer,trapLen);
  934. }
  935. }
  936. }
  937. }
  938. return (success);
  939. }
  940. void SendENTTrap
  941.     (
  942.     u16             gen, 
  943.     snmp_object_t * list, 
  944.     u16             listLen
  945.     )
  946. {
  947. char *               commName;
  948. snmp_object_t snmpTrapObject[2];
  949. int i;
  950. static ul32 sysUpTime[]= {1, 3, 6, 1, 2, 1, 1, 3, 0};
  951. static ul32 snmpTrapOID[] = {1, 3, 6, 1, 6, 3, 1, 4 ,1 , 0};
  952. if(list ==0)
  953. {
  954. snmpTrapObject[0].Request = SNMP_PDU_GET;
  955. memcpy(snmpTrapObject[0].Id, sysUpTime,sizeof(sysUpTime));
  956. snmpTrapObject[0].IdLen = sizeof(sysUpTime)/sizeof(ul32);
  957. snmpTrapObject[0].Type = SNMP_TIMETICKS;
  958. snmpTrapObject[1].Request = SNMP_PDU_GET;
  959. memcpy(snmpTrapObject[1].Id, snmpTrapOID,sizeof(snmpTrapOID));
  960. snmpTrapObject[1].IdLen = sizeof(sysUpTime)/sizeof(ul32);
  961. snmpTrapObject[1].Type = SNMP_OBJECTID;
  962. list = & snmpTrapObject[0];
  963. listLen = sizeof(snmpTrapObject);
  964. }
  965. for(i=0;i<snmpTrapMaxComms; i++)
  966. {
  967. if(trapComms[i].state==AGENT_VAL_ENABLE)
  968. {
  969. memcpy(commName,trapComms[i].name,sizeof(trapComms[i].name));
  970. (void) AgentSendTrap(commName, (u16) strlen(commName),
  971.  gen, list, listLen);
  972. }
  973. }
  974. }
  975. static int MsgRequest
  976.     (
  977.     u8 *  rqsBuffer, 
  978.     u32   rqsLen, 
  979.     u8 ** rspBuffer, 
  980.     u32 * rspLen,
  981.     ul32  addr)
  982. {
  983. static snmp_pdu_t     Requestpdu;
  984. snmp_request_t *      rqs = &Requestpdu;
  985. static u8             RequestComm[AGENT_COMMUNITY_SIZE];
  986. u32                   commLen;
  987. static snmp_object_t  RequestList[AGENT_LIST_SIZE]; 
  988. u32                   listLen;
  989. u16                   status;
  990. u16                   aindex;
  991. static u8             Requestaddress[4];
  992. u32                   perm;
  993. static u8             Requestbuf[64];
  994. bzero((i8 *) Requestbuf, 64);  
  995. bzero( (i8*)RequestList, sizeof(RequestList));
  996. if (!SnmpDec(rqsBuffer, rqsLen, &Requestpdu, RequestComm,
  997.  AGENT_COMMUNITY_SIZE, &commLen, RequestList,
  998.  AGENT_LIST_SIZE, &listLen))
  999. {
  1000. rqs->Type = SNMP_PDU_RESPONSE;
  1001. rqs->ErrorStatus = (u32) snmpErrStatus;
  1002. rqs->ErrorIndex = (u32) snmpErrIndex;
  1003. if (!SnmpErrEnc(rqs))
  1004. {
  1005. return (FALSE);
  1006. }
  1007. memcpy(*rspBuffer, rqsBuffer, rqsLen);
  1008. *rspLen = rqsLen;
  1009. return (TRUE);
  1010. }
  1011. if (Requestpdu.Type != SNMP_PDU_GET &&
  1012. Requestpdu.Type != SNMP_PDU_NEXT &&
  1013. Requestpdu.Type != SNMP_PDU_SET)
  1014. {
  1015. PrintStr("SNMP, unknown PDUn");
  1016. return (FALSE);
  1017. }
  1018. if (snmpAuthEnable == AGENT_AUTH_ENABLE)
  1019. {
  1020. int p=0;
  1021. RequestComm[commLen] = '';
  1022. p = authCommFind(RequestComm);
  1023. if (p)
  1024. perm = authComms[--p].access;
  1025. else
  1026. perm = 0;
  1027. if (perm == 0)
  1028. {
  1029. memcpy((i8 *) RequestComm, (i8 *) & Requestbuf[0], commLen);
  1030. SendENTTrap(SNMP_TRAP_AUTFAILURE, 0, 0);
  1031. return (FALSE);
  1032. }
  1033. if (authHostInComm(authComms[p].name, addr) == ERROR)
  1034. {
  1035. dword2mem(Requestaddress, (ul32)addr);
  1036. memcpy((i8 *) RequestComm, (i8 *) & Requestbuf[0], commLen);
  1037. SendENTTrap(SNMP_TRAP_AUTFAILURE, 0, 0);
  1038. return (FALSE);
  1039. }
  1040. switch (Requestpdu.Type)
  1041. {
  1042.     case SNMP_PDU_NEXT:
  1043.     case SNMP_PDU_GET:
  1044.     break;
  1045.     case SNMP_PDU_SET:
  1046.     if ((perm & (u16) MIB_WRITE) == 0)
  1047.     {
  1048.     SendENTTrap(SNMP_TRAP_AUTFAILURE,0, 0);
  1049.     return (FALSE);
  1050.     }
  1051.     break;
  1052.     default:
  1053.     break;
  1054. }
  1055. }
  1056. for (aindex = 0; aindex < listLen; aindex++)
  1057. {
  1058. RequestList[aindex].Request = (u16) Requestpdu.Type;
  1059. }
  1060. /* status = MibRequest(listLen, RequestList, &aindex);
  1061. if (status != SNMP_NOERROR)
  1062. {
  1063. rqs->Type = SNMP_PDU_RESPONSE;
  1064. rqs->ErrorStatus = status;
  1065. rqs->ErrorIndex = aindex;
  1066. if (!SnmpErrEnc(rqs))
  1067. {
  1068. return (FALSE);
  1069. }
  1070. memcpy(*rspBuffer, rqsBuffer, rqsLen);
  1071. *rspLen = rqsLen;
  1072. return (TRUE);
  1073. }
  1074. */
  1075. rqs->Type = SNMP_PDU_RESPONSE;
  1076. rqs->ErrorStatus = SNMP_NOERROR;
  1077. rqs->ErrorIndex = 0;
  1078. if (!SnmpEnc(rspBuffer, rspLen, &Requestpdu, RequestComm, commLen, RequestList, listLen))
  1079. {
  1080. rqs->Type = SNMP_PDU_RESPONSE;
  1081. rqs->ErrorStatus = (u32) snmpErrStatus;
  1082. rqs->ErrorIndex = (u32) snmpErrIndex;
  1083. if (!SnmpErrEnc(rqs))
  1084. {
  1085. return (FALSE);
  1086. }
  1087. memcpy(*rspBuffer, rqsBuffer, rqsLen);
  1088. *rspLen = rqsLen;
  1089. return (TRUE);
  1090. }
  1091. return (TRUE);
  1092. }
  1093. void snmpcycle()
  1094. {
  1095. ;//do nothing here
  1096. }
  1097. void udp_recv()
  1098. {
  1099. int status,i;
  1100. int rqsLen,rspLen;
  1101. char rspBuffer[AGENT_BUFFER_SIZE];
  1102. char rqsBuffer[AGENT_BUFFER_SIZE];
  1103. u8 * rsp = rspBuffer;
  1104. ul32 addr = rxdnet.ipframe.sourceip; //目标IP地址
  1105. int port = rxdnet.udpframe.sourceport; // 目的端口号
  1106. rqsLen = rxdnet.udpframe.length-8;
  1107. PrintStr("nSNMP Message begin");
  1108. PrintStr("nUDP: dest_Port=");
  1109. PrintWord(rxdnet.udpframe.destport);
  1110. PrintStr("  source_Port=");
  1111. PrintWord(rxdnet.udpframe.sourceport);
  1112. PrintStr("  length=");
  1113. PrintWord(rxdnet.udpframe.length);
  1114. for(i=0;i<rxdnet.udpframe.length-8;i++)//8 bytes udp head
  1115. {
  1116. PrintByte(rxdnet.udpframe.udpdata[i]);//udp数
  1117. rqsBuffer[i] = rxdnet.udpframe.udpdata[i];
  1118. }
  1119. rqsLen = rxdnet.udpframe.length-8;
  1120. status=MsgRequest(rqsBuffer,rqsLen,&rsp,&rspLen,addr);
  1121. if(status)
  1122. {
  1123. // udp_request(rsp, rspLen,addr, port); //发送UDP请求包
  1124.       PrintStr("Please send UDP request here");
  1125. }
  1126. else
  1127. {
  1128. PrintStr("SNMP request ERROR!");
  1129. //do nothing;向串口打印错误信息。
  1130. }
  1131. }