NrNicUeD2D¶
Package: simu5g.stack.d2d
compound module NrNicUeD2D
Device-to-Device (D2D) capable NR User Equipment network interface. It extends NrNicUe by swapping in the D2D-capable NR MAC/PHY leaves and enabling the D2D mode controller, allowing direct UE-to-UE communication without routing traffic through the gNodeB. It is the NR counterpart of LteNicUeD2D.
The PDCP and RLC entities are missing from the submodules on purpose: the RRC layer’s BearerManagement creates them per bearer at run time.
Inheritance diagram¶
Extends¶
Name |
Type |
Description |
|---|---|---|
compound module |
Defines a User Equipment (UE) network interface card that supports both LTE and NR (New Radio) technologies. It extends the LteNicUe module by adding additional submodules and parameters to support NR-specific functionalities. D2D support is added by the NrNicUeD2D subtype. |
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 |
“D2dChannelModel” |
|
dualConnectivityEnabled |
bool |
false |
|
numCarriers |
int |
1 |
|
address |
string |
“auto” |
|
sessionType |
string |
The type of the UE’s session (see LteUe), set by the node |
|
hasSdap |
bool |
false |
Whether the stack has an SDAP layer: true on 5GC (Upf) networks, false on EPC/EN-DC ones; the network sets it per its core |
useReflectiveQos |
bool |
false |
|
nrChannelModelType |
string |
“D2dChannelModel” |
|
numNrCarriers |
int |
1 |
|
d2dInitialMode |
bool |
false |
Properties¶
Name |
Value |
Description |
|---|---|---|
class |
NonlayoutingNetworkInterface |
|
display |
i=block/ifcard;bgb=800,810;bgl=3 |
|
lifecycleSupport |
||
networkInterface |
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 |
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 |
pcapRecorder ↗.alwaysFlush |
bool |
false |
Flush the pcapFile after each write to ensure that all packets are captured in case of a crash |
handoverPacketHolder.sessionType |
string |
The type of the UE’s session (see LteUe): the IP types parse the uplink datagram’s header for the modules after this one, the others carry the payload as is |
|
ip2nic.binderModule |
string |
“binder” |
|
ip2nic.connectionControlModule |
string |
“^.rrc.connectionControl” |
The node’s control-plane entry point, asked for a bearer on a lookup miss |
ip2nic.isNr |
bool |
false |
True for the NR leg (set by NrNicUe/NrNicEnb, or in the ini for a DC master eNB) |
ip2nic.hasSdap |
bool |
false |
When true, SDAP handles DRB/RLC assignment; Ip2Nic skips traffic classification |
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 |
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) |
ip2nic.d2dBinderModule |
string |
“d2dBinder” |
The network’s D2dBinder, which holds the D2D state |
rrc.registration.interfaceTableModule |
string |
||
rrc.registration.interfaceName |
string |
“cellular” |
|
rrc.registration.routingTableModule |
string |
||
rrc.registration.binderModule |
string |
“binder” |
|
rrc.registration.connectionControlModule |
string |
“^.connectionControl” |
The node’s control-plane entry point (see Rrc), told about a multicast group join |
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 |
rrc.bearerManagement.binderModule |
string |
“binder” |
To reach a peer’s BearerManagement on RLF |
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 |
rrc.bearerManagement.t311 |
double |
0s |
RRC re-establishment cell-selection timer (0 => release-to-IDLE) |
rrc.bearerManagement.t301 |
double |
0.1s |
RRC re-establishment (request -> complete) timer |
rrc.bearerManagement.headerCompressedSize |
int |
-1B |
Removed, an error if set: header compression is configured per bearer (the rohc field of BearerConfigurator’s bearer definitions) |
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. |
rrc.bearerManagement.pdcpRelayEntityModuleType |
string |
“simu5g.stack.pdcp.PdcpRelayEntity” |
|
rrc.bearerManagement.dualConnectivityEnabled |
bool |
false |
Set by the NIC; two-leg (split-capable) bearers |
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) |
rrc.bearerManagement.lteRlcUmEntityModuleType |
string |
“simu5g.stack.rlc.LteRlcUmEntity” |
|
rrc.bearerManagement.lteRlcAmEntityModuleType |
string |
“simu5g.stack.rlc.LteRlcAmEntity” |
|
rrc.bearerManagement.nrRlcUmEntityModuleType |
string |
“simu5g.stack.rlc.NrRlcUmEntity” |
|
rrc.bearerManagement.nrRlcAmEntityModuleType |
string |
“simu5g.stack.rlc.NrRlcAmEntity” |
|
rrc.bearerManagement.registrationModule |
string |
“^.registration” |
Module references for accessing other stack layers |
rrc.bearerManagement.drbTableModule |
string |
“^.drbTable” |
|
rrc.bearerManagement.ip2nicModule |
string |
“^.^.ip2nic” |
|
rrc.bearerManagement.handoverPacketHolderModule |
string |
“^.^.handoverPacketHolder” |
Attachment-ledger push target (UE only) |
rrc.bearerManagement.pdcpMuxModule |
string |
“^.^.pdcpMux” |
|
rrc.bearerManagement.pdcpDcMuxModule |
string |
“^.^.pdcpDcMux” |
|
rrc.bearerManagement.d2dModeControllerModule |
string |
“^.d2dModeController” |
|
rrc.bearerManagement.rlcMuxModule |
string |
“^.^.rlcMux” |
|
rrc.bearerManagement.nrRlcMuxModule |
string |
“^.^.nrRlcMux” |
|
rrc.bearerManagement.macModule |
string |
“^.^.mac” |
|
rrc.bearerManagement.nrMacModule |
string |
“^.^.nrMac” |
|
rrc.bearerManagement.sdapModule |
string |
“^.^.sdap” |
Configuration push target; unresolvable (no SDAP on the NIC) = no pushes |
rrc.bearerManagement.qosFlowClassifierModule |
string |
“^.^.qosFlowClassifier” |
Uplink QFI rule push target; unresolvable (not a UE stack with SDAP) = no pushes |
rrc.connectionControl.binderModule |
string |
“binder” |
|
rrc.connectionControl.bearerConfiguratorModule |
string |
“bearerConfigurator” |
|
rrc.connectionControl.coreControlModule |
string |
“coreControl” |
|
rrc.connectionControl.bearerManagementModule |
string |
“^.bearerManagement” |
|
rrc.connectionControl.macModule |
string |
“^.^.mac” |
|
rrc.connectionControl.handoverPacketHolderModule |
string |
“^.^.handoverPacketHolder” |
|
rrc.connectionControl.gtpUserModule |
string |
“^.^.^.relay.gtpUser” |
|
rrc.connectionControl.gtpUserX2Module |
string |
“^.^.^.gtpUserX2” |
|
rrc.connectionControl.macNodeId |
int |
The base station’s node id; the NIC sets it from the node’s |
|
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) |
rrc.nrConnectionControl.dynamicCellAssociation |
bool |
false |
|
rrc.nrConnectionControl.enableHandover |
bool |
false |
Allows handovers in the UE |
rrc.nrConnectionControl.isNr |
bool |
Whether this instance is associated with the NR or the LTE stack |
|
rrc.nrConnectionControl.macNodeId |
int |
MacNodeId of the stack leg this controller belongs to (set by the NIC) |
|
rrc.nrConnectionControl.sessionType |
string |
The type of the session the UE requests at connection setup (see LteUe), set by the NIC |
|
rrc.nrConnectionControl.handoverLatency |
double |
50ms |
Handover duration |
rrc.nrConnectionControl.handoverDetachmentTime |
double |
handoverLatency > 0s ? handoverLatency/2 : 25ms |
|
rrc.nrConnectionControl.handoverAttachmentTime |
double |
handoverLatency > 0s ? handoverLatency-handoverDetachmentTime : handoverDetachmentTime |
|
rrc.nrConnectionControl.minRssiDefault |
bool |
true |
Whether minRssi is taken from PhyPisaData instead of the minRssi parameter |
rrc.nrConnectionControl.minRssi |
double |
-99.0dB |
Configurable minimum threshold RSSI for attaching to an eNB (meaningful only if minRssiDefault==false) |
rrc.nrConnectionControl.hysteresisFactor |
double |
10 |
|
rrc.nrConnectionControl.binderModule |
string |
“binder” |
|
rrc.nrConnectionControl.macModule |
string |
“^.^.mac” |
|
rrc.nrConnectionControl.bearerManagementModule |
string |
“^.bearerManagement” |
|
rrc.nrConnectionControl.handoverPacketHolderModule |
string |
“^.^.handoverPacketHolder” |
|
rrc.nrConnectionControl.feedbackGeneratorModule |
string |
“^.^.dlFbGen” |
TODO or “^.^.nrDlFbGen” |
rrc.nrConnectionControl.otherConnectionControlModule |
string |
“” |
|
rrc.nrConnectionControl.hasCollector |
bool |
false |
True when node has a collector module (ueCollector/nrUeCollector) for this PHY module |
rrc.d2dModeSelection.modeSelectionPeriod |
double |
1s |
|
rrc.d2dModeSelection.binderModule |
string |
“binder” |
|
rrc.d2dModeSelection.d2dBinderModule |
string |
“d2dBinder” |
The network’s D2dBinder, which holds the D2D state |
rrc.d2dModeSelection.macModule |
string |
“^.^.mac” |
|
rrc.d2dModeSelection.connectionControlModule |
string |
“^.connectionControl” |
The node’s control-plane entry point, which knows the UEs handing over |
rlcMux.bearerManagementModule |
string |
“^.rrc.bearerManagement” |
|
phy.isNr |
bool |
false |
True for the NR leg (set by NrNicUe/NrNicEnb on their PHY submodule) |
phy.macNodeId |
int |
MacNodeId of the stack leg this PHY belongs to (set by the NIC) |
|
phy.ueTxPower |
double |
26dBm |
|
phy.eNodeBTxPower |
double |
46dBm |
|
phy.microTxPower |
double |
30dBm |
|
phy.txDirection |
string |
“OMNI” |
|
phy.txAngle |
double |
0deg |
|
phy.binderModule |
string |
“binder” |
|
phy.channelModelModule |
string |
“^.channelModel[0]” |
Set to “^.nrChannelModel[0]” on an NR leg, see NrNicUe |
phy.connectionControlModule |
string |
“^.rrc.connectionControl” |
|
packetFlowObserver.macModule |
string |
“^.mac” |
|
packetFlowObserver.pdcpModule |
string |
“^” |
|
packetFlowObserver.rlcModule |
string |
“^” |
|
packetFlowObserver.isNrObserver |
bool |
false |
|
packetFlowObserver.pfmType |
string |
“PacketFlowObserverUe” |
|
dlFbGen.isNr |
bool |
false |
True for the NR leg (set by NrNicUe on the nrDlFbGen submodule) |
dlFbGen.macNodeId |
int |
MacNodeId of the stack leg this generator belongs to (set by the NIC) |
|
dlFbGen.feedbackType |
string |
“ALLBANDS” |
Can be ALLBANDS, PREFERRED, WIDEBAND |
dlFbGen.rbAllocationType |
string |
“localized” |
Resource allocation type (“distributed” or “localized”) |
dlFbGen.fbPeriod |
int |
6tti |
Period for Periodic feedback in TTI |
dlFbGen.fbDelay |
int |
1tti |
Time interval between sensing and transmission in TTI |
dlFbGen.usePeriodic |
bool |
true |
Whether periodic feedback is used in addition to aperiodic feedback |
dlFbGen.initialTxMode |
string |
“SINGLE_ANTENNA_PORT0” |
Initial txMode (see LteCommon.h) |
dlFbGen.binderModule |
string |
“binder” |
|
dlFbGen.phyModule |
string |
“^.phy” |
|
qosFlowClassifier.sessionType |
string |
The type of the UE’s session (see LteUe): an Unstructured session has one QoS flow, the default one, which every packet is classified to without evaluating the rules; an Ethernet session’s frames are classified by the rules (a dscpAsQfi rule does not match a frame) |
|
sdap.nodeRole |
string |
Node role: “UE” or “gNB” - determines reflective QoS behavior |
|
sdap.connectionControlModule |
string |
“^.rrc.connectionControl” |
The node’s control-plane entry point, the bearer-selection authority on a lookup miss |
sdap.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) |
sdap.reflectiveQosTableModule |
string |
“” |
UE only: path to ReflectiveQosTable module (empty = disabled) |
sdap.useReflectiveQos |
bool |
false |
UE only |
sdap.reflectiveQosOverridesQfi |
bool |
false |
UE only: when a packet has both a classified QFI (QfiReq tag) and a reflective QoS match, true = the reflective QFI wins, false = the classified one; a packet with only one of the two always uses it |
reflectiveQosTable.timeout |
double |
30s |
Flow expiration timeout |
reflectiveQosTable.cleanupInterval |
double |
10s |
Interval for periodic cleanup of expired flows |
reflectiveQosTable.printFinalStats |
bool |
false |
Print final statistics at simulation end |
nrRlcMux.bearerManagementModule |
string |
“^.rrc.bearerManagement” |
|
nrPhy.isNr |
bool |
false |
True for the NR leg (set by NrNicUe/NrNicEnb on their PHY submodule) |
nrPhy.macNodeId |
int |
MacNodeId of the stack leg this PHY belongs to (set by the NIC) |
|
nrPhy.ueTxPower |
double |
26dBm |
|
nrPhy.eNodeBTxPower |
double |
46dBm |
|
nrPhy.microTxPower |
double |
30dBm |
|
nrPhy.txDirection |
string |
“OMNI” |
|
nrPhy.txAngle |
double |
0deg |
|
nrPhy.binderModule |
string |
“binder” |
|
nrPhy.channelModelModule |
string |
“^.channelModel[0]” |
Set to “^.nrChannelModel[0]” on an NR leg, see NrNicUe |
nrPhy.connectionControlModule |
string |
“^.rrc.connectionControl” |
|
nrPhy.d2dBinderModule |
string |
“d2dBinder” |
The network’s D2dBinder, which holds the D2D state |
nrPhy.d2dTxPower |
double |
26dBm |
|
nrPhy.d2dMulticastCaptureEffect |
bool |
true |
|
nrPhy.d2dMulticastCaptureEffectFactor |
string |
“RSRP” |
“RSRP”, otherwise distance-based |
nrPhy.enableMulticastD2DRangeCheck |
bool |
false |
|
nrPhy.multicastD2DRange |
double |
1000m |
|
nrDlFbGen.isNr |
bool |
false |
True for the NR leg (set by NrNicUe on the nrDlFbGen submodule) |
nrDlFbGen.macNodeId |
int |
MacNodeId of the stack leg this generator belongs to (set by the NIC) |
|
nrDlFbGen.feedbackType |
string |
“ALLBANDS” |
Can be ALLBANDS, PREFERRED, WIDEBAND |
nrDlFbGen.rbAllocationType |
string |
“localized” |
Resource allocation type (“distributed” or “localized”) |
nrDlFbGen.fbPeriod |
int |
6tti |
Period for Periodic feedback in TTI |
nrDlFbGen.fbDelay |
int |
1tti |
Time interval between sensing and transmission in TTI |
nrDlFbGen.usePeriodic |
bool |
true |
Whether periodic feedback is used in addition to aperiodic feedback |
nrDlFbGen.initialTxMode |
string |
“SINGLE_ANTENNA_PORT0” |
Initial txMode (see LteCommon.h) |
nrDlFbGen.binderModule |
string |
“binder” |
|
nrPacketFlowObserver.pdcpModule |
string |
“^” |
|
nrPacketFlowObserver.pfmType |
string |
“NrPacketFlowObserverUe” |
Source code¶
//
// Device-to-Device (D2D) capable NR User Equipment network interface. It extends
// ~NrNicUe by swapping in the D2D-capable NR MAC/PHY leaves and enabling the D2D
// mode controller, allowing direct UE-to-UE communication without routing traffic
// through the gNodeB. It is the NR counterpart of ~LteNicUeD2D.
//
// 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 NrNicUeD2D extends NrNicUe
{
parameters:
// NR stack: use the D2D-capable MAC/PHY leaves
nrMac.typename = default("NrMacUeD2D");
nrPhy.typename = default("PhyUeD2D");
// LTE leg: also runs the D2D-capable MAC/PHY leaves (the PHY carries
// the averageCqiD2D statistic)
mac.typename = default("LteMacUeD2D");
phy.typename = default("PhyUeD2D");
ip2nic.typename = default("Ip2NicD2D");
// Both legs previously ran with the NIC-wide D2D support enabled
rlcMux.typename = default("RlcMuxD2D");
rrc.bearerManagement.lteRlcUmEntityModuleType = default("simu5g.stack.d2d.rlc.LteRlcUmEntityD2D");
rrc.bearerManagement.nrRlcUmEntityModuleType = default("simu5g.stack.d2d.rlc.NrRlcUmEntityD2D");
nrRlcMux.typename = default("RlcMuxD2D");
// Use the D2D-capable channel model on both legs (matching the
// pre-separation defaults: TR 36.814 on the LTE leg, TR 38.901 on the NR leg)
channelModelType = default("D2dChannelModel");
nrChannelModelType = default("D2dChannelModel");
nrChannelModel[*].pathLossType = default("Tr38901");
rrc.typename = default("RrcD2D");
rrc.connectionControl.typename = default("ConnectionControlUeD2D");
rrc.nrConnectionControl.typename = default("ConnectionControlUeD2D");
bool d2dInitialMode = default(false);
}