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