#ifndef LTSM_H_ #define LTSM_H_ #include #include #include #include "mesa_net.h" /* LTSM : Light TCP State Machine. */ /* RFC标准TCP协议栈状态机定义 */ enum full_tcp_state{ FTSM_CLOSED, FTSM_LISTEN, FTSM_SYN_SENT, FTSM_SYN_RCVD, FTSM_ESTABLISHED, FTSM_CLOSE_WAIT, FTSM_LAST_ACK, FTSM_FIN_WAIT1, FTSM_FIN_WAIT2, FTSM_CLOSING, FTSM_TIME_WAIT, }; /* 轻量TCP状态机定义, 只有三种状态:新建连接, 传输数据, 结束连接, 每个流必定包括1个START和1个CLOSE状态, 可能包括0或若干个DATA状态. */ enum light_tcp_state{ LTSM_START, LTSM_DATA, LTSM_CLOSE, LTSM_INVALID, }; enum light_tsm_opt{ LTSMO_THREAD_NUM, /* 线程总数, 选项类型:uint32 */ LTSMO_CREATE_MODE, /* 流创建模式, 1:必须包含SYN; 2:任意数据包可触发, 选项类型:uint32 */ LTSMO_MAX_STREAM_NUM, /* TCP最大并发流表数, for每个线程, 选项类型:uint32 */ LTSMO_STREAM_TIMEOUT, /* 流超时淘汰时间, 单位:秒, 0表示不超时. 选项类型:uint32 */ }; struct ltsm_result{ enum full_tcp_state fstate; enum light_tcp_state lstate; void *pme; }; typedef void * ltsm_global_handle; typedef void * ltsm_stream_handle; /* ltsm全局句柄初始化 */ void *ltsm_init(void); /* ltsm设置相关参数 */ int ltsm_set_opt(ltsm_global_handle pltsm, enum light_tsm_opt opt, void *value, int value_len); /* ltsm启动 */ int ltsm_run(ltsm_global_handle pltsm); /* IPv4包处理, 返回当前包触发的ltsm状态机结果, pme用于外部调用者存储自定义数据, 内存需自行申请或释放 */ struct ltsm_result *ltsm_proc_ip4pkt(ltsm_global_handle pltsm, int tseq, const struct ip *ip4hdr); /* IPv4包头+TCP包头处理, 返回当前包触发的ltsm状态机结果, pme用于外部调用者存储自定义数据, 内存需自行申请或释放 */ struct ltsm_result *ltsm_proc_ip4tcppkt(ltsm_global_handle pltsm, int tseq, const struct ip *ip4hdr, const struct tcphdr *tcp_hdr); /* IPv6包处理, 返回当前包触发的ltsm状态机结果, pme用于外部调用者存储自定义数据, 内存需自行申请或释放 */ struct ltsm_result *ltsm_proc_ip6pkt(ltsm_global_handle pltsm, int tseq, const struct ip6_hdr *ip6hdr); /* IPv6包头+TCP包头处理, 返回当前包触发的ltsm状态机结果, pme用于外部调用者存储自定义数据, 内存需自行申请或释放 */ struct ltsm_result *ltsm_proc_ip6tcppkt(ltsm_global_handle pltsm, int tseq, const struct ip6_hdr *ip6hdr, const struct tcphdr *tcp_hdr); uint8_t ltsm_proc_ipv4tcppkt(ltsm_stream_handle s_ltsm, const struct mesa_ip4_hdr *iphdr); void ltsm_destroy_stream_handle(ltsm_stream_handle s_ltsm); #endif