2024-06-19 15:06:14 +08:00
|
|
|
#pragma once
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-04-21 11:30:41 +08:00
|
|
|
#ifdef __cplusplus
|
2024-04-10 11:40:26 +08:00
|
|
|
extern "C"
|
|
|
|
|
{
|
|
|
|
|
#endif
|
|
|
|
|
|
2024-04-22 20:01:15 +08:00
|
|
|
#include "stellar/packet.h"
|
2024-11-05 09:39:10 +08:00
|
|
|
#include "stellar/module.h"
|
2024-04-10 11:40:26 +08:00
|
|
|
|
|
|
|
|
enum session_state
|
|
|
|
|
{
|
|
|
|
|
SESSION_STATE_INIT = 0,
|
|
|
|
|
SESSION_STATE_OPENING = 1,
|
|
|
|
|
SESSION_STATE_ACTIVE = 2,
|
|
|
|
|
SESSION_STATE_CLOSING = 3,
|
|
|
|
|
SESSION_STATE_DISCARD = 4,
|
|
|
|
|
SESSION_STATE_CLOSED = 5,
|
|
|
|
|
MAX_STATE = 6,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum session_type
|
|
|
|
|
{
|
|
|
|
|
SESSION_TYPE_TCP = 0x1,
|
|
|
|
|
SESSION_TYPE_UDP = 0x2,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum session_direction
|
|
|
|
|
{
|
2024-05-09 14:57:12 +08:00
|
|
|
SESSION_DIRECTION_INBOUND = 0,
|
|
|
|
|
SESSION_DIRECTION_OUTBOUND = 1,
|
|
|
|
|
};
|
|
|
|
|
|
2024-09-02 17:49:33 +08:00
|
|
|
enum flow_type
|
2024-05-09 14:57:12 +08:00
|
|
|
{
|
2024-09-02 17:49:33 +08:00
|
|
|
FLOW_TYPE_NONE = -1,
|
|
|
|
|
FLOW_TYPE_C2S = 0,
|
|
|
|
|
FLOW_TYPE_S2C = 1,
|
|
|
|
|
MAX_FLOW_TYPE = 2,
|
2024-04-10 11:40:26 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum closing_reason
|
|
|
|
|
{
|
|
|
|
|
CLOSING_BY_TIMEOUT = 0x1,
|
2024-05-16 19:13:36 +08:00
|
|
|
CLOSING_BY_LRU_EVICTED = 0x2,
|
|
|
|
|
CLOSING_BY_PORT_REUSE_EVICTED = 0x3,
|
|
|
|
|
CLOSING_BY_CLIENT_FIN = 0x4,
|
|
|
|
|
CLOSING_BY_CLIENT_RST = 0x5,
|
|
|
|
|
CLOSING_BY_SERVER_FIN = 0x6,
|
|
|
|
|
CLOSING_BY_SERVER_RST = 0x7,
|
2024-04-10 11:40:26 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum session_stat
|
|
|
|
|
{
|
|
|
|
|
// raw packet
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_RAW_PACKETS_RECEIVED,
|
|
|
|
|
STAT_RAW_BYTES_RECEIVED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_RAW_PACKETS_TRANSMITTED,
|
|
|
|
|
STAT_RAW_BYTES_TRANSMITTED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_RAW_PACKETS_DROPPED,
|
|
|
|
|
STAT_RAW_BYTES_DROPPED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 17:40:14 +08:00
|
|
|
// duplicate packets
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_DUPLICATE_PACKETS_BYPASS,
|
|
|
|
|
STAT_DUPLICATE_BYTES_BYPASS,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
// injected packet
|
|
|
|
|
STAT_INJECTED_PACKETS_FAILED,
|
|
|
|
|
STAT_INJECTED_PACKETS_SUCCESS,
|
|
|
|
|
STAT_INJECTED_BYTES_SUCCESS,
|
2024-04-25 16:48:50 +08:00
|
|
|
|
2024-11-13 14:43:38 +08:00
|
|
|
// pseudo packet
|
|
|
|
|
STAT_PSEUDO_PACKETS_RECEIVED,
|
|
|
|
|
STAT_PSEUDO_BYTES_RECEIVED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-11-13 14:43:38 +08:00
|
|
|
STAT_PSEUDO_PACKETS_TRANSMITTED,
|
|
|
|
|
STAT_PSEUDO_BYTES_TRANSMITTED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-11-13 14:43:38 +08:00
|
|
|
STAT_PSEUDO_PACKETS_DROPPED,
|
|
|
|
|
STAT_PSEUDO_BYTES_DROPPED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
|
|
|
|
// TCP segment
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_TCP_SEGMENTS_RECEIVED,
|
|
|
|
|
STAT_TCP_PAYLOADS_RECEIVED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_TCP_SEGMENTS_EXPIRED,
|
|
|
|
|
STAT_TCP_PAYLOADS_EXPIRED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_TCP_SEGMENTS_RETRANSMIT,
|
|
|
|
|
STAT_TCP_PAYLOADS_RETRANSMIT,
|
2024-05-06 15:54:16 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_TCP_SEGMENTS_OVERLAP,
|
|
|
|
|
STAT_TCP_PAYLOADS_OVERLAP,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_TCP_SEGMENTS_NOSPACE,
|
|
|
|
|
STAT_TCP_PAYLOADS_NOSPACE,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_TCP_SEGMENTS_INORDER,
|
|
|
|
|
STAT_TCP_PAYLOADS_INORDER,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_TCP_SEGMENTS_REORDERED,
|
|
|
|
|
STAT_TCP_PAYLOADS_REORDERED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_TCP_SEGMENTS_BUFFERED,
|
|
|
|
|
STAT_TCP_PAYLOADS_BUFFERED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
2024-05-09 16:32:45 +08:00
|
|
|
STAT_TCP_SEGMENTS_RELEASED,
|
|
|
|
|
STAT_TCP_PAYLOADS_RELEASED,
|
2024-04-10 11:40:26 +08:00
|
|
|
|
|
|
|
|
MAX_STAT,
|
|
|
|
|
};
|
|
|
|
|
|
2024-07-16 17:13:32 +08:00
|
|
|
// realtime in milliseconds
|
2024-04-10 11:40:26 +08:00
|
|
|
enum session_timestamp
|
|
|
|
|
{
|
|
|
|
|
SESSION_TIMESTAMP_START,
|
|
|
|
|
SESSION_TIMESTAMP_LAST,
|
|
|
|
|
MAX_TIMESTAMP,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct session;
|
2024-05-17 16:55:46 +08:00
|
|
|
#define SESSION_SEEN_C2S_FLOW (1 << 0)
|
|
|
|
|
#define SESSION_SEEN_S2C_FLOW (1 << 1)
|
2024-05-20 11:12:24 +08:00
|
|
|
int session_is_symmetric(const struct session *sess, unsigned char *flag);
|
2024-05-09 16:32:45 +08:00
|
|
|
int session_has_duplicate_traffic(const struct session *sess);
|
2024-04-10 11:40:26 +08:00
|
|
|
enum session_type session_get_type(const struct session *sess);
|
2024-05-17 16:55:46 +08:00
|
|
|
enum session_state session_get_current_state(const struct session *sess);
|
2024-04-10 11:40:26 +08:00
|
|
|
enum closing_reason session_get_closing_reason(const struct session *sess);
|
2024-05-09 14:57:12 +08:00
|
|
|
enum session_direction session_get_direction(const struct session *sess);
|
2024-09-02 17:49:33 +08:00
|
|
|
enum flow_type session_get_flow_type(const struct session *sess);
|
|
|
|
|
const struct packet *session_get_first_packet(const struct session *sess, enum flow_type type);
|
2024-04-10 11:40:26 +08:00
|
|
|
uint64_t session_get_id(const struct session *sess);
|
|
|
|
|
uint64_t session_get_timestamp(const struct session *sess, enum session_timestamp type);
|
2024-09-02 17:49:33 +08:00
|
|
|
uint64_t session_get_stat(const struct session *sess, enum flow_type type, enum session_stat stat);
|
2024-11-01 15:37:26 +08:00
|
|
|
const char *session_get_readable_addr(const struct session *sess);
|
2024-09-20 16:56:05 +08:00
|
|
|
void session_set_exdata(struct session *sess, int idx, void *ex_ptr);
|
|
|
|
|
void *session_get_exdata(const struct session *sess, int idx);
|
|
|
|
|
|
2024-11-05 09:39:10 +08:00
|
|
|
#define SESSION_MANAGER_MODULE_NAME "session_manager_module"
|
2024-10-25 14:38:51 +08:00
|
|
|
struct session_manager;
|
2024-11-05 09:39:10 +08:00
|
|
|
struct session_manager *module_to_session_manager(struct module *mod);
|
2024-10-25 14:38:51 +08:00
|
|
|
int session_manager_new_session_exdata_index(struct session_manager *sess_mgr, const char *name, exdata_free *func, void *arg);
|
2024-11-19 18:35:40 +08:00
|
|
|
struct session *session_manager_lookup_session_by_packet(struct session_manager *sess_mgr, uint16_t thread_id, const struct packet *pkt);
|
|
|
|
|
struct session *session_manager_lookup_session_by_id(struct session_manager *sess_mgr, uint16_t thread_id, uint64_t sess_id);
|
2024-11-26 11:53:30 +08:00
|
|
|
void session_manager_discard_session(struct session_manager *sess_mgr, uint16_t thread_id, struct session *sess);
|
2024-10-25 14:38:51 +08:00
|
|
|
|
2024-11-26 15:31:51 +08:00
|
|
|
void session_manager_on_packet_forward(struct packet *pkt, struct module *mod);
|
|
|
|
|
void session_manager_on_packet_output(struct packet *pkt, struct module *mod);
|
2024-11-25 10:53:21 +08:00
|
|
|
|
2024-11-26 14:37:05 +08:00
|
|
|
struct module *session_manager_on_init(struct module_manager *mod_mgr);
|
|
|
|
|
void session_manager_on_exit(struct module_manager *mod_mgr, struct module *mod);
|
|
|
|
|
struct module *session_manager_on_thread_init(struct module_manager *mod_mgr, int thread_id, struct module *mod);
|
|
|
|
|
void session_manager_on_thread_exit(struct module_manager *mod_mgr, int thread_id, struct module *mod);
|
|
|
|
|
|
|
|
|
|
struct module *session_monitor_on_init(struct module_manager *mod_mgr);
|
|
|
|
|
void session_monitor_on_exit(struct module_manager *mod_mgr, struct module *mod);
|
|
|
|
|
|
2024-11-25 10:53:21 +08:00
|
|
|
struct tcp_segment
|
|
|
|
|
{
|
|
|
|
|
uint32_t len;
|
|
|
|
|
const void *data;
|
|
|
|
|
struct tcp_segment *next;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct session *packet_exdata_to_session(const struct session_manager *sess_mgr, const struct packet *pkt);
|
|
|
|
|
struct tcp_segment *packet_exdata_to_tcp_segment(const struct session_manager *sess_mgr, const struct packet *pkt);
|
|
|
|
|
/*
|
|
|
|
|
* example how to use tcp_segment
|
|
|
|
|
*
|
|
|
|
|
* struct tcp_segment *seg = packet_exdata_to_tcp_segment(sess_mgr, pkt);
|
|
|
|
|
* while (seg)
|
|
|
|
|
* {
|
|
|
|
|
* do_something(seg->data, seg->len);
|
|
|
|
|
* seg = seg->next;
|
|
|
|
|
* }
|
|
|
|
|
*/
|
2024-10-25 14:38:51 +08:00
|
|
|
|
2024-04-21 11:30:41 +08:00
|
|
|
#ifdef __cplusplus
|
2024-04-10 11:40:26 +08:00
|
|
|
}
|
|
|
|
|
#endif
|