示例#1
0
static bool test_compare_addr4(void)
{
	struct bib_entry *bib;
	struct in_addr addr4;
	bool success = true;

	bib = bib_create_str("1::1", 1111, "1.1.1.1", 1111, L4PROTO_TCP);
	if (!bib)
		return false;

	if (str_to_addr4("2.2.2.2", &addr4) != 0)
		goto fail;
	success &= assert_true(compare_addr4(bib, &addr4) < 0, "< 0");
	if (str_to_addr4("1.1.1.1", &addr4) != 0)
		goto fail;
	success &= assert_true(compare_addr4(bib, &addr4) == 0, "= 0");
	if (str_to_addr4("0.0.0.0", &addr4) != 0)
		goto fail;
	success &= assert_true(compare_addr4(bib, &addr4) > 0, "> 0");

	bib_kfree(bib);
	return success;

fail:
	bib_kfree(bib);
	return false;
}
示例#2
0
static bool remove_entry(char *addr4, __u8 len4, char *addr6, __u8 len6,
		int expected_error)
{
	struct ipv4_prefix prefix4;
	struct ipv6_prefix prefix6;
	bool success;
	int error;

	log_debug("----------------");
	log_debug("Removing entry %s/%u %s/%u", addr6, len6, addr4, len4);

	if (!addr4 && !addr6) {
		log_err("Both addr4 and addr6 are NULL.");
		return false;
	}

	if (addr4) {
		if (is_error(str_to_addr4(addr4, &prefix4.address)))
			return false;
		prefix4.len = len4;
	}

	if (addr6) {
		if (is_error(str_to_addr6(addr6, &prefix6.address)))
			return false;
		prefix6.len = len6;
	}

	error = eamt_rm(addr6 ? &prefix6 : NULL, addr4 ? &prefix4 : NULL);
	success = ASSERT_INT(expected_error, error, "removing EAM entry");

	/* rtrie_print(eamt.tree6); */

	return success;
}
示例#3
0
static int __add_entry(char *addr4, __u8 len4, char *addr6, __u8 len6)
{
	struct ipv4_prefix prefix4;
	struct ipv6_prefix prefix6;
	int error;

	if (str_to_addr4(addr4, &prefix4.address))
		return false;
	prefix4.len = len4;

	if (str_to_addr6(addr6, &prefix6.address))
		return false;
	prefix6.len = len6;

	log_debug("\nInserting %s/%u | %s/%u", addr6, len6, addr4, len4);
	error = eamt_add(&prefix6, &prefix4, true);
	/*
	if (error) {
		log_err("Errcode %d; I'm not going to print the tree.", error);
	} else {
		rtrie_print(eamt.tree6);
	}
	*/

	return error;
}
示例#4
0
文件: str_utils.c 项目: NICMx/Jool
	/* Fall through */

end:
	free(str_copy);
	return error;
}

int str_to_addr4(const char *str, struct in_addr *result)
{
	if (!inet_pton(AF_INET, str, result)) {
		log_err("Cannot parse '%s' as an IPv4 address.", str);
		return -EINVAL;
	}
	return 0;
}

int str_to_addr6(const char *str, struct in6_addr *result)
{
	if (!inet_pton(AF_INET6, str, result)) {
		log_err("Cannot parse '%s' as an IPv6 address.", str);
		return -EINVAL;
	}
	return 0;
}

#undef STR_MAX_LEN
#define STR_MAX_LEN (INET_ADDRSTRLEN + 1 + 5) /* [addr + null chara] + # + port */
int str_to_addr4_port(const char *str, struct ipv4_transport_addr *addr_out)
{
	const char *FORMAT = "<IPv4 address>#<port> (eg. 203.0.113.8#80)";
	/* strtok corrupts the string, so we'll be using this copy instead. */
	char str_copy[STR_MAX_LEN];
	char *token;
	int error;

	if (strlen(str) + 1 > STR_MAX_LEN) {
		log_err("'%s' is too long for this poor, limited parser...", str);
		return -EINVAL;
	}
	strcpy(str_copy, str);

	token = strtok(str_copy, "#");
	if (!token) {
		log_err("Cannot parse '%s' as a %s.", str, FORMAT);
		return -EINVAL;
	}

	error = str_to_addr4(token, &addr_out->l3);
	if (error)
		return error;

	token = strtok(NULL, "#");
	if (!token) {
		log_err("'%s' does not seem to contain a port (format: %s).", str, FORMAT);
		return -EINVAL;
	}
	return str_to_u16(token, &addr_out->l4, 0, MAX_PORT); /* Error msg already printed. */
}
示例#5
0
static bool init(void)
{
	char *pool4_addrs[] = { "1.1.1.1", "2.2.2.2" };
	int i;

	for (i = 0; i < ARRAY_SIZE(IPV4_ADDRS); i++) {
		if (is_error(str_to_addr4(IPV4_ADDRS[i], &addr4[i].l3)))
			return false;
		addr4[i].l4 = IPV4_PORTS[i];
	}

	for (i = 0; i < ARRAY_SIZE(IPV4_ADDRS); i++) {
		if (is_error(str_to_addr6(IPV6_ADDRS[i], &addr6[i].l3)))
			return false;
		addr6[i].l4 = IPV6_PORTS[i];
	}

	if (is_error(config_init(false)))
		return false;

	if (is_error(pool4_init(pool4_addrs, ARRAY_SIZE(pool4_addrs)))) {
		config_destroy();
		return false;
	}

	if (is_error(bibdb_init())) {
		pool4_destroy();
		config_destroy();
		return false;
	}

	return true;
}
示例#6
0
文件: str_utils.c 项目: NICMx/Jool
	/* strtok corrupts the string, so we'll be using this copy instead. */
	char str_copy[STR_MAX_LEN];
	char *token;
	int error;

	if (strlen(str) + 1 > STR_MAX_LEN) {
		log_err("'%s' is too long for this poor, limited parser...", str);
		return -EINVAL;
	}
	strcpy(str_copy, str);

	token = strtok(str_copy, "#");
	if (!token) {
		log_err("Cannot parse '%s' as a %s.", str, FORMAT);
		return -EINVAL;
	}

	error = str_to_addr6(token, &addr_out->l3);
	if (error)
		return error;

	token = strtok(NULL, "#");
	if (!token) {
		log_err("'%s' does not seem to contain a port (format: %s).", str, FORMAT);
		return -EINVAL;
	}
	return str_to_u16(token, &addr_out->l4, 0, MAX_PORT); /* Error msg already printed. */
}

#undef STR_MAX_LEN
#define STR_MAX_LEN (INET_ADDRSTRLEN + 1 + 2) /* [addr + null chara] + / + mask */
int str_to_prefix4(const char *str, struct ipv4_prefix *prefix_out)
{
	const char *FORMAT = "<IPv4 address>[/<mask>] (eg. 192.0.2.0/24)";
	/* strtok corrupts the string, so we'll be using this copy instead. */
	char str_copy[STR_MAX_LEN];
	char *token;
	int error;

	if (strlen(str) + 1 > STR_MAX_LEN) {
		log_err("'%s' is too long for this poor, limited parser...", str);
		return -EINVAL;
	}
	strcpy(str_copy, str);

	token = strtok(str_copy, "/");
	if (!token) {
		log_err("Cannot parse '%s' as a %s.", str, FORMAT);
		return -EINVAL;
	}

	error = str_to_addr4(token, &prefix_out->addr);
	if (error)
		return error;

	token = strtok(NULL, "/");
	if (!token) {
		prefix_out->len = IPV4_MAX_PREFIX;
		return 0;
	}
	return str_to_u8(token, &prefix_out->len, 0, 32); /* Error msg already printed. */
}
示例#7
0
bool test_append_ipv4(char* expected_as_string, char* prefix_as_string, int prefix_len)
{
    char ipv4_as_string[INET_ADDRSTRLEN] = "192.0.2.33";
    struct in_addr ipv4;
    struct in6_addr prefix, actual, expected;

    if (!str_to_addr4(ipv4_as_string, &ipv4)) {
        log_warning("Can't parse IPv4 address '%s'. Failing test.", ipv4_as_string);
        return false;
    }
    if (!str_to_addr6(prefix_as_string, &prefix)) {
        log_warning("Can't parse prefix '%s'. Failing test.", prefix_as_string);
        return false;
    }
    if (!str_to_addr6(expected_as_string, &expected)) {
        log_warning("Can't parse expected address '%s'. Failing test.", expected_as_string);
        return false;
    }

    actual = nat64_append_ipv4(&prefix, &ipv4, prefix_len);

    if (!ipv6_addr_equals(&expected, &actual)) {
        log_warning("Test failed: %s Expected: %pI6c. Actual: %pI6c.",
                    "Append IPv4.", &expected, &actual);
        return false;
    }

    return true;
}
示例#8
0
bool init(void)
{
	int error;
	int i;

	for (i = 0; i < ARRAY_SIZE(IPV4_ADDRS); i++) {
		error = str_to_addr4(IPV4_ADDRS[i], &addr4[i].address);
		if (error)
			return false;
		addr4[i].l4_id = IPV4_PORTS[i];
	}

	for (i = 0; i < ARRAY_SIZE(IPV4_ADDRS); i++) {
		error = str_to_addr6(IPV6_ADDRS[i], &addr6[i].address);
		if (error)
			return false;
		addr6[i].l4_id = IPV6_PORTS[i];
	}

	error = bib_init();
	if (error)
		return false;

	error = session_init(session_always_dies);
	if (error) {
		bib_destroy();
		return false;
	}

	return true;
}
示例#9
0
static bool init(void)
{
	int i;

	if (!str_to_addr4(ipv4_addr_str, &ipv4_addr)) {
		log_warning("Could not convert '%s' to a IPv4 address. Failing...", ipv4_addr_str);
		return false;
	}

	for (i = 0; i < 6; i++) {
		if (!str_to_addr6(ipv6_addr_str[i], &ipv6_addr[i])) {
			log_warning("Could not convert '%s' to a IPv6 address. Failing...", ipv6_addr_str[i]);
			return false;
		}
	}

	for (i = 0; i < 6; i++) {
		if (!str_to_addr6(prefixes_str[i], &prefixes[i].address)) {
			log_warning("Could not convert '%s' to a IPv6 address. Failing...", prefixes_str[i]);
			return false;
		}
		prefixes[i].len = prefixes_mask[i];
	}

	return true;
}
示例#10
0
bool str_to_addr4_port(const char *str, struct ipv4_tuple_address *addr_out)
{
	const char *FORMAT = "<IPv4 address>#<port> (eg. 10.20.30.40#50)";
	const int STR_MAX_LEN = INET_ADDRSTRLEN + 1 + 5; // [addr + null chara] + # + port
	char str_copy[STR_MAX_LEN]; // strtok corrupts the string, so we'll be using this copy instead.
	char *token;

	if (strlen(str) + 1 > STR_MAX_LEN) {
		printf("Error: '%s' is too long for this poor, limited parser...\n", str);
		return false;
	}
	strcpy(str_copy, str);

	token = strtok(str_copy, "#");
	if (!token || !str_to_addr4(token, &addr_out->address)) {
		printf("Error: Cannot parse '%s' as a %s.\n", str, FORMAT);
		return false;
	}

	token = strtok(NULL, "#");
	if (!token) {
		printf("Error: '%s' does not seem to contain a port (format: %s).\n", str, FORMAT);
		return false;
	}
	if (!str_to_u16(token, &addr_out->l4_id, 0, MAX_PORT))
		return false; // Error msg already printed.

	return true;
}
/**
 * Prepares the environment for the tests.
 *
 * @return whether the initialization was successful or not. An error message has been printed to
 *		the kernel ring buffer.
 */
static bool init(void)
{
	u_int8_t protocols[] = { IPPROTO_UDP, IPPROTO_TCP, IPPROTO_ICMP };
	int i;
	struct ipv6_prefix prefix;

	// Init test addresses
	if (str_to_addr6(remote_ipv6_str, &remote_ipv6) != 0) {
		log_warning("Can't parse address '%s'. Failing test...", remote_ipv6_str);
		return false;
	}
	if (str_to_addr6(local_ipv6_str, &local_ipv6) != 0) {
		log_warning("Can't parse address '%s'. Failing test...", local_ipv6_str);
		return false;
	}
	if (str_to_addr4(local_ipv4_str, &local_ipv4) != 0) {
		log_warning("Can't parse address '%s'. Failing test...", local_ipv4_str);
		return false;
	}
	if (str_to_addr4(remote_ipv4_str, &remote_ipv4) != 0) {
		log_warning("Can't parse address '%s'. Failing test...", remote_ipv4_str);
		return false;
	}

	// Init the IPv6 pool module
	if (!pool6_init())
		return false;
	if (str_to_addr6("64:ff9b::", &prefix.address) != 0) {
		log_warning("Cannot parse the IPv6 prefix. Failing...");
		return false;
	}
	prefix.len = 96;
	if (pool6_register(&prefix) != 0) {
		log_warning("Could not add the IPv6 prefix. Failing...");
		return false;
	}

	// Init the BIB module
	if (!bib_init())
		return false;

	for (i = 0; i < ARRAY_SIZE(protocols); i++)
		if (!add_bib(&local_ipv4, 80, &remote_ipv6, 1500, protocols[i]))
			return false;

	return true;
}
示例#12
0
struct ipv4_tuple_address create_tuple_addr_4(int index)
{
	struct ipv4_tuple_address result;
	if (!str_to_addr4(IPV4_ADDRS[index], &result.address))
		log_warning("Can't convert '%s' to a in_addr. Test is going to fail.", IPV4_ADDRS[index]);
	result.l4_id = IPV4_PORTS[index];
	return result;
}
bool str_to_addr4_verbose(const char *str, struct in_addr *addr)
{
	if (str_to_addr4(str, addr) != 0)
	{
		log_warning("Cannot parse '%s' as a valid IPv4 address", str);
		return false;
	}
	return true;
}
示例#14
0
/**
 * Prepares the environment for the tests.
 *
 * @return whether the initialization was successful or not. An error message has been printed to
 *		the kernel ring buffer.
 */
static bool init(void)
{
	l4_protocol l4_protos[] = { L4PROTO_UDP, L4PROTO_TCP, L4PROTO_ICMP };
	int i;
	struct ipv6_prefix prefix;

	/* Init test addresses */
	if (str_to_addr6(remote_ipv6_str, &remote_ipv6) != 0) {
		log_warning("Can't parse address '%s'. Failing test...", remote_ipv6_str);
		return false;
	}
	if (str_to_addr6(local_ipv6_str, &local_ipv6) != 0) {
		log_warning("Can't parse address '%s'. Failing test...", local_ipv6_str);
		return false;
	}
	if (str_to_addr4(local_ipv4_str, &local_ipv4) != 0) {
		log_warning("Can't parse address '%s'. Failing test...", local_ipv4_str);
		return false;
	}
	if (str_to_addr4(remote_ipv4_str, &remote_ipv4) != 0) {
		log_warning("Can't parse address '%s'. Failing test...", remote_ipv4_str);
		return false;
	}

	/* Init the IPv6 pool module */
	if (is_error(pool6_init(NULL, 0))) /* we'll use the defaults. */
		return false;
	if (str_to_addr6("64:ff9b::", &prefix.address) != 0) {
		log_warning("Cannot parse the IPv6 prefix. Failing...");
		return false;
	}
	prefix.len = 96;

	/* Init the BIB module */
	if (is_error(bib_init()))
		return false;

	for (i = 0; i < ARRAY_SIZE(l4_protos); i++)
		if (!add_bib(&local_ipv4, 80, &remote_ipv6, 1500, l4_protos[i]))
			return false;

	return true;
}
示例#15
0
文件: types.c 项目: magg/NAT64
int init_ipv4_tuple(struct tuple *tuple4, unsigned char *src_addr, u16 src_port,
		unsigned char *dst_addr, u16 dst_port, l4_protocol l4_proto)
{
	int error;

	error = str_to_addr4(src_addr, &tuple4->src.addr4.l3);
	if (error)
		return error;
	tuple4->src.addr4.l4 = src_port;

	error = str_to_addr4(dst_addr, &tuple4->dst.addr4.l3);
	if (error)
		return error;
	tuple4->dst.addr4.l4 = (l4_proto != L4PROTO_ICMP) ? dst_port : src_port;

	tuple4->l3_proto = L3PROTO_IPV4;
	tuple4->l4_proto = l4_proto;

	return 0;
}
示例#16
0
bool test_address_filtering_aux(int src_addr_id, int src_port_id, int dst_addr_id, int dst_port_id,
		bool expected)
{
	struct nf_conntrack_tuple tuple;

	if (!str_to_addr4(IPV4_ADDRS[src_addr_id], &tuple.ipv4_src_addr)) {
		log_warning("Can't parse the '%s' source address. Failing test.", IPV4_ADDRS[src_addr_id]);
		return false;
	}
	if (!str_to_addr4(IPV4_ADDRS[dst_addr_id], &tuple.ipv4_dst_addr)) {
		log_warning("Can't parse the '%s' dest address. Failing test.", IPV4_ADDRS[dst_addr_id]);
		return false;
	}
	tuple.src_port = cpu_to_be16(IPV4_PORTS[src_port_id]);
	tuple.dst_port = cpu_to_be16(IPV4_PORTS[dst_port_id]);
	tuple.L4_PROTOCOL = IPPROTO_UDP;
	tuple.L3_PROTOCOL = NFPROTO_IPV4;

	return (expected == session_allow(&tuple));
}
示例#17
0
文件: packet_test.c 项目: magg/NAT64
int init_module(void)
{
	START_TESTS("Packet");
	if (str_to_addr6("1::1", &dummies6[0]) != 0)
		return -EINVAL;
	if (str_to_addr6("2::2", &dummies6[1]) != 0)
		return -EINVAL;
	if (str_to_addr4("1.1.1.1", &dummies4[0]) != 0)
		return -EINVAL;
	if (str_to_addr4("2.2.2.2", &dummies4[1]) != 0)
		return -EINVAL;

	CALL_TEST(test_function_is_dont_fragment_set(), "Dont fragment getter");
	CALL_TEST(test_function_is_more_fragments_set(), "More fragments getter");
	CALL_TEST(test_function_build_ipv4_frag_off_field(), "Generate frag offset + flags function");

	CALL_TEST(test_inner_packet_validation4(), "Inner packet IPv4 Validation");
	CALL_TEST(test_inner_packet_validation6(), "Inner packet IPv6 Validation");

	END_TESTS;
}
示例#18
0
文件: unit_test.c 项目: NICMx/Jool
bool ASSERT_ADDR4(char const *expected_str, struct in_addr const *actual,
		char const *test_name)
{
	struct in_addr expected;

	if (!expected_str)
		return __ASSERT_ADDR4(NULL, actual, test_name);

	return str_to_addr4(expected_str, &expected)
			? false
			: __ASSERT_ADDR4(&expected, actual, test_name);
}
示例#19
0
static bool assert_session_exists(char *src6_addr, u16 src6_port,
		char *dst6_addr, u16 dst6_port,
		char *src4_addr, u16 src4_port,
		char *dst4_addr, u16 dst4_port,
		l4_protocol proto, u_int8_t state,
		session_timer_type timer_type, unsigned long timeout)
{
	struct session_entry expected;
	int result;

	if (str_to_addr6(src6_addr, &expected.src6.l3))
		return false;
	if (str_to_addr6(dst6_addr, &expected.dst6.l3))
		return false;
	if (str_to_addr4(src4_addr, &expected.src4.l3))
		return false;
	if (str_to_addr4(dst4_addr, &expected.dst4.l3))
		return false;
	expected.src6.l4 = src6_port;
	expected.dst6.l4 = dst6_port;
	expected.src4.l4 = src4_port;
	expected.dst4.l4 = dst4_port;
	expected.proto = proto;
	expected.state = state;
	expected.timer_type = timer_type;
	expected.update_time = 0;
	expected.timeout = msecs_to_jiffies(timeout * 1000);
	expected.has_stored = false;

	result = session_exists(&expected);
	if (result > 0)
		return true;
	else if (result < 0)
		return false;
	return ASSERT_BOOL(1, 0, "session search");
}
示例#20
0
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;
}
示例#21
0
文件: netsocket.c 项目: NICMx/Jool
static int mcast4opt_set_out_interface(struct netsocket_config *cfg)
{
	struct in_addr addr;

	if (!cfg->out_interface)
		return 0;

	if (str_to_addr4(cfg->out_interface, &addr))
		return 1;

	if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr))) {
		log_perror("-> setsockopt(IP_MULTICAST_IF) failed", errno);
		return 1;
	}

	log_info("-> The outgoing interface was overriden.");
	return 0;
}
示例#22
0
static bool init(void)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(IPV4_ADDRS); i++) {
		if (is_error(str_to_addr4(IPV4_ADDRS[i], &addr4[i].l3)))
			return false;
		addr4[i].l4 = IPV4_PORTS[i];
	}

	for (i = 0; i < ARRAY_SIZE(IPV4_ADDRS); i++) {
		if (is_error(str_to_addr6(IPV6_ADDRS[i], &addr6[i].l3)))
			return false;
		addr6[i].l4 = IPV6_PORTS[i];
	}

	if (is_error(config_init(false)))
		goto config_fail;
	if (is_error(pktqueue_init()))
		goto pktqueue_fail;
	if (is_error(pool4_init(NULL, 0)))
		goto pool4_fail;
	if (is_error(pool6_init(NULL, 0)))
		goto pool6_fail;
	if (is_error(bibdb_init()))
		goto bib_fail;
	if (is_error(sessiondb_init()))
		goto session_fail;

	return true;

session_fail:
	bibdb_destroy();
bib_fail:
	pool6_destroy();
pool6_fail:
	pool4_destroy();
pool4_fail:
	pktqueue_destroy();
pktqueue_fail:
	config_destroy();
config_fail:
	return false;
}
示例#23
0
static bool test_4to6(char *addr4_str, char *addr6_str)
{
	struct in_addr addr4;
	struct in6_addr addr6;
	bool success = true;

	log_debug("Testing %s -> %s...", addr4_str, addr6_str);

	if (str_to_addr4(addr4_str, &addr4))
		return false;

	if (addr6_str) {
		success &= ASSERT_INT(0, eamt_xlat_4to6(&addr4, &addr6), "errcode");
		success &= ASSERT_ADDR6(addr6_str, &addr6, "resulting address");
	} else {
		success &= ASSERT_INT(-ESRCH, eamt_xlat_4to6(&addr4, &addr6), "errcode");
	}

	return success;
}
示例#24
0
文件: netsocket.c 项目: NICMx/Jool
static int mcast4opt_add_membership(struct netsocket_config *cfg)
{
	struct ip_mreq mreq;

	mreq.imr_multiaddr = *get_addr4(bound_address);
	if (cfg->in_interface) {
		if (str_to_addr4(cfg->in_interface, &mreq.imr_interface))
			return 1;
	} else {
		mreq.imr_interface.s_addr = htonl(INADDR_ANY);
	}

	if (setsockopt(sk, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
			sizeof(mreq))) {
		log_perror("-> setsockopt(IP_ADD_MEMBERSHIP) failed", errno);
		return 1;
	}

	log_info("-> We're now registered to the multicast group.");
	return 0;
}
示例#25
0
bool test_extract_ipv4(char* ipv6_as_string, int prefix_len)
{
    const char expected_as_string[INET_ADDRSTRLEN] = "192.0.2.33";
    struct in_addr expected;
    struct in_addr actual;
    struct in6_addr ipv6;

    if (!str_to_addr4(expected_as_string, &expected)) {
        log_warning("Can't parse expected IPv4 address '%s'. Failing test.", expected_as_string);
        return false;
    }
    if (!str_to_addr6(ipv6_as_string, &ipv6)) {
        log_warning("Can't parse IPv6 address being tested '%s'. Failing test.", ipv6_as_string);
        return false;
    }

    actual = nat64_extract_ipv4(&ipv6, prefix_len);
    ASSERT_EQUALS_IPV4(expected, actual, "Extract IPv4.")

    return true;
}
示例#26
0
static bool init(void)
{
    int addr_ctr, port_ctr;

    for (addr_ctr = 0; addr_ctr < ARRAY_SIZE(expected_ips); addr_ctr++) {
        if (str_to_addr4(expected_ips_as_str[addr_ctr], &expected_ips[addr_ctr]) != 0) {
            log_warning("Cannot parse test address '%s'. Failing.", expected_ips_as_str[addr_ctr]);
            return false;
        }
    }

    if (pool4_init(expected_ips_as_str, ARRAY_SIZE(expected_ips_as_str)) != 0) {
        log_warning("Could not init the pool. Failing...");
        return false;
    }

    for (addr_ctr = 0; addr_ctr < ARRAY_SIZE(expected_ips); addr_ctr++)
        for (port_ctr = 0; port_ctr < ID_COUNT; port_ctr++)
            ports[addr_ctr][port_ctr] = false;

    return true;
}
示例#27
0
/** Convert the network mask in CIDR format ('/n') to address format.
 *
 * @param[in] 	af		Address Family: AF_INET[6].
 * @param[in] 	bits	Network mask bits, integer value from: /n.
 * @param[out] 	net		Network mask in address format.
 * @return		true if OK, otherwise false.
 */
int convert_bits_to_netmask(int af, unsigned char bits, void *net)
{
	unsigned char ii = 0;

	switch(af)
	{
		case AF_INET:
			str_to_addr4("0.0.0.0", net);
			(*(struct in_addr *)net).s_addr = \
				BROADCAST_ADDR >>(IPV4_NETMASK_BITS_MAX - bits);
			break;
		case AF_INET6:
			str_to_addr6("::0", net);

			for (ii = 0; ii < IPV6_SIZE_UINT32; ii++)
			{
				if (bits <= ii * IPV6_SIZE_UINT32_BITS )
				{
					if (bits == ii * IPV6_SIZE_UINT32_BITS )
						(*(struct in6_addr *)net).s6_addr32[ii] = \
							DONT_CARE;
					else
						(*(struct in6_addr *)net).s6_addr32[ii] = \
							htonl( BROADCAST_ADDR <<(IPV6_NETMASK_BITS_MAX - bits ) );
				}
				else
				{
					(*(struct in6_addr *)net).s6_addr32[ii] = BROADCAST_ADDR;
				}
			}
			break;
		default:
			/* log_warning("%s. Error, bad address family.", "convert_bits_to_netmask"); */
			return false;
	}

	return true;
}
示例#28
0
int str_to_addr4_port(const char *str, struct ipv4_tuple_address *addr_out)
{
	const char *FORMAT = "<IPv4 address>#<port> (eg. 10.20.30.40#50)";
	/* [addr + null chara] + # + port */
	const unsigned int STR_MAX_LEN = INET_ADDRSTRLEN + 1 + 5;
	/* strtok corrupts the string, so we'll be using this copy instead. */
	char str_copy[STR_MAX_LEN];
	char *token;
	int error;

	if (strlen(str) + 1 > STR_MAX_LEN) {
		log_err(ERR_PARSE_ADDR4_PORT, "'%s' is too long for this poor, limited parser...", str);
		return -EINVAL;
	}
	strcpy(str_copy, str);

	token = strtok(str_copy, "#");
	if (!token) {
		log_err(ERR_PARSE_ADDR4_PORT, "Cannot parse '%s' as a %s.", str, FORMAT);
		return -EINVAL;
	}

	error = str_to_addr4(token, &addr_out->address);
	if (error)
		return error;

	token = strtok(NULL, "#");
	if (!token) {
		log_err(ERR_PARSE_ADDR4_PORT, "'%s' does not seem to contain a port (format: %s).", str,
				FORMAT);
		return -EINVAL;
	}
	error = str_to_u16(token, &addr_out->l4_id, 0, MAX_PORT);
	if (error)
		return error; /* Error msg already printed. */

	return 0;
}
示例#29
0
文件: session_test.c 项目: magg/NAT64
static bool init(void)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(IPV4_ADDRS); i++) {
		if (is_error(str_to_addr4(IPV4_ADDRS[i], &addr4[i].l3)))
			return false;
		addr4[i].l4 = IPV4_PORTS[i];
	}

	for (i = 0; i < ARRAY_SIZE(IPV4_ADDRS); i++) {
		if (is_error(str_to_addr6(IPV6_ADDRS[i], &addr6[i].l3)))
			return false;
		addr6[i].l4 = IPV6_PORTS[i];
	}

	if (is_error(sessiondb_init()))
		return false;
	if (is_error(pktqueue_init()))
		return false;

	return true;
}
示例#30
0
static bool init(void)
{
	int i;

	if (!pool4_init(false)) {
		log_warning("Could not init the pool. Failing...");
		return false;
	}

	for (i = 0; i < ARRAY_SIZE(expected_ips); i++) {
		if (str_to_addr4(expected_ips_as_str[i], &expected_ips[i]) != 0) {
			log_warning("Cannot parse test address '%s'. Failing.", expected_ips_as_str[i]);
			return false;
		}

		if (pool4_register(&expected_ips[i]) != 0) {
			log_warning("Could not register address %pI4. Failing...", &expected_ips[i]);
			return false;
		}
	}

	return true;
}