Skip to content

Commit

Permalink
feat: Support configuring local IP address for N9 interface
Browse files Browse the repository at this point in the history
Until now, eupf only allowed configuring the local IP address for the N3
interface, which actually ended up being used for both N3 and N9 (GTP-U
forwarding towards other uplink UPFs).

However, that limitation poses so problems under some production
scenarios. Some users require running an UPF to forward GTPv1U traffic from
network A to network B and viceversa, where those 2 networks are not reachable
to each other, only through the UPF host.
This happens for instance when cellular operators don't control/own the
entirety of their networks, e.g. a network which runs their NAT under a
satellite link with private addresses (eg VPN) which end up at a single host.

As a result, the UPF requires managing at least 2 separate local IP addresses
for GTP-U traffic: One (usually private) IP address towards the RAN, and one
(usually public, or another private network) IP address towards the Corei.
As a result, when a PFCP client (an SMF, or osmo-hnbgw, or osmo-s1gw to mention
some other examples) tries to setup a session to forward GTPU traffic from
network A (RAN) to network B (Core), will result in eUPF forwarding the GTP-U
packet to the Core but using the RAN configured IP as the GTPU packet local IP
address.
Hence, either local routing will be wrong, or the Core will drop the received
packet, or won't know how to route traffic back to it.

This patch allows eupf to be used co-located with 3G osmo-hnbgw [1] and
4G osmo-s1gw [2] under the mentioned network setups, both supporting PFCP to
manage a UPF to forward data plane also in GTP1U protocol.

[1] https://osmocom.org/projects/osmohnbgw
[2] https://gitea.osmocom.org/erlang/osmo-s1gw

Related: #577
  • Loading branch information
pespin committed Nov 18, 2024
1 parent 44cfbf6 commit f46bd9c
Show file tree
Hide file tree
Showing 21 changed files with 60 additions and 10 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ Use following command to mount it: `sudo mount bpffs /sys/fs/bpf -t bpf`

- UPF_INTERFACE_NAME=lo *Network interfaces handling N3 (GTP) & N6 (SGi) traffic.*
- UPF_N3_ADDRESS=127.0.0.1 *IPv4 address for N3 interface*
- UPF_N9_ADDRESS=127.0.0.1 *IPv4 address for N9 interface*
- UPF_XDP_ATTACH_MODE=generic *XDP attach mode. Generic-only at the moment*
- UPF_API_ADDRESS=:8080 *Local host:port for serving [REST API](api.md) server*
- UPF_PFCP_ADDRESS=:8805 *Local host:port that PFCP server will listen to*
Expand All @@ -63,7 +64,7 @@ sudo docker run -d --rm -v --privileged \
-e UPF_INTERFACE_NAME=[eth0,n6] -e UPF_XDP_ATTACH_MODE=generic \
-e UPF_API_ADDRESS=:8081 -e UPF_PFCP_ADDRESS=:8806 \
-e UPF_METRICS_ADDRESS=:9091 -e UPF_PFCP_NODE_ID=10.100.50.241 \
-e UPF_N3_ADDRESS=10.100.50.233 \
-e UPF_N3_ADDRESS=10.100.50.233 -e UPF_N9_ADDRESS=10.100.50.233 \
ghcr.io/edgecomllc/eupf:main
```

Expand Down
4 changes: 4 additions & 0 deletions cmd/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ type UpfConfig struct {
AssociationSetupTimeout uint32 `mapstructure:"association_setup_timeout" json:"association_setup_timeout"`
MetricsAddress string `mapstructure:"metrics_address" validate:"hostname_port" json:"metrics_address"`
N3Address string `mapstructure:"n3_address" validate:"ipv4" json:"n3_address"`
N9Address string `mapstructure:"n9_address" validate:"ipv4" json:"n9_address"`
GtpPeer []string `mapstructure:"gtp_peer" validate:"omitempty,dive,hostname_port" json:"gtp_peer"`
GtpEchoInterval uint32 `mapstructure:"gtp_echo_interval" validate:"min=1" json:"gtp_echo_interval"`
QerMapSize uint32 `mapstructure:"qer_map_size" validate:"min=1" json:"qer_map_size"`
Expand Down Expand Up @@ -47,6 +48,7 @@ func init() {
pflag.String("nodeid", "127.0.0.1", "PFCP Server Node ID")
pflag.String("maddr", ":9090", "Address to bind metrics server to")
pflag.String("n3addr", "127.0.0.1", "Address for communication over N3 interface")
pflag.String("n9addr", "127.0.0.1", "Address for communication over N9 interface")
pflag.StringArray("peer", []string{}, "Address of GTP peer")
pflag.Uint32("echo", 10, "Interval of sending echo requests in seconds")
pflag.Uint32("qersize", 1024, "Size of the QER ebpf map")
Expand Down Expand Up @@ -76,6 +78,7 @@ func init() {
_ = v.BindPFlag("association_setup_timeout", pflag.Lookup("astimeout"))
_ = v.BindPFlag("metrics_address", pflag.Lookup("maddr"))
_ = v.BindPFlag("n3_address", pflag.Lookup("n3addr"))
_ = v.BindPFlag("n9_address", pflag.Lookup("n9addr"))
_ = v.BindPFlag("gtp_peer", pflag.Lookup("peer"))
_ = v.BindPFlag("gtp_echo_interval", pflag.Lookup("echo"))
_ = v.BindPFlag("qer_map_size", pflag.Lookup("qersize"))
Expand All @@ -100,6 +103,7 @@ func init() {
v.SetDefault("association_setup_timeout", 5)
v.SetDefault("metrics_address", ":9090")
v.SetDefault("n3_address", "127.0.0.1")
v.SetDefault("n9_address", "127.0.0.1")
v.SetDefault("gtp_echo_interval", 10)
v.SetDefault("qer_map_size", 1024)
v.SetDefault("far_map_size", 1024)
Expand Down
11 changes: 9 additions & 2 deletions cmd/core/pfcp_connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ type PfcpConnection struct {
nodeId string
nodeAddrV4 net.IP
n3Address net.IP
n9Address net.IP
mapOperations ebpf.ForwardingPlaneController
RecoveryTimestamp time.Time
featuresOctets []uint8
Expand All @@ -54,7 +55,7 @@ func (connection *PfcpConnection) GetAssociation(assocAddr string) *NodeAssociat
return nil
}

func NewPfcpConnection(addr string, nodeId string, n3Ip string, mapOperations ebpf.ForwardingPlaneController, resourceManager *service.ResourceManager) (*PfcpConnection, error) {
func NewPfcpConnection(addr string, nodeId string, n3Ip string, n9Ip string, mapOperations ebpf.ForwardingPlaneController, resourceManager *service.ResourceManager) (*PfcpConnection, error) {
udpAddr, err := net.ResolveUDPAddr("udp", addr)
if err != nil {
log.Warn().Msgf("Can't resolve UDP address: %s", err.Error())
Expand All @@ -70,7 +71,12 @@ func NewPfcpConnection(addr string, nodeId string, n3Ip string, mapOperations eb
if n3Addr == nil {
return nil, fmt.Errorf("failed to parse N3 IP address ID: %s", n3Ip)
}
log.Info().Msgf("Starting PFCP connection: %v with Node ID: %v and N3 address: %v", udpAddr, nodeId, n3Addr)
n9Addr := net.ParseIP(n9Ip)
if n9Addr == nil {
return nil, fmt.Errorf("failed to parse N9 IP address ID: %s", n9Ip)
}

log.Info().Msgf("Starting PFCP connection: %v with Node ID: %v, N3 address: %v, N9 address: %v", udpAddr, nodeId, n3Addr, n9Addr)

featuresOctets := []uint8{0, 0, 0}
featuresOctets[1] = setBit(featuresOctets[1], 0)
Expand All @@ -89,6 +95,7 @@ func NewPfcpConnection(addr string, nodeId string, n3Ip string, mapOperations eb
nodeId: nodeId,
nodeAddrV4: udpAddr.IP,
n3Address: n3Addr,
n9Address: n9Addr,
mapOperations: mapOperations,
RecoveryTimestamp: time.Now(),
featuresOctets: featuresOctets,
Expand Down
25 changes: 20 additions & 5 deletions cmd/core/pfcp_session_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func HandlePfcpSessionEstablishmentRequest(conn *PfcpConnection, msg message.Mes
err = func() error {
mapOperations := conn.mapOperations
for _, far := range req.CreateFAR {
farInfo, err := composeFarInfo(far, conn.n3Address.To4(), ebpf.FarInfo{})
farInfo, err := composeFarInfo(far, conn.n3Address.To4(), conn.n9Address.To4(), ebpf.FarInfo{})
if err != nil {
log.Info().Msgf("Error extracting FAR info: %s", err.Error())
continue
Expand Down Expand Up @@ -256,7 +256,7 @@ func HandlePfcpSessionModificationRequest(conn *PfcpConnection, msg message.Mess
mapOperations := conn.mapOperations

for _, far := range req.CreateFAR {
farInfo, err := composeFarInfo(far, conn.n3Address.To4(), ebpf.FarInfo{})
farInfo, err := composeFarInfo(far, conn.n3Address.To4(), conn.n9Address.To4(), ebpf.FarInfo{})
if err != nil {
log.Info().Msgf("Error extracting FAR info: %s", err.Error())
continue
Expand All @@ -278,7 +278,7 @@ func HandlePfcpSessionModificationRequest(conn *PfcpConnection, msg message.Mess
return err
}
sFarInfo := session.GetFar(farid)
sFarInfo.FarInfo, err = composeFarInfo(far, conn.n3Address.To4(), sFarInfo.FarInfo)
sFarInfo.FarInfo, err = composeFarInfo(far, conn.n3Address.To4(), conn.n9Address.To4(), sFarInfo.FarInfo)
if err != nil {
log.Info().Msgf("Error extracting FAR info: %s", err.Error())
continue
Expand Down Expand Up @@ -553,14 +553,14 @@ func cloneIP(ip net.IP) net.IP {
return dup
}

func composeFarInfo(far *ie.IE, localIp net.IP, farInfo ebpf.FarInfo) (ebpf.FarInfo, error) {
farInfo.LocalIP = binary.LittleEndian.Uint32(localIp)
func composeFarInfo(far *ie.IE, localN3Ip net.IP, localN9Ip net.IP, farInfo ebpf.FarInfo) (ebpf.FarInfo, error) {
if applyAction, err := far.ApplyAction(); err == nil {
farInfo.Action = applyAction[0]
}
var forward []*ie.IE
var err error
if far.Type == ie.CreateFAR {
farInfo.LocalIP = binary.LittleEndian.Uint32(localN3Ip)
forward, err = far.ForwardingParameters()
} else if far.Type == ie.UpdateFAR {
forward, err = far.UpdateForwardingParameters()
Expand All @@ -574,6 +574,7 @@ func composeFarInfo(far *ie.IE, localIp net.IP, farInfo ebpf.FarInfo) (ebpf.FarI
} else {
outerHeaderCreation, _ := forward[outerHeaderCreationIndex].OuterHeaderCreation()
farInfo.OuterHeaderCreation = uint8(outerHeaderCreation.OuterHeaderCreationDescription >> 8)

farInfo.Teid = outerHeaderCreation.TEID
if outerHeaderCreation.HasIPv4() {
farInfo.RemoteIP = binary.LittleEndian.Uint32(outerHeaderCreation.IPv4Address)
Expand All @@ -582,6 +583,20 @@ func composeFarInfo(far *ie.IE, localIp net.IP, farInfo ebpf.FarInfo) (ebpf.FarI
log.Info().Msg("WARN: IPv6 not supported yet, ignoring")
return ebpf.FarInfo{}, fmt.Errorf("IPv6 not supported yet")
}

destInterfaceIndex := findIEindex(forward, 42) // IE Destination Interface
if destInterfaceIndex == -1 {
log.Info().Msg("WARN: No Destination Interface IE")
} else {
destInterface, _ := forward[destInterfaceIndex].DestinationInterface()
// OuterHeaderCreation == GTP-U/UDP/IPv4 && DestinationInterface == Core:
if (farInfo.OuterHeaderCreation&0x01) == 0x01 && (destInterface == 0x01) {
log.Info().Msgf("PESPIN: Using N9 local IP address %v", localN9Ip)
farInfo.LocalIP = binary.LittleEndian.Uint32(localN9Ip)
} else {
farInfo.LocalIP = binary.LittleEndian.Uint32(localN3Ip)
}
}
}
}
transportLevelMarking, err := GetTransportLevelMarking(far)
Expand Down
4 changes: 3 additions & 1 deletion cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,9 @@ func main() {
}

// Create PFCP connection
pfcpConn, err := core.NewPfcpConnection(config.Conf.PfcpAddress, config.Conf.PfcpNodeId, config.Conf.N3Address, bpfObjects, resourceManager)
pfcpConn, err := core.NewPfcpConnection(config.Conf.PfcpAddress, config.Conf.PfcpNodeId,
config.Conf.N3Address, config.Conf.N9Address,
bpfObjects, resourceManager)
if err != nil {
log.Fatal().Msgf("Could not create PFCP connection: %s", err.Error())
}
Expand Down
3 changes: 3 additions & 0 deletions docs/Configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Currently UPF have several config parameters shown below.<br>Parameters can be c
|--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|-----------------------|-------------|-----------------|
| Interface name<br>`Mandatory` | List of network interfaces handling N3 (GTP) & N6 (SGi) traffic. eUPF attaches XDP hook to every interface in this list. Format: `[ifnameA, ifnameB, ...]`. | `interface_name` | `UPF_INTERFACE_NAME` | `--iface` | `lo` |
| N3 address <br>`Mandatory` | IPv4 address for N3 interface | `n3_address` | `UPF_N3_ADDRESS` | `--n3addr` | `127.0.0.1` |
| N9 address <br>`Mandatory` | IPv4 address for N9 interface | `n9_address` | `UPF_N9_ADDRESS` | `--n9addr` | `127.0.0.1` |
| XDP mode <br>`Optional` | XDP attach mode: <br> ∘ **generic** – Kernel-level implementation. For evaluation purpose. <br> ∘ **native** – Driver-level implenemntaion <br> ∘ **offload** – NIC-level implementation. XDP can be loaded and executed directly on the NIC. <br> Refer to [How XDP Works](https://www.tigera.io/learn/guides/ebpf/ebpf-xdp/#How-XDP-Works) | `xdp_attach_mode` | `UPF_XDP_ATTACH_MODE` | `--attach` | `generic` |
| API address <br>`Optional` | Local address for serving [REST API](api.md) server | `api_address` | `UPF_API_ADDRESS` | `--aaddr` | `:8080` |
| PFCP address <br>`Optional` | Local address that PFCP server will listen to | `pfcp_address` | `UPF_PFCP_ADDRESS` | `--paddr` | `:8805` |
Expand Down Expand Up @@ -46,6 +47,7 @@ pfcp_address: :8805
pfcp_node_id: 127.0.0.1
metrics_address: :9090
n3_address: 127.0.0.1
n9_address: 127.0.0.1
qer_map_size: 1024
far_map_size: 1024
pdr_map_size: 1024
Expand All @@ -65,6 +67,7 @@ UPF_PFCP_ADDRESS=:8806
UPF_METRICS_ADDRESS=:9091
UPF_PFCP_NODE_ID: 10.100.50.241 # address on n4 interface
UPF_N3_ADDRESS: 10.100.50.233
UPF_N9_ADDRESS: 10.100.50.233
```
### CLI
Expand Down
1 change: 1 addition & 0 deletions docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ In addition to prometheus metrics the eUPF API provides a set of endpoints for m
"pfcp_node_id": "10.100.200.14",
"metrics_address": ":9090",
"n3_address": "10.100.200.14",
"n9_address": "10.100.200.14",
"qer_map_size": 1024,
"far_map_size": 1024,
"pdr_map_size": 1024,
Expand Down
2 changes: 2 additions & 0 deletions docs/deployments/free5gc-ulcl/eupf-b.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,13 @@ configMaps:
pfcp_address: 10.100.50.241:8805
metrics_address: :9090
n3_address: 10.100.50.233
n9_address: 10.100.50.233
gtp_peer: [10.100.50.226:2152, 10.100.50.227:2152]
env:
UPF_PFCP_NODE_ID: 10.100.50.241 # address on n4 interface
# UPF_N3_ADDRESS: 10.100.50.233
# UPF_N9_ADDRESS: 10.100.50.233

volumes:
- name: sys
Expand Down
1 change: 1 addition & 0 deletions docs/deployments/free5gc-with-bgp/values/eupf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ args:
env:
UPF_PFCP_NODE_ID: 10.100.50.241
UPF_N3_ADDRESS: 10.100.50.233
UPF_N9_ADDRESS: 10.100.50.233

configMaps:
config:
Expand Down
1 change: 1 addition & 0 deletions docs/deployments/open5gs-compose/docker-compose.eupf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ services:
UPF_METRICS_ADDRESS: ":9091"
UPF_PFCP_NODE_ID: "172.20.0.100"
UPF_N3_ADDRESS: "172.20.0.100"
UPF_N9_ADDRESS: "172.20.0.100"
ulimits:
memlock: -1
cap_add:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ args:
env:
UPF_PFCP_NODE_ID: $(MY_POD_IP)
UPF_N3_ADDRESS: $(MY_POD_IP)
UPF_N9_ADDRESS: $(MY_POD_IP)

configMaps:
config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ args:
env:
UPF_PFCP_NODE_ID: $(MY_POD_IP)
UPF_N3_ADDRESS: $(MY_POD_IP)
UPF_N9_ADDRESS: $(MY_POD_IP)

configMaps:
config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ args:
env:
UPF_PFCP_NODE_ID: $(MY_POD_IP)
UPF_N3_ADDRESS: $(MY_POD_IP)
UPF_N9_ADDRESS: $(MY_POD_IP)

configMaps:
config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ args:
env:
UPF_PFCP_NODE_ID: $(MY_POD_IP)
UPF_N3_ADDRESS: $(MY_POD_IP)
UPF_N9_ADDRESS: $(MY_POD_IP)

configMaps:
config:
Expand Down
1 change: 1 addition & 0 deletions docs/deployments/open5gs-with-bgp/values/eupf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ args:
env:
UPF_PFCP_NODE_ID: $(MY_POD_IP)
UPF_N3_ADDRESS: $(MY_POD_IP)
UPF_N9_ADDRESS: $(MY_POD_IP)

configMaps:
config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ args:
env:
UPF_PFCP_NODE_ID: $(MY_POD_IP)
UPF_N3_ADDRESS: $(MY_POD_IP)
UPF_N9_ADDRESS: $(MY_POD_IP)

configMaps:
config:
Expand Down
1 change: 1 addition & 0 deletions docs/deployments/srsran-gnb/values/eupf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ args:
env:
UPF_PFCP_NODE_ID: $(MY_POD_IP)
UPF_N3_ADDRESS: $(MY_POD_IP)
UPF_N9_ADDRESS: $(MY_POD_IP)

configMaps:
config:
Expand Down
3 changes: 3 additions & 0 deletions docs/docs-ru_ru/Configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
|--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|-----------------------|-------------|-------------|
| Interface name<br>`Обязательный` | Список сетевых интерфейсов, обрабатывающих трафик N3 (GTP) и N6 (SGi). eUPF присоединяет перехватчик XDP к каждому интерфейсу в этом списке. Формат: `[ifnameA, ifnameB, ...]`. | `interface_name` | `UPF_INTERFACE_NAME` | `--iface` | `lo` |
| N3 address <br>`Обязательный` | IPv4 адрея для N3 интерфейса | `n3_address` | `UPF_N3_ADDRESS` | `--n3addr` | `127.0.0.1` |
| N9 address <br>`Обязательный` | IPv4 адрея для N9 интерфейса | `n9_address` | `UPF_N9_ADDRESS` | `--n9addr` | `127.0.0.1` |
| XDP mode <br>`Дополнительный` | XDP attach mode: <br> ∘ **generic** – Реализация на уровне ядра. В целях оценки. <br> ∘ **native** – реализация на уровне драйвера <br> ∘ **offload** – реализация на уровне NIC. XDP можно загрузить и выполнить непосредственно на сетевой карте. <br> См. [Как работает XDP](https://www.tigera.io/learn/guides/ebpf/ebpf-xdp/#How-XDP-Works) | `xdp_attach_mode` | `UPF_XDP_ATTACH_MODE` | `--attach` | `generic` |
| API address <br>`Дополнительный` | Локальный адрес для обслуживания сервера [REST API](../../docs/api.md) | `api_address` | `UPF_API_ADDRESS` | `--aaddr` | `:8080` |
| PFCP address <br>`Дополнительный` | Локальный адрес, по которому буедт доступен PFCP server | `pfcp_address` | `UPF_PFCP_ADDRESS` | `--paddr` | `:8805` |
Expand Down Expand Up @@ -43,6 +44,7 @@ pfcp_address: :8805
pfcp_node_id: 127.0.0.1
metrics_address: :9090
n3_address: 127.0.0.1
n9_address: 127.0.0.1
qer_map_size: 1024
far_map_size: 1024
pdr_map_size: 1024
Expand All @@ -60,6 +62,7 @@ UPF_PFCP_ADDRESS=:8806
UPF_METRICS_ADDRESS=:9091
UPF_PFCP_NODE_ID: 10.100.50.241 # address on n4 interface
UPF_N3_ADDRESS: 10.100.50.233
UPF_N9_ADDRESS: 10.100.50.233
```
### CLI
Expand Down
1 change: 1 addition & 0 deletions docs/docs-ru_ru/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ services:
- UPF_METRICS_ADDRESS=:9091
- UPF_PFCP_NODE_ID=172.21.0.100
- UPF_N3_ADDRESS=172.21.0.100
- UPF_N9_ADDRESS=172.21.0.100
ulimits:
memlock: -1
cap_add:
Expand Down
3 changes: 2 additions & 1 deletion docs/docs-ru_ru/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ sudo docker run -d --rm --privileged \

- UPF_INTERFACE_NAME=lo *Network interfaces handling N3 (GTP) & N6 (SGi) traffic.*
- UPF_N3_ADDRESS=127.0.0.1 *IPv4 address for N3 interface*
- UPF_N9_ADDRESS=127.0.0.1 *IPv4 address for N9 interface*
- UPF_XDP_ATTACH_MODE=generic *XDP attach mode. Generic-only at the moment*
- UPF_API_ADDRESS=:8080 *Local host:port for serving [REST API](api.md) server*
- UPF_PFCP_ADDRESS=:8805 *Local host:port that PFCP server will listen to*
Expand All @@ -66,7 +67,7 @@ sudo docker run -d --rm -v --privileged \
-e UPF_INTERFACE_NAME=[eth0,n6] -e UPF_XDP_ATTACH_MODE=generic \
-e UPF_API_ADDRESS=:8081 -e UPF_PFCP_ADDRESS=:8806 \
-e UPF_METRICS_ADDRESS=:9091 -e UPF_PFCP_NODE_ID=10.100.50.241 \
-e UPF_N3_ADDRESS=10.100.50.233 \
-e UPF_N3_ADDRESS=10.100.50.233 -e UPF_N9_ADDRESS=10.100.50.233 \
ghcr.io/edgecomllc/eupf:main
```

Expand Down
1 change: 1 addition & 0 deletions docs/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ services:
- UPF_METRICS_ADDRESS=:9091
- UPF_PFCP_NODE_ID=172.21.0.100
- UPF_N3_ADDRESS=172.21.0.100
- UPF_N9_ADDRESS=172.21.0.100
ulimits:
memlock: -1
cap_add:
Expand Down

0 comments on commit f46bd9c

Please sign in to comment.