feature: add 'quiet' option to avoid automatic update of LRU list by find session
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user