try hiccup

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

  1. 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." 100rel is in Require/Supported, because everything that follows depends on reliable provisionals.
  2. 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.
  3. 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.
  4. 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.
  5. 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

BearerQCICarriesBuilt
Default, IMS APN5SIP signalling onlyAt attach, lives as long as the registration
Dedicated1Voice RTP (guaranteed bit rate)Per call, by Rx→Gx, torn down at BYE
Dedicated2Video RTP, if the call has itPer call, same mechanism

Where it breaks, stage by stage

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