#include <EtherEncap.h>
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 |
Performs Ethernet II encapsulation/decapsulation. More info in the NED file.
Definition at line 28 of file EtherEncap.h.
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.
{ seqNum = 0; WATCH(seqNum); totalFromHigherLayer = totalFromMAC = totalPauseSent = 0; WATCH(totalFromHigherLayer); WATCH(totalFromMAC); WATCH(totalPauseSent); }
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); }
int EtherEncap::seqNum [protected] |
Definition at line 31 of file EtherEncap.h.
Referenced by handleSendPause(), and initialize().
long EtherEncap::totalFromHigherLayer [protected] |
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().