diff --git a/CMakeLists.txt b/CMakeLists.txt index 06ca7c995..e39033656 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -118,6 +118,14 @@ SET(EQEMU_DEBUG_LEVEL 5 CACHE STRING "EQEmu debug level: 10 - More errors than you ever wanted to see" ) +SET(EQEMU_STREAM_SEND_RATE 1048576 CACHE STRING "Advanced: Base amount of data stream can send before throttle.") +SET(EQEMU_STREAM_DECAY_RATE 78642 CACHE STRING "Advanced: Base amount of data stream recovers per tic.") +SET(EQEMU_STREAM_RETRANSMIT_TIMEOUT_MUL 3.0 CACHE STRING "Advanced: Multiplier on retransmit timeout.") +SET(EQEMU_STREAM_RETRANSMIT_TIMEOUT_MAX 5000 CACHE STRING "Advanced: Max in ms for retransmit timeout timer.") +SET(EQEMU_STREAM_AVERAGE_DELTA_MAX 2500 CACHE STRING "Advanced: The maximum average delta in ms allowed.") +SET(EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS TRUE CACHE BOOL "Advanced: Whether or not acked packets can be retransmitted") +MARK_AS_ADVANCED(EQEMU_STREAM_SEND_RATE EQEMU_STREAM_DECAY_RATE EQEMU_STREAM_RETRANSMIT_TIMEOUT_MUL EQEMU_STREAM_RETRANSMIT_TIMEOUT_MAX EQEMU_STREAM_AVERAGE_DELTA_MAX EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS) + #NPC Types Cache Behavior OPTION(EQEMU_DEPOP_INVALIDATES_CACHE "#repop invalidates the npc_types cache (will cause a larger database hit on #repop but is more convienent)." ON) @@ -169,6 +177,16 @@ ADD_DEFINITIONS(-DEQDEBUG=${EQEMU_DEBUG_LEVEL}) ADD_DEFINITIONS(-DINVERSEXY) ADD_DEFINITIONS(-DFIELD_ITEMS) ADD_DEFINITIONS(-DMAP_DIR="./Maps") +ADD_DEFINITIONS(-DRATEBASE=${EQEMU_STREAM_SEND_RATE}) +ADD_DEFINITIONS(-DDECAYBASE=${EQEMU_STREAM_DECAY_RATE}) +ADD_DEFINITIONS(-DRETRANSMIT_TIMEOUT_MULT=${EQEMU_STREAM_RETRANSMIT_TIMEOUT_MUL}) +ADD_DEFINITIONS(-DRETRANSMIT_TIMEOUT_MAX=${EQEMU_STREAM_RETRANSMIT_TIMEOUT_MAX}) +ADD_DEFINITIONS(-DAVERAGE_DELTA_MAX=${EQEMU_STREAM_AVERAGE_DELTA_MAX}) +IF(EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS) + ADD_DEFINITIONS(-DRETRANSMIT_ACKED_PACKETS=true) +ELSE(EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS) + ADD_DEFINITIONS(-DRETRANSMIT_ACKED_PACKETS=false) +ENDIF(EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS) #Find everything we need FIND_PACKAGE(ZLIB REQUIRED) diff --git a/common/EQStream.h b/common/EQStream.h index 244ed1924..97d304642 100644 --- a/common/EQStream.h +++ b/common/EQStream.h @@ -21,13 +21,29 @@ #define FLAG_COMPRESSED 0x01 #define FLAG_ENCODED 0x04 -#define RATEBASE 1048576 // 1 MB -#define DECAYBASE 78642 // RATEBASE/10 +#ifndef RATEBASE +#define RATEBASE 1048576 +#endif +#ifndef DECAYBASE +#define DECAYBASE 78642 +#endif + +#ifndef RETRANSMIT_TIMEOUT_MULT #define RETRANSMIT_TIMEOUT_MULT 3.0 +#endif + +#ifndef RETRANSMIT_TIMEOUT_MAX #define RETRANSMIT_TIMEOUT_MAX 5000 +#endif + +#ifndef AVERAGE_DELTA_MAX #define AVERAGE_DELTA_MAX 2500 +#endif + +#ifndef RETRANSMIT_ACKED_PACKETS #define RETRANSMIT_ACKED_PACKETS true +#endif #pragma pack(1) struct SessionRequest { @@ -62,9 +78,6 @@ struct SessionStats { #pragma pack() class OpcodeManager; -//extern OpcodeManager *EQNetworkOpcodeManager; - -//class EQStreamFactory; class EQStreamPair; class EQRawApplicationPacket; @@ -142,8 +155,6 @@ class EQStream : public EQStreamInterface { OpcodeManager **OpMgr; -// EQStreamFactory *const Factory; - EQRawApplicationPacket *MakeApplicationPacket(EQProtocolPacket *p); EQRawApplicationPacket *MakeApplicationPacket(const unsigned char *buf, uint32 len); EQProtocolPacket *MakeProtocolPacket(const unsigned char *buf, uint32 len); @@ -167,8 +178,6 @@ class EQStream : public EQStreamInterface { void SetSession(uint32 s) { Session=s; } void ProcessPacket(EQProtocolPacket *p); -// virtual void DispatchPacket(EQApplicationPacket *p) { p->DumpRaw(); } - bool Stale(uint32 now, uint32 timeout=30) { return (LastPacket && (now-LastPacket) > timeout); } @@ -190,7 +199,6 @@ class EQStream : public EQStreamInterface { EQStream() { init(); remote_ip = 0; remote_port = 0; State=UNESTABLISHED; StreamType=UnknownStream; compressed=true; encoded=false; app_opcode_size=2; bytes_sent=0; bytes_recv=0; create_time=Timer::GetTimeSeconds(); } EQStream(sockaddr_in addr) { init(); remote_ip=addr.sin_addr.s_addr; remote_port=addr.sin_port; State=UNESTABLISHED; StreamType=UnknownStream; compressed=true; encoded=false; app_opcode_size=2; bytes_sent=0; bytes_recv=0; create_time=Timer::GetTimeSeconds(); } virtual ~EQStream() { RemoveData(); SetState(CLOSED); } -// inline void SetFactory(EQStreamFactory *f) { Factory=f; } void SetMaxLen(uint32 length) { MaxLen=length; } //interface used by application (EQStreamInterface) @@ -219,10 +227,8 @@ class EQStream : public EQStreamInterface { inline EQStreamState GetState() { EQStreamState s; MState.lock(); s=State; MState.unlock(); return s; } -// static EQProtocolPacket *Read(int eq_fd, sockaddr_in *from); static SeqOrder CompareSequence(uint16 expected_seq , uint16 seq); -// void Close() { SendDisconnect(); } bool CheckActive() { return GetState()==ESTABLISHED; } bool CheckClosed() { return GetState()==CLOSED; } void SetOpcodeSize(uint8 s) { app_opcode_size = s; }