Re: Traps/Informs
Martin Townsend <[email protected]>
| Newsgroups | gmane.network.net-snmp.user |
|---|---|
| Organization | Power Oasis |
| Message-ID | <[email protected]> |
Hi,
A couple more questions.
1) How to close transport and session down.
I used
if(mgr_p->session_p) {
SNMPD_LOG(LOG_INFO, SNMPD_LOG_GROUP_TRAP, "Closing session.");
snmp_sess_close(mgr_p->session_p);
}
if(mgr_p->transport_trap_server_p) {
SNMPD_LOG(LOG_INFO, SNMPD_LOG_GROUP_TRAP, "Closing transport
trap server.");
netsnmp_transport_free(mgr_p->transport_trap_server_p);
}
which seg faults on the netsnmp_transport_free. Looking through the
snmp_sess_close it does seem to close down the transport object, can
anybody confirm this or should I be using some other way of closing down.
2) dmalloc is reporting memory leaks which are in calls inet_ntoa.
Using gdb they relate to the following lines of netsnmp_udp_fmtaddr
sprintf(tmp, "UDP: [%s]:%hu->",
inet_ntoa(to->sin_addr), ntohs(to->sin_port));
sprintf(tmp + strlen(tmp), "[%s]",
inet_ntoa(addr_pair->local_addr));
Here's the stack trace
#0 0x402770a8 in inet_ntoa () from /lib/libc.so.6
#1 0x4007db38 in netsnmp_udp_fmtaddr (t=0x0, data=0xbea90a80, len=0)
at snmpUDPDomain.c:122
#2 0x4007ee3c in netsnmp_udp_transport (addr=0xbea90b54, local=1)
at snmpUDPDomain.c:616
#3 0x400809b0 in netsnmp_udp_create_tstring (str=0x0, local=1,
default_target=0x0) at snmpUDPDomain.c:1232
#4 0x4007d1dc in netsnmp_tdomain_transport_full (
application=0x1571c "sscd_snmpd", str=0x16640 "udp:162", local=1,
default_domain=0x0, default_target=0x0) at snmp_transport.c:443
#5 0x4007d9ac in netsnmp_transport_open_server (application=0x0,
str=0xbea90a80 "") at snmp_transport.c:502
#6 0x0000df04 in snmpd_trap_mgr_open () at sscd_snmpd_trap.c:358
#7 0x0000a9a4 in main (argc=2, argv=0xbea90d04) at sscd_snmpd.c:349
I've read somewhere that there is a problem with inet_ntoa and memory
leaks, is there a way of avoiding this call?
Cheers,
Martin.
On 22/07/2010 10:24, Gaurav Chaturvedi wrote:
> Hi Martin,
>
> Its good that you got the solution now.
>
> Following are the functions which can be used in your case as per the
> requirement:
>
> *print_objid*, *fprint_objid*, *snprint_objid
>
> Synatx:
>
> **void print_objid(const oid **/objid/*, size_t* /objidlen/*);
> void fprint_objid(FILE **/fp/*, const oid **/objid/*, size_t*
> /objidlen/*);
> int snprint_objid(char **/buf/*, size_t* /len/*, const oid **/objid/*,
> size_t* /objidlen/*);*
>
> Thanks
> Gaurav
>
> On Thu, Jul 22, 2010 at 2:18 PM, Martin Townsend
> <[email protected]
> <mailto:[email protected]>> wrote:
>
> On 21/07/2010 06:05, Gaurav Chaturvedi wrote:
>> Hi Martin,
>>
>> Please use the following code after your mentioned part of code.
>>
>> You need to call "snmp_sess_select_info", "select" and
>> "snmp_sess_read" after snmp_sess_read() function. These functions
>> help in reading the data from socket and call the callback function.
>>
>> Also, there is no issue in using localhost in snmptrap/snmpinform
>> commands.
>>
>> if (transport = netsnmp_tdomain_transport(port, 1, "udp")) {
>> ss = snmp_sess_add(&session, transport, NULL, NULL);
>> }
>>
>> while (1) {
>> numfds = 0;
>> FD_ZERO(&fdset);
>> block = 1; /* note: will be set by
>> snmp_sess_select_info */
>> tvp = &timeout;
>>
>> if (block) timerclear(tvp);
>>
>> snmp_sess_select_info(ss,&numfds, &fdset, tvp, &block);
>>
>> if (block == 1) {
>> tvp = NULL;
>> }
>>
>>
>> count = select(numfds, &fdset, 0, 0, tvp);
>>
>> if (count > 0) {
>> snmp_sess_read (ss,&fdset);
>> } else
>> ....
>> ....
>> } /* End of while */
>>
>> if (ss) {
>> snmp_sess_close(ss);
>> ss = NULL;
>> }
>>
>>
>> Thanks
>> Gaurav Chaturvedi
>>
>> On Tue, Jul 20, 2010 at 10:13 PM, Martin Townsend
>> <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>> Hi,
>>
>> I'm having problems processing traps in my management
>> application, After
>> looking through the snmptrapd code I've added calls to
>> netsnmp_transport_open_server(app_name, "udp:162");
>> and then initialise a session with
>> snmp_sess_init
>> with the following initialisation
>> session_p->peername = SNMP_DEFAULT_PEERNAME; /* Original
>> code had
>> NULL here */
>> session_p->version = SNMP_DEFAULT_VERSION;
>> session_p->community_len = SNMP_DEFAULT_COMMUNITY_LEN;
>> session_p->retries = SNMP_DEFAULT_RETRIES;
>> session_p->timeout = SNMP_DEFAULT_TIMEOUT;
>> session_p->callback = snmp_input;
>> session_p->callback_magic = (void *) transport_trap_server_p;
>> session_p->authenticator = NULL;
>> session_p->isAuthoritative = SNMP_SESS_UNKNOWNAUTH;
>>
>> which sets up the callback snmp_input.
>> then snmp_add to add the session to the opened transport server.
>>
>> In snmp_input I have a printf to make sure that the routine
>> is getting
>> called that will output the operation_id value.
>>
>> Then using snmptrap or snmpinform send the trap, e.g.
>> snmpinform -v2c -c public localhost ""
>> PO-RECTIFIER-TEST-MIB::alarmMajorHighBattVoltTrapPO
>> PO-RECTIFIER-TEST-M
>> IB::alarmMajorHighBattVoltPO.0 i 1
>> snmpinform: Timeout
>>
>> with no success.
>>
>> Is it ok to use snmpinform/trap with localhost and will the
>> code above
>> receive the trap PDU on localhost?
>> My application runs as a process that waits for commands to
>> arrive over
>> a socket so it will be blocked, would this cause problems?
>> Any other ideas/things to try out?
>>
>> Many Thanks in advance,
>> Martin.
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> This SF.net email is sponsored by Sprint
>> What will you do first with EVO, the first 4G phone?
>> Visit sprint.com/first <http://sprint.com/first> --
>> http://p.sf.net/sfu/sprint-com-first
>> _______________________________________________
>> Net-snmp-users mailing list
>> [email protected]
>> <mailto:[email protected]>
>> Please see the following page to unsubscribe or change other
>> options:
>> https://lists.sourceforge.net/lists/listinfo/net-snmp-users
>>
>>
>
> Thank you Gaurav, using the single session api I now have a
> separate pthread to handle the traps. Just in case anyone else
> tries this be warned that you must store the opaque session
> pointer returned from snmp_sess_add (or maybe pass it via the
> callback_magic field) as it is different to the one passed to the
> snmp_input callback routine of the session structure. In the
> snmp_input routine I was trying to use snmp_sess_send to send the
> INFORM reply message using the session pointer that was passed as
> an input parameter which caused a seg fault. After stepping
> through the code I could see that the opaque session pointer is
> acutally a struct session_list * as returned by snmp_sess_add_ex.
>
> PS does anyone know if there's a routine that takes an OID and
> returns the name/description from the MIB?
>
> Cheers,
> Martin.
>
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by Sprint
> What will you do first with EVO, the first 4G phone?
> Visit sprint.com/first <http://sprint.com/first> --
> http://p.sf.net/sfu/sprint-com-first
> _______________________________________________
> Net-snmp-users mailing list
> [email protected]
> <mailto:[email protected]>
> Please see the following page to unsubscribe or change other options:
> https://lists.sourceforge.net/lists/listinfo/net-snmp-users
>
>
--
Martin Townsend
PowerOasis
Suite 1, Unit 41
Shrivenham Hundred Business Park
Majors Road
Watchfield
Swindon
Wilts SN6 8TZ
Mobile 07884 444658
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Net-snmp-users mailing list
[email protected]
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users