Freeze one call, one client and one network
Record the exact Linphone or Liblinphone build, operating system, account, peer, call direction, timestamp, interface, address family and network class. Classify the first observed symptom: no candidates, only host candidates, no relay candidate, a failed TURN allocation, candidates missing from peer SDP, all pairs failed, a direct pair selected but silent, a relay pair selected but silent, or media lost after a network or session change.
Do not collapse those states into “NAT problem.” Registration, server discovery, STUN binding, TURN authentication, allocation, candidate signaling, ICE checks, selected pair, packet flow and audible media have different owners. Preserve the failed state before clearing configuration, reinstalling the client or swapping public services.
Read the effective NatPolicy before testing servers
Confirm whether ICE, STUN, TURN or UPnP is effectively enabled for the affected account and runtime. Liblinphone permits ICE with local candidates only, gives TURN precedence over STUN when both are enabled and documents UPnP as disabling the other policies. A remembered screen value or provisioning file is not proof that the running account uses the same object.
Record the server, username lookup, TURN transport, any fixed NAT address and the configuration owner. If several accounts exist, prove which policy the call uses. Do not enable every mechanism as a diagnostic shortcut; that changes candidate generation, credentials and gateway state at once.
Prove discovery, authentication and allocation in order
Resolve the configured hostname from the affected network and preserve the returned address family and time. For STUN, distinguish a DNS result from a successful binding response. For TURN, retain the selected UDP, TCP or TLS transport, certificate result when applicable, authentication challenge, authorized credential lookup, allocation response and lifetime.
A successful STUN binding proves only that traffic exchanged with that server and an observed mapped address was returned. It does not prove peer reachability. A TURN credential error is not an ICE checklist failure, while a valid allocation that never becomes a candidate or selected pair is not a media result.
Compare gathered candidates with both SDP bodies
Capture sanitized local diagnostics plus the exact offer and answer for the failed session. Confirm which host, server-reflexive and relayed candidates were gathered, whether the complete set reached the peer and whether ICE credentials and media components align. RFC 8839 keeps candidate signaling and offer-answer procedures explicit; an application can gather a candidate that an intermediary or peer never receives.
Do not publish private addresses, ICE passwords or TURN credentials. Use bounded identifiers, candidate types, foundations, priorities, transport and address family to correlate the transaction. If the peer does not support the selected ICE behavior, record that interoperability boundary rather than forcing a general compatibility claim.
Follow checks to the selected pair and actual RTP path
Inspect checklist progression, pair state, nomination and the final selected local and remote candidates. Then compare them with packet source and destination, bidirectional byte counters, media-protection state and decoded audio. A relayed candidate in SDP is not evidence that TURN carried the call; a selected direct pair is not evidence that both directions passed the firewall.
If ICE succeeds but protected media or decoding fails, continue at the DTLS, SRTP, codec or audio-device boundary instead of rotating the STUN server. If the pair changes after hold, transfer or network handover, treat the new path as a new evidence interval.
Correct one owner and repeat direct and relay controls
Correct only the demonstrated failure: policy assignment, DNS, server reachability, credential, TURN transport, allocation, candidate delivery, peer handling, firewall rule, security negotiation or audio rendering. Keep the previous configuration and repeat the original network, a known-good network and an authorized relay-required control where practical.
Acceptance requires the expected candidate types, successful checks, intended selected path, increasing bidirectional media counters and an audible two-way result. Repeat after restart and the original network or session transition. No client, account, network, server, credential, candidate, SDP exchange, packet, relay path or call was inspected or tested for this diagnostic.
Sources & applicability
Primary references for the technical details above. Operational examples and planning checklists are VoIP.info editorial guidance.
- Liblinphone latest NatPolicy API ↗
- Liblinphone 5.5 network parameters ↗
- Linphone ICE feature guide ↗
- RFC 8445: Interactive Connectivity Establishment ↗
- RFC 8489: Session Traversal Utilities for NAT ↗
- RFC 8656: Traversal Using Relays around NAT ↗
- RFC 8839: SDP offer-answer procedures for ICE ↗
Examples require adaptation to your topology. No live PBX or hardware testing is claimed.