EtherEncap Class Reference

#include <EtherEncap.h>

List of all members.


Detailed Description

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

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

Member Function Documentation

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

00030 {
00031     seqNum = 0;
00032     WATCH(seqNum);
00033 
00034     totalFromHigherLayer = totalFromMAC = totalPauseSent = 0;
00035     WATCH(totalFromHigherLayer);
00036     WATCH(totalFromMAC);
00037     WATCH(totalPauseSent);
00038 }

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

00041 {
00042     if (msg->arrivedOn("lowerLayerIn"))
00043     {
00044         processFrameFromMAC(check_and_cast<EtherFrame *>(msg));
00045     }
00046     else
00047     {
00048         // from higher layer
00049         switch(msg->getKind())
00050         {
00051             case IEEE802CTRL_DATA:
00052             case 0: // default message kind (0) is also accepted
00053               processPacketFromHigherLayer(PK(msg));
00054               break;
00055 
00056             case IEEE802CTRL_SENDPAUSE:
00057               // higher layer want MAC to send PAUSE frame
00058               handleSendPause(msg);
00059               break;
00060 
00061             default:
00062               error("received message `%s' with unknown message kind %d", msg->getName(), msg->getKind());
00063         }
00064     }
00065 
00066     if (ev.isGUI())
00067         updateDisplayString();
00068 }

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

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

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

Referenced by handleMessage().

00078 {
00079     if (msg->getByteLength() > MAX_ETHERNET_DATA)
00080         error("packet from higher layer (%d bytes) exceeds maximum Ethernet payload length (%d)", msg->getByteLength(), MAX_ETHERNET_DATA);
00081 
00082     totalFromHigherLayer++;
00083 
00084     // Creates MAC header information and encapsulates received higher layer data
00085     // with this information and transmits resultant frame to lower layer
00086 
00087     // create Ethernet frame, fill it in from Ieee802Ctrl and encapsulate msg in it
00088     EV << "Encapsulating higher layer packet `" << msg->getName() <<"' for MAC\n";
00089 
00090     Ieee802Ctrl *etherctrl = check_and_cast<Ieee802Ctrl*>(msg->removeControlInfo());
00091     EthernetIIFrame *frame = new EthernetIIFrame(msg->getName());
00092 
00093     frame->setSrc(etherctrl->getSrc());  // if blank, will be filled in by MAC
00094     frame->setDest(etherctrl->getDest());
00095     frame->setEtherType(etherctrl->getEtherType());
00096     frame->setByteLength(ETHER_MAC_FRAME_BYTES);
00097     delete etherctrl;
00098 
00099     frame->encapsulate(msg);
00100     if (frame->getByteLength() < MIN_ETHERNET_FRAME)
00101         frame->setByteLength(MIN_ETHERNET_FRAME);  // "padding"
00102 
00103     send(frame, "lowerLayerOut");
00104 }

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

Referenced by handleMessage().

00107 {
00108     totalFromMAC++;
00109 
00110     // decapsulate and attach control info
00111     cPacket *higherlayermsg = frame->decapsulate();
00112 
00113     // add Ieee802Ctrl to packet
00114     Ieee802Ctrl *etherctrl = new Ieee802Ctrl();
00115     etherctrl->setSrc(frame->getSrc());
00116     etherctrl->setDest(frame->getDest());
00117     higherlayermsg->setControlInfo(etherctrl);
00118 
00119     EV << "Decapsulating frame `" << frame->getName() <<"', passing up contained "
00120           "packet `" << higherlayermsg->getName() << "' to higher layer\n";
00121 
00122     // pass up to higher layers.
00123     send(higherlayermsg, "upperLayerOut");
00124     delete frame;
00125 }

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

Referenced by handleMessage().

00128 {
00129     Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl*>(msg->removeControlInfo());
00130     if (!etherctrl)
00131         error("PAUSE command `%s' from higher layer received without Ieee802Ctrl", msg->getName());
00132     int pauseUnits = etherctrl->getPauseUnits();
00133     delete etherctrl;
00134 
00135     EV << "Creating and sending PAUSE frame, with duration=" << pauseUnits << " units\n";
00136 
00137     // create Ethernet frame
00138     char framename[30];
00139     sprintf(framename, "pause-%d-%d", getId(), seqNum++);
00140     EtherPauseFrame *frame = new EtherPauseFrame(framename);
00141     frame->setPauseTime(pauseUnits);
00142 
00143     frame->setByteLength(ETHER_MAC_FRAME_BYTES+ETHER_PAUSE_COMMAND_BYTES);
00144     if (frame->getByteLength() < MIN_ETHERNET_FRAME)
00145         frame->setByteLength(MIN_ETHERNET_FRAME);
00146 
00147     send(frame, "lowerLayerOut");
00148     delete msg;
00149 
00150     totalPauseSent++;
00151 }

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

Referenced by handleMessage().

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


Member Data Documentation

int EtherEncap::seqNum [protected]

Referenced by handleSendPause(), and initialize().

long EtherEncap::totalFromMAC [protected]

long EtherEncap::totalPauseSent [protected]

Referenced by handleSendPause(), and initialize().


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

Generated on Fri Mar 20 18:51:18 2009 for INET Framework for OMNeT++/OMNEST by  doxygen 1.5.5