bool test_address_filtering(void) { struct bib_entry *bib; struct session_entry *session; bool success = true; /* Init. */ bib = create_and_insert_bib(0, 0, IPPROTO_UDP); if (!bib) return false; session = create_and_insert_session(0, 0, 0, 0, bib, IPPROTO_UDP, 12345); if (!session) return false; /* Test the packet is allowed when the tuple and session match perfectly. */ success &= assert_true(test_address_filtering_aux(0, 0, 0, 0), ""); /* Test a tuple that completely mismatches the session. */ success &= assert_false(test_address_filtering_aux(1, 1, 1, 1), ""); /* Now test tuples that nearly match the session. */ success &= assert_false(test_address_filtering_aux(0, 0, 0, 1), ""); success &= assert_false(test_address_filtering_aux(0, 0, 1, 0), ""); /* The remote port is the only one that doesn't matter. */ success &= assert_true(test_address_filtering_aux(0, 1, 0, 0), ""); success &= assert_false(test_address_filtering_aux(1, 0, 0, 0), ""); return true; }
static bool test_address_filtering(void) { struct session_entry *session; bool success = true; /* Init. */ session = create_and_insert_session(0, 0, 0, 0); if (!session) return false; /* Test the packet is allowed when the tuple and session match perfectly. */ success &= assert_true(test_address_filtering_aux(0, 0, 0, 0), "lol1"); /* Test a tuple that completely mismatches the session. */ success &= assert_false(test_address_filtering_aux(1, 1, 1, 1), "lol2"); /* Now test tuples that nearly match the session. */ success &= assert_false(test_address_filtering_aux(0, 0, 0, 1), "lol3"); success &= assert_false(test_address_filtering_aux(0, 0, 1, 0), "lol4"); /* The remote port is the only one that doesn't matter. */ success &= assert_true(test_address_filtering_aux(0, 1, 0, 0), "lol5"); success &= assert_false(test_address_filtering_aux(1, 0, 0, 0), "lol6"); /* Now we erase the session entry */ remove(session, &session_table_udp); session_return(session); session = NULL; /* Repeat the "lol5" test but now the assert must be false */ success &= assert_false(test_address_filtering_aux(0, 1, 0, 0), "lol7"); return success; }
bool test_clean_old_sessions(void) { int b, s; /* bib counter, session counter. */ bool success = true; const unsigned int before = jiffies_to_msecs(jiffies) - 1000; const unsigned int after = jiffies_to_msecs(jiffies) + 1000; /* Allocate and insert to the tables. */ for (b = 0; b < BIB_COUNT; b++) { db_bibs[b] = create_and_insert_bib(b, b, IPPROTO_UDP); if (!db_bibs[b]) return false; for (s = 0; s < SESSIONS_PER_BIB; s++) { db_sessions[b][s] = create_and_insert_session(b, s + 5, b, s + 5, db_bibs[b], IPPROTO_UDP, after); if (!db_sessions[b][s]) return false; memcpy(&sessions[b][s], db_sessions[b][s], sizeof(struct session_entry)); } memcpy(&bibs[b], db_bibs[b], sizeof(struct bib_entry)); } db_bibs[3]->is_static = true; /* 1. Nothing has expired: Test nothing gets deleted. */ clean_expired_sessions(); success &= ASSERT_SINGLE_BIB("Clean deletes nothing", 0, true, true, true, true); success &= ASSERT_SINGLE_BIB("Clean deletes nothing", 1, true, true, true, true); success &= ASSERT_SINGLE_BIB("Clean deletes nothing", 2, true, true, true, true); success &= ASSERT_SINGLE_BIB("Clean deletes nothing", 3, true, true, true, true); if (!success) return false; /* 2. All of a single BIB's sessions expire: Test both BIBs and Sessions die. */ db_sessions[1][0]->dying_time = before; db_sessions[1][1]->dying_time = before; db_sessions[1][2]->dying_time = before; clean_expired_sessions(); success &= ASSERT_SINGLE_BIB("Whole BIB dies 0", 0, true, true, true, true); success &= ASSERT_SINGLE_BIB("Whole BIB dies 1", 1, false, false, false, false); success &= ASSERT_SINGLE_BIB("Whole BIB dies 2", 2, true, true, true, true); success &= ASSERT_SINGLE_BIB("Whole BIB dies 3", 3, true, true, true, true); if (!success) return false; /* 3. Some sessions of a BIB expire: Test only those sessions get deleted. */ db_sessions[2][0]->dying_time = before; db_sessions[2][1]->dying_time = before; clean_expired_sessions(); success &= ASSERT_SINGLE_BIB("Some sessions die", 0, true, true, true, true); success &= ASSERT_SINGLE_BIB("Some sessions die", 1, false, false, false, false); success &= ASSERT_SINGLE_BIB("Some sessions die", 2, true, false, false, true); success &= ASSERT_SINGLE_BIB("Some sessions die", 3, true, true, true, true); if (!success) return false; /* 4. The rest of them expire: Test the BIB keeps keeps behaving as expected. */ db_sessions[2][2]->dying_time = before; clean_expired_sessions(); success &= ASSERT_SINGLE_BIB("Last session dies", 0, true, true, true, true); success &= ASSERT_SINGLE_BIB("Last session dies", 1, false, false, false, false); success &= ASSERT_SINGLE_BIB("Last session dies", 2, false, false, false, false); success &= ASSERT_SINGLE_BIB("Last session dies", 3, true, true, true, true); if (!success) return false; /* 5. The sessions of a static BIB expire. Test only the sessions ones die. */ db_sessions[3][0]->dying_time = before; db_sessions[3][1]->dying_time = before; db_sessions[3][2]->dying_time = before; clean_expired_sessions(); success &= ASSERT_SINGLE_BIB("Static session doesn't die", 0, true, true, true, true); success &= ASSERT_SINGLE_BIB("Static session doesn't die", 1, false, false, false, false); success &= ASSERT_SINGLE_BIB("Static session doesn't die", 2, false, false, false, false); success &= ASSERT_SINGLE_BIB("Static session doesn't die", 3, true, false, false, false); /* Quit. */ return success; }