EthernetInterface

Package: inet.linklayer.ethernet

EthernetInterface

compound module

Ethernet network interface. Complements EtherMAC and EtherEncap with an output queue for QoS and RED support.

outputHook[numOutputHooks] : like IHook

Nop: Just lets messages through without any change or delay.

IHook: Generic module that can be inserted in some points in the model

Source:
outputHook[numOutputHooks]: <default("Nop")> like IHook if numOutputHooks>0 {
    @display("p=80,98");
} inputHook[numInputHooks] : like IHook

Nop: Just lets messages through without any change or delay.

IHook: Generic module that can be inserted in some points in the model

Source:
inputHook[numInputHooks]: <default("Nop")> like IHook if numInputHooks>0 {
    @display("p=265,83");
} ingressTC : like ITrafficConditioner

ITrafficConditioner: This is the interface of traffic conditioner modules.

Source:
ingressTC: <ingressTCType> like ITrafficConditioner if ingressTCType != "" {
    @display("p=292,158");
} egressTC : like ITrafficConditioner

ITrafficConditioner: This is the interface of traffic conditioner modules.

Source:
egressTC: <egressTCType> like ITrafficConditioner if egressTCType != "" {
    @display("p=53,158");
} queue : EtherQoSQueue

Queue module that gives the PAUSE frames a higher priority, and can be parametrized with an...

Source:
queue: EtherQoSQueue if queueType != "" {
    parameters:
        dataQueueType = parent.queueType;
        @display("p=107,263;q=l2queue");
} mac : like IEtherMAC

IEtherMAC: Interface for Ethernet MAC implementations.

Source:
mac: <macType> like IEtherMAC {
    parameters:
        queueModule = (parent.queueType == "" ? "" : "^.queue");
        txQueueLimit = (parent.queueType == "" ? 10000 : 1); // queue sends one packet at a time
        @display("p=182,321");
} encap : like IEtherEncap

IEtherEncap: Module interface for Ethernet encapsulation/decapsulation.

Source:
encap: <encapType> like IEtherEncap {
    parameters:
        @display("p=182,205");
}

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.

Parameters

Name Type Default value Description
interfaceTableModule string
csmacdSupport bool false

by default CSMA/CD is turned off, so only point-to-point duplex links are supported.

macType string csmacdSupport ? "EtherMAC" : "EtherMACFullDuplex"

EtherMAC or EtherMACFullDuplex

queueType string ""

DropTailQueue, or a Diffserv queue; set to "" for use of an internal queue

ingressTCType string ""

a module type implementing ITrafficConditioner for optional traffic conditioning of incoming traffic

egressTCType string ""

a module type implementing ITrafficConditioner for optional traffic conditioning of outgoing traffic

encapType string "EtherEncap"

module for encapsulation/decapsulation; use EtherEncapDummy for no encapsulation/decapsulation

numOutputHooks int 0
numInputHooks int 0

Properties

Name Value Description
display i=block/ifcard;bgl=2

Gates

Name Direction Size Description
upperLayerIn input
upperLayerOut output
phys inout

Unassigned submodule parameters

Name Type Default value Description
queue.pauseQueue.frameCapacity int 100
mac.promiscuous bool

if true, all packets are received, otherwise only the ones with matching destination MAC address

mac.address string

MAC address as hex string (12 hex digits), or "auto". "auto" values will be replaced by a generated MAC address in init stage 0.

mac.duplexMode bool

selects full-duplex (true) or half-duplex (false) operation

mac.mtu int

Source code

//
// Ethernet network interface. Complements ~EtherMAC and ~EtherEncap
// with an output queue for QoS and RED support.
//
module EthernetInterface like IWiredNic
{
    parameters:
        string interfaceTableModule;
        bool csmacdSupport = default(false);  // by default CSMA/CD is turned off, so only point-to-point duplex links are supported.
        string macType = default(csmacdSupport ? "EtherMAC" : "EtherMACFullDuplex"); // ~EtherMAC or ~EtherMACFullDuplex
        string queueType = default(""); // ~DropTailQueue, or a Diffserv queue; set to "" for use of an internal queue
        string ingressTCType = default(""); // a module type implementing ~ITrafficConditioner for optional traffic conditioning of incoming traffic
        string egressTCType = default(""); // a module type implementing ~ITrafficConditioner for optional traffic conditioning of outgoing traffic
        string encapType = default("EtherEncap");   // module for encapsulation/decapsulation; use ~EtherEncapDummy for no encapsulation/decapsulation
        int numOutputHooks = default(0);
        int numInputHooks = default(0);
        @display("i=block/ifcard;bgl=2");
        *.interfaceTableModule = default(absPath(this.interfaceTableModule));
    gates:
        input upperLayerIn;
        output upperLayerOut;
        inout phys @labels(EtherFrame);
    submodules:
        outputHook[numOutputHooks]: <default("Nop")> like IHook if numOutputHooks>0 {
            @display("p=80,98");
        }
        inputHook[numInputHooks]: <default("Nop")> like IHook if numInputHooks>0 {
            @display("p=265,83");
        }
        ingressTC: <ingressTCType> like ITrafficConditioner if ingressTCType != "" {
            @display("p=292,158");
        }
        egressTC: <egressTCType> like ITrafficConditioner if egressTCType != "" {
            @display("p=53,158");
        }
        queue: EtherQoSQueue if queueType != "" {
            parameters:
                dataQueueType = parent.queueType;
                @display("p=107,263;q=l2queue");
        }
        mac: <macType> like IEtherMAC {
            parameters:
                queueModule = (parent.queueType == "" ? "" : "^.queue");
                txQueueLimit = (parent.queueType == "" ? 10000 : 1); // queue sends one packet at a time
                @display("p=182,321");
        }
        encap: <encapType> like IEtherEncap {
            parameters:
                @display("p=182,205");
        }
    connections:
        mac.upperLayerOut --> encap.lowerLayerIn;
        mac.phys <--> { @display("m=s"); } <--> phys;

        if queueType != "" {
            encap.lowerLayerOut --> queue.in;
            queue.out --> mac.upperLayerIn;
        }

        encap.lowerLayerOut --> mac.upperLayerIn if queueType == "";

        // no input hooks, no ingressTC
        encap.upperLayerOut --> { @display("m=n"); } --> upperLayerOut if numInputHooks == 0 && ingressTCType == "";

        // no input hooks, there is ingressTC
        if numInputHooks == 0 && ingressTCType != "" {
            encap.upperLayerOut --> ingressTC.in;
            ingressTC.out --> { @display("m=n"); } --> upperLayerOut;
        }

        // there are input hooks
        if numInputHooks > 0 {
            inputHook[numInputHooks-1].out --> { @display("m=n"); } --> upperLayerOut;
        }
        for i=0..numInputHooks-2 {
            inputHook[i].out --> inputHook[i+1].in;
        }

        // there are input hooks, no ingressTC
        if numInputHooks > 0 && ingressTCType == "" {
            encap.upperLayerOut --> inputHook[0].in;
        }

        // there are input hooks, there is ingressTC
        if numInputHooks > 0 && ingressTCType != "" {
            encap.upperLayerOut --> ingressTC.in;
            ingressTC.out --> inputHook[0].in;
        }

        // chain output hooks
        for i=0..numOutputHooks-2 {
            outputHook[i].out --> outputHook[i+1].in;
        }

        // no output hooks, no egressTC
        upperLayerIn --> { @display("m=n"); } --> encap.upperLayerIn if numOutputHooks == 0 && egressTCType == "";

        // there are output hooks
        if numOutputHooks > 0 {
            upperLayerIn --> { @display("m=n"); } --> outputHook[0].in;
        }

        // no output hooks, there is egressTC
        if numOutputHooks == 0 && egressTCType != "" {
            upperLayerIn --> { @display("m=n"); } --> egressTC.in;
        }

        // there is egressTC
        if egressTCType != "" {
            egressTC.out --> encap.upperLayerIn;
        }

        // there are output hooks, no egressTC
        if numOutputHooks > 0 && egressTCType == "" {
            outputHook[numOutputHooks-1].out --> encap.upperLayerIn;
        }

        // there are output hooks, there is egressTC
        if numOutputHooks > 0 && egressTCType != "" {
            outputHook[numOutputHooks-1].out --> egressTC.in;
        }
}

File: src/inet/linklayer/ethernet/EthernetInterface.ned