private_mib.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  1. #include "stm32f4xx.h"
  2. #include "private_mib.h"
  3. #include "lwip/snmp.h"
  4. #include "lwip/snmp_msg.h"
  5. #include "lwip/snmp_asn1.h"
  6. #include "lwip/snmp_structs.h"
  7. #include "parameters.h"
  8. #include "web_params_api.h"
  9. #include "snmp_api.h"
  10. #include "trap_api.h"
  11. #include "common_config.h"
  12. #include "FreeRTOS.h"
  13. #ifdef PRINTF_STDLIB
  14. #include <stdio.h>
  15. #endif
  16. #ifdef PRINTF_CUSTOM
  17. #include "tinystdio.h"
  18. #endif
  19. extern void ocstrncpy(u8_t *dst, u8_t *src, u16_t n);
  20. char paramStr[255];
  21. uint8_t paramLength = 0;
  22. uint32_t paramInt = 0;
  23. static void system_get_object_def_ee( u8_t ident_len, s32_t *ident, struct obj_def *od );
  24. static void system_get_value_ee(struct obj_def *od, u16_t len, void *value);
  25. static u8_t system_set_test_ee(struct obj_def *od, u16_t len, void *value);
  26. static void system_set_value_ee(struct obj_def *od, u16_t len, void *value);
  27. /* Функции для узла Signals */
  28. static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od);
  29. static void signals_get_value (struct obj_def *od, u16_t len, void *value);
  30. static u8_t signals_set_test (struct obj_def *od, u16_t len, void *value);
  31. static void signals_set_value (struct obj_def *od, u16_t len, void *value);
  32. /*------------------------------------------------------------------------------
  33. Описание узлов
  34. ------------------------------------------------------------------------------*/
  35. /* узел SYSTEM (операции с EEPROM) */
  36. /* 0 1 2 3 4 5 6 */
  37. /* system .1.3.6.1.2.1.1 */
  38. const mib_scalar_node system_scalar_ee = {
  39. &system_get_object_def_ee,
  40. &system_get_value_ee,
  41. &system_set_test_ee,
  42. &system_set_value_ee,
  43. MIB_NODE_SC,
  44. 0
  45. };
  46. // переменные узла SIGNALS ------------------------------------------
  47. const mib_scalar_node signals_var =
  48. {
  49. &signals_get_object_def,
  50. &signals_get_value,
  51. &signals_set_test,
  52. &signals_set_value,
  53. MIB_NODE_SC,
  54. 0
  55. };
  56. // узел SIGNALS -----------------------------------------------------
  57. const s32_t signals_ids[27] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
  58. struct mib_node* const signals_nodes[13] =
  59. {
  60. (struct mib_node* const)&signals_var,
  61. (struct mib_node* const)&signals_var,
  62. (struct mib_node* const)&signals_var,
  63. (struct mib_node* const)&signals_var,
  64. (struct mib_node* const)&signals_var,
  65. (struct mib_node* const)&signals_var,
  66. (struct mib_node* const)&signals_var,
  67. (struct mib_node* const)&signals_var,
  68. (struct mib_node* const)&signals_var,
  69. (struct mib_node* const)&signals_var,
  70. (struct mib_node* const)&signals_var,
  71. (struct mib_node* const)&signals_var,
  72. (struct mib_node* const)&signals_var
  73. };
  74. const struct mib_array_node signals =
  75. {
  76. &noleafs_get_object_def,
  77. &noleafs_get_value,
  78. &noleafs_set_test,
  79. &noleafs_set_value,
  80. MIB_NODE_AR,
  81. 13,
  82. signals_ids,
  83. signals_nodes
  84. };
  85. // узел BT-6701 ------------------------------------------------------------
  86. const s32_t bt6701_ids[1] = { 1 };
  87. struct mib_node* const bt6701_nodes[1] =
  88. {
  89. (struct mib_node* const)&signals,
  90. };
  91. const struct mib_array_node bt6701 =
  92. {
  93. &noleafs_get_object_def,
  94. &noleafs_get_value,
  95. &noleafs_set_test,
  96. &noleafs_set_value,
  97. MIB_NODE_AR,
  98. 1,
  99. bt6701_ids,
  100. bt6701_nodes
  101. };
  102. // узел swt ------------------------------------------------------------
  103. const s32_t swt_ids[1] = {
  104. 1
  105. };
  106. struct mib_node* const swt_nodes[1] =
  107. {
  108. (struct mib_node* const)&bt6701,
  109. };
  110. const struct mib_array_node swt =
  111. {
  112. &noleafs_get_object_def,
  113. &noleafs_get_value,
  114. &noleafs_set_test,
  115. &noleafs_set_value,
  116. MIB_NODE_AR,
  117. 1,
  118. swt_ids,
  119. swt_nodes
  120. };
  121. // узел ROTEK ------------------------------------------------------------
  122. const s32_t rotek_ids[1] = { 911 };
  123. struct mib_node* const rotek_nodes[1] =
  124. {
  125. (struct mib_node* const)&swt,
  126. };
  127. const struct mib_array_node rotek =
  128. {
  129. &noleafs_get_object_def,
  130. &noleafs_get_value,
  131. &noleafs_set_test,
  132. &noleafs_set_value,
  133. MIB_NODE_AR,
  134. 1,
  135. rotek_ids,
  136. rotek_nodes
  137. };
  138. // узел ENTERPRISES -------------------------------------------------------
  139. const s32_t enterprises_ids[1] = { 41752 };
  140. struct mib_node* const enterprises_nodes[1] =
  141. {
  142. (struct mib_node* const)&rotek
  143. };
  144. const struct mib_array_node enterprises =
  145. {
  146. &noleafs_get_object_def,
  147. &noleafs_get_value,
  148. &noleafs_set_test,
  149. &noleafs_set_value,
  150. MIB_NODE_AR,
  151. 1,
  152. enterprises_ids,
  153. enterprises_nodes
  154. };
  155. // узел PRIVATE -----------------------------------------------------------
  156. const s32_t mib_private_ids[1] = { 1 };
  157. struct mib_node* const mib_pivate_nodes[1] =
  158. {
  159. (struct mib_node* const)&enterprises
  160. };
  161. const struct mib_array_node mib_private =
  162. {
  163. &noleafs_get_object_def,
  164. &noleafs_get_value,
  165. &noleafs_set_test,
  166. &noleafs_set_value,
  167. MIB_NODE_AR,
  168. 1,
  169. mib_private_ids,
  170. mib_pivate_nodes
  171. };
  172. /*------------------------------------------------------------------------------
  173. Функции
  174. ------------------------------------------------------------------------------*/
  175. // Функции для узла SIGNALS
  176. /**-----------------------------------------------------------------------------
  177. \fn static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od)
  178. \brief функция получения свойств переменных узла Identification
  179. \param ident_len - the address length. длина адреса
  180. \param ident - points to objectname.0 (object id trailer)
  181. \param od - points to object definition. указатель на описание переменной
  182. \return нет
  183. ------------------------------------------------------------------------------*/
  184. static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od)
  185. {
  186. u8_t id;
  187. /* return to object name, adding index depth (1) */
  188. ident_len += 1;
  189. ident -= 1;
  190. if (ident_len == 2)
  191. {
  192. od->id_inst_len = ident_len;
  193. od->id_inst_ptr = ident;
  194. id = ident[0];
  195. switch (id)
  196. {
  197. case 1: /* FWVersion */
  198. GetVersionStr(paramStr, &paramLength);
  199. od->instance = MIB_OBJECT_SCALAR;
  200. od->access = MIB_OBJECT_READ_ONLY;
  201. od->asn_type = SNMP_ASN1_OC_STR;
  202. od->v_len = paramLength;
  203. break;
  204. case 2: /* RestoreSignal */
  205. GetRestore(paramStr, &paramLength);
  206. od->instance = MIB_OBJECT_SCALAR;
  207. od->access = MIB_OBJECT_READ_WRITE;
  208. od->asn_type = SNMP_ASN1_INTEG;
  209. od->v_len = sizeof(s32_t);
  210. break;
  211. case 3: /* RebootSignal */
  212. GetReboot(paramStr, &paramLength);
  213. od->instance = MIB_OBJECT_SCALAR;
  214. od->access = MIB_OBJECT_READ_WRITE;
  215. od->asn_type = SNMP_ASN1_INTEG;
  216. od->v_len = sizeof(s32_t);
  217. break;
  218. case 4: /* IntTemp */
  219. GetInternalTempStr(paramStr, &paramLength);
  220. od->instance = MIB_OBJECT_SCALAR;
  221. od->access = MIB_OBJECT_READ_ONLY;
  222. od->asn_type = SNMP_ASN1_OC_STR;
  223. od->v_len = paramLength;
  224. break;
  225. case 5: /* LineFailBit */
  226. GetLineFailBitStr(paramStr, &paramLength);
  227. od->instance = MIB_OBJECT_SCALAR;
  228. od->access = MIB_OBJECT_READ_ONLY;
  229. od->asn_type = SNMP_ASN1_OC_STR;
  230. od->v_len = paramLength;
  231. break;
  232. case 6: /* LowBatBit */
  233. GetLowBatteryBitStr(paramStr, &paramLength);
  234. od->instance = MIB_OBJECT_SCALAR;
  235. od->access = MIB_OBJECT_READ_ONLY;
  236. od->asn_type = SNMP_ASN1_OC_STR;
  237. od->v_len = paramLength;
  238. break;
  239. case 7: /* InFreq */
  240. GetInputFreqStr(paramStr, &paramLength);
  241. od->instance = MIB_OBJECT_SCALAR;
  242. od->access = MIB_OBJECT_READ_ONLY;
  243. od->asn_type = SNMP_ASN1_OC_STR;
  244. od->v_len = paramLength;
  245. break;
  246. case 8: /* OutFreq */
  247. GetOutputFreqStr(paramStr, &paramLength);
  248. od->instance = MIB_OBJECT_SCALAR;
  249. od->access = MIB_OBJECT_READ_ONLY;
  250. od->asn_type = SNMP_ASN1_OC_STR;
  251. od->v_len = paramLength;
  252. break;
  253. case 9: /* InVoltVAC */
  254. GetInputVoltageStr(paramStr, &paramLength);
  255. od->instance = MIB_OBJECT_SCALAR;
  256. od->access = MIB_OBJECT_READ_ONLY;
  257. od->asn_type = SNMP_ASN1_OC_STR;
  258. od->v_len = paramLength;
  259. break;
  260. case 10: /* OutVoltVAC */
  261. GetOutputVoltageStr(paramStr, &paramLength);
  262. od->instance = MIB_OBJECT_SCALAR;
  263. od->access = MIB_OBJECT_READ_ONLY;
  264. od->asn_type = SNMP_ASN1_OC_STR;
  265. od->v_len = paramLength;
  266. break;
  267. case 11: /* Power */
  268. GetPowerStr(paramStr, &paramLength);
  269. od->instance = MIB_OBJECT_SCALAR;
  270. od->access = MIB_OBJECT_READ_ONLY;
  271. od->asn_type = SNMP_ASN1_OC_STR;
  272. od->v_len = paramLength;
  273. break;
  274. case 12: /* BatCap */
  275. GetBatCapacityStr(paramStr, &paramLength);
  276. od->instance = MIB_OBJECT_SCALAR;
  277. od->access = MIB_OBJECT_READ_ONLY;
  278. od->asn_type = SNMP_ASN1_OC_STR;
  279. od->v_len = paramLength;
  280. break;
  281. case 13: /* ConnectMonitor */
  282. GetConnectMonitorStr(paramStr, &paramLength);
  283. od->instance = MIB_OBJECT_SCALAR;
  284. od->access = MIB_OBJECT_READ_ONLY;
  285. od->asn_type = SNMP_ASN1_OC_STR;
  286. od->v_len = paramLength;
  287. break;
  288. default:
  289. //LWIP_DEBUGF(SNMP_MIB_DEBUG,("planar_get_object_def: no such object\n"));
  290. od->instance = MIB_OBJECT_NONE;
  291. break;
  292. };
  293. }
  294. else
  295. {
  296. LWIP_DEBUGF(SNMP_MIB_DEBUG,("planar_get_object_def: no scalar\n"));
  297. od->instance = MIB_OBJECT_NONE;
  298. }
  299. }
  300. /**-----------------------------------------------------------------------------
  301. \fn static void Identification_get_value(struct obj_def *od, u16_t len, void *value)
  302. \brief функция получения значения переменных узла Identification
  303. \param obj_def - указатель на описание переменной
  304. \param len - длина переменной в байтах
  305. \param value - указатель на значение переменной
  306. \return нет
  307. ------------------------------------------------------------------------------*/
  308. static void signals_get_value (struct obj_def *od, u16_t len, void *value)
  309. {
  310. u8_t id;
  311. id = od->id_inst_ptr[0];
  312. switch (id)
  313. {
  314. case 1: /* FWVersion */
  315. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  316. break;
  317. case 2: /* RestoreSignal */
  318. *((s32_t*)value) = 0;
  319. break;
  320. case 3: /* RebootSignal */
  321. *((s32_t*)value) = 0;
  322. break;
  323. case 4: /* IntTemp */
  324. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  325. break;
  326. case 5: /* LineFailBit */
  327. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  328. break;
  329. case 6: /* LowBatBit */
  330. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  331. break;
  332. case 7: /* InFreq */
  333. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  334. break;
  335. case 8: /* OutFreq */
  336. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  337. break;
  338. case 9: /* InVoltVAC */
  339. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  340. break;
  341. case 10: /* OutVoltVAC */
  342. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  343. break;
  344. case 11: /* Power */
  345. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  346. break;
  347. case 12: /* BatCap */
  348. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  349. break;
  350. case 13: /* ConnectMonitor */
  351. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  352. break;
  353. default :
  354. break;
  355. };
  356. }
  357. /**-----------------------------------------------------------------------------
  358. \fn static void Identification_set_value (struct obj_def *od, u16_t len, void *value)
  359. \brief функция записи значений переменных узла Identification
  360. \param obj_def - указатель на описание переменной
  361. \param len - длина переменной в байтах
  362. \param value - указатель на значение переменной
  363. \return нет
  364. ------------------------------------------------------------------------------*/
  365. static void signals_set_value (struct obj_def *od, u16_t len, void *value)
  366. {
  367. u8_t id;
  368. uint32_t val;
  369. id = od->id_inst_ptr[0];
  370. val = *((s32_t*)value);
  371. switch (id)
  372. {
  373. case 2: /* RestoreSignal */
  374. if (val == 1) {
  375. SNMP_SendUserTrap(DEVICE_RESTORED);
  376. HTTP_ResetSettings();
  377. }
  378. break;
  379. case 3: /* RebootSignal */
  380. if (val == 1)
  381. HTTP_StartResetTask(false);
  382. break;
  383. default :
  384. break;
  385. };
  386. }
  387. /**-----------------------------------------------------------------------------
  388. \fn static u8_t Identification_set_test (struct obj_def *od, u16_t len, void *value)
  389. \brief функция проверки записываемых значений переменных узла Identification
  390. \param obj_def - указатель на описание переменной
  391. \param len - длина переменной в байтах
  392. \param value - указатель на значение переменной
  393. \return 0 - некорректное значение
  394. 1 - корректное значение
  395. ------------------------------------------------------------------------------*/
  396. static u8_t signals_set_test (struct obj_def *od, u16_t len, void *value)
  397. {
  398. u8_t id, set_ok;
  399. LWIP_UNUSED_ARG(value);
  400. set_ok = 0;
  401. id = od->id_inst_ptr[0];
  402. switch (id)
  403. {
  404. case 2:
  405. if ( len == sizeof(s32_t) )
  406. {
  407. set_ok = 1;
  408. }
  409. break;
  410. case 3:
  411. if ( len == sizeof(s32_t) )
  412. {
  413. set_ok = 1;
  414. }
  415. break;
  416. };
  417. return set_ok;
  418. }
  419. /**
  420. * Returns systems object definitions (eeprom).
  421. *
  422. * @param ident_len the address length (2)
  423. * @param ident points to objectname.0 (object id trailer)
  424. * @param od points to object definition.
  425. */
  426. static void
  427. system_get_object_def_ee(u8_t ident_len, s32_t *ident, struct obj_def *od)
  428. {
  429. u8_t id;
  430. /* return to object name, adding index depth (1) */
  431. ident_len += 1;
  432. ident -= 1;
  433. if (ident_len == 2)
  434. {
  435. od->id_inst_len = ident_len;
  436. od->id_inst_ptr = ident;
  437. id = ident[0];
  438. //LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def_ee system.%"U16_F".0\n",(u16_t)id));
  439. switch (id)
  440. {
  441. case 4: /* sysContact */
  442. od->instance = MIB_OBJECT_SCALAR;
  443. od->access = MIB_OBJECT_READ_WRITE;
  444. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  445. od->v_len = 1 /*GetSnmpStringLen(SNMP_SYSCONTACT_TYPE)*/;
  446. break;
  447. case 5: /* sysName */
  448. od->instance = MIB_OBJECT_SCALAR;
  449. od->access = MIB_OBJECT_READ_WRITE;
  450. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  451. od->v_len = 1 /*GetSnmpStringLen(SNMP_SYSNAME_TYPE)*/;
  452. break;
  453. case 6: /* sysLocation */
  454. od->instance = MIB_OBJECT_SCALAR;
  455. od->access = MIB_OBJECT_READ_WRITE;
  456. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  457. od->v_len = 1 /*GetSnmpStringLen(SNMP_SYSLOCATION_TYPE)*/;
  458. break;
  459. default:
  460. //LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def_ee: no such object\n"));
  461. od->instance = MIB_OBJECT_NONE;
  462. break;
  463. };
  464. }
  465. else
  466. {
  467. LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def_ee: no scalar\n"));
  468. od->instance = MIB_OBJECT_NONE;
  469. }
  470. }
  471. // ----------------------------------------------------------------------------
  472. /**
  473. * Returns system object value.
  474. *
  475. * @param ident_len the address length (2)
  476. * @param ident points to objectname.0 (object id trailer)
  477. * @param len return value space (in bytes)
  478. * @param value points to (varbind) space to copy value into.
  479. */
  480. static void
  481. system_get_value_ee(struct obj_def *od, u16_t len, void *value)
  482. {
  483. u8_t id;
  484. id = od->id_inst_ptr[0];
  485. switch (id)
  486. {
  487. case 4: /* sysContact */
  488. //GetSnmpString(SNMP_SYSCONTACT_TYPE, value, len );
  489. break;
  490. case 5: /* sysName */
  491. //GetSnmpString(SNMP_SYSNAME_TYPE, value, len );
  492. break;
  493. case 6: /* sysLocation */
  494. //GetSnmpString(SNMP_SYSLOCATION_TYPE, value, len );
  495. break;
  496. };
  497. }
  498. // ----------------------------------------------------------------------------
  499. static u8_t
  500. system_set_test_ee(struct obj_def *od, u16_t len, void *value)
  501. {
  502. u8_t id, set_ok;
  503. LWIP_UNUSED_ARG(value);
  504. set_ok = 0;
  505. id = od->id_inst_ptr[0];
  506. switch (id)
  507. {
  508. case 4: /* sysContact */
  509. if ( len <= 255 )
  510. {
  511. set_ok = 1;
  512. }
  513. break;
  514. case 5: /* sysName */
  515. if ( len <= 255 )
  516. {
  517. set_ok = 1;
  518. }
  519. break;
  520. case 6: /* sysLocation */
  521. if ( len <= 255 )
  522. {
  523. set_ok = 1;
  524. }
  525. break;
  526. };
  527. return set_ok;
  528. }
  529. // ----------------------------------------------------------------------------
  530. static void
  531. system_set_value_ee(struct obj_def *od, u16_t len, void *value)
  532. {
  533. u8_t id;
  534. id = od->id_inst_ptr[0];
  535. switch (id)
  536. {
  537. case 4: /* sysContact */
  538. //SetSnmpString(SNMP_SYSCONTACT_TYPE, value, len );
  539. //*syscontact_len_ptr = len;
  540. break;
  541. case 5: /* sysName */
  542. //SetSnmpString(SNMP_SYSNAME_TYPE, value, len );
  543. //*sysname_len_ptr = len;
  544. break;
  545. case 6: /* sysLocation */
  546. //SetSnmpString(SNMP_SYSLOCATION_TYPE, value, len );
  547. //*syslocation_len_ptr = len;
  548. break;
  549. };
  550. }
  551. // ----------------------------------------------------------------------------
  552. /**-----------------------------------------------------------------------------
  553. \fn err_t snmp_send_trap_ex (s8_t generic_trap,
  554. struct snmp_obj_id *eoid,
  555. s32_t specific_trap,
  556. struct snmp_obj_id* varbinds,
  557. u8_t varbinds_num)
  558. \brief функция посылки трапа с возможностью пристыковывать переменные
  559. \param generic_trap - код трапа
  560. \param eoid - указатель на enterprise object identifier
  561. \param specific_trap - used for enterprise traps when generic_trap == 6
  562. \param varbinds - указатель на переменные
  563. \param varbinds_num - число переменных
  564. \return код ошибки
  565. ------------------------------------------------------------------------------*/
  566. err_t snmp_send_trap_ex (s8_t generic_trap,
  567. struct snmp_obj_id *eoid,
  568. s32_t specific_trap,
  569. struct snmp_obj_id* varbinds,
  570. u8_t varbinds_num)
  571. {
  572. uint8_t bSnmpActive = 1;
  573. struct snmp_varbind** vb_list;
  574. struct mib_node* node;
  575. struct obj_def obj;
  576. err_t tResult;
  577. s32_t* VarNum;
  578. struct snmp_name_ptr np;
  579. /* SNMP не готово - ничего не отправляем */
  580. if( !bSnmpActive )
  581. {
  582. return ERR_MEM;
  583. }
  584. /* создаем таблицу указателей переменных */
  585. pvPortMalloc( varbinds_num * sizeof(struct snmp_varbind*) );
  586. /*
  587. if(vb_list == NULL)
  588. {
  589. return ERR_MEM;
  590. }
  591. */
  592. /* создаем сами переменные */
  593. for(u8_t i = 0; i < varbinds_num; i++)
  594. {
  595. /* ищем узел в дереве*/
  596. node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len - 3,
  597. &varbinds[i].id[4], &np );
  598. //node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len,
  599. // &varbinds[i].id[0], &np );
  600. if(node != NULL)
  601. {
  602. /* получаем информацию о переменной узла */
  603. VarNum = &varbinds[i].id[ varbinds[i].len - 1 ];
  604. if( node->node_type == MIB_NODE_EX)
  605. {
  606. struct mib_external_node* node_ex;
  607. node_ex = (struct mib_external_node*)node;
  608. /* TODO: подставить правильный rid вместо 0 */
  609. node_ex->get_object_def_a(0, 1, VarNum, &obj);
  610. }
  611. else
  612. {
  613. node->get_object_def(1, VarNum, &obj);
  614. }
  615. /* создаем переменную */
  616. vb_list[i] = snmp_varbind_alloc(&varbinds[i], obj.asn_type, obj.v_len);
  617. if( vb_list[i] != NULL )
  618. {
  619. {
  620. /* получаем значение переменной */
  621. if( node->node_type == MIB_NODE_EX)
  622. {
  623. struct mib_external_node* node_ex;
  624. node_ex = (struct mib_external_node*)node;
  625. /* TODO: подставить правильный rid вместо 0 */
  626. node_ex->get_value_a(0, &obj, obj.v_len, vb_list[i]->value);
  627. }
  628. else
  629. {
  630. node->get_value(&obj, obj.v_len, vb_list[i]->value);
  631. }
  632. /* добавляем переменную в ловушку */
  633. snmp_varbind_tail_add(&trap_msg.outvb, vb_list[i]);
  634. }
  635. }
  636. }
  637. }
  638. /* посылаем ловушку */
  639. tResult = snmp_send_trap(generic_trap, eoid, specific_trap);
  640. /* удаляем переменные из списка */
  641. snmp_varbind_list_free(&trap_msg.outvb);
  642. /* удаляем указатели переменных */
  643. vPortFree(vb_list);
  644. return tResult;
  645. }
  646. void SNMP_SendTestTrap(void)
  647. {
  648. /*
  649. struct snmp_varbind *vb;
  650. struct snmp_obj_id objid = {11, {1, 3, 6, 1, 4, 1, 41752, 5, 16, 2, 1}};
  651. unsigned char msg[] = "Sex, drugs and LwIP";
  652. unsigned char msglen = 19;
  653. vb = snmp_varbind_alloc(&objid, SNMP_ASN1_OPAQUE, msglen);
  654. vb->value = &msg;
  655. trap_msg.outvb.head = vb;
  656. trap_msg.outvb.tail = vb;
  657. trap_msg.outvb.count = 1;
  658. snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &objid, 0);
  659. trap_msg.outvb.head = NULL;
  660. trap_msg.outvb.tail = NULL;
  661. trap_msg.outvb.count = 0;
  662. //vb->value = NULL;
  663. snmp_varbind_free(vb);
  664. */
  665. static struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 5, 16, 2, 1}};
  666. static struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 5, 16, 1, 1}};
  667. struct snmp_varbind* vb;
  668. u32_t *u32ptr;
  669. vb = snmp_varbind_alloc(&varObjId, MIB_NODE_SC, 4);
  670. vb->value_len = 4;
  671. vb->value_type = 0x02;
  672. u32ptr = vb->value;
  673. *u32ptr = 23;
  674. if( vb != NULL )
  675. snmp_varbind_tail_add(&trap_msg.outvb, vb);
  676. snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &trapObjId, 0);
  677. /* удаляем переменные из списка */
  678. snmp_varbind_list_free(&trap_msg.outvb);
  679. //snmp_send_trap_ex(SNMP_GENTRAP_ENTERPRISESPC, &trapObjId, 0, &varObjId, 1);
  680. #if 0
  681. struct snmp_varbind** vb_list;
  682. struct mib_node* node;
  683. struct obj_def obj;
  684. err_t tResult;
  685. s32_t* VarNum;
  686. struct snmp_name_ptr np;
  687. /* создаем указатель на переменную */
  688. pvPortMalloc(sizeof(struct snmp_varbind*) );
  689. /* создаем сами переменные */
  690. for(u8_t i = 0; i < varbinds_num; i++)
  691. {
  692. /* ищем узел в дереве*/
  693. node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len - 4,
  694. &varbinds[i].id[4], &np );
  695. //node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len,
  696. // &varbinds[i].id[0], &np );
  697. if(node != NULL)
  698. {
  699. /* получаем информацию о переменной узла */
  700. VarNum = &varbinds[i].id[ varbinds[i].len - 1 ];
  701. if( node->node_type == MIB_NODE_EX)
  702. {
  703. struct mib_external_node* node_ex;
  704. node_ex = (struct mib_external_node*)node;
  705. /* TODO: подставить правильный rid вместо 0 */
  706. node_ex->get_object_def_a(0, 1, VarNum, &obj);
  707. }
  708. else
  709. {
  710. node->get_object_def(1, VarNum, &obj);
  711. }
  712. /* создаем переменную */
  713. vb_list[i] = snmp_varbind_alloc(&varbinds[i], obj.asn_type, obj.v_len);
  714. if( vb_list[i] != NULL )
  715. {
  716. {
  717. /* получаем значение переменной */
  718. if( node->node_type == MIB_NODE_EX)
  719. {
  720. struct mib_external_node* node_ex;
  721. node_ex = (struct mib_external_node*)node;
  722. /* TODO: подставить правильный rid вместо 0 */
  723. node_ex->get_value_a(0, &obj, obj.v_len, vb_list[i]->value);
  724. }
  725. else
  726. {
  727. node->get_value(&obj, obj.v_len, vb_list[i]->value);
  728. }
  729. /* добавляем переменную в ловушку */
  730. snmp_varbind_tail_add(&trap_msg.outvb, vb_list[i]);
  731. }
  732. }
  733. }
  734. }
  735. /* посылаем ловушку */
  736. tResult = snmp_send_trap(generic_trap, eoid, specific_trap);
  737. /* удаляем переменные из списка */
  738. snmp_varbind_list_free(&trap_msg.outvb);
  739. /* удаляем указатели переменных */
  740. vPortFree(vb_list);
  741. return tResult;
  742. #endif
  743. }
  744. #define NUM_PRIVATE_TRAP 10
  745. //static unsigned char SNMP_TRAP_0_FLAG = 1;
  746. //static struct ip_addr SNMP_TRAP_0_ADDR;
  747. extern struct snmp_msg_trap trap_msg;
  748. struct private_trap
  749. {
  750. /* source enterprise ID (sysObjectID) */
  751. struct snmp_obj_id *enterprise;
  752. /* trap ID */
  753. struct snmp_obj_id *trap_oid;
  754. /* specific trap code */
  755. u32_t spc_trap;
  756. /* object value ASN1 type */
  757. u8_t value_type;
  758. /* object value length (in u8_t) */
  759. u8_t value_len;
  760. /* object value */
  761. void *value;
  762. /* indicate that the trap is sent */
  763. u8_t in_use;
  764. };
  765. struct private_trap trap_bank[NUM_PRIVATE_TRAP];
  766. struct private_trap * getNextFreePrivateTrap()
  767. {
  768. u8_t index;
  769. void * result = NULL;
  770. for(index = 0; index < NUM_PRIVATE_TRAP; index++)
  771. {
  772. if(!trap_bank[index].in_use)
  773. {
  774. trap_bank[index].in_use = 1;
  775. result = &trap_bank[index];
  776. break;
  777. }
  778. }
  779. return result;
  780. }
  781. void freePrivateTrap(struct private_trap * trap)
  782. {
  783. trap->enterprise = NULL;
  784. trap->trap_oid = NULL;
  785. trap->value = NULL;
  786. trap->in_use = 0;
  787. }
  788. void vSendTrapCallback( void * parameters )
  789. {
  790. struct private_trap * trapToSend;
  791. struct snmp_varbind * vb;
  792. if( parameters != NULL )
  793. {
  794. trapToSend = (struct private_trap *) parameters;
  795. vb = snmp_varbind_alloc(trapToSend->enterprise,
  796. trapToSend->value_type,
  797. trapToSend->value_len);
  798. vb->value = trapToSend->value;
  799. trap_msg.outvb.head = vb;
  800. trap_msg.outvb.tail = vb;
  801. trap_msg.outvb.count = 1;
  802. snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, trapToSend->trap_oid, trapToSend->spc_trap);
  803. trap_msg.outvb.head = NULL;
  804. trap_msg.outvb.tail = NULL;
  805. trap_msg.outvb.count = 0;
  806. vb->value = NULL;
  807. snmp_varbind_free(vb);
  808. freePrivateTrap(trapToSend);
  809. }
  810. }