1 //====== Copyright Valve Corporation, All rights reserved. ==================== 2 3 #ifndef STEAMNETWORKINGSOCKETS_P2P_ICE_H 4 #define STEAMNETWORKINGSOCKETS_P2P_ICE_H 5 #pragma once 6 7 #include "steamnetworkingsockets_p2p.h" 8 #include "steamnetworkingsockets_udp.h" 9 #include <mutex> 10 11 #ifdef STEAMNETWORKINGSOCKETS_ENABLE_ICE 12 13 #include "../../external/steamwebrtc/ice_session.h" 14 15 extern "C" CreateICESession_t g_SteamNetworkingSockets_CreateICESessionFunc; 16 17 namespace SteamNetworkingSocketsLib { 18 19 constexpr int k_nMinPingTimeLocalTolerance = 5; 20 21 class CSteamNetworkConnectionP2P; 22 struct UDPSendPacketContext_t; 23 24 /// Transport for peer-to-peer connection using WebRTC 25 class CConnectionTransportP2PICE final 26 : public CConnectionTransportUDPBase 27 , public CConnectionTransportP2PBase 28 , private IICESessionDelegate 29 { 30 public: 31 CConnectionTransportP2PICE( CSteamNetworkConnectionP2P &connection ); 32 virtual ~CConnectionTransportP2PICE(); 33 Connection()34 inline CSteamNetworkConnectionP2P &Connection() const { return *assert_cast< CSteamNetworkConnectionP2P *>( &m_connection ); } Signaling()35 inline ISteamNetworkingConnectionSignaling *Signaling() const { return Connection().m_pSignaling; } 36 37 void Init(); 38 39 // CConnectionTransport overrides 40 virtual void TransportPopulateConnectionInfo( SteamNetConnectionInfo_t &info ) const override; 41 virtual void GetDetailedConnectionStatus( SteamNetworkingDetailedConnectionStatus &stats, SteamNetworkingMicroseconds usecNow ) override; 42 virtual void TransportFreeResources() override; 43 virtual bool BCanSendEndToEndData() const override; 44 45 // CConnectionTransportP2PBase 46 virtual void P2PTransportUpdateRouteMetrics( SteamNetworkingMicroseconds usecNow ) override; 47 virtual void P2PTransportThink( SteamNetworkingMicroseconds usecNow ) override; 48 49 /// Fill in SDR-specific fields to signal 50 void PopulateRendezvousMsg( CMsgSteamNetworkingP2PRendezvous &msg, SteamNetworkingMicroseconds usecNow ); 51 void RecvRendezvous( const CMsgICERendezvous &msg, SteamNetworkingMicroseconds usecNow ); 52 LogLevel_P2PRendezvous()53 inline int LogLevel_P2PRendezvous() const { return m_connection.m_connectionConfig.m_LogLevel_P2PRendezvous.Get(); } 54 55 // In certain circumstances we may need to buffer packets 56 ShortDurationLock m_mutexPacketQueue; 57 CUtlBuffer m_bufPacketQueue; 58 59 //EICECandidateType m_eCurrentRouteLocalCandidateType; 60 //EICECandidateType m_eCurrentRouteRemoteCandidateType; 61 SteamNetworkingIPAddr m_currentRouteRemoteAddress; 62 ESteamNetTransportKind m_eCurrentRouteKind; 63 int m_nAllowedCandidateTypes; // k_EICECandidate_xxx 64 65 private: 66 IICESession *m_pICESession; 67 68 // Implements IICESessionDelegate 69 virtual void Log( IICESessionDelegate::ELogPriority ePriority, const char *pszMessageFormat, ... ) override; 70 virtual void OnData( const void *pData, size_t nSize ) override; 71 virtual void OnLocalCandidateGathered( EICECandidateType eType, const char *pszCandidate ) override; 72 virtual void OnWritableStateChanged() override; 73 virtual void OnRouteChanged() override; 74 75 void RouteOrWritableStateChanged(); 76 void UpdateRoute(); 77 78 void DrainPacketQueue( SteamNetworkingMicroseconds usecNow ); 79 void ProcessPacket( const uint8_t *pData, int cbPkt, SteamNetworkingMicroseconds usecNow ); 80 81 // Implements CConnectionTransportUDPBase 82 virtual bool SendPacket( const void *pkt, int cbPkt ) override; 83 virtual bool SendPacketGather( int nChunks, const iovec *pChunks, int cbSendTotal ) override; 84 virtual void TrackSentStats( UDPSendPacketContext_t &ctx ) override; 85 virtual void RecvValidUDPDataPacket( UDPRecvPacketContext_t &ctx ) override; 86 }; 87 88 } // namespace SteamNetworkingSocketsLib 89 90 #endif // #ifdef STEAMNETWORKINGSOCKETS_ENABLE_ICE 91 92 #endif // STEAMNETWORKINGSOCKETS_P2P_ICE_H 93