Pipe - vanilla-wiiu/vanilla GitHub Wiki

The Wii U's connection to the gamepad is based on a slightly obfuscated variant of 802.11n. The PTK (pairwise transient key), a key derived from the PSK (pre-shared key, or colloquially, the Wi-Fi password) during the ordinary WPA handshake and subsequently used to encrypt/decrypt all wireless traffic, is rotated 3 bytes to the left (i.e. 3 bytes from the beginning are moved to the end and all bytes are shifted up to take their place). This is a relatively minor obfuscation, but any devices that aren't specifically written to do that will fail to generate the right PTK and therefore be unable to communicate to the Wii U.

With only a few exceptions, most devices and operating systems do not provide enough low-level control to modify the PTK (the changes we need cannot be done by simply changing the PSK). The biggest exception is GNU/Linux, which is largely possible due to the open source and modular nature of it, but even then it relies on the wireless hardware not overriding the OS and handling the PTK itself (Broadcom wireless chipsets do this notoriously, which breaks native Raspberry Pi and Nintendo Switch support).

As such, it became necessary to separate off the "connection" portion of Vanilla so that devices that aren't capable of connecting directly can connect through a compatible intermediary. This is called a "pipe" in Vanilla's ecosystem, and Vanilla's frontend is capable of connecting to a pipe either locally or via a network.

The following are the supported pipes that can be used:

GNU/Linux

The most logical things to do is set up a virtual machine (or a separate PC) running a Linux distribution that also has direct hardware access to a compatible USB/PCI wireless card. From here, it's a relatively simple setup:

  • Open a terminal and find the name of the wireless interface you wish to use (virtual machines don't commonly have wireless interfaces, so there will most likely only be the one you captured):
    ip link
    
    (wireless interfaces usually start with either wl or wlan)
  • Launch vanilla-pipe in UDP mode with the wireless interface name you found in the previous step:
    sudo ./vanilla-pipe -udp <wireless-interface>
    
    For example, if the wireless interface was wlan0, the command would look like this:
    sudo ./vanilla-pipe -udp wlan0
    
    If everything started correctly, you should see text saying READY.
  • Determine your virtual machine's local IP address. This may be a little tricky depending on the virtual machine software you're using, but for the most part you should be able to retrieve it using a terminal in the Linux guest:
    ip address
    
    You'll need to determine which interface is the correct one. The connection the virtual machine makes to the host will most likely be a fake ethernet connection, so the interface will most likely start with en and have an IP address starting with 192.168. or 10. Once you've found the virtual machine's IP address, you can proceed to the next step.
  • Now, you can return to your client/frontend device and launch Vanilla.
    • From the main menu, click "Settings" in the top right corner.
    • Click "Connection"
    • Click "Via Server"
    • Enter the virtual machine's IP address.
    • Click "OK".
  • Done! You can now use Vanilla as normal and all communications will be made via the Linux virtual machine.

Most of these steps also apply to using a separate Linux PC on your network as the pipe, however this will likely be a more cumbersome setup and is generally not recommended.