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
- Resolve the numeric index first: `ip link show wlan0` (or `cat /sys/class/net/wlan0/ifindex`), then `veil_shieldd -i <N>`.
- Optional flags: `-k <key_hex>` for the rotation key and `-p <passes>`; omit them to accept defaults.
- 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
- Resolve interface names to ifindex in launch scripts: $(cat /sys/class/net/wlan0/ifindex).
- Treat -k and -p as optional; only -i is required.
- Remember the banner's own warning: BUILD-ONLY / untested on hardware — do not ship as a control.
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
- Usage: %s -i <ifindex> [-k <key_hex>] [-p <passes>] BUILD-
- ENOMEM
- ENOMEM
- ${path}: ${res.status} ${res.statusText}
- brain corpus exceeds 1 MiB
AI-assisted analysis of ruvnet/RuView@4685618388 (2026-08-16).
Data as JSON: /api/errors/fbdca99103a944b6.
Report an issue: GitHub.