Protected Member Functions | Protected Attributes

EtherEncap Class Reference

#include <EtherEncap.h>

List of all members.

Protected Member Functions

virtual void initialize ()
virtual void handleMessage (cMessage *msg)
virtual void finish ()
virtual void processPacketFromHigherLayer (cPacket *msg)
virtual void processFrameFromMAC (EtherFrame *msg)
virtual void handleSendPause (cMessage *msg)
virtual void updateDisplayString ()

Protected Attributes

int seqNum
long totalFromHigherLayer
long totalFromMAC
long totalPauseSent

Detailed Description

Performs Ethernet II encapsulation/decapsulation. More info in the NED file.

Definition at line 28 of file EtherEncap.h.


Member Function Documentation

void EtherEncap::finish (  )  [protected, virtual]

Definition at line 153 of file EtherEncap.cc.

{
    recordScalar("packets from higher layer", totalFromHigherLayer);
    recordScalar("frames from MAC", totalFromMAC);
}

void EtherEncap::handleMessage ( cMessage *  msg  )  [protected, virtual]

Definition at line 40 of file EtherEncap.cc.

{
    if (msg->arrivedOn("lowerLayerIn"))
    {
        processFrameFromMAC(check_and_cast<EtherFrame *>(msg));
    }
    else
    {
        // from higher layer
        switch(msg->getKind())
        {
            case IEEE802CTRL_DATA:
            case 0: // default message kind (0) is also accepted
              processPacketFromHigherLayer(PK(msg));
              break;

            case IEEE802CTRL_SENDPAUSE:
              // higher layer want MAC to send PAUSE frame
              handleSendPause(msg);
              break;

            default:
              error("received message `%s' with unknown message kind %d", msg->getName(), msg->getKind());
        }
    }

    if (ev.isGUI())
        updateDisplayString();
}

void EtherEncap::handleSendPause ( cMessage *  msg  )  [protected, virtual]

Definition at line 127 of file EtherEncap.cc.

Referenced by handleMessage().

{
    Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl*>(msg->removeControlInfo());
    if (!etherctrl)
        error("PAUSE command `%s' from higher layer received without Ieee802Ctrl", msg->getName());
    int pauseUnits = etherctrl->getPauseUnits();
    delete etherctrl;

    EV << "Creating and sending PAUSE frame, with duration=" << pauseUnits << " units\n";

    // create Ethernet frame
    char framename[30];
    sprintf(framename, "pause-%d-%d", getId(), seqNum++);
    EtherPauseFrame *frame = new EtherPauseFrame(framename);
    frame->setPauseTime(pauseUnits);

    frame->setByteLength(ETHER_MAC_FRAME_BYTES+ETHER_PAUSE_COMMAND_BYTES);
    if (frame->getByteLength() < MIN_ETHERNET_FRAME)
        frame->setByteLength(MIN_ETHERNET_FRAME);

    send(frame, "lowerLayerOut");
    delete msg;

    totalPauseSent++;
}

void EtherEncap::initialize (  )  [protected, virtual]

Definition at line 29 of file EtherEncap.cc.

void EtherEncap::processFrameFromMAC ( EtherFrame *  msg  )  [protected, virtual]

Definition at line 106 of file EtherEncap.cc.

Referenced by handleMessage().

{
    totalFromMAC++;

    // decapsulate and attach control info
    cPacket *higherlayermsg = frame->decapsulate();

    // add Ieee802Ctrl to packet
    Ieee802Ctrl *etherctrl = new Ieee802Ctrl();
    etherctrl->setSrc(frame->getSrc());
    etherctrl->setDest(frame->getDest());
    higherlayermsg->setControlInfo(etherctrl);

    EV << "Decapsulating frame `" << frame->getName() <<"', passing up contained "
          "packet `" << higherlayermsg->getName() << "' to higher layer\n";

    // pass up to higher layers.
    send(higherlayermsg, "upperLayerOut");
    delete frame;
}

void EtherEncap::processPacketFromHigherLayer ( cPacket *  msg  )  [protected, virtual]

Definition at line 77 of file EtherEncap.cc.

Referenced by handleMessage().

{
    if (msg->getByteLength() > MAX_ETHERNET_DATA)
        error("packet from higher layer (%d bytes) exceeds maximum Ethernet payload length (%d)", (int)msg->getByteLength(), MAX_ETHERNET_DATA);

    totalFromHigherLayer++;

    // Creates MAC header information and encapsulates received higher layer data
    // with this information and transmits resultant frame to lower layer

    // create Ethernet frame, fill it in from Ieee802Ctrl and encapsulate msg in it
    EV << "Encapsulating higher layer packet `" << msg->getName() <<"' for MAC\n";

    Ieee802Ctrl *etherctrl = check_and_cast<Ieee802Ctrl*>(msg->removeControlInfo());
    EthernetIIFrame *frame = new EthernetIIFrame(msg->getName());

    frame->setSrc(etherctrl->getSrc());  // if blank, will be filled in by MAC
    frame->setDest(etherctrl->getDest());
    frame->setEtherType(etherctrl->getEtherType());
    frame->setByteLength(ETHER_MAC_FRAME_BYTES);
    delete etherctrl;

    frame->encapsulate(msg);
    if (frame->getByteLength() < MIN_ETHERNET_FRAME)
        frame->setByteLength(MIN_ETHERNET_FRAME);  // "padding"

    send(frame, "lowerLayerOut");
}

void EtherEncap::updateDisplayString (  )  [protected, virtual]

Definition at line 70 of file EtherEncap.cc.

Referenced by handleMessage().

{
    char buf[80];
    sprintf(buf, "passed up: %ld\nsent: %ld", totalFromMAC, totalFromHigherLayer);
    getDisplayString().setTagArg("t",0,buf);
}


Member Data Documentation

int EtherEncap::seqNum [protected]

Definition at line 31 of file EtherEncap.h.

Referenced by handleSendPause(), and initialize().

Definition at line 34 of file EtherEncap.h.

Referenced by finish(), initialize(), processPacketFromHigherLayer(), and updateDisplayString().

long EtherEncap::totalFromMAC [protected]

Definition at line 35 of file EtherEncap.h.

Referenced by finish(), initialize(), processFrameFromMAC(), and updateDisplayString().

long EtherEncap::totalPauseSent [protected]

Definition at line 36 of file EtherEncap.h.

Referenced by handleSendPause(), and initialize().


The documentation for this class was generated from the following files: