NED File src/simu5g/nodes/Upf.ned¶
Name |
Type |
Description |
|---|---|---|
compound module |
Implements the 5G Core User Plane Function (UPF). |
Source code¶
//
// Simu5G
//
// Copyright (C) 2019-2021 Giovanni Nardini, Giovanni Stea, Antonio Virdis et al. (University of Pisa)
// Copyright (C) 2022-2026 Giovanni Nardini, Giovanni Stea et al. (University of Pisa)
//
// This file is part of a software released under the license included in file
// "license.pdf". Please read LICENSE and README files before using it.
// The above files and the present reference are part of the software itself,
// and cannot be removed from it.
//
package simu5g.nodes;
import inet.common.MessageDispatcher;
import inet.linklayer.contract.IEthernetInterface;
import inet.linklayer.ppp.PppInterface;
import inet.node.base.ApplicationLayerNodeBase;
import inet.transportlayer.udp.Udp;
import simu5g.corenetwork.ethernetSessionBridge.EthernetSessionBridge;
import simu5g.corenetwork.ndResponder.Ipv6NdResponder;
import simu5g.corenetwork.userPlaneNodeControl.UserPlaneNodeControl;
import simu5g.corenetwork.userPlaneRelay.UserPlaneRelay;
//
// Implements the 5G Core User Plane Function (UPF).
//
// The UPF is responsible for packet routing and forwarding, packet inspection, and (de)tunneling according to GTP.
// The core network can contain multiple UPFs. Intermediate UPFs, which are not connected to an external Data Network,
// act like IP routers in the current version.
// Allows the connection of mobile terminals to external data networks or other 5G network elements through GTP tunneling.
//
// The N6 interface toward the data network (dnPpp, on the dnPppg gate) belongs to this user
// plane: it is not in the node's interface table, so the node's own network layer (the stack
// of the core network) neither sees nor uses it, and the address configurator gives it no
// address.
//
// The N6 Ethernet interface (dnEth, on the dnEthg gate, with hasEthernetBridge) is a port of
// the ~EthernetSessionBridge (ethBridge), registered in the bridge's own interface table.
//
// The relay reaches the N6 interface, the ~EthernetSessionBridge (ethBridge) and the
// ~Ipv6NdResponder (ndResponder) through the rd message dispatcher, by service (see ~GtpUser).
//
module Upf extends ApplicationLayerNodeBase
{
parameters:
@display("i=abstract/switch;bgb=1700,1125");
@figure[userPlane](type=rectangle; pos=1275,5; size=400,437; fillColor=#ff8000; lineColor=#808080; cornerRadius=5; fillOpacity=0.1);
@figure[userPlane.title](type=text; pos=1670,10; anchor=ne; text="user plane");
@figure[n6Interfaces](type=rectangle; pos=1275,458; size=400,660; fillColor=#00ffff; lineColor=#808080; cornerRadius=5; fillOpacity=0.1);
@figure[n6Interfaces.title](type=text; pos=1670,463; anchor=ne; text="N6 interfaces");
@figure[submodules];
string nodeType = default("UPF"); // Do NOT change!
string gateway = default("");
bool hasNdResponder = default(false); // Answer the IPv6 Neighbor Discovery of the UEs' sessions (needed when UEs run IPv6), see ~Ipv6NdResponder
bool hasEthernetBridge = default(false); // Anchor Ethernet PDU sessions: the node's Ethernet bridge and N6 Ethernet link (dnEthg), see ~EthernetSessionBridge
forwarding = default(true);
multicastForwarding = default(false);
dnEth.interfaceTableModule = absPath(".ethBridge.interfaceTable"); // A port of the Ethernet session bridge, not an interface of the node's network layer
gates:
// This gate is used for the UPF connected to the external data network
// it must be left unconnected for intermediate UPFs
inout dnPppg @loose @labels(PppFrame-conn);
// The N6 Ethernet link of the Ethernet PDU sessions (with hasEthernetBridge)
inout dnEthg @loose @labels(EtherFrame-conn);
submodules:
dnPpp: PppInterface {
parameters:
interfaceTableModule = ""; // Not an interface of the node's network layer: the user plane's N6 end
displayStringTextFormat = "";
@display("p=1375,975");
}
relay: UserPlaneRelay {
parameters:
@display("p=1125,75");
ownerType = parent.nodeType;
gateway = parent.gateway;
}
rd: MessageDispatcher {
parameters:
@display("p=1475,450;b=380,5,,,,1");
serviceMapping = {"ipv4": "dnPpp", "ipv6": "dnPpp"}; // The data network; the optional modules register their services
protocolMapping = {"ipv4": "relay", "ipv6": "relay", "ethernetmac": "relay"};
forwardServiceRegistration = false;
forwardProtocolRegistration = false;
}
nodeControl: UserPlaneNodeControl {
parameters:
@display("p=125,400;is=s");
nodeType = parent.nodeType;
gateway = parent.gateway;
}
ndResponder: Ipv6NdResponder if hasNdResponder {
parameters:
@display("p=1550,225");
}
ethBridge: EthernetSessionBridge if hasEthernetBridge {
parameters:
@display("p=1575,700");
}
dnEth: <default("LayeredEthernetInterface")> like IEthernetInterface if hasEthernetBridge {
parameters:
@display("p=1575,975");
}
connections:
relay.socketOut --> at.in++;
relay.socketIn <-- at.out++;
relay.userDataOut --> { @display("m=h,v"); } --> rd.in++;
rd.out++ --> { @display("m=v,h"); } --> relay.userDataIn;
rd.out++ --> dnPpp.upperLayerIn;
dnPpp.upperLayerOut --> rd.in++;
rd.out++ --> ndResponder.in if hasNdResponder;
ndResponder.out --> rd.in++ if hasNdResponder;
rd.out++ --> ethBridge.sessionIn if hasEthernetBridge;
ethBridge.sessionOut --> rd.in++ if hasEthernetBridge;
ethBridge.lowerLayerOut --> dnEth.upperLayerIn if hasEthernetBridge;
dnEth.upperLayerOut --> ethBridge.lowerLayerIn if hasEthernetBridge;
dnEth.phys <--> { @display("m=s"); } <--> dnEthg if hasEthernetBridge;
dnPpp.phys <--> { @display("m=s"); } <--> dnPppg;
}