Here is the function that could be use as example
It is possible to have more than one vSendTrapTaskDemo
private_trap only have the prototypes
What do you think?
#include "lwip/opt.h"
#if LWIP_SNMP
#include "lwip/inet.h"
#include "lwip/snmp_msg.h"
#include "lwip/snmp_asn1.h"
#include "lwip/tcpip.h"
#include "Printf.h"
#include "private_trap.h"
#include "stdlib.h"
#define NUM_PRIVATE_TRAP_LIST 5
static unsigned char SNMP_TRAP_0_FLAG = 1;
static struct ip_addr SNMP_TRAP_0_ADDR;
extern struct snmp_msg_trap trap_msg;
struct trap_list
{
struct snmp_varbind_root vb_root;
struct snmp_obj_id *ent_oid;
s32_t spc_trap;
u8_t in_use;
};
struct trap_list trap_list_bank[NUM_PRIVATE_TRAP_LIST];
xSemaphoreHandle getTrapListSema = NULL;
void vSNMP_Trap_Init( )
{
/* Set SNMP Trap destination */
IP4_ADDR( &SNMP_TRAP_0_ADDR, 172, 27, 37, 70);
snmp_trap_dst_ip_set(0,&SNMP_TRAP_0_ADDR);
snmp_trap_dst_enable(0,SNMP_TRAP_0_FLAG);
getTrapListSema = sys_sem_new(0);
}
struct trap_list * getNextFreePrivateTrapList()
{
u8_t index;
struct trap_list * result = NULL;
xSemaphoreTake(getTrapListSema, (portTickType) 10);
for(index = 0; index < NUM_PRIVATE_TRAP_LIST; index++)
{
if(!trap_list_bank[index].in_use)
{
trap_list_bank[index].in_use = 1;
result = &trap_list_bank[index];
break;
}
}
xSemaphoreGive(getTrapListSema);
return result;
}
void freePrivateTrapList(struct trap_list * list)
{
snmp_varbind_list_free(&list->vb_root);
list->ent_oid = NULL;
list->spc_trap = 0;
list->in_use = 0;
}
void vSendTrapCallback( void * parameters )
{
struct trap_list * param;
if( parameters != NULL )
{
param = (struct trap_list *) parameters;
trap_msg.outvb = param->vb_root;
snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC,
param->ent_oid,
param->spc_trap);
freePrivateTrapList(param);
}
}
void vSendTrapTaskDemo( void * pvParameters )
{
portTickType xLastWakeTime;
struct snmp_obj_id objid = {MY_SNMP_SYSOBJID_LEN, MY_SNMP_SYSOBJID};
static unsigned char msg[] = "Alexandre_Malo-mpbc_ca";
static unsigned char msg2[] = "salut simon, c'est mal";
static unsigned char msglen= 22;
struct snmp_varbind *vb;
struct trap_list *vb_list;
(void) pvParameters;
for ( ;; )
{
xLastWakeTime = xTaskGetTickCount();
vb_list = getNextFreePrivateTrapList();
vb_list->ent_oid = &objid;
vb_list->spc_trap = 12;
vb = snmp_varbind_alloc(&objid, SNMP_ASN1_OPAQUE, msglen);
if (vb != NULL)
{
memcpy (vb->value, &msg, msglen);
snmp_varbind_tail_add(&vb_list->vb_root,vb);
}
vb = snmp_varbind_alloc(&objid, SNMP_ASN1_OPAQUE, msglen);
if (vb != NULL)
{
memcpy (vb->value, &msg2, msglen);
snmp_varbind_tail_add(&vb_list->vb_root,vb);
}
tcpip_callback(vSendTrapCallback, vb_list);
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, 100);
}
}
#endif//LWIP_SNMP
_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users