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; }
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; }
/** * 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; }