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)
|
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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user