fresh-telephone-307
02/13/2026, 9:51 AMtall-airline-16756
02/13/2026, 9:51 AMtall-airline-16756
02/13/2026, 9:51 AMiceTransportPolicy: 'relay'.
◦ This ensures LiveKit sends audio via a relay path that callers behind NATs can receive.
1. Verify SDP addresses for leaks or incorrect IPs
◦ Inspect the 200 OK SDP for any private IPs (192.168.x.x) or incorrect connection addresses. If the SDP contains private IPs, the caller will not receive RTP.
◦ Ensure your SIP trunk/sip gateway rewrites SDP to public IPs (and uses the correct Received/Contact handling for NAT).
1. Check TURN/TLS reachability and firewall DPI rules
◦ Ensure environments and carrier paths allow TURN over TCP/TLS (port 443). Some proxies/inspectors break TURN unless you bypass DPI for the LiveKit TURN domains.
◦ If you use Zscaler or similar, add bypass rules for LiveKit TURN domains to allow TURN relays to establish.
1. Confirm media anchoring and regional routing for India
◦ Indian CPaaS/carrier rules often require media to stay within India. If any leg is routed outside India, carriers can drop or block media.
◦ Make sure signaling and media egress for that call path remain within India or use a CPaaS configuration that anchors media inside India.
1. Collect a short PCAP and trace RTP directionality
◦ Capture a PCAP covering the INVITE → RTP → BYE sequence. Confirm:
▪︎ Whether RTP packets from LiveKit reach the caller’s public IP/port.
▪︎ Which direction RTP stops (caller→LiveKit or LiveKit→caller).
◦ This proves whether the problem is NAT/drop vs codec mismatch (codec seems OK — PCMU).
1. Validate codec/port alignment
◦ Codec is G.711 µ-law (PCMU) in your SDP, which is standard. Confirm both sides actually negotiated PCMU and there’s no mismatched payload type mapping or payload-type translation by the CPaaS.
What to include if you want me to dig further
• A short PCAP (SIP + RTP) of the failed call (or at least the SIP messages and RTP flow summary).
• Exact 200 OK SDP text as seen in the trace.
• Whether you’re using LiveKit Cloud or self-hosted LiveKit, and whether the SIP trunk is provided by the Indian CPaaS or LiveKit.
• Any NAT topology details for the caller (mobile carrier, behind PBX, etc.).
One-line summary and immediate next step
• Most likely: NAT/firewall or carrier routing is preventing LiveKit → caller RTP. Immediately try forcing TURN relay for media and verify TURN over TCP/TLS is reachable from the path where the media originates. If that doesn’t fix it, send the PCAP and 200 OK SDP and I’ll help pinpoint the exact packet/SDP mismatch.
If you’d like, paste the 200 OK SDP here (redact any sensitive tokens) or upload the PCAP and I’ll analyze the RTP flow and SDP candidates for you.
Sources: Making calls overview | LiveKit Documentation | Firewall Tips for LiveKit Connectivity | LiveKit | sip | livekit/livekit_composite | DeepWiki | Support data sovereignty in India | LiveKit | Configure ZScaler proxy for LiveKit connections | LiveKitfresh-telephone-307
02/13/2026, 10:03 AMtall-airline-16756
02/13/2026, 10:03 AMiceTransportPolicy: 'relay' in your WebRTC client/connection config or ensure your server-side RTC config forces relay.
• Ensure TURN/TLS is reachable from the PSTN/CPaaS path:
◦ Allow outbound TCP/TLS to LiveKit TURN on port 443 from your media servers.
• Ensure LiveKit advertises public IPs (no private-IP SDP leaks):
◦ If self-hosted, configure your public IP/port or external IP mapping for RTP in your LiveKit/ingress gateway.
• (If using LiveKit Cloud) ensure TURN domains are not blocked by DPI/proxy; allow/whitelist LiveKit TURN domains or disable DPI for them.
Changes to make on the CPaaS / PSTN side
• Use media anchoring or relay on the CPaaS so inbound RTP from LiveKit is accepted:
◦ Configure CPaaS to accept/route RTP from LiveKit’s public/TURN-relayed IP:port rather than requiring symmetric NAT from the caller.
• If the caller is behind carrier NAT, enable or request CPaaS to enforce or enable RTP relay/TURN usage between CPaaS and LiveKit.
• Ensure the CPaaS does not rewrite SDP to a private IP and that it forwards the correct public connection address (no 192.168.x.x in final SDP).
• If required by the carrier, allow-list LiveKit egress IPs (provide your CPaaS with LiveKit’s region IP ranges).
Immediate single-step test
• Temporarily force TURN relay on LiveKit (iceTransportPolicy: 'relay') and confirm the caller can hear agent. If that fixes it, finalize TURN/firewall and CPaaS relay settings.
If this does not fix it, send the 200 OK SDP text or a short PCAP and I’ll tell you the exact IP/port mismatch to change.fresh-telephone-307
02/13/2026, 10:25 AMiceTransportPolicy: 'relay') and confirm the caller can hear agent. If that fixes it, finalize TURN/firewall and CPaaS relay settings.
How to do this via livekit cloudtall-airline-16756
02/13/2026, 10:25 AMiceTransportPolicy: 'relay' when connecting to LiveKit so all media goes through TURN.
How to do it (examples)
1) JavaScript / TypeScript (Browser or Node)
import { Room } from 'livekit-client';
const room = new Room();
await room.connect(
'wss://<your-project>.livekit.cloud',
'<access-token>',
{
rtcConfig: {
iceTransportPolicy: 'relay',
},
}
);
2) Flutter
• Pass rtcConfig with iceTransportPolicy: 'relay' in the connect() options of the LiveKit Flutter SDK (use the same key name).
3) iOS (Swift)
• Provide rtcConfiguration with iceTransportPolicy = .relay when calling connect().
4) Android
• Set the PeerConnection/RTC configuration to use iceTransportsType = "relay" / equivalent when creating the connection.
Network checklist (required)
• Ensure TURN (LiveKit’s TURN) is reachable from where your media originates — allow outbound TCP/TLS to LiveKit TURN on port 443.
• If you have DPI/proxy (Zscaler, etc.), whitelist or bypass LiveKit TURN domains so TURN-over-TLS can establish.
• If using a CPaaS/PSTN path, ensure they accept media from LiveKit TURN-relayed IPs or are configured to relay media.
Test
• Make a test call after changing the client(s). If the caller can now hear the agent, keep iceTransportPolicy: 'relay' or update CPaaS/firewall to allow non-relay paths once stable.
If you want, tell me which SDK you’re using (JS/Flutter/Swift/Android or server-side) and I’ll paste the exact snippet for that SDK.
Sources: client-sdk-flutter | livekit/livekit_composite | DeepWiki | client-sdk-swift | livekit/livekit_composite | DeepWiki | Configure ZScaler proxy for LiveKit connections | LiveKit | Firewall Tips for LiveKit Connectivity | LiveKitfresh-telephone-307
02/13/2026, 10:26 AMtall-airline-16756
02/13/2026, 10:26 AMfresh-telephone-307
02/17/2026, 9:10 AM