From f46bd9ceec22013067ea847de1e4cc9d2f64e0dd Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Thu, 14 Nov 2024 19:17:22 +0100 Subject: [PATCH] feat: Support configuring local IP address for N9 interface 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: https://github.com/edgecomllc/eupf/issues/577 --- README.md | 3 ++- cmd/config/config.go | 4 +++ cmd/core/pfcp_connection.go | 11 ++++++-- cmd/core/pfcp_session_handlers.go | 25 +++++++++++++++---- cmd/main.go | 4 ++- docs/Configuration.md | 3 +++ docs/api.md | 1 + docs/deployments/free5gc-ulcl/eupf-b.yaml | 2 ++ .../free5gc-with-bgp/values/eupf.yaml | 1 + .../open5gs-compose/docker-compose.eupf.yaml | 1 + .../values/eupf.yaml | 1 + .../values/eupf2.yaml | 1 + .../values/eupf.yaml | 1 + .../values/eupf2.yaml | 1 + .../open5gs-with-bgp/values/eupf.yaml | 1 + .../values/eupf.yaml | 1 + docs/deployments/srsran-gnb/values/eupf.yaml | 1 + docs/docs-ru_ru/Configuration.md | 3 +++ docs/docs-ru_ru/install.md | 1 + docs/docs-ru_ru/readme.md | 3 ++- docs/install.md | 1 + 21 files changed, 60 insertions(+), 10 deletions(-) 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..e17cb89c 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,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) 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: