| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | // This file is public domain, in case it's useful to anyone. -comex
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | #include <array>
 | 
					
						
							|  |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-14 19:51:08 -08:00
										 |  |  | #define NETPLAY_CODE_SIZE 8
 | 
					
						
							|  |  |  | typedef std::array<char, NETPLAY_CODE_SIZE> TraversalHostId; | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | typedef u64 TraversalRequestId; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum TraversalPacketType | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // [*->*]
 | 
					
						
							|  |  |  |   TraversalPacketAck = 0, | 
					
						
							|  |  |  |   // [c->s]
 | 
					
						
							|  |  |  |   TraversalPacketPing = 1, | 
					
						
							|  |  |  |   // [c->s]
 | 
					
						
							|  |  |  |   TraversalPacketHelloFromClient = 2, | 
					
						
							|  |  |  |   // [s->c]
 | 
					
						
							|  |  |  |   TraversalPacketHelloFromServer = 3, | 
					
						
							|  |  |  |   // [c->s] When connecting, first the client asks the central server...
 | 
					
						
							|  |  |  |   TraversalPacketConnectPlease = 4, | 
					
						
							|  |  |  |   // [s->c] ...who asks the game host to send a UDP packet to the
 | 
					
						
							|  |  |  |   // client... (an ack implies success)
 | 
					
						
							|  |  |  |   TraversalPacketPleaseSendPacket = 5, | 
					
						
							|  |  |  |   // [s->c] ...which the central server relays back to the client.
 | 
					
						
							|  |  |  |   TraversalPacketConnectReady = 6, | 
					
						
							|  |  |  |   // [s->c] Alternately, the server might not have heard of this host.
 | 
					
						
							|  |  |  |   TraversalPacketConnectFailed = 7 | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   TraversalProtoVersion = 0 | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum TraversalConnectFailedReason | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   TraversalConnectFailedClientDidntRespond = 0, | 
					
						
							|  |  |  |   TraversalConnectFailedClientFailure, | 
					
						
							|  |  |  |   TraversalConnectFailedNoSuchClient | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma pack(push, 1)
 | 
					
						
							|  |  |  | struct TraversalInetAddress | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   u8 isIPV6; | 
					
						
							|  |  |  |   u32 address[4]; | 
					
						
							|  |  |  |   u16 port; | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | struct TraversalPacket | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   u8 type; | 
					
						
							|  |  |  |   TraversalRequestId requestId; | 
					
						
							| 
									
										
										
										
											2017-01-04 12:45:40 +01:00
										 |  |  |   union | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     struct | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       u8 ok; | 
					
						
							|  |  |  |     } ack; | 
					
						
							|  |  |  |     struct | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       TraversalHostId hostId; | 
					
						
							|  |  |  |     } ping; | 
					
						
							|  |  |  |     struct | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       u8 protoVersion; | 
					
						
							|  |  |  |     } helloFromClient; | 
					
						
							|  |  |  |     struct | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       u8 ok; | 
					
						
							|  |  |  |       TraversalHostId yourHostId; | 
					
						
							|  |  |  |       TraversalInetAddress yourAddress;  // currently unused
 | 
					
						
							|  |  |  |     } helloFromServer; | 
					
						
							|  |  |  |     struct | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       TraversalHostId hostId; | 
					
						
							|  |  |  |     } connectPlease; | 
					
						
							|  |  |  |     struct | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       TraversalInetAddress address; | 
					
						
							|  |  |  |     } pleaseSendPacket; | 
					
						
							|  |  |  |     struct | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       TraversalRequestId requestId; | 
					
						
							|  |  |  |       TraversalInetAddress address; | 
					
						
							|  |  |  |     } connectReady; | 
					
						
							|  |  |  |     struct | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       TraversalRequestId requestId; | 
					
						
							|  |  |  |       u8 reason; | 
					
						
							|  |  |  |     } connectFailed; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | #pragma pack(pop)
 |