Hi All, I built the last version of the net-snmp-5.7.2.1 using the arm-linux-gcc compiler with the following flags: CC=arm-linux-gcc ./configure --target=arm-linux --host=arm-linux --build=x86 \. --program-prefix=/usr --prefix=/usr --exec-prefix=/usr --with-endianness=big \. --enable-privacy --enable-des --enable-md5 --without-rpm --enable-shared \ --with-cflags="-O2 -fsigned-char -I$WORKSPACE/Build/target/usr/include" \ --with-persistent-directory=/var/net-snmp --with-copy-persistent-files="no" \ --with-out-mib-modules="ucd_snmp notification notification-log-mib target utilities disman/event disman/schedule host" \. --sysconfdir=/conf --with-openssl=internal --disable-embedded-perl \. --disable-perl-cc-checks --with-perl-modules=no --with-sys-contact=root@localhost \ --disable-manuals --disable-scripts --disable-applications --disable-mibs --disable-mib-loading \ --disable-deprecated --enable-ipv6 --with-default-snmp-version="3" \. --with-sys-location="Unknown" --with-logfile=/var/log/snmpd.log --with-security-modules="usm tsm"
The cross-compiled net-snmp libraries I use in my sub-agent implementation. And it seems that the cache helper doesn't work in my case. Before I decided to use the net-snmp-5.7.2 I use the net-snmp-5.4.3 and everything works fine. My sub-agent uses the cache mechanism to update the particular MIB table before the GET/GETNEXT request comes. In my case the first calling of the cache load works fine but after the cache timeout expires the sub-agents crashes with segmentation fault and the snmpwalk command gets the message: "Error in packet. Reason: (genError) A general failure occured Failed object: iso.3.6.1.4.1.231.2.10.2.2.10.3.1." I analysed the core dump of my application with gdb and it shows, that sub-agent crashes in the _cache_load () when it tries to call the _cache_free(). Maybe somebody can help me and explain what is wrong? I have the following code: struct ManagementNodeTable_entry { long mnUnitId; long mnNodeNr; ... }; #define MANAGEMENTNODETABLE_TIMEOUT 10 initialize_table_ManagementNodeTable(void) { oid ManagementNodeTable_oid[] = { 1, 3, 6, 1, 4, 1, 231, 2, 10, 2, 2, 10, 3, 1 }; size_t ManagementNodeTable_oid_len = OID_LENGTH(ManagementNodeTable_oid); netsnmp_tdata *table_data = NULL; netsnmp_handler_registration *reg; netsnmp_table_registration_info *table_info; netsnmp_cache *cache; reg = netsnmp_create_handler_registration("ManagementNodeTable", ManagementNodeTable_handler, ManagementNodeTable_oid, ManagementNodeTable_oid_len, HANDLER_CAN_RONLY); table_data = netsnmp_tdata_create_table("ManagementNodeTable", 0); if (NULL == table_data) { snmp_log(LOG_ERR, "error creating tdata table for ManagementNodeTable\n"); return; } cache = netsnmp_cache_create(MANAGEMENTNODETABLE_TIMEOUT, ManagementNodeTable_load, ManagementNodeTable_free, ManagementNodeTable_oid, ManagementNodeTable_oid_len); if (NULL == cache) { snmp_log(LOG_ERR, "error creating cache for ManagementNodeTable\n"); return; } else { cache->magic = (void *) table_data; cache->flags |= (NETSNMP_CACHE_DONT_FREE_BEFORE_LOAD | NETSNMP_CACHE_DONT_FREE_EXPIRED | NETSNMP_CACHE_DONT_AUTO_RELEASE); } table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info); if (NULL == table_info) { snmp_log(LOG_ERR, "error creating table info for ManagementNodeTable\n"); return; } netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, /* index: mnUnitId */ ASN_INTEGER, /* index: mnNodeNr */ 0); table_info->min_column = COLUMN_MNUNITID; table_info->max_column = COLUMN_UNITNODECONTROLLERFWVERSION; netsnmp_tdata_register(reg, table_data, table_info); if (cache) { netsnmp_inject_handler (reg, netsnmp_cache_handler_get(cache) ); } } /** Create a new row in the table */ netsnmp_tdata_row * ManagementNodeTable_createEntry (netsnmp_tdata *table_data, struct ManagementNodeTable_entry *srcEntry) { struct ManagementNodeTable_entry *destEntry; netsnmp_tdata_row *row; destEntry = SNMP_MALLOC_TYPEDEF (struct ManagementNodeTable_entry); if (!destEntry) return NULL; row = netsnmp_tdata_create_row(); if (!row) { SNMP_FREE (destEntry); return NULL; } memcpy (destEntry, srcEntry, sizeof (struct ManagementNodeTable_entry)); row->data = destEntry; netsnmp_tdata_row_add_index (row, ASN_INTEGER, &(destEntry->mnUnitId), sizeof(destEntry->mnUnitId)); netsnmp_tdata_row_add_index (row, ASN_INTEGER, &(destEntry->mnNodeNr), sizeof(destEntry->mnNodeNr)); if (table_data) { netsnmp_tdata_add_row( table_data, row ); } return row; } /** Cache handling */ int ManagementNodeTable_load(netsnmp_cache * cache, void *vmagic) { netsnmp_tdata *table = (netsnmp_tdata *) cache->magic; struct ManagementNodeTable_entry mnNodeEntry; if (table != NULL) { netsnmp_tdata_row *row; // Call functions to fill the ManagementNodeTable_entry structure. // Update ManagementNodeTable table .... row = ManagementNodeTable_createEntry (table, &mnNodeEntry); } return 0; } void ManagementNodeTable_free(netsnmp_cache * cache, void *vmagic) { netsnmp_tdata *table = (netsnmp_tdata *) cache->magic; netsnmp_tdata_row *row; // remove all existing rows while ( netsnmp_tdata_row_count(table) > 0 ) { struct ManagementNodeTable_entry *entry; row = netsnmp_tdata_row_first( table ); entry = (struct ManagementNodeTable_entry *) row->data; SNMP_FREE(entry); netsnmp_tdata_remove_and_delete_row( table, row ); } } /** Handles requests for the ManagementNodeTable table */ int ManagementNodeTable_handler(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests) { netsnmp_request_info *request; netsnmp_table_request_info *table_info; struct ManagementNodeTable_entry *table_entry; DEBUGMSGTL(("ManagementNodeTable:handler", "Processing request (%d)\n", reqinfo->mode)); switch (reqinfo->mode) { /* Read-support (also covers GetNext requests) */ case MODE_GET: for (request = requests; request; request = request->next) { if (request->processed) continue; table_entry = (struct ManagementNodeTable_entry *) netsnmp_tdata_extract_entry(request); table_info = netsnmp_extract_table_info(request); switch (table_info->colnum) { case COLUMN_MNUNITID: if (!table_entry) { netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHINSTANCE); continue; } snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, table_entry->mnUnitId); break; case COLUMN_MNNODENR: if (!table_entry) { netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHINSTANCE); continue; } snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, table_entry->mnNodeNr); break; .... default: netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT); break; } } break; } return SNMP_ERR_NOERROR; } Thanks, Ekaterina ------------------------------------------------------------------------------ _______________________________________________ Net-snmp-coders mailing list Net-snmp-coders@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/net-snmp-coders