{"record":{"id":"c5554428feb5d2eb","repo":"ruvnet/RuView","slug":"enotsup-c55544","errorCode":"ENOTSUP","errorMessage":"veil: [blob-blocked] MU-MIMO group shuffle needs a vendor subcmd / firmware patch (TODO(hw))\n","messagePattern":"veil: \\[blob-blocked\\] MU-MIMO group shuffle needs a vendor subcmd / firmware patch \\(TODO\\(hw\\)\\)\n","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"wifi-veil/firmware/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/wifi-veil/firmware/openwrt/veil_shieldd.c#L153-L189","documentation":"Byte-identical vendored copy of the MU-MIMO stub. On every NEW_STATION/DEL_STATION nl80211 event the daemon calls `veil_shuffle_mumimo_groups`, which is an explicit no-op: on mt76/ath the MU groups and steering matrices live inside WiFi MCU firmware with no upstream vendor subcmd to reach them. It logs `[blob-blocked] ... TODO(hw)` on stderr and returns `-ENOTSUP` rather than pretending success.","triggerScenarios":"Any station join/leave on the monitored AP while the daemon is running — expected during normal operation; the message recurs per event.","commonSituations":"Log triage mistaking the recurring notice for an error; alert rules matching `veil:` prefix paging on it.","solutions":["Accept it as an informational limitation; the daemon continues and the return value is ignored by design.","Exclude `blob-blocked` lines from alerting/log collection.","If the capability is required, plan the vendor-subcmd/firmware work described in INTEGRATION.md §3 — no userspace workaround exists."],"exampleFix":"# before: alert on any veil: line\nlogread -f | grep 'veil:'\n# after: ignore the documented stub notice\nlogread -f | grep 'veil:' | grep -v 'blob-blocked'","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"int rc = veil_shuffle_mumimo_groups(c);\nif (rc == -ENOTSUP) {\n    /* expected: firmware-blocked on mt76/ath; skip silently or rate-limit logging */\n}","preventionTips":["Filter 'blob-blocked' lines out of monitoring pipelines.","Do not build feature claims around MU-MIMO shuffling on commodity AP silicon.","Read INTEGRATION.md §3 before scoping the vendor-subcmd work this stub reserves."],"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"}