Example #1
0
int session_get(struct tuple *tuple, struct session_entry **result)
{
	struct ipv6_pair pair6;
	struct ipv4_pair pair4;

	if (!tuple) {
		log_err(ERR_NULL, "There's no session entry mapped to NULL.");
		return -EINVAL;
	}

	switch (tuple->l3_proto) {
	case L3PROTO_IPV6:
		tuple_to_ipv6_pair(tuple, &pair6);
		return session_get_by_ipv6(&pair6, tuple->l4_proto, result);
	case L3PROTO_IPV4:
		tuple_to_ipv4_pair(tuple, &pair4);
		return session_get_by_ipv4(&pair4, tuple->l4_proto, result);
	}

	log_crit(ERR_L3PROTO, "Unsupported network protocol: %u.", tuple->l3_proto);
	return -EINVAL;
}
Example #2
0
bool session_assert(l4_protocol l4_proto, struct session_entry **expected_sessions)
{
	int expected_count = 0;
	int actual_count = 0;

	if (is_error(session_for_each(l4_proto, count_sessions, &actual_count))) {
		log_warning("Could not count the session entries in the database for some reason.");
		return false;
	}

	while (expected_sessions[expected_count] != NULL) {
		struct session_entry *expected = expected_sessions[expected_count];
		struct session_entry *actual;
		int error;

		error = session_get_by_ipv6(&expected->ipv6, l4_proto, &actual);
		if (error) {
			log_warning("Error %d while trying to find session entry %d [%pI6c#%u, %pI6c#%u, "
					"%pI4#%u, %pI4#%u] in the DB.", error, expected_count,
					&expected->ipv6.remote.address, expected->ipv6.remote.l4_id,
					&expected->ipv6.local.address, expected->ipv6.local.l4_id,
					&expected->ipv4.local.address, expected->ipv4.local.l4_id,
					&expected->ipv4.remote.address, expected->ipv4.remote.l4_id);
			return false;
		}

		expected_count++;
	}

	if (expected_count != actual_count) {
		log_warning("Expected %d session entries in the database. Found %d.", expected_count,
				actual_count);
		return false;
	}

	return true;
}
Example #3
0
/**
 * Same as assert_bib(), except asserting session entries on the session table.
 */
bool assert_session(char* test_name, struct session_entry* session,
		bool udp_table_has_it, bool tcp_table_has_it, bool icmp_table_has_it)
{
	u_int8_t l4protocols[] = { IPPROTO_UDP, IPPROTO_TCP, IPPROTO_ICMP };
	bool table_has_it[] = { udp_table_has_it, tcp_table_has_it, icmp_table_has_it };
	int i;

	for (i = 0; i < 3; i++) {
		struct ipv4_pair pair_4 = { session->ipv4.remote, session->ipv4.local };
		struct ipv6_pair pair_6 = { session->ipv6.local, session->ipv6.remote };
		struct session_entry *expected_session = table_has_it[i] ? session : NULL;
		struct session_entry *retrieved_session;

		retrieved_session = session_get_by_ipv4(&pair_4, l4protocols[i]);
		if (!assert_session_entry_equals(expected_session, retrieved_session, test_name))
			return false;

		retrieved_session = session_get_by_ipv6(&pair_6, l4protocols[i]);
		if (!assert_session_entry_equals(expected_session, retrieved_session, test_name))
			return false;
	}

	return true;
}