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