Experimental: IPSC3 supports a dashboard-managed c-Bridge (CC-CC) trunk using the optional Rust edge adapter, ipsc-ccbridge. It is disabled until configured and needs a supervised real c-Bridge interoperability test before production use. It is not bMaster+. CC-CC processing remains in a separate service outside the core voice loop.
The c-Bridge talks to the adapter using TCP control and RTP/UDP voice. The adapter exchanges standard OpenBridge v1 packets with IPSC3, preferably over loopback. Existing IPSC3 talkgroup allowlists, timeslot/talkgroup mappings and trunk-to-trunk policy still apply. Only groups explicitly enabled on that trunk are routed.
Each conduit has an agreed Link ID (LID), its own TCP session and RTP sync source/SSRC, and one configured OpenBridge talkgroup. The far side's talkgroup number is informational, not the routing key. Multiple LIDs to the same c-Bridge can carry independent calls. Agree the LID and which side initiates TCP with the remote operator.
| Transport | Default Port | Purpose |
|---|---|---|
| TCP | 42421 | Registration and call start/end signalling |
| UDP | 42422 | RTP voice and application keepalives |
| UDP | 42420 | Source-pinned link-test reflection |
Registration has eight request and seven response lines, with AMBE and 60 ms required. Each voice packet contains a 12-byte RTP header and three padded seven-byte AMBE units. c-Bridge's 49-bit voice data uses an additional 18/18/13 lane permutation; ordinary Motorola IPSC packing cannot be substituted. Conversion applies that permutation and DMR FEC without decoding to PCM or using a vocoder.
Voice uses RTP payload type 94, a first-packet marker, and timestamps advancing by 480 per 60 ms position. Sequence gaps remain visible; duplicate/late frames are dropped. Reconstructed DMR traffic contains full and embedded link control. The OpenBridge leg uses 53 signed DMRD bytes plus 20 bytes of HMAC-SHA1, with external TS1 mapped to the desired local timeslot.
A nonzero first RTP sequence is anchored to a fresh outgoing DMR voice sync, with later relative gaps retained. Tests include the matched AMBE vector, real loopback sockets and a separate bidirectional exchange against the independently built C reference inside an isolated network namespace. This is not a supervised on-air c-Bridge commissioning test.
Sixteen-byte PT127 keepalives are sent every ten seconds by default. Missing received keepalives close a link after 35 seconds even if TCP remains connected. Reflection is bounded to avoid keepalive ping-pong. Calls without voice end after three seconds by default; connection loss also ends active calls. TCP signalling, reconnects and bounded queues run in the independent adapter, outside IPSC3's live packet loops.
The dashboard integration and managed adapter support were deployed on the VK server on 4 November 2026. The existing RF/POC daemons were not restarted. No real c-Bridge connection was enabled by that deployment; supervised field testing remains necessary. Other regional servers have not received this feature yet.
The private loopback connection, infrastructure ID and random HMAC key are generated automatically. LIDs are mapped onto internal OpenBridge group numbers, then translated to local TG/TS by existing IPSC3 routing. Normal listen-only and trunk-to-trunk rules still apply. No schema migration is required, and roaming through this group-voice-only trunk is disabled.
Saving trunks or mappings uses the existing IPSC3 routing restart behavior: do not save changes during a net. No enabled LID mappings keeps the adapter stopped. Disabling/deleting the trunk stops its adapter and removes generated configuration. Activation failures are reported rather than falsely described as successful. Each enabled adapter has its own unprivileged systemd instance and is restored with IPSC3 at boot.
The runtime display now uses a separate, secret-free heartbeat from the adapter every five seconds. Missing, invalid or older-than-15-second status means disconnected, regardless of the internal OpenBridge socket. Individual conduit states and counters show voice counts, gaps, authentication/validation rejects, queue drops and send errors. Status files are written on a bounded background worker, not synchronously in media processing. The ipsc3view API uses display kind cc_bridge with the same status; existing endpoint and secret redaction remains in force.
The repository includes deploy/ccbridge/ccbridge.toml.example, an optional systemd installer and detailed setup instructions in docs/CC-BRIDGE.md. Real configuration contains a shared secret and must remain private. The --check command validates without opening network sockets. Installing the optional unit does not enable or start it.
Manual standalone operation is still available with an ordinary OpenBridge trunk and matching loopback endpoints/key; leave Enhanced OpenBridge off. This manual mode does not have dashboard-generated configuration or remote CC-CC status. The normal dashboard c-Bridge option hides and manages that internal transport for you.
This profile supports group voice only, not private calls, SMS, ARS, GPS signalling or Enhanced OpenBridge. The group descriptor is mandatory unless a specific trusted, group-only legacy peer is explicitly allowed to use short B-on messages. A malformed or unsupported start clears old call context instead of forwarding later audio to a previous group.
CC-CC has no authentication or encryption: restrict its ports to configured peer IPs and keep the authenticated OpenBridge leg on loopback or protected private transport. IP/SSRC checks are not cryptographic authentication. The implementation leaves existing daemon listeners, live service configuration and RF/POC codecs unchanged.
The wire-format findings and matched AMBE test vector are credited to N0MJS cc2obp, revision 40d9f9e216543c405ef7d7dffe5d465cc1aa34eb. Its interoperability notes are not a vendor specification. IPSC3 independently implements those protocol facts in Rust; the third-party C program is not bundled.