private_mib.c 31 KB

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