lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Re: [lwip-users] memory leak when sending snmp trap


From: Alexandre Malo
Subject: Re: Re: [lwip-users] memory leak when sending snmp trap
Date: Thu, 11 Jun 2009 10:51:02 -0400

I have tried using the tcpip_callback to have the tcpip thread context.
 
I still have the memalloc problem.
 
This is my new file.
 
#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"
 
#define NUM_PRIVATE_TRAP 10
 
static unsigned char SNMP_TRAP_0_FLAG = 1;
static struct ip_addr SNMP_TRAP_0_ADDR;
 
extern struct snmp_msg_trap trap_msg;
 
struct private_trap
{
  /* source enterprise ID (sysObjectID) */
  struct snmp_obj_id *enterprise; 
  /* trap ID */
  struct snmp_obj_id *trap_oid;
 
  /* specific trap code */
  u32_t spc_trap;
 
  /* object value ASN1 type */
  u8_t value_type;
  /* object value length (in u8_t) */
  u8_t value_len;
  /* object value */
  void *value;
  /* indicate that the trap is sent */
  u8_t in_use;
};
 
struct private_trap trap_bank[NUM_PRIVATE_TRAP];
 
struct private_trap * getNextFreePrivateTrap()
{
   u8_t index;
   void * result = NULL;
  
   for(index = 0; index < NUM_PRIVATE_TRAP; index++)
   {
      if(!trap_bank[index].in_use)
      {
         trap_bank[index].in_use = 1;
         result = &trap_bank[index];        
         break;
      }
   }
  
   return result; 
}
 
void freePrivateTrap(struct private_trap * trap)
{
   trap->enterprise = NULL;
   trap->trap_oid = NULL;
   trap->value = NULL;
   trap->in_use = 0;  
}
 
void vSendTrapCallback( void * parameters )
{
   struct private_trap * trapToSend;
   struct snmp_varbind * vb;
  
   if( parameters != NULL )
   {
      trapToSend = (struct private_trap *) parameters;
     
      vb = snmp_varbind_alloc(trapToSend->enterprise,
                              trapToSend->value_type,
                              trapToSend->value_len);
                             
      vb->value = trapToSend->value;
           
      trap_msg.outvb.head = vb;
      trap_msg.outvb.tail = vb;
      trap_msg.outvb.count = 1;
     
      snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, trapToSend->trap_oid, trapToSend->spc_trap);
     
      trap_msg.outvb.head = NULL;
      trap_msg.outvb.tail = NULL;
      trap_msg.outvb.count = 0;
     
      vb->value = NULL;
     
      snmp_varbind_free(vb);
     
      freePrivateTrap(trapToSend);
   }  
}
 
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);
}
 
void vSendTrapTask( void * pvParameters )
{
   portTickType xLastWakeTime;
   struct snmp_obj_id objid = {MY_SNMP_SYSOBJID_LEN, MY_SNMP_SYSOBJID};
  
   static unsigned char msg[] = "address@hidden";
   static unsigned char msglen= 22;
  
   struct private_trap * trap;
  
   (void) pvParameters;
  
   for ( ;; )
   {
      xLastWakeTime = xTaskGetTickCount();
     
      trap = getNextFreePrivateTrap();
     
      if(trap != NULL)
      {
         trap->enterprise = &objid;
         trap->trap_oid = &objid;
         trap->spc_trap = 1;
         trap->value_type = SNMP_ASN1_OPAQUE;
         trap->value_len = msglen;
         trap->value = &msg;
        
         tcpip_callback(vSendTrapCallback, trap);
      }
     
      // Wait for the next cycle.
      vTaskDelayUntil( &xLastWakeTime, 10 );
   }
  
}
 

#endif//LWIP_SNMP
 
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]