diff --git a/src/session/session_manager.cpp b/src/session/session_manager.cpp index 663d83a..b8c41e1 100644 --- a/src/session/session_manager.cpp +++ b/src/session/session_manager.cpp @@ -652,7 +652,7 @@ static void session_manager_evicte_session(struct session_manager *mgr, struct s static struct session *session_manager_lookup_tcp_session(struct session_manager *mgr, const struct packet *pkt, const struct tuple6 *key) { - struct session *sess = session_table_find_tuple6(mgr->tcp_sess_table, key); + struct session *sess = session_table_find_tuple6(mgr->tcp_sess_table, key, 0); if (sess == NULL) { return NULL; @@ -1028,7 +1028,7 @@ void session_manager_free_session(struct session_manager *mgr, struct session *s { case SESSION_TYPE_TCP: tcp_clean(mgr, sess); - if (session_table_find_sessid(mgr->tcp_sess_table, session_get_id(sess)) == sess) + if (session_table_find_sessid(mgr->tcp_sess_table, session_get_id(sess), 0) == sess) { session_table_del(mgr->tcp_sess_table, sess); } @@ -1036,7 +1036,7 @@ void session_manager_free_session(struct session_manager *mgr, struct session *s mgr->stat.curr_nr_tcp_sess_used--; break; case SESSION_TYPE_UDP: - if (session_table_find_sessid(mgr->udp_sess_table, session_get_id(sess)) == sess) + if (session_table_find_sessid(mgr->udp_sess_table, session_get_id(sess), 0) == sess) { session_table_del(mgr->udp_sess_table, sess); } @@ -1077,7 +1077,7 @@ struct session *session_manager_lookup_session(struct session_manager *mgr, cons switch (key.ip_proto) { case IPPROTO_UDP: - return session_table_find_tuple6(mgr->udp_sess_table, &key); + return session_table_find_tuple6(mgr->udp_sess_table, &key, 0); case IPPROTO_TCP: return session_manager_lookup_tcp_session(mgr, pkt, &key); default: diff --git a/src/session/session_table.cpp b/src/session/session_table.cpp index 24d735a..1d40421 100644 --- a/src/session/session_table.cpp +++ b/src/session/session_table.cpp @@ -172,7 +172,7 @@ void session_table_del(struct session_table *table, struct session *sess) table->count--; } -struct session *session_table_find_sessid(struct session_table *table, uint64_t id) +struct session *session_table_find_sessid(struct session_table *table, uint64_t id, uint8_t quiet) { if (table == NULL) { @@ -181,7 +181,7 @@ struct session *session_table_find_sessid(struct session_table *table, uint64_t struct session *sess = NULL; HASH_FIND(hh3, table->root_sessid, &id, sizeof(uint64_t), sess); - if (sess) + if (sess && !quiet) { list_del(&sess->lru); list_add_tail(&sess->lru, &table->lru_queue); @@ -190,7 +190,7 @@ struct session *session_table_find_sessid(struct session_table *table, uint64_t return sess; } -struct session *session_table_find_tuple6(struct session_table *table, const struct tuple6 *tuple) +struct session *session_table_find_tuple6(struct session_table *table, const struct tuple6 *tuple, uint8_t quiet) { if (table == NULL) { @@ -199,7 +199,7 @@ struct session *session_table_find_tuple6(struct session_table *table, const str struct session *sess = NULL; HASH_FIND(hh1, table->root_tuple6, tuple, sizeof(struct tuple6), sess); - if (sess) + if (sess && !quiet) { list_del(&sess->lru); list_add_tail(&sess->lru, &table->lru_queue); @@ -208,7 +208,7 @@ struct session *session_table_find_tuple6(struct session_table *table, const str return sess; } -struct session *session_table_find_tuple4(struct session_table *table, const struct tuple4 *tuple) +struct session *session_table_find_tuple4(struct session_table *table, const struct tuple4 *tuple, uint8_t quiet) { if (table == NULL) { @@ -217,7 +217,7 @@ struct session *session_table_find_tuple4(struct session_table *table, const str struct session *sess = NULL; HASH_FIND(hh2, table->root_tuple4, tuple, sizeof(struct tuple4), sess); - if (sess) + if (sess && !quiet) { list_del(&sess->lru); list_add_tail(&sess->lru, &table->lru_queue); diff --git a/src/session/session_table.h b/src/session/session_table.h index 205f3e0..5dc73fb 100644 --- a/src/session/session_table.h +++ b/src/session/session_table.h @@ -14,9 +14,15 @@ typedef void (*session_free_cb)(struct session *sess, void *arg); void session_table_set_freecb(struct session_table *table, session_free_cb free_cb, void *arg); void session_table_add(struct session_table *table, struct session *sess); void session_table_del(struct session_table *table, struct session *sess); -struct session *session_table_find_sessid(struct session_table *table, uint64_t id); -struct session *session_table_find_tuple6(struct session_table *table, const struct tuple6 *tuple); -struct session *session_table_find_tuple4(struct session_table *table, const struct tuple4 *tuple); + +/* + * When a session is found, it also updates the LRU list, + * moving the current session to the end of the LRU to indicate that it is the most recently used. + * If quiet is 1, the LRU list is not updated. + */ +struct session *session_table_find_sessid(struct session_table *table, uint64_t id, uint8_t quiet); +struct session *session_table_find_tuple6(struct session_table *table, const struct tuple6 *tuple, uint8_t quiet); +struct session *session_table_find_tuple4(struct session_table *table, const struct tuple4 *tuple, uint8_t quiet); struct session *session_table_find_lru(struct session_table *table); #ifdef __cplusplus diff --git a/src/session/test/gtest_session_table.cpp b/src/session/test/gtest_session_table.cpp index b63f897..2a701c1 100644 --- a/src/session/test/gtest_session_table.cpp +++ b/src/session/test/gtest_session_table.cpp @@ -134,41 +134,41 @@ TEST(SESSION_TABLE, OP_SESSION) EXPECT_TRUE(session_table_get_count(sess_table) == 3); // Search - EXPECT_TRUE(session_table_find_sessid(sess_table, 1) == sess1); - EXPECT_TRUE(session_table_find_sessid(sess_table, 2) == sess2); - EXPECT_TRUE(session_table_find_sessid(sess_table, 3) == sess3); + EXPECT_TRUE(session_table_find_sessid(sess_table, 1, 0) == sess1); + EXPECT_TRUE(session_table_find_sessid(sess_table, 2, 0) == sess2); + EXPECT_TRUE(session_table_find_sessid(sess_table, 3, 0) == sess3); - EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess1_tup4) == sess1); - EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess2_tup4) == sess2); - EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess3_tup4) == sess3); + EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess1_tup4, 0) == sess1); + EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess2_tup4, 0) == sess2); + EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess3_tup4, 0) == sess3); - EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess1_rev_tup4) == sess1); - EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess2_rev_tup4) == sess2); - EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess3_rev_tup4) == sess3); + EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess1_rev_tup4, 0) == sess1); + EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess2_rev_tup4, 0) == sess2); + EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess3_rev_tup4, 0) == sess3); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess1_tup6) == sess1); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_tup6) == sess2); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_tup6) == sess3); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess1_tup6, 0) == sess1); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_tup6, 0) == sess2); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_tup6, 0) == sess3); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess1_rev_tup6) == sess1); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_rev_tup6) == sess2); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_rev_tup6) == sess3); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess1_rev_tup6, 0) == sess1); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_rev_tup6, 0) == sess2); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_rev_tup6, 0) == sess3); // Delete session_table_del(sess_table, sess1); EXPECT_TRUE(session_table_get_count(sess_table) == 2); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess1_tup6) == NULL); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess1_rev_tup6) == NULL); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess1_tup6, 0) == NULL); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess1_rev_tup6, 0) == NULL); session_table_del(sess_table, sess2); EXPECT_TRUE(session_table_get_count(sess_table) == 1); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_tup6) == NULL); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_rev_tup6) == NULL); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_tup6, 0) == NULL); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_rev_tup6, 0) == NULL); session_table_del(sess_table, sess3); EXPECT_TRUE(session_table_get_count(sess_table) == 0); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_tup6) == NULL); - EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_rev_tup6) == NULL); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_tup6, 0) == NULL); + EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_rev_tup6, 0) == NULL); // Destroy session_table_free(sess_table);