private_mib.c 29 KB

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