After a lot of debub testing I conclude that the problem is there:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
void SNMP_task
(
pointer traps,
pointer creator
)
{ /* Body */
SNMP_PARSE snmp;
sockaddr_in addr;
uint_32 sock, error, count;
int_32 inlen, j;
uint_32 outlen,time;
uint_16 addrlen;
uint_32 option;
char_ptr community_array[] = SNMPCFG_COMMUNITY_LIST;
_ip_address _PTR_ trap_receiver_list_ptr = (_ip_address _PTR_)traps;
SNMP_CONTEXT snmp_context = { 0 };
SNMP_task_id = RTCS_task_getid();
#ifdef __MQX__
/* Set up exit handler and context so that we can clean up if the SNMP agent is terminated */
_task_set_environment( _task_get_id(), (pointer) &snmp_context );
_task_set_exit_handler( _task_get_id(), SNMP_Exit_handler );
#endif
/* SNMP agent services port 161 */
addr.sin_family = AF_INET;
addr.sin_port = IPPORT_SNMP;
addr.sin_addr.s_addr = INADDR_ANY;
/* Bind to UDP port */
snmp_context.UDPSOCK = socket(PF_INET, SOCK_DGRAM, 0);
sock = snmp_context.UDPSOCK;
if (sock == RTCS_SOCKET_ERROR) {
RTCS_task_exit(creator, RTCSERR_OUT_OF_SOCKETS);
} /* Endif */
/* Begin ENGR00243356 */
/* Set socket options to no wait */
option = TRUE;
setsockopt(sock, SOL_UDP, OPT_SEND_NOWAIT, &option, sizeof(option));
/* End ENGR00243356 */
error = bind(sock, &addr, sizeof(addr));
if (error) {
RTCS_task_exit(creator, error);
} /* Endif */
IF_SNMP_STATS_ENABLED(_mem_zero(&snmp.STATS, sizeof(snmp.STATS)));
snmp.trapsock = sock;
snmp.currentcommunity = 0;
for (j = 0; j < SNMPCFG_NUM_COMMUNITY; j++) {
snmp.community[j] = community_array[j];
snmp.communitylen[j] = strlen((const char *)(community_array[j]));
} /* Endfor */
for (j = 0; j < SNMPCFG_MAX_TRAP_RECEIVERS; j++)
snmp.trap_receiver_list[j] = 0;
if(trap_receiver_list_ptr != NULL) {
count = 0;
while(*trap_receiver_list_ptr != 0 && count < SNMPCFG_MAX_TRAP_RECEIVERS) {
snmp.trap_receiver_list[count] = *trap_receiver_list_ptr;
trap_receiver_list_ptr++;
count++;
} /* Endwhile */
} /* Endif */
SNMP_set_data(&snmp);
RTCS_task_resume_creator(creator, RTCS_OK);
/* Send some traps -- but only if the application has added some traps receivers */
if (RTCS_count_trap_receivers_internal() != 0) {
SNMP_trap_select_community(snmp.community[0]);
time = RTCS_time_get();
if(time < 30) {
#ifdef SNMPCFG_SEND_V2_TRAPS
SNMPv2_trap_coldStart();
#else
SNMP_trap_coldStart();
#endif
} else {
#ifdef SNMPCFG_SEND_V2_TRAPS
SNMPv2_trap_warmStart();
#else
SNMP_trap_warmStart();
#endif
} /* Endif */
} /* Endif */
for (;;) {
addrlen = sizeof(addr);
inlen = recvfrom(sock, inbuf, SNMPCFG_BUFFER_SIZE, 0, &addr, &addrlen);
IF_SNMP_STATS_ENABLED(snmp.STATS.COMMON.ST_RX_TOTAL++);
snmp.inbuf = inbuf;
snmp.inlen = inlen;
snmp.outbuf = outbuf;
snmp.outlen = SNMPCFG_BUFFER_SIZE;
snmp.pdutype = 0; /* anything except ASN1_TYPE_PDU_SET */
snmp.errstat = SNMP_ERROR_noError;
snmp.errindex = 0;
if (SNMP_parse(&snmp, &outlen)) {
IF_SNMP_STATS_ENABLED(snmp.STATS.COMMON.ST_TX_TOTAL++);
IF_SNMP_STATS_ENABLED(snmp.STATS.ST_TX_RESPONSE++);
sendto(sock, snmp.outbuf, outlen, 0, &addr, addrlen);
} else if (snmp.errstat || snmp.pdutype == ASN1_TYPE_PDU_SET) {
if (snmp.errindex >= 0xFF) {
snmp.errstat = SNMP_ERROR_tooBig;
snmp.errindex = 0;
} /* Endif */
*snmp.errstatp = snmp.errstat;
*snmp.errindexp = snmp.errindex;
#if RTCSCFG_ENABLE_SNMP_STATS
snmp.STATS.COMMON.ST_TX_TOTAL++;
snmp.STATS.ST_TX_RESPONSE++;
switch (snmp.errstat) {
case SNMP_ERROR_noError: break;
case SNMP_ERROR_tooBig: snmp.STATS.ST_TX_TOOBIG++; break;
case SNMP_ERROR_noSuchName: snmp.STATS.ST_TX_NOSUCHNAME++; break;
case SNMP_ERROR_badValue: snmp.STATS.ST_TX_BADVALUE++; break;
case SNMP_ERROR_readOnly: snmp.STATS.ST_TX_READONLY++; break;
case SNMP_ERROR_genErr: snmp.STATS.ST_TX_GENERR++; break;
default: snmp.STATS.ST_TX_OTHER++; break;
} /* Endswitch */
#endif
sendto(sock, inbuf, inlen, 0, &addr, addrlen);
...
} /* Endbody */
----------------------------------------------------------------------------------------------------------------------------------------------------
int_32 SOCK_DGRAM_sendto
(
uint_32 sock,
/* [IN] socket handle */
pointer send_buffer,
/* [IN] data to transmit */
uint_32 buflen,
/* [IN] length of the buffer, in bytes */
uint_32 flags,
/* [IN] flags to underlying protocols */
sockaddr _PTR_ destaddr,
/* [IN] address to which to send data */
uint_16 addrlen
/* [IN] length of the address, in bytes */
)
{ /* Body */
...
error = RTCSCMD_issue(parms, UDP_send);
...
} /* Endbody */
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void UDP_send
(
UDP_PARM_PTR parms
)
{ /* Body */
...
udpbuffer = RTCS_mem_alloc_system(parms->udpword);
...
} /* Endbody */
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
The socket is not changing and the memory allocate and allocate till run out of memory.
How can I solve this?