Session manager add builtin ex data

This commit is contained in:
luwenpeng
2023-12-22 14:45:31 +08:00
parent fa4cc898d8
commit 2aeb699359
10 changed files with 220 additions and 129 deletions

View File

@@ -487,6 +487,66 @@ TEST(PACKET_UTILS, UDP_AND_TCP)
}
#endif
#if 1
TEST(PACKET_UTILS, PACKET_DUP)
{
struct packet handler;
packet_parse(&handler, (const char *)data5, sizeof(data5));
// IP
EXPECT_TRUE(paket_is_fragment(&handler) == false);
// TCP
EXPECT_TRUE(packet_has_tcp(&handler) == true);
EXPECT_TRUE(packet_get_tcp_sport(&handler) == 443);
EXPECT_TRUE(packet_get_tcp_dport(&handler) == 46582);
EXPECT_TRUE(packet_get_tcp_seq(&handler) == 2198097831);
EXPECT_TRUE(packet_get_tcp_ack(&handler) == 2264498872);
EXPECT_TRUE(packet_get_tcp_flags(&handler) == 0x10);
EXPECT_TRUE(packet_has_tcp_flag_urg(&handler) == false);
EXPECT_TRUE(packet_has_tcp_flag_ack(&handler) == true);
EXPECT_TRUE(packet_has_tcp_flag_psh(&handler) == false);
EXPECT_TRUE(packet_has_tcp_flag_rst(&handler) == false);
EXPECT_TRUE(packet_has_tcp_flag_syn(&handler) == false);
EXPECT_TRUE(packet_has_tcp_flag_fin(&handler) == false);
// UDP
EXPECT_TRUE(packet_has_udp(&handler) == true);
EXPECT_TRUE(packet_get_inner_udp_sport(&handler) == 2152);
EXPECT_TRUE(packet_get_inner_udp_dport(&handler) == 2152);
EXPECT_TRUE(packet_get_outer_udp_sport(&handler) == 2152);
EXPECT_TRUE(packet_get_outer_udp_dport(&handler) == 2152);
struct packet *dup = packet_dup(&handler);
// IP
EXPECT_TRUE(paket_is_fragment(&handler) == false);
// TCP
EXPECT_TRUE(packet_has_tcp(&handler) == true);
EXPECT_TRUE(packet_get_tcp_sport(&handler) == 443);
EXPECT_TRUE(packet_get_tcp_dport(&handler) == 46582);
EXPECT_TRUE(packet_get_tcp_seq(&handler) == 2198097831);
EXPECT_TRUE(packet_get_tcp_ack(&handler) == 2264498872);
EXPECT_TRUE(packet_get_tcp_flags(&handler) == 0x10);
EXPECT_TRUE(packet_has_tcp_flag_urg(&handler) == false);
EXPECT_TRUE(packet_has_tcp_flag_ack(&handler) == true);
EXPECT_TRUE(packet_has_tcp_flag_psh(&handler) == false);
EXPECT_TRUE(packet_has_tcp_flag_rst(&handler) == false);
EXPECT_TRUE(packet_has_tcp_flag_syn(&handler) == false);
EXPECT_TRUE(packet_has_tcp_flag_fin(&handler) == false);
// UDP
EXPECT_TRUE(packet_has_udp(&handler) == true);
EXPECT_TRUE(packet_get_inner_udp_sport(&handler) == 2152);
EXPECT_TRUE(packet_get_inner_udp_dport(&handler) == 2152);
EXPECT_TRUE(packet_get_outer_udp_sport(&handler) == 2152);
EXPECT_TRUE(packet_get_outer_udp_dport(&handler) == 2152);
packet_free(dup);
}
#endif
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);

View File

@@ -1101,6 +1101,7 @@ const char *packet_parse(struct packet *handler, const char *data, uint16_t len)
handler->data_ptr = data;
handler->data_len = len;
handler->zone_id = 0;
handler->user_data = NULL;
// TESTED
return parse_ether(handler, data, len);

View File

@@ -86,6 +86,8 @@ struct packet
const char *data_ptr;
uint16_t data_len;
uint64_t zone_id;
const void *user_data;
};
// return innermost payload

View File

@@ -1,3 +1,5 @@
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/ip6.h>
@@ -42,6 +44,94 @@ static bool ipv6_is_fragment(const struct ip6_hdr *ip6_hdr, uint16_t hdr_len)
* Public API
******************************************************************************/
// metadata
struct metadata *metadata_dup(const struct metadata *metadata)
{
if (metadata == NULL)
{
return NULL;
}
struct metadata *metadata_dup = (struct metadata *)calloc(1, sizeof(struct metadata));
if (metadata_dup == NULL)
{
return NULL;
}
memcpy(metadata_dup, metadata, sizeof(struct metadata));
return metadata_dup;
}
void metadata_free(struct metadata *metadata)
{
if (metadata)
{
free(metadata);
metadata = NULL;
}
}
void packet_set0_metadata(struct packet *pkt, const struct metadata *metadata)
{
pkt->user_data = (const void *)metadata;
}
const struct metadata *packet_get0_metadata(const struct packet *pkt)
{
return (const struct metadata *)pkt->user_data;
}
// packet
struct packet *packet_dup(const struct packet *pkt)
{
if (pkt == NULL)
{
return NULL;
}
struct packet *pkt_dup = (struct packet *)calloc(1, sizeof(struct packet));
if (pkt_dup == NULL)
{
return NULL;
}
memcpy(pkt_dup, pkt, sizeof(struct packet));
if (pkt->data_len)
{
pkt_dup->data_ptr = (const char *)calloc(1, pkt->data_len);
if (pkt_dup->data_ptr == NULL)
{
free(pkt_dup);
return NULL;
}
memcpy((char *)pkt_dup->data_ptr, pkt->data_ptr, pkt->data_len);
for (int8_t i = 0; i < pkt->layers_used; i++)
{
pkt_dup->layers[i].hdr_ptr = pkt_dup->data_ptr + pkt->layers[i].hdr_offset;
pkt_dup->layers[i].pld_ptr = pkt_dup->data_ptr + pkt->layers[i].hdr_offset + pkt->layers[i].hdr_len;
}
}
return pkt_dup;
}
void packet_free(struct packet *pkt)
{
if (pkt)
{
if (pkt->data_ptr)
{
free((char *)pkt->data_ptr);
pkt->data_ptr = NULL;
}
free(pkt);
pkt = NULL;
}
}
// packet
uint64_t packet_get_zone_id(const struct packet *pkt)
{

View File

@@ -8,7 +8,21 @@ extern "C"
#include "packet.h"
struct metadata
{
// TODO
};
// metadata
struct metadata *metadata_dup(const struct metadata *metadata);
void metadata_free(struct metadata *metadata);
void packet_set0_metadata(struct packet *pkt, const struct metadata *metadata);
const struct metadata *packet_get0_metadata(const struct packet *pkt);
// packet
struct packet *packet_dup(const struct packet *pkt);
void packet_free(struct packet *pkt);
uint64_t packet_get_zone_id(const struct packet *pkt);
uint16_t packet_get_raw_len(const struct packet *pkt);
const char *packet_get0_raw_data(const struct packet *pkt);

View File

@@ -1478,7 +1478,6 @@ const char *plugin_ctx = "hello world";
void plugin_session_ex_free(struct session *sess, uint8_t idx, void *ex_ptr, void *arg)
{
printf("free ex data: %s\n", (char *)ex_ptr);
EXPECT_STREQ((char *)ex_ptr, "123");
free(ex_ptr);
}
@@ -1551,8 +1550,6 @@ TEST(SESSION_MANAGER, INIT_TO_OPENING_BY_SYN)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -1628,8 +1625,6 @@ TEST(SESSION_MANAGER, INIT_TO_OPENING_BY_SYNACK)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
EXPECT_TRUE(session_get_c2s_packets(sess) == 0);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -1709,8 +1704,6 @@ TEST(SESSION_MANAGER, INIT_TO_ACTIVE_BY_UDP_C2S)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -1786,8 +1779,6 @@ TEST(SESSION_MANAGER, INIT_TO_ACTIVE_BY_UDP_S2C)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 550);
EXPECT_TRUE(session_get_c2s_packets(sess) == 0);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -1874,8 +1865,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_C2S_PAYLOAD)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -1919,8 +1908,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_C2S_PAYLOAD)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2012,8 +1999,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_S2C_PAYLOAD)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -2057,8 +2042,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_S2C_PAYLOAD)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 1354);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2149,8 +2132,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYNACK_AND_C2S_PAYLOAD)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
EXPECT_TRUE(session_get_c2s_packets(sess) == 0);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -2194,8 +2175,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYNACK_AND_C2S_PAYLOAD)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2286,8 +2265,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYNACK_AND_S2C_PAYLOAD)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
EXPECT_TRUE(session_get_c2s_packets(sess) == 0);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -2331,8 +2308,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYNACK_AND_S2C_PAYLOAD)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 1354);
EXPECT_TRUE(session_get_c2s_packets(sess) == 0);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2428,8 +2403,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_SYNACK_AND_ACK_AND_C2S_PAYLOA
EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -2473,8 +2446,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_SYNACK_AND_ACK_AND_C2S_PAYLOA
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2518,8 +2489,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_SYNACK_AND_ACK_AND_C2S_PAYLOA
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2563,8 +2532,6 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_SYNACK_AND_ACK_AND_C2S_PAYLOA
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2756,8 +2723,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -2801,8 +2766,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2846,8 +2809,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2891,8 +2852,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2936,8 +2895,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -2981,8 +2938,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -3026,8 +2981,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354 + 385);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1 + 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -3071,8 +3024,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354 + 385);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1 + 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -3116,8 +3067,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354 + 385);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1 + 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1 + 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -3161,8 +3110,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354 + 385 + 66);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1 + 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1 + 1 + 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -3206,8 +3153,6 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354 + 385 + 66);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1 + 1 + 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1 + 1 + 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
@@ -3294,8 +3239,6 @@ TEST(SESSION_MANAGER, UDP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
@@ -3339,8 +3282,6 @@ TEST(SESSION_MANAGER, UDP_FULL_STREAM)
EXPECT_TRUE(session_get_s2c_bytes(sess) == 550);
EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
EXPECT_TRUE(session_get_create_time(sess) != 0);
EXPECT_TRUE(session_get_last_time(sess) != 0);
EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));

View File

@@ -20,6 +20,10 @@ struct ex_manager
static struct ex_manager g_ex_manager = {0};
uint8_t tcp_builtin_ex = 0; // built-in ex_data index
uint8_t udp_builtin_ex = 0; // built-in ex_data index
uint8_t c2s_1st_md_ex = 0; // built-in ex_data index
uint8_t s2c_1st_md_ex = 0; // built-in ex_data index
uint8_t c2s_1st_pkt_ex = 0; // built-in ex_data index
uint8_t s2c_1st_pkt_ex = 0; // built-in ex_data index
/******************************************************************************
* ev queue
@@ -164,35 +168,6 @@ uint64_t session_get_s2c_packets(const struct session *sess)
return sess->s2c_packets;
}
// session metadata
void session_set_c2s_1st_md(struct session *sess, struct metadata *md)
{
memcpy(&sess->c2s_1st_md, md, sizeof(struct metadata));
}
void session_set_s2c_1st_md(struct session *sess, struct metadata *md)
{
memcpy(&sess->s2c_1st_md, md, sizeof(struct metadata));
}
const struct metadata *session_get0_c2s_1st_md(const struct session *sess)
{
if (sess->c2s_1st_md.len == 0)
{
return NULL;
}
return &sess->c2s_1st_md;
}
const struct metadata *session_get0_s2c_1st_md(const struct session *sess)
{
if (sess->s2c_1st_md.len == 0)
{
return NULL;
}
return &sess->s2c_1st_md;
}
// session timestamp
void session_set_create_time(struct session *sess, uint64_t timestamp)
{
@@ -337,6 +312,7 @@ void session_free_ex_data(struct session *sess, uint8_t idx)
}
struct ex_schema *schema = &g_ex_manager.schemas[idx];
printf("free ex_data, idx: %d, key: %s, val: %p\n", idx, schema->key, sess->ex_data[idx]);
if (schema->free_cb != NULL && sess->ex_data[idx] != NULL)
{
schema->free_cb(sess, idx, sess->ex_data[idx], schema->args);
@@ -459,8 +435,8 @@ const char *session_event_tostring(enum session_event event)
return "none";
case SESSION_EVENT_OPENING:
return "opening";
case SESSION_EVENT_ACTIVE:
return "active";
case SESSION_EVENT_PACKET:
return "packet";
case SESSION_EVENT_CLOSING:
return "closing";
default:
@@ -478,8 +454,6 @@ const char *session_state_tostring(enum session_state state)
return "opening";
case SESSION_STATE_ACTIVE:
return "active";
case SESSION_STATE_DISCARD:
return "discard";
case SESSION_STATE_CLOSING:
return "closing";
case SESSION_STATE_CLOSED:
@@ -535,8 +509,6 @@ void session_dump(struct session *sess)
printf("session c2s bytes : %" PRIu64 "\n", session_get_c2s_bytes(sess));
printf("session s2c packets : %" PRIu64 "\n", session_get_s2c_packets(sess));
printf("session s2c bytes : %" PRIu64 "\n", session_get_s2c_bytes(sess));
printf("session c2s 1st metadata : %p\n", (void *)session_get0_c2s_1st_md(sess));
printf("session s2c 1st metadata : %p\n", (void *)session_get0_s2c_1st_md(sess));
printf("session create time : %" PRIu64 "\n", session_get_create_time(sess));
printf("session last time : %" PRIu64 "\n", session_get_last_time(sess));
printf("session current packet ptr : %p\n", (void *)session_get0_cur_pkt(sess));

View File

@@ -16,11 +16,16 @@ enum session_state
SESSION_STATE_INIT = 0,
SESSION_STATE_OPENING,
SESSION_STATE_ACTIVE,
SESSION_STATE_DISCARD,
SESSION_STATE_CLOSING,
SESSION_STATE_CLOSED,
};
enum session_action
{
SESSION_ACTION_DISCARD,
SESSION_ACTION_FASTFORWARD,
};
enum session_type
{
SESSION_TYPE_NONE = 0,
@@ -33,7 +38,7 @@ enum session_event
{
SESSION_EVENT_NONE = 0,
SESSION_EVENT_OPENING,
SESSION_EVENT_ACTIVE,
SESSION_EVENT_PACKET,
SESSION_EVENT_CLOSING,
// Add new event before SESSION_EVENT_MAX
@@ -48,12 +53,6 @@ enum session_dir
SESSION_DIR_S2C = 2,
};
struct metadata
{
char data[64]; // TODO
int len;
};
struct session;
/******************************************************************************
@@ -88,12 +87,6 @@ uint64_t session_get_s2c_bytes(const struct session *sess);
uint64_t session_get_c2s_packets(const struct session *sess);
uint64_t session_get_s2c_packets(const struct session *sess);
// session metadata
void session_set_c2s_1st_md(struct session *sess, struct metadata *md);
void session_set_s2c_1st_md(struct session *sess, struct metadata *md);
const struct metadata *session_get0_c2s_1st_md(const struct session *sess);
const struct metadata *session_get0_s2c_1st_md(const struct session *sess);
// session timestamp
void session_set_create_time(struct session *sess, uint64_t timestamp);
void session_set_last_time(struct session *sess, uint64_t timestamp);

View File

@@ -46,12 +46,21 @@ static uint64_t alloc_session_id(void)
return 0;
}
// TODO
struct metadata *packet_get0_metadata(const struct packet *pkt)
static void metadata_ex_free_cb(struct session *sess, uint8_t idx, void *ex_ptr, void *arg)
{
static struct metadata md = {0};
return &md;
};
if (ex_ptr)
{
metadata_free((struct metadata *)ex_ptr);
}
}
static void packet_ex_free_cb(struct session *sess, uint8_t idx, void *ex_ptr, void *arg)
{
if (ex_ptr)
{
packet_free((struct packet *)ex_ptr);
}
}
/******************************************************************************
* session manager counter
@@ -269,21 +278,29 @@ static int tcp_need_active(uint64_t state)
static void update_session_base(struct session *sess, const struct packet *pkt, enum session_dir curr_dir)
{
uint64_t len = packet_get_raw_len(pkt);
struct metadata *md = packet_get0_metadata(pkt);
const struct metadata *md = packet_get0_metadata(pkt);
if (curr_dir == SESSION_DIR_C2S)
{
session_inc_c2s_metrics(sess, 1, len);
if (session_get0_c2s_1st_md(sess) == NULL)
if (session_get0_ex_data(sess, c2s_1st_md_ex) == NULL)
{
session_set_c2s_1st_md(sess, md);
session_set_ex_data(sess, c2s_1st_md_ex, metadata_dup(md));
}
if (session_get0_ex_data(sess, c2s_1st_pkt_ex) == NULL)
{
session_set_ex_data(sess, c2s_1st_pkt_ex, packet_dup(pkt));
}
}
else
{
session_inc_s2c_metrics(sess, 1, len);
if (session_get0_s2c_1st_md(sess) == NULL)
if (session_get0_ex_data(sess, s2c_1st_md_ex) == NULL)
{
session_set_s2c_1st_md(sess, md);
session_set_ex_data(sess, s2c_1st_md_ex, metadata_dup(md));
}
if (session_get0_ex_data(sess, s2c_1st_pkt_ex) == NULL)
{
session_set_ex_data(sess, s2c_1st_pkt_ex, packet_dup(pkt));
}
}
session_set_last_time(sess, timestamp_get_msec());
@@ -441,7 +458,7 @@ static int handle_udp_new_session(struct session_manager *mgr, struct tuple6 *ke
update_session_base(sess, pkt, curr_dir);
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_OPENING);
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_ACTIVE);
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_PACKET);
session_manager_update_session_timer(mgr, sess, packet_expire_callback, mgr->packet_timeout_ms);
return 0;
@@ -467,7 +484,7 @@ static void handle_tcp_old_session(struct session_manager *mgr, struct tuple6 *k
{
update_counter_on_active(mgr, sess);
session_set_state(sess, SESSION_STATE_ACTIVE);
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_ACTIVE);
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_PACKET);
session_manager_update_session_timer(mgr, sess, packet_expire_callback, mgr->packet_timeout_ms);
return;
}
@@ -481,7 +498,7 @@ static void handle_udp_old_session(struct session_manager *mgr, struct tuple6 *k
update_counter_on_active(mgr, sess);
session_set_state(sess, SESSION_STATE_ACTIVE);
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_ACTIVE);
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_PACKET);
session_manager_update_session_timer(mgr, sess, packet_expire_callback, mgr->packet_timeout_ms);
}
@@ -565,6 +582,10 @@ struct session_manager *session_manager_create(uint64_t max_session_num)
tcp_builtin_ex = session_get_ex_new_index("tcp_builtin_ex", NULL, NULL);
udp_builtin_ex = session_get_ex_new_index("udp_builtin_ex", NULL, NULL);
c2s_1st_md_ex = session_get_ex_new_index("c2s_1st_md_ex", metadata_ex_free_cb, NULL);
s2c_1st_md_ex = session_get_ex_new_index("s2c_1st_md_ex", metadata_ex_free_cb, NULL);
c2s_1st_pkt_ex = session_get_ex_new_index("c2s_1st_pkt_ex", packet_ex_free_cb, NULL);
s2c_1st_pkt_ex = session_get_ex_new_index("s2c_1st_pkt_ex", packet_ex_free_cb, NULL);
return mgr;
@@ -616,14 +637,13 @@ struct session *session_manager_find_session(struct session_manager *mgr, const
struct session *sess = session_table_find_session(mgr->sess_table, &key);
if (sess == NULL)
{
// if session pool is full, discard oldest session
if (session_pool_get_count(mgr->sess_pool) == 1)
{
struct session *unused_sess = session_table_find_least_recently_unused_session(mgr->sess_table);
assert(unused_sess);
update_counter_on_closing(mgr, unused_sess);
session_set_state(unused_sess, SESSION_STATE_DISCARD);
session_set_state(unused_sess, SESSION_STATE_CLOSING);
session_manager_trigger_session_event(mgr, unused_sess, SESSION_EVENT_CLOSING);
session_manager_update_session_timer(mgr, unused_sess, closing_expire_callback, mgr->closing_timeout_ms);
}

View File

@@ -63,10 +63,6 @@ struct session
uint64_t c2s_packets;
uint64_t s2c_packets;
// session metadata
struct metadata c2s_1st_md;
struct metadata s2c_1st_md;
// session timestamp
uint64_t create_time;
uint64_t last_time;
@@ -129,10 +125,12 @@ struct session
struct session *next_ready_ptr;
};
// tcp_builtin_ex = session_get_ex_new_index("tcp_builtin_ex", NULL, NULL);
// udp_builtin_ex = session_get_ex_new_index("udp_builtin_ex", NULL, NULL);
extern uint8_t tcp_builtin_ex;
extern uint8_t udp_builtin_ex;
extern uint8_t c2s_1st_md_ex;
extern uint8_t s2c_1st_md_ex;
extern uint8_t c2s_1st_pkt_ex;
extern uint8_t s2c_1st_pkt_ex;
#ifdef __cpluscplus
}