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)

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. Clients advertise their supported codecs and the server facilitates negotiation:

Payload Type Codec Clock Rate
0 PCMU (G.711 μ-law) 8000
8 PCMA (G.711 A-law) 8000
18 G.729 8000
96 MELPe 2400 8000
97 TSVCIS (STANAG 4591) 8000
111 Opus 48000

DDS Integration

The VoIP Server publishes registration and call state to the DDS domain:

Topics Published

  • P_VoIP_Registration - User registration events
  • P_VoIP_CallState - Active call information
  • P_VoIP_Statistics - Server statistics

Topics Subscribed

  • C_VoIP_Config - Dynamic configuration updates

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

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 bob@127.0.0.1

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