diff --git a/README.md b/README.md index a83337ce..52e298ce 100644 --- a/README.md +++ b/README.md @@ -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* @@ -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 ``` diff --git a/cmd/config/config.go b/cmd/config/config.go index c044ff6c..7786ea47 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -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"` @@ -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") @@ -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")) @@ -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) diff --git a/cmd/core/pfcp_connection.go b/cmd/core/pfcp_connection.go index 5acded10..70a21854 100644 --- a/cmd/core/pfcp_connection.go +++ b/cmd/core/pfcp_connection.go @@ -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 @@ -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()) @@ -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) @@ -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, diff --git a/cmd/core/pfcp_session_handlers.go b/cmd/core/pfcp_session_handlers.go index b201c45b..9bc1294c 100644 --- a/cmd/core/pfcp_session_handlers.go +++ b/cmd/core/pfcp_session_handlers.go @@ -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 @@ -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 @@ -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 @@ -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() @@ -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) @@ -582,6 +583,19 @@ 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) { + farInfo.LocalIP = binary.LittleEndian.Uint32(localN9Ip) + } else { + farInfo.LocalIP = binary.LittleEndian.Uint32(localN3Ip) + } + } } } transportLevelMarking, err := GetTransportLevelMarking(far) diff --git a/cmd/main.go b/cmd/main.go index 6d042428..39932bd2 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -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()) } diff --git a/docs/Configuration.md b/docs/Configuration.md index 853cbb96..b976d736 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -8,6 +8,7 @@ Currently UPF have several config parameters shown below.
Parameters can be c |--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|-----------------------|-------------|-----------------| | Interface name
`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
`Mandatory` | IPv4 address for N3 interface | `n3_address` | `UPF_N3_ADDRESS` | `--n3addr` | `127.0.0.1` | +| N9 address
`Mandatory` | IPv4 address for N9 interface | `n9_address` | `UPF_N9_ADDRESS` | `--n9addr` | `127.0.0.1` | | XDP mode
`Optional` | XDP attach mode:
∘ **generic** – Kernel-level implementation. For evaluation purpose.
∘ **native** – Driver-level implenemntaion
∘ **offload** – NIC-level implementation. XDP can be loaded and executed directly on the NIC.
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
`Optional` | Local address for serving [REST API](api.md) server | `api_address` | `UPF_API_ADDRESS` | `--aaddr` | `:8080` | | PFCP address
`Optional` | Local address that PFCP server will listen to | `pfcp_address` | `UPF_PFCP_ADDRESS` | `--paddr` | `:8805` | @@ -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 @@ -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 diff --git a/docs/api.md b/docs/api.md index 50a6689f..1e721f2d 100644 --- a/docs/api.md +++ b/docs/api.md @@ -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, diff --git a/docs/deployments/free5gc-ulcl/eupf-b.yaml b/docs/deployments/free5gc-ulcl/eupf-b.yaml index eb834da6..7a2694e0 100644 --- a/docs/deployments/free5gc-ulcl/eupf-b.yaml +++ b/docs/deployments/free5gc-ulcl/eupf-b.yaml @@ -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 diff --git a/docs/deployments/free5gc-with-bgp/values/eupf.yaml b/docs/deployments/free5gc-with-bgp/values/eupf.yaml index dfe66375..7ec010bc 100644 --- a/docs/deployments/free5gc-with-bgp/values/eupf.yaml +++ b/docs/deployments/free5gc-with-bgp/values/eupf.yaml @@ -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: diff --git a/docs/deployments/open5gs-compose/docker-compose.eupf.yaml b/docs/deployments/open5gs-compose/docker-compose.eupf.yaml index baff9f8d..73e3320f 100644 --- a/docs/deployments/open5gs-compose/docker-compose.eupf.yaml +++ b/docs/deployments/open5gs-compose/docker-compose.eupf.yaml @@ -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: diff --git a/docs/deployments/open5gs-with-bgp-and-slices-UE2pdu/values/eupf.yaml b/docs/deployments/open5gs-with-bgp-and-slices-UE2pdu/values/eupf.yaml index 67153494..ad78fae6 100644 --- a/docs/deployments/open5gs-with-bgp-and-slices-UE2pdu/values/eupf.yaml +++ b/docs/deployments/open5gs-with-bgp-and-slices-UE2pdu/values/eupf.yaml @@ -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: diff --git a/docs/deployments/open5gs-with-bgp-and-slices-UE2pdu/values/eupf2.yaml b/docs/deployments/open5gs-with-bgp-and-slices-UE2pdu/values/eupf2.yaml index 5122c9f7..4f2e592e 100644 --- a/docs/deployments/open5gs-with-bgp-and-slices-UE2pdu/values/eupf2.yaml +++ b/docs/deployments/open5gs-with-bgp-and-slices-UE2pdu/values/eupf2.yaml @@ -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: diff --git a/docs/deployments/open5gs-with-bgp-and-slices/values/eupf.yaml b/docs/deployments/open5gs-with-bgp-and-slices/values/eupf.yaml index 67153494..ad78fae6 100644 --- a/docs/deployments/open5gs-with-bgp-and-slices/values/eupf.yaml +++ b/docs/deployments/open5gs-with-bgp-and-slices/values/eupf.yaml @@ -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: diff --git a/docs/deployments/open5gs-with-bgp-and-slices/values/eupf2.yaml b/docs/deployments/open5gs-with-bgp-and-slices/values/eupf2.yaml index 5122c9f7..4f2e592e 100644 --- a/docs/deployments/open5gs-with-bgp-and-slices/values/eupf2.yaml +++ b/docs/deployments/open5gs-with-bgp-and-slices/values/eupf2.yaml @@ -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: diff --git a/docs/deployments/open5gs-with-bgp/values/eupf.yaml b/docs/deployments/open5gs-with-bgp/values/eupf.yaml index 6d90c408..411f5c52 100644 --- a/docs/deployments/open5gs-with-bgp/values/eupf.yaml +++ b/docs/deployments/open5gs-with-bgp/values/eupf.yaml @@ -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: diff --git a/docs/deployments/open5gs-with-scaling-eupf/values/eupf.yaml b/docs/deployments/open5gs-with-scaling-eupf/values/eupf.yaml index d5cae6f1..1437b3cd 100644 --- a/docs/deployments/open5gs-with-scaling-eupf/values/eupf.yaml +++ b/docs/deployments/open5gs-with-scaling-eupf/values/eupf.yaml @@ -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: diff --git a/docs/deployments/srsran-gnb/values/eupf.yaml b/docs/deployments/srsran-gnb/values/eupf.yaml index 6d90c408..411f5c52 100644 --- a/docs/deployments/srsran-gnb/values/eupf.yaml +++ b/docs/deployments/srsran-gnb/values/eupf.yaml @@ -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: diff --git a/docs/docs-ru_ru/Configuration.md b/docs/docs-ru_ru/Configuration.md index 31874cf1..794360fb 100644 --- a/docs/docs-ru_ru/Configuration.md +++ b/docs/docs-ru_ru/Configuration.md @@ -8,6 +8,7 @@ |--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|-----------------------|-------------|-------------| | Interface name
`Обязательный` | Список сетевых интерфейсов, обрабатывающих трафик N3 (GTP) и N6 (SGi). eUPF присоединяет перехватчик XDP к каждому интерфейсу в этом списке. Формат: `[ifnameA, ifnameB, ...]`. | `interface_name` | `UPF_INTERFACE_NAME` | `--iface` | `lo` | | N3 address
`Обязательный` | IPv4 адрея для N3 интерфейса | `n3_address` | `UPF_N3_ADDRESS` | `--n3addr` | `127.0.0.1` | +| N9 address
`Обязательный` | IPv4 адрея для N9 интерфейса | `n9_address` | `UPF_N9_ADDRESS` | `--n9addr` | `127.0.0.1` | | XDP mode
`Дополнительный` | XDP attach mode:
∘ **generic** – Реализация на уровне ядра. В целях оценки.
∘ **native** – реализация на уровне драйвера
∘ **offload** – реализация на уровне NIC. XDP можно загрузить и выполнить непосредственно на сетевой карте.
См. [Как работает XDP](https://www.tigera.io/learn/guides/ebpf/ebpf-xdp/#How-XDP-Works) | `xdp_attach_mode` | `UPF_XDP_ATTACH_MODE` | `--attach` | `generic` | | API address
`Дополнительный` | Локальный адрес для обслуживания сервера [REST API](../../docs/api.md) | `api_address` | `UPF_API_ADDRESS` | `--aaddr` | `:8080` | | PFCP address
`Дополнительный` | Локальный адрес, по которому буедт доступен PFCP server | `pfcp_address` | `UPF_PFCP_ADDRESS` | `--paddr` | `:8805` | @@ -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 @@ -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 diff --git a/docs/docs-ru_ru/install.md b/docs/docs-ru_ru/install.md index baf684e1..2e2b001a 100644 --- a/docs/docs-ru_ru/install.md +++ b/docs/docs-ru_ru/install.md @@ -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: diff --git a/docs/docs-ru_ru/readme.md b/docs/docs-ru_ru/readme.md index 840a8be0..9ab55c1f 100644 --- a/docs/docs-ru_ru/readme.md +++ b/docs/docs-ru_ru/readme.md @@ -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* @@ -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 ``` diff --git a/docs/install.md b/docs/install.md index adaf15cf..0dcb62cc 100644 --- a/docs/install.md +++ b/docs/install.md @@ -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: