LteNicEnb

Package: simu5g.stack

LteNicEnb

compound module

The LteNicEnb module is a network interface that provides LTE connectivity within an eNodeB. It implements the data and signaling planes of the LTE stack, which includes the PDCP, RLC, MAC, and PHY layers. The parameters and submodules allow customization of the eNodeB's behavior, including whether it supports D2D communication, CoMP (Coordinated MultiPoint), or dual connectivity.

The PDCP and RLC entities are missing from the submodules on purpose: the RRC layer's BearerManagement creates them per bearer at run time.

pcapRecorder[numPcapRecorders] : PcapRecorder
[from inet] ↗

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

Source:
pcapRecorder[numPcapRecorders]: PcapRecorder {
    parameters:
        moduleNamePatterns = ".^";
        @display("p=100,100;is=s");
} clock : like IClock

IClock [from inet] ↗: Interface for clock models.

Source:
clock: <default("")> like IClock if typename != "" {
    parameters:
        @display("p=100,200;is=s");
} handoverPacketHolder : like IHandoverPacketHolder

IHandoverPacketHolder: Manages packet buffering/tunnelling during handover

Source:
handoverPacketHolder: <> like IHandoverPacketHolder {
    @display("p=440,100;is=s");
} ip2nic : like INetworkLayer2CellularNic

Ip2Nic: Bridges the IP network layer and the cellular protocol stack, handling bidirectional packet flow.

INetworkLayer2CellularNic: The INetworkLayer2CellularNic module interface serves as an intermediary between the network layer...

Source:
ip2nic: <default("Ip2Nic")> like INetworkLayer2CellularNic {
    nodeType = parent.nodeType;
    @display("p=310,200;is=s");
} rrc : like IRrc

Rrc: RRC (Radio Resource Control) layer for LTE/NR networks.

IRrc: Interface for the RRC (Radio Resource Control) layer of the LTE/NR Stack.

Source:
rrc: <default("Rrc")> like IRrc {
    @display("p=80,60,col;g=left");
} pdcpMux : like IPdcpMux

PdcpMux: Upper-layer PDCP packet dispatcher.

IPdcpMux: Module interface for the upper-layer PDCP packet dispatcher of a cellular NIC (see ~PdcpMux for the...

Source:
pdcpMux: <default("PdcpMux")> like IPdcpMux {
    @display("p=310,340;is=s");
} rlcMux : like IRlcMux

RlcMux: Lower-layer RLC packet dispatcher.

IRlcMux: Module interface for the lower-layer RLC packet dispatcher of a cellular NIC (see ~RlcMux for the...

Source:
rlcMux: <default("RlcMux")> like IRlcMux {
    @display("p=310,580;is=s");
} mac : like ILteMac

ILteMac: Interface for the Medium Access Control (MAC) layer of the LTE Stack.

Source:
mac: <> like ILteMac {
    @display("p=310,660");
} phy : like IPhy

IPhy: Interface for the Physical (PHY) layer of the LTE/NR protocol stack.

Source:
phy: <> like IPhy {
    @display("p=310,750");
} channelModel[numCarriers] : like IChannelModel

IChannelModel: Provides the interface for modules implementing the model of the radio channel.

Source:
channelModel[numCarriers]: <channelModelType> like IChannelModel {
    @display("p=80,60,col;g=left");
} packetFlowObserver : like IPacketFlowObserver

Source:
packetFlowObserver: <default("")> like IPacketFlowObserver if hasRniSupport {
    @display("p=80,60,col;g=left");
} pdcpDcMux : DcMux

Dual Connectivity mux: routes split-bearer PDCP PDUs between the local PDCP entities and the...

Source:
pdcpDcMux: DcMux {
    @display("p=609,340;is=s");
} x2Manager : LteX2Manager

Serves as a pluggable interface for submodules of the e/gNodeB's LTE/NR protocol stack that...

Source:
x2Manager: LteX2Manager {
    @display("p=717,200;is=s");
} compManager : like ILteCompManager

LteCompManagerProportional: Implements a CoMP (Coordinated Multi-Point) Proportional Scheduling algorithm.

ILteCompManager: The LteCompManager interface defines the structure for the CoMP Manager.

Source:
compManager: <default("LteCompManagerProportional")> like ILteCompManager if compEnabled {
    @display("p=717,340;is=s");
} handoverX2Forwarder : HandoverX2Forwarder

Forwards the downlink a handover source holds for a UE leg to the target base station over X2-U,...

Source:
handoverX2Forwarder: HandoverX2Forwarder {
    @display("p=717,100;is=s");
} dcX2Forwarder : DcX2Forwarder

Performs bridging of data-plane packets between PDCP entities of two eNodeBs or gNodeBs when Dual...

Source:
dcX2Forwarder: DcX2Forwarder if dualConnectivityEnabled {
    @display("p=609,270;is=s");
} bgTrafficGenerator[numCarriers] : BackgroundTrafficGenerator

Part of a ~BackgroundCell module and is responsible for instantiating a configurable number of...

Source:
bgTrafficGenerator[numCarriers]: BackgroundTrafficGenerator {
    @display("p=80,60,col;g=left");
}

Usage diagram

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

Inheritance diagram

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

Known subclasses

Name Type Description
LteNicEnbD2D compound module

The LteNicEnbD2D module represents an LTE eNodeB network interface with support for D2D (Device-to-Device) communications. It extends the basic LteNicEnb module to manage D2D-capable UEs (User Equipments). A D2D mode selection algorithm can be specified via the rrc.d2dModeSelection submodule's typename.

NrNicEnb compound module

The NrNicEnb module serves as a network interface that provides 5G connectivity within a gNodeB. It implements the data and signaling plane of the NR (New Radio) stack, which encompasses the PDCP, RLC, MAC, and PHY layers. The parameters and submodules facilitate the customization of the gNodeB's behavior, including its support for CoMP (Coordinated MultiPoint) or dual connectivity. D2D support is added by the NrNicEnbD2D subtype.

Extends

Name Type Description
LteNicBase compound module

The LteNicBase module serves as the foundational building block for LTE networking in Simu5G. It integrates protocols for LTE communication, including PDCP, RLC, MAC, and PHY layers. This base module allows higher-level modules, such as User Equipment (UE) and eNodeB (evolved Node B), to configure and utilize these layers according to their specific requirements.

Parameters

Name Type Default value Description
displayStringTextFormat string "%a (%i)\n%m"

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

recordPcap bool false
numPcapRecorders int recordPcap ? 1 : 0
isWireless bool true
interfaceTableModule string
routingTableModule string
hasRniSupport bool false
nodeType string
processingDelayIn double 0s

Additional processing delay for incoming ip packets

processingDelayOut double 0s

Additional processing delay for outgoing ip packets

channelModelType string "StochasticChannelModel"
dualConnectivityEnabled bool false
numCarriers int 1
address string "auto"
compEnabled bool false

Properties

Name Value Description
class NonlayoutingNetworkInterface
networkInterface
lifecycleSupport
display i=block/ifcard;bgb=800,810;bgl=3

Gates

Name Direction Size Description
upperLayerIn input
upperLayerOut output
radioIn input

To receive messages sent using sendDirect()

nrRadioIn input

For NR support

x2 [ ] inout

Optional X2 manager

Signals

Name Type Unit Description
packetDropped inet::Packet

Statistics

Name Title Source Record Unit Interpolation Mode Description
packetDropInterfaceDown packet drops: interface down packetDropReasonIsInterfaceDown(packetDropped) count, sum(packetBytes), vector(packetBytes) none
packetDropNoCarrier packet drops: no carrier packetDropReasonIsNoCarrier(packetDropped) count, sum(packetBytes), vector(packetBytes) none

Unassigned submodule parameters

Name Type Default value Description
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

pcapRecorder.verbose bool true

Whether to log packets on the module output

pcapRecorder.recordEmptyPackets bool true

Specifies if zero length packets are recorded or not

pcapRecorder.enableConvertingPackets bool true

Specifies if converting packets to link type is allowed or not

pcapRecorder.pcapFile string ""

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

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

Maximum number of bytes to record per packet

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

pcapRecorder.dumpBadFrames bool true

Enable dump of frames with hasBitError

pcapRecorder.sendingSignalNames string "transmissionEnded"

Space-separated list of outbound packet signals to subscribe to

pcapRecorder.receivingSignalNames string "receptionEnded"

Space-separated list of inbound packet signals to subscribe to

pcapRecorder.dumpProtocols string "ethernetmac ppp ieee80211mac"

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

pcapRecorder.packetFilter object "*"

Which packets are considered, matches all packets by default

pcapRecorder.helpers string ""

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

pcapRecorder.alwaysFlush bool false

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

ip2nic.isNr bool
rlcMux.bearerManagementModule string
packetFlowObserver.macModule string
packetFlowObserver.pdcpModule string
packetFlowObserver.rlcModule string
packetFlowObserver.isNrObserver bool
packetFlowObserver.pfmType string
pdcpDcMux.bearerManagementModule string "^.rrc.bearerManagement"
x2Manager.interfaceTableModule string
x2Manager.binderModule string "binder"
handoverX2Forwarder.losslessHandover bool false

Source code

//
// The LteNicEnb module is a network interface that provides LTE connectivity
// within an eNodeB. It implements the data and signaling planes of the LTE stack,
// which includes the PDCP, RLC, MAC, and PHY layers. The parameters and submodules
// allow customization of the eNodeB's behavior, including whether it supports
// D2D communication, CoMP (Coordinated MultiPoint), or dual connectivity.
//
// The PDCP and RLC entities are missing from the submodules on purpose: the RRC
// layer's ~BearerManagement creates them per bearer at run time.
//
module LteNicEnb extends LteNicBase
{
    parameters:
        mac.typename = default("LteMacEnb");
        phy.typename = default("PhyEnb");
        handoverPacketHolder.typename = default("HandoverPacketHolderEnb");
        packetFlowObserver.typename = default("PacketFlowObserverEnb");
        bool compEnabled = default(false);
        rrc.hasConnectionControl = true;
        rrc.connectionControl.macNodeId = parent.macNodeId;

    submodules:
        pdcpDcMux: DcMux {
            @display("p=609,340;is=s");
        }

        //#
        //# X2 manager
        //#
        x2Manager: LteX2Manager {
            @display("p=717,200;is=s");
        }

        //#
        //# Modules exploiting X2 interface
        //#
        compManager: <default("LteCompManagerProportional")> like ILteCompManager if compEnabled {
            @display("p=717,340;is=s");
        }
        handoverX2Forwarder: HandoverX2Forwarder {
            @display("p=717,100;is=s");
        }
        dcX2Forwarder: DcX2Forwarder if dualConnectivityEnabled {
            @display("p=609,270;is=s");
        }
        bgTrafficGenerator[numCarriers]: BackgroundTrafficGenerator {
            @display("p=80,60,col;g=left");
        }

    connections:
        //# connections between X2 Manager and its users
        compManager.x2ManagerIn <-- x2Manager.dataPortOut++ if compEnabled;
        compManager.x2ManagerOut --> x2Manager.dataPortIn++ if compEnabled;
        handoverX2Forwarder.x2ManagerIn <-- x2Manager.dataPortOut++;
        handoverX2Forwarder.x2ManagerOut --> x2Manager.dataPortIn++;
        handoverX2Forwarder.tunnelOut --> handoverPacketHolder.x2In;
        handoverPacketHolder.hoManagerOut --> handoverX2Forwarder.dataIn;
        dcX2Forwarder.x2ManagerIn <-- x2Manager.dataPortOut++ if dualConnectivityEnabled;
        dcX2Forwarder.x2ManagerOut --> x2Manager.dataPortIn++ if dualConnectivityEnabled;
        pdcpDcMux.dcManagerOut --> dcX2Forwarder.dataIn if dualConnectivityEnabled;
        dcX2Forwarder.tunnelOut --> pdcpDcMux.dcManagerIn if dualConnectivityEnabled;

        if ( sizeof(x2) > 0 ) {
            //# connections between X2 Manager and GTP (for handover)
            x2$i[0] --> x2Manager.x2GtpIn;
            x2$o[0] <-- x2Manager.x2GtpOut;
        }
        //# connections between X2 Manager and the outer world
        for i=1..sizeof(x2)-1 {
            x2$i[i] --> x2Manager.x2In++;
            x2$o[i] <-- x2Manager.x2Out++;
        }
}

File: src/simu5g/stack/LteNicEnb.ned