A VoLTE call, step by step
Short version: a VoLTE call is two networks agreeing twice. SIP agrees what the call is; Diameter builds the radio bearer that carries it. The precondition machinery exists to stop the phone ringing before the second agreement is done — and most VoLTE-specific failures are one of those two agreements finishing without the other.
Before any call: two things must already be true
First, the phone attached to LTE and got a default bearer to the IMS APN — QCI 5, the signalling class. That bearer exists purely to carry SIP. Second, the phone registered with the IMS core over it: REGISTER, an AKA challenge in a 401, IPsec associations, 200 OK — the flow covered in IMS architecture. A phone that shows VoLTE switched on has done both. A phone that silently falls back to circuit-switched calling usually failed the second, and the evidence is in the registration, not in any call.
The call itself
- INVITE with an offer, and a confession. The phone sends INVITE
over the QCI-5 bearer. The SDP offers AMR/AMR-WB (or EVS) — and carries precondition
attributes:
a=curr:qos local none,a=des:qos mandatory local sendrecv. Translation: "I want this level of network quality, and I do not have it yet."100relis inRequire/Supported, because everything that follows depends on reliable provisionals. - 183 Session Progress with the answer. The far side answers the SDP in a 183 — codec chosen, its own preconditions declared — sent reliably, so the caller PRACKs it and the PRACK gets its own 200. No ringing yet, deliberately.
- The network builds the voice bearer. This is the invisible step. Each P-CSCF, having now seen offer and answer, sends an AAR over Rx to the policy function describing the media: codec, bandwidth, the RTP addresses and ports. The PCRF turns that into Gx rules for the packet gateway, which builds a dedicated bearer — QCI 1, guaranteed bit rate, one on each side. Radio-level messages (E-RAB setup) do the last hop to the handset.
- UPDATE: preconditions met. When the phone sees its bearer, it
sends UPDATE with
a=curr:qos local sendrecv— "I now have what I asked for." The far end confirms in the 200 to the UPDATE. - Now it may ring. Only after preconditions are satisfied does the callee's phone alert and send 180 Ringing. Answer is the ordinary 200 OK / ACK, and voice flows on the QCI-1 bearers — never on the signalling bearer.
The bearers at a glance
| Bearer | QCI | Carries | Built |
|---|---|---|---|
| Default, IMS APN | 5 | SIP signalling only | At attach, lives as long as the registration |
| Dedicated | 1 | Voice RTP (guaranteed bit rate) | Per call, by Rx→Gx, torn down at BYE |
| Dedicated | 2 | Video RTP, if the call has it | Per call, same mechanism |
Where it breaks, stage by stage
- Bearer build fails → the callers hear nothing or the call dies at the precondition stage: a 580 Precondition Failure, a CANCEL after a long silence, or — if the network is sloppy and lets the call proceed — a perfect SIP ladder with one-way or no audio, because voice packets are falling onto a default bearer never sized for them.
- Precondition mismatch → one side speaks RFC 3312 and the other
does not, or a mid-path B2BUA strips the attributes. Look for the
preconditionoption-tag disagreeing betweenRequireandSupported, and for 421 Extension Required or 580. - PRACK trouble → 183s retransmitting with no PRACK arriving is the reliable-provisional machinery failing — same shape as any retransmission ladder, and often an SBC that quietly does not do 100rel.
- Ring-time drop on movement → the phone left LTE coverage mid-setup and SRVCC handed the call to 2G/3G — or tried to. A call that dies exactly when the user walks to the lift is a handover story, and the SIP trace will simply stop.
Reading a VoLTE trace
Take the timeline in pairs: offer/answer first (did both sides agree on AMR and on preconditions?), then UPDATE/200 (did both sides declare qos met?), and only then ask media questions. If you also captured Diameter, line the Rx AAR/AAA up against the 183 — a missing or refused AAA at that moment explains almost every "signalling perfect, no audio" VoLTE ticket. And distrust ptime arithmetic done by hand: AMR's payload format has more sharp edges than any other mainstream codec.
hiccup reads the precondition attributes, checks the offer/answer against what the media actually did, and flags an IMS call whose signalling and bearers disagree. Self-hosted, free for individual users.
upload a trace