WebRTC ICE compatibility
The August 24, 2026 AGNOS update (05140149fb) replaced the aiortc backend
with libdatachannel. libdatachannel-py==2026.1.0.dev2 embeds libdatachannel
v0.24.0 and libjuice revision 5948a4162d37bc213d6051b67ee2876ccc5a99a6.
That libjuice revision uses a zero ICE tie-breaker to mean "role attribute
absent". A present ICE-CONTROLLING attribute containing zero is consequently
rejected with STUN 400 Bad Request. This was captured on the device during
Connect attempts: its outgoing checks succeed, but it rejects the browser's
nominating checks. It remains at ICE Connected, never completes DTLS, and
Connect eventually reports that no direct peer-to-peer routes were found.
The patch records attribute presence separately from the 64-bit value. It does not change credentials, integrity checks, DTLS, camera handling, Sentry, media codecs, or data-channel behavior. It also continues to reject missing roles and rejects requests containing both role attributes.
Build and verify
On the target architecture, with git, uv, a C/C++ compiler and Python 3.12:
bash tools/webrtc/build_libdatachannel.sh /absolute/path/to/wheels /usr/bin/python3.12
This builds 2026.1.0.dev2+starpilot.ice1 in an isolated temporary environment
and runs real loopback UDP checks. Source and build directories are retained
for inspection. It does not install into the device's runtime environment.
To test an installed runtime independently:
/usr/local/venv/bin/python tools/webrtc/check_ice.py
The original wheel fails the zero-tie-breaker case; a corrected wheel must pass all cases, including invalid-authentication rejection. A successful loopback check is not proof that a Connect video session works; verify that separately.
Deployment
The correction is in a compiled dependency, not just openpilot Python source. A git pull alone does not replace the affected AGNOS library. Install the validated, architecture-matching wheel into the image's managed Python environment and run the check above when building a release image. Existing devices need that runtime update too. Back up the original package and its distribution metadata before a temporary device-side installation; a later AGNOS image or dependency sync can otherwise overwrite the hotfix.
AGNOS normally mounts the OS read-only. For a reversible live test, the corrected extension can be bind-mounted read-only over the original extension file. This leaves the OS partition unchanged, but the test hotfix is lost on reboot. Do not confuse that with deploying a corrected release image.
Upstream sources: Python bindings, libjuice. The libjuice source modification is covered by its MPL-2.0 license.