IEtherMac

Package: inet.linklayer.contract

IEtherMac

module interface

Interface for Ethernet MAC implementations. All Ethernet MAC implementations should implement this (i.e. declared as: EtherMac like IEtherMac). The existing implementations are these: EtherMac and EtherMacFullDuplex.

Doesn't do encapsulation/decapsulation; see EtherEncap for that.

Expected environment:

  • phys$i and phys$o should be connected to the "network"
  • upperLayerIn and upperLayerOut are usually connected to EtherEncap (in hosts) or IMacRelayUnit (in a switch)

The module does not perform encapsulation or decapsulation of frames -- this is done by higher layers (EtherEncap).

When a frame is received from the higher layers, it must be an EtherFrame, and with all protocol fields filled out (including the destination MAC address). The source address, if left empty, will be filled in. Then frame is queued and transmitted according to the CSMA/CD protocol.

Data frames received from the network are EtherFrames. They are passed to the higher layers without modification. Also, the module properly responds to PAUSE frames, but never sends them by itself -- however, it transmits PAUSE frames received from upper layers. See PAUSE handling for more info.

IEtherMac

Used in compound modules

Name Type Description
EthernetInterface compound module

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

ExtUpperEthernetInterface compound module

This module provides an Ethernet network interface suitable for emulation. The upper part of the network interface is realized in the real world using a real TAP device of the host computer which is running the simulation.

Parameters

Name Type Default value Description
promiscuous bool

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

duplexMode bool

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

txQueueLimit int

maximum number of frames queued up for transmission; additional frames are dropped. Only used if queueModule==""

queueModule string

name of optional external queue module

mtu int

Properties

Name Value Description
display i=block/rxtx

Source code

//
// Interface for Ethernet MAC implementations. All Ethernet MAC implementations
// should implement this (i.e. declared as: EtherMac like IEtherMac).
// The existing implementations are these: ~EtherMac and ~EtherMacFullDuplex.
//
// Doesn't do encapsulation/decapsulation; see ~EtherEncap for that.
//
// Expected environment:
// - phys$i and phys$o should be connected to the "network"
// - upperLayerIn and upperLayerOut are usually connected to ~EtherEncap (in hosts)
//   or ~IMacRelayUnit (in a switch)
//
// The module does not perform encapsulation or decapsulation of frames --
// this is done by higher layers (~EtherEncap).
//
// When a frame is received from the higher layers, it must be an ~EtherFrame,
// and with all protocol fields filled out
// (including the destination MAC address). The source address, if left empty,
// will be filled in. Then frame is queued and transmitted according
// to the CSMA/CD protocol.
//
// Data frames received from the network are EtherFrames. They are passed to
// the higher layers without modification.
// Also, the module properly responds to PAUSE frames, but never sends them
// by itself -- however, it transmits PAUSE frames received from upper layers.
// See <a href="ether-pause.html">PAUSE handling</a> for more info.
//
moduleinterface IEtherMac
{
    parameters:
        bool promiscuous;       // if true, all packets are received, otherwise only the
                                // ones with matching destination MAC address
        bool duplexMode;        // selects full-duplex (true) or half-duplex (false) operation
        int txQueueLimit;       // maximum number of frames queued up for transmission;
                                // additional frames are dropped. Only used if queueModule==""
        string queueModule;     // name of optional external queue module
        int mtu @unit(B);
        @display("i=block/rxtx");
    gates:
        input upperLayerIn @labels(EtherFrame);    // to ~EtherEncap or ~IMacRelayUnit
        output upperLayerOut @labels(EtherFrame);  // to ~EtherEncap or ~IMacRelayUnit
        inout phys @labels(EtherFrame); // to physical layer or the network
}

File: src/inet/linklayer/contract/IEtherMac.ned