> ## Documentation Index
> Fetch the complete documentation index at: https://wireblast.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Install

> Get the binary, check the handful of requirements, and fix the one setting that trips up first runs.

Wireblast is one static binary with no runtime dependencies. No libpcap, no DPDK, no kernel modules, no cgo.

## Requirements

|                   |                                                                                                                              |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| **OS**            | Linux. AF\_XDP is a Linux kernel facility, so there's no macOS or Windows build.                                             |
| **Kernel**        | 5.4 or newer. 5.9+ is strongly preferred, for the reason below.                                                              |
| **Privileges**    | root, or the `cap_net_raw`, `cap_bpf` and `cap_sys_resource` capabilities.                                                   |
| **NIC**           | Anything AF\_XDP works on. Fastest on drivers with native XDP support: Intel `ixgbe` and `i40e`, Mellanox `mlx5`, AWS `ena`. |
| **Locked memory** | A few hundred MB, depending on queue count. The default limit is usually too low. See [Locked memory](#locked-memory).       |

<Tip>
  **Why 5.9+ matters.** On 5.9 and later the XDP program is held by a BPF link that the kernel tears down when the process dies, so a crashed or `kill -9`'d Wireblast cleans up after itself. On older kernels a dead process can leave the program attached, and you clear it by hand with `sudo ip link set dev eth1 xdp off`.
</Tip>

## Get the binary

<Tabs>
  <Tab title="Release binary">
    | Platform | Architecture    | Download                       |
    | -------- | --------------- | ------------------------------ |
    | Linux    | x86-64 / amd64  | `wireblast_linux_amd64.tar.gz` |
    | Linux    | arm64 / aarch64 | `wireblast_linux_arm64.tar.gz` |

    ```bash theme={null}
    curl -sSL https://github.com/atoonk/wireblast/releases/latest/download/wireblast_linux_amd64.tar.gz \
      | tar xz
    sudo install -m 0755 wireblast /usr/local/bin/
    wireblast --version
    ```

    Swap `amd64` for `arm64` on ARM hardware. The `releases/latest/download/…` URLs always resolve to the newest release, so they're safe to script against. Each release also publishes a `checksums.txt` for verification.

    The arm64 build runs on modern 64-bit Raspberry Pis (Pi 4, Pi 5, Zero 2 W and newer, on a 64-bit OS). Their onboard NIC has no native XDP, though, so Wireblast falls back to generic mode there: it works, just not at line rate.
  </Tab>

  <Tab title="go install">
    Needs Go 1.25 or newer.

    ```bash theme={null}
    go install github.com/atoonk/wireblast/cmd/wireblast@latest
    ```

    That drops the binary in `$(go env GOPATH)/bin`. Since Wireblast needs root, copy it somewhere on root's `PATH` or invoke the full path. `sudo wireblast` will not find a binary that only exists in your user's `GOPATH`.
  </Tab>

  <Tab title="From source">
    ```bash theme={null}
    git clone https://github.com/atoonk/wireblast
    cd wireblast
    CGO_ENABLED=0 go build -o wireblast ./cmd/wireblast
    sudo install -m 0755 wireblast /usr/local/bin/
    ```

    `CGO_ENABLED=0` is the point: you get a fully static binary you can copy to any Linux box of the same architecture.
  </Tab>
</Tabs>

## Privileges

The simple answer is `sudo wireblast`. AF\_XDP has to create raw sockets and load an XDP program, and both need privileges.

If you'd rather not run it as root, grant the capabilities once:

```bash theme={null}
sudo setcap cap_net_raw,cap_bpf,cap_sys_resource+ep $(command -v wireblast)
```

After that it runs as your normal user. Re-apply it whenever you replace the binary, since capabilities are attached to the file rather than the name.

Skip this and Wireblast tells you before it touches anything:

```text theme={null}
error  insufficient privileges
       AF_XDP needs to create raw sockets and load an XDP program, which
       requires root or CAP_NET_RAW.
```

## Locked memory

This is the one that catches people on the first run.

AF\_XDP packet buffers live in a UMEM, a region of memory the kernel keeps locked into RAM, one per queue. A 12-queue run needs roughly 120 MB of locked memory, and the common default limit is 8 MB.

Wireblast raises **its own** soft limit to the hard limit automatically before it checks. If that still isn't enough, it stops and hands you the exact command:

```text theme={null}
error  locked-memory limit too low
       this run needs about 118 MiB of locked memory (12 queues x 4096 frames
       x 2048 bytes), but the limit is 8 MiB.
       Raise it for this shell:
         ulimit -l 121634
       or permanently in /etc/security/limits.conf:
         * hard memlock unlimited
         * soft memlock unlimited
       Alternatively use fewer queues (--queues 3).
```

All three fixes work. `ulimit -l` is fine for a one-off, `limits.conf` if you'll be doing this regularly, and `--queues` if you'd rather not change host settings at all.

<Warning>
  Wireblast never reconfigures your host. It will tell you that `ip link set eth1 mtu 3000` would help. It will not run it. That applies to MTU, queue counts, routes, addresses and every other system-wide setting: the recommendations are yours to accept or ignore.
</Warning>

## Check it works

```bash theme={null}
wireblast --version
```

You don't need a NIC, a link, or root for that one. To actually put packets on a wire, head to the [quickstart](/quickstart), which also shows you how to build a throwaway `veth` pair if you don't have a spare interface to point it at.
