28#define MAX_UDP_PEERS 65535
46#define BASE_HEADER_SIZE 7
47#define CHANNEL_COUNT 3
82#define ORIGINAL_HEADER_SIZE 1
113#define RELIABLE_HEADER_SIZE 3
114#define SEQNUM_INITIAL 65500
115#define SEQNUM_MAX 65535
147 u16 window_start = next;
148 u16 window_end = ( next + window_size ) % (
SEQNUM_MAX+1);
150 if (window_start < window_end) {
151 return ((seqnum >= window_start) && (seqnum < window_end));
155 return ((seqnum < window_end) || (seqnum >= window_start));
160 float value = (curtime - lasttime) / 1000.0f;
197 u32 protocol_id,
session_t sender_peer_id, u8 channel);
247 std::vector<ConstSharedPtr<BufferedPacket>>
getResend(
float timeout, u32 max_packets);
285 std::map<u16, IncomingSplitPacket*>
m_buf;
336#define MAX_RELIABLE_WINDOW_SIZE 0x8000
338#define START_RELIABLE_WINDOW_SIZE 0x400
340#define MIN_RELIABLE_WINDOW_SIZE 0x40
456 unsigned int max_packet_size)
override;
466 bool reliable)
override;
468 bool isTimedOut(
float timeout, std::string &reason)
override;
478 unsigned int max_packet_size,
479 unsigned int maxtransfer);
497 unsigned int max_packet_size);
#define DISABLE_CLASS_COPY(C)
Definition: basic_macros.h:35
#define MYMIN(a, b)
Definition: basic_macros.h:24
#define MYMAX(a, b)
Definition: basic_macros.h:26
Definition: networkpacket.h:27
Definition: pointer.h:162
Definition: connection_internal.h:343
void UpdateBytesLost(unsigned int bytes)
Definition: connection.cpp:715
u16 getOutgoingSequenceNumber(bool &successful)
Definition: connection.cpp:648
u16 m_window_size
Definition: connection_internal.h:413
unsigned int current_packet_loss
Definition: connection_internal.h:420
void UpdatePacketTooLateCounter()
Definition: connection.cpp:728
float getAvgLossRateKB()
Definition: connection_internal.h:399
u16 readNextIncomingSeqNum()
Definition: connection.cpp:623
float getCurrentLossRateKB()
Definition: connection_internal.h:387
float cur_incoming_kbps
Definition: connection_internal.h:432
void UpdateTimers(float dtime)
Definition: connection.cpp:734
u16 getWindowSize() const
Definition: connection_internal.h:404
u16 next_outgoing_split_seqnum
Definition: connection_internal.h:418
unsigned int current_packet_too_late
Definition: connection_internal.h:421
float bpm_counter
Definition: connection_internal.h:437
float avg_incoming_kbps
Definition: connection_internal.h:433
float getMaxLossRateKB()
Definition: connection_internal.h:389
unsigned int current_packet_successful
Definition: connection_internal.h:422
float max_kbps
Definition: connection_internal.h:428
float max_incoming_kbps
Definition: connection_internal.h:431
float getAvgIncomingRateKB()
Definition: connection_internal.h:401
ReliablePacketBuffer outgoing_reliables_sent
Definition: connection_internal.h:361
float getAvgDownloadRateKB()
Definition: connection_internal.h:397
std::deque< ConnectionCommandPtr > queued_commands
Definition: connection_internal.h:367
float getMaxIncomingRateKB()
Definition: connection_internal.h:394
void UpdateBytesSent(unsigned int bytes, unsigned int packages=1)
Definition: connection.cpp:703
float avg_kbps_lost
Definition: connection_internal.h:436
u16 incNextIncomingSeqNum()
Definition: connection.cpp:629
bool putBackSequenceNumber(u16)
Definition: connection.cpp:693
void UpdateBytesReceived(unsigned int bytes)
Definition: connection.cpp:710
ReliablePacketBuffer incoming_reliables
Definition: connection_internal.h:358
float packet_loss_counter
Definition: connection_internal.h:423
u16 readNextSplitSeqNum()
Definition: connection.cpp:637
float max_kbps_lost
Definition: connection_internal.h:434
u16 next_incoming_seqnum
Definition: connection_internal.h:415
unsigned int current_bytes_transfered
Definition: connection_internal.h:425
float avg_kbps
Definition: connection_internal.h:430
void setWindowSize(long size)
Definition: connection_internal.h:406
IncomingSplitBuffer incoming_splits
Definition: connection_internal.h:369
unsigned int current_bytes_lost
Definition: connection_internal.h:427
void UpdatePacketLossCounter(unsigned int count)
Definition: connection.cpp:722
float getCurrentDownloadRateKB()
Definition: connection_internal.h:382
std::mutex m_internal_mutex
Definition: connection_internal.h:412
float getMaxDownloadRateKB()
Definition: connection_internal.h:384
float getCurrentIncomingRateKB()
Definition: connection_internal.h:392
void setNextSplitSeqNum(u16 seqnum)
Definition: connection.cpp:642
float cur_kbps
Definition: connection_internal.h:429
std::queue< BufferedPacketPtr > queued_reliables
Definition: connection_internal.h:364
u16 next_outgoing_seqnum
Definition: connection_internal.h:417
unsigned int current_bytes_received
Definition: connection_internal.h:426
u16 readOutgoingSequenceNumber()
Definition: connection.cpp:687
float cur_kbps_lost
Definition: connection_internal.h:435
unsigned int rate_samples
Definition: connection_internal.h:439
Definition: connectionthreads.h:114
Definition: connectionthreads.h:56
Definition: connection.h:255
Definition: connection_internal.h:271
std::mutex m_map_mutex
Definition: connection_internal.h:287
std::map< u16, IncomingSplitPacket * > m_buf
Definition: connection_internal.h:285
SharedBuffer< u8 > insert(BufferedPacketPtr &p_ptr, bool reliable)
Definition: connection.cpp:453
void removeUnreliableTimedOuts(float dtime, float timeout)
Definition: connection.cpp:520
~IncomingSplitBuffer()
Definition: connection.cpp:445
Definition: connection.h:56
Definition: connection.h:122
Address address
Definition: connection.h:216
std::mutex m_exclusive_access_mutex
Definition: connection.h:209
Definition: connection_internal.h:236
void incrementTimeouts(float dtime)
Definition: connection.cpp:355
std::list< BufferedPacketPtr >::iterator FindResult
Definition: connection_internal.h:255
u16 m_oldest_non_answered_ack
Definition: connection_internal.h:261
BufferedPacketPtr popSeqnum(u16 seqnum)
Definition: connection.cpp:230
u32 size()
Definition: connection.cpp:189
std::vector< ConstSharedPtr< BufferedPacket > > getResend(float timeout, u32 max_packets)
Definition: connection.cpp:376
std::mutex m_list_mutex
Definition: connection_internal.h:263
BufferedPacketPtr popFirst()
Definition: connection.cpp:213
bool empty()
Definition: connection.cpp:183
std::list< BufferedPacketPtr > m_list
Definition: connection_internal.h:259
void print()
Definition: connection.cpp:172
u32 getTimedOuts(float timeout)
Definition: connection.cpp:364
void insert(BufferedPacketPtr &p_ptr, u16 next_expected)
Definition: connection.cpp:251
FindResult findPacketNoLock(u16 seqnum)
Definition: connection.cpp:195
bool getFirstSeqnum(u16 &result)
Definition: connection.cpp:204
Definition: connection_internal.h:444
bool processReliableSendCommand(ConnectionCommandPtr &c_ptr, unsigned int max_packet_size)
Definition: connection.cpp:1052
void setNextSplitSequenceNumber(u8 channel, u16 seqnum) override
Definition: connection.cpp:1193
void RunCommandQueues(unsigned int max_packet_size, unsigned int maxtransfer)
Definition: connection.cpp:1155
void reportRTT(float rtt) override
Definition: connection.cpp:990
virtual const Address & getAddress() const
Definition: connection_internal.h:458
bool isTimedOut(float timeout, std::string &reason) override
Definition: connection.cpp:972
void PutReliableSendCommand(ConnectionCommandPtr &c, unsigned int max_packet_size) override
Definition: connection.cpp:1021
bool m_pending_disconnect
Definition: connection_internal.h:490
Channel channels[CHANNEL_COUNT]
Definition: connection_internal.h:489
float resend_timeout
Definition: connection_internal.h:493
u16 getNextSplitSequenceNumber(u8 channel) override
Definition: connection.cpp:1187
virtual ~UDPPeer()=default
void setResendTimeout(float timeout)
Definition: connection_internal.h:484
float getResendTimeout()
Definition: connection_internal.h:481
bool Ping(float dtime, SharedBuffer< u8 > &data) override
Definition: connection.cpp:1007
SharedBuffer< u8 > addSplitPacket(u8 channel, BufferedPacketPtr &toadd, bool reliable) override
Definition: connection.cpp:1199
#define SEQNUM_MAX
Definition: connection_internal.h:115
#define CHANNEL_COUNT
Definition: connection_internal.h:47
ControlType
Definition: connection_internal.h:67
@ CONTROLTYPE_PING
Definition: connection_internal.h:70
@ CONTROLTYPE_ACK
Definition: connection_internal.h:68
@ CONTROLTYPE_DISCO
Definition: connection_internal.h:71
@ CONTROLTYPE_SET_PEER_ID
Definition: connection_internal.h:69
#define MIN_RELIABLE_WINDOW_SIZE
Definition: connection_internal.h:340
#define MAX_RELIABLE_WINDOW_SIZE
Definition: connection_internal.h:336
#define SEQNUM_INITIAL
Definition: connection_internal.h:114
#define PEER_ID_INEXISTENT
Definition: constants.h:34
std::unique_lock< std::mutex > MutexAutoLock
Definition: mutex_auto_lock.h:29
bool seqnum_in_window(u16 seqnum, u16 next, u16 window_size)
Definition: connection_internal.h:145
SharedBuffer< u8 > makeReliablePacket(const SharedBuffer< u8 > &data, u16 seqnum)
Definition: connection.cpp:154
PacketType
Definition: connection_internal.h:121
@ PACKET_TYPE_CONTROL
Definition: connection_internal.h:122
@ PACKET_TYPE_RELIABLE
Definition: connection_internal.h:125
@ PACKET_TYPE_MAX
Definition: connection_internal.h:126
@ PACKET_TYPE_SPLIT
Definition: connection_internal.h:124
@ PACKET_TYPE_ORIGINAL
Definition: connection_internal.h:123
void makeAutoSplitPacket(const SharedBuffer< u8 > &data, u32 chunksize_max, u16 &split_seqnum, std::list< SharedBuffer< u8 > > *list)
Definition: connection.cpp:140
ConnectionCommandType
Definition: connection_internal.h:290
@ CONNCMD_RESEND_ONE
Definition: connection_internal.h:300
@ CONNCMD_CONNECT
Definition: connection_internal.h:293
@ CONNCMD_SEND
Definition: connection_internal.h:296
@ CONNCMD_SERVE
Definition: connection_internal.h:292
@ CONNCMD_DISCONNECT_PEER
Definition: connection_internal.h:295
@ CONNCMD_SEND_TO_ALL
Definition: connection_internal.h:297
@ CONNCMD_NONE
Definition: connection_internal.h:291
@ CONCMD_CREATE_PEER
Definition: connection_internal.h:299
@ CONNCMD_DISCONNECT
Definition: connection_internal.h:294
@ CONCMD_ACK
Definition: connection_internal.h:298
std::shared_ptr< BufferedPacket > BufferedPacketPtr
Definition: connection.h:117
float CALC_DTIME(u64 lasttime, u64 curtime)
Definition: connection_internal.h:158
std::shared_ptr< ConnectionCommand > ConnectionCommandPtr
Definition: connection.h:114
BufferedPacketPtr makePacket(const Address &address, const SharedBuffer< u8 > &data, u32 protocol_id, session_t sender_peer_id, u8 channel)
Definition: connection.cpp:71
bool seqnum_higher(u16 totest, u16 base)
Definition: connection_internal.h:129
u16 session_t
Definition: networkprotocol.h:251
#define rangelim(d, min, max)
Definition: numeric.h:32
Definition: connection_internal.h:170
u8 * data
Definition: connection_internal.h:183
Address address
Definition: connection_internal.h:187
size_t size() const
Definition: connection_internal.h:181
u64 absolute_send_time
Definition: connection_internal.h:186
unsigned int resend_count
Definition: connection_internal.h:188
float time
Definition: connection_internal.h:184
std::vector< u8 > m_data
Definition: connection_internal.h:191
u16 getSeqnum() const
Definition: connection.cpp:63
float totaltime
Definition: connection_internal.h:185
BufferedPacket(u32 a_size)
Definition: connection_internal.h:171
Definition: connection_internal.h:305
static ConnectionCommandPtr connect(Address address)
Definition: connection.cpp:559
static ConnectionCommandPtr ack(session_t peer_id, u8 channelnum, const Buffer< u8 > &data)
Definition: connection.cpp:598
static ConnectionCommandPtr create(ConnectionCommandType type)
Definition: connection.cpp:547
static ConnectionCommandPtr disconnect_peer(session_t peer_id)
Definition: connection.cpp:571
u8 channelnum
Definition: connection_internal.h:309
static ConnectionCommandPtr createPeer(session_t peer_id, const Buffer< u8 > &data)
Definition: connection.cpp:608
Buffer< u8 > data
Definition: connection_internal.h:310
Address address
Definition: connection_internal.h:307
bool reliable
Definition: connection_internal.h:311
ConnectionCommand(ConnectionCommandType type_)
Definition: connection_internal.h:326
static ConnectionCommandPtr disconnect()
Definition: connection.cpp:566
bool raw
Definition: connection_internal.h:312
static ConnectionCommandPtr send(session_t peer_id, u8 channelnum, NetworkPacket *pkt, bool reliable)
Definition: connection.cpp:587
session_t peer_id
Definition: connection_internal.h:308
const ConnectionCommandType type
Definition: connection_internal.h:306
static ConnectionCommandPtr resend_one(session_t peer_id)
Definition: connection.cpp:578
DISABLE_CLASS_COPY(ConnectionCommand)
static ConnectionCommandPtr serve(Address address)
Definition: connection.cpp:552
Definition: connection_internal.h:208
u32 chunk_count
Definition: connection_internal.h:215
bool allReceived() const
Definition: connection_internal.h:218
SharedBuffer< u8 > reassemble()
Definition: connection.cpp:419
IncomingSplitPacket(u32 cc, bool r)
Definition: connection_internal.h:209
IncomingSplitPacket()=delete
bool reliable
Definition: connection_internal.h:216
bool insert(u32 chunk_num, SharedBuffer< u8 > &chunkdata)
Definition: connection.cpp:403
std::map< u16, SharedBuffer< u8 > > chunks
Definition: connection_internal.h:227
float time
Definition: connection_internal.h:214