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