private_mib.c 30 KB

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