VoIP Server

The GVA VoIP Server (gva-voip-server) is a SIP registrar and proxy server designed for military vehicle communications. It manages user registration, call routing, and provides centralised logging of call activity.

Overview

sequenceDiagram participant C1 as Client 1 participant SRV as VoIP Server participant C2 as Client 2 Note over C1,SRV: Registration C1->>SRV: REGISTER SRV->>C1: 200 OK Note over C2,SRV: Registration C2->>SRV: REGISTER SRV->>C2: 200 OK Note over C1,C2: Call Setup C1->>SRV: INVITE (to C2) SRV->>C2: INVITE C2->>SRV: 180 Ringing SRV->>C1: 180 Ringing C2->>SRV: 200 OK (SDP) SRV->>C1: 200 OK (SDP) C1->>SRV: ACK SRV->>C2: ACK Note over C1,C2: RTP Media (Direct) C1<-->C2: Audio Stream Note over C1,C2: Call Teardown C1->>SRV: BYE SRV->>C2: BYE C2->>SRV: 200 OK SRV->>C1: 200 OK

Features

SIP Registration

  • User registration with configurable expiry
  • Multiple registrations per user (forking)
  • Registration state published to DDS

Call Routing

  • Direct call routing between registered users
  • Call forwarding support
  • Busy/unavailable handling

Call Detail Records (CDR)

The server maintains detailed logs of all calls:

2026-04-13 16:30:45 | operator1 -> operator2 | CONNECTED | 00:05:23 | G.729
2026-04-13 16:36:08 | operator2 -> agent.ai  | COMPLETED | 00:02:15 | MELPe

Quality of Service

  • DSCP EF (46) marking for voice packets
  • RTP packet prioritisation
  • Jitter buffer recommendations

Command Line Options

gva-voip-server [options]

Options:
  -h, --help               Show help message
  -v, --version            Show version
  -a, --address=<addr>     Bind address (default: 0.0.0.0)
  -p, --port=<port>        SIP listen port (default: 5060)
  -f, --groups-file=<path> Load conference groups from JSON file
  -g, --group=<name>       Add a conference group (repeatable)
  -w, --wideband           Use wideband codec profile (RFC 8817)
  --vivoe                  Use VIVOE audio codec profile (DEF STAN 00-082 Part 2)

Examples

# Start server with groups file
gva-voip-server -f /etc/gva-voip-server/groups.json

# Custom address and individual groups
gva-voip-server --address=192.168.1.1 -g command -g alpha -g bravo

Configuration

Default Ports

Service Port Protocol
SIP Signalling 5060 UDP/TCP
RTP Media 10000-10100 UDP

Supported Codecs

The server supports codec negotiation via SDP offer/answer. Four codec profiles are available, selectable via CLI (--vivoe, --wideband) or the "codecProfile" field in voip-settings.json.

Profile: Tactical (default)

STANAG 4591 MELPe with NATO fallbacks. Suitable for classified narrowband links.

RTP PT Codec Clock Rate Standard
96 MELPe 2400 bps 8000 STANAG 4591 / RFC 8130
97 MELPe 1200 bps 8000 STANAG 4591
98 MELPe 600 bps 8000 STANAG 4591
18 G.729D 8000 RFC 3551
8 PCMA (G.711 A-law) 8000 RFC 3551
0 PCMU (G.711 µ-law) 8000 RFC 3551

Profile: Tactical Wideband (--wideband)

TSVCIS wideband + narrowband fallback per RFC 8817.

RTP PT Codec Clock Rate Standard
99 TSVCIS WB 16000 bps 16000 RFC 8817
100 TSVCIS WB 12000 bps 16000 RFC 8817
101 TSVCIS WB 8000 bps 16000 RFC 8817
96 TSVCIS NB 2400 bps 8000 RFC 8817
97 TSVCIS NB 1200 bps 8000 RFC 8817
98 TSVCIS NB 600 bps 8000 RFC 8817
8 PCMA (G.711 A-law) 8000 RFC 3551

Profile: VIVOE (--vivoe) — DEF STAN 00-082 Part 2

Uncompressed PCM and G.711 encodings mandated by the VIVOE audio standard. Designed for high-fidelity in-vehicle audio distribution (intercoms, acoustic sensors, gunshot detection).

RTP PT Codec Clock Rate Channels Spec Reference
100 L20 (20-bit PCM) 192000 1 Appendix B.4 / RFC 3190
10 L16 (16-bit PCM) 48000 2 (stereo) Appendix B.3 / RFC 3551
99 L16 (16-bit PCM) 48000 1 (mono) Appendix B.3 / RFC 4856
11 L16 (16-bit PCM) 44100 1 (mono) RFC 3551 §4.5.11
102 L16 (16-bit PCM) 16000 1 (mono) Appendix B.3 (wideband)
103 L16 (16-bit PCM) 8000 1 (mono) Appendix B.3 (narrowband)
98 L8 (8-bit PCM) 8000 1 Appendix B.2 / RFC 3551
8 PCMA (G.711 A-law) 8000 1 Appendix C.2 / RFC 3551
0 PCMU (G.711 µ-law) 8000 1 RFC 3551 (mandatory)

SDP offers include a=ptime:5 and a=maxptime:10 per the DEF STAN examples.

Profile: Standard

Opus + G.711 for non-classified / commercial networks.

RTP PT Codec Clock Rate Standard
111 Opus fullband 48000 RFC 7587
110 Opus wideband 48000 RFC 7587
109 Opus narrowband 48000 RFC 7587
0 PCMU (G.711 µ-law) 8000 RFC 3551
8 PCMA (G.711 A-law) 8000 RFC 3551

DEF STAN 00-082 Part 2 Compliance

DEF STAN 00-082 Part 2 Issue 1 specifies the distribution and control of digital audio and acoustic data over VIVOE Ethernet networks. The table below summarises compliance status for each requirement area.

Audio Encoding — Compliance Matrix

Requirement Status Notes
L8 — 8-bit PCM (Appendix B.2) :material-check-circle:{ .success } Supported PT 98, L8/8000, VIVOE profile
L16 — 16-bit PCM (Appendix B.3) :material-check-circle:{ .success } Supported PT 10/11/99/102/103, multiple rates
L20 — 20-bit PCM (Appendix B.4) :material-check-circle:{ .success } Supported PT 100, L20/192000, RFC 3190
G.711 A-law (Appendix C.2) :material-check-circle:{ .success } Supported PT 8, PCMA/8000, all profiles
SDP codec negotiation (§11.5) :material-check-circle:{ .success } Supported Full SDP offer/answer per RFC 4566
RTP payload headers (§10) :material-check-circle:{ .success } Supported RFC 3550 compliant
a=ptime / a=maxptime (§B.2.2) :material-check-circle:{ .success } Supported 5 ms / 10 ms defaults

Infrastructure — Gap Analysis

The following DEF STAN 00-082 Part 2 infrastructure requirements are not yet implemented. These are transport and control-plane features that sit outside the SIP/RTP codec layer.

Requirement Status Gap Description
SAP session announcements (§11) :material-close-circle:{ .danger } Not implemented The standard requires service providers to announce RTP sessions via SAP (RFC 2974) on multicast 224.2.127.254:9875. The VoIP server currently uses SIP signalling only.
SNMP / VIVOE MIB (§12) :material-close-circle:{ .danger } Not implemented Session control via SNMP with the VIVOE MIB (audioFormatInfo, channelControl modules) is not present. The server uses SIP for all session management.
Multicast RTP distribution (§8.2) :material-close-circle:{ .danger } Not implemented The standard mandates audio streams on predefined multicast addresses (239.192.x.x). The server uses unicast SIP/RTP relay.
RTP-to-RTP transcoding :material-alert-circle:{ .warning } Partial The RTP relay is codec-agnostic pass-through. L16→PCMU transcoding exists in TestCallService only. Cross-format bridging between VIVOE and tactical codecs is not available.

Future: VIVOE Legacy Gateway

A dedicated VIVOE Gateway module is planned to bridge between the SIP-based VoIP server and legacy SAP/multicast VIVOE audio networks:

  • SAP announcer/listener — Publish and discover audio sessions via SAP multicast announcements (RFC 2974), translating between SIP INVITE/BYE and SAP announce/delete messages.
  • Multicast RTP bridge — Relay unicast RTP streams from SIP endpoints onto VIVOE multicast groups (239.192.x.x:5004) and vice versa, enabling interoperation with existing VIVOE-only equipment.
  • SNMP agent stub — Expose a minimal VIVOE MIB via SNMPv3 so legacy VIVOE management stations can discover and control audio channels on the server.

This will follow the existing Gateway plugin architecture as a loadable plugin alongside the Twilio gateway.

Example Usage

Starting the Server

# Basic startup
./build/bin/gva-voip-server --domain=0

# Production mode with CDR logging
./build/bin/gva-voip-server \
    --domain=0 \
    --dscp-ef \
    --cdr-file=/var/log/gva/voip-cdr.log \
    --headless

# VIVOE audio profile (DEF STAN 00-082 Part 2)
./build/bin/gva-voip-server --domain=0 --vivoe

Testing Registration

# Start server
./build/bin/gva-voip-server --domain=0 &

# Register clients
./build/bin/gva-voip-client --user=alice --server=127.0.0.1 &
./build/bin/gva-voip-client --user=bob --server=127.0.0.1 &

# Alice can now call [email protected]

Troubleshooting

Common Issues

Port already in use:

Error: Failed to bind to port 5060

Another SIP server or instance is running. Either stop it or use a different port:

./build/bin/gva-voip-server --port=5061

Registration timeout: Ensure firewall allows UDP traffic on ports 5060 and 10000-10100.

No audio: Check that RTP ports are not blocked and clients can reach each other directly.

See Also