static int handle_pool4_flush(struct nlmsghdr *nl_hdr, union request_pool4 *request) { int error; if (verify_superpriv()) return respond_error(nl_hdr, -EPERM); log_debug("Flushing the IPv4 pool..."); error = pool4db_flush(); /* * Well, pool4db_flush only errors on memory allocation failures, * so I guess clearing BIB and session even if pool4db_flush fails * is a good idea. */ if (xlat_is_nat64() && !request->flush.quick) { sessiondb_flush(); bibdb_flush(); } return respond_error(nl_hdr, error); }
static int handle_pool4_config(struct nlmsghdr *nl_hdr, struct request_hdr *nat64_hdr, union request_pool4 *request) { __u64 count; int error; switch (nat64_hdr->operation) { case OP_DISPLAY: return handle_pool4_display(nl_hdr, request); case OP_COUNT: log_debug("Returning IPv4 address count."); error = pool4_count(&count); if (error) return respond_error(nl_hdr, error); return respond_setcfg(nl_hdr, &count, sizeof(count)); case OP_ADD: if (verify_superpriv()) return respond_error(nl_hdr, -EPERM); log_debug("Adding an address to the IPv4 pool."); return respond_error(nl_hdr, pool4_add(&request->add.addrs)); case OP_REMOVE: if (verify_superpriv()) return respond_error(nl_hdr, -EPERM); log_debug("Removing an address from the IPv4 pool."); error = pool4_remove(&request->remove.addrs); if (error) return respond_error(nl_hdr, error); if (nat64_is_stateful() && !request->remove.quick) { error = sessiondb_delete_by_prefix4(&request->remove.addrs); if (error) return respond_error(nl_hdr, error); error = bibdb_delete_by_prefix4(&request->remove.addrs); } return respond_error(nl_hdr, error); case OP_FLUSH: if (verify_superpriv()) { return respond_error(nl_hdr, -EPERM); } log_debug("Flushing the IPv4 pool..."); error = pool4_flush(); if (error) return respond_error(nl_hdr, error); if (nat64_is_stateful() && !request->flush.quick) { error = sessiondb_flush(); if (error) return respond_error(nl_hdr, error); error = bibdb_flush(); } return respond_error(nl_hdr, error); default: log_err("Unknown operation: %d", nat64_hdr->operation); return respond_error(nl_hdr, -EINVAL); } }