#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().
1.7.1