Why SDAP is needed
In 5G, the core network (5GC) handles QoS at the granularity of QoS flows. Each PDU session can carry multiple QoS flows — one for video streaming, one for voice, one for background data — each with different guaranteed bit rate and priority requirements.
The RAN handles QoS at the granularity of Data Radio Bearers (DRBs). There can be at most 29 DRBs per UE. SDAP bridges the two — it maps QoS flows (possibly many) onto DRBs (fewer, grouped by similar QoS requirements).
QoS flow identifiers (QFI)
Each QoS flow is identified by a 6-bit QFI (QoS Flow Identifier) within a PDU session. The 5GC assigns QFIs based on the QoS requirements negotiated during PDU session establishment.
| 5QI | Resource type | Priority | Packet delay budget | Use case |
|---|---|---|---|---|
| 1 | GBR | 20 | 100 ms | Conversational Voice (VoNR) ← our call |
| 2 | GBR | 4 | 150 ms | Conversational Video |
| 5 | Non-GBR | 10 | 100 ms | IMS Signalling |
| 8 | Non-GBR | 8 | 300 ms | Video streaming (buffered) |
| 9 | Non-GBR | 9 | 300 ms | Video streaming (default) ← YouTube |
| 80 | Non-GBR | 68 | 10 ms | Low latency gaming/URLLC |
QoS flow to DRB mapping
The gNB's SDAP layer establishes a mapping table: each QFI maps to exactly one DRB. Multiple QFIs with similar QoS requirements can share one DRB. The mapping is configured by RRC in sdap-Config.
// PDU Session 1 (Internet): 3 QoS flows QFI=1 (5QI=1, VoNR voice) → DRB1 (high priority, low latency) QFI=5 (5QI=5, IMS signalling) → DRB1 (same DRB — both IMS) QFI=9 (5QI=9, best-effort data) → DRB2 (lower priority) // SDAP header added to each DL PDU: // 1 byte: RDI=0, RQI=0, QFI=1 [SDAP: 0x01] [IP packet for VoNR] → sent on DRB1 [SDAP: 0x09] [YouTube UDP] → sent on DRB2 // UL reflective QoS mapping: // UE copies QFI from DL → UL for same flow // (RQI bit = 1 triggers this mapping)
Full protocol stack — end to end
Now all four layers are covered. Here is how a VoNR voice packet travels from the network application to the radio interface:
// Application generates: 40 bytes RTP voice payload IP + UDP + RTP headers: + 40 bytes → 80 bytes total // SDAP: SDAP header: + 1 byte → 81 bytes // PDCP: PDCP SN (12-bit): + 2 bytes MAC-I integrity: + 4 bytes ← only SRBs, not DRBs After ROHC compression: IP+UDP+RTP → 2 bytes Net PDCP output: = 45 bytes (40 payload + 2 ROHC + 2 PDCP hdr + 1 SDAP) // RLC: RLC-AM header: + 2 bytes → 47 bytes // MAC: MAC subheader: + 2 bytes → 49 bytes (+ padding to TBS) // Without ROHC: 80 bytes payload → 86 bytes total (+7.5% overhead) // With ROHC: 42 bytes payload → 49 bytes total (+16% overhead, less raw data) // ROHC savings: 80→49 bytes = 39% reduction in bytes transmitted