IPv6 / Dual-Stack on the User Plane
How the OmniUPF handles IPv6 user traffic for IPv6 and IPv4v6 PDN sessions: the kernel prerequisites, the UE address pool, programming the IPv6 downlink from PFCP, and advertising UE host routes to the network via OSPFv3.
This page covers the user-plane responsibilities. The control plane (PDN type negotiation, PAA, Gx, and signalling the UE IPv6 address to the UPF over PFCP) is handled by the SMF/PGW-C. See also Route Management and the Configuration Guide.
Table of Contents
- Overview
- Kernel Prerequisites
- UE IPv6 Address Pool
- OSPFv3 Route Advertisement
- Data Plane Behaviour
- Troubleshooting
Overview
When an IPv6 (or IPv4v6) PDN session is established, the SMF/PGW-C sends the UE's IPv6 address and the PDN type to the UPF over PFCP. The UPF then:
- Programs the IPv6 downlink lookup so packets destined to the UE are matched and tunnelled.
- Adds a
/128host route for the UE address and advertises it to the edge router via OSPFv3, so downlink traffic is attracted to this UPF. - Forwards user traffic in both directions (uplink decapsulation, downlink GTP-U encapsulation) for IPv6 inner packets.
Kernel Prerequisites
IPv6 must be enabled and forwarding turned on at the host level. Apply via a
sysctl drop-in (e.g. under /etc/sysctl.d/).
| Setting | Required value | Description |
|---|---|---|
net.ipv6.conf.all.disable_ipv6 | 0 | IPv6 must be enabled. The UPF data-plane interface needs a global IPv6 address for transit and routing. |
net.ipv6.conf.default.disable_ipv6 | 0 | Ensures IPv6 stays enabled on newly-appearing interfaces. |
net.ipv6.conf.all.forwarding | 1 | Enables IPv6 forwarding so UE uplink traffic egresses and downlink traffic is routed to the data plane. |
The data-plane interface also needs a global IPv6 address on the transit segment (towards the edge router) for OSPFv3 to form an adjacency and exchange routes.
UE IPv6 Address Pool
When the UPF allocates UE addresses (rather than receiving them from the SMF),
set an IPv6 pool in runtime.exs. When the SMF/PGW-C supplies the UE address
over PFCP, that address is used directly and this pool is not consulted for the
session.
# /etc/omniupf/runtime.exs
config :upf_ex,
ueip_pool: "2001:db8:6f85:70::/64"
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
ueip_pool | String (CIDR) | No | - | UE IP pool used when the UPF performs address allocation. Accepts an IPv4 or IPv6 CIDR; the address family is detected from the string. |
OSPFv3 Route Advertisement
Each active UE IPv6 address is installed as a /128 host route and advertised to
the edge router, mirroring the IPv4 /32 behaviour. Routes are managed by the
route manager and redistributed into OSPF by FRR.
# /etc/omniupf/runtime.exs
config :upf_ex,
route_manager_enabled: true,
route_manager_type: "frr"
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
route_manager_enabled | Boolean | No | false | Enables UE host-route management. Must be true to advertise UE routes. |
route_manager_type | String | No | - | Route backend. "frr" injects routes via FRR/vtysh; the static backend uses the kernel ip/ipv6 route commands directly. Use "frr" for OSPFv3 advertisement. |
The FRR instance must run OSPFv3 (ospf6d) on the transit interface and
redistribute static routes, so UE /128 host routes are flooded to the edge
router. IPv6 host routes are added with the ipv6 route <addr>/128 command
family — the IPv4 ip route command does not accept IPv6 prefixes. See
Route Management for the route-manager lifecycle.
Data Plane Behaviour
| Direction | Behaviour |
|---|---|
| Downlink (network → UE) | The inner IPv6 destination is matched against the IPv6 downlink table programmed from the PFCP session; matching packets are GTP-U encapsulated towards the gNB/eNB (or buffered if the rule's action is BUFF). |
| Uplink (UE → network) | GTP-U is decapsulated and the inner IPv6 packet is forwarded out the N6 interface using the kernel IPv6 FIB (hence the forwarding sysctl). |
| Buffering (BUFF) | Buffered IPv6 downlink packets are delivered to the userspace buffer listener and flushed on transition to forwarding, the same as IPv4. |
No accept_local / reverse-path-filter relaxation is required on current builds;
the buffer path uses a non-local outer source so packets are not dropped as
martians.
Troubleshooting
IPv6 downlink traffic does not reach the UE
Symptoms: The session is established and uplink works, but traffic from the network to the UE is dropped.
Possible causes:
- The UE
/128host route is not advertised (route manager disabled, or OSPFv3 not running on the UPF). - The OSPFv3 adjacency between the UPF and the edge router is not established.
- The edge router has not yet installed the
/128(convergence delay).
Resolution:
- Confirm
route_manager_enabled: trueandroute_manager_type: "frr". - Verify the UPF FRR instance runs OSPFv3 on the transit interface and redistributes static routes.
- Confirm the OSPFv3 adjacency is full and the edge router shows the UE
/128learned via OSPF.
IPv6 user traffic is not forwarded at all
Symptoms: Neither uplink nor downlink IPv6 works, even with routes present.
Possible causes:
- IPv6 is disabled on the host, or forwarding is off.
- The data-plane interface has no global IPv6 address.
Resolution:
- Verify the kernel prerequisites (
disable_ipv6=0,forwarding=1). - Confirm the data-plane interface has a global IPv6 address on the transit segment.