Example #1
0
bool test_addr_4to6(struct in_addr *src, struct ipv6_prefix *prefix, struct in6_addr *expected)
{
	struct in6_addr actual;
	bool success = true;

	success &= assert_true(addr_4to6(src, prefix, &actual), "Append IPv4-result");
	success &= assert_equals_ipv6(expected, &actual, "Append IPv4-out.");

	return success;
}
Example #2
0
int rfc6052_4to6(struct pool6 *pool, struct in_addr *addr4,
		struct in6_addr *result)
{
	struct ipv6_prefix prefix;
	int error;

	error = pool6_peek(pool, &prefix);
	if (error)
		return error;

	return addr_4to6(addr4, &prefix, result);
}
static int create_session_ipv4(struct tuple *tuple4, struct bib_entry *bib,
		struct session_entry **session)
{
	struct ipv6_prefix prefix;
	struct in6_addr ipv6_src;
	struct tuple tuple6;
	int error;

	error = pool6_peek(&prefix);
	if (error)
		return error;

	error = addr_4to6(&tuple4->src.addr4.l3, &prefix, &ipv6_src);
	if (error) {
		log_debug("Error code %d while translating the packet's address.", error);
		return error;
	}

	/*
	 * Fortunately, ICMP errors cannot reach this code because of the requirements in the header
	 * of section 3.5, so we can use the tuple as shortcuts for the packet's fields.
	 */
	if (bib)
		tuple6.src.addr6 = bib->ipv6;
	else
		memset(&tuple6.src.addr6, 0, sizeof(tuple6.src.addr6));
	tuple6.dst.addr6.l3 = ipv6_src;
	tuple6.dst.addr6.l4 = tuple4->src.addr4.l4;

	*session = session_create(&tuple6.src.addr6, &tuple6.dst.addr6,
			&tuple4->dst.addr4, &tuple4->src.addr4, tuple4->l4_proto, bib);
	if (!(*session)) {
		log_debug("Failed to allocate a session entry.");
		return -ENOMEM;
	}

	apply_policies();

	return 0;
}