feature: add 'quiet' option to avoid automatic update of LRU list by find session

This commit is contained in:
luwenpeng
2024-07-25 18:50:07 +08:00
parent 5fdf0e2aa4
commit 62b9c0c99c
4 changed files with 40 additions and 34 deletions

View File

@@ -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) 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) if (sess == NULL)
{ {
return NULL; return NULL;
@@ -1028,7 +1028,7 @@ void session_manager_free_session(struct session_manager *mgr, struct session *s
{ {
case SESSION_TYPE_TCP: case SESSION_TYPE_TCP:
tcp_clean(mgr, sess); 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); 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--; mgr->stat.curr_nr_tcp_sess_used--;
break; break;
case SESSION_TYPE_UDP: 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); 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) switch (key.ip_proto)
{ {
case IPPROTO_UDP: 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: case IPPROTO_TCP:
return session_manager_lookup_tcp_session(mgr, pkt, &key); return session_manager_lookup_tcp_session(mgr, pkt, &key);
default: default:

View File

@@ -172,7 +172,7 @@ void session_table_del(struct session_table *table, struct session *sess)
table->count--; 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) if (table == NULL)
{ {
@@ -181,7 +181,7 @@ struct session *session_table_find_sessid(struct session_table *table, uint64_t
struct session *sess = NULL; struct session *sess = NULL;
HASH_FIND(hh3, table->root_sessid, &id, sizeof(uint64_t), sess); HASH_FIND(hh3, table->root_sessid, &id, sizeof(uint64_t), sess);
if (sess) if (sess && !quiet)
{ {
list_del(&sess->lru); list_del(&sess->lru);
list_add_tail(&sess->lru, &table->lru_queue); 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; 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) if (table == NULL)
{ {
@@ -199,7 +199,7 @@ struct session *session_table_find_tuple6(struct session_table *table, const str
struct session *sess = NULL; struct session *sess = NULL;
HASH_FIND(hh1, table->root_tuple6, tuple, sizeof(struct tuple6), sess); HASH_FIND(hh1, table->root_tuple6, tuple, sizeof(struct tuple6), sess);
if (sess) if (sess && !quiet)
{ {
list_del(&sess->lru); list_del(&sess->lru);
list_add_tail(&sess->lru, &table->lru_queue); 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; 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) if (table == NULL)
{ {
@@ -217,7 +217,7 @@ struct session *session_table_find_tuple4(struct session_table *table, const str
struct session *sess = NULL; struct session *sess = NULL;
HASH_FIND(hh2, table->root_tuple4, tuple, sizeof(struct tuple4), sess); HASH_FIND(hh2, table->root_tuple4, tuple, sizeof(struct tuple4), sess);
if (sess) if (sess && !quiet)
{ {
list_del(&sess->lru); list_del(&sess->lru);
list_add_tail(&sess->lru, &table->lru_queue); list_add_tail(&sess->lru, &table->lru_queue);

View File

@@ -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_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_add(struct session_table *table, struct session *sess);
void session_table_del(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); struct session *session_table_find_lru(struct session_table *table);
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -134,41 +134,41 @@ TEST(SESSION_TABLE, OP_SESSION)
EXPECT_TRUE(session_table_get_count(sess_table) == 3); EXPECT_TRUE(session_table_get_count(sess_table) == 3);
// Search // Search
EXPECT_TRUE(session_table_find_sessid(sess_table, 1) == sess1); EXPECT_TRUE(session_table_find_sessid(sess_table, 1, 0) == sess1);
EXPECT_TRUE(session_table_find_sessid(sess_table, 2) == sess2); EXPECT_TRUE(session_table_find_sessid(sess_table, 2, 0) == sess2);
EXPECT_TRUE(session_table_find_sessid(sess_table, 3) == sess3); 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, &sess1_tup4, 0) == sess1);
EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess2_tup4) == sess2); EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess2_tup4, 0) == sess2);
EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess3_tup4) == sess3); 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, &sess1_rev_tup4, 0) == sess1);
EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess2_rev_tup4) == sess2); EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess2_rev_tup4, 0) == sess2);
EXPECT_TRUE(session_table_find_tuple4(sess_table, &sess3_rev_tup4) == sess3); 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, &sess1_tup6, 0) == sess1);
EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_tup6) == sess2); EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_tup6, 0) == sess2);
EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_tup6) == sess3); 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, &sess1_rev_tup6, 0) == sess1);
EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_rev_tup6) == sess2); EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_rev_tup6, 0) == sess2);
EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_rev_tup6) == sess3); EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_rev_tup6, 0) == sess3);
// Delete // Delete
session_table_del(sess_table, sess1); session_table_del(sess_table, sess1);
EXPECT_TRUE(session_table_get_count(sess_table) == 2); 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_tup6, 0) == NULL);
EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess1_rev_tup6) == NULL); EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess1_rev_tup6, 0) == NULL);
session_table_del(sess_table, sess2); session_table_del(sess_table, sess2);
EXPECT_TRUE(session_table_get_count(sess_table) == 1); 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_tup6, 0) == NULL);
EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_rev_tup6) == NULL); EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess2_rev_tup6, 0) == NULL);
session_table_del(sess_table, sess3); session_table_del(sess_table, sess3);
EXPECT_TRUE(session_table_get_count(sess_table) == 0); 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_tup6, 0) == NULL);
EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_rev_tup6) == NULL); EXPECT_TRUE(session_table_find_tuple6(sess_table, &sess3_rev_tup6, 0) == NULL);
// Destroy // Destroy
session_table_free(sess_table); session_table_free(sess_table);