#include <EtherLLC.h>
Protected Member Functions | |
| virtual void | initialize () |
| virtual void | handleMessage (cMessage *msg) |
| virtual void | finish () |
| virtual void | processPacketFromHigherLayer (cPacket *msg) |
| virtual void | processFrameFromMAC (EtherFrameWithLLC *msg) |
| virtual void | handleRegisterSAP (cMessage *msg) |
| virtual void | handleDeregisterSAP (cMessage *msg) |
| virtual void | handleSendPause (cMessage *msg) |
| virtual int | findPortForSAP (int sap) |
| virtual void | updateDisplayString () |
Protected Attributes | |
| int | seqNum |
| std::map< int, int > | dsapToPort |
| long | dsapsRegistered |
| long | totalFromHigherLayer |
| long | totalFromMAC |
| long | totalPassedUp |
| long | droppedUnknownDSAP |
Implements the LLC sub-layer of the Datalink Layer in Ethernet networks
Definition at line 28 of file EtherLLC.h.
| int EtherLLC::findPortForSAP | ( | int | sap | ) | [protected, virtual] |
Definition at line 156 of file EtherLLC.cc.
Referenced by processFrameFromMAC().
{
// here we actually do two lookups, but what the hell...
if (dsapToPort.find(dsap)==dsapToPort.end())
return -1;
return dsapToPort[dsap];
}
| void EtherLLC::finish | ( | ) | [protected, virtual] |
Definition at line 222 of file EtherLLC.cc.
{
recordScalar("dsaps registered", dsapsRegistered);
recordScalar("packets from higher layer", totalFromHigherLayer);
recordScalar("frames from MAC", totalFromMAC);
recordScalar("packets passed up", totalPassedUp);
recordScalar("packets dropped - unknown DSAP", droppedUnknownDSAP);
}
| void EtherLLC::handleDeregisterSAP | ( | cMessage * | msg | ) | [protected, virtual] |
Definition at line 182 of file EtherLLC.cc.
Referenced by handleMessage().
{
Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl *>(msg->removeControlInfo());
if (!etherctrl)
error("packet `%s' from higher layer received without Ieee802Ctrl", msg->getName());
int dsap = etherctrl->getDsap();
EV << "Deregistering higher layer with DSAP=" << dsap << "\n";
// delete from table (don't care if it's not in there)
dsapToPort.erase(dsapToPort.find(dsap));
dsapsRegistered = dsapToPort.size();
delete msg;
}
| void EtherLLC::handleMessage | ( | cMessage * | msg | ) | [protected, virtual] |
Definition at line 37 of file EtherLLC.cc.
{
if (msg->arrivedOn("lowerLayerIn"))
{
// frame received from lower layer
processFrameFromMAC(check_and_cast<EtherFrameWithLLC *>(msg));
}
else
{
switch (msg->getKind())
{
case IEEE802CTRL_DATA:
// data received from higher layer
processPacketFromHigherLayer(PK(msg));
break;
case IEEE802CTRL_REGISTER_DSAP:
// higher layer registers itself
handleRegisterSAP(msg);
break;
case IEEE802CTRL_DEREGISTER_DSAP:
// higher layer deregisters itself
handleDeregisterSAP(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 EtherLLC::handleRegisterSAP | ( | cMessage * | msg | ) | [protected, virtual] |
Definition at line 164 of file EtherLLC.cc.
Referenced by handleMessage().
{
int port = msg->getArrivalGate()->getIndex();
Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl *>(msg->removeControlInfo());
if (!etherctrl)
error("packet `%s' from higher layer received without Ieee802Ctrl", msg->getName());
int dsap = etherctrl->getDsap();
EV << "Registering higher layer with DSAP=" << dsap << " on port=" << port << "\n";
if (dsapToPort.find(dsap)!=dsapToPort.end())
error("DSAP=%d already registered with port=%d", dsap, dsapToPort[dsap]);
dsapToPort[dsap] = port;
dsapsRegistered = dsapToPort.size();
delete msg;
}
| void EtherLLC::handleSendPause | ( | cMessage * | msg | ) | [protected, virtual] |
Definition at line 198 of file EtherLLC.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();
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;
}
| void EtherLLC::initialize | ( | ) | [protected, virtual] |
Definition at line 24 of file EtherLLC.cc.
{
seqNum = 0;
WATCH(seqNum);
dsapsRegistered = totalFromHigherLayer = totalFromMAC = totalPassedUp = droppedUnknownDSAP = 0;
WATCH(dsapsRegistered);
WATCH(totalFromHigherLayer);
WATCH(totalFromMAC);
WATCH(totalPassedUp);
WATCH(droppedUnknownDSAP);
}
| void EtherLLC::processFrameFromMAC | ( | EtherFrameWithLLC * | msg | ) | [protected, virtual] |
Definition at line 123 of file EtherLLC.cc.
Referenced by handleMessage().
{
totalFromMAC++;
// decapsulate it and pass up to higher layers.
int sap = frame->getDsap();
int port = findPortForSAP(sap);
if (port<0)
{
EV << "No higher layer registered for DSAP="<< sap <<", discarding frame `" << frame->getName() <<"'\n";
droppedUnknownDSAP++;
delete frame;
return;
}
cPacket *higherlayermsg = frame->decapsulate();
Ieee802Ctrl *etherctrl = new Ieee802Ctrl();
etherctrl->setSsap(frame->getSsap());
etherctrl->setDsap(frame->getDsap());
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 " << port << "\n";
send(higherlayermsg, "upperLayerOut", port);
totalPassedUp++;
delete frame;
}
| void EtherLLC::processPacketFromHigherLayer | ( | cPacket * | msg | ) | [protected, virtual] |
Definition at line 89 of file EtherLLC.cc.
Referenced by handleMessage().
{
if (msg->getByteLength() > (MAX_ETHERNET_DATA-ETHER_LLC_HEADER_LENGTH))
error("packet from higher layer (%d bytes) plus LLC header exceed 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";
EV << "Sent from " << simulation.getModule(msg->getSenderModuleId())->getFullPath() << " at " << msg->getSendingTime() << " and was created " << msg->getCreationTime() << "\n";
Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl *>(msg->removeControlInfo());
if (!etherctrl)
error("packet `%s' from higher layer received without Ieee802Ctrl", msg->getName());
EtherFrameWithLLC *frame = new EtherFrameWithLLC(msg->getName());
frame->setControl(0);
frame->setSsap(etherctrl->getSsap());
frame->setDsap(etherctrl->getDsap());
frame->setDest(etherctrl->getDest()); // src address is filled in by MAC
frame->setByteLength(ETHER_MAC_FRAME_BYTES+ETHER_LLC_HEADER_LENGTH);
delete etherctrl;
frame->encapsulate(msg);
if (frame->getByteLength() < MIN_ETHERNET_FRAME)
frame->setByteLength(MIN_ETHERNET_FRAME);
send(frame, "lowerLayerOut");
}
| void EtherLLC::updateDisplayString | ( | ) | [protected, virtual] |
Definition at line 78 of file EtherLLC.cc.
Referenced by handleMessage().
{
char buf[80];
sprintf(buf, "passed up: %ld\nsent: %ld", totalPassedUp, totalFromHigherLayer);
if (droppedUnknownDSAP>0)
{
sprintf(buf+strlen(buf), "\ndropped (wrong DSAP): %ld", droppedUnknownDSAP);
}
getDisplayString().setTagArg("t",0,buf);
}
long EtherLLC::droppedUnknownDSAP [protected] |
Definition at line 39 of file EtherLLC.h.
Referenced by finish(), initialize(), processFrameFromMAC(), and updateDisplayString().
long EtherLLC::dsapsRegistered [protected] |
Definition at line 35 of file EtherLLC.h.
Referenced by finish(), handleDeregisterSAP(), handleRegisterSAP(), and initialize().
std::map<int,int> EtherLLC::dsapToPort [protected] |
Definition at line 32 of file EtherLLC.h.
Referenced by findPortForSAP(), handleDeregisterSAP(), and handleRegisterSAP().
int EtherLLC::seqNum [protected] |
Definition at line 31 of file EtherLLC.h.
Referenced by handleSendPause(), and initialize().
long EtherLLC::totalFromHigherLayer [protected] |
Definition at line 36 of file EtherLLC.h.
Referenced by finish(), initialize(), processPacketFromHigherLayer(), and updateDisplayString().
long EtherLLC::totalFromMAC [protected] |
Definition at line 37 of file EtherLLC.h.
Referenced by finish(), initialize(), and processFrameFromMAC().
long EtherLLC::totalPassedUp [protected] |
Definition at line 38 of file EtherLLC.h.
Referenced by finish(), initialize(), processFrameFromMAC(), and updateDisplayString().
1.7.1