void npf_config_fini(void) { npf_conndb_t *cd = npf_conndb_create(); /* Flush the connections. */ mutex_enter(&npf_config_lock); npf_conn_tracking(false); pserialize_perform(npf_config_psz); npf_conn_load(cd, false); npf_ifmap_flush(); mutex_exit(&npf_config_lock); npf_config_destroy(npf_config); pserialize_destroy(npf_config_psz); mutex_destroy(&npf_config_lock); }
/* * npf_mk_connlist: import a list of connections and load them. */ static int __noinline npf_mk_connlist(prop_array_t conlist, npf_ruleset_t *natlist, npf_conndb_t **conndb, prop_dictionary_t errdict) { prop_dictionary_t condict; prop_object_iterator_t it; npf_conndb_t *cd; int error = 0; /* Connection list - array */ if (prop_object_type(conlist) != PROP_TYPE_ARRAY) { NPF_ERR_DEBUG(errdict); return EINVAL; } /* Create a connection database. */ cd = npf_conndb_create(); it = prop_array_iterator(conlist); while ((condict = prop_object_iterator_next(it)) != NULL) { /* Connection - dictionary. */ if (prop_object_type(condict) != PROP_TYPE_DICTIONARY) { NPF_ERR_DEBUG(errdict); error = EINVAL; break; } /* Construct and insert the connection. */ error = npf_conn_import(cd, condict, natlist); if (error) { NPF_ERR_DEBUG(errdict); break; } } prop_object_iterator_release(it); if (error) { npf_conn_gc(cd, true, false); npf_conndb_destroy(cd); } else { *conndb = cd; } return error; }