LinkLayerNodeBase

Package: inet.node.base

compound module LinkLayerNodeBase

An extension of the basic node infrastructure with link layer functionality. Provides support for various network interfaces and link layer protocols, forming the foundation for network connectivity.

Adds an interface table and multiple types of network interfaces, including Ethernet, PPP, wireless, loopback, tunnel, and virtual interfaces. It also includes support for link layer protocols such as LLC, bridging, and various Ethernet encapsulation methods.

LinkLayerNodeBasellc.lowerLayerOut --> cb.in++ conditional: exists(llc)?llc.lowerLayerIn --> cb.out++ conditional: exists(llc)?cb.out++ --> bridging.upperLayerIn conditional: exists(bridging)?bridging.upperLayerOut --> cb.in++ conditional: exists(bridging)?bridging.lowerLayerOut --> bl.in++ conditional: exists(bridging)?bl.out++ --> bridging.lowerLayerIn conditional: exists(bridging)?cb.out++ --> bl.in++ conditional: !exists(bridging)?bl.out++ --> cb.in++ conditional: !exists(bridging)?bl.out++ --> li.in++li.out++ --> bl.in++bl.out++ --> ieee8021q.upperLayerIn conditional: exists(ieee8021q)?ieee8021q.upperLayerOut --> bl.in++ conditional: exists(ieee8021q)?bl.out++ --> ieee8021r.upperLayerIn conditional: exists(ieee8021r)?ieee8021r.upperLayerOut --> bl.in++ conditional: exists(ieee8021r)?bl.out++ --> ethernet.upperLayerIn conditional: exists(ethernet)?ethernet.upperLayerOut --> bl.in++ conditional: exists(ethernet)?ieee8021q.lowerLayerOut --> li.in++ conditional: exists(ieee8021q)?li.out++ --> ieee8021q.lowerLayerIn conditional: exists(ieee8021q)?ieee8021r.lowerLayerOut --> li.in++ conditional: exists(ieee8021r)?li.out++ --> ieee8021r.lowerLayerIn conditional: exists(ieee8021r)?ethernet.lowerLayerOut --> li.in++ conditional: exists(ethernet)?li.out++ --> ethernet.lowerLayerIn conditional: exists(ethernet)?radioIn[i] --> wlan[i].radioIn for i=0..sizeof(radioIn)-1⦀ethg[i] <--> eth[i].phys for i=0..sizeof(ethg)-1⦀pppg[i] <--> ppp[i].phys for i=0..sizeof(pppg)-1⦀li.out++ --> lo[i].upperLayerIn for i=0..numLoInterfaces-1⦀lo[i].upperLayerOut --> li.in++ for i=0..numLoInterfaces-1⦀wlan[i].upperLayerOut --> li.in++ for i=0..sizeof(radioIn)-1⦀wlan[i].upperLayerIn --> li.out++ for i=0..sizeof(radioIn)-1⦀eth[i].upperLayerOut --> li.in++ for i=0..sizeof(ethg)-1⦀eth[i].upperLayerIn --> li.out++ for i=0..sizeof(ethg)-1⦀ppp[i].upperLayerOut --> li.in++ for i=0..sizeof(pppg)-1⦀ppp[i].upperLayerIn --> li.out++ for i=0..sizeof(pppg)-1⦀tun[i].upperLayerOut --> li.in++ for i=0..numTunInterfaces-1⦀tun[i].upperLayerIn --> li.out++ for i=0..numTunInterfaces-1⦀virt[i].upperLayerOut --> li.in++ for i=0..numVirtInterfaces-1⦀virt[i].upperLayerIn --> li.out++ for i=0..numVirtInterfaces-1⦀status: inet.common.lifecycle.NodeStatus inherited from NodeBase Keeps track of the status of the network node (up, down, etc.) for other modules, and also displa... Source: status: NodeStatus if hasStatus { @display("p=125,80;is=s"); }statusclock: inet.clock.contract.IClock (like IClock) inherited from NodeBase IClock: Interface for clock models. Source: clock: <default("")> like IClock if typename != "" { @display("p=125,320;is=s"); }clockenergyStorage: inet.power.contract.IEnergyStorage (like IEnergyStorage) inherited from NodeBase IEnergyStorage: The energy storage models describe devices that absorb energy produced by generators, and provide... Source: energyStorage: <default("")> like IEnergyStorage if typename != "" { @display("p=125,400;is=s"); }energyStorageenergyManagement: inet.power.contract.IEnergyManagement (like IEnergyManagement) inherited from NodeBase IEnergyManagement: The energy management models monitor an energy storage, estimate its state, and control the consu... Source: energyManagement: <default("")> like IEnergyManagement if typename != "" { @display("p=125,480;is=s"); }energyManagementenergyGenerator: inet.power.contract.IEnergyGenerator (like IEnergyGenerator) inherited from NodeBase IEnergyGenerator: The energy generator models describe the energy generation process of devices over time. Source: energyGenerator: <default("")> like IEnergyGenerator if typename != "" { @display("p=125,560;is=s"); }energyGeneratormobility: inet.mobility.contract.IMobility (like IMobility) inherited from NodeBase IMobility: The module interface for mobility models. Source: mobility: <default("")> like IMobility if typename != "" { @display("p=125,160;is=s"); }mobilitymeasurer: inet.common.IMeasurer (like IMeasurer) inherited from NodeBase IMeasurer: Interface for all standalone measurement modules. Source: measurer: <default("")> like IMeasurer if typename != "" { @display("p=125,640;is=s"); }measurerenvironment: inet.common.ExternalEnvironment inherited from NodeBase Executes a setup command on the host OS during initialization and another teardown command during... Source: environment: ExternalEnvironment if hasEnvironment { @display("p=125,800;is=s"); }environmentpcapRecorder[numPcapRecorders]: inet.common.packet.recorder.PcapRecorder Records PCAP traces of frames sent/received by other modules within the same host. Source: pcapRecorder[numPcapRecorders]: PcapRecorder { @display("p=125,720;is=s"); }pcapRecorder[numPcapRecorders]interfaceTable: inet.networklayer.common.InterfaceTable Keeps the table of network interfaces. Source: interfaceTable: InterfaceTable { @display("p=125,240;is=s"); }interfaceTablellc: inet.linklayer.contract.IIeee8022Llc (like IIeee8022Llc) Source: llc: <default("")> like IIeee8022Llc if typename != "" { @display("p=375,525"); }llccb: inet.common.MessageDispatcher Facilitates the interconnection of applications, protocols, and network interfaces, dispatching m... Source: cb: MessageDispatcher { @display("p=750,600;b=1000,5"); }cbbridging: inet.protocolelement.contract.IProtocolLayer (like IProtocolLayer) IProtocolLayer: Interface for all protocol layer modules that connect to a higher and to a lower protocol layer,... Source: bridging: <default("")> like IProtocolLayer if typename != "" { @display("p=750,675"); }bridgingbl: inet.common.MessageDispatcher Facilitates the interconnection of applications, protocols, and network interfaces, dispatching m... Source: bl: MessageDispatcher { @display("p=750,750;b=1000,5"); }blethernet: inet.linklayer.ethernet.basic.EthernetEncapsulation (like IEthernetLayer) EthernetEncapsulation: Performs Ethernet II or Ethernet with LLC/SNAP encapsulation/decapsulation. IEthernetLayer: Module interface for Ethernet protocol layer implementations. Source: ethernet: <default(sizeof(ethg) > 0 ? "EthernetEncapsulation" : "")> like IEthernetLayer if typename != "" { @display("p=375,825"); }ethernetieee8021q: inet.linklayer.contract.IIeee8021qLayer (like IIeee8021qLayer) Source: ieee8021q: <default("")> like IIeee8021qLayer if typename != "" { @display("p=525,825"); }ieee8021qieee8021r: inet.linklayer.contract.IIeee8021rLayer (like IIeee8021rLayer) Source: ieee8021r: <default("")> like IIeee8021rLayer if typename != "" { @display("p=675,825"); }ieee8021rli: inet.common.MessageDispatcher Facilitates the interconnection of applications, protocols, and network interfaces, dispatching m... Source: li: MessageDispatcher { @display("p=750,900;b=1000,5,,,,1"); }lilo[numLoInterfaces]: inet.linklayer.loopback.LoopbackInterface (like ILoopbackInterface) LoopbackInterface: Implements a loopback network interface. ILoopbackInterface: Interface for loopback network interfaces. Source: lo[numLoInterfaces]: <default("LoopbackInterface")> like ILoopbackInterface { @display("p=750,975,row,150"); }lo[numLoInterfaces]wlan[numWlanInterfaces]: inet.linklayer.ieee80211.Ieee80211Interface (like IWirelessInterface) Ieee80211Interface: Implements an IEEE 802.11 network interface. IWirelessInterface: Interface for wireless network interfaces. Source: wlan[numWlanInterfaces]: <default("Ieee80211Interface")> like IWirelessInterface { @display("p=375,1000,row,150;q=queue"); }#wlan[numWlanInterfaces]ppp[sizeof(pppg)]: inet.linklayer.ppp.PppInterface (like IPppInterface) PppInterface: Implements a PPP network interface. IPppInterface: Interface for PPP network interfaces. Source: ppp[sizeof(pppg)]: <default("PppInterface")> like IPppInterface { @display("p=300,975,row,150;q=txQueue"); }#ppp[sizeof(pppg)]eth[sizeof(ethg)]: inet.linklayer.ethernet.basic.EthernetInterface (like IEthernetInterface) EthernetInterface: Represents an Ethernet network interface. IEthernetInterface: Interface for Ethernet network interfaces. Source: eth[sizeof(ethg)]: <default("EthernetInterface")> like IEthernetInterface { @display("p=900,975,row,150;q=txQueue"); }#eth[sizeof(ethg)]tun[numTunInterfaces]: inet.linklayer.tun.TunInterface (like ITunnelInterface) TunInterface: Implements a (simulated) TUN network interface. ITunnelInterface: Interface for tunnel network interfaces. Source: tun[numTunInterfaces]: <default("TunInterface")> like ITunnelInterface { @display("p=975,1000,row,150;q=txQueue"); }#tun[numTunInterfaces]virt[numVirtInterfaces]: inet.linklayer.virtual.VirtualInterface (like IVirtualInterface) VirtualInterface: Implements a virtual network interface. IVirtualInterface: Interface for virtual network interfaces. Source: virt[numVirtInterfaces]: <default("VirtualInterface")> like IVirtualInterface { @display("p=975,1000,row,150;q=txQueue"); }#virt[numVirtInterfaces]

Usage diagram

Inheritance diagram

Known subclasses

Name

Type

Description

NetworkLayerNodeBase

compound module

An extension of the link layer node base with network layer functionality. Provides support for multiple network protocols, including IPv4 and IPv6.

Extends

Name

Type

Description

NodeBase

compound module

The fundamental infrastructure for all network nodes focusing on non-communication aspects of network nodes.

Parameters

Name

Type

Default value

Description

displayStringTextFormat

string

“”

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

hasStatus

bool

false

hasEnvironment

bool

false

osgModel

string

“”

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

osgModelColor

string

“”

Tint color, no colorization by default

canvasImage

string

“”

Image for canvas visualization, no image by default

canvasImageColor

string

“”

Tint color, no colorization by default

recordPcap

bool

false

numPcapRecorders

int

recordPcap ? 1 : 0

numLoInterfaces

int

1

numWlanInterfaces

int

0

numEthInterfaces

int

0

Minimum number of Ethernet interfaces

numPppInterfaces

int

0

Minimum number of PPP interfaces

numTunInterfaces

int

0

numVirtInterfaces

int

0

fcsMode

string

“declared”

Properties

Name

Value

Description

class

NodeBase

display

bgb=1256,1125

labels

node,ethernet-node,wireless-node

networkNode

Gates

Name

Direction

Size

Description

radioIn [ ]

input

numWlanInterfaces

pppg [ ]

inout

numPppInterfaces

ethg [ ]

inout

numEthInterfaces

Unassigned submodule parameters

Name

Type

Default value

Description

status.displayStringTextFormat

string

“{stateStr}”

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

status.initialStatus

string

“UP”

Initial status of the network node

environment.displayStringTextFormat

string

“”

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

environment.initStage

int

0

Initialization stage for the setup command

environment.globalNamespace

bool

false

Create new network namespaces under /var/run/netns/ (Linux only)

environment.namespace

string

“”

Name of the host OS network namespace (optional) (Linux only)

environment.setupCommand

string

“”

A host OS system command

environment.teardownCommand

string

“”

A host OS system command

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

string

“wlan[*] eth[*] ppp[*]”

Space-separated list of sibling module names to listen on

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

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

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

cb.interfaceTableModule

string

Module path to the InterfaceTable module

cb.forwardServiceRegistration

bool

true

cb.forwardProtocolRegistration

bool

true

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

cb.serviceMapping

object

{}

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

cb.protocolMapping

object

{}

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

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

bl.interfaceTableModule

string

Module path to the InterfaceTable module

bl.forwardServiceRegistration

bool

true

bl.forwardProtocolRegistration

bool

true

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

bl.serviceMapping

object

{}

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

bl.protocolMapping

object

{}

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

ethernet.displayStringTextFormat

string

“passed up: {totalFromMAC}\nsent: {totalFromHigherLayer}”

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

ethernet.registerProtocol

bool

false

FIXME //KLUDGE should redesign place of EthernetEncapsulation and LLC modules

ethernet.interfaceTableModule

string

The path to the InterfaceTable module

ethernet.fcsMode

string

“declared”

ethernet.stopOperationExtraTime

double

-1s

Extra time after the lifecycle stop operation has finished

ethernet.stopOperationTimeout

double

2s

Timeout value for the lifecycle stop operation

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

li.interfaceTableModule

string

Module path to the InterfaceTable module

li.forwardServiceRegistration

bool

true

li.forwardProtocolRegistration

bool

true

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

li.serviceMapping

object

{}

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

li.protocolMapping

object

{}

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

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

lo.pcapRecorder.verbose

bool

true

Whether to log packets on the module output

lo.pcapRecorder.recordEmptyPackets

bool

true

Specifies if zero length packets are recorded or not

lo.pcapRecorder.enableConvertingPackets

bool

true

Specifies if converting packets to link type is allowed or not

lo.pcapRecorder.pcapFile

string

“”

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

lo.pcapRecorder.fileFormat

string

“pcapng”

lo.pcapRecorder.snaplen

int

65535

Maximum number of bytes to record per packet

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

lo.pcapRecorder.dumpBadFrames

bool

true

Enable dump of frames with hasBitError

lo.pcapRecorder.sendingSignalNames

string

“transmissionEnded”

Space-separated list of outbound packet signals to subscribe to

lo.pcapRecorder.receivingSignalNames

string

“receptionEnded”

Space-separated list of inbound packet signals to subscribe to

lo.pcapRecorder.dumpProtocols

string

“ethernetmac ppp ieee80211mac”

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

lo.pcapRecorder.packetFilter

object

“*”

Which packets are considered, matches all packets by default

lo.pcapRecorder.helpers

string

“”

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

lo.pcapRecorder.alwaysFlush

bool

false

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

lo.lo.displayStringTextFormat

string

“rcv:{numRcvdOK} snt:{numSent}”

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

lo.lo.interfaceTableModule

string

The path to the InterfaceTable module

lo.lo.mtu

int

4470B

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

wlan.pcapRecorder.verbose

bool

true

Whether to log packets on the module output

wlan.pcapRecorder.recordEmptyPackets

bool

true

Specifies if zero length packets are recorded or not

wlan.pcapRecorder.enableConvertingPackets

bool

true

Specifies if converting packets to link type is allowed or not

wlan.pcapRecorder.pcapFile

string

“”

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

wlan.pcapRecorder.fileFormat

string

“pcapng”

wlan.pcapRecorder.snaplen

int

65535

Maximum number of bytes to record per packet

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

wlan.pcapRecorder.dumpBadFrames

bool

true

Enable dump of frames with hasBitError

wlan.pcapRecorder.sendingSignalNames

string

“transmissionEnded”

Space-separated list of outbound packet signals to subscribe to

wlan.pcapRecorder.receivingSignalNames

string

“receptionEnded”

Space-separated list of inbound packet signals to subscribe to

wlan.pcapRecorder.dumpProtocols

string

“ethernetmac ppp ieee80211mac”

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

wlan.pcapRecorder.packetFilter

object

“*”

Which packets are considered, matches all packets by default

wlan.pcapRecorder.helpers

string

“”

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

wlan.pcapRecorder.alwaysFlush

bool

false

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

wlan.mib.displayStringTextFormat

string

“Address: {address}{ssidStr}\n{modeStr}{stationTypeStr}{qosStr}{associatedStr}”

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

wlan.agent.displayStringTextFormat

string

“”

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

wlan.agent.interfaceTableModule

string

The path to the InterfaceTable module

wlan.agent.mibModule

string

wlan.agent.activeScan

bool

true

Selects between active and passive scanning

wlan.agent.channelsToScan

string

“”

List of channel numbers to scan (space delimited); empty means all channels

wlan.agent.probeDelay

double

100ms

Delay before sending a probe request during active scanning

wlan.agent.minChannelTime

double

150ms

Min interval to spend on a channel during active scanning

wlan.agent.maxChannelTime

double

300ms

Channel time for passive scanning, and max channel time for active scanning

wlan.agent.authenticationTimeout

double

5s

Timeout for the authentication procedure

wlan.agent.associationTimeout

double

5s

Timeout for the association procedure

wlan.agent.startingTime

double

-1s

Agent starting time.

wlan.agent.defaultSsid

string

“”

List of allowed SSIDs to connect to; leave empty for no filtering

wlan.mgmt.displayStringTextFormat

string

“”

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

wlan.mgmt.interfaceTableModule

string

The path to the InterfaceTable module

wlan.mgmt.numChannels

int

1

Number of channels to scan

wlan.mgmt.mibModule

string

wlan.mgmt.macModule

string

The path to the MAC module

wlan.mac.dcf.channelAccess.pendingQueue.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

wlan.mac.dcf.channelAccess.pendingQueue.packetCapacity

int

100

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

wlan.mac.dcf.channelAccess.pendingQueue.dataCapacity

int

-1b

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

wlan.mac.dcf.channelAccess.pendingQueue.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

wlan.mac.dcf.channelAccess.pendingQueue.comparatorClass

string

“inet::ieee80211::MgmtOverDataComparator”

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

wlan.mac.dcf.channelAccess.pendingQueue.bufferModule

string

“”

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

wlan.mac.dcf.channelAccess.inProgressFrames.displayStringTextFormat

string

“{numInProgress} packets”

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

wlan.mac.dcf.channelAccess.inProgressFrames.pendingQueueModule

string

“^.pendingQueue”

wlan.mac.dcf.channelAccess.inProgressFrames.originatorMacDataServiceModule

string

“^.^.originatorMacDataService”

wlan.mac.dcf.channelAccess.inProgressFrames.ackHandlerModule

string

“^.^.ackHandler”

wlan.mac.dcf.channelAccess.contention.displayStringTextFormat

string

“{fsmState}”

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

wlan.mac.dcf.channelAccess.contention.initialChannelBusy

bool

true

Assume that the channel was busy before the simulation started

wlan.mac.dcf.channelAccess.contention.backoffOptimization

bool

true

We can pretend the frame has arrived into the queue a little bit earlier, and maybe able to start transmitting immediately

wlan.mac.dcf.originatorMacDataService.fragmentationPolicy.displayStringTextFormat

string

“”

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

wlan.mac.dcf.originatorMacDataService.fragmentationPolicy.fragmentationThreshold

int

1500B

wlan.mac.dcf.rateSelection.displayStringTextFormat

string

“”

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

wlan.mac.dcf.rateSelection.multicastFrameBitrate

double

-1bps

wlan.mac.dcf.rateSelection.responseAckFrameBitrate

double

-1bps

wlan.mac.dcf.rateSelection.responseCtsFrameBitrate

double

-1bps

wlan.mac.dcf.rateSelection.dataFrameBitrate

double

-1bps

Fastest

wlan.mac.dcf.rateSelection.dataFrameBandwidth

double

nan Hz

Unspecified by default

wlan.mac.dcf.rateSelection.dataFrameNumSpatialStreams

int

-1

Unspecified by default

wlan.mac.dcf.rateSelection.mgmtFrameBitrate

double

-1bps

Fastest

wlan.mac.dcf.rateSelection.controlFrameBitrate

double

-1bps

wlan.mac.dcf.recoveryProcedure.displayStringTextFormat

string

“”

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

wlan.mac.dcf.recoveryProcedure.shortRetryLimit

int

7

wlan.mac.dcf.recoveryProcedure.longRetryLimit

int

4

wlan.mac.dcf.originatorProtectionMechanism.displayStringTextFormat

string

“”

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

wlan.mac.dcf.originatorProtectionMechanism.rateSelectionModule

string

wlan.mac.dcf.ackHandler.displayStringTextFormat

string

“”

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

wlan.mac.dcf.originatorAckPolicy.displayStringTextFormat

string

“”

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

wlan.mac.dcf.originatorAckPolicy.rateSelectionModule

string

wlan.mac.dcf.originatorAckPolicy.ackTimeout

double

-1s

wlan.mac.dcf.recipientAckPolicy.displayStringTextFormat

string

“”

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

wlan.mac.dcf.recipientAckPolicy.rateSelectionModule

string

wlan.mac.dcf.rtsPolicy.displayStringTextFormat

string

“”

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

wlan.mac.dcf.rtsPolicy.rateSelectionModule

string

wlan.mac.dcf.rtsPolicy.ctsTimeout

double

-1s

wlan.mac.dcf.rtsPolicy.rtsThreshold

int

2346B

wlan.mac.dcf.ctsPolicy.displayStringTextFormat

string

“”

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

wlan.mac.dcf.ctsPolicy.rxModule

string

wlan.mac.dcf.ctsPolicy.rateSelectionModule

string

wlan.mac.hcf.edca.edcaf.pendingQueue.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

wlan.mac.hcf.edca.edcaf.pendingQueue.packetCapacity

int

100

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

wlan.mac.hcf.edca.edcaf.pendingQueue.dataCapacity

int

-1b

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

wlan.mac.hcf.edca.edcaf.pendingQueue.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

wlan.mac.hcf.edca.edcaf.pendingQueue.comparatorClass

string

“inet::ieee80211::MgmtOverDataComparator”

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

wlan.mac.hcf.edca.edcaf.pendingQueue.bufferModule

string

“”

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

wlan.mac.hcf.edca.edcaf.inProgressFrames.displayStringTextFormat

string

“{numInProgress} packets”

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

wlan.mac.hcf.edca.edcaf.inProgressFrames.pendingQueueModule

string

“^.pendingQueue”

wlan.mac.hcf.edca.edcaf.inProgressFrames.originatorMacDataServiceModule

string

“^.^.^.originatorMacDataService”

wlan.mac.hcf.edca.edcaf.inProgressFrames.ackHandlerModule

string

“^.ackHandler”

wlan.mac.hcf.edca.edcaf.contention.displayStringTextFormat

string

“{fsmState}”

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

wlan.mac.hcf.edca.edcaf.contention.initialChannelBusy

bool

true

Assume that the channel was busy before the simulation started

wlan.mac.hcf.edca.edcaf.contention.backoffOptimization

bool

true

We can pretend the frame has arrived into the queue a little bit earlier, and maybe able to start transmitting immediately

wlan.mac.hcf.edca.edcaf.ackHandler.displayStringTextFormat

string

“”

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

wlan.mac.hcf.edca.edcaf.txopProcedure.displayStringTextFormat

string

“”

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

wlan.mac.hcf.edca.edcaf.txopProcedure.txopLimit

double

-1s

wlan.mac.hcf.edca.edcaf.recoveryProcedure.displayStringTextFormat

string

“”

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

wlan.mac.hcf.edca.edcaf.recoveryProcedure.shortRetryLimit

int

7

wlan.mac.hcf.edca.edcaf.recoveryProcedure.longRetryLimit

int

4

wlan.mac.hcf.edca.collisionController.displayStringTextFormat

string

“”

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

wlan.mac.hcf.edca.mgmtAndNonQoSRecoveryProcedure.displayStringTextFormat

string

“”

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

wlan.mac.hcf.edca.mgmtAndNonQoSRecoveryProcedure.shortRetryLimit

int

7

wlan.mac.hcf.edca.mgmtAndNonQoSRecoveryProcedure.longRetryLimit

int

4

wlan.mac.hcf.hcca.displayStringTextFormat

string

“”

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

wlan.mac.hcf.originatorMacDataService.msduAggregationPolicy.displayStringTextFormat

string

“”

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

wlan.mac.hcf.originatorMacDataService.msduAggregationPolicy.subframeNumThreshold

int

-1

Minimum number of subframes needed to compose an A-MSDU. (-1 means it won’t be checked)

wlan.mac.hcf.originatorMacDataService.msduAggregationPolicy.aggregationLengthThreshold

int

-1

The minimum length for an aggregated payload necessary to create an A-MSDU (-1 means it won’t be checked).

wlan.mac.hcf.originatorMacDataService.msduAggregationPolicy.maxAMsduSize

int

4065

-1 means infinity

wlan.mac.hcf.originatorMacDataService.msduAggregationPolicy.qOsCheck

bool

true

Turns on/off the check of the presence of the QoS flag (false means off – this is needed for aggregation in DCF mode).

wlan.mac.hcf.originatorMacDataService.mpduAggregationPolicy.displayStringTextFormat

string

“”

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

wlan.mac.hcf.originatorMacDataService.fragmentationPolicy.displayStringTextFormat

string

“”

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

wlan.mac.hcf.originatorMacDataService.fragmentationPolicy.fragmentationThreshold

int

1500B

wlan.mac.hcf.singleProtectionMechanism.displayStringTextFormat

string

“”

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

wlan.mac.hcf.singleProtectionMechanism.rateSelectionModule

string

wlan.mac.hcf.rateSelection.displayStringTextFormat

string

“”

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

wlan.mac.hcf.rateSelection.multicastFrameBitrate

double

-1bps

wlan.mac.hcf.rateSelection.responseAckFrameBitrate

double

-1bps

wlan.mac.hcf.rateSelection.responseBlockAckFrameBitrate

double

-1bps

wlan.mac.hcf.rateSelection.responseCtsFrameBitrate

double

-1bps

wlan.mac.hcf.rateSelection.dataFrameBitrate

double

-1bps

Fastest

wlan.mac.hcf.rateSelection.dataFrameBandwidth

double

nan Hz

Unspecified by default

wlan.mac.hcf.rateSelection.dataFrameNumSpatialStreams

int

-1

Unspecified by default

wlan.mac.hcf.rateSelection.mgmtFrameBitrate

double

-1bps

Fastest

wlan.mac.hcf.rateSelection.controlFrameBitrate

double

-1bps

wlan.mac.hcf.originatorAckPolicy.displayStringTextFormat

string

“”

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

wlan.mac.hcf.originatorAckPolicy.rateSelectionModule

string

wlan.mac.hcf.originatorAckPolicy.blockAckReqThreshold

int

5

wlan.mac.hcf.originatorAckPolicy.maxBlockAckPolicyFrameLength

int

1000B

wlan.mac.hcf.originatorAckPolicy.blockAckTimeout

double

-1s

wlan.mac.hcf.originatorAckPolicy.ackTimeout

double

-1s

wlan.mac.hcf.recipientAckPolicy.displayStringTextFormat

string

“”

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

wlan.mac.hcf.recipientAckPolicy.rateSelectionModule

string

wlan.mac.hcf.rtsPolicy.displayStringTextFormat

string

“”

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

wlan.mac.hcf.rtsPolicy.rateSelectionModule

string

wlan.mac.hcf.rtsPolicy.ctsTimeout

double

-1s

wlan.mac.hcf.rtsPolicy.rtsThreshold

int

2346B

wlan.mac.hcf.ctsPolicy.displayStringTextFormat

string

“”

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

wlan.mac.hcf.ctsPolicy.rxModule

string

wlan.mac.hcf.ctsPolicy.rateSelectionModule

string

wlan.mac.hcf.originatorBlockAckAgreementPolicy.displayStringTextFormat

string

“”

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

wlan.mac.hcf.originatorBlockAckAgreementPolicy.delayedAckPolicySupported

bool

false

wlan.mac.hcf.originatorBlockAckAgreementPolicy.aMsduSupported

bool

true

wlan.mac.hcf.originatorBlockAckAgreementPolicy.maximumAllowedBufferSize

int

64

wlan.mac.hcf.originatorBlockAckAgreementPolicy.blockAckTimeoutValue

double

0s

0 means that it depends on the originator

wlan.mac.hcf.recipientBlockAckAgreementPolicy.displayStringTextFormat

string

“”

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

wlan.mac.hcf.recipientBlockAckAgreementPolicy.delayedAckPolicySupported

bool

false

wlan.mac.hcf.recipientBlockAckAgreementPolicy.aMsduSupported

bool

true

wlan.mac.hcf.recipientBlockAckAgreementPolicy.maximumAllowedBufferSize

int

64

wlan.mac.hcf.recipientBlockAckAgreementPolicy.blockAckTimeoutValue

double

0s

0 means that it depends on the originator

wlan.mac.ds.displayStringTextFormat

string

“”

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

wlan.mac.ds.mibModule

string

wlan.mac.rx.displayStringTextFormat

string

“{rxStatus}”

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

wlan.mac.tx.displayStringTextFormat

string

“{txFramePrefix}{txState}”

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

wlan.mac.tx.rxModule

string

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

ppp.pcapRecorder.verbose

bool

true

Whether to log packets on the module output

ppp.pcapRecorder.recordEmptyPackets

bool

true

Specifies if zero length packets are recorded or not

ppp.pcapRecorder.enableConvertingPackets

bool

true

Specifies if converting packets to link type is allowed or not

ppp.pcapRecorder.pcapFile

string

“”

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

ppp.pcapRecorder.fileFormat

string

“pcapng”

ppp.pcapRecorder.snaplen

int

65535

Maximum number of bytes to record per packet

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

ppp.pcapRecorder.dumpBadFrames

bool

true

Enable dump of frames with hasBitError

ppp.pcapRecorder.sendingSignalNames

string

“transmissionEnded”

Space-separated list of outbound packet signals to subscribe to

ppp.pcapRecorder.receivingSignalNames

string

“receptionEnded”

Space-separated list of inbound packet signals to subscribe to

ppp.pcapRecorder.dumpProtocols

string

“ethernetmac ppp ieee80211mac”

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

ppp.pcapRecorder.packetFilter

object

“*”

Which packets are considered, matches all packets by default

ppp.pcapRecorder.helpers

string

“”

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

ppp.pcapRecorder.alwaysFlush

bool

false

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

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

ppp.queue.packetCapacity

int

10000

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

ppp.queue.dataCapacity

int

-1b

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

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

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

ppp.queue.bufferModule

string

“”

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

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

ppp.ppp.interfaceTableModule

string

The path to the InterfaceTable module

ppp.ppp.sendRawBytes

bool

false

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

ppp.ppp.mtu

int

4470B

ppp.ppp.stopOperationExtraTime

double

-1s

Extra time after lifecycle stop operation finished

ppp.ppp.stopOperationTimeout

double

2s

Timeout value for lifecycle stop operation

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

eth.pcapRecorder.verbose

bool

true

Whether to log packets on the module output

eth.pcapRecorder.recordEmptyPackets

bool

true

Specifies if zero length packets are recorded or not

eth.pcapRecorder.enableConvertingPackets

bool

true

Specifies if converting packets to link type is allowed or not

eth.pcapRecorder.pcapFile

string

“”

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

eth.pcapRecorder.fileFormat

string

“pcapng”

eth.pcapRecorder.snaplen

int

65535

Maximum number of bytes to record per packet

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

eth.pcapRecorder.dumpBadFrames

bool

true

Enable dump of frames with hasBitError

eth.pcapRecorder.sendingSignalNames

string

“transmissionEnded”

Space-separated list of outbound packet signals to subscribe to

eth.pcapRecorder.receivingSignalNames

string

“receptionEnded”

Space-separated list of inbound packet signals to subscribe to

eth.pcapRecorder.dumpProtocols

string

“ethernetmac ppp ieee80211mac”

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

eth.pcapRecorder.packetFilter

object

“*”

Which packets are considered, matches all packets by default

eth.pcapRecorder.helpers

string

“”

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

eth.pcapRecorder.alwaysFlush

bool

false

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

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

tun.pcapRecorder.verbose

bool

true

Whether to log packets on the module output

tun.pcapRecorder.recordEmptyPackets

bool

true

Specifies if zero length packets are recorded or not

tun.pcapRecorder.enableConvertingPackets

bool

true

Specifies if converting packets to link type is allowed or not

tun.pcapRecorder.pcapFile

string

“”

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

tun.pcapRecorder.fileFormat

string

“pcapng”

tun.pcapRecorder.snaplen

int

65535

Maximum number of bytes to record per packet

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

tun.pcapRecorder.dumpBadFrames

bool

true

Enable dump of frames with hasBitError

tun.pcapRecorder.sendingSignalNames

string

“transmissionEnded”

Space-separated list of outbound packet signals to subscribe to

tun.pcapRecorder.receivingSignalNames

string

“receptionEnded”

Space-separated list of inbound packet signals to subscribe to

tun.pcapRecorder.dumpProtocols

string

“ethernetmac ppp ieee80211mac”

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

tun.pcapRecorder.packetFilter

object

“*”

Which packets are considered, matches all packets by default

tun.pcapRecorder.helpers

string

“”

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

tun.pcapRecorder.alwaysFlush

bool

false

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

tun.tun.displayStringTextFormat

string

“”

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

tun.tun.interfaceTableModule

string

The path to the InterfaceTable module

tun.tun.mtu

int

1500B

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

virt.pcapRecorder.verbose

bool

true

Whether to log packets on the module output

virt.pcapRecorder.recordEmptyPackets

bool

true

Specifies if zero length packets are recorded or not

virt.pcapRecorder.enableConvertingPackets

bool

true

Specifies if converting packets to link type is allowed or not

virt.pcapRecorder.pcapFile

string

“”

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

virt.pcapRecorder.fileFormat

string

“pcapng”

virt.pcapRecorder.snaplen

int

65535

Maximum number of bytes to record per packet

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

virt.pcapRecorder.dumpBadFrames

bool

true

Enable dump of frames with hasBitError

virt.pcapRecorder.sendingSignalNames

string

“transmissionEnded”

Space-separated list of outbound packet signals to subscribe to

virt.pcapRecorder.receivingSignalNames

string

“receptionEnded”

Space-separated list of inbound packet signals to subscribe to

virt.pcapRecorder.dumpProtocols

string

“ethernetmac ppp ieee80211mac”

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

virt.pcapRecorder.packetFilter

object

“*”

Which packets are considered, matches all packets by default

virt.pcapRecorder.helpers

string

“”

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

virt.pcapRecorder.alwaysFlush

bool

false

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

virt.tunnel.displayStringTextFormat

string

“”

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

virt.tunnel.interfaceTableModule

string

virt.tunnel.realInterface

string

virt.tunnel.protocol

string

vlanId != -1 ? “ieee8021qctag” : “”

virt.tunnel.address

string

“copy”

virt.tunnel.vlanId

int

-1

virt.tunnel.steal

bool

vlanId != -1

Source code

//
// An extension of the basic node infrastructure with link layer
// functionality. Provides support for various network interfaces and link layer
// protocols, forming the foundation for network connectivity.
//
// Adds an interface table and multiple types of network interfaces,
// including Ethernet, PPP, wireless, loopback, tunnel, and virtual interfaces.
// It also includes support for link layer protocols such as LLC, bridging,
// and various Ethernet encapsulation methods.
//
module LinkLayerNodeBase extends NodeBase like IEthernetNetworkNode
{
    parameters:
        bool recordPcap = default(false);
        int numPcapRecorders = default(recordPcap ? 1 : 0);
        int numLoInterfaces = default(1);
        int numWlanInterfaces = default(0);
        int numEthInterfaces = default(0);  // Minimum number of Ethernet interfaces
        int numPppInterfaces = default(0);  // Minimum number of PPP interfaces
        int numTunInterfaces = default(0);
        int numVirtInterfaces = default(0);
        string fcsMode @enum("declared","computed") = default("declared");
        pcapRecorder[*].pcapFile = default("${resultdir}/${configname}-#${runnumber}" + fullPath() + ".pcap");
        mobility.typename = default(numWlanInterfaces > 0 ? "StationaryMobility" : "");
        *.interfaceTableModule = default(absPath(".interfaceTable"));
        *.fcsMode = this.fcsMode;
        wlan[*].radio.antenna.mobilityModule = default("^.^.^.mobility");
        ethernet.registerProtocol = default(true);
        @figure[linkLayer](type=rectangle; pos=250,458; size=1000,434; fillColor=#0000ff; lineColor=#808080; cornerRadius=5; fillOpacity=0.1);
        @figure[linkLayer.title](type=text; pos=1245,463; anchor=ne; text="link layer");
        @figure[interfaceLayer](type=rectangle; pos=250,908; size=1000,210; fillColor=#00ffff; lineColor=#808080; cornerRadius=5; fillOpacity=0.1);
        @figure[interfaceLayer.title](type=text; pos=1245,913; anchor=ne; text="interface layer");
    gates:
        input radioIn[numWlanInterfaces] @directIn;
        inout pppg[numPppInterfaces] @labels(PppFrame-conn) @allowUnconnected;
        inout ethg[numEthInterfaces] @labels(EtherFrame-conn) @allowUnconnected;
    submodules:
        pcapRecorder[numPcapRecorders]: PcapRecorder {
            @display("p=125,720;is=s");
        }
        interfaceTable: InterfaceTable {
            @display("p=125,240;is=s");
        }
        llc: <default("")> like IIeee8022Llc if typename != "" {
            @display("p=375,525");
        }
        cb: MessageDispatcher {
            @display("p=750,600;b=1000,5");
        }
        bridging: <default("")> like IProtocolLayer if typename != "" {
            @display("p=750,675");
        }
        bl: MessageDispatcher {
            @display("p=750,750;b=1000,5");
        }
        ethernet: <default(sizeof(ethg) > 0 ? "EthernetEncapsulation" : "")> like IEthernetLayer if typename != "" {
            @display("p=375,825");
        }
        ieee8021q: <default("")> like IIeee8021qLayer if typename != "" {
            @display("p=525,825");
        }
        ieee8021r: <default("")> like IIeee8021rLayer if typename != "" {
            @display("p=675,825");
        }
        li: MessageDispatcher {
            @display("p=750,900;b=1000,5,,,,1");
        }
        lo[numLoInterfaces]: <default("LoopbackInterface")> like ILoopbackInterface {
            @display("p=750,975,row,150");
        }
        // TODO move WLAN interfaces after Ethernet interfaces, but it changes IP address assignment and breaks examples/inet/configurator/complex.ini
        wlan[numWlanInterfaces]: <default("Ieee80211Interface")> like IWirelessInterface {
            @display("p=375,1000,row,150;q=queue");
        }
        ppp[sizeof(pppg)]: <default("PppInterface")> like IPppInterface {
            @display("p=300,975,row,150;q=txQueue");
        }
        eth[sizeof(ethg)]: <default("EthernetInterface")> like IEthernetInterface {
            @display("p=900,975,row,150;q=txQueue");
        }
        tun[numTunInterfaces]: <default("TunInterface")> like ITunnelInterface {
            @display("p=975,1000,row,150;q=txQueue");
        }
        virt[numVirtInterfaces]: <default("VirtualInterface")> like IVirtualInterface {
            @display("p=975,1000,row,150;q=txQueue");
        }
    connections allowunconnected:
        llc.lowerLayerOut --> cb.in++ if exists(llc);
        llc.lowerLayerIn <-- cb.out++ if exists(llc);

        cb.out++ --> bridging.upperLayerIn if exists(bridging);
        bridging.upperLayerOut --> cb.in++ if exists(bridging);

        bridging.lowerLayerOut --> bl.in++ if exists(bridging);
        bl.out++ --> bridging.lowerLayerIn if exists(bridging);

        cb.out++ --> bl.in++ if !exists(bridging);
        bl.out++ --> cb.in++ if !exists(bridging);

        bl.out++ --> li.in++;
        li.out++ --> bl.in++;

        bl.out++ --> ieee8021q.upperLayerIn if exists(ieee8021q);
        ieee8021q.upperLayerOut --> bl.in++ if exists(ieee8021q);

        bl.out++ --> ieee8021r.upperLayerIn if exists(ieee8021r);
        ieee8021r.upperLayerOut --> bl.in++ if exists(ieee8021r);

        bl.out++ --> ethernet.upperLayerIn if exists(ethernet);
        ethernet.upperLayerOut --> bl.in++ if exists(ethernet);

        ieee8021q.lowerLayerOut --> li.in++ if exists(ieee8021q);
        li.out++ --> ieee8021q.lowerLayerIn if exists(ieee8021q);

        ieee8021r.lowerLayerOut --> li.in++ if exists(ieee8021r);
        li.out++ --> ieee8021r.lowerLayerIn if exists(ieee8021r);

        ethernet.lowerLayerOut --> li.in++ if exists(ethernet);
        li.out++ --> ethernet.lowerLayerIn if exists(ethernet);

        for i=0..sizeof(radioIn)-1 {
            radioIn[i] --> { @display("m=s"); } --> wlan[i].radioIn;
        }

        for i=0..sizeof(ethg)-1 {
            ethg[i] <--> { @display("m=s"); } <--> eth[i].phys;
        }

        for i=0..sizeof(pppg)-1 {
            pppg[i] <--> { @display("m=s"); } <--> ppp[i].phys;
        }

        for i=0..numLoInterfaces-1 {
            li.out++ --> lo[i].upperLayerIn;
            lo[i].upperLayerOut --> li.in++;
        }

        for i=0..sizeof(radioIn)-1 {
            wlan[i].upperLayerOut --> li.in++;
            wlan[i].upperLayerIn <-- li.out++;
        }

        for i=0..sizeof(ethg)-1 {
            eth[i].upperLayerOut --> li.in++;
            eth[i].upperLayerIn <-- li.out++;
        }

        for i=0..sizeof(pppg)-1 {
            ppp[i].upperLayerOut --> li.in++;
            ppp[i].upperLayerIn <-- li.out++;
        }

        for i=0..numTunInterfaces-1 {
            tun[i].upperLayerOut --> li.in++;
            tun[i].upperLayerIn <-- li.out++;
        }

        for i=0..numVirtInterfaces-1 {
            virt[i].upperLayerOut --> li.in++;
            virt[i].upperLayerIn <-- li.out++;
        }
}

File: src/inet/node/base/LinkLayerNodeBase.ned