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); } }