NED File src/inet/node/base/LinkLayerNodeBase.ned¶
Name |
Type |
Description |
|---|---|---|
compound module |
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. |
Source code¶
//
// Copyright (C) 2020 OpenSim Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
package inet.node.base;
import inet.common.MessageDispatcher;
import inet.common.packet.recorder.PcapRecorder;
import inet.linklayer.contract.IEthernetInterface;
import inet.linklayer.contract.IEthernetLayer;
import inet.linklayer.contract.IIeee8021qLayer;
import inet.linklayer.contract.IIeee8021rLayer;
import inet.linklayer.contract.IIeee8022Llc;
import inet.linklayer.contract.ILoopbackInterface;
import inet.linklayer.contract.IPppInterface;
import inet.linklayer.contract.ITunnelInterface;
import inet.linklayer.contract.IVirtualInterface;
import inet.linklayer.contract.IWirelessInterface;
import inet.networklayer.common.InterfaceTable;
import inet.node.contract.IEthernetNetworkNode;
import inet.protocolelement.contract.IProtocolLayer;
//
// 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++;
}
}