int netsnmp_access_arp_container_arch_load(netsnmp_container *container) { int rc = 0, idx_offset = 0; rc = _load_v4(container, idx_offset); if(rc < 0) { u_int flags = NETSNMP_ACCESS_ARP_FREE_KEEP_CONTAINER; netsnmp_access_arp_container_free(container, flags); return rc; } #if defined (INET6) && 0 /* xx-rks: arp for v6? */ idx_offset = rc; rc = _load_v6(container, idx_offset); if(rc < 0) { u_int flags = NETSNMP_ACCESS_ARP_FREE_KEEP_CONTAINER; netsnmp_access_arp_container_free(container, flags); } #endif /* * return no errors (0) if we found any interfaces */ if(rc > 0) rc = 0; return rc; }
/** * @retval NULL error * @retval !NULL pointer to container */ netsnmp_container* netsnmp_access_arp_container_load(netsnmp_container* container, u_int load_flags) { int rc; DEBUGMSGTL(("access:arp:container", "load\n")); if (NULL == container) container = netsnmp_container_find("access:arp:table_container"); if (NULL == container) { snmp_log(LOG_ERR, "no container specified/found for access_arp\n"); return NULL; } rc = netsnmp_access_arp_container_arch_load(container, load_flags); if (0 != rc) { netsnmp_access_arp_container_free(container, NETSNMP_ACCESS_ARP_FREE_NOFLAGS); container = NULL; } return container; }
/** * load initial data * * TODO:350:M: Implement inetNetToMediaTable data load * This function will also be called by the cache helper to load * the container again (after the container free function has been * called to free the previous contents). * * @param container container to which items should be inserted * * @retval MFD_SUCCESS : success. * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source * @retval MFD_ERROR : other error. * * This function is called to load the index(es) (and data, optionally) * for the every row in the data set. * * @remark * While loading the data, the only important thing is the indexes. * If access to your data is cheap/fast (e.g. you have a pointer to a * structure in memory), it would make sense to update the data here. * If, however, the accessing the data invovles more work (e.g. parsing * some other existing data, or peforming calculations to derive the data), * then you can limit yourself to setting the indexes and saving any * information you will need later. Then use the saved information in * inetNetToMediaTable_row_prep() for populating data. * * @note * If you need consistency between rows (like you want statistics * for each row to be from the same time frame), you should set all * data here. * */ int inetNetToMediaTable_container_load(netsnmp_container *container) { netsnmp_container *arp_container; DEBUGMSGTL(("verbose:inetNetToMediaTable:inetNetToMediaTable_cache_load", "called\n")); /* * TODO:351:M: |-> Load/update data in the inetNetToMediaTable container. * loop over your inetNetToMediaTable data, allocate a rowreq context, * set the index(es) [and data, optionally] and insert into * the container. */ arp_container = netsnmp_access_arp_container_load(NULL, NETSNMP_ACCESS_ARP_LOAD_NOFLAGS); if (NULL == arp_container) return MFD_RESOURCE_UNAVAILABLE; /* msg already logged */ /* * we just got a fresh copy of data. snarf data */ CONTAINER_FOR_EACH(arp_container, (netsnmp_container_obj_func *) _snarf_arp_entry, container); /* * free the container. we've either claimed each entry, or released it, * so the access function doesn't need to clear the container. */ netsnmp_access_arp_container_free(arp_container, NETSNMP_ACCESS_ARP_FREE_DONT_CLEAR); DEBUGMSGT(("verbose:inetNetToMediaTable:inetNetToMediaTable_cache_load", "%d records\n", CONTAINER_SIZE(container))); return MFD_SUCCESS; } /* inetNetToMediaTable_container_load */