/* * Remove all entries from sctpAssocTable, which are not marked as valid. * All valid entries are then marked as invalid (to delete them in next cache * load, if the entry is not updated). */ void sctpAssocTable_delete_invalid(netsnmp_container *assocTable) { netsnmp_container *to_delete = netsnmp_container_find("lifo"); CONTAINER_FOR_EACH(assocTable, sctpAssocTable_collect_invalid, to_delete); while (CONTAINER_SIZE(to_delete)) { sctpAssocTable_entry *entry = CONTAINER_FIRST(to_delete); CONTAINER_REMOVE(assocTable, entry); sctpAssocTable_entry_free(entry); CONTAINER_REMOVE(to_delete, NULL); } CONTAINER_FREE(to_delete); }
int sctpAssocTable_add_or_update(netsnmp_container *assocTable, sctpAssocTable_entry * entry) { /* * we have full sctpAssocTable entry, update or add it in the container */ sctpAssocTable_entry *old; entry->valid = 1; /* * try to find it in the container */ sctpAssocTable_entry_update_index(entry); old = CONTAINER_FIND(assocTable, entry); if (old != NULL) { /* * update existing entry, don't overwrite the timestamp */ time_t timestamp = old->sctpAssocStartTime; if (timestamp == 0 && entry->sctpAssocStartTime == 0 && entry->sctpAssocState >= SCTPASSOCSTATE_ESTABLISHED) timestamp = netsnmp_get_agent_uptime(); /* set the timestamp if it was not set before and entry reaches the right state */ sctpAssocTable_entry_copy(entry, old); old->sctpAssocStartTime = timestamp; sctpAssocTable_entry_free(entry); } else { /* * the entry is new, add it there */ if (entry->sctpAssocStartTime == 0 && entry->sctpAssocState >= SCTPASSOCSTATE_ESTABLISHED) { entry->sctpAssocStartTime = netsnmp_get_agent_uptime(); } CONTAINER_INSERT(assocTable, entry); } return SNMP_ERR_NOERROR; }
static void sctpAssocTable_entry_clear(void *what, void *magic) { sctpAssocTable_entry_free(what); }
/** remove a row from the table */ static void sctpAssocTable_freeEntry_cb(sctpAssocTable_entry * entry, void *magic) { sctpAssocTable_entry_free(entry); }