ruvnet/RuView · info

Usage: %s -i <ifindex> [-k <key_hex>] [-p <passes>] BUILD-

Error message

Usage: %s -i <ifindex> [-k <key_hex>] [-p <passes>]
  BUILD-ONLY / UNTESTED-ON-HARDWARE. See README.md.

What it means

The daemon's usage banner, printed to stderr when required options are missing (notably `-i <ifindex>`), an unknown flag is passed, or help is requested. The text itself warns that the binary is BUILD-ONLY / UNTESTED-ON-HARDWARE and points at README.md. `ifindex` is the numeric interface index, not the interface name.

Source

Thrown at firmware/privshield/openwrt/veil_shieldd.c:234

        /* TODO(hw): parse NL80211_ATTR_FRAME; classify VHT/HE compressed
         * beamforming action (category 21/30) or NDPA to measure solicitation
         * cadence. Requires the driver to forward these frames (registered via
         * NL80211_CMD_REGISTER_FRAME / monitor). Not guaranteed upstream. */
        (void)veil_randomize_sounding_cadence(c);
        break;
    case NL80211_CMD_NEW_STATION:
    case NL80211_CMD_DEL_STATION:
        /* Membership churn changes MU grouping surface. */
        (void)veil_shuffle_mumimo_groups(c);
        break;
    default:
        break;
    }
    return NL_SKIP;
}

static void usage(const char *p) {
    fprintf(stderr,
        "Usage: %s -i <ifindex> [-k <key_hex>] [-p <passes>]\n"
        "  BUILD-ONLY / UNTESTED-ON-HARDWARE. See README.md.\n", p);
}

int main(int argc, char **argv) {
    memset(&g_ctx, 0, sizeof(g_ctx));
    g_ctx.key = 0xA5A5A5A5A5A5A5A5ULL; /* placeholder; real key from keystore */
    g_ctx.passes = VEIL_DEFAULT_PASSES;
    g_ctx.ifindex = -1;
    g_ctx.running = 1;

    int opt;
    while ((opt = getopt(argc, argv, "i:k:p:h")) != -1) {
        switch (opt) {
        case 'i': g_ctx.ifindex = atoi(optarg); break;
        case 'k': g_ctx.key = strtoull(optarg, NULL, 16); break;
        case 'p': g_ctx.passes = (size_t)strtoul(optarg, NULL, 10); break;
        case 'h': default: usage(argv[0]); return (opt == 'h') ? 0 : 2;

View on GitHub (pinned to 4685618388)

Solutions

  1. Resolve the numeric index first: `ip link show wlan0` (or `cat /sys/class/net/wlan0/ifindex`), then `veil_shieldd -i <N>`.
  2. Optional flags: `-k <key_hex>` for the rotation key and `-p <passes>`; omit them to accept defaults.
  3. Read README.md before relying on it — the binary self-identifies as build-only and untested on hardware.

Example fix

# before
veil_shieldd -i wlan0
# after
veil_shieldd -i $(cat /sys/class/net/wlan0/ifindex) -k deadbeefdeadbeef -p 4
Defensive patterns

Strategy: validation

Validate before calling

#!/bin/sh
[ $# -ge 2 ] || { echo "missing -i <ifindex>"; veil_shieldd; exit 2; }
case "$2" in (*[!0-9]*|'') echo "ifindex must be numeric"; exit 2;; esac
[ -e "/sys/class/net/*/ifindex" ] 2>/dev/null
exec veil_shieldd "$@"

Prevention

When it happens

Trigger: Launching without `-i`; passing an interface name instead of a number (`-i wlan0`); supplying an unrecognized option; running `veil_shieldd` with no arguments to see help.

Common situations: First run on a router; scripts that copy the usage string literally (including `%s`); confusion between interface name and ifindex; forgetting the optional `-k`/`-p` semantics.

Related errors


AI-assisted analysis of ruvnet/RuView@4685618388 (2026-08-16). Data as JSON: /api/errors/fbdca99103a944b6. Report an issue: GitHub.