Package: simu5g.nodes
PgwStandard
compound moduleImplements 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.
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