#ifndef _SCE_H #define _SCE_H #ifdef __cpluscplus extern "C" { #endif #include #include "policy.h" #include "timestamp.h" #include "packet_io.h" #include "session_table.h" #include "global_metrics.h" #define MAX_THREAD_NUM 128 /****************************************************************************** * Struct Thread Ctx ******************************************************************************/ struct thread_ctx { pthread_t tid; int thread_index; struct sf_metrics *sf_metrics; struct session_table *session_table; struct packet_io *ref_io; struct sce_ctx *ref_sce_ctx; struct thread_metrics thread_metrics; struct global_metrics *ref_global_metrics; struct policy_enforcer *ref_enforcer; int session_table_need_reset; int thread_is_runing; uint64_t tx_packets_ipid; }; /****************************************************************************** * Struct Metadata ******************************************************************************/ struct metadata { int write_ref; uint64_t session_id; uint32_t rehash_index; char *raw_data; // refer to current packet data int raw_len; uint16_t l7offset; int direction; // 1: E2I; 0: I2E int is_ctrl_pkt; int is_decrypted; struct sids sids; struct route_ctx route_ctx; }; int metadata_isempty(struct metadata *meta); void metadata_copy(struct metadata *dst, struct metadata *src); char *memdup(const char *src, int len); /****************************************************************************** * Struct Session Ctx ******************************************************************************/ struct session_ctx { uint64_t session_id; char *session_addr; // dup from received control packet, for sending control packet char *ctrl_packet_header_data; uint16_t ctrl_packet_header_len; uint16_t vxlan_src_port; struct four_tuple inner_tuple4; struct mutable_array rule_ids; struct metadata decrypted_meta_i2e; struct metadata decrypted_meta_e2i; struct metadata raw_meta_i2e; struct metadata raw_meta_e2i; struct metadata ctrl_meta; struct selected_chaining *chaining_raw; struct selected_chaining *chaining_decrypted; struct thread_ctx *ref_thread_ctx; }; struct session_ctx *session_ctx_new(); void session_ctx_free(struct session_ctx *ctx); /****************************************************************************** * Struct SCE Ctx ******************************************************************************/ struct sce_ctx { int enable_debug; int enable_send_log; int firewall_sids; int nr_worker_threads; int ts_update_interval_ms; int cpu_affinity_mask[MAX_THREAD_NUM]; cpu_set_t coremask; struct timestamp *ts; struct packet_io *io; struct global_metrics *metrics; struct policy_enforcer *enforcer; struct thread_ctx work_threads[MAX_THREAD_NUM]; }; struct sce_ctx *sce_ctx_create(const char *profile); void sce_ctx_destory(struct sce_ctx *ctx); #ifdef __cpluscplus } #endif #endif