DDNet documentation
Loading...
Searching...
No Matches
network.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#ifndef ENGINE_SHARED_NETWORK_H
4#define ENGINE_SHARED_NETWORK_H
5
6#include "ringbuffer.h"
7#include "stun.h"
8
9#include <base/net.h>
10#include <base/types.h>
11
12#include <array>
13#include <optional>
14#include <vector>
15
16class CHuffman;
17class CNetBan;
18class CPacker;
19
20/*
21
22CURRENT:
23 packet header: 3 bytes
24 unsigned char flags_ack; // 6bit flags, 2bit ack
25 0.6: ORNCaaAA
26 0.6.5: ORNCT-AA
27 0.7: --NORCAA
28
29 O = flag compression
30 R = flag resend
31 N = flag connless
32 C = flag control
33 T = flag token (0.6.5 only not supported by ddnet)
34 - = unused, should be zero
35 a = should be zero otherwise it messes up the ack number
36 A = bit of ack number
37
38
39 unsigned char ack; // 8 bit ack
40 unsigned char num_chunks; // 8 bit chunks
41
42 (unsigned char padding[3]) // 24 bit extra in case it's a connection less packet
43 // this is to make sure that it's compatible with the
44 // old protocol
45
46 chunk header: 2-3 bytes
47 unsigned char flags_size; // 2bit flags, 6 bit size
48 unsigned char size_seq; // 4bit size, 4bit seq
49 (unsigned char seq;) // 8bit seq, if vital flag is set
50*/
51
52enum
53{
58};
59
60enum
61{
65};
66
67enum
68{
84
91 // NOT SENT VIA THE NETWORK DIRECTLY:
93
96
102
104
105 // Addresses tracked for `sv_connlimit`, evicted least recently used. The limit stops
106 // applying once addresses are evicted before they reach `sv_connlimit`.
108
111};
112enum
113{
114 NET_TOKEN_MAX = 0xffffffff,
117
119};
120
121typedef int SECURITY_TOKEN;
122typedef unsigned int TOKEN;
123
124SECURITY_TOKEN ToSecurityToken(const unsigned char *pData);
125void WriteSecurityToken(unsigned char *pData, SECURITY_TOKEN Token);
126
127extern const unsigned char SECURITY_TOKEN_MAGIC[4];
128
129enum
130{
133};
134
135typedef int (*NETFUNC_DELCLIENT)(int ClientId, const char *pReason, void *pUser);
136typedef int (*NETFUNC_NEWCLIENT_CON)(int ClientId, void *pUser);
137typedef int (*NETFUNC_NEWCLIENT)(int ClientId, void *pUser, bool Sixup);
138typedef int (*NETFUNC_NEWCLIENT_NOAUTH)(int ClientId, void *pUser);
139typedef int (*NETFUNC_CLIENTREJOIN)(int ClientId, void *pUser, bool Sixup, bool VanillaAuth);
140
142{
143 // -1 means that it's a stateless packet
144 // 0 on the client means the server
146 NETADDR m_Address; // only used when client_id == -1
149 const void *m_pData;
150 // only used if the flags contain NETSENDFLAG_EXTENDED and NETSENDFLAG_CONNLESS
152
153 void AssertSizeSanity() const;
154};
155
157{
158public:
162
163 unsigned char *Pack(unsigned char *pData, int Split = 4) const;
164 unsigned char *Unpack(unsigned char *pData, int Split = 4);
165};
166
168{
169public:
172 unsigned char *m_pData;
173
177};
178
189
198
199class CStun
200{
202 {
206 bool m_HaveStunServer = false;
208 bool m_HaveAddr = false;
210 int64_t m_LastResponse = -1;
211 int64_t m_NextTry = -1;
213
214 public:
215 CProtocol(int Index, NETSOCKET Socket);
216 void FeedStunServer(NETADDR StunServer);
217 void Refresh();
218 void Update();
219 bool OnPacket(NETADDR Addr, unsigned char *pData, int DataSize);
221 };
223
224public:
225 CStun(NETSOCKET Socket);
226 void FeedStunServer(NETADDR StunServer);
227 void Refresh();
228 void Update();
229 bool OnPacket(NETADDR Addr, unsigned char *pData, int DataSize);
230 CONNECTIVITY GetConnectivity(int NetType, NETADDR *pGlobalAddr);
231};
232
234{
235 // TODO: is this needed because this needs to be aware of
236 // the ack sequencing number and is also responsible for updating
237 // that. this should be fixed.
239
240public:
241 enum class EState
242 {
243 OFFLINE,
244 WANT_TOKEN,
245 CONNECT,
246 PENDING,
247 ONLINE,
249 };
250
252
253private:
254 unsigned short m_Sequence;
255 unsigned short m_Ack;
256 unsigned short m_PeerAck;
261
263
269
270 char m_aErrorString[256];
271
273
279
280 std::array<char, NETADDR_MAXSTRSIZE> m_aPeerAddrStr;
281 std::array<char, NETADDR_MAXSTRSIZE> m_aPeerAddrStrNoPort;
282 // client 0.7
283 static TOKEN GenerateToken7(const NETADDR *pPeerAddr);
285 bool IsSixup() const { return m_Sixup; }
286
287 //
288 bool IsPeerAddress(const NETADDR &Addr) const;
289 void SetPeerAddr(const NETADDR *pAddr);
290 void ClearPeerAddr();
291 void ResetStats();
292 void SetError(const char *pString);
293 void AckChunks(int Ack);
294
295 int QueueChunkEx(int Flags, int DataSize, const void *pData, int Sequence);
296 void SendConnect();
297 void SendControl(int ControlMsg, const void *pExtra, int ExtraSize);
298 void SendControlWithToken7(int ControlMsg, SECURITY_TOKEN ResponseToken);
299 void ResendChunk(CNetChunkResend *pResend);
300 void Resend();
301 void AnswerResendRequest(int64_t Now);
302
303public:
306
307 void SetToken7(TOKEN Token);
308
309 void Reset();
310 void Init(NETSOCKET Socket, bool BlockCloseMsg);
311 int Connect(const NETADDR *pAddr, int NumAddrs);
312 int Connect7(const NETADDR *pAddr, int NumAddrs);
313 void Disconnect(const char *pReason);
314
315 int Update();
316 int Flush();
317
319 int QueueChunk(int Flags, int DataSize, const void *pData);
320
321 const char *ErrorString();
322 void SignalResend();
323 EState State() const { return m_State; }
324 const NETADDR *PeerAddress() const { return &m_PeerAddr; }
325 const std::array<char, NETADDR_MAXSTRSIZE> &PeerAddressString(bool IncludePort) const
326 {
327 return IncludePort ? m_aPeerAddrStr : m_aPeerAddrStrNoPort;
328 }
329 void ConnectAddresses(const NETADDR **ppAddrs, int *pNumAddrs) const
330 {
331 *ppAddrs = m_aConnectAddrs;
332 *pNumAddrs = m_NumConnectAddrs;
333 }
334
336 const char *ErrorString() const { return m_aErrorString; }
337
338 // Needed for GotProblems in NetClient
339 int64_t LastRecvTime() const { return m_LastRecvTime; }
340 int64_t ConnectTime() const { return m_LastUpdateTime; }
341
342 int AckSequence() const { return m_Ack; }
343 int SeqSequence() const { return m_Sequence; }
344 int SecurityToken() const { return m_SecurityToken; }
346
347 void ResumeConnection(const NETADDR *pAddr, int Sequence, int Ack, SECURITY_TOKEN SecurityToken, CStaticRingBuffer<CNetChunkResend, NET_CONN_BUFFERSIZE> *pResendBuffer, bool Sixup);
348
349 // anti spoof
350 void DirectInit(const NETADDR &Addr, SECURITY_TOKEN SecurityToken, SECURITY_TOKEN Token, bool Sixup);
351 void SetUnknownSeq() { m_UnknownSeq = true; }
352 void SetSequence(int Sequence) { m_Sequence = Sequence; }
353
356};
357
359{
360public:
361 enum class EState
362 {
363 OFFLINE,
364 ONLINE,
366 };
367
368private:
370
372 std::array<char, NETADDR_MAXSTRSIZE> m_aPeerAddrStr;
374
377
378 char m_aErrorString[256];
379
382
383 void SetPeerAddr(const NETADDR *pAddr);
384 void ClearPeerAddr();
385
386public:
387 int Init(NETSOCKET Socket, const NETADDR *pAddr);
388 void Disconnect(const char *pReason);
389
390 EState State() const { return m_State; }
391 const NETADDR *PeerAddress() const { return &m_PeerAddr; }
392 const std::array<char, NETADDR_MAXSTRSIZE> &PeerAddressString() const { return m_aPeerAddrStr; }
393 const char *ErrorString() const { return m_aErrorString; }
394
395 void Reset();
396 int Update();
397 int Send(const char *pLine);
398 int Recv(char *pLine, int MaxLength);
399};
400
408{
409public:
410 void FeedPacket(const NETADDR &Addr, const CNetPacketConstruct &Packet, CNetConnection *pConnection, int ClientId);
411 bool UnpackNextChunk(CNetChunk *pChunk);
412 void Reset();
413
414private:
415 bool m_Valid = false;
419 // offset of the next chunk header in m_Data.m_aChunkData
423};
424
425// server side
427{
428 struct CSlot
429 {
430 public:
432 };
433
435 {
437 // start of the timespan the connections are counted in
438 int64_t m_Time;
439 // last connection, only used to pick the entry to evict
440 int64_t m_LastSeen;
442 };
443
450
451 bool m_FlushBatch = false;
453
458 void *m_pUser;
459
460 unsigned char m_aSecurityTokenSeed[16];
461
462 // vanilla connect flood detection
465
466 // budgets for work unauthenticated peers can request, reset in Update():
467 // `m_NumRecvPackets` per Recv() batch, the others per second
469 int64_t m_BudgetStart = 0;
472
474
477
478 void OnTokenCtrlMsg(NETADDR &Addr, int ControlMsg, const CNetPacketConstruct &Packet, int Slot);
479 int OnSixupCtrlMsg(NETADDR &Addr, CNetChunk *pChunk, int ControlMsg, const CNetPacketConstruct &Packet, SECURITY_TOKEN &ResponseToken, SECURITY_TOKEN Token, int Slot);
480 void OnPreConnMsg(NETADDR &Addr, CNetPacketConstruct &Packet, int Slot);
481 bool ClientExists(const NETADDR &Addr) { return GetClientSlot(Addr) != -1; }
482 int GetClientSlot(const NETADDR &Addr);
483 void SendControl(NETADDR &Addr, int ControlMsg, const void *pExtra, int ExtraSize, SECURITY_TOKEN SecurityToken);
484
485 int TryAcceptClient(NETADDR &Addr, SECURITY_TOKEN SecurityToken, int Slot, bool VanillaAuth = false, bool Sixup = false, SECURITY_TOKEN Token = 0);
486 int NumClientsWithAddr(NETADDR Addr);
487 bool Connlimit(NETADDR Addr);
488 void SendMsgs(NETADDR &Addr, const CPacker **ppMsgs, int Num);
489
490public:
491 int SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser);
492 int SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_NEWCLIENT_NOAUTH pfnNewClientNoAuth, NETFUNC_CLIENTREJOIN pfnClientRejoin, NETFUNC_DELCLIENT pfnDelClient, void *pUser);
493
494 //
495 bool Open(NETADDR BindAddr, CNetBan *pNetBan, int MaxClients, int MaxClientsPerIp);
496 void Close();
497
498 //
499 int Recv(CNetChunk *pChunk, SECURITY_TOKEN *pResponseToken);
500 int Send(CNetChunk *pChunk);
501 void Update();
502
503 // While a flush batch is open, sends requesting MSGFLAG_FLUSH only queue
504 // their chunk and mark the connection; EndFlushBatch() then flushes each
505 // marked connection once. Used to coalesce the flushes triggered while
506 // draining a burst of incoming packets into one packet per recipient.
507 void BeginFlushBatch() { m_FlushBatch = true; }
508 void EndFlushBatch();
509
510 //
511 void Drop(int ClientId, const char *pReason);
512
513 // status requests
514 const NETADDR *ClientAddr(int ClientId) const { return m_aSlots[ClientId].m_Connection.PeerAddress(); }
515 const std::array<char, NETADDR_MAXSTRSIZE> &ClientAddrString(int ClientId, bool IncludePort) const { return m_aSlots[ClientId].m_Connection.PeerAddressString(IncludePort); }
516 bool HasSecurityToken(int ClientId) const { return m_aSlots[ClientId].m_Connection.SecurityToken() != NET_SECURITY_TOKEN_UNSUPPORTED; }
517 NETADDR Address() const { return m_Address; }
518 NETSOCKET Socket() const { return m_Socket; }
519 CNetBan *NetBan() const { return m_pNetBan; }
520 int NetType() const { return net_socket_type(m_Socket); }
521 int MaxClients() const { return m_MaxClients; }
522
523 void SendTokenSixup(NETADDR &Addr, SECURITY_TOKEN Token);
524
525 //
526 void SetMaxClientsPerIp(int Max);
527 bool HasErrored(int ClientId);
528 void ResumeOldConnection(int ClientId, int OrigId);
529 void IgnoreTimeouts(int ClientId);
530
531 void ResetErrorString(int ClientId);
532 const char *ErrorString(int ClientId);
533
534 // anti spoof
536 SECURITY_TOKEN GetToken(const NETADDR &Addr);
538};
539
541{
546
550
553 void *m_pUser;
554
555public:
556 void SetCallbacks(NETFUNC_NEWCLIENT_CON pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser);
557
558 //
559 bool Open(NETADDR BindAddr, CNetBan *pNetBan);
560 void Close();
561
562 //
563 int Recv(char *pLine, int MaxLength, int *pClientId = nullptr);
564 int Send(int ClientId, const char *pLine);
565 void Update();
566
567 //
568 int AcceptClient(NETSOCKET Socket, const NETADDR *pAddr);
569 void Drop(int ClientId, const char *pReason);
570
571 // status requests
572 const NETADDR *ClientAddr(int ClientId) const { return m_aSlots[ClientId].m_Connection.PeerAddress(); }
573 const std::array<char, NETADDR_MAXSTRSIZE> &ClientAddrString(int ClientId) const { return m_aSlots[ClientId].m_Connection.PeerAddressString(); }
574 CNetBan *NetBan() const { return m_pNetBan; }
575};
576
578{
579public:
580 void Init(NETSOCKET Socket);
581 void SendPacketConnless(CNetChunk *pChunk);
582 void FetchToken(NETADDR *pAddr);
583 void AddToken(const NETADDR *pAddr, TOKEN Token);
584 TOKEN GetToken(const NETADDR *pAddr);
586 void Update();
587
588private:
590 {
591 public:
595 int64_t m_Expiry;
596 };
597
599 {
600 public:
603 int64_t m_Expiry;
604 };
605
607 std::vector<CAddressInfo> m_TokenCache;
608 std::vector<CConnlessPacketInfo> m_ConnlessPackets;
609};
610
611// client side
613{
618
619 CStun *m_pStun = nullptr;
620
621public:
623 // openness
624 bool Open(NETADDR BindAddr);
625 void Close();
626
627 // connection state
628 void Disconnect(const char *pReason);
629 void Connect(const NETADDR *pAddr, int NumAddrs);
630 void Connect7(const NETADDR *pAddr, int NumAddrs);
631
632 // communication
633 int Recv(CNetChunk *pChunk, SECURITY_TOKEN *pResponseToken, bool Sixup);
634 int Send(CNetChunk *pChunk);
635
636 // pumping
637 void Update();
638 int Flush();
639
640 void ResetErrorString();
641
642 // error and state
643 int NetType() const { return net_socket_type(m_Socket); }
644 bool SocketIsBroken() const { return m_Socket != nullptr && net_udp_is_broken(m_Socket); }
645 int State();
646 const NETADDR *ServerAddress() const { return m_Connection.PeerAddress(); }
647 void ConnectAddresses(const NETADDR **ppAddrs, int *pNumAddrs) const { m_Connection.ConnectAddresses(ppAddrs, pNumAddrs); }
648 bool GotProblems(int64_t MaxLatency) const;
649 const char *ErrorString() const;
650
651 // stun
652 void FeedStunServer(NETADDR StunServer);
653 void RefreshStun();
654 CONNECTIVITY GetConnectivity(int NetType, NETADDR *pGlobalAddr);
655};
656
657// TODO: both, fix these. This feels like a junk class for stuff that doesn't fit anywhere
659{
663
664public:
665 static void OpenLog(IOHANDLE DataLogSent, IOHANDLE DataLogRecv);
666 static void CloseLog();
667 static void Init();
668 static int Compress(const void *pData, int DataSize, void *pOutput, int OutputSize);
669 static int Decompress(const void *pData, int DataSize, void *pOutput, int OutputSize);
670
671 static bool IsValidConnectionOrientedPacket(const CNetPacketConstruct *pPacket);
672
673 static void SendControlMsg(NETSOCKET Socket, NETADDR *pAddr, int Ack, int ControlMsg, const void *pExtra, int ExtraSize, SECURITY_TOKEN SecurityToken, bool Sixup = false);
674 static void SendControlMsgWithToken7(NETSOCKET Socket, NETADDR *pAddr, TOKEN Token, int Ack, int ControlMsg, TOKEN MyToken, bool Extended);
675 static void SendPacketConnless(NETSOCKET Socket, NETADDR *pAddr, const void *pData, int DataSize, bool Extended, unsigned char aExtra[NET_CONNLESS_EXTRA_SIZE]);
676 static void SendPacketConnlessWithToken7(NETSOCKET Socket, NETADDR *pAddr, const void *pData, int DataSize, SECURITY_TOKEN Token, SECURITY_TOKEN ResponseToken);
677 static void SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct *pPacket, SECURITY_TOKEN SecurityToken, bool Sixup = false);
678
679 static std::optional<int> UnpackPacketFlags(unsigned char *pBuffer, int Size);
680 // `AllowDecompression` false rejects compressed packets instead of decompressing them,
681 // decompression being the most expensive part of receiving a packet. `pDecompressed` is
682 // set when decompression was attempted, successfully or not.
683 static int UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct *pPacket, bool &Sixup, bool AllowDecompression, SECURITY_TOKEN *pSecurityToken = nullptr, SECURITY_TOKEN *pResponseToken = nullptr, bool *pDecompressed = nullptr);
684
685 // The backroom is ack-NET_MAX_SEQUENCE/2. Used for knowing if we acked a packet or not
686 static bool IsSeqInBackroom(int Seq, int Ack);
687};
688
689#endif
Definition network.h:359
bool m_LineEndingDetected
Definition network.h:380
EState m_State
Definition network.h:369
int m_BufferOffset
Definition network.h:376
int Send(const char *pLine)
Definition network_console_conn.cpp:171
char m_aBuffer[NET_MAX_PACKETSIZE]
Definition network.h:375
EState
Definition network.h:362
char m_aErrorString[256]
Definition network.h:378
void Reset()
Definition network_console_conn.cpp:21
void SetPeerAddr(const NETADDR *pAddr)
Definition network_console_conn.cpp:9
const NETADDR * PeerAddress() const
Definition network.h:391
NETSOCKET m_Socket
Definition network.h:373
void Disconnect(const char *pReason)
Definition network_console_conn.cpp:58
const std::array< char, NETADDR_MAXSTRSIZE > & PeerAddressString() const
Definition network.h:392
char m_aLineEnding[3]
Definition network.h:381
int Init(NETSOCKET Socket, const NETADDR *pAddr)
Definition network_console_conn.cpp:43
const char * ErrorString() const
Definition network.h:393
int Recv(char *pLine, int MaxLength)
Definition network_console_conn.cpp:108
EState State() const
Definition network.h:390
std::array< char, NETADDR_MAXSTRSIZE > m_aPeerAddrStr
Definition network.h:372
int Update()
Definition network_console_conn.cpp:71
void ClearPeerAddr()
Definition network_console_conn.cpp:15
NETADDR m_PeerAddr
Definition network.h:371
Definition huffman.h:7
Definition netban.h:31
Definition network.h:659
static void SendControlMsgWithToken7(NETSOCKET Socket, NETADDR *pAddr, TOKEN Token, int Ack, int ControlMsg, TOKEN MyToken, bool Extended)
Definition network.cpp:429
static int Decompress(const void *pData, int DataSize, void *pOutput, int OutputSize)
Definition network.cpp:539
static void SendPacketConnlessWithToken7(NETSOCKET Socket, NETADDR *pAddr, const void *pData, int DataSize, SECURITY_TOKEN Token, SECURITY_TOKEN ResponseToken)
Definition network.cpp:179
static void Init()
Definition network.cpp:544
static void SendPacketConnless(NETSOCKET Socket, NETADDR *pAddr, const void *pData, int DataSize, bool Extended, unsigned char aExtra[NET_CONNLESS_EXTRA_SIZE])
Definition network.cpp:159
static bool IsValidConnectionOrientedPacket(const CNetPacketConstruct *pPacket)
Definition network.cpp:134
static void SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct *pPacket, SECURITY_TOKEN SecurityToken, bool Sixup=false)
Definition network.cpp:193
static int UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct *pPacket, bool &Sixup, bool AllowDecompression, SECURITY_TOKEN *pSecurityToken=nullptr, SECURITY_TOKEN *pResponseToken=nullptr, bool *pDecompressed=nullptr)
Definition network.cpp:282
static std::optional< int > UnpackPacketFlags(unsigned char *pBuffer, int Size)
Definition network.cpp:272
static void SendControlMsg(NETSOCKET Socket, NETADDR *pAddr, int Ack, int ControlMsg, const void *pExtra, int ExtraSize, SECURITY_TOKEN SecurityToken, bool Sixup=false)
Definition network.cpp:415
static IOHANDLE ms_DataLogSent
Definition network.h:660
static bool IsSeqInBackroom(int Seq, int Ack)
Definition network.cpp:471
static int Compress(const void *pData, int DataSize, void *pOutput, int OutputSize)
Definition network.cpp:534
static void CloseLog()
Definition network.cpp:517
static IOHANDLE ms_DataLogRecv
Definition network.h:661
static CHuffman ms_Huffman
Definition network.h:662
static void OpenLog(IOHANDLE DataLogSent, IOHANDLE DataLogRecv)
Definition network.cpp:494
Definition network.h:157
int m_Size
Definition network.h:160
int m_Flags
Definition network.h:159
int m_Sequence
Definition network.h:161
unsigned char * Unpack(unsigned char *pData, int Split=4)
Definition network.cpp:458
unsigned char * Pack(unsigned char *pData, int Split=4) const
Definition network.cpp:443
Definition network.h:168
int m_Flags
Definition network.h:170
int64_t m_FirstSendTime
Definition network.h:176
int m_Sequence
Definition network.h:174
unsigned char * m_pData
Definition network.h:172
int64_t m_LastSendTime
Definition network.h:175
int m_DataSize
Definition network.h:171
Definition network.h:613
int State()
Definition network_client.cpp:192
const char * ErrorString() const
Definition network_client.cpp:211
NETSOCKET m_Socket
Definition network.h:622
void Connect7(const NETADDR *pAddr, int NumAddrs)
Definition network_client.cpp:67
void Connect(const NETADDR *pAddr, int NumAddrs)
Definition network_client.cpp:62
bool SocketIsBroken() const
Definition network.h:644
void Disconnect(const char *pReason)
Definition network_client.cpp:48
CStun * m_pStun
Definition network.h:619
int Flush()
Definition network_client.cpp:201
void RefreshStun()
Definition network_client.cpp:221
CONNECTIVITY GetConnectivity(int NetType, NETADDR *pGlobalAddr)
Definition network_client.cpp:226
void ResetErrorString()
Definition network_client.cpp:72
int Send(CNetChunk *pChunk)
Definition network_client.cpp:159
CNetConnection m_Connection
Definition network.h:614
void FeedStunServer(NETADDR StunServer)
Definition network_client.cpp:216
CNetPacketConstruct m_RecvBuffer
Definition network.h:616
const NETADDR * ServerAddress() const
Definition network.h:646
void Update()
Definition network_client.cpp:53
CPacketChunkUnpacker m_PacketChunkUnpacker
Definition network.h:615
int Recv(CNetChunk *pChunk, SECURITY_TOKEN *pResponseToken, bool Sixup)
Definition network_client.cpp:77
CNetTokenCache m_TokenCache
Definition network.h:617
void Close()
Definition network_client.cpp:33
bool Open(NETADDR BindAddr)
Definition network_client.cpp:13
void ConnectAddresses(const NETADDR **ppAddrs, int *pNumAddrs) const
Definition network.h:647
int NetType() const
Definition network.h:643
bool GotProblems(int64_t MaxLatency) const
Definition network_client.cpp:206
Definition network.h:234
void SendControl(int ControlMsg, const void *pExtra, int ExtraSize)
Definition network_conn.cpp:214
const NETADDR * PeerAddress() const
Definition network.h:324
void SetError(const char *pString)
Definition network_conn.cpp:86
void SetToken7(TOKEN Token)
Definition network_conn.cpp:296
void Disconnect(const char *pReason)
Definition network_conn.cpp:311
bool m_UnknownSeq
Definition network.h:260
bool IsPeerAddress(const NETADDR &Addr) const
Definition network_conn.cpp:13
void SendConnect()
Definition network_conn.cpp:204
int Connect7(const NETADDR *pAddr, int NumAddrs)
Definition network_conn.cpp:274
void DirectInit(const NETADDR &Addr, SECURITY_TOKEN SecurityToken, SECURITY_TOKEN Token, bool Sixup)
Definition network_conn.cpp:337
bool IsSixup() const
Definition network.h:285
void SignalResend()
Definition network_conn.cpp:116
void Reset()
Definition network_conn.cpp:52
bool m_ResendRequested
Definition network.h:268
EState m_State
Definition network.h:257
const char * ErrorString() const
Definition network.h:336
void Resend()
Definition network_conn.cpp:227
void ResendChunk(CNetChunkResend *pResend)
Definition network_conn.cpp:221
void ConnectAddresses(const NETADDR **ppAddrs, int *pNumAddrs) const
Definition network.h:329
NETADDR m_PeerAddr
Definition network.h:276
const std::array< char, NETADDR_MAXSTRSIZE > & PeerAddressString(bool IncludePort) const
Definition network.h:325
friend class CPacketChunkUnpacker
Definition network.h:238
NETADDR m_aConnectAddrs[16]
Definition network.h:274
int Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr, SECURITY_TOKEN SecurityToken=NET_SECURITY_TOKEN_UNSUPPORTED, SECURITY_TOKEN ResponseToken=NET_SECURITY_TOKEN_UNSUPPORTED)
Definition network_conn.cpp:356
void ResumeConnection(const NETADDR *pAddr, int Sequence, int Ack, SECURITY_TOKEN SecurityToken, CStaticRingBuffer< CNetChunkResend, NET_CONN_BUFFERSIZE > *pResendBuffer, bool Sixup)
Definition network_conn.cpp:579
void AckChunks(int Ack)
Definition network_conn.cpp:101
void ResetStats()
Definition network_conn.cpp:45
int64_t m_LastRecvTime
Definition network.h:265
int Flush()
Definition network_conn.cpp:121
char m_aErrorString[256]
Definition network.h:270
int QueueChunkEx(int Flags, int DataSize, const void *pData, int Sequence)
Definition network_conn.cpp:143
unsigned short m_Ack
Definition network.h:255
NETSTATS m_Stats
Definition network.h:278
int64_t m_LastResendTime
Definition network.h:267
CStaticRingBuffer< CNetChunkResend, NET_CONN_BUFFERSIZE > * ResendBuffer()
Definition network.h:345
int64_t m_LastSendTime
Definition network.h:266
void ClearPeerAddr()
Definition network_conn.cpp:38
void SendControlWithToken7(int ControlMsg, SECURITY_TOKEN ResponseToken)
Definition network_conn.cpp:267
unsigned short m_Sequence
Definition network.h:254
SECURITY_TOKEN m_Token
Definition network.h:355
EState State() const
Definition network.h:323
int m_NumConnectAddrs
Definition network.h:275
void ResetErrorString()
Definition network.h:335
int Update()
Definition network_conn.cpp:504
void AnswerResendRequest(int64_t Now)
Definition network_conn.cpp:233
std::array< char, NETADDR_MAXSTRSIZE > m_aPeerAddrStrNoPort
Definition network.h:281
EState
Definition network.h:242
@ OFFLINE
Definition network.h:243
int SecurityToken() const
Definition network.h:344
NETSOCKET m_Socket
Definition network.h:277
int AckSequence() const
Definition network.h:342
int64_t m_LastUpdateTime
Definition network.h:264
std::array< char, NETADDR_MAXSTRSIZE > m_aPeerAddrStr
Definition network.h:280
void SetSequence(int Sequence)
Definition network.h:352
bool m_BlockCloseMsg
Definition network.h:259
bool m_TimeoutSituation
Definition network.h:305
int64_t ConnectTime() const
Definition network.h:340
unsigned short m_PeerAck
Definition network.h:256
CStaticRingBuffer< CNetChunkResend, NET_CONN_BUFFERSIZE > m_Buffer
Definition network.h:262
class CNetBase * m_pNetBase
Definition network.h:284
int Connect(const NETADDR *pAddr, int NumAddrs)
Definition network_conn.cpp:247
void SetPeerAddr(const NETADDR *pAddr)
Definition network_conn.cpp:31
const char * ErrorString()
Definition network_conn.cpp:81
int SeqSequence() const
Definition network.h:343
int64_t LastRecvTime() const
Definition network.h:339
static TOKEN GenerateToken7(const NETADDR *pPeerAddr)
Definition network_conn.cpp:304
bool m_Sixup
Definition network.h:354
SECURITY_TOKEN m_SecurityToken
Definition network.h:251
CNetPacketConstruct m_Construct
Definition network.h:272
int m_RemoteClosed
Definition network.h:258
void Init(NETSOCKET Socket, bool BlockCloseMsg)
Definition network_conn.cpp:91
void SetUnknownSeq()
Definition network.h:351
int QueueChunk(int Flags, int DataSize, const void *pData)
Definition network_conn.cpp:197
bool m_TimeoutProtected
Definition network.h:304
Definition network.h:541
CNetBan * m_pNetBan
Definition network.h:548
CNetBan * NetBan() const
Definition network.h:574
const std::array< char, NETADDR_MAXSTRSIZE > & ClientAddrString(int ClientId) const
Definition network.h:573
void SetCallbacks(NETFUNC_NEWCLIENT_CON pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser)
Definition network_console.cpp:35
int Send(int ClientId, const char *pLine)
Definition network_console.cpp:148
void Drop(int ClientId, const char *pReason)
Definition network_console.cpp:56
void Close()
Definition network_console.cpp:42
NETSOCKET m_Socket
Definition network.h:547
int AcceptClient(NETSOCKET Socket, const NETADDR *pAddr)
Definition network_console.cpp:64
void Update()
Definition network_console.cpp:116
NETFUNC_DELCLIENT m_pfnDelClient
Definition network.h:552
NETFUNC_NEWCLIENT_CON m_pfnNewClient
Definition network.h:551
int Recv(char *pLine, int MaxLength, int *pClientId=nullptr)
Definition network_console.cpp:134
void * m_pUser
Definition network.h:553
CSlot m_aSlots[NET_MAX_CONSOLE_CLIENTS]
Definition network.h:549
bool Open(NETADDR BindAddr, CNetBan *pNetBan)
Definition network_console.cpp:8
const NETADDR * ClientAddr(int ClientId) const
Definition network.h:572
Definition network.h:180
unsigned char m_aChunkData[NET_MAX_PACKETSIZE - NET_PACKETHEADERSIZE]
Definition network.h:186
unsigned char m_aExtraData[NET_CONNLESS_EXTRA_SIZE]
Definition network.h:187
int m_Ack
Definition network.h:183
int m_DataSize
Definition network.h:185
int m_NumChunks
Definition network.h:184
int m_Flags
Definition network.h:182
Definition network.h:427
NETFUNC_NEWCLIENT m_pfnNewClient
Definition network.h:454
CNetBan * NetBan() const
Definition network.h:519
int m_MaxClients
Definition network.h:448
void SendMsgs(NETADDR &Addr, const CPacker **ppMsgs, int Num)
Definition network_server.cpp:312
int m_NumPreConnDecompress
Definition network.h:470
bool Connlimit(NETADDR Addr)
Definition network_server.cpp:198
int GetClientSlot(const NETADDR &Addr)
Definition network_server.cpp:579
void Close()
Definition network_server.cpp:91
NETFUNC_CLIENTREJOIN m_pfnClientRejoin
Definition network.h:457
int MaxClients() const
Definition network.h:521
void BeginFlushBatch()
Definition network.h:507
int64_t m_VConnFirst
Definition network.h:463
unsigned char m_aSecurityTokenSeed[16]
Definition network.h:460
CSlot m_aSlots[NET_MAX_CLIENTS]
Definition network.h:447
CNetBan * m_pNetBan
Definition network.h:446
void Update()
Definition network_server.cpp:111
int OnSixupCtrlMsg(NETADDR &Addr, CNetChunk *pChunk, int ControlMsg, const CNetPacketConstruct &Packet, SECURITY_TOKEN &ResponseToken, SECURITY_TOKEN Token, int Slot)
Definition network_server.cpp:540
int TryAcceptClient(NETADDR &Addr, SECURITY_TOKEN SecurityToken, int Slot, bool VanillaAuth=false, bool Sixup=false, SECURITY_TOKEN Token=0)
Definition network_server.cpp:233
int m_NumRecvPackets
Definition network.h:468
const std::array< char, NETADDR_MAXSTRSIZE > & ClientAddrString(int ClientId, bool IncludePort) const
Definition network.h:515
bool m_aFlushPending[NET_MAX_CLIENTS]
Definition network.h:452
CNetPacketConstruct m_RecvBuffer
Definition network.h:476
int SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser)
Definition network_server.cpp:73
int NumClientsWithAddr(NETADDR Addr)
Definition network_server.cpp:180
void SetMaxClientsPerIp(int Max)
Definition network_server.cpp:809
void ResetErrorString(int ClientId)
Definition network_server.cpp:830
int NetType() const
Definition network.h:520
CSpamConn m_aSpamConns[NET_CONNLIMIT_IPS]
Definition network.h:473
NETFUNC_NEWCLIENT_NOAUTH m_pfnNewClientNoAuth
Definition network.h:455
bool Open(NETADDR BindAddr, CNetBan *pNetBan, int MaxClients, int MaxClientsPerIp)
Definition network_server.cpp:45
CPacketChunkUnpacker m_PacketChunkUnpacker
Definition network.h:475
int Send(CNetChunk *pChunk)
Definition network_server.cpp:766
int Recv(CNetChunk *pChunk, SECURITY_TOKEN *pResponseToken)
Definition network_server.cpp:615
NETSOCKET m_Socket
Definition network.h:445
void ResumeOldConnection(int ClientId, int OrigId)
Definition network_server.cpp:819
NETADDR m_Address
Definition network.h:444
int m_VConnNum
Definition network.h:464
bool HasSecurityToken(int ClientId) const
Definition network.h:516
void * m_pUser
Definition network.h:458
NETADDR Address() const
Definition network.h:517
bool ClientExists(const NETADDR &Addr)
Definition network.h:481
SECURITY_TOKEN GetGlobalToken()
Definition network_server.cpp:148
void IgnoreTimeouts(int ClientId)
Definition network_server.cpp:825
bool m_FlushBatch
Definition network.h:451
const char * ErrorString(int ClientId)
Definition network_server.cpp:835
NETSOCKET Socket() const
Definition network.h:518
void EndFlushBatch()
Definition network_server.cpp:135
const NETADDR * ClientAddr(int ClientId) const
Definition network.h:514
void SendControl(NETADDR &Addr, int ControlMsg, const void *pExtra, int ExtraSize, SECURITY_TOKEN SecurityToken)
Definition network_server.cpp:175
NETFUNC_DELCLIENT m_pfnDelClient
Definition network.h:456
SECURITY_TOKEN GetVanillaToken(const NETADDR &Addr)
Definition network_server.cpp:169
void Drop(int ClientId, const char *pReason)
Definition network_server.cpp:101
void OnTokenCtrlMsg(NETADDR &Addr, int ControlMsg, const CNetPacketConstruct &Packet, int Slot)
Definition network_server.cpp:509
int m_NumBanReplies
Definition network.h:471
bool HasErrored(int ClientId)
Definition network_server.cpp:814
void OnPreConnMsg(NETADDR &Addr, CNetPacketConstruct &Packet, int Slot)
Definition network_server.cpp:338
SECURITY_TOKEN GetToken(const NETADDR &Addr)
Definition network_server.cpp:153
void SendTokenSixup(NETADDR &Addr, SECURITY_TOKEN Token)
Definition network_server.cpp:801
int m_MaxClientsPerIp
Definition network.h:449
int64_t m_BudgetStart
Definition network.h:469
Definition network.h:599
int64_t m_Expiry
Definition network.h:603
NETADDR m_Addr
Definition network.h:601
TOKEN m_Token
Definition network.h:602
Definition network.h:590
unsigned char m_aData[NET_MAX_CONNLESS_PAYLOAD]
Definition network.h:594
int64_t m_Expiry
Definition network.h:595
NETADDR m_Addr
Definition network.h:592
int m_DataSize
Definition network.h:593
Definition network.h:578
NETSOCKET m_Socket
Definition network.h:606
std::vector< CConnlessPacketInfo > m_ConnlessPackets
Definition network.h:608
void SendPacketConnless(CNetChunk *pChunk)
Definition network.cpp:554
std::vector< CAddressInfo > m_TokenCache
Definition network.h:607
void Init(NETSOCKET Socket)
Definition network.cpp:549
TOKEN GetToken(const NETADDR *pAddr)
Definition network.cpp:624
void FetchToken(NETADDR *pAddr)
Definition network.cpp:588
void Update()
Definition network.cpp:644
TOKEN GenerateToken()
Definition network.cpp:637
void AddToken(const NETADDR *pAddr, TOKEN Token)
Definition network.cpp:593
Definition packer.h:38
Definition network.h:408
int m_CurrentOffset
Definition network.h:420
CNetConnection * m_pConnection
Definition network.h:417
int m_ClientId
Definition network.h:421
CNetPacketConstruct m_Data
Definition network.h:422
NETADDR m_Addr
Definition network.h:416
bool UnpackNextChunk(CNetChunk *pChunk)
Definition network.cpp:57
void FeedPacket(const NETADDR &Addr, const CNetPacketConstruct &Packet, CNetConnection *pConnection, int ClientId)
Definition network.cpp:43
int m_CurrentChunk
Definition network.h:418
void Reset()
Definition network.cpp:129
bool m_Valid
Definition network.h:415
Definition ringbuffer.h:81
Definition stun.h:8
Definition network.h:202
int m_Index
Definition network.h:203
bool m_HaveStunServer
Definition network.h:206
CProtocol(int Index, NETSOCKET Socket)
Definition network_stun.cpp:40
void FeedStunServer(NETADDR StunServer)
Definition network_stun.cpp:50
void Refresh()
Definition network_stun.cpp:62
NETADDR m_StunServer
Definition network.h:207
int64_t m_LastResponse
Definition network.h:210
CONNECTIVITY GetConnectivity(NETADDR *pGlobalAddr)
Definition network_stun.cpp:115
NETADDR m_Addr
Definition network.h:209
bool OnPacket(NETADDR Addr, unsigned char *pData, int DataSize)
Definition network_stun.cpp:85
NETSOCKET m_Socket
Definition network.h:204
int m_NumUnsuccessfulTries
Definition network.h:212
int64_t m_NextTry
Definition network.h:211
bool m_HaveAddr
Definition network.h:208
CStunData m_Stun
Definition network.h:205
void Update()
Definition network_stun.cpp:67
Definition network.h:200
CProtocol m_aProtocols[2]
Definition network.h:222
void Update()
Definition network_stun.cpp:166
bool OnPacket(NETADDR Addr, unsigned char *pData, int DataSize)
Definition network_stun.cpp:174
void Refresh()
Definition network_stun.cpp:158
CONNECTIVITY GetConnectivity(int NetType, NETADDR *pGlobalAddr)
Definition network_stun.cpp:184
CStun(NETSOCKET Socket)
Definition network_stun.cpp:143
void FeedStunServer(NETADDR StunServer)
Definition network_stun.cpp:148
int net_socket_type(NETSOCKET sock)
Definition net.cpp:684
struct NETSOCKET_INTERNAL * NETSOCKET
Definition types.h:109
bool net_udp_is_broken(NETSOCKET sock)
Definition net.cpp:1259
@ ERROR
Definition http.h:22
void * IOHANDLE
Definition logger.h:12
void WriteSecurityToken(unsigned char *pData, SECURITY_TOKEN Token)
Definition network.cpp:26
const unsigned char SECURITY_TOKEN_MAGIC[4]
Definition network.cpp:19
SECURITY_TOKEN ToSecurityToken(const unsigned char *pData)
Definition network.cpp:21
int(*) NETFUNC_DELCLIENT(int ClientId, const char *pReason, void *pUser)
Definition network.h:135
int(*) NETFUNC_NEWCLIENT_NOAUTH(int ClientId, void *pUser)
Definition network.h:138
@ NET_SECURITY_TOKEN_UNKNOWN
Definition network.h:131
@ NET_SECURITY_TOKEN_UNSUPPORTED
Definition network.h:132
@ NETSTATE_CONNECTING
Definition network.h:63
@ NETSTATE_OFFLINE
Definition network.h:62
@ NETSTATE_ONLINE
Definition network.h:64
int SECURITY_TOKEN
Definition network.h:121
unsigned int TOKEN
Definition network.h:122
int(*) NETFUNC_NEWCLIENT(int ClientId, void *pUser, bool Sixup)
Definition network.h:137
int(*) NETFUNC_NEWCLIENT_CON(int ClientId, void *pUser)
Definition network.h:136
@ NETSENDFLAG_EXTENDED
Definition network.h:57
@ NETSENDFLAG_VITAL
Definition network.h:54
@ NETSENDFLAG_CONNLESS
Definition network.h:55
@ NETSENDFLAG_FLUSH
Definition network.h:56
CONNECTIVITY
Definition network.h:191
@ ADDRESS_KNOWN
Definition network.h:196
@ CHECKING
Definition network.h:193
@ UNREACHABLE
Definition network.h:194
@ UNKNOWN
Definition network.h:192
@ REACHABLE
Definition network.h:195
int(*) NETFUNC_CLIENTREJOIN(int ClientId, void *pUser, bool Sixup, bool VanillaAuth)
Definition network.h:139
@ NET_CTRLMSG_KEEPALIVE
Definition network.h:97
@ NET_CONNLESS_EXTRA_SIZE
Definition network.h:79
@ NET_MAX_CHUNK_SIZE
Definition network.h:76
@ NET_CONNLIMIT_IPS
Definition network.h:107
@ NET_CHUNKFLAG_RESEND
Definition network.h:95
@ NET_PACKETFLAG_COMPRESSION
Definition network.h:90
@ NET_TOKENCACHE_PACKETEXPIRY
Definition network.h:110
@ NET_MAX_CONSOLE_CLIENTS
Definition network.h:81
@ NET_PACKETFLAG_CONNLESS
Definition network.h:88
@ NET_MAX_PACKET_CHUNKS
Definition network.h:83
@ NET_TOKENCACHE_ADDRESSEXPIRY
Definition network.h:109
@ NET_CTRLMSG_CLOSE
Definition network.h:101
@ NET_MAX_CLIENTS
Definition network.h:80
@ NET_MAX_PACKETSIZE
Definition network.h:69
@ NET_PACKETFLAG_RESEND
Definition network.h:89
@ NET_CHUNKFLAG_VITAL
Definition network.h:94
@ NET_MAX_CONNLESS_PAYLOAD
Definition network.h:70
@ NET_CTRLMSG_CONNECT
Definition network.h:98
@ NET_PACKETFLAG_CONTROL
Definition network.h:87
@ NET_CTRLMSG_CONNECTACCEPT
Definition network.h:99
@ NET_PACKETFLAG_UNUSED
Definition network.h:85
@ NET_MAX_SEQUENCE
Definition network.h:82
@ NET_PACKETFLAG_TOKEN
Definition network.h:86
@ NET_CTRLMSG_ACCEPT
Definition network.h:100
@ NET_PACKETHEADERSIZE
Definition network.h:78
@ NET_PACKETFLAG_EXTENDED
Definition network.h:92
@ NET_CONN_BUFFERSIZE
Definition network.h:103
@ NET_MAX_CHUNKHEADERSIZE
Definition network.h:77
@ NET_TOKEN_NONE
Definition network.h:115
@ NET_TOKEN_MAX
Definition network.h:114
@ NET_TOKENREQUEST_DATASIZE
Definition network.h:118
@ NET_TOKEN_MASK
Definition network.h:116
Definition network.h:142
int m_DataSize
Definition network.h:148
unsigned char m_aExtraData[NET_CONNLESS_EXTRA_SIZE]
Definition network.h:151
const void * m_pData
Definition network.h:149
void AssertSizeSanity() const
Definition network.cpp:31
NETADDR m_Address
Definition network.h:146
int m_Flags
Definition network.h:147
int m_ClientId
Definition network.h:145
Definition network.h:543
CConsoleNetConnection m_Connection
Definition network.h:544
Definition network.h:429
CNetConnection m_Connection
Definition network.h:431
Definition network.h:435
NETADDR m_Addr
Definition network.h:436
int64_t m_LastSeen
Definition network.h:440
int m_Conns
Definition network.h:441
int64_t m_Time
Definition network.h:438
Definition types.h:168
Definition types.h:191