#ifndef __TYPHOON_DEFINE_C__H__ #define __TYPHOON_DEFINE_C__H__ #include "uv.h" #include "YyAuthenticationManageFile.h" #ifdef __cplusplus extern "C" { #endif #ifndef SOCKADDR typedef struct sockaddr SOCKADDR; #endif //ChannelID 宏定义 #define TYPHOON_INVALID_CHANNEL_ID 0xffff //无效的channelID #define TYPHOON_DEFAULT_CHANNEL_ID 0 //连接创建成功后的默认channelID #define TYPHOON_INVALID_HANDLE 0 #define CCMODE_DROPRATE 0 //只使用丢包率作为拥塞控制输入 #define CCMODE_RTT 1 //只使用RTT作为拥塞控制输入 #define CCMODE_DROPRATE_AND_RTT 2 //使用丢包率和RTT作为拥塞控制输入 #define CCMODE_LOW_PRIORITY 3 //低优先级流量算法 #define TYPHOON_INVALID_CCMODE 255 //无效的CCMODE #define MAX_HASH_KEY_LEN 32 //hash秘钥最大长度 #define MAX_TYPHOON_HOST_LEN 128 //host字符串最大长度 #define MAX_TYPHOON_USERNAME_LEN 128 //用户名最大长度 #define MAX_TYPHOON_PASSWORD_LEN 128 //用户名最大长度 typedef void * HTyphoonChannel; typedef void * HTyphoonConn; typedef void * HTyphoon; typedef void * HTyPhoonConnCallBack; typedef void * HTyphoonBuff; typedef void * HTyphoonFecTun; typedef void (*Typhoon_Logger)(char* str); typedef void (*Typhoon_LevelLogger)(int level, char* str); typedef void (*TyphonnConn_TraverseChannels_Cb_C)(HTyphoonConn Conn, HTyphoonChannel Channel, void* arg); typedef int (*Typhoon_SynchronizedExecute_Cb)(void* arg); typedef void (*Typhoon_Logger_Flush)(); typedef enum TYPHOON_ERROCODE { //errocode : 0,成功,1失败超时 TYPHOON_CON_SUCCEED = 0, TYPHOON_CON_TIMEOUT, TYPHOON_CON_BUTT, TYPHOON_CON_NETWORK_ERROR // 网络异常 }enTyphoonErr; typedef enum TYPHOON_DISCONNECT_CAUSE { TYPHOON_REMOTE_DISCONNECT = 0, TYPHOON_TIMEOUT_DISCONNECT = 1, TYPHOON_MTU_RESET = 2, TYPHOON_INVALID_AK = 3, //不合法的客户端, 用于授权 TYPHOON_IN_BLACKLIST = 4, //客户端IP在黑名单中或不在白名单中 TYPHOON_DISCONNECT_BUTT }enTyphoonDisconnectCause; //channel断开状态码 typedef enum TYPHOON_CHANNEL_CLOSE_TYPE { TYPHOON_CHANNEL_CLOSE_NORMAL = 0, //对端主动CloseChannel导致的channel断开 TYPHOON_CHANNEL_CLOSE_RESET, //对端channel已经异常关闭导致的channel断开 TYPHOON_CHANNEL_CLOSE_INFO, //正常shutdown后, channel进入close状态前的通知 TYPHOON_CHANNEL_CLOSE_BUTT }enChannelCloseType; typedef enum TYPHOON_COMPRESS_METHOD { TYPHOON_COMPRESS_NONE = 0, //不支持压缩 TYPHOON_COMPRESS_ZSTD = 0x01, //支持ZSTD TYPHOON_COMPRESS_ZLIB = 0x02, //支持ZLIB TYPHOON_COMPRESS_RESERVE2 = 0x04, //保留值, 用于后续扩充 TYPHOON_COMPRESS_RESERVE3 = 0x08, TYPHOON_COMPRESS_RESERVE4 = 0x10, TYPHOON_COMPRESS_RESERVE5 = 0x20, TYPHOON_COMPRESS_RESERVE6 = 0x40, TYPHOON_COMPRESS_RESERVE7 = 0x80 }enTyphoonCompressMethod; enum tagTYPHOON_LOGLEVEL { TYPHOON_INFO = 20, TYPHOON_NOTICE = 40, TYPHOON_DEBUG = 60, TYPHOON_WARN = 80, TYPHOON_ERROR = 100, TYPHOON_FATAL = 120, TYPHOON_BUTT }; typedef enum TYPHOON_SDNPATH_TYPE { TYPHOON_SDN_RELAY = 0, TYPHOON_SDN_DIRECT = 1, TYPHOON_SDN_TCP_TUNNLE = 2, TYPHOON_SDNTYPE_BUTT }enTyphoonSDNPathType; typedef struct TyphoonTimerConfig { int32_t TryConnectTime; int32_t HandShakeTime; int32_t ConnBrokenTime; }stTyphoonTimerConfig; struct TyphoonConnStats //1条连接的统计信息 { /* Rx */ int64_t m_dwRead; //当前接收到的数据长度,已经确认的 int64_t m_ReadCount; //当前接收到的包数,已经确认的 int64_t m_dwDumpCount; //收到的重包数 int64_t m_dwDumpSize; //收到的重包大小 int64_t m_dwOutRange; //收到的不在接收窗口中的包数 int64_t m_dwOutRangeSize; //收到的不在接收窗口中的包大小 int64_t m_AppRxTraffic; //实际接收到的应用层报文流量大小, 当数据被压缩时, 网络流量小于应用层报文原始大小 int64_t m_RecvResendCount; //收到的重发报文数量 int64_t m_RecvResendSize; //收到的重发报文数量 int64_t m_RxFecDataSize; //收到的Fec数据大小 int64_t m_RxFecDataCount; //收到的Fec报文数量 int64_t m_RxFecRecoverDataSize; //通过FEC恢复出的数据数量 int64_t m_RxFecRecoverDataCount; //通过FEC恢复出的数据个数 int64_t m_RxErrorFecCount; //Fec解码错误次数统计 int64_t m_RxFecOutRangeCount; //Fec解码成功后, 恢复的数据不在接收窗口内次数统计 int64_t m_RxFecDumpCount; //Fec解码成功后, 恢复的数据已经收到重复次数统计 int64_t m_RxFecNoDecoderpCount; //Fec原始数据, 无法找到Decoder的统计(原因为FecRecover报文丢失了) int64_t m_RxDelayedDataCount; //数据的部分报文由于丢失重传, 比未丢失报文的数据达到时间要晚的数量 int64_t m_RxFecMismatchDecoderCount; int64_t m_RxFecErrorSegindex; int64_t m_RxFecDataLateCount; /* Tx */ int64_t m_dwWrite; //当前接发送的数据长度,已经确认的 int64_t m_Checked; //已经确认的包数, ACK+SACK int64_t m_SendTotalCount; //总共发送的总包数,包括重传部分 int64_t m_ReSendCount; //快速重传的包数 int32_t m_rtt; //连接的RTT int32_t m_minrtt; //连接的最小RTT int64_t m_AppTxTraffic; //记录应用层Send接口的数据流量大小 int64_t m_TxFecDataSize; //发出的Fec数据大小 int64_t m_TxFecDataCount; //发出的Fec报文数量 int32_t m_TxDropCount; //模拟丢包功能丢失的报文数量 }; typedef struct TyphoonCfg { Typhoon_Logger Log; //Typhoon内部日志输出接口, 如果不设置则无日志输出 Typhoon_LevelLogger pfnLevelLogger; //Typhoon内部日志输出接口, 如果不设置则无日志输出 uint32_t UdpSocketSendBuffSize; //Typhoon实例的UDP socket发送缓存大小, 1个Typhoon实例绑定1个UDP socket, 由该实例所有连接共用; //默认值为1MB, 发送缓冲区大小建议不小于1MB uint32_t UdpSocketRecvBuffSize; //Typhoon实例的UDP socket接收缓存大小, 1个Typhoon实例绑定1个UDP socket, 由该实例所有连接共用; //默认值为1MB, 接收缓冲区大小建议不小于1MB uint16_t PackCountTriggerAck; //收到多少个数据报文触发一次ACK, 默认为250个 uint8_t LoopInterval; //Typhoon内部调度间隔, 默认为10毫秒 uint8_t AckInterval; //客户端最大ACK响应间隔时间, 默认为50毫秒 uint8_t NoLockMode; //如果Typhoon应用与Typhoon协议栈运行在同一个线程中, 此处设置为1, 双方的数据传递可以不使用锁 //默认为0, 即双方的数据传递会使用锁 uint8_t HightSpeedMode; //是否为HightSpeedMode, 默认为0 uint8_t CCMode; //拥塞控制模式. 0使用丢包率, 1使用RTT, 2使用丢包率+时延 uint16_t ResistDropRate; //可抵抗的丢包率. 这里使用万分制比列表示, 默认为250, 即万分之250 --> 2.5% uint8_t IOThreadNum; //Typhoon Socket I/O线程数量, 默认为1, 最大可以设置为2 uint8_t ResendCheckTime; //在进行报文重发时, 需要确认报文上次发送时间到重发时是否大于RTT+1个缓冲时间, 默认值为10毫秒 uint8_t UdpGSO; //是否启用UDP GSO, UDP GSO在Linux内核4.18后才支持CentOS 8.0支持 uint8_t BindCpu; //是否启用CPU绑定, 默认为0不启用 uint32_t LogLevel; //日志输出级别, 只有大于指定级别才输出日志, 默认为DEBUG(60) Typhoon_Logger_Flush Flush; }stTyphoonCfg; typedef struct TyphoonConnCfg { uint32_t MaxQueueSize; //Max Size of Typhoon connection send and recv queue size uint32_t FixedSendSpeed; //连接的固定发送速度, 默认为0表示不设置, 由typhoon自动探测发送速度; //如该值设置后, typhoon内部发送速度探测算法不再生效, 连接每秒发送速度的按照用户设置值进行 uint32_t MaxSendSpeed; //连接的最大发送速度, 默认为0表示不设置; //如该选项进行了设置, 发送实时速度依然由typhoon内部算法决定, 但是连接最大的速度不能超过本设置值 uint32_t MinSendSpeed; //如该选项进行了设置, Typhoon的发送速度不低于该值 uint16_t MaxChannelSize; //每条连接可以建立的channel数量 uint16_t MaxSegmentSize; //Typhonn协议每个报文的最大值 uint32_t SendBuffSize; //连接发送缓存大小, 这个配置仅影响初始发送缓冲值, typhoon算法会自动计算发送缓存大小最优值, 以保证发送效率 uint32_t RecvBuffSize; //连接接收缓存大小 uint8_t UseThreadForAppDataCb; //配置当前连接是否使用额外的线程执行用户数据通知回调, 默认为1, 即使用 //取值范围[0, 1] uint8_t CompressMethod; //连接支持的压缩方法, 可以设置为支持1种或多种方法, 通过enTyphoonCompressMethod的值 | 得到结果 uint8_t TransferMode; //连接传输模式, 分为文件传输模式0, 实时传输模式1, 默认为0 uint8_t UseDataPush; //取值范围[0, 1]: 1 PushData, 0 PullData. 当数据达到时, PushData的方式是调用OnRead回调, 非PushData(PullData)的方式是调用OnDataArrived回调 //两种方式没有本质区别, 区别在于OnRead回调让用户必须立刻马上处理这个数据, 而OnDataArrived只是通知用户数据达到了, 用户可以选择马上处理或者不马上处理 uint8_t m_checkFlag; //0:不开启校验;1:开启 xxHash 校验 }stTyphoonConnCfg; typedef struct TyphoonProxyLicense{ uint8_t version; uint16_t clientNum; //允许接入的客户端数量,0表示无限制 uint16_t clientLicenseLevel; //允许接入的客户端的带宽,单位Mbps,0表示无限制 uint32_t flow; //流量,包括上行和下行流量,单位G,0表示无限制 }sTyphoonProxyLicense; typedef int32_t (*Typhoon_AppInit_Callback)(); typedef void (*Typhoon_AppUninit_Callback)(); typedef void (*TyphoonConn_OnConnected)(HTyphoonConn pConn, enTyphoonErr erro, uint8_t *data, uint16_t data_len); typedef void (*TyphoonConn_OnDisconnected)(HTyphoonConn pConn, enTyphoonDisconnectCause cause); typedef void (*TyphoonConn_OnRead)(HTyphoonConn pConn, HTyphoonChannel pChan,uint8_t* pData,int32_t len); typedef void (*TyphoonConn_OnWritable)(HTyphoonConn pConn, HTyphoonChannel pChan); typedef void (*TyphoonConn_OnSentDataAcknowledged)(HTyphoonConn pConn, HTyphoonChannel pChan, int32_t ackLen); typedef void (*TyphoonConn_OnDataArriveNotify)(HTyphoonConn pConn, HTyphoonChannel pChan); typedef void (*TyphoonConn_OnChannelOpen)(HTyphoonConn pConn, HTyphoonChannel pChan); typedef void (*TyphoonConn_OnChannelClose)(HTyphoonConn pConn, HTyphoonChannel pChan, enChannelCloseType closeType); typedef void (*TyphoonConn_OnAuthChange)(HTyphoonConn pConn, sTyphoonProxyLicense *license); typedef void (*TyphoonConn_OnFecTunOpen)(HTyphoonConn pConn, HTyphoonFecTun pTun); typedef void (*TyphoonConn_OnFecTunClose)(HTyphoonConn pConn, HTyphoonFecTun pTun); typedef uint32_t (*TyphoonConn_OnTimer)(HTyphoonConn pConn); typedef void (*TyphoonConn_OnSDNRouteChange)(HTyphoonConn pConn, enTyphoonSDNPathType type); typedef struct __TyPhoonConnCallBack { TyphoonConn_OnConnected pfnOnConnected; TyphoonConn_OnDisconnected pfnOnDisconnected; TyphoonConn_OnRead pfnOnRead; TyphoonConn_OnWritable pfnWritable; TyphoonConn_OnSentDataAcknowledged pfnOnSentDataAcknowledged; TyphoonConn_OnDataArriveNotify pfnOnDataArriveNotify; TyphoonConn_OnChannelOpen pfnOnChannelOpen; TyphoonConn_OnChannelClose pfnOnChannelClose; TyphoonConn_OnAuthChange pfnOnAuthChange; TyphoonConn_OnTimer pfnOnTimer; TyphoonConn_OnSDNRouteChange pfnOnSDNRouteChange; }stTyPhoonConnCallBack; typedef struct __Socks5Config { char server[MAX_TYPHOON_HOST_LEN]; //代理服务器ip或域名 uint16_t port; //代理服务器端口 char username[MAX_TYPHOON_USERNAME_LEN]; //代理服务器用户名 char password[MAX_TYPHOON_PASSWORD_LEN]; //代理服务器密码 }stTyphoonSocks5Config; #ifdef __cplusplus } #endif #endif