PgwStandard

Package: simu5g.nodes

PgwStandard

compound module

Implements a simplified EPC PDN Gateway (P-GW) of a 4G LTE network. It serves as the entry point to the core network of an LTE network, thus bridging it to the rest of the Internet. Packets arriving from the Internet are tunneled to the appropriate next hop in the core network (e.g., the eNodeB that will transmit the packet to the destination User Equipment through the radio access network) using the GPRS Tunneling Protocol (GTP). Conversely, packets received from the core network are detunneled and sent to the Internet (e.g., towards a remote server). To accomplish this, it utilizes a GtpUser module that handles GTP (de)tunneling, along with the TrafficFlowFilter module, which classifies incoming packets.

status : NodeStatus
[from inet] ↗

Keeps track of the status of network node (up, down, etc.) for other modules, and also displays it...

Source:
status: NodeStatus if hasStatus {
    @display("p=125,80;is=s");
} clock : like IClock

IClock [from inet] ↗: This module interface is implemented by clock models.

Source:
clock: <default("")> like IClock if typename != "" {
    @display("p=125,320;is=s");
} energyStorage : like IEnergyStorage

IEnergyStorage [from inet] ↗: The energy storage models describe devices that absorb energy produced by generators, and provide...

Source:
energyStorage: <default("")> like IEnergyStorage if typename != "" {
    @display("p=125,400;is=s");
} energyManagement : like IEnergyManagement

IEnergyManagement [from inet] ↗: The energy management models monitors an energy storage, estimates its state, and controls the...

Source:
energyManagement: <default("")> like IEnergyManagement if typename != "" {
    @display("p=125,480;is=s");
} energyGenerator : like IEnergyGenerator

IEnergyGenerator [from inet] ↗: The energy generator models describe the energy generation process of devices over time.

Source:
energyGenerator: <default("")> like IEnergyGenerator if typename != "" {
    @display("p=125,560;is=s");
} mobility : like IMobility

IMobility [from inet] ↗: The module interface for mobility models.

Source:
mobility: <default("")> like IMobility if typename != "" {
    @display("p=125,160;is=s");
} measurer : like IMeasurer

IMeasurer [from inet] ↗: This module interface is implemented by all standalone measurement modules.

Source:
measurer: <default("")> like IMeasurer if typename != "" {
    @display("p=125,660;is=s");
} pcapRecorder[numPcapRecorders] : PcapRecorder
[from inet] ↗

Records PCAP traces of frames sent/received by other modules within the same host.

Source:
pcapRecorder[numPcapRecorders]: PcapRecorder {
    @display("p=125,640;is=s");
} interfaceTable : InterfaceTable
[from inet] ↗

Keeps the table of network interfaces.

Source:
interfaceTable: InterfaceTable {
    @display("p=125,240;is=s");
} llc : like IIeee8022Llc

IIeee8022Llc [from inet] ↗

Source:
llc: <default("")> like IIeee8022Llc if typename != "" {
    @display("p=375,525");
} cb : MessageDispatcher
[from inet] ↗

This module connects multiple applications, protocols and interfaces with each other and...

Source:
cb: MessageDispatcher {
    @display("p=750,600;b=1000,5");
} bridging : like IProtocolLayer

IProtocolLayer [from inet] ↗: This module interface is implemented by all protocol layer modules that connect to a higher and to...

Source:
bridging: <default("")> like IProtocolLayer if typename != "" {
    @display("p=750,675");
} bl : MessageDispatcher
[from inet] ↗

This module connects multiple applications, protocols and interfaces with each other and...

Source:
bl: MessageDispatcher {
    @display("p=750,750;b=1000,5");
} ethernet : like IEthernetLayer

IEthernetLayer [from inet] ↗

Source:
ethernet: <default(sizeof(ethg) > 0 ? "EthernetEncapsulation" : "")> like IEthernetLayer if typename != "" {
    @display("p=375,825");
} ieee8021q : like IIeee8021qLayer

IIeee8021qLayer [from inet] ↗

Source:
ieee8021q: <default("")> like IIeee8021qLayer if typename != "" {
    @display("p=525,825");
} ieee8021r : like IIeee8021rLayer

IIeee8021rLayer [from inet] ↗

Source:
ieee8021r: <default("")> like IIeee8021rLayer if typename != "" {
    @display("p=675,825");
} li : MessageDispatcher
[from inet] ↗

This module connects multiple applications, protocols and interfaces with each other and...

Source:
li: MessageDispatcher {
    @display("p=750,900;b=1000,5,,,,1");
} lo[numLoInterfaces] : like ILoopbackInterface

LoopbackInterface [from inet] ↗: This module implements a loopback network interface.

ILoopbackInterface [from inet] ↗: This module interface is implemented by loopback network interfaces.

Source:
lo[numLoInterfaces]: <default("LoopbackInterface")> like ILoopbackInterface {
    @display("p=750,975,row,150");
} wlan[numWlanInterfaces] : like IWirelessInterface

Ieee80211Interface [from inet] ↗: This module implements an IEEE 802.11 network interface.

IWirelessInterface [from inet] ↗: This module interface is implemented by wireless network interfaces.

Source:
wlan[numWlanInterfaces]: <default("Ieee80211Interface")> like IWirelessInterface {
    @display("p=375,1000,row,150;q=queue");
} ppp[sizeof(pppg)] : like IPppInterface

PppInterface [from inet] ↗: This module implements a PPP network interface.

IPppInterface [from inet] ↗: This module interface is implemented by PPP network interfaces.

Source:
ppp[sizeof(pppg)]: <default("PppInterface")> like IPppInterface {
    @display("p=300,975,row,150;q=txQueue");
} eth[sizeof(ethg)] : like IEthernetInterface

EthernetInterface [from inet] ↗: This module represents an Ethernet network interface.

IEthernetInterface [from inet] ↗: This module interface is implemented by Ethernet network interfaces.

Source:
eth[sizeof(ethg)]: <default("EthernetInterface")> like IEthernetInterface {
    @display("p=900,975,row,150;q=txQueue");
} tun[numTunInterfaces] : like ITunnelInterface

TunInterface [from inet] ↗: This module implements a TUN network interface.

ITunnelInterface [from inet] ↗: This module interface is implemnted by tunnel network interfaces.

Source:
tun[numTunInterfaces]: <default("TunInterface")> like ITunnelInterface {
    @display("p=975,1000,row,150;q=txQueue");
} virt[numVirtInterfaces] : like IVirtualInterface

VirtualInterface [from inet] ↗: This module implements a virtual network interface.

IVirtualInterface [from inet] ↗: This module interface is implemnted by virtual network interfaces.

Source:
virt[numVirtInterfaces]: <default("VirtualInterface")> like IVirtualInterface {
    @display("p=975,1000,row,150;q=txQueue");
} ipv4 : like INetworkLayer

Ipv4NetworkLayer [from inet] ↗: Network layer of an IPv4 node.

INetworkLayer [from inet] ↗

Source:
ipv4: <default("Ipv4NetworkLayer")> like INetworkLayer if hasIpv4 {
    @display("p=375,375;q=queue");
} ipv6 : like INetworkLayer

Ipv6NetworkLayer [from inet] ↗: Represents an IPv6 network layer (L3).

INetworkLayer [from inet] ↗

Source:
ipv6: <default("Ipv6NetworkLayer")> like INetworkLayer if hasIpv6 {
    @display("p=525,375;q=queue");
} generic : like INetworkLayer

INetworkLayer [from inet] ↗

Source:
generic: <default("")> like INetworkLayer if hasGn {
    @display("p=675,375;q=queue");
} nl : MessageDispatcher
[from inet] ↗

This module connects multiple applications, protocols and interfaces with each other and...

Source:
nl: MessageDispatcher {
    @display("p=750,450;b=1000,5,,,,1");
} udp : like IUdp

IUdp [from inet] ↗: UDP protocol interface.

Source:
udp: <default(firstAvailableOrEmpty("Udp"))> like IUdp if hasUdp {
    @display("p=375,225");
} tcp : like ITcp

ITcp [from inet] ↗: Interface for TCP protocol implementations.

Source:
tcp: <default(firstAvailableOrEmpty("Tcp", "TcpLwip", "TcpNsc"))> like ITcp if hasTcp {
    @display("p=525,225");
} sctp : like ISctp

ISctp [from inet] ↗: Interface for SCTP protocol.

Source:
sctp: <default(firstAvailableOrEmpty("Sctp"))> like ISctp if hasSctp {
    @display("p=675,225");
} tn : MessageDispatcher
[from inet] ↗

This module connects multiple applications, protocols and interfaces with each other and...

Source:
tn: MessageDispatcher {
    @display("p=750,300;b=1000,5,,,,1");
} app[numApps] : like IApp

IApp [from inet] ↗: Generic application interface.

Source:
app[numApps]: <> like IApp {
    @display("p=375,75,row,150");
} at : MessageDispatcher
[from inet] ↗

This module connects multiple applications, protocols and interfaces with each other and...

Source:
at: MessageDispatcher {
    @display("p=750,150;b=1000,5,,,,1");
} dnPpp : PppInterface
[from inet] ↗

This module implements a PPP network interface.

Source:
dnPpp: PppInterface {
    parameters:
        @display("p=1100,975");
} trafficFlowFilter : TrafficFlowFilter

Maps IP 4-Tuples to Traffic Flow Template (TFT) identifiers, which are used by the ~GtpUser module...

Source:
trafficFlowFilter: TrafficFlowFilter {
    parameters:
        @display("p=1200,75");
        ownerType = parent.nodeType;
} gtp_user : GtpUser

Implements a simplified version of the user plane of the GPRS Tunneling Protocol (GTP).

Source:
gtp_user: GtpUser {
    parameters:
        @display("p=1000,75");
}

Usage diagram

The following diagram shows usage relationships between types. Unresolved types are missing from the diagram.

Inheritance diagram

The following diagram shows inheritance relationships for this type. Unresolved types are missing from the diagram.

Used in

Name Type Description
MultiCell network

Two eNodeB cells on a shared EPC PgwStandard, joined by an X2 link, with a router and a server behind the core. Four LteUe terminals are placed two per cell, and numExtCells ExtCell cells can be added as interferers.

MultiCell_D2DMultihop network

Five eNodeB cells, each reaching the EPC PgwStandard through a router of its own, with a further router and a server behind the core. There are no X2 links. numUe1 to numUe5 LteUe terminals attach per cell, and an EventGenerator and a MultihopD2DStatistics module sit beside them, wired to nothing.

MultiCell_withSecondaryGnb network

The two-cell version of SingleCell_withSecondaryGnb: two eNodeB masters, each paired over X2 with its own gNodeB secondary, and a further X2 link between the two masters. Both eNodeBs connect to the EPC PgwStandard, which faces a router and a server; neither gNodeB has a core-network link. numUe NrUe terminals attach, and numBgCells BackgroundCell cells can be added as interferers.

MultiCell_X2Mesh network

Three eNodeB cells in a full X2 mesh. Each reaches the EPC PgwStandard through a router of its own, and the server sits directly on the PgwStandard's data-network gate. numUe1, numUe2 and numUe3 LteUe terminals attach per cell, and numExtCells ExtCell cells can be added as interferers.

SingleCell network

The minimal LTE topology: one eNodeB connected to an EPC PgwStandard, which faces a router and a server, plus numUe LteUe terminals.

SingleCell_D2D network

SingleCell with its UEs split into three vectors, so that a configuration can address cellular terminals (ueCell), D2D transmitters (ueD2DTx) and D2D receivers (ueD2DRx) separately. The rest of the topology is the same: one eNodeB on an EPC PgwStandard, with a router and a server behind it.

SingleCell_D2DMulticast network

SingleCell with its UEs split into cellular terminals (ueCell) and members of a D2D multicast group (ueD2D). The rest of the topology is the same: one eNodeB on an EPC PgwStandard, with a router and a server behind it.

SingleCell_withSecondaryGnb network

An EN-DC topology: an eNodeB master paired over X2 with a gNodeB secondary. The eNodeB is the only node with a core-network link -- an EPC PgwStandard facing a router and a server -- so all data-plane traffic enters there, and the gNodeB contributes its radio leg alone. numUe NrUe terminals attach to both, and numBgCells BackgroundCell cells can be added as interferers.

Extends

Name Type Description
ApplicationLayerNodeBase compound module (no description)

Parameters

Name Type Default value Description
hasStatus bool false
osgModel string ""

3D model for OSG visualization, no 3D model by default

osgModelColor string ""

tint color, no colorization by default

canvasImage string ""

image for canvas visualization, no image by default

canvasImageColor string ""

tint color, no colorization by default

recordPcap bool false
numPcapRecorders int recordPcap ? 1 : 0
numLoInterfaces int 1
numWlanInterfaces int 0
numEthInterfaces int 0

minimum number of ethernet interfaces

numPppInterfaces int 0

minimum number of PPP interfaces

numTunInterfaces int 0
numVirtInterfaces int 0
fcsMode string "declared"
hasIpv4 bool true
hasIpv6 bool false
hasGn bool false
forwarding bool true
multicastForwarding bool false
hasUdp bool firstAvailableOrEmpty("Udp") != ""
hasTcp bool firstAvailableOrEmpty("Tcp", "TcpLwip", "TcpNsc") != ""
hasSctp bool false
numApps int 0
nodeType string "PGW"

Properties

Name Value Description
networkNode
labels node
class NodeBase
display i=device/mainframe

Gates

Name Direction Size Description
radioIn [ ] input numWlanInterfaces
pppg [ ] inout numPppInterfaces
ethg [ ] inout numEthInterfaces
dnPppg inout

Unassigned submodule parameters

Name Type Default value Description
status.initialStatus string "UP"

TODO @signal, @statistic

pcapRecorder.verbose bool true

whether to log packets on the module output

pcapRecorder.pcapFile string ""

the PCAP file to be written

pcapRecorder.fileFormat string "pcapng"
pcapRecorder.snaplen int 65535

maximum number of bytes to record per packet

pcapRecorder.dumpBadFrames bool true

enable dump of frames with hasBitError

pcapRecorder.moduleNamePatterns string "wlan[*] eth[*] ppp[*]"

space-separated list of sibling module names to listen on

pcapRecorder.sendingSignalNames string "packetSentToLower"

space-separated list of outbound packet signals to subscribe to

pcapRecorder.receivingSignalNames string "packetReceivedFromLower"

space-separated list of inbound packet signals to subscribe to

pcapRecorder.dumpProtocols string "ethernetmac ppp ieee80211mac"

space-separated list of protocol names as defined in the Protocol class

pcapRecorder.packetFilter object "*"

which packets are considered, matches all packets by default

pcapRecorder.helpers string ""

usable PcapRecorder::IHelper helpers for accept packettype and store/convert packet as specified linktype currently available: "inet::AckingMacToEthernetPcapRecorderHelper"

pcapRecorder.alwaysFlush bool false

flush the pcapFile after each write to ensure that all packets are captured in case of a crash

pcapRecorder.displayStringTextFormat string "rec: %n pks"
interfaceTable.displayAddresses bool false

whether to display IP addresses on links

cb.displayStringTextFormat string "processed %p pk (%l)"

determines the text that is written on top of the submodule

cb.forwardServiceRegistration bool true
cb.forwardProtocolRegistration bool true
bl.displayStringTextFormat string "processed %p pk (%l)"

determines the text that is written on top of the submodule

bl.forwardServiceRegistration bool true
bl.forwardProtocolRegistration bool true
li.displayStringTextFormat string "processed %p pk (%l)"

determines the text that is written on top of the submodule

li.forwardServiceRegistration bool true
li.forwardProtocolRegistration bool true
eth.bitrate double
nl.displayStringTextFormat string "processed %p pk (%l)"

determines the text that is written on top of the submodule

nl.forwardServiceRegistration bool true
nl.forwardProtocolRegistration bool true
tn.displayStringTextFormat string "processed %p pk (%l)"

determines the text that is written on top of the submodule

tn.forwardServiceRegistration bool true
tn.forwardProtocolRegistration bool true
at.displayStringTextFormat string "processed %p pk (%l)"

determines the text that is written on top of the submodule

at.forwardServiceRegistration bool true
at.forwardProtocolRegistration bool true
dnPpp.pcapRecorder.verbose bool true

whether to log packets on the module output

dnPpp.pcapRecorder.pcapFile string ""

the PCAP file to be written

dnPpp.pcapRecorder.fileFormat string "pcapng"
dnPpp.pcapRecorder.snaplen int 65535

maximum number of bytes to record per packet

dnPpp.pcapRecorder.dumpBadFrames bool true

enable dump of frames with hasBitError

dnPpp.pcapRecorder.sendingSignalNames string "packetSentToLower"

space-separated list of outbound packet signals to subscribe to

dnPpp.pcapRecorder.receivingSignalNames string "packetReceivedFromLower"

space-separated list of inbound packet signals to subscribe to

dnPpp.pcapRecorder.dumpProtocols string "ethernetmac ppp ieee80211mac"

space-separated list of protocol names as defined in the Protocol class

dnPpp.pcapRecorder.packetFilter object "*"

which packets are considered, matches all packets by default

dnPpp.pcapRecorder.helpers string ""

usable PcapRecorder::IHelper helpers for accept packettype and store/convert packet as specified linktype currently available: "inet::AckingMacToEthernetPcapRecorderHelper"

dnPpp.pcapRecorder.alwaysFlush bool false

flush the pcapFile after each write to ensure that all packets are captured in case of a crash

dnPpp.pcapRecorder.displayStringTextFormat string "rec: %n pks"
dnPpp.ppp.interfaceTableModule string

The path to the InterfaceTable module

dnPpp.ppp.displayStringTextFormat string "rate: %b\nsent: %s, rcvd: %r\nqueue: %q, drop: %d"
dnPpp.ppp.sendRawBytes bool false

when true packets are serialized into a sequence of bytes before sending out

dnPpp.ppp.mtu int 4470B
dnPpp.ppp.stopOperationExtraTime double -1s

extra time after lifecycle stop operation finished

dnPpp.ppp.stopOperationTimeout double 2s

timeout value for lifecycle stop operation

trafficFlowFilter.binderModule string "binder"
trafficFlowFilter.bearerConfiguratorModule string "bearerConfigurator"

Where a core-network instance registers for QFI-rule delivery

trafficFlowFilter.fastForwarding bool true
gtp_user.binderModule string "binder"
gtp_user.interfaceTableModule string

Path to the InterfaceTable module

gtp_user.ipOutInterface string ""

Optional: manual specification of outgoing interface for received IP

gtp_user.localPort int 31
gtp_user.tunnelPeerPort int 31
gtp_user.gateway string ""

Optional

Source code

//
// Implements a simplified EPC PDN Gateway (P-GW) of a 4G LTE network.
// It serves as the entry point to the core network of an LTE network, thus bridging it to the rest
// of the Internet. Packets arriving from the Internet are tunneled to the appropriate next hop in
// the core network (e.g., the ~eNodeB that will transmit the packet to the destination User Equipment
// through the radio access network) using the GPRS Tunneling Protocol (GTP). Conversely, packets
// received from the core network are detunneled and sent to the Internet (e.g., towards a remote server).
// To accomplish this, it utilizes a ~GtpUser module that handles GTP (de)tunneling, along with the
// ~TrafficFlowFilter module, which classifies incoming packets.
//
module PgwStandard extends ApplicationLayerNodeBase
{
    parameters:
        @display("i=device/mainframe");
        @figure[submodules];

        string nodeType = "PGW";

        forwarding = default(true);
        multicastForwarding = default(false);

    gates:
        inout dnPppg @labels(PppFrame-conn);

    submodules:
        dnPpp: PppInterface {
            parameters:
                @display("p=1100,975");
        }
        trafficFlowFilter: TrafficFlowFilter {
            parameters:
                @display("p=1200,75");
                ownerType = parent.nodeType;
        }
        gtp_user: GtpUser {
            parameters:
                @display("p=1000,75");
        }

    connections:

        gtp_user.socketOut --> at.in++;
        gtp_user.socketIn <-- at.out++;

        dnPpp.upperLayerOut --> trafficFlowFilter.internetFilterGateIn;
        dnPpp.upperLayerIn <-- gtp_user.pppGate;

        trafficFlowFilter.gtpUserGateOut --> gtp_user.trafficFlowFilterGate;

        dnPpp.phys <--> dnPppg;
}

File: src/simu5g/nodes/PgwStandard.ned