private_mib.c 31 KB

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