12#define PROTOCOL_ID 0x4f457403
14#define MAX_UDP_PEERS 65535
32#define BASE_HEADER_SIZE 7
33#define CHANNEL_COUNT 3
61#define ORIGINAL_HEADER_SIZE 1
90#define RELIABLE_HEADER_SIZE 3
91#define SEQNUM_INITIAL 65500
92#define SEQNUM_MAX 65535
102 const T*
get() const noexcept {
return ptr.get(); }
146 u16 window_start = next;
147 u16 window_end = ( next + window_size ) % (
SEQNUM_MAX+1);
149 if (window_start < window_end) {
150 return ((seqnum >= window_start) && (seqnum < window_end));
154 return ((seqnum < window_end) || (seqnum >= window_start));
159 float value = (curtime - lasttime) / 1000.0f;
223 u32 protocol_id,
session_t sender_peer_id, u8 channel);
275 std::vector<ConstSharedPtr<BufferedPacket>>
getResend(
float timeout, u32 max_packets);
313 std::map<u16, IncomingSplitPacket*>
m_buf;
374#define MAX_RELIABLE_WINDOW_SIZE 0x8000
375#define MAX_RELIABLE_WINDOW_SIZE_SEND 2048
377#define START_RELIABLE_WINDOW_SIZE 64
379#define MIN_RELIABLE_WINDOW_SIZE 32
495 unsigned int max_packet_size)
override;
505 bool reliable)
override;
507 bool isTimedOut(
float timeout, std::string &reason)
override;
517 unsigned int max_packet_size,
518 unsigned int maxtransfer);
536 unsigned int max_packet_size);
#define DISABLE_CLASS_COPY(C)
Definition basic_macros.h:26
#define MYMIN(a, b)
Definition basic_macros.h:9
#define MYMAX(a, b)
Definition basic_macros.h:11
Definition exceptions.h:12
const T * operator->() const noexcept
Definition internal.h:104
const T & operator*() const noexcept
Definition internal.h:103
ConstSharedPtr(T *ptr)
Definition internal.h:99
std::shared_ptr< T > ptr
Definition internal.h:107
const T * get() const noexcept
Definition internal.h:102
ConstSharedPtr(const std::shared_ptr< T > &ptr)
Definition internal.h:100
Definition networkpacket.h:16
Definition internal.h:382
void UpdateBytesLost(unsigned int bytes)
Definition impl.cpp:720
u16 getOutgoingSequenceNumber(bool &successful)
Definition impl.cpp:653
u16 m_window_size
Definition internal.h:452
unsigned int current_packet_loss
Definition internal.h:459
void UpdatePacketTooLateCounter()
Definition impl.cpp:733
float getAvgLossRateKB()
Definition internal.h:438
u16 readNextIncomingSeqNum()
Definition impl.cpp:628
float getCurrentLossRateKB()
Definition internal.h:426
float cur_incoming_kbps
Definition internal.h:471
void UpdateTimers(float dtime)
Definition impl.cpp:739
u16 getWindowSize() const
Definition internal.h:443
u16 next_outgoing_split_seqnum
Definition internal.h:457
unsigned int current_packet_too_late
Definition internal.h:460
float bpm_counter
Definition internal.h:476
float avg_incoming_kbps
Definition internal.h:472
float getMaxLossRateKB()
Definition internal.h:428
unsigned int current_packet_successful
Definition internal.h:461
float max_kbps
Definition internal.h:467
float max_incoming_kbps
Definition internal.h:470
float getAvgIncomingRateKB()
Definition internal.h:440
ReliablePacketBuffer outgoing_reliables_sent
Definition internal.h:400
float getAvgDownloadRateKB()
Definition internal.h:436
std::deque< ConnectionCommandPtr > queued_commands
Definition internal.h:406
float getMaxIncomingRateKB()
Definition internal.h:433
void UpdateBytesSent(unsigned int bytes, unsigned int packages=1)
Definition impl.cpp:708
float avg_kbps_lost
Definition internal.h:475
u16 incNextIncomingSeqNum()
Definition impl.cpp:634
bool putBackSequenceNumber(u16)
Definition impl.cpp:698
void UpdateBytesReceived(unsigned int bytes)
Definition impl.cpp:715
ReliablePacketBuffer incoming_reliables
Definition internal.h:397
float packet_loss_counter
Definition internal.h:462
u16 readNextSplitSeqNum()
Definition impl.cpp:642
float max_kbps_lost
Definition internal.h:473
u16 next_incoming_seqnum
Definition internal.h:454
unsigned int current_bytes_transfered
Definition internal.h:464
float avg_kbps
Definition internal.h:469
void setWindowSize(long size)
Definition internal.h:445
IncomingSplitBuffer incoming_splits
Definition internal.h:408
unsigned int current_bytes_lost
Definition internal.h:466
void UpdatePacketLossCounter(unsigned int count)
Definition impl.cpp:727
float getCurrentDownloadRateKB()
Definition internal.h:421
std::mutex m_internal_mutex
Definition internal.h:451
float getMaxDownloadRateKB()
Definition internal.h:423
float getCurrentIncomingRateKB()
Definition internal.h:431
void setNextSplitSeqNum(u16 seqnum)
Definition impl.cpp:647
float cur_kbps
Definition internal.h:468
std::queue< BufferedPacketPtr > queued_reliables
Definition internal.h:403
u16 next_outgoing_seqnum
Definition internal.h:456
unsigned int current_bytes_received
Definition internal.h:465
u16 readOutgoingSequenceNumber()
Definition impl.cpp:692
float cur_kbps_lost
Definition internal.h:474
unsigned int rate_samples
Definition internal.h:478
Definition internal.h:184
IncomingDataCorruption(const char *s)
Definition internal.h:186
Definition internal.h:299
std::mutex m_map_mutex
Definition internal.h:315
std::map< u16, IncomingSplitPacket * > m_buf
Definition internal.h:313
SharedBuffer< u8 > insert(BufferedPacketPtr &p_ptr, bool reliable)
Definition impl.cpp:451
void removeUnreliableTimedOuts(float dtime, float timeout)
Definition impl.cpp:518
~IncomingSplitBuffer()
Definition impl.cpp:443
Definition internal.h:166
NotFoundException(const char *s)
Definition internal.h:168
Address address
Definition impl.h:185
std::mutex m_exclusive_access_mutex
Definition impl.h:178
Definition internal.h:178
ProcessedQueued(const char *s)
Definition internal.h:180
Definition internal.h:172
ProcessedSilentlyException(const char *s)
Definition internal.h:174
Definition internal.h:262
void incrementTimeouts(float dtime)
Definition impl.cpp:353
std::list< BufferedPacketPtr >::iterator FindResult
Definition internal.h:283
u16 m_oldest_non_answered_ack
Definition internal.h:289
BufferedPacketPtr popSeqnum(u16 seqnum)
Definition impl.cpp:221
u32 size()
Definition impl.cpp:180
std::vector< ConstSharedPtr< BufferedPacket > > getResend(float timeout, u32 max_packets)
Definition impl.cpp:374
void fixPeerId(session_t id)
Adjusts the sender peer ID for all packets.
Definition impl.cpp:346
std::mutex m_list_mutex
Definition internal.h:291
BufferedPacketPtr popFirst()
Definition impl.cpp:204
bool empty()
Definition impl.cpp:174
std::list< BufferedPacketPtr > m_list
Definition internal.h:287
void print()
Definition impl.cpp:163
u32 getTimedOuts(float timeout)
Definition impl.cpp:362
void insert(BufferedPacketPtr &p_ptr, u16 next_expected)
Definition impl.cpp:242
FindResult findPacketNoLock(u16 seqnum)
Definition impl.cpp:186
bool getFirstSeqnum(u16 &result)
Definition impl.cpp:195
Definition internal.h:483
bool processReliableSendCommand(ConnectionCommandPtr &c_ptr, unsigned int max_packet_size)
Definition impl.cpp:1071
void setNextSplitSequenceNumber(u8 channel, u16 seqnum) override
Definition impl.cpp:1212
void RunCommandQueues(unsigned int max_packet_size, unsigned int maxtransfer)
Definition impl.cpp:1174
void reportRTT(float rtt) override
Definition impl.cpp:1001
bool isTimedOut(float timeout, std::string &reason) override
Definition impl.cpp:983
void PutReliableSendCommand(ConnectionCommandPtr &c, unsigned int max_packet_size) override
Definition impl.cpp:1040
UDPPeer(session_t id, const Address &address, Connection *connection)
Definition impl.cpp:976
bool m_pending_disconnect
Definition internal.h:529
Channel channels[CHANNEL_COUNT]
Definition internal.h:528
float resend_timeout
Definition internal.h:532
virtual const Address & getAddress() const override
Definition internal.h:497
u16 getNextSplitSequenceNumber(u8 channel) override
Definition impl.cpp:1206
virtual ~UDPPeer()=default
void setResendTimeout(float timeout)
Definition internal.h:523
float getResendTimeout()
Definition internal.h:520
bool Ping(float dtime, SharedBuffer< u8 > &data) override
Definition impl.cpp:1026
SharedBuffer< u8 > addSplitPacket(u8 channel, BufferedPacketPtr &toadd, bool reliable) override
Definition impl.cpp:1218
#define PEER_ID_INEXISTENT
Definition constants.h:19
#define MAX_RELIABLE_WINDOW_SIZE_SEND
Definition internal.h:375
#define SEQNUM_MAX
Definition internal.h:92
#define CHANNEL_COUNT
Definition internal.h:33
#define MIN_RELIABLE_WINDOW_SIZE
Definition internal.h:379
#define SEQNUM_INITIAL
Definition internal.h:91
std::lock_guard< std::mutex > MutexAutoLock
Definition mutex_auto_lock.h:31
ControlType
Definition internal.h:121
@ CONTROLTYPE_DISCO
Definition internal.h:125
@ CONTROLTYPE_PING
Definition internal.h:124
@ CONTROLTYPE_ACK
Definition internal.h:122
@ CONTROLTYPE_SET_PEER_ID
Definition internal.h:123
bool seqnum_in_window(u16 seqnum, u16 next, u16 window_size)
Definition internal.h:144
SharedBuffer< u8 > makeReliablePacket(const SharedBuffer< u8 > &data, u16 seqnum)
Definition impl.cpp:145
PacketType
Definition internal.h:113
@ PACKET_TYPE_CONTROL
Definition internal.h:114
@ PACKET_TYPE_RELIABLE
Definition internal.h:117
@ PACKET_TYPE_MAX
Definition internal.h:118
@ PACKET_TYPE_SPLIT
Definition internal.h:116
@ PACKET_TYPE_ORIGINAL
Definition internal.h:115
void makeAutoSplitPacket(const SharedBuffer< u8 > &data, u32 chunksize_max, u16 &split_seqnum, std::list< SharedBuffer< u8 > > *list)
Definition impl.cpp:131
ConnectionCommandType
Definition internal.h:318
@ CONNCMD_RESEND_ONE
Definition internal.h:328
@ CONNCMD_CONNECT
Definition internal.h:321
@ CONNCMD_PEER_ID_SET
Definition internal.h:329
@ CONNCMD_SEND
Definition internal.h:324
@ CONNCMD_SERVE
Definition internal.h:320
@ CONNCMD_DISCONNECT_PEER
Definition internal.h:323
@ CONNCMD_SEND_TO_ALL
Definition internal.h:325
@ CONNCMD_NONE
Definition internal.h:319
@ CONCMD_CREATE_PEER
Definition internal.h:327
@ CONNCMD_DISCONNECT
Definition internal.h:322
@ CONCMD_ACK
Definition internal.h:326
std::shared_ptr< BufferedPacket > BufferedPacketPtr
Definition impl.h:91
float CALC_DTIME(u64 lasttime, u64 curtime)
Definition internal.h:157
std::shared_ptr< ConnectionCommand > ConnectionCommandPtr
Definition impl.h:88
BufferedPacketPtr makePacket(const Address &address, const SharedBuffer< u8 > &data, u32 protocol_id, session_t sender_peer_id, u8 channel)
Definition impl.cpp:62
bool seqnum_higher(u16 totest, u16 base)
Definition internal.h:128
u16 session_t
Definition networkprotocol.h:27
constexpr T rangelim(const T &d, const T2 &min, const T3 &max)
Definition numeric.h:20
Definition internal.h:195
u8 * data
Definition internal.h:209
Address address
Definition internal.h:213
void setSenderPeerId(session_t id)
Definition impl.cpp:53
size_t size() const
Definition internal.h:207
u64 absolute_send_time
Definition internal.h:212
unsigned int resend_count
Definition internal.h:214
float time
Definition internal.h:210
std::vector< u8 > m_data
Definition internal.h:217
u16 getSeqnum() const
Definition impl.cpp:45
float totaltime
Definition internal.h:211
BufferedPacket(u32 a_size)
Definition internal.h:196
Definition internal.h:334
static ConnectionCommandPtr connect(Address address)
Definition impl.cpp:557
static ConnectionCommandPtr ack(session_t peer_id, u8 channelnum, const Buffer< u8 > &data)
Definition impl.cpp:603
static ConnectionCommandPtr create(ConnectionCommandType type)
Definition impl.cpp:545
static ConnectionCommandPtr disconnect_peer(session_t peer_id)
Definition impl.cpp:569
u8 channelnum
Definition internal.h:338
static ConnectionCommandPtr createPeer(session_t peer_id, const Buffer< u8 > &data)
Definition impl.cpp:613
Buffer< u8 > data
Definition internal.h:339
static ConnectionCommandPtr peer_id_set(session_t own_peer_id)
Definition impl.cpp:585
Address address
Definition internal.h:336
bool reliable
Definition internal.h:340
ConnectionCommand(ConnectionCommandType type_)
Definition internal.h:356
static ConnectionCommandPtr disconnect()
Definition impl.cpp:564
bool raw
Definition internal.h:341
static ConnectionCommandPtr send(session_t peer_id, u8 channelnum, NetworkPacket *pkt, bool reliable)
Definition impl.cpp:592
session_t peer_id
Definition internal.h:337
const ConnectionCommandType type
Definition internal.h:335
static ConnectionCommandPtr resend_one(session_t peer_id)
Definition impl.cpp:576
DISABLE_CLASS_COPY(ConnectionCommand)
static ConnectionCommandPtr serve(Address address)
Definition impl.cpp:550
Definition internal.h:234
u32 chunk_count
Definition internal.h:241
bool allReceived() const
Definition internal.h:244
SharedBuffer< u8 > reassemble()
Definition impl.cpp:417
IncomingSplitPacket(u32 cc, bool r)
Definition internal.h:235
IncomingSplitPacket()=delete
bool reliable
Definition internal.h:242
bool insert(u32 chunk_num, SharedBuffer< u8 > &chunkdata)
Definition impl.cpp:401
std::map< u16, SharedBuffer< u8 > > chunks
Definition internal.h:253
float time
Definition internal.h:240