int handle_pool4_config(struct xlator *jool, struct genl_info *info) { struct request_hdr *hdr = get_jool_hdr(info); union request_pool4 *request = (union request_pool4 *)(hdr + 1); int error; if (xlat_is_siit()) { log_err("SIIT doesn't have pool4."); return nlcore_respond(info, -EINVAL); } error = validate_request_size(info, sizeof(*request)); if (error) return nlcore_respond(info, error); switch (hdr->operation) { case OP_FOREACH: return handle_pool4_display(jool->nat64.pool4, info, request); case OP_ADD: return handle_pool4_add(jool->nat64.pool4, info, request); case OP_UPDATE: return handle_pool4_update(jool->nat64.pool4, info, request); case OP_REMOVE: return handle_pool4_rm(jool, info, request); case OP_FLUSH: return handle_pool4_flush(jool, info, request); } log_err("Unknown operation: %u", hdr->operation); return nlcore_respond(info, -EINVAL); }
static int handle_pool4_config(struct nlmsghdr *nl_hdr, struct request_hdr *jool_hdr, union request_pool4 *request) { struct response_pool4_count counters; if (xlat_is_siit()) { log_err("SIIT doesn't have pool4."); return -EINVAL; } switch (jool_hdr->operation) { case OP_DISPLAY: return handle_pool4_display(nl_hdr, request); case OP_COUNT: log_debug("Returning IPv4 pool counters."); pool4db_count(&counters.tables, &counters.samples, &counters.taddrs); return respond_setcfg(nl_hdr, &counters, sizeof(counters)); case OP_ADD: return handle_pool4_add(nl_hdr, request); case OP_REMOVE: return handle_pool4_rm(nl_hdr, request); case OP_FLUSH: return handle_pool4_flush(nl_hdr, request); default: log_err("Unknown operation: %d", jool_hdr->operation); return respond_error(nl_hdr, -EINVAL); } }
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); } }