EtherEncap Class Reference

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 (cMessage *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::finish (  )  [protected, virtual]

00186 {
00187     if (par("writeScalars").boolValue())
00188     {
00189         recordScalar("packets from higher layer", totalFromHigherLayer);
00190         recordScalar("frames from MAC", totalFromMAC);
00191     }
00192 }

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

00073 {
00074     if (msg->arrivedOn("lowerLayerIn"))
00075     {
00076         processFrameFromMAC(check_and_cast<EtherFrame *>(msg));
00077     }
00078     else
00079     {
00080         // from higher layer
00081         switch(msg->kind())
00082         {
00083             case IEEE802CTRL_DATA:
00084             case 0: // default message kind (0) is also accepted
00085               processPacketFromHigherLayer(msg);
00086               break;
00087 
00088             case IEEE802CTRL_SENDPAUSE:
00089               // higher layer want MAC to send PAUSE frame
00090               handleSendPause(msg);
00091               break;
00092 
00093             default:
00094               error("received message `%s' with unknown message kind %d", msg->name(), msg->kind());
00095         }
00096     }
00097 
00098     if (ev.isGUI())
00099         updateDisplayString();
00100 }

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

00160 {
00161     Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl*>(msg->removeControlInfo());
00162     if (!etherctrl)
00163         error("PAUSE command `%s' from higher layer received without Ieee802Ctrl", msg->name());
00164     int pauseUnits = etherctrl->getPauseUnits();
00165     delete etherctrl;
00166 
00167     EV << "Creating and sending PAUSE frame, with duration=" << pauseUnits << " units\n";
00168 
00169     // create Ethernet frame
00170     char framename[30];
00171     sprintf(framename, "pause-%d-%d", id(), seqNum++);
00172     EtherPauseFrame *frame = new EtherPauseFrame(framename, ETH_PAUSE);
00173     frame->setPauseTime(pauseUnits);
00174 
00175     frame->setByteLength(ETHER_MAC_FRAME_BYTES+ETHER_PAUSE_COMMAND_BYTES);
00176     if (frame->byteLength() < MIN_ETHERNET_FRAME)
00177         frame->setByteLength(MIN_ETHERNET_FRAME);
00178 
00179     send(frame, "lowerLayerOut");
00180     delete msg;
00181 
00182     totalPauseSent++;
00183 }

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

00062 {
00063     seqNum = 0;
00064     WATCH(seqNum);
00065 
00066     totalFromHigherLayer = totalFromMAC = totalPauseSent = 0;
00067     WATCH(totalFromHigherLayer);
00068     WATCH(totalFromMAC);
00069     WATCH(totalPauseSent);
00070 }

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

00139 {
00140     totalFromMAC++;
00141 
00142     // decapsulate and attach control info
00143     cMessage *higherlayermsg = frame->decapsulate();
00144 
00145     // add Ieee802Ctrl to packet
00146     Ieee802Ctrl *etherctrl = new Ieee802Ctrl();
00147     etherctrl->setSrc(frame->getSrc());
00148     etherctrl->setDest(frame->getDest());
00149     higherlayermsg->setControlInfo(etherctrl);
00150 
00151     EV << "Decapsulating frame `" << frame->name() <<"', passing up contained "
00152           "packet `" << higherlayermsg->name() << "' to higher layer\n";
00153 
00154     // pass up to higher layers.
00155     send(higherlayermsg, "upperLayerOut");
00156     delete frame;
00157 }

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

00110 {
00111     if (msg->byteLength() > MAX_ETHERNET_DATA)
00112         error("packet from higher layer (%d bytes) exceeds maximum Ethernet payload length (%d)", msg->byteLength(), MAX_ETHERNET_DATA);
00113 
00114     totalFromHigherLayer++;
00115 
00116     // Creates MAC header information and encapsulates received higher layer data
00117     // with this information and transmits resultant frame to lower layer
00118 
00119     // create Ethernet frame, fill it in from Ieee802Ctrl and encapsulate msg in it
00120     EV << "Encapsulating higher layer packet `" << msg->name() <<"' for MAC\n";
00121 
00122     Ieee802Ctrl *etherctrl = check_and_cast<Ieee802Ctrl*>(msg->removeControlInfo());
00123     EthernetIIFrame *frame = new EthernetIIFrame(msg->name(), ETH_FRAME);
00124 
00125     frame->setSrc(etherctrl->getSrc());  // if blank, will be filled in by MAC
00126     frame->setDest(etherctrl->getDest());
00127     frame->setEtherType(etherctrl->getEtherType());
00128     frame->setByteLength(ETHER_MAC_FRAME_BYTES);
00129     delete etherctrl;
00130 
00131     frame->encapsulate(msg);
00132     if (frame->byteLength() < MIN_ETHERNET_FRAME)
00133         frame->setByteLength(MIN_ETHERNET_FRAME);  // "padding"
00134 
00135     send(frame, "lowerLayerOut");
00136 }

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

00103 {
00104     char buf[80];
00105     sprintf(buf, "passed up: %ld\nsent: %ld", totalFromMAC, totalFromHigherLayer);
00106     displayString().setTagArg("t",0,buf);
00107 }


Member Data Documentation

int EtherEncap::seqNum [protected]

long EtherEncap::totalFromHigherLayer [protected]

long EtherEncap::totalFromMAC [protected]

long EtherEncap::totalPauseSent [protected]


The documentation for this class was generated from the following file:
Generated on Wed Apr 4 13:20:19 2007 for INET Framework for OMNeT++/OMNEST by  doxygen 1.4.7