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