Difference between revisions of "MK8 Network Protocol"

From MK8
Jump to navigation Jump to search
Line 5: Line 5:
 
== General description ==
 
== General description ==
  
The [[Mario Kart 8]] traffic starts with a name resolution. Other than MKWii, MK8 only looks up one domain (api-eu.olv.nintendo.net) which has multiple IP addresses with a TTL of 60:  
+
The [[Mario Kart 8]] traffic starts with a name resolution. The loginserver (api-eu.olv.nintendo.net) has multiple IP addresses with a TTL of 60:  
  
 
* 54.72.185.220
 
* 54.72.185.220
Line 13: Line 13:
 
and maybe some more
 
and maybe some more
  
Maybe the olv-server returns some IPs of the other servers, but it's SSL-encrypted and the server does not listen on HTTP.  
+
First the game connects the Nintendoservers, while racing, all WiiUs communicate directly to each other.
  
First the game connects the Nintendoserver, while racing, all WiiUs communicate directly to each other.
+
All P2P packets have a header, a payload and a checksum
  
All p2p packets have a header, and most of them have a payload (data) and a checksum
+
== The P2P header ==
  
<pre>
+
<pre>typedef struct udp_header_t
typedef struct p2p_header
 
 
{
 
{
   /*00*/  u32 id;         // always 32ab.9864
+
   /*00*/  u32 game_magic; // always 32ab.9864
   /*04*/  u16 unknown_04; // mostly 0x0100
+
   /*04*/  u32 unknown_04; //  
  /*06*/  u16          unknown_06;    // mostly 0x0000
+
   /*08*/  u16 unknown_08; // sequence id?
   /*08*/  u16 sequence_id; // any upcounting number. Number of answer is one higher than question
+
   /*0a*/  u16 unknown_0a; // sequence id 2 or empty
   /*0a*/  u16 sequence_id2;   // another sequence number. sometimes empty (0x0000)
+
   /*0c*/  u16 client_slot; // client slot (0 to b)
   /*0c*/  u16 unknown_0c;
+
   /*0e*/  u16 data_length; // little endian, data length without header and checksum
   /*0e*/  u16         length;         // indicates the length of the data part (without header and checksum)
+
   /*10*/  u32 unknown_10; // ?
   /*10*/  u32         unknown_10;     // mostly 0x00000000.
+
   /*14*/  u32 unknown_14; // sequence id 3?
   /*14*/  u16          unknown_14;
+
   /*18*/  u32 unknown_18; // ?
  /*16*/   u16          unknown_16
+
   /*1c*/  u32 unknown_1c; // always 0x00000000
   /*18*/  u32         unknown_18;
 
   /*1c*/  u32         unknown_1c;     // always 0x00000000
 
  /*1e*/
 
 
}
 
}
 +
__attribute__ ((packed)) udp_header_t;
 
</pre>
 
</pre>
  
After the header, there is some data (sometimes empty), and after the data there mostly follows a 16-byte-checksum which looks like a MD5 hash.
+
After the header, there is some data (sometimes empty), and after the data there is a 16-byte-checksum which looks like a MD5 hash.
 +
 
 +
== Record types ==
 +
 
 +
* [[MK8_Network_Protocol/USERINFO|USERINFO]]
  
 
[[category:File Format]]
 
[[category:File Format]]
 
[[category:Network Protocol|!]]
 
[[category:Network Protocol|!]]
 
[[mkw:MKWii Network Protocol]]
 
[[mkw:MKWii Network Protocol]]

Revision as of 22:52, 26 December 2014

This page describes the network protocol used by Mario Kart 8. It is very incomplete at this moment.

General description

The Mario Kart 8 traffic starts with a name resolution. The loginserver (api-eu.olv.nintendo.net) has multiple IP addresses with a TTL of 60:

  • 54.72.185.220
  • 54.229.32.160
  • 54.246.156.135
  • 176.34.135.172

and maybe some more

First the game connects the Nintendoservers, while racing, all WiiUs communicate directly to each other.

All P2P packets have a header, a payload and a checksum

The P2P header

typedef struct udp_header_t
{
  /*00*/   u32		game_magic;	// always 32ab.9864
  /*04*/   u32		unknown_04;	// 
  /*08*/   u16		unknown_08;	// sequence id?
  /*0a*/   u16		unknown_0a;	// sequence id 2 or empty
  /*0c*/   u16		client_slot; 	// client slot (0 to b)
  /*0e*/   u16		data_length; 	// little endian, data length without header and checksum
  /*10*/   u32		unknown_10; 	// ?
  /*14*/   u32		unknown_14; 	// sequence id 3?
  /*18*/   u32		unknown_18; 	// ?
  /*1c*/   u32		unknown_1c; 	// always 0x00000000
}
__attribute__ ((packed)) udp_header_t;

After the header, there is some data (sometimes empty), and after the data there is a 16-byte-checksum which looks like a MD5 hash.

Record types

mkw:MKWii Network Protocol