static int add_instance(void) { struct xlator jool; int error; if (no_instance) return 0; error = xlator_add(&jool); if (error) return error; jool.global->cfg.enabled = !disabled; error = pool6_add_str(jool.pool6, &pool6, pool6 ? 1 : 0); if (error) goto end; error = pool_add_str(jool.siit.blacklist, blacklist, blacklist_size); if (error) goto end; error = pool_add_str(jool.siit.pool6791, pool6791, pool6791_size); /* Fall through. */ end: xlator_put(&jool); return error; }
static int __handle_jool_message(struct genl_info *info) { struct xlator translator; bool client_is_jool; int error; log_debug("==============================================="); log_debug("Received a request from userspace."); error = validate_request(nla_data(info->attrs[ATTR_DATA]), nla_len(info->attrs[ATTR_DATA]), "userspace client", "kernel module", &client_is_jool); if (error) return client_is_jool ? nlcore_respond(info, error) : error; if (be16_to_cpu(get_jool_hdr(info)->mode) == MODE_INSTANCE) return handle_instance_request(info); error = xlator_find_current(&translator); if (error == -ESRCH) { log_err("This namespace lacks a Jool instance."); return nlcore_respond(info, -ESRCH); } if (error) { log_err("Unknown error %d; Jool instance not found.", error); return nlcore_respond(info, error); } error = multiplex_request(&translator, info); xlator_put(&translator); return error; }
static int init(void) { struct config_prefix6 pool6; struct pool4_entry_usr entry; int error; pool6.set = true; pool6.prefix.len = 96; error = str_to_addr6("3::", &pool6.prefix.addr); if (error) return error; error = xlator_add(FW_NETFILTER, INAME_DEFAULT, &pool6, &jool); if (error) return error; entry.mark = 0; entry.iterations = 0; entry.flags = ITERATIONS_SET | ITERATIONS_INFINITE; error = str_to_addr4("192.0.2.128", &entry.range.prefix.addr); if (error) goto fail; entry.range.prefix.len = 32; entry.range.ports.min = 1024; entry.range.ports.max = 1024; entry.proto = L4PROTO_TCP; error = pool4db_add(jool.nat64.pool4, &entry); if (error) goto fail; entry.proto = L4PROTO_UDP; error = pool4db_add(jool.nat64.pool4, &entry); if (error) goto fail; entry.proto = L4PROTO_ICMP; error = pool4db_add(jool.nat64.pool4, &entry); if (error) goto fail; return 0; fail: xlator_put(&jool); xlator_rm(INAME_DEFAULT); return error; }
static void clean(void) { icmp64_pop(); xlator_put(&jool); xlator_rm(INAME_DEFAULT); }