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); } }
/* * The main function. */ static int main_wrapped(int argc, char **argv) { struct arguments args; int error; error = parse_args(argc, argv, &args); if (error) return error; switch (args.mode) { case MODE_POOL6: switch (args.op) { case OP_DISPLAY: return pool6_display(); case OP_COUNT: return pool6_count(); case OP_ADD: if (!args.db.pool6.prefix_set) { log_err("Please enter the prefix to be added (--prefix)."); return -EINVAL; } return pool6_add(&args.db.pool6.prefix); case OP_REMOVE: if (!args.db.pool6.prefix_set) { log_err("Please enter the prefix to be removed (--prefix)."); return -EINVAL; } return pool6_remove(&args.db.pool6.prefix, args.db.quick); case OP_FLUSH: return pool6_flush(args.db.quick); default: log_err("Unknown operation for IPv6 pool mode: %u.", args.op); return -EINVAL; } break; case MODE_POOL4: switch (args.op) { case OP_DISPLAY: return pool4_display(); case OP_COUNT: return pool4_count(); case OP_ADD: if (!args.db.pool4.addr_set) { log_err("Please enter the address to be added (--address)."); return -EINVAL; } return pool4_add(&args.db.pool4.addr); case OP_REMOVE: if (!args.db.pool4.addr_set) { log_err("Please enter the address to be removed (--address)."); return -EINVAL; } return pool4_remove(&args.db.pool4.addr, args.db.quick); case OP_FLUSH: return pool4_flush(args.db.quick); default: log_err("Unknown operation for IPv4 pool mode: %u.", args.op); return -EINVAL; } break; case MODE_BIB: switch (args.op) { case OP_DISPLAY: return bib_display(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp, args.db.tables.numeric_hostname, args.db.tables.csv_format); case OP_COUNT: return bib_count(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp); case OP_ADD: error = 0; if (!args.db.tables.bib.addr6_set) { log_err("Missing IPv6 address#port (--bib6)."); error = -EINVAL; } if (!args.db.tables.bib.addr4_set) { log_err("Missing IPv4 address#port (--bib4)."); error = -EINVAL; } if (error) return error; return bib_add(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp, &args.db.tables.bib.addr6, &args.db.tables.bib.addr4); case OP_REMOVE: if (!args.db.tables.bib.addr6_set && !args.db.tables.bib.addr4_set) { log_err("I need the IPv4 transport address and/or the IPv6 transport address of " "the entry you want to remove."); return -EINVAL; } return bib_remove(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp, args.db.tables.bib.addr6_set, &args.db.tables.bib.addr6, args.db.tables.bib.addr4_set, &args.db.tables.bib.addr4); default: log_err("Unknown operation for session mode: %u.", args.op); return -EINVAL; } break; case MODE_SESSION: switch (args.op) { case OP_DISPLAY: return session_display(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp, args.db.tables.numeric_hostname, args.db.tables.csv_format); case OP_COUNT: return session_count(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp); default: log_err("Unknown operation for session mode: %u.", args.op); return -EINVAL; } break; #ifdef BENCHMARK case MODE_LOGTIME: switch (args.op) { case OP_DISPLAY: return logtime_display(); break; default: log_err("Unknown operation for log time mode: %u.", args.op); break; } break; #endif case MODE_GENERAL: switch (args.op) { case OP_DISPLAY: return general_display(); case OP_UPDATE: error = general_update(args.general.module, args.general.type, args.general.size, args.general.data); free(args.general.data); return error; default: log_err("Unknown operation for general mode: %u.", args.op); return -EINVAL; } } log_err("Unknown configuration mode: %u", args.mode); return -EINVAL; }