eNodeB

Package: simu5g.nodes

compound module eNodeB

Models an evolved Node B (eNB) of a 4G LTE network. It is a specialized device equipped with a Network Interface Card (NIC) that enables communication with the LteUe devices connected to it. It serves as an access point that routes packets between the UEs and the 4G Core Network. Packets arriving from the UEs are tunneled to the appropriate next hop in the core network (e.g., the PDN Gateway, PGW) using the GPRS Tunneling Protocol (GTP). Conversely, packets received from the core network are detunneled and sent to the appropriate destination UE. In addition to the 4G NIC, this compound module includes a configurable number of wired interfaces to connect with routers of the core network or directly to the PgwStandard module, which serves as the IP module to perform forwarding, and the UserPlaneRelay that relays between the NIC and the GTP tunnels: its TrafficFlowFilter classifies incoming packets and determines the next hop, and its GtpUser handles GTP (de)tunneling. Furthermore, it features a configurable number of LteX2App modules to facilitate peer-to-peer communications with other eNodeBs within the same LTE network.

eNodeBcellularNic.radioIn --> radioInpppIf.phys <--> ppppppIf.upperLayerOut --> nl.in++pppIf.upperLayerIn --> nl.out++x2ppp[i].phys <--> x2[i] for i=0..sizeof(x2)-1⦀x2ppp[i].upperLayerOut --> tn.in++ for i=0..sizeof(x2)-1⦀x2ppp[i].upperLayerIn --> tn.out++ for i=0..sizeof(x2)-1⦀cellularNic.upperLayerOut --> relay.userDataInrelay.userDataOut --> cellularNic.upperLayerInrelay.socketOut --> at.in++relay.socketIn --> at.out++gtpUserX2.lteStackOut --> cellularNic.x2$i++cellularNic.x2$o++ --> gtpUserX2.lteStackIngtpUserX2.socketOut --> at.in++gtpUserX2.socketIn --> at.out++x2App[i].sctpOut[0] --> at.in++ for i=0..numX2Apps-1⦀x2App[i].sctpIn[0] --> at.out++ for i=0..numX2Apps-1⦀x2App[i].sctpOut[1] --> at.in++ for i=0..numX2Apps-1⦀x2App[i].sctpIn[1] --> at.out++ for i=0..numX2Apps-1⦀cellularNic.x2$o++ --> x2App[i].x2ManagerIn for i=0..numX2Apps-1⦀x2App[i].x2ManagerOut --> cellularNic.x2$i++ for i=0..numX2Apps-1⦀app[i].socketOut --> at.in++ for i=0..numApps-1⦀app[i].socketIn --> at.out++ for i=0..numApps-1⦀at.out++ --> udp.appIn conditional: hasUdp?at.in++ --> udp.appOut conditional: hasUdp?at.out++ --> tcp.appIn conditional: hasTcp?at.in++ --> tcp.appOut conditional: hasTcp?at.out++ --> sctp.appIn conditional: hasSctp?at.in++ --> sctp.appOut conditional: hasSctp?udp.ipOut --> tn.in++ conditional: hasUdp?udp.ipIn --> tn.out++ conditional: hasUdp?tcp.ipOut --> tn.in++ conditional: hasTcp?tcp.ipIn --> tn.out++ conditional: hasTcp?sctp.ipOut --> tn.in++ conditional: hasSctp?tn.out++ --> sctp.ipIn conditional: hasSctp?ipv4.ifIn --> nl.out++ conditional: hasIpv4?ipv4.ifOut --> nl.in++ conditional: hasIpv4?ipv4.transportIn --> tn.out++ conditional: hasIpv4?ipv4.transportOut --> tn.in++ conditional: hasIpv4?ipv6.ifIn --> nl.out++ conditional: hasIpv6?ipv6.ifOut --> nl.in++ conditional: hasIpv6?ipv6.transportIn --> tn.out++ conditional: hasIpv6?ipv6.transportOut --> tn.in++ conditional: hasIpv6?tn.out++ --> nl.in++tn.in++ --> nl.out++nl.out++ --> cellularNdSink.in conditional: hasIpv6?nl.in++ --> cellularNdSink.out conditional: hasIpv6?at.out++ --> tn.in++at.in++ --> tn.out++pppMEHostIf.upperLayerIn --> nl.out++pppMEHostIf.upperLayerOut --> nl.in++pppMEHost <--> pppMEHostIf.physinterfaceTable: inet.networklayer.common.InterfaceTable Keeps the table of network interfaces. Source: interfaceTable: InterfaceTable { parameters: @display("p=110,158;is=s"); }interfaceTablemobility: inet.mobility.static.StationaryMobility Mobility module for stationary nodes. Source: mobility: StationaryMobility { parameters: @display("p=110,343;is=s"); }mobilitycellInfo: simu5g.common.cellInfo.CellInfo Includes data structures and functions used to support local operations at the e/gNodeB, such as... Source: cellInfo: CellInfo { parameters: @display("p=110,244;is=s"); }cellInfocollector: simu5g.corenetwork.statsCollector.BaseStationStatsCollector (like IStatsCollector) BaseStationStatsCollector: Collects the radio network information of an eNodeB, which can be accessed by the ~RniService mod... IStatsCollector: A module implementing this interface is a utility module that is accessed by the ~RniService of a... Source: collector: <default("BaseStationStatsCollector")> like IStatsCollector if hasRniSupport { @display("p=110,430;is=s"); }collectorcellularNic: simu5g.stack.d2d.LteNicEnbD2D (like ICellularNic) LteNicEnbD2D: The LteNicEnbD2D module represents an LTE eNodeB network interface with support for D2D (Device-t... ICellularNic: Interface for the 3GPP Stack. Source: cellularNic: <default(hasD2D ? "LteNicEnbD2D" : "LteNicEnb")> like ICellularNic { parameters: @display("p=1275,520"); nodeType = parent.nodeType; rrc.connectionControl.gateway = parent.gateway; }cellularNicpppIf: inet.linklayer.ppp.PppInterface Implements a PPP network interface. Source: pppIf: PppInterface { parameters: @display("p=700,520"); }pppIfx2ppp[sizeof(x2)]: inet.linklayer.ppp.PppInterface Implements a PPP network interface. Source: x2ppp[sizeof(x2)]: PppInterface { parameters: @display("p=850,520,row,100"); }x2ppp[sizeof(x2)]pppMEHostIf: inet.linklayer.ppp.PppInterface Implements a PPP network interface. Source: pppMEHostIf: PppInterface { @display("p=550,520"); }pppMEHostIfipv4: inet.networklayer.ipv4.Ipv4NetworkLayer (like INetworkLayer) Ipv4NetworkLayer: Network layer of an IPv4 node. Source: ipv4: <default("Ipv4NetworkLayer")> like INetworkLayer if hasIpv4 { parameters: @display("p=525,371;q=queue"); }#ipv4ipv6: inet.networklayer.ipv6.Ipv6NetworkLayer (like INetworkLayer) Ipv6NetworkLayer: Represents a complete IPv6 network layer (L3), to be used within hosts and routers. Source: ipv6: <default("Ipv6NetworkLayer")> like INetworkLayer if hasIpv6 { parameters: @display("p=775,371;q=queue"); }#ipv6app[numApps]: inet.applications.contract.IApp (like IApp) IApp: Generic application interface. Source: app[numApps]: <> like IApp { parameters: @display("p=325,95,row,150"); }app[numApps]udp: inet.transportlayer.udp.Udp UDP protocol implementation, for IPv4 (~Ipv4) and IPv6 (~Ipv6). Source: udp: Udp { parameters: @display("p=650,221"); }udptcp: inet.transportlayer.tcp.Tcp Implements the TCP protocol. Source: tcp: Tcp if hasTcp { parameters: @display("p=900,221"); }tcpx2App[numX2Apps]: simu5g.x2.LteX2App Represents the container for all X2 applications that an e/gNodeB instantiates to enable X2 commu... Source: x2App[numX2Apps]: LteX2App { parameters: @display("p=625,68,row,150"); }x2App[numX2Apps]sctp: inet.transportlayer.sctp.Sctp Implements the SCTP protocol. Source: sctp: Sctp { parameters: @display("p=400,221"); }sctpat: inet.common.MessageDispatcher Facilitates the interconnection of applications, protocols, and network interfaces, dispatching m... Source: at: MessageDispatcher { parameters: @display("p=650,146;b=800,5,,,,1"); }attn: inet.common.MessageDispatcher Facilitates the interconnection of applications, protocols, and network interfaces, dispatching m... Source: tn: MessageDispatcher { parameters: @display("p=650,296;b=800,5,,,,1"); }tnnl: inet.common.MessageDispatcher Facilitates the interconnection of applications, protocols, and network interfaces, dispatching m... Source: nl: MessageDispatcher { parameters: interfaceMapping = parent.hasIpv6 ? {"cellular": "cellularNdSink"} : {}; // WORKAROUND, see ~CellularNicNdSink @display("p=650,446;b=800,5,,,,1"); }nlcellularNdSink: simu5g.nodes.CellularNicNdSink WORKAROUND: takes what the IPv6 layer of a base station sends to the cellular NIC, which is no in... Source: cellularNdSink: CellularNicNdSink if hasIpv6 { parameters: @display("p=400,520"); }cellularNdSinkrelay: simu5g.corenetwork.userPlaneRelay.UserPlaneRelay The user-plane relay of a node that ends GTP-U tunnels: the "relay" between the two protocol stac... Source: relay: UserPlaneRelay { parameters: @display("p=975,95"); ownerType = parent.nodeType; gateway = parent.gateway; mecHost = parent.mecHost; }relaygtpUserX2: simu5g.corenetwork.gtp.GtpUserX2 Implements a simplified version of the user plane of the GPRS Tunneling Protocol (GTP) used for h... Source: gtpUserX2: GtpUserX2 { parameters: @display("p=875,40"); }gtpUserX2

Usage diagram

Inheritance diagram

Used in

Name

Type

Description

Highway

network

Two eNodeB cells on a shared EPC PgwStandard, joined by an X2 link, with a router and a server behind the core. The cars are LteCar nodes created at run time by the VeinsInetManager from a SUMO road traffic simulation, so the car[] vector is empty in the topology itself.

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. With hasD2D, the network holds the D2dBinder that D2D-capable nodes need, so that ‘**.hasD2D = true’ turns D2D on in the network and in all its nodes.

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_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.

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.

SingleCell_withSecondaryEnb

network

The mirror image of SingleCell_withSecondaryGnb: here the gNodeB is the master node and the eNodeB is its secondary, so the UE is anchored on its NR stack and its LTE stack carries the secondary cell group. All data-plane traffic enters at the gNodeB.

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.

Known subclasses

Name

Type

Description

gNodeB

compound module

Implements a gNodeB for a 5G network. It extends the eNodeB module by providing 5G connectivity to NrUe modules. It can be used in either StandAlone (SA) or Non-StandAlone (NSA) 5G deployments. In the former case, it is directly connected to a Upf module. In the latter case, this module can be configured as a secondary node of a eNodeB module, thus enabling E-UTRA Dual Connectivity (EN-DC).

Parameters

Name

Type

Default value

Description

nodeType

string

“ENODEB”

DO NOT CHANGE

gateway

string

“pgw”

masterId

int

0

ID of the master eNodeB. Used in case of Dual Connectivity

macNodeId

int

1+simu5g_seq(“eNodeB_macNodeId”)

macCellId

int

macNodeId

txPower

double

100mw

hasD2D

bool

false

hasIpv4

bool

true

hasIpv6

bool

false

numApps

int

0

Number of apps

numX2Apps

int

0

Number of X2 apps; set their types in the ini file, e.g. x2App[0..1].typename=”X2AppClient”

hasUdp

bool

true

hasTcp

bool

firstAvailableOrEmpty(“Tcp”, “TcpLwip”, “TcpNsc”) != “”

hasSctp

bool

true

mecHost

string

“”

Symbolic name of the connected MEHost in the Network

hasRniSupport

bool

false

extMeAppsAddress

string

“”

Address of the external MeApp IP/mask

mcc

string

“001”

Test network

mnc

string

“01”

Test network

Properties

Name

Value

Description

display

i=device/antennatower;bgb=1500,600

labels

node,ethernet-node,wireless-node

networkNode

Gates

Name

Direction

Size

Description

ppp

inout

Connection to the Core Network

radioIn

input

Connection to the radio interface

x2 [ ]

inout

Connection to the X2 interface

pppMEHost

inout

Connection to the GtpEndpoint module inside MEHost

Statistics

Name

Title

Source

Record

Unit

Interpolation Mode

Description

posX

xCoord(mobilityPos(mobilityStateChanged))

vector?

posY

yCoord(mobilityPos(mobilityStateChanged))

vector?

Unassigned submodule parameters

Name

Type

Default value

Description

interfaceTable ↗.displayStringTextFormat

string

“{numInterfaces} interfaces”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

interfaceTable ↗.displayAddresses

bool

false

Whether to display IP addresses on links

mobility ↗.displayStringTextFormat

string

“p: {position}\nv: {velocity}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

mobility ↗.subjectModule

string

“^”

The module path that determines the subject module, the motion of which this mobility model describes. The default value is the parent module

mobility ↗.coordinateSystemModule

string

“”

The module path of the geographic coordinate system module; optional, empty disables geographic conversion (and the {geo_position} directive)

mobility ↗.updateDisplayString

bool

true

Enables continuous update of the subject module’s position by modifying its display string

mobility ↗.constraintAreaMinX

double

-inf m

The minimum x position of the constraint area. It is unconstrained by default (negative infinity)

mobility ↗.constraintAreaMinY

double

-inf m

The minimum y position of the constraint area. It is unconstrained by default (negative infinity)

mobility ↗.constraintAreaMinZ

double

-inf m

The minimum z position of the constraint area. It is unconstrained by default (negative infinity)

mobility ↗.constraintAreaMaxX

double

inf m

The maximum x position of the constraint area. It is unconstrained by default (positive infinity)

mobility ↗.constraintAreaMaxY

double

inf m

The maximum y position of the constraint area. It is unconstrained by default (positive infinity)

mobility ↗.constraintAreaMaxZ

double

inf m

The maximum z position of the constraint area. It is unconstrained by default (positive infinity)

mobility ↗.initialX

double

uniform(this.constraintAreaMinX, this.constraintAreaMaxX)

mobility ↗.initialY

double

uniform(this.constraintAreaMinY, this.constraintAreaMaxY)

mobility ↗.initialZ

double

nanToZero(uniform(this.constraintAreaMinZ, this.constraintAreaMaxZ))

mobility ↗.initialLatitude

double

nan deg

mobility ↗.initialLongitude

double

nan deg

mobility ↗.initialAltitude

double

0m

mobility ↗.initialHeading

double

0deg

mobility ↗.initialElevation

double

0deg

mobility ↗.initialBank

double

0deg

mobility ↗.initFromDisplayString

bool

true

Enables one-time initialization from the subject module’s display string

mobility ↗.updateFromDisplayString

bool

true

Enables continuous update from the subject module’s display string for dragging and rotating it

cellInfo.constraintAreaMinX

double

-1m/0

The minimum X-coordinate of the area constraint, unconstrained by default

cellInfo.constraintAreaMinY

double

-1m/0

The minimum Y-coordinate of the area constraint, unconstrained by default

cellInfo.constraintAreaMaxX

double

1m/0

The maximum X-coordinate of the area constraint, unconstrained by default

cellInfo.constraintAreaMaxY

double

1m/0

The maximum Y-coordinate of the area constraint, unconstrained by default

cellInfo.beaconInterval

double

1s

Interval for sending broadcast messages (used for handover or DAS)

cellInfo.microCell

bool

false

Type of eNodeB (MICRO / MACRO) - valid only for eNodeBs

cellInfo.rbyDl

int

12

Number of sub-carriers per RB in DL

cellInfo.rbyUl

int

12

Number of sub-carriers per RB in UL

cellInfo.rbxDl

int

7

Number of OFDM symbols per slot in DL

cellInfo.rbxUl

int

7

Number of OFDM symbols per slot in UL

cellInfo.rbPilotDl

int

3

Number of pilot Resource Elements per RB in DL

cellInfo.rbPilotUl

int

0

Number of pilot Resource Elements per RB in UL

cellInfo.signalDl

int

1

Number of signaling symbols for each Resource Block in DL

cellInfo.signalUl

int

1

Number of signaling symbols for each Resource Block in UL

cellInfo.numPreferredBands

int

1

Number of preferred bands to use (relevant only in PREFERRED mode)

cellInfo.binderModule

string

“binder”

cellularNic.pcapRecorder ↗.displayStringTextFormat

string

“rec: %n pks”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

cellularNic.pcapRecorder ↗.verbose

bool

true

Whether to log packets on the module output

cellularNic.pcapRecorder ↗.recordEmptyPackets

bool

true

Specifies if zero length packets are recorded or not

cellularNic.pcapRecorder ↗.enableConvertingPackets

bool

true

Specifies if converting packets to link type is allowed or not

cellularNic.pcapRecorder ↗.pcapFile

string

“”

The PCAP file to be written, suggested value: pcapFile = “${resultdir}/${configname}-#${runnumber}” + fullpath() + “.pcap”

cellularNic.pcapRecorder ↗.fileFormat

string

“pcapng”

cellularNic.pcapRecorder ↗.snaplen

int

65535

Maximum number of bytes to record per packet

cellularNic.pcapRecorder ↗.timePrecision

int

6

Time precision in recorded file. pcap supports only 6 (usec) or 9 (nanosec), pcapng supports more values (see ‘if_tsresol’ option in pcapng file format).

cellularNic.pcapRecorder ↗.dumpBadFrames

bool

true

Enable dump of frames with hasBitError

cellularNic.pcapRecorder ↗.sendingSignalNames

string

“transmissionEnded”

Space-separated list of outbound packet signals to subscribe to

cellularNic.pcapRecorder ↗.receivingSignalNames

string

“receptionEnded”

Space-separated list of inbound packet signals to subscribe to

cellularNic.pcapRecorder ↗.dumpProtocols

string

“ethernetmac ppp ieee80211mac”

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

cellularNic.pcapRecorder ↗.packetFilter

object

“*”

Which packets are considered, matches all packets by default

cellularNic.pcapRecorder ↗.helpers

string

“”

Usable PcapRecorder::IHelper helpers for accept packettype and store/convert packet as specified linktype

cellularNic.pcapRecorder ↗.alwaysFlush

bool

false

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

cellularNic.handoverPacketHolder.binderModule

string

“binder”

cellularNic.ip2nic.binderModule

string

“binder”

cellularNic.ip2nic.connectionControlModule

string

“^.rrc.connectionControl”

The node’s control-plane entry point, asked for a bearer on a lookup miss

cellularNic.ip2nic.isNr

bool

false

True for the NR leg (set by NrNicUe/NrNicEnb, or in the ini for a DC master eNB)

cellularNic.ip2nic.hasSdap

bool

false

When true, SDAP handles DRB/RLC assignment; Ip2Nic skips traffic classification

cellularNic.ip2nic.sessionType

string

“”

UE only: the type of the UE’s session (see LteUe), which the payload the NIC delivers up is of; set by the NIC

cellularNic.ip2nic.establishBearersOnDemand

bool

true

When false, a packet that finds no established bearer raises an error instead of establishing one (static bearers are established up front; see the staticDrbs parameter of BearerConfigurator)

cellularNic.ip2nic.d2dBinderModule

string

“d2dBinder”

The network’s D2dBinder, which holds the D2D state

cellularNic.rrc.registration.interfaceTableModule

string

cellularNic.rrc.registration.interfaceName

string

“cellular”

cellularNic.rrc.registration.routingTableModule

string

cellularNic.rrc.registration.binderModule

string

“binder”

cellularNic.rrc.registration.connectionControlModule

string

“^.connectionControl”

The node’s control-plane entry point (see Rrc), told about a multicast group join

cellularNic.rrc.registration.sessionType

string

“”

UE only: the type of the UE’s session (see LteUe): a UE created during the run gets an IPv4 default route through the NIC only on an IP session, and the NIC of an Ethernet session is an Ethernet port; set by the NIC

cellularNic.rrc.bearerManagement.binderModule

string

“binder”

To reach a peer’s BearerManagement on RLF

cellularNic.rrc.bearerManagement.connectionControlModule

string

“^.connectionControl”

The node’s control-plane entry point (see Rrc), which a torn-down bearer’s DRB identity goes back through

cellularNic.rrc.bearerManagement.t311

double

0s

RRC re-establishment cell-selection timer (0 => release-to-IDLE)

cellularNic.rrc.bearerManagement.t301

double

0.1s

RRC re-establishment (request -> complete) timer

cellularNic.rrc.bearerManagement.headerCompressedSize

int

-1B

Removed, an error if set: header compression is configured per bearer (the rohc field of BearerConfigurator’s bearer definitions)

cellularNic.rrc.bearerManagement.pdcpEntityModuleType

string

“simu5g.stack.pdcp.LtePdcpEntity”

PDCP entity types: the full PDCP entity is a compound (PdcpEntityBase, TX+RX sides plus the leg split/join stage of a multi-leg bearer); the instantiable types are its subclasses (LtePdcpEntity, NrPdcpEntity). At a DC secondary a bearer’s PDCP lives at the master, so the secondary installs an PdcpRelayEntity (tunnels PDUs to/from the master) in its place.

cellularNic.rrc.bearerManagement.pdcpRelayEntityModuleType

string

“simu5g.stack.pdcp.PdcpRelayEntity”

cellularNic.rrc.bearerManagement.dualConnectivityEnabled

bool

false

Set by the NIC; two-leg (split-capable) bearers

cellularNic.rrc.bearerManagement.rlcTmEntityModuleType

string

“simu5g.stack.rlc.RlcTmEntity”

RLC entity types (compound modules): lteRlc* = LTE-FI bearers (TS 36.322), nrRlc* = NR bearers (SI/SO wire format, TS 38.322)

cellularNic.rrc.bearerManagement.lteRlcUmEntityModuleType

string

“simu5g.stack.rlc.LteRlcUmEntity”

cellularNic.rrc.bearerManagement.lteRlcAmEntityModuleType

string

“simu5g.stack.rlc.LteRlcAmEntity”

cellularNic.rrc.bearerManagement.nrRlcUmEntityModuleType

string

“simu5g.stack.rlc.NrRlcUmEntity”

cellularNic.rrc.bearerManagement.nrRlcAmEntityModuleType

string

“simu5g.stack.rlc.NrRlcAmEntity”

cellularNic.rrc.bearerManagement.registrationModule

string

“^.registration”

Module references for accessing other stack layers

cellularNic.rrc.bearerManagement.drbTableModule

string

“^.drbTable”

cellularNic.rrc.bearerManagement.ip2nicModule

string

“^.^.ip2nic”

cellularNic.rrc.bearerManagement.handoverPacketHolderModule

string

“^.^.handoverPacketHolder”

Attachment-ledger push target (UE only)

cellularNic.rrc.bearerManagement.pdcpMuxModule

string

“^.^.pdcpMux”

cellularNic.rrc.bearerManagement.pdcpDcMuxModule

string

“^.^.pdcpDcMux”

cellularNic.rrc.bearerManagement.d2dModeControllerModule

string

“^.d2dModeController”

cellularNic.rrc.bearerManagement.rlcMuxModule

string

“^.^.rlcMux”

cellularNic.rrc.bearerManagement.nrRlcMuxModule

string

“^.^.nrRlcMux”

cellularNic.rrc.bearerManagement.macModule

string

“^.^.mac”

cellularNic.rrc.bearerManagement.nrMacModule

string

“^.^.nrMac”

cellularNic.rrc.bearerManagement.sdapModule

string

“^.^.sdap”

Configuration push target; unresolvable (no SDAP on the NIC) = no pushes

cellularNic.rrc.bearerManagement.qosFlowClassifierModule

string

“^.^.qosFlowClassifier”

Uplink QFI rule push target; unresolvable (not a UE stack with SDAP) = no pushes

cellularNic.rrc.connectionControl.binderModule

string

“binder”

cellularNic.rrc.connectionControl.bearerConfiguratorModule

string

“bearerConfigurator”

cellularNic.rrc.connectionControl.coreControlModule

string

“coreControl”

cellularNic.rrc.connectionControl.bearerManagementModule

string

“^.bearerManagement”

cellularNic.rrc.connectionControl.macModule

string

“^.^.mac”

cellularNic.rrc.connectionControl.handoverPacketHolderModule

string

“^.^.handoverPacketHolder”

cellularNic.rrc.connectionControl.gtpUserModule

string

“^.^.^.relay.gtpUser”

cellularNic.rrc.connectionControl.gtpUserX2Module

string

“^.^.^.gtpUserX2”

cellularNic.rrc.connectionControl.macNodeId

int

The base station’s node id; the NIC sets it from the node’s

cellularNic.rrc.connectionControl.gateway

string

“”

The node’s core network gateway, as its gateway parameter names it; ignored at a node not connected to a core network (a secondary node)

cellularNic.rrc.nrConnectionControl.dynamicCellAssociation

bool

false

cellularNic.rrc.nrConnectionControl.enableHandover

bool

false

Allows handovers in the UE

cellularNic.rrc.nrConnectionControl.isNr

bool

Whether this instance is associated with the NR or the LTE stack

cellularNic.rrc.nrConnectionControl.macNodeId

int

MacNodeId of the stack leg this controller belongs to (set by the NIC)

cellularNic.rrc.nrConnectionControl.sessionType

string

The type of the session the UE requests at connection setup (see LteUe), set by the NIC

cellularNic.rrc.nrConnectionControl.handoverLatency

double

50ms

Handover duration

cellularNic.rrc.nrConnectionControl.handoverDetachmentTime

double

handoverLatency > 0s ? handoverLatency/2 : 25ms

cellularNic.rrc.nrConnectionControl.handoverAttachmentTime

double

handoverLatency > 0s ? handoverLatency-handoverDetachmentTime : handoverDetachmentTime

cellularNic.rrc.nrConnectionControl.minRssiDefault

bool

true

Whether minRssi is taken from PhyPisaData instead of the minRssi parameter

cellularNic.rrc.nrConnectionControl.minRssi

double

-99.0dB

Configurable minimum threshold RSSI for attaching to an eNB (meaningful only if minRssiDefault==false)

cellularNic.rrc.nrConnectionControl.hysteresisFactor

double

10

cellularNic.rrc.nrConnectionControl.binderModule

string

“binder”

cellularNic.rrc.nrConnectionControl.macModule

string

“^.^.mac”

cellularNic.rrc.nrConnectionControl.bearerManagementModule

string

“^.bearerManagement”

cellularNic.rrc.nrConnectionControl.handoverPacketHolderModule

string

“^.^.handoverPacketHolder”

cellularNic.rrc.nrConnectionControl.feedbackGeneratorModule

string

“^.^.dlFbGen”

TODO or “^.^.nrDlFbGen”

cellularNic.rrc.nrConnectionControl.otherConnectionControlModule

string

“”

cellularNic.rrc.nrConnectionControl.hasCollector

bool

false

True when node has a collector module (ueCollector/nrUeCollector) for this PHY module

cellularNic.rrc.d2dModeSelection.modeSelectionPeriod

double

1s

cellularNic.rrc.d2dModeSelection.binderModule

string

“binder”

cellularNic.rrc.d2dModeSelection.d2dBinderModule

string

“d2dBinder”

The network’s D2dBinder, which holds the D2D state

cellularNic.rrc.d2dModeSelection.macModule

string

“^.^.mac”

cellularNic.rrc.d2dModeSelection.connectionControlModule

string

“^.connectionControl”

The node’s control-plane entry point, which knows the UEs handing over

cellularNic.rlcMux.bearerManagementModule

string

“^.rrc.bearerManagement”

cellularNic.phy.isNr

bool

false

True for the NR leg (set by NrNicUe/NrNicEnb on their PHY submodule)

cellularNic.phy.macNodeId

int

MacNodeId of the stack leg this PHY belongs to (set by the NIC)

cellularNic.phy.ueTxPower

double

26dBm

cellularNic.phy.eNodeBTxPower

double

46dBm

cellularNic.phy.microTxPower

double

30dBm

cellularNic.phy.txDirection

string

“OMNI”

cellularNic.phy.txAngle

double

0deg

cellularNic.phy.binderModule

string

“binder”

cellularNic.phy.channelModelModule

string

“^.channelModel[0]”

Set to “^.nrChannelModel[0]” on an NR leg, see NrNicUe

cellularNic.phy.enableHandover

bool

false

Marks this eNB as a handover target: its beacons are used by UEs for handover feasibility assessment. Requires enableBeacons=true (the default when handover is on); the module errors out at initialization if beacons are disabled while handover is enabled.

cellularNic.phy.enableBeacons

bool

enableHandover

Enables broadcasting periodic beacons (at cellInfo.beaconInterval). Beacons are the measurement signal UEs use both for handover feasibility assessment and for radio link monitoring (RLF detection), decoupled from enableHandover so radio link monitoring can run without handover. Defaults to enableHandover (beacons flow exactly when handover is enabled). cellInfo.beaconInterval must be positive: a zero/negative interval is an error – switch beacons off with enableBeacons=false.

cellularNic.phy.targetBler

double

0.001

cellularNic.packetFlowObserver.macModule

string

“^.mac”

cellularNic.packetFlowObserver.pdcpModule

string

“^”

cellularNic.packetFlowObserver.rlcModule

string

“^”

cellularNic.packetFlowObserver.isNrObserver

bool

false

cellularNic.packetFlowObserver.pfmType

string

“PacketFlowObserverEnb”

cellularNic.pdcpDcMux.bearerManagementModule

string

“^.rrc.bearerManagement”

cellularNic.x2Manager.interfaceTableModule

string

cellularNic.x2Manager.binderModule

string

“binder”

cellularNic.compManager.compNodeType

string

“COMP_CLIENT”

cellularNic.compManager.coordinatorId

int

ID of the coordinator node

cellularNic.compManager.clientList

object

[]

Space-separated list of client node identifiers

cellularNic.compManager.coordinationPeriod

double

0.001s

The time interval between two coordination events

cellularNic.compManager.binderModule

string

“binder”

cellularNic.handoverX2Forwarder.losslessHandover

bool

false

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.displayStringTextFormat

string

“p: {position}\nv: {velocity}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.subjectModule

string

“^”

The module path that determines the subject module, the motion of which this mobility model describes. The default value is the parent module

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.coordinateSystemModule

string

“”

The module path of the geographic coordinate system module; optional, empty disables geographic conversion (and the {geo_position} directive)

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.updateDisplayString

bool

true

Enables continuous update of the subject module’s position by modifying its display string

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.constraintAreaMinX

double

-inf m

The minimum x position of the constraint area. It is unconstrained by default (negative infinity)

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.constraintAreaMinY

double

-inf m

The minimum y position of the constraint area. It is unconstrained by default (negative infinity)

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.constraintAreaMinZ

double

-inf m

The minimum z position of the constraint area. It is unconstrained by default (negative infinity)

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.constraintAreaMaxX

double

inf m

The maximum x position of the constraint area. It is unconstrained by default (positive infinity)

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.constraintAreaMaxY

double

inf m

The maximum y position of the constraint area. It is unconstrained by default (positive infinity)

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.constraintAreaMaxZ

double

inf m

The maximum z position of the constraint area. It is unconstrained by default (positive infinity)

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.initialX

double

uniform(this.constraintAreaMinX, this.constraintAreaMaxX)

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.initialY

double

uniform(this.constraintAreaMinY, this.constraintAreaMaxY)

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.initialZ

double

nanToZero(uniform(this.constraintAreaMinZ, this.constraintAreaMaxZ))

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.initialLatitude

double

nan deg

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.initialLongitude

double

nan deg

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.initialAltitude

double

0m

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.initialHeading

double

0deg

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.initialElevation

double

0deg

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.initialBank

double

0deg

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.initFromDisplayString

bool

true

Enables one-time initialization from the subject module’s display string

cellularNic.bgTrafficGenerator.bgUE.mobility ↗.updateFromDisplayString

bool

true

Enables continuous update from the subject module’s display string for dragging and rotating it

cellularNic.bgTrafficGenerator.bgUE.generator.computeAvgInterference

bool

cellularNic.bgTrafficGenerator.bgUE.generator.enablePeriodicCqiUpdate

bool

cellularNic.bgTrafficGenerator.bgUE.generator.useProbabilisticCqi

bool

cellularNic.bgTrafficGenerator.bgUE.generator.backgroundTrafficManagerModule

string

“^.^.manager”

cellularNic.bgTrafficGenerator.bgUE.generator.startTimeDl

double

-1s

cellularNic.bgTrafficGenerator.bgUE.generator.startTimeUl

double

-1s

cellularNic.bgTrafficGenerator.bgUE.generator.headerLen

int

33B

cellularNic.bgTrafficGenerator.bgUE.generator.txPower

double

26dBm

cellularNic.bgTrafficGenerator.bgUE.generator.fbPeriod

int

6tti

cellularNic.bgTrafficGenerator.bgUE.generator.periodDl

double

uniform(10ms,50ms)

cellularNic.bgTrafficGenerator.bgUE.generator.periodUl

double

uniform(10ms,50ms)

cellularNic.bgTrafficGenerator.bgUE.generator.packetSizeDl

int

intuniform(20B,100B)

cellularNic.bgTrafficGenerator.bgUE.generator.packetSizeUl

int

intuniform(20B,100B)

cellularNic.bgTrafficGenerator.bgUE.generator.rtxRateDl

double

0.1

cellularNic.bgTrafficGenerator.bgUE.generator.rtxDelayDl

double

0.006s

cellularNic.bgTrafficGenerator.bgUE.generator.rtxRateUl

double

0.1

cellularNic.bgTrafficGenerator.bgUE.generator.rtxDelayUl

double

0.006s

cellularNic.bgTrafficGenerator.bgUE.generator.cqiMeanDl

double

15

These values are only considered when periodicCqi == false && computeAvgInterference == false

cellularNic.bgTrafficGenerator.bgUE.generator.cqiMeanUl

double

15

cellularNic.bgTrafficGenerator.bgUE.generator.cqiStddevDl

double

0

cellularNic.bgTrafficGenerator.bgUE.generator.cqiStddevUl

double

0

cellularNic.bgTrafficGenerator.manager.binderModule

string

“binder”

cellularNic.bgTrafficGenerator.manager.numBgUes

int

cellularNic.bgTrafficGenerator.manager.macModule

string

“^.^.mac”

cellularNic.bgTrafficGenerator.manager.phyModule

string

“^.^.phy”

cellularNic.bgTrafficGenerator.manager.enablePeriodicCqiUpdate

bool

cellularNic.bgTrafficGenerator.manager.computeAvgInterference

bool

pppIf ↗.pcapRecorder ↗.displayStringTextFormat

string

“rec: %n pks”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

pppIf ↗.pcapRecorder ↗.verbose

bool

true

Whether to log packets on the module output

pppIf ↗.pcapRecorder ↗.recordEmptyPackets

bool

true

Specifies if zero length packets are recorded or not

pppIf ↗.pcapRecorder ↗.enableConvertingPackets

bool

true

Specifies if converting packets to link type is allowed or not

pppIf ↗.pcapRecorder ↗.pcapFile

string

“”

The PCAP file to be written, suggested value: pcapFile = “${resultdir}/${configname}-#${runnumber}” + fullpath() + “.pcap”

pppIf ↗.pcapRecorder ↗.fileFormat

string

“pcapng”

pppIf ↗.pcapRecorder ↗.snaplen

int

65535

Maximum number of bytes to record per packet

pppIf ↗.pcapRecorder ↗.timePrecision

int

6

Time precision in recorded file. pcap supports only 6 (usec) or 9 (nanosec), pcapng supports more values (see ‘if_tsresol’ option in pcapng file format).

pppIf ↗.pcapRecorder ↗.dumpBadFrames

bool

true

Enable dump of frames with hasBitError

pppIf ↗.pcapRecorder ↗.sendingSignalNames

string

“transmissionEnded”

Space-separated list of outbound packet signals to subscribe to

pppIf ↗.pcapRecorder ↗.receivingSignalNames

string

“receptionEnded”

Space-separated list of inbound packet signals to subscribe to

pppIf ↗.pcapRecorder ↗.dumpProtocols

string

“ethernetmac ppp ieee80211mac”

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

pppIf ↗.pcapRecorder ↗.packetFilter

object

“*”

Which packets are considered, matches all packets by default

pppIf ↗.pcapRecorder ↗.helpers

string

“”

Usable PcapRecorder::IHelper helpers for accept packettype and store/convert packet as specified linktype

pppIf ↗.pcapRecorder ↗.alwaysFlush

bool

false

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

pppIf ↗.queue ↗.displayStringTextFormat

string

“contains %p pk (%l) pushed %u\npulled %o removed %r dropped %d”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

pppIf ↗.queue ↗.packetCapacity

int

10000

Maximum number of packets in the queue, no limit by default

pppIf ↗.queue ↗.dataCapacity

int

-1b

Maximum total length of packets in the queue, no limit by default

pppIf ↗.queue ↗.dropperClass

string

“inet::queueing::PacketAtCollectionEndDropper”

Determines which packets are dropped when the queue is overloaded, packets are not dropped by default; the parameter must be the name of a C++ class which implements the IPacketDropperFunction C++ interface and is registered via Register_Class

pppIf ↗.queue ↗.comparatorClass

string

“”

Determines the order of packets in the queue, insertion order by default; the parameter must be the name of a C++ class which implements the IPacketComparatorFunction C++ interface and is registered via Register_Class

pppIf ↗.queue ↗.bufferModule

string

“”

Relative module path to the IPacketBuffer module used by this queue, implicit buffer by default

pppIf ↗.ppp ↗.displayStringTextFormat

string

“rate: %b\nsent: %s, rcvd: %r\nqueue: %q, drop: %d”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

pppIf ↗.ppp ↗.interfaceTableModule

string

The path to the InterfaceTable module

pppIf ↗.ppp ↗.sendRawBytes

bool

false

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

pppIf ↗.ppp ↗.mtu

int

4470B

pppIf ↗.ppp ↗.stopOperationExtraTime

double

-1s

Extra time after lifecycle stop operation finished

pppIf ↗.ppp ↗.stopOperationTimeout

double

2s

Timeout value for lifecycle stop operation

x2ppp ↗.pcapRecorder ↗.displayStringTextFormat

string

“rec: %n pks”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

x2ppp ↗.pcapRecorder ↗.verbose

bool

true

Whether to log packets on the module output

x2ppp ↗.pcapRecorder ↗.recordEmptyPackets

bool

true

Specifies if zero length packets are recorded or not

x2ppp ↗.pcapRecorder ↗.enableConvertingPackets

bool

true

Specifies if converting packets to link type is allowed or not

x2ppp ↗.pcapRecorder ↗.pcapFile

string

“”

The PCAP file to be written, suggested value: pcapFile = “${resultdir}/${configname}-#${runnumber}” + fullpath() + “.pcap”

x2ppp ↗.pcapRecorder ↗.fileFormat

string

“pcapng”

x2ppp ↗.pcapRecorder ↗.snaplen

int

65535

Maximum number of bytes to record per packet

x2ppp ↗.pcapRecorder ↗.timePrecision

int

6

Time precision in recorded file. pcap supports only 6 (usec) or 9 (nanosec), pcapng supports more values (see ‘if_tsresol’ option in pcapng file format).

x2ppp ↗.pcapRecorder ↗.dumpBadFrames

bool

true

Enable dump of frames with hasBitError

x2ppp ↗.pcapRecorder ↗.sendingSignalNames

string

“transmissionEnded”

Space-separated list of outbound packet signals to subscribe to

x2ppp ↗.pcapRecorder ↗.receivingSignalNames

string

“receptionEnded”

Space-separated list of inbound packet signals to subscribe to

x2ppp ↗.pcapRecorder ↗.dumpProtocols

string

“ethernetmac ppp ieee80211mac”

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

x2ppp ↗.pcapRecorder ↗.packetFilter

object

“*”

Which packets are considered, matches all packets by default

x2ppp ↗.pcapRecorder ↗.helpers

string

“”

Usable PcapRecorder::IHelper helpers for accept packettype and store/convert packet as specified linktype

x2ppp ↗.pcapRecorder ↗.alwaysFlush

bool

false

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

x2ppp ↗.queue ↗.displayStringTextFormat

string

“contains %p pk (%l) pushed %u\npulled %o removed %r dropped %d”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

x2ppp ↗.queue ↗.packetCapacity

int

10000

Maximum number of packets in the queue, no limit by default

x2ppp ↗.queue ↗.dataCapacity

int

-1b

Maximum total length of packets in the queue, no limit by default

x2ppp ↗.queue ↗.dropperClass

string

“inet::queueing::PacketAtCollectionEndDropper”

Determines which packets are dropped when the queue is overloaded, packets are not dropped by default; the parameter must be the name of a C++ class which implements the IPacketDropperFunction C++ interface and is registered via Register_Class

x2ppp ↗.queue ↗.comparatorClass

string

“”

Determines the order of packets in the queue, insertion order by default; the parameter must be the name of a C++ class which implements the IPacketComparatorFunction C++ interface and is registered via Register_Class

x2ppp ↗.queue ↗.bufferModule

string

“”

Relative module path to the IPacketBuffer module used by this queue, implicit buffer by default

x2ppp ↗.ppp ↗.displayStringTextFormat

string

“rate: %b\nsent: %s, rcvd: %r\nqueue: %q, drop: %d”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

x2ppp ↗.ppp ↗.interfaceTableModule

string

The path to the InterfaceTable module

x2ppp ↗.ppp ↗.sendRawBytes

bool

false

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

x2ppp ↗.ppp ↗.mtu

int

4470B

x2ppp ↗.ppp ↗.stopOperationExtraTime

double

-1s

Extra time after lifecycle stop operation finished

x2ppp ↗.ppp ↗.stopOperationTimeout

double

2s

Timeout value for lifecycle stop operation

pppMEHostIf ↗.pcapRecorder ↗.displayStringTextFormat

string

“rec: %n pks”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

pppMEHostIf ↗.pcapRecorder ↗.verbose

bool

true

Whether to log packets on the module output

pppMEHostIf ↗.pcapRecorder ↗.recordEmptyPackets

bool

true

Specifies if zero length packets are recorded or not

pppMEHostIf ↗.pcapRecorder ↗.enableConvertingPackets

bool

true

Specifies if converting packets to link type is allowed or not

pppMEHostIf ↗.pcapRecorder ↗.pcapFile

string

“”

The PCAP file to be written, suggested value: pcapFile = “${resultdir}/${configname}-#${runnumber}” + fullpath() + “.pcap”

pppMEHostIf ↗.pcapRecorder ↗.fileFormat

string

“pcapng”

pppMEHostIf ↗.pcapRecorder ↗.snaplen

int

65535

Maximum number of bytes to record per packet

pppMEHostIf ↗.pcapRecorder ↗.timePrecision

int

6

Time precision in recorded file. pcap supports only 6 (usec) or 9 (nanosec), pcapng supports more values (see ‘if_tsresol’ option in pcapng file format).

pppMEHostIf ↗.pcapRecorder ↗.dumpBadFrames

bool

true

Enable dump of frames with hasBitError

pppMEHostIf ↗.pcapRecorder ↗.sendingSignalNames

string

“transmissionEnded”

Space-separated list of outbound packet signals to subscribe to

pppMEHostIf ↗.pcapRecorder ↗.receivingSignalNames

string

“receptionEnded”

Space-separated list of inbound packet signals to subscribe to

pppMEHostIf ↗.pcapRecorder ↗.dumpProtocols

string

“ethernetmac ppp ieee80211mac”

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

pppMEHostIf ↗.pcapRecorder ↗.packetFilter

object

“*”

Which packets are considered, matches all packets by default

pppMEHostIf ↗.pcapRecorder ↗.helpers

string

“”

Usable PcapRecorder::IHelper helpers for accept packettype and store/convert packet as specified linktype

pppMEHostIf ↗.pcapRecorder ↗.alwaysFlush

bool

false

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

pppMEHostIf ↗.queue ↗.displayStringTextFormat

string

“contains %p pk (%l) pushed %u\npulled %o removed %r dropped %d”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

pppMEHostIf ↗.queue ↗.packetCapacity

int

10000

Maximum number of packets in the queue, no limit by default

pppMEHostIf ↗.queue ↗.dataCapacity

int

-1b

Maximum total length of packets in the queue, no limit by default

pppMEHostIf ↗.queue ↗.dropperClass

string

“inet::queueing::PacketAtCollectionEndDropper”

Determines which packets are dropped when the queue is overloaded, packets are not dropped by default; the parameter must be the name of a C++ class which implements the IPacketDropperFunction C++ interface and is registered via Register_Class

pppMEHostIf ↗.queue ↗.comparatorClass

string

“”

Determines the order of packets in the queue, insertion order by default; the parameter must be the name of a C++ class which implements the IPacketComparatorFunction C++ interface and is registered via Register_Class

pppMEHostIf ↗.queue ↗.bufferModule

string

“”

Relative module path to the IPacketBuffer module used by this queue, implicit buffer by default

pppMEHostIf ↗.ppp ↗.displayStringTextFormat

string

“rate: %b\nsent: %s, rcvd: %r\nqueue: %q, drop: %d”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

pppMEHostIf ↗.ppp ↗.interfaceTableModule

string

The path to the InterfaceTable module

pppMEHostIf ↗.ppp ↗.sendRawBytes

bool

false

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

pppMEHostIf ↗.ppp ↗.mtu

int

4470B

pppMEHostIf ↗.ppp ↗.stopOperationExtraTime

double

-1s

Extra time after lifecycle stop operation finished

pppMEHostIf ↗.ppp ↗.stopOperationTimeout

double

2s

Timeout value for lifecycle stop operation

ipv4 ↗.configurator ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.configurator ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv4 ↗.configurator ↗.routingTableModule

string

ipv4 ↗.configurator ↗.networkConfiguratorModule

string

“configurator”

The absolute path to the Ipv4NetworkConfigurator; use “” if there is no configurator

ipv4 ↗.configurator ↗.configureRoutingTable

bool

true

Add routing entries to the routing table (uses the configurator module)

ipv4 ↗.routingTable ↗.displayStringTextFormat

string

“{routingTableStatusText}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.routingTable ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv4 ↗.routingTable ↗.routerId

string

“auto”

For routers, the router id using IPv4 address dotted

ipv4 ↗.routingTable ↗.netmaskRoutes

string

“*”

Maintain netmask routes for interfaces

ipv4 ↗.routingTable ↗.forwarding

bool

true

Turns IP forwarding on/off

ipv4 ↗.routingTable ↗.multicastForwarding

bool

false

Turns multicast forwarding on/off

ipv4 ↗.routingTable ↗.useAdminDist

bool

false

Use Cisco-like administrative distances

ipv4 ↗.routingTable ↗.routingFile

string

“”

Routing table file name

ipv4 ↗.natTable ↗.displayStringTextFormat

string

“{numNatEntries} entries”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.natTable ↗.networkProtocolModule

string

“^.ip”

ipv4 ↗.natTable ↗.config

xml

xml(“<config></config>”)

XML configuration parameters for network address translation

ipv4 ↗.up ↗.displayStringTextFormat

string

“processed {numProcessedPackets} pk ({processedTotalLength})”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.up ↗.interfaceTableModule

string

Module path to the InterfaceTable ↗ module

ipv4 ↗.up ↗.forwardServiceRegistration

bool

true

ipv4 ↗.up ↗.forwardProtocolRegistration

bool

true

ipv4 ↗.up ↗.interfaceMapping

object

{}

Maps network interface names to connected submodule names (e.g. {“eth0”: “bridging”}), overrides automatically learned dispatching; * overrides all learned network interfaces, ? overrides default

ipv4 ↗.up ↗.serviceMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ethernetmac”: “bridging”}), overrides automatically learned dispatching; * overrides all learned services, ? overrides default

ipv4 ↗.up ↗.protocolMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ipv4”: “bridging”}), overrides automatically learned dispatching; * overrides all learned protocols, ? overrides default

ipv4 ↗.igmp ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.igmp ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv4 ↗.igmp ↗.routingTableModule

string

ipv4 ↗.igmp ↗.checksumMode

string

“declared”

ipv4 ↗.igmp ↗.enabled

bool

true

ipv4 ↗.igmp ↗.robustnessVariable

int

2

IGMP is robust to (robustnessVariable-1) packet loss

ipv4 ↗.igmp ↗.queryInterval

double

125s

ipv4 ↗.igmp ↗.queryResponseInterval

double

10s

ipv4 ↗.igmp ↗.groupMembershipInterval

double

(robustnessVariable * queryInterval) + queryResponseInterval

ipv4 ↗.igmp ↗.otherQuerierPresentInterval

double

(robustnessVariable * queryInterval) + (queryResponseInterval / 2)

ipv4 ↗.igmp ↗.startupQueryInterval

double

queryInterval / 4

ipv4 ↗.igmp ↗.startupQueryCount

int

robustnessVariable

ipv4 ↗.igmp ↗.lastMemberQueryInterval

double

1s

ipv4 ↗.igmp ↗.lastMemberQueryCount

int

robustnessVariable

ipv4 ↗.igmp ↗.unsolicitedReportInterval

double

10s

ipv4 ↗.icmp ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.icmp ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv4 ↗.icmp ↗.routingTableModule

string

ipv4 ↗.icmp ↗.checksumMode

string

“declared”

ipv4 ↗.icmp ↗.quoteLength

int

8B

Number of bytes from original packet to quote in ICMP reply

ipv4 ↗.mp ↗.displayStringTextFormat

string

“processed {numProcessedPackets} pk ({processedTotalLength})”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.mp ↗.interfaceTableModule

string

Module path to the InterfaceTable ↗ module

ipv4 ↗.mp ↗.forwardServiceRegistration

bool

true

ipv4 ↗.mp ↗.forwardProtocolRegistration

bool

true

ipv4 ↗.mp ↗.interfaceMapping

object

{}

Maps network interface names to connected submodule names (e.g. {“eth0”: “bridging”}), overrides automatically learned dispatching; * overrides all learned network interfaces, ? overrides default

ipv4 ↗.mp ↗.serviceMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ethernetmac”: “bridging”}), overrides automatically learned dispatching; * overrides all learned services, ? overrides default

ipv4 ↗.mp ↗.protocolMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ipv4”: “bridging”}), overrides automatically learned dispatching; * overrides all learned protocols, ? overrides default

ipv4 ↗.ip ↗.displayStringTextFormat

string

“{ipv4StatusText}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.ip ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv4 ↗.ip ↗.routingTableModule

string

ipv4 ↗.ip ↗.arpModule

string

ipv4 ↗.ip ↗.icmpModule

string

ipv4 ↗.ip ↗.checksumMode

string

“declared”

ipv4 ↗.ip ↗.timeToLive

int

32

ipv4 ↗.ip ↗.multicastTimeToLive

int

32

ipv4 ↗.ip ↗.fragmentTimeout

double

60s

ipv4 ↗.ip ↗.limitedBroadcast

bool

false

Send out limited broadcast packets coming from the higher layer

ipv4 ↗.ip ↗.directBroadcastInterfaces

string

“”

List of interfaces where direct broadcast is enabled (by default direct broadcast is disabled on all interfaces)

ipv4 ↗.ip ↗.enableLocalOutMulticastRouting

bool

false

Enable using the multicast routing table for determining outgoing interfaces for local out packets

ipv4 ↗.ip ↗.enableTimestampOption

bool

false

When enabled, IP inserts a timestamp option into the IP header

ipv4 ↗.ip ↗.maxLifetime

double

-1s

Packets older than the limit are discarded

ipv4 ↗.arp ↗.displayStringTextFormat

string

“size:{arpCacheSize} sent:{numRequestsSent}\nrepl:{numRepliesSent} fail:{numFailedResolutions}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.arp ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv4 ↗.arp ↗.routingTableModule

string

ipv4 ↗.arp ↗.retryTimeout

double

1s

Number of seconds ARP waits between retries to resolve an IPv4 address

ipv4 ↗.arp ↗.retryCount

int

3

Number of times ARP will attempt to resolve an IPv4 address

ipv4 ↗.arp ↗.cacheTimeout

double

120s

Number of seconds unused entries in the cache will time out

ipv4 ↗.arp ↗.proxyArpInterfaces

string

“*”

List of interfaces that proxy ARP is enabled on (all interfaces by default)

ipv4 ↗.ipsec ↗.displayStringTextFormat

string

“IN: ACCEPT: {inAccept} DROP: {inDrop} BYPASS: {inBypass}\n OUT: PROTECT: {outProtect} DROP: {outDrop} BYPASS: {outBypass}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.ipsec ↗.networkProtocolModule

string

“^.ip”

ipv4 ↗.ipsec ↗.networkProtocol

string

“ipv4”

address family this instance protects (set to “ipv6” in Ipv6NetworkLayer)

ipv4 ↗.ipsec ↗.interfaceTableModule

string

ipv4 ↗.ipsec ↗.spdModule

string

“^.spd”

ipv4 ↗.ipsec ↗.sadModule

string

“^.sad”

ipv4 ↗.ipsec ↗.spdConfig

xml

ipv4 ↗.ipsec ↗.defaultProtection

string

“”

If not “”: value to use where <Protection> element is absent from the configuration

ipv4 ↗.ipsec ↗.defaultEspMode

string

“”

If not “”: value to use where <EspMode> element is absent from the configuration

ipv4 ↗.ipsec ↗.defaultEncryptionAlg

string

“”

If not “”: value to use where <EncryptionAlg> element is absent from the configuration

ipv4 ↗.ipsec ↗.defaultAuthenticationAlg

string

“”

If not “”: value to use where <defaultAuthenticationAlg> element is absent from the configuration

ipv4 ↗.ipsec ↗.defaultMaxTfcPadLength

int

0

Value to use where <MaxTfcPadLength> element is absent from the configuration

ipv4 ↗.ipsec ↗.ahProtectOutDelay

double

0.0s

ipv4 ↗.ipsec ↗.ahProtectInDelay

double

0.0s

ipv4 ↗.ipsec ↗.espProtectOutDelay

double

0.0s

ipv4 ↗.ipsec ↗.espProtectInDelay

double

0.0s

ipv4 ↗.spd ↗.displayStringTextFormat

string

“entries: {numEntries}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.sad ↗.displayStringTextFormat

string

“entries: {numEntries}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.lp ↗.displayStringTextFormat

string

“processed {numProcessedPackets} pk ({processedTotalLength})”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv4 ↗.lp ↗.interfaceTableModule

string

Module path to the InterfaceTable ↗ module

ipv4 ↗.lp ↗.forwardServiceRegistration

bool

true

ipv4 ↗.lp ↗.forwardProtocolRegistration

bool

true

ipv4 ↗.lp ↗.interfaceMapping

object

{}

Maps network interface names to connected submodule names (e.g. {“eth0”: “bridging”}), overrides automatically learned dispatching; * overrides all learned network interfaces, ? overrides default

ipv4 ↗.lp ↗.serviceMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ethernetmac”: “bridging”}), overrides automatically learned dispatching; * overrides all learned services, ? overrides default

ipv4 ↗.lp ↗.protocolMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ipv4”: “bridging”}), overrides automatically learned dispatching; * overrides all learned protocols, ? overrides default

ipv6 ↗.configurator ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.configurator ↗.interfaceTableModule

string

ipv6 ↗.configurator ↗.routingTableModule

string

ipv6 ↗.configurator ↗.networkConfiguratorModule

string

“”

The absolute path to the Ipv6NetworkConfigurator; use “” if there is no configurator

ipv6 ↗.configurator ↗.configureRoutingTable

bool

true

ipv6 ↗.routingTable ↗.displayStringTextFormat

string

“{numRoutes} routes\n{numDestCache} destcache entries”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.routingTable ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv6 ↗.routingTable ↗.routes

xml

xml(“<routingTable/>”)

ipv6 ↗.routingTable ↗.forwarding

bool

false

ipv6 ↗.routingTable ↗.isRouter

bool

this.forwarding

ipv6 ↗.routingTable ↗.multicastForwarding

bool

false

ipv6 ↗.routingTable ↗.useAdminDist

bool

false

Use Cisco-like administrative distances

ipv6 ↗.routingTable ↗.advManagedFlag

bool

false

“Managed address configuration” (M) flag in RAs

ipv6 ↗.routingTable ↗.advOtherConfigFlag

bool

false

“Other configuration” (O) flag in RAs

ipv6 ↗.routingTable ↗.advLinkMtu

int

1280

MTU option in RAs (1280 = IPv6 minimum MTU, 0 = don’t include)

ipv6 ↗.routingTable ↗.advCurHopLimit

int

30

Cur Hop Limit field in RAs (0 = unspecified)

ipv6 ↗.routingTable ↗.advDefaultLifetime

double

-1s

Router Lifetime in RAs (-1 = auto: 3*maxRtrAdvInterval)

ipv6 ↗.up ↗.displayStringTextFormat

string

“processed {numProcessedPackets} pk ({processedTotalLength})”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.up ↗.interfaceTableModule

string

Module path to the InterfaceTable ↗ module

ipv6 ↗.up ↗.forwardServiceRegistration

bool

true

ipv6 ↗.up ↗.forwardProtocolRegistration

bool

true

ipv6 ↗.up ↗.interfaceMapping

object

{}

Maps network interface names to connected submodule names (e.g. {“eth0”: “bridging”}), overrides automatically learned dispatching; * overrides all learned network interfaces, ? overrides default

ipv6 ↗.up ↗.serviceMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ethernetmac”: “bridging”}), overrides automatically learned dispatching; * overrides all learned services, ? overrides default

ipv6 ↗.up ↗.protocolMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ipv4”: “bridging”}), overrides automatically learned dispatching; * overrides all learned protocols, ? overrides default

ipv6 ↗.icmpv6 ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.icmpv6 ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv6 ↗.icmpv6 ↗.checksumMode

string

“declared”

ipv6 ↗.icmpv6 ↗.mldModule

string

“”

Path to the MLD module, or “” if MLD is not enabled; MLD messages are dropped when empty

ipv6 ↗.lp ↗.displayStringTextFormat

string

“processed {numProcessedPackets} pk ({processedTotalLength})”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.lp ↗.interfaceTableModule

string

Module path to the InterfaceTable ↗ module

ipv6 ↗.lp ↗.forwardServiceRegistration

bool

true

ipv6 ↗.lp ↗.forwardProtocolRegistration

bool

true

ipv6 ↗.lp ↗.interfaceMapping

object

{}

Maps network interface names to connected submodule names (e.g. {“eth0”: “bridging”}), overrides automatically learned dispatching; * overrides all learned network interfaces, ? overrides default

ipv6 ↗.lp ↗.serviceMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ethernetmac”: “bridging”}), overrides automatically learned dispatching; * overrides all learned services, ? overrides default

ipv6 ↗.lp ↗.protocolMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ipv4”: “bridging”}), overrides automatically learned dispatching; * overrides all learned protocols, ? overrides default

ipv6 ↗.neighbourDiscovery ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.neighbourDiscovery ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv6 ↗.neighbourDiscovery ↗.checksumMode

string

“declared”

ipv6 ↗.neighbourDiscovery ↗.icmpv6Module

string

ipv6 ↗.neighbourDiscovery ↗.mipv6Module

string

ipv6 ↗.neighbourDiscovery ↗.routingTableModule

string

ipv6 ↗.neighbourDiscovery ↗.minIntervalBetweenRAs

double

200s

RFC 4861: MinRtrAdvInterval (0.33 * MaxRtrAdvInterval)

ipv6 ↗.neighbourDiscovery ↗.maxIntervalBetweenRAs

double

600s

RFC 4861: MaxRtrAdvInterval

ipv6 ↗.neighbourDiscovery ↗.advReachableTime

double

3600s

advertised reachable time in RAs; hosts use it as base for NUD

ipv6 ↗.neighbourDiscovery ↗.dupAddrDetectTransmits

int

1

RFC 4862 Section 5.1: number of NS sent for DAD (0 = disable DAD)

ipv6 ↗.neighbourDiscovery ↗.optimisticDad

bool

false

RFC 4429 Optimistic DAD: if true, an autoconfigured address may be used as a source address while DAD is still in progress; if false (RFC 4862), packets that would use it are deferred until DAD completes

ipv6 ↗.neighbourDiscovery ↗.detectL2Movement

bool

true

if true (default), (re)start Router Discovery (send Router Solicitations) whenever an interface associates at the link layer (e.g. a wireless handover to a new access point); lets a mobile node detect movement and obtain a new care-of address immediately, instead of relying on frequent unsolicited Router Advertisements (cf. MIPv6 fast RAs). Set to false to restore the legacy behaviour (movement detected only from periodic Router Advertisements)

ipv6 ↗.neighbourDiscovery ↗.retransTimer

double

1s

RFC 4861 Section 10: delay between retransmitted NS messages

ipv6 ↗.neighbourDiscovery ↗.baseReachableTime

double

30s

RFC 4861 Section 10: base value for computing random ReachableTime

ipv6 ↗.neighbourDiscovery ↗.routerBootupTime

double

uniform(0s, 0.3s)

random startup delay before a router assigns its link-local address; routers boot faster than hosts so that RAs are available by the time hosts solicit

ipv6 ↗.neighbourDiscovery ↗.hostBootupTime

double

uniform(0.4s, 1s)

random startup delay before a host assigns its link-local address

ipv6 ↗.ipv6 ↗.displayStringTextFormat

string

“{ipv6StatusText}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.ipv6 ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv6 ↗.ipv6 ↗.routingTableModule

string

ipv6 ↗.ipv6 ↗.ipv6NeighbourDiscoveryModule

string

ipv6 ↗.ipv6 ↗.icmpv6Module

string

ipv6 ↗.ipv6 ↗.procDelay

double

0s

ipv6 ↗.ipv6 ↗.sendRedirects

bool

true

RFC 4861 Section 8.2: when a router forwards a packet back out the interface it arrived on, send the source an ICMPv6 Redirect. Disable on wireless multi-hop / ad-hoc networks (e.g. MANET routing), where the geographic next hop is not directly reachable by the source, so redirects are useless and trigger a storm.

ipv6 ↗.ipsec ↗.displayStringTextFormat

string

“IN: ACCEPT: {inAccept} DROP: {inDrop} BYPASS: {inBypass}\n OUT: PROTECT: {outProtect} DROP: {outDrop} BYPASS: {outBypass}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.ipsec ↗.interfaceTableModule

string

ipv6 ↗.ipsec ↗.spdModule

string

“^.spd”

ipv6 ↗.ipsec ↗.sadModule

string

“^.sad”

ipv6 ↗.ipsec ↗.spdConfig

xml

ipv6 ↗.ipsec ↗.defaultProtection

string

“”

If not “”: value to use where <Protection> element is absent from the configuration

ipv6 ↗.ipsec ↗.defaultEspMode

string

“”

If not “”: value to use where <EspMode> element is absent from the configuration

ipv6 ↗.ipsec ↗.defaultEncryptionAlg

string

“”

If not “”: value to use where <EncryptionAlg> element is absent from the configuration

ipv6 ↗.ipsec ↗.defaultAuthenticationAlg

string

“”

If not “”: value to use where <defaultAuthenticationAlg> element is absent from the configuration

ipv6 ↗.ipsec ↗.defaultMaxTfcPadLength

int

0

Value to use where <MaxTfcPadLength> element is absent from the configuration

ipv6 ↗.ipsec ↗.ahProtectOutDelay

double

0.0s

ipv6 ↗.ipsec ↗.ahProtectInDelay

double

0.0s

ipv6 ↗.ipsec ↗.espProtectOutDelay

double

0.0s

ipv6 ↗.ipsec ↗.espProtectInDelay

double

0.0s

ipv6 ↗.spd ↗.displayStringTextFormat

string

“entries: {numEntries}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.sad ↗.displayStringTextFormat

string

“entries: {numEntries}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.mipv6 ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.mipv6 ↗.interfaceTableModule

string

The path to the InterfaceTable module

ipv6 ↗.mipv6 ↗.ipv6NeighbourDiscoveryModule

string

ipv6 ↗.mipv6 ↗.bindingUpdateListModule

string

ipv6 ↗.mipv6 ↗.bindingCacheModule

string

ipv6 ↗.mipv6 ↗.isHomeAgent

bool

ipv6 ↗.mipv6 ↗.isMobileNode

bool

ipv6 ↗.mipv6 ↗.maxHaBindingLifeTime

double

3600s

max binding lifetime for HA registration

ipv6 ↗.mipv6 ↗.maxRrBindingLifeTime

double

420s

max binding lifetime for CN (route optimization)

ipv6 ↗.mipv6 ↗.useRouteOptimization

bool

true

whether a mobile node route-optimizes with correspondent nodes (RFC 3775); if false, their traffic always uses the bidirectional home-agent tunnel

ipv6 ↗.buList ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.bindingCache ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.pmipv6 ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.pmipv6 ↗.interfaceTableModule

string

path to the InterfaceTable module

ipv6 ↗.pmipv6 ↗.ipv6NeighbourDiscoveryModule

string

path to the Ipv6NeighbourDiscovery module

ipv6 ↗.pmipv6 ↗.isLocalMobilityAnchor

bool

false

(the IPv6 routing table is resolved automatically)

ipv6 ↗.pmipv6 ↗.isMobileAccessGateway

bool

false

ipv6 ↗.pmipv6 ↗.localMobilityAnchorAddress

string

“”

MAG: the address of the LMA to register mobile nodes with

ipv6 ↗.pmipv6 ↗.mobileNodeProfiles

xml

xml(“<mobileNodes/>”)

MAG: mobile-node policy profiles, one per access interface, e.g. <mobileNodes> <mobileNode accessInterface=”wlan0” id=”mn1@example.com” homeNetworkPrefix=”2001:db8:1::” prefixLength=”64”/> </mobileNodes> (accessInterface may be omitted to match any access interface)

ipv6 ↗.pmipv6 ↗.bindingLifetime

double

3600s

lifetime requested in Proxy Binding Updates

ipv6 ↗.pmipv6 ↗.homeNetworkPrefixAdvValidLifetime

double

3600s

MAG: valid lifetime of the advertised home network prefix

ipv6 ↗.pmipv6 ↗.homeNetworkPrefixAdvPreferredLifetime

double

1800s

MAG: preferred lifetime of the advertised home network prefix

ipv6 ↗.mld ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ipv6 ↗.mld ↗.interfaceTableModule

string

path to the InterfaceTable module

ipv6 ↗.mld ↗.routingTableModule

string

path to the Ipv6RoutingTable module

ipv6 ↗.mld ↗.checksumMode

string

“declared”

how the ICMPv6 checksum is handled

ipv6 ↗.mld ↗.enabled

bool

true

when false, MLD is inert on this node (see above)

ipv6 ↗.mld ↗.unsolicitedReportInterval

double

10s

host: delay before the repeated Report after a join

ipv6 ↗.mld ↗.robustnessVariable

int

2

loss tolerance; only supplies the defaults of the three params marked (RV) below

ipv6 ↗.mld ↗.queryInterval

double

125s

querier: interval between periodic General Queries

ipv6 ↗.mld ↗.queryResponseInterval

double

10s

querier: max delay a host may wait before answering a General Query

ipv6 ↗.mld ↗.multicastListenerInterval

double

(robustnessVariable * queryInterval) + queryResponseInterval

querier: how long a group stays “has listeners” without a new Report (RV)

ipv6 ↗.mld ↗.startupQueryInterval

double

queryInterval / 4

querier: interval between the initial General Queries at startup

ipv6 ↗.mld ↗.startupQueryCount

int

robustnessVariable

querier: number of General Queries sent at startup (RV)

ipv6 ↗.mld ↗.lastListenerQueryInterval

double

1s

querier: interval between the group-specific Queries sent after a Done

ipv6 ↗.mld ↗.lastListenerQueryCount

int

robustnessVariable

querier: number of group-specific Queries sent after a Done (RV)

udp ↗.displayStringTextFormat

string

“passed up: {numPassedUp} pks\nsent: {numSent} pks{udpDroppedText}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

udp ↗.interfaceTableModule

string

The path to the InterfaceTable module

udp ↗.checksumMode

string

“declared”

udp ↗.defaultMulticastLoop

bool

true

tcp ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

tcp ↗.checksumMode

string

“declared”

tcp ↗.advertisedWindow

int

14 * this.mss

In bytes, corresponds with the maximal receiver buffer capacity (Note: normally, NIC queues should be at least this size)

tcp ↗.delayedAcksEnabled

bool

false

Delayed ACK algorithm (RFC 1122) enabled/disabled

tcp ↗.nagleEnabled

bool

true

Nagle’s algorithm (RFC 896) enabled/disabled

tcp ↗.limitedTransmitEnabled

bool

false

Limited Transmit algorithm (RFC 3042) enabled/disabled (can be used for TcpReno/TcpTahoe/TcpNewReno/TcpNoCongestionControl)

tcp ↗.increasedIWEnabled

bool

false

Increased Initial Window (RFC 3390) enabled/disabled

tcp ↗.sackSupport

bool

false

Selective Acknowledgment (RFC 2018, 2883, 3517) support (header option) (SACK will be enabled for a connection if both endpoints support it)

tcp ↗.windowScalingSupport

bool

false

Window Scale (RFC 1323) support (header option) (WS will be enabled for a connection if both endpoints support it)

tcp ↗.windowScalingFactor

int

-1

Window Scaling Factor given as a shift count. Valid values are 0..14, and -1 for automatic selection (it chooses the smallest shift count that makes advertisedWindow representable in 16 bits)

tcp ↗.timestampSupport

bool

false

Timestamps (RFC 1323) support (header option) (TS will be enabled for a connection if both endpoints support it)

tcp ↗.mss

int

536

Maximum Segment Size (header option). Default 536 per RFC 1122.

tcp ↗.msl

int

120s

Maximum Segment Lifetime

tcp ↗.tcpAlgorithmClass

string

“TcpReno”

tcp ↗.dupthresh

int

3

Used for TcpTahoe, TcpReno, and SACK (RFC 3517) DO NOT change unless you really know what you are doing

tcp ↗.initialSsthresh

int

0xFFFFFFFF

Initial value for Slow Start threshold used in TahoeRenoFamily. The initial value of ssthresh SHOULD be set arbitrarily high (e.g., to the size of the largest possible advertised window) Without user interaction there is no limit…

tcp ↗.stopOperationExtraTime

double

0s

Extra time after lifecycle stop operation finished

tcp ↗.stopOperationTimeout

double

2s

Timeout value for lifecycle stop operation

tcp ↗.ecnWillingness

bool

false

True if willing to use ECN

tcp ↗.dctcpGamma

double

0.0625

A fixed estimation gain for calculating dctcp_alpha (RFC 8257 4.2)

tcp ↗.pmtudEnabled

bool

false

Path MTU Discovery (RFC 1191, RFC 1981) enabled/disabled

tcp ↗.pmtudTimeout

double

600s

Time after which the original MSS is restored to probe for increased path MTU (RFC 1191, Section 6.3)

x2App.client.displayStringTextFormat

string

“{socketState}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

x2App.client.localAddress

string

“”

Comma-separated list of addresses

x2App.client.localPort

int

0

Port number to listen on

x2App.client.connectAddress

string

Server address (may be symbolic)

x2App.client.connectPort

int

5000

Port number to connect to

x2App.client.startTime

double

0s

Time the first session begins

x2App.client.numRequestsPerSession

int

1

Number of requests sent per session

x2App.client.numPacketsToReceive

int

0

x2App.client.requestLength

int

1452

Length of a request (bytes)

x2App.client.thinkTime

double

0s

Time gap between requests

x2App.client.waitToClose

double

0s

Time to wait between the last message sent and abort

x2App.client.reconnectInterval

double

0s

If the connection breaks, waits this much before trying to reconnect

x2App.client.inboundStreams

int

17

x2App.client.outboundStreams

int

1

x2App.client.echo

bool

false

Echoes received packages when true

x2App.client.ordered

bool

true

x2App.client.queueSize

int

0

x2App.client.prMethod

int

0

0=NONE, 1=PR_TTL, 2=PR_RTX, 3=PR_PRIO, 4=PR_STRRST

x2App.client.prValue

double

0

For PR-SCTP

x2App.client.streamReset

bool

false

x2App.client.streamRequestTime

double

0s

x2App.client.streamResetType

int

5

NO_RESET=5, RESET_OUTGOING=6, RESET_INCOMING=7, RESET_BOTH=8, SSN_TSN=9

x2App.client.streamToReset

int

0

x2App.client.stopTime

double

-1s

Time of finishing sending, negative values mean forever

x2App.client.primaryTime

double

0s

x2App.client.newPrimary

string

“”

x2App.client.streamRequestLengths

string

“”

x2App.client.streamRequestRatio

string

“”

x2App.client.streamPriorities

string

“”

x2App.client.finishEndsSimulation

bool

false

x2App.client.binderModule

string

“binder”

x2App.server.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

x2App.server.localAddress

string

“”

Comma-separated list of addresses

x2App.server.localPort

int

0

Port number to listen on

x2App.server.echo

bool

false

Echoes received packages when true

x2App.server.echoDelay

double

0s

x2App.server.delayFirstRead

double

0s

x2App.server.readingInterval

double

0s

x2App.server.messagesToPush

int

0

x2App.server.numPacketsToSendPerClient

int

0

Number of requests sent per session

x2App.server.numPacketsToReceivePerClient

int

1

x2App.server.requestLength

int

1452

Length of a request (bytes)

x2App.server.thinkTime

double

0s

Time gap between requests

x2App.server.waitToClose

double

0s

Time to wait between last message sent and abort

x2App.server.finishEndsSimulation

bool

false

x2App.server.ordered

bool

true

x2App.server.inboundStreams

int

17

x2App.server.outboundStreams

int

1

x2App.server.queueSize

int

0

x2App.server.prMethod

int

0

0=NONE, 1=PR_TTL, 2=PR_RTX, 3=PR_PRIO, 4=PR_STRRST

x2App.server.prValue

double

0

For PR-SCTP

x2App.server.streamReset

bool

false

x2App.server.streamRequestTime

double

0s

x2App.server.streamToReset

int

0

x2App.server.streamPriorities

string

“”

x2App.server.binderModule

string

“binder”

sctp ↗.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

sctp ↗.interfaceTableModule

string

sctp ↗.routingTableModule

string

sctp ↗.checksumMode

string

“declared”

sctp ↗.numGapReports

int

3

sctp ↗.rtoInitial

double

3s

sctp ↗.rtoMin

double

1s

sctp ↗.rtoMax

double

60s

sctp ↗.rtoAlpha

double

0.125

sctp ↗.rtoBeta

double

0.250

sctp ↗.maxBurst

int

4

sctp ↗.maxBurstVariant

string

“maxBurst”

sctp ↗.initialWindow

int

0

sctp ↗.assocMaxRetrans

int

10

sctp ↗.pathMaxRetrans

int

5

sctp ↗.maxInitRetrans

int

8

sctp ↗.sackPeriod

double

200ms

sctp ↗.sackFrequency

int

2

sctp ↗.reactivatePrimaryPath

bool

false

sctp ↗.sendQueueLimit

int

0

sctp ↗.validCookieLifetime

double

10s

sctp ↗.enableHeartbeats

bool

true

sctp ↗.hbInterval

double

30s

sctp ↗.sendHeartbeatsOnActivePaths

bool

false

sctp ↗.nagleEnabled

bool

true

sctp ↗.naglePoint

int

1468

sctp ↗.fragPoint

int

1452

Size of a message that has to be fragmented, i.e. maximum size of a fragment

sctp ↗.fastRecoverySupported

bool

true

sctp ↗.sctpAlgorithmClass

string

“SctpAlg”

sctp ↗.ccModule

int

0

RFC4960=0

sctp ↗.osbWithHeader

bool

false

sctp ↗.RTXMethod

int

0

0=Once after 3 Sacks; 1=once per RTT; 2=Switch off Fast Retransmit; 3=Always after 3 Sacks

sctp ↗.ssModule

int

0

ROUND_ROBIN=0

sctp ↗.arwnd

int

65535

sctp ↗.swsLimit

int

3000

Limit for SWS

sctp ↗.udpEncapsEnabled

bool

false

sctp ↗.natFriendly

bool

false

sctp ↗.bytesToAddPerRcvdChunk

int

0

For flow control

sctp ↗.bytesToAddPerPeerChunk

int

0

For flow control

sctp ↗.tellArwnd

bool

false

For flow control

sctp ↗.messageAcceptLimit

int

0

For flow control

sctp ↗.fairStart

double

0s

sctp ↗.fairStop

double

0s

sctp ↗.streamsToPaths

string

“”

sctp ↗.startEndToEndDelay

int

0

sctp ↗.stopEndToEndDelay

int

10

sctp ↗.throughputInterval

double

1

sctp ↗.auth

bool

false

sctp ↗.chunks

string

“”

sctp ↗.padding

bool

false

sctp ↗.addIP

bool

false

sctp ↗.addTime

double

0s

sctp ↗.addAddress

string

“”

sctp ↗.addIpType

string

“0”

SET_PRIMARY_ADDRESS=49156,ADD_IP_ADDRESS=49153,DELETE_IP_ADDRESS=49154

sctp ↗.packetDrop

bool

false

sctp ↗.sackNow

bool

false

sctp ↗.highSpeedCC

bool

false

sctp ↗.checkSackSeqNumber

bool

false

sctp ↗.nrSack

bool

false

sctp ↗.disableReneging

bool

false

sctp ↗.gapReportLimit

int

100000000

sctp ↗.gapListOptimizationVariant

string

“none”

sctp ↗.smartOverfullSACKHandling

bool

false

sctp ↗.allowQoSTracking

bool

false

sctp ↗.qosTrackingInterval

double

1.0s

sctp ↗.cmtSendAllVariant

string

“normal”

sctp ↗.cmtRetransmissionVariant

string

“normal”

sctp ↗.cmtCUCVariant

string

“normal”

sctp ↗.cmtBufferSplitVariant

string

“none”

sctp ↗.cmtBufferSplittingUsesOSB

bool

false

sctp ↗.cmtUseSFR

bool

true

sctp ↗.cmtUseDAC

bool

true

sctp ↗.cmtUseFRC

bool

true

sctp ↗.cmtSmartT3Reset

bool

true

sctp ↗.cmtSmartFastRTX

bool

true

sctp ↗.cmtSmartReneging

bool

false

sctp ↗.cmtSlowPathRTTUpdate

bool

false

sctp ↗.cmtChunkReschedulingVariant

string

“none”

sctp ↗.cmtChunkReschedulingThreshold

double

0.5

sctp ↗.cmtMovedChunksReduceCwnd

bool

true

sctp ↗.movedChunkFastRTXFactor

double

2.0

sctp ↗.cmtSackPath

string

“standard”

sctp ↗.strictCwndBooking

bool

false

sctp ↗.cmtCCVariant

string

“off”

CMT Congestion Control Variant off = use over every path the default RFC4960 CC (New Reno) lia = First resource pooling congestion control RFC6356 adapted for SCTP - https://datatracker.ietf.org/doc/rfc6356/ olia = alternative MPTCP CC, adapted for SCTP- https://tools.ietf.org/html/draft-khalili-mptcp-congestion-control-05 cmtrpv1 = First resource pooling based CC for SCTP - https://www.tdr.wiwi.uni-due.de/fileadmin/fileupload/I-TDR/SCTP/Paper/AINA2010.pdf cmtrpv2 = Updated version of cmtrpv1 - https://www.tdr.wiwi.uni-due.de/fileadmin/fileupload/I-TDR/SCTP/Paper/ConTEL2011.pdf

sctp ↗.cmtCCPathGroups

string

“”

sctp ↗.rpPathBlocking

bool

false

sctp ↗.rpScaleBlockingTimeout

bool

false

sctp ↗.rpMinCwnd

int

1

at ↗.displayStringTextFormat

string

“processed {numProcessedPackets} pk ({processedTotalLength})”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

at ↗.interfaceTableModule

string

Module path to the InterfaceTable ↗ module

at ↗.forwardServiceRegistration

bool

true

at ↗.forwardProtocolRegistration

bool

true

at ↗.interfaceMapping

object

{}

Maps network interface names to connected submodule names (e.g. {“eth0”: “bridging”}), overrides automatically learned dispatching; * overrides all learned network interfaces, ? overrides default

at ↗.serviceMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ethernetmac”: “bridging”}), overrides automatically learned dispatching; * overrides all learned services, ? overrides default

at ↗.protocolMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ipv4”: “bridging”}), overrides automatically learned dispatching; * overrides all learned protocols, ? overrides default

tn ↗.displayStringTextFormat

string

“processed {numProcessedPackets} pk ({processedTotalLength})”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

tn ↗.interfaceTableModule

string

Module path to the InterfaceTable ↗ module

tn ↗.forwardServiceRegistration

bool

true

tn ↗.forwardProtocolRegistration

bool

true

tn ↗.interfaceMapping

object

{}

Maps network interface names to connected submodule names (e.g. {“eth0”: “bridging”}), overrides automatically learned dispatching; * overrides all learned network interfaces, ? overrides default

tn ↗.serviceMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ethernetmac”: “bridging”}), overrides automatically learned dispatching; * overrides all learned services, ? overrides default

tn ↗.protocolMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ipv4”: “bridging”}), overrides automatically learned dispatching; * overrides all learned protocols, ? overrides default

nl ↗.displayStringTextFormat

string

“processed {numProcessedPackets} pk ({processedTotalLength})”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

nl ↗.interfaceTableModule

string

Module path to the InterfaceTable ↗ module

nl ↗.forwardServiceRegistration

bool

true

nl ↗.forwardProtocolRegistration

bool

true

nl ↗.serviceMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ethernetmac”: “bridging”}), overrides automatically learned dispatching; * overrides all learned services, ? overrides default

nl ↗.protocolMapping

object

{}

Maps protocols to connected submodule names (e.g. {“ipv4”: “bridging”}), overrides automatically learned dispatching; * overrides all learned protocols, ? overrides default

relay.trafficFlowFilter.binderModule

string

“binder”

relay.trafficFlowFilter.fastForwarding

bool

true

relay.gtpUser.binderModule

string

“binder”

relay.gtpUser.localPort

int

31

relay.gtpUser.tunnelPeerPort

int

31

gtpUserX2.binderModule

string

“binder”

gtpUserX2.localPort

int

32

gtpUserX2.tunnelPeerPort

int

32

Source code

//
// Models an evolved Node B (eNB) of a 4G LTE network. It is a specialized device equipped
// with a Network Interface Card (NIC) that enables communication with the ~LteUe devices connected
// to it. It serves as an access point that routes packets between the UEs and the 4G Core Network.
// Packets arriving from the UEs are tunneled to the appropriate next hop in the core network (e.g.,
// the PDN Gateway, PGW) using the GPRS Tunneling Protocol (GTP). Conversely, packets
// received from the core network are detunneled and sent to the appropriate destination UE.
// In addition to the 4G NIC, this compound module includes a configurable number of wired interfaces
// to connect with routers of the core network or directly to the ~PgwStandard module, which serves
// as the IP module to perform forwarding, and the ~UserPlaneRelay that relays between the NIC and the GTP
// tunnels: its ~TrafficFlowFilter classifies incoming packets and determines the next hop, and its ~GtpUser
// handles GTP (de)tunneling.
// Furthermore, it features a configurable number of ~LteX2App modules to facilitate peer-to-peer communications with
// other eNodeBs within the same LTE network.
//
module eNodeB
{
    parameters:
        @networkNode;
        @labels(node,ethernet-node,wireless-node);
        @display("i=device/antennatower;bgb=1500,600");
        @figure[applicationLayer](type=rectangle; pos=250,6; size=800,130; lineColor=#808080; cornerRadius=5; fillColor=#ffff00; fillOpacity=0.1);
        @figure[applicationLayer.title](type=text; pos=1045,11; anchor=ne; text="application layer");
        @figure[transportLayer](type=rectangle; pos=250,156; size=800,130; fillColor=#ff0000; lineColor=#808080; cornerRadius=5; fillOpacity=0.1);
        @figure[transportLayer.title](type=text; pos=1045,161; anchor=ne; text="transport layer");
        @figure[networkLayer](type=rectangle; pos=250,306; size=800,130; fillColor=#00ff00; lineColor=#808080; cornerRadius=5; fillOpacity=0.1);
        @figure[networkLayer.title](type=text; pos=1045,311; anchor=ne; text="network layer");
        @figure[linkLayer](type=rectangle; pos=250,456; size=800,130; fillColor=#0000ff; lineColor=#808080; cornerRadius=5; fillOpacity=0.1);
        @figure[linkLayer.title](type=text; pos=1045,461; anchor=ne; text="link layer");
        @figure[radioInterface](type=rectangle; pos=1075,456; size=400,130; fillColor=#00ffff; lineColor=#808080; cornerRadius=5; fillOpacity=0.1);
        @figure[radioInterface.title](type=text; pos=1470,461; anchor=ne; text="radio interface");
        @figure[submodules];
        @statistic[posX](source="xCoord(mobilityPos(mobilityStateChanged))"; record=vector?);
        @statistic[posY](source="yCoord(mobilityPos(mobilityStateChanged))"; record=vector?);


        //# Node specs
        string nodeType = default("ENODEB");        // DO NOT CHANGE
        string gateway = default("pgw");
        int masterId = default(0);  // ID of the master eNodeB. Used in case of Dual Connectivity
        int macNodeId = default(1+simu5g_seq("eNodeB_macNodeId"));
        int macCellId = default(macNodeId);
        double txPower @unit(mw) = default(100mw);

        //# D2D support: selects the D2D-capable NIC variant (see the cellularNic submodule).
        //# An explicit cellularNic.typename in the ini file still overrides this.
        bool hasD2D = default(false);

        //# Network Layer specs
        bool hasIpv4 = default(true);
        bool hasIpv6 = default(false);
        *.interfaceTableModule = default(absPath(".interfaceTable"));
        *.routingTableModule = default("^.ipv4.routingTable");
        *.forwarding = true;
        *.multicastForwarding = false;
        **.cellInfoModule = default(absPath(".cellInfo"));

        //# Apps
        int numApps = default(0);     // Number of apps
        int numX2Apps = default(0);   // Number of X2 apps; set their types in the ini file, e.g. x2App[0..1].typename="X2AppClient"

        //# Transport layer
        bool hasUdp = true;
        bool hasTcp = default(firstAvailableOrEmpty("Tcp", "TcpLwip", "TcpNsc") != "");
        bool hasSctp = true;

        //# MEC support
        string mecHost = default("");                // Symbolic name of the connected MEHost in the Network

        //# @author Alessandro Noferi
        bool hasRniSupport = default(false);

        //# Use it in case of emulation
        string extMeAppsAddress = default(""); // Address of the external MeApp IP/mask
        //# PLMN params (used by RNI Service in EnodeBStatsCollector)
        string mcc = default("001"); // Test network
        string mnc = default("01");  // Test network

    gates:
        inout ppp @loose;         // Connection to the Core Network
        input radioIn @directIn;  // Connection to the radio interface
        inout x2[];               // Connection to the X2 interface

        //# MEC support
        inout pppMEHost @loose;              // Connection to the GtpEndpoint module inside MEHost

    submodules:
        interfaceTable: InterfaceTable {
            parameters:
                @display("p=110,158;is=s");
        }
        mobility: StationaryMobility {
            parameters:
                @display("p=110,343;is=s");
        }
        cellInfo: CellInfo {
            parameters:
                @display("p=110,244;is=s");
        }

        collector: <default("BaseStationStatsCollector")> like IStatsCollector if hasRniSupport {
            @display("p=110,430;is=s");
        }

        //#
        //# cellularNic modules
        //#
        cellularNic: <default(hasD2D ? "LteNicEnbD2D" : "LteNicEnb")> like ICellularNic {
            parameters:
                @display("p=1275,520");
                nodeType = parent.nodeType;
                rrc.connectionControl.gateway = parent.gateway;
        }

        pppIf: PppInterface {
            parameters:
                @display("p=700,520");
        }

        x2ppp[sizeof(x2)]: PppInterface {
            parameters:
                @display("p=850,520,row,100");
        }

        //#
        //# Mec interface
        //#
        pppMEHostIf: PppInterface {
            @display("p=550,520");
        }

        //#
        //# Network layer module
        //#
        ipv4: <default("Ipv4NetworkLayer")> like INetworkLayer if hasIpv4 {
            parameters:
                @display("p=525,371;q=queue");
        }
        ipv6: <default("Ipv6NetworkLayer")> like INetworkLayer if hasIpv6 {
            parameters:
                @display("p=775,371;q=queue");
        }

        //#
        //# Transport layer modules and corresponding application modules
        //#
             // =============== Udp ============== //
        app[numApps]: <> like IApp {
            parameters:
                @display("p=325,95,row,150");
        }
        udp: Udp {
            parameters:
                @display("p=650,221");
        }
        tcp: Tcp if hasTcp {
            parameters:
                @display("p=900,221");
        }

         // =============== X2AP ============== //
        x2App[numX2Apps]: LteX2App {
            parameters:
                @display("p=625,68,row,150");
        }
        sctp: Sctp {
            parameters:
                @display("p=400,221");
        }

         // message dispatcher for SAP between application and transport layer
        at: MessageDispatcher {
            parameters:
                @display("p=650,146;b=800,5,,,,1");
        }
        // message dispatcher for SAP between transport and network layer
        tn: MessageDispatcher {
            parameters:
                @display("p=650,296;b=800,5,,,,1");
        }
        // message dispatcher for SAP to link layer
        nl: MessageDispatcher {
            parameters:
                interfaceMapping = parent.hasIpv6 ? {"cellular": "cellularNdSink"} : {};  // WORKAROUND, see ~CellularNicNdSink
                @display("p=650,446;b=800,5,,,,1");
        }
        // WORKAROUND: takes the IPv6 Neighbor Discovery the network layer sends to the cellular NIC
        cellularNdSink: CellularNicNdSink if hasIpv6 {
            parameters:
                @display("p=400,520");
        }

        //#
        //# Modules for connecting to the core network and X2
        //#
        relay: UserPlaneRelay {
            parameters:
                @display("p=975,95");
                ownerType = parent.nodeType;
                gateway = parent.gateway;
                mecHost = parent.mecHost;
        }

        gtpUserX2: GtpUserX2 {
            parameters:
                @display("p=875,40");
        }

    connections allowunconnected:

        //#
        //# LTE stack to PHY and network layer
        //#
        cellularNic.radioIn <-- radioIn;

        //#
        //# Ppp interface to network layer connections
        //#
        pppIf.phys <--> ppp;
        pppIf.upperLayerOut --> nl.in++;
        pppIf.upperLayerIn <-- nl.out++;

        //#
        //# X2 interface to network layer connections
        //#
        for i=0..sizeof(x2)-1 {
            x2ppp[i].phys <--> x2[i];
            x2ppp[i].upperLayerOut --> tn.in++;
            x2ppp[i].upperLayerIn <-- tn.out++;
        }

        //#
        //# User plane: the cellular NIC is wired to the tunnel endpoint directly, the
        //# base station does not IP-route the UEs' traffic
        //#
        cellularNic.upperLayerOut --> { @display("m=v,h"); } --> relay.userDataIn;
        relay.userDataOut --> { @display("m=h,v"); } --> cellularNic.upperLayerIn;
        relay.socketOut --> at.in++;
        relay.socketIn <-- at.out++;

         //# GTPUserX2 connections
        gtpUserX2.lteStackOut --> { @display("m=h,v"); } --> cellularNic.x2$i++;
        cellularNic.x2$o++ --> { @display("m=v,h"); } --> gtpUserX2.lteStackIn;
        gtpUserX2.socketOut --> at.in++;
        gtpUserX2.socketIn <-- at.out++;

        //# X2 apps connections
        for i=0..numX2Apps-1 {
            x2App[i].sctpOut[0] --> at.in++;
            x2App[i].sctpIn[0] <-- at.out++;
            x2App[i].sctpOut[1] --> at.in++;
            x2App[i].sctpIn[1] <-- at.out++;
            cellularNic.x2$o++ --> { @display("m=v,h"); } --> x2App[i].x2ManagerIn;
            x2App[i].x2ManagerOut --> { @display("m=h,v"); } --> cellularNic.x2$i++;
        }

             //#
    //# Apps to transport layer connections
    //#
        for i=0..numApps-1 {
            app[i].socketOut --> at.in++;
            app[i].socketIn <-- at.out++;
        }

        at.out++ --> udp.appIn if hasUdp;
        at.in++ <-- udp.appOut if hasUdp;

        at.out++ --> tcp.appIn if hasTcp;
        at.in++ <-- tcp.appOut if hasTcp;

        at.out++ --> sctp.appIn if hasSctp;
        at.in++ <-- sctp.appOut if hasSctp;

        //#
        //# Transport layer to network layer connections
        //#
        udp.ipOut --> tn.in++ if hasUdp;
        udp.ipIn <-- tn.out++ if hasUdp;

        tcp.ipOut --> tn.in++ if hasTcp;
        tcp.ipIn <-- tn.out++ if hasTcp;

        sctp.ipOut --> tn.in++ if hasSctp;
        tn.out++ --> sctp.ipIn if hasSctp;

        ipv4.ifIn <-- nl.out++ if hasIpv4;
        ipv4.ifOut --> nl.in++ if hasIpv4;

        ipv4.transportIn <-- tn.out++ if hasIpv4;
        ipv4.transportOut --> tn.in++ if hasIpv4;

        ipv6.ifIn <-- nl.out++ if hasIpv6;
        ipv6.ifOut --> nl.in++ if hasIpv6;

        ipv6.transportIn <-- tn.out++ if hasIpv6;
        ipv6.transportOut --> tn.in++ if hasIpv6;

        tn.out++ --> nl.in++;
        tn.in++ <-- nl.out++;

        nl.out++ --> cellularNdSink.in if hasIpv6;
        nl.in++ <-- cellularNdSink.out if hasIpv6;

        at.out++ --> tn.in++;
        at.in++ <-- tn.out++;

        //#
        //# MEC support
        //#
        pppMEHostIf.upperLayerIn <-- nl.out++;
        pppMEHostIf.upperLayerOut --> nl.in++;
        pppMEHost <--> pppMEHostIf.phys;
}

File: src/simu5g/nodes/eNodeB.ned