При использовании LWIP SNMP возникают ошибки при вызове второго snmp_vabind_alloc
Я пытаюсь отправить правильную ловушку с использованием протокола SNMP облегченного интернет-протокола (LWIP).
Вики SNMP утверждает, что правильная ловушка должна иметь
- привязка текущего значения sysUpTime
- OID, идентифицирующий тип привязки ловушки
- необязательная привязка переменной
Однако это ошибается с vb->value != NULL
когда второй snmp_varbind_alloc
называется.
Когда отправляется только переменная привязка, и никакая другая, ловушка отправляется на Станцию сетевого управления в порядке.
3 ответа
Ваш вопрос был опубликован некоторое время назад, но у меня возникла та же проблема, что и у вас, и я не смог найти ответ... Я использую LWIP на STM32F107 и не смог добавить второй varbind в мои ловушки...
Решение состояло в том, чтобы увеличить размер HEAP моего микроконтроллера. Когда используется STM32CubeMX, он находится (для меня) в строке 61 файла startup_stm32f107xc.s и имеет значение по умолчанию 0x200 (512 байт), я просто удвоил это значение до 0x400.
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x400
Я надеюсь, что это поможет тому, кто пытается использовать LWIP!
Если структура определена в ОЗУ, а поля заполнены, что эффективно делает выделение вручную, тогда я могу получить две привязки. Это будет один шаг, но не бежать. Итак, теперь мне нужно убедиться, что структуры ОЗУ существуют при отправке, прежде чем я уничтожу их. Итак, я могу добавить задержку, которая не является идеальной, или найти функцию, которая сообщит мне, когда ловушка была отправлена, чтобы я мог двигаться дальше. Я колеблюсь в размещении кода, который не работает. Когда (если) у меня получится, я покажу код.
Вот код для 3 привязок с opt.h, измененным с:
#define MEMP_NUM_SNMP_VALUE 3
чтобы:
#define MEMP_NUM_SNMP_VALUE 9
struct snmp_obj_id sysupid = {9,{1,3,6,1,2,1,1,3,0}};
struct snmp_obj_id trapoid = {11,{1,3,6,1,6,3,1,1,4,1,0}};
struct snmp_obj_id pttnotifyoid = {8,{1,3,6,1,4,SNMP_ENTERPRISE_ID,3,18}};
static unsigned char trapOID[10] = { 0x2b, 6, 1, 4, 1, 0x82, 0xe4, 0x3d, 3, 18};
struct snmp_varbind *vb1, *vb2, *vb3;
u32_t *u32ptr, sysuptime;
void vSendTrapTaskDemo( void ){
snmp_varbind_list_free(&trap_msg.outvb);
vb1 = snmp_varbind_alloc(&sysupid,SNMP_ASN1_TIMETICKS, 4);
snmp_get_sysuptime(&sysuptime);
vb1->value_len=4;
vb1->value_type=0x43; //Timerticks
u32ptr=vb1->value;
*u32ptr=sysuptime;
snmp_varbind_tail_add(&trap_msg.outvb,vb1);
vb2 = snmp_varbind_alloc(&trapoid,SNMP_ASN1_OBJ_ID, 11);
memcpy (vb2->value, trapOID, 10);
snmp_varbind_tail_add(&trap_msg.outvb,vb2);
vb3 = snmp_varbind_alloc(&pttnotifyoid, SNMP_ASN1_COUNTER, 4);
vb3->value_len=4;
vb3->value_type=0x02; //Integer32
u32ptr=vb3->value;
*u32ptr=1;
snmp_varbind_tail_add(&trap_msg.outvb,vb3);
snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &sysupid,18);
snmp_varbind_list_free(&trap_msg.outvb);
}
Вторая привязка имеет проблемы. Значение OID равно 0 (itu-t), когда оно должно быть: 1.3.6.1.4.1.45629.3.18
Однако, поскольку для уровня 1 требуется только одна привязка, я пока забуду метод привязки 3, пока не скажу, что необходим уровень 2.