Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
3.4 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //===========================================================================//
  6. #include "tier1/utlbuffer.h"
  7. #include "UDP_Socket.h"
  8. #include "NetChannel.h"
  9. #include "sm_protocol.h"
  10. #include "networksystem.h"
  11. //-----------------------------------------------------------------------------
  12. // Allocates memory for packets
  13. //-----------------------------------------------------------------------------
  14. static CUtlMemoryPool s_PacketBufferAlloc( NET_MAX_MESSAGE, 8, CUtlMemoryPool::GROW_SLOW );
  15. DEFINE_FIXEDSIZE_ALLOCATOR( CNetPacket, 32, CUtlMemoryPool::GROW_SLOW );
  16. //-----------------------------------------------------------------------------
  17. // Constructor, destructor
  18. //-----------------------------------------------------------------------------
  19. CNetPacket::CNetPacket()
  20. {
  21. m_pData = reinterpret_cast<byte*>( s_PacketBufferAlloc.Alloc() );
  22. m_nRefCount = 1;
  23. }
  24. CNetPacket::~CNetPacket()
  25. {
  26. s_PacketBufferAlloc.Free( m_pData );
  27. }
  28. void CNetPacket::AddRef()
  29. {
  30. ++m_nRefCount;
  31. }
  32. void CNetPacket::Release()
  33. {
  34. if ( --m_nRefCount <= 0 )
  35. {
  36. delete this;
  37. }
  38. }
  39. bool UDP_ReceiveDatagram( CUDPSocket *pSocket, CNetPacket* pPacket )
  40. {
  41. Assert( pPacket );
  42. netadr_t packetFrom;
  43. CUtlBuffer buf( pPacket->m_pData, NET_MAX_MESSAGE );
  44. if ( pSocket->RecvFrom( packetFrom, buf ) )
  45. {
  46. pPacket->m_From = packetFrom;
  47. pPacket->m_nSizeInBytes = buf.TellPut();
  48. return true;
  49. }
  50. return false;
  51. }
  52. CNetPacket *UDP_GetPacket( CUDPSocket *pSocket )
  53. {
  54. CNetPacket *pPacket = new CNetPacket;
  55. // setup new packet
  56. pPacket->m_From.SetType( NA_IP );
  57. pPacket->m_From.Clear();
  58. pPacket->m_flReceivedTime = g_pNetworkSystemImp->GetTime();
  59. pPacket->m_pSource = pSocket;
  60. pPacket->m_nSizeInBytes = 0;
  61. pPacket->m_Message.SetDebugName("inpacket.message");
  62. // then check UDP data
  63. if ( !UDP_ReceiveDatagram( pSocket, pPacket ) )
  64. {
  65. delete pPacket;
  66. return NULL;
  67. }
  68. Assert( pPacket->m_nSizeInBytes );
  69. // prepare bitbuffer for reading packet with new size
  70. pPacket->m_Message.StartReading( pPacket->m_pData, pPacket->m_nSizeInBytes );
  71. return pPacket;
  72. }
  73. void UDP_ProcessSocket( CUDPSocket *pSocket, IConnectionlessPacketHandler *pHandler, ILookupChannel *pLookup )
  74. {
  75. CNetPacket *pPacket;
  76. Assert( pSocket );
  77. // Get datagrams from sockets
  78. while ( ( pPacket = UDP_GetPacket ( pSocket ) ) != NULL )
  79. {
  80. /*
  81. if ( Filter_ShouldDiscard ( pPacket->m_From ) ) // filterning is done by network layer
  82. {
  83. Filter_SendBan( pPacket->m_From ); // tell them we aren't listening...
  84. continue;
  85. }
  86. */
  87. // Find the netchan it came from
  88. if ( *(unsigned int *)pPacket->m_pData == CONNECTIONLESS_HEADER )
  89. {
  90. g_pNetworkSystemImp->EnqueueConnectionlessNetworkPacket( pPacket, pHandler );
  91. }
  92. else
  93. {
  94. INetChannel *pNetChan = pLookup->FindNetChannel( pPacket->m_From );
  95. g_pNetworkSystemImp->EnqueueNetworkPacket( pPacket, static_cast<CNetChannel*>( pNetChan ) );
  96. }
  97. }
  98. }
  99. void UDP_ProcessConnectionlessPacket( CNetPacket *pPacket, IConnectionlessPacketHandler *pHandler )
  100. {
  101. // check for connectionless packet (0xffffffff) first
  102. Assert( *(unsigned int *)pPacket->m_pData == CONNECTIONLESS_HEADER );
  103. pPacket->m_Message.ReadLong(); // read the -1
  104. /*
  105. if ( net_showudp.GetInt() )
  106. {
  107. Msg("UDP <- %s: sz=%i OOB '%c'\n", info.m_pPacket->m_From.ToString(), pPacket->m_nSizeInBytes, pPacket->m_pData[4] );
  108. }
  109. */
  110. pHandler->ProcessConnectionlessPacket( pPacket );
  111. }