{"record":{"id":"508f5a7bf93b67b6","repo":"ruvnet/RuView","slug":"enotsup","errorCode":"ENOTSUP","errorMessage":"veil: [blob-blocked] MU-MIMO group shuffle needs a vendor subcmd / firmware patch (TODO(hw))","messagePattern":"veil: \\[blob-blocked\\] MU-MIMO group shuffle needs a vendor subcmd / firmware patch \\(TODO\\(hw\\)\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"firmware/privshield/openwrt/veil_shieldd.c","lineNumber":171,"sourceCode":"    fprintf(stderr, \"veil: [feasible/indirect] next sounding jitter = %u ms \"\n                    \"(TODO(hw): apply via hostapd ctrl_iface)\\n\", ms);\n    return 0;\n}\n\n/* ---------------------------------------------------------------------- */\n/* CONTROL 3 (MOSTLY BLOB-BLOCKED): MU-MIMO group shuffling.               */\n/* The MU group definition + steering matrices are computed and applied in */\n/* the WiFi MCU firmware on mt76 (mt7915) and all ath1x parts. There is no */\n/* generic nl80211 command to reshuffle MU groups. Only a vendor subcmd    */\n/* (NL80211_CMD_VENDOR) on a driver that chose to expose one could do it.  */\n/* ---------------------------------------------------------------------- */\nstatic int veil_shuffle_mumimo_groups(struct veil_ctx *c) {\n    (void)c;\n    /* TODO(hw): requires NL80211_CMD_VENDOR + a driver-specific\n     * NL80211_ATTR_VENDOR_ID / _SUBCMD / _DATA that does not exist upstream\n     * for mt76/ath. Without a driver+firmware patch this is unreachable.\n     * See INTEGRATION.md §3. Left as an explicit no-op, not a fake success. */\n    fprintf(stderr, \"veil: [blob-blocked] MU-MIMO group shuffle needs a \"\n                    \"vendor subcmd / firmware patch (TODO(hw))\\n\");\n    return -ENOTSUP;\n}\n\n/* ---------------------------------------------------------------------- */\n/* CONTROL 4 (BLOB-BLOCKED on commodity AP silicon): the keyed rotation.   */\n/* This is the actual VEIL transform — a keyed Givens rotation on the fine */\n/* subspace of the compressed beamforming feedback (the phi/psi angles),   */\n/* or equivalently a unitary Q on the LTF spatial mapping. On mt76/ath the */\n/* feedback report is generated and the precoder applied inside firmware,  */\n/* so userspace cannot edit it. This function shows WHERE the core plugs   */\n/* in for the platforms that CAN reach the buffer (openwifi FPGA datapath, */\n/* Nexmon Broadcom patch) — it operates on a caller-supplied fine block.   */\n/* ---------------------------------------------------------------------- */\nstatic int veil_apply_keyed_rotation(struct veil_ctx *c,\n                                     float *fine, size_t n) {\n    if (!fine || n < 2) return -EINVAL;\n    /* Pure, orthogonal, energy-preserving (the \"not jamming\" invariant). */","sourceCodeStart":153,"sourceCodeEnd":189,"githubUrl":"https://github.com/ruvnet/RuView/blob/4685618388a5e49fad5b3005806f3bdd6a7c25c3/firmware/privshield/openwrt/veil_shieldd.c#L153-L189","documentation":"This is an intentional, documented stub, not a fault. `veil_shuffle_mumimo_groups` fires on every NL80211_CMD_NEW_STATION/DEL_STATION event, but MU-MIMO group shuffling needs a vendor-specific nl80211 subcommand or patched WiFi MCU firmware that does not exist upstream for mt76/ath. The function deliberately logs on stderr and returns `-ENOTSUP` instead of faking success, per the comment and INTEGRATION.md §3.","triggerScenarios":"Any client associating or leaving the AP while the daemon monitors MLME multicast events — i.e. normal operation. The message repeats on each membership change and the daemon continues running.","commonSituations":"Operators reading router logs who mistake the recurring notice for a malfunction; monitoring/alerting wired to stderr that pages on every line; CI running against a softAP.","solutions":["Treat it as informational: no action is required and nothing is broken; the caller ignores the return value by design.","Filter it from logs (`logread | grep -v 'blob-blocked'`) or rate-limit stderr if station churn makes it noisy.","Only a vendor subcmd (NL80211_CMD_VENDOR) or an openwifi-style FPGA datapath can make this path real — see INTEGRATION.md §3 before promising the capability."],"exampleFix":"/* before: logs on every station event */\n(void)veil_shuffle_mumimo_groups(c);\n/* after: rate-limit the expected ENOTSUP notice */\nstatic time_t last_mumo;\nif (time(NULL) - last_mumo > 60) { (void)veil_shuffle_mumimo_groups(c); last_mumo = time(NULL); }","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"/* caller already degrades gracefully by design */\nint rc = veil_shuffle_mumimo_groups(c);\nif (rc == -ENOTSUP) {\n    /* expected on mt76/ath: no vendor subcmd exists; skip, do not alert */\n} else if (rc < 0) {\n    fprintf(stderr, \"veil: mumimo shuffle rc=%d\\n\", rc);\n}","preventionTips":["Exclude 'blob-blocked' stderr lines from alerting and dashboards.","Rate-limit the notice if station churn makes logs noisy.","Never present MU-MIMO shuffling as a working feature on mt76/ath — it is firmware-blocked by design."],"tags":["c","openwrt","mumimo","hardware-limitation","stub","nl80211"],"backgroundTag":null,"analyzedSha":"4685618388a5e49fad5b3005806f3bdd6a7c25c3","analyzedAt":"2026-08-16T06:09:40.886Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}