Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

EtherLLC Class Reference

List of all members.

Public Methods

 Module_Class_Members (EtherLLC, cSimpleModule, 0)
virtual void initialize ()
virtual void handleMessage (cMessage *msg)
virtual void finish ()
virtual void processPacketFromHigherLayer (cMessage *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)

Protected Attributes

int seqNum
std::map< int, int > dsapToPort
long dsapsRegistered
long totalFromHigherLayer
long totalFromMAC
long totalPassedUp
long droppedUnknownDSAP

Detailed Description

Implements the LLC sub-layer of the Datalink Layer in Ethernet networks

Definition at line 36 of file EtherLLC.cc.


Member Function Documentation

int EtherLLC::findPortForSAP int    sap [virtual]
 

Definition at line 182 of file EtherLLC.cc.

References dsapToPort.

Referenced by processFrameFromMAC().

00183 {
00184     // here we actually do two lookups, but what the hell...
00185     if (dsapToPort.find(dsap)==dsapToPort.end())
00186         return -1;
00187     return dsapToPort[dsap];
00188 }

void EtherLLC::finish   [virtual]
 

Definition at line 248 of file EtherLLC.cc.

References droppedUnknownDSAP, dsapsRegistered, totalFromHigherLayer, totalFromMAC, and totalPassedUp.

00249 {
00250     if (par("writeScalars").boolValue())
00251     {
00252         recordScalar("dsaps registered", dsapsRegistered);
00253         recordScalar("packets from higher layer", totalFromHigherLayer);
00254         recordScalar("frames from MAC", totalFromMAC);
00255         recordScalar("packets passed up", totalPassedUp);
00256         recordScalar("packets dropped - unknown DSAP", droppedUnknownDSAP);
00257     }
00258 }

void EtherLLC::handleDeregisterSAP cMessage *    msg [virtual]
 

Definition at line 208 of file EtherLLC.cc.

References dsapsRegistered, dsapToPort, EV, EtherCtrl::getDsap(), and M30.

Referenced by handleMessage().

00209 {
00210     EtherCtrl *etherctrl = dynamic_cast<EtherCtrl *>(M30(msg)->removeControlInfo());
00211     if (!etherctrl)
00212         error("packet `%s' from higher layer received without EtherCtrl", msg->name());
00213     int dsap = etherctrl->getDsap();
00214 
00215     EV << "Deregistering higher layer with DSAP=" << dsap << "\n";
00216 
00217     // delete from table (don't care if it's not in there)
00218     dsapToPort.erase(dsapToPort.find(dsap));
00219     dsapsRegistered = dsapToPort.size();
00220     delete msg;
00221 }

void EtherLLC::handleMessage cMessage *    msg [virtual]
 

Definition at line 80 of file EtherLLC.cc.

References ETH_FRAME, ETHCTRL_DATA, ETHCTRL_DEREGISTER_DSAP, ETHCTRL_REGISTER_DSAP, ETHCTRL_SENDPAUSE, handleDeregisterSAP(), handleRegisterSAP(), handleSendPause(), processFrameFromMAC(), and processPacketFromHigherLayer().

00081 {
00082     switch (msg->kind())
00083     {
00084       case ETHCTRL_DATA:
00085         // data received from higher layer
00086         processPacketFromHigherLayer(msg);
00087         break;
00088 
00089       case ETH_FRAME:
00090         // frame received from lower layer
00091         processFrameFromMAC(check_and_cast<EtherFrameWithLLC *>(msg));
00092         break;
00093 
00094       case ETHCTRL_REGISTER_DSAP:
00095         // higher layer registers itself
00096         handleRegisterSAP(msg);
00097         break;
00098 
00099       case ETHCTRL_DEREGISTER_DSAP:
00100         // higher layer deregisters itself
00101         handleDeregisterSAP(msg);
00102         break;
00103 
00104       case ETHCTRL_SENDPAUSE:
00105         // higher layer want MAC to send PAUSE frame
00106         handleSendPause(msg);
00107         break;
00108 
00109       default:
00110         error("received message `%s' with unknown message kind %d",
00111               msg->name(), msg->kind());
00112     }
00113 }

void EtherLLC::handleRegisterSAP cMessage *    msg [virtual]
 

Definition at line 190 of file EtherLLC.cc.

References dsapsRegistered, dsapToPort, EV, EtherCtrl::getDsap(), and M30.

Referenced by handleMessage().

00191 {
00192     int port = msg->arrivalGate()->index();
00193     EtherCtrl *etherctrl = dynamic_cast<EtherCtrl *>(M30(msg)->removeControlInfo());
00194     if (!etherctrl)
00195         error("packet `%s' from higher layer received without EtherCtrl", msg->name());
00196     int dsap = etherctrl->getDsap();
00197 
00198     EV << "Registering higher layer with DSAP=" << dsap << " on port=" << port << "\n";
00199 
00200     if (dsapToPort.find(dsap)!=dsapToPort.end())
00201         error("DSAP=%d already registered with port=%d", dsap, dsapToPort[dsap]);
00202 
00203     dsapToPort[dsap] = port;
00204     dsapsRegistered = dsapToPort.size();
00205     delete msg;
00206 }

void EtherLLC::handleSendPause cMessage *    msg [virtual]
 

Definition at line 224 of file EtherLLC.cc.

References ETH_PAUSE, ETHER_MAC_FRAME_BYTES, ETHER_PAUSE_COMMAND_BYTES, EV, EtherCtrl::getPauseUnits(), M30, MIN_ETHERNET_FRAME, seqNum, and EtherPauseFrame::setPauseTime().

Referenced by handleMessage().

00225 {
00226     EtherCtrl *etherctrl = dynamic_cast<EtherCtrl *>(M30(msg)->removeControlInfo());
00227     if (!etherctrl)
00228         error("packet `%s' from higher layer received without EtherCtrl", msg->name());
00229 
00230     int pauseUnits = etherctrl->getPauseUnits();
00231     EV << "Creating and sending PAUSE frame, with duration=" << pauseUnits << " units\n";
00232 
00233     // create Ethernet frame
00234     char framename[30];
00235     sprintf(framename, "pause-%d-%d", id(), seqNum++);
00236     EtherPauseFrame *frame = new EtherPauseFrame(framename, ETH_PAUSE);
00237     frame->setPauseTime(pauseUnits);
00238 
00239     frame->setLength(8*(ETHER_MAC_FRAME_BYTES+ETHER_PAUSE_COMMAND_BYTES));
00240     if (frame->length() < 8*MIN_ETHERNET_FRAME)
00241         frame->setLength(8*MIN_ETHERNET_FRAME);
00242 
00243     send(frame, "lowerLayerOut");
00244 
00245     delete msg;
00246 }

void EtherLLC::initialize   [virtual]
 

Definition at line 67 of file EtherLLC.cc.

References droppedUnknownDSAP, dsapsRegistered, seqNum, totalFromHigherLayer, totalFromMAC, and totalPassedUp.

00068 {
00069     seqNum = 0;
00070     WATCH(seqNum);
00071 
00072     dsapsRegistered = totalFromHigherLayer = totalFromMAC = totalPassedUp = droppedUnknownDSAP = 0;
00073     WATCH(dsapsRegistered);
00074     WATCH(totalFromHigherLayer);
00075     WATCH(totalFromMAC);
00076     WATCH(totalPassedUp);
00077     WATCH(droppedUnknownDSAP);
00078 }

EtherLLC::Module_Class_Members EtherLLC   ,
cSimpleModule   ,
 
 

void EtherLLC::processFrameFromMAC EtherFrameWithLLC   msg [virtual]
 

Definition at line 149 of file EtherLLC.cc.

References droppedUnknownDSAP, EV, findPortForSAP(), EtherFrame::getDest(), EtherFrameWithLLC::getDsap(), EtherFrame::getSrc(), EtherFrameWithLLC::getSsap(), M30, EtherCtrl::setDest(), EtherCtrl::setDsap(), EtherCtrl::setSrc(), EtherCtrl::setSsap(), totalFromMAC, and totalPassedUp.

Referenced by handleMessage().

00150 {
00151     totalFromMAC++;
00152 
00153     // decapsulate it and pass up to higher layers.
00154     int sap = frame->getDsap();
00155     int port = findPortForSAP(sap);
00156     if (port<0)
00157     {
00158         EV << "No higher layer registered for DSAP="<< sap <<", discarding frame `" << frame->name() <<"'\n";
00159         droppedUnknownDSAP++;
00160         delete frame;
00161         return;
00162     }
00163 
00164     cMessage *higherlayermsg = frame->decapsulate();
00165 
00166     EtherCtrl *etherctrl = new EtherCtrl();
00167     etherctrl->setSsap(frame->getSsap());
00168     etherctrl->setDsap(frame->getDsap());
00169     etherctrl->setSrc(frame->getSrc());
00170     etherctrl->setDest(frame->getDest());
00171     M30(higherlayermsg)->setControlInfo(etherctrl);
00172 
00173     EV << "Decapsulating frame `" << frame->name() <<"', "
00174           "passing up contained packet `" << higherlayermsg->name() << "' "
00175           "to higher layer " << port << "\n";
00176 
00177     send(higherlayermsg, "upperLayerOut", port);
00178     totalPassedUp++;
00179     delete frame;
00180 }

void EtherLLC::processPacketFromHigherLayer cMessage *    msg [virtual]
 

Definition at line 115 of file EtherLLC.cc.

References ETH_FRAME, ETHER_LLC_HEADER_LENGTH, ETHER_MAC_FRAME_BYTES, EV, EtherCtrl::getDest(), EtherCtrl::getDsap(), EtherCtrl::getSsap(), M30, MAX_ETHERNET_DATA, MIN_ETHERNET_FRAME, EtherFrameWithLLC::setControl(), EtherFrame::setDest(), EtherFrameWithLLC::setDsap(), EtherFrameWithLLC::setSsap(), and totalFromHigherLayer.

Referenced by handleMessage().

00116 {
00117     if (msg->length()>8*(MAX_ETHERNET_DATA-ETHER_LLC_HEADER_LENGTH))
00118         error("packet from higher layer (%d bytes) plus LLC header exceed maximum Ethernet payload length (%d)", msg->length()/8, MAX_ETHERNET_DATA);
00119 
00120     totalFromHigherLayer++;
00121 
00122     // Creates MAC header information and encapsulates received higher layer data
00123     // with this information and transmits resultant frame to lower layer
00124 
00125     // create Ethernet frame, fill it in from EtherCtrl and encapsulate msg in it
00126     EV << "Encapsulating higher layer packet `" << msg->name() <<"' for MAC\n";
00127     EV << "Sent from " << simulation.module(msg->senderModuleId())->fullPath() << " at " << msg->sendingTime() << " and was created " << msg->creationTime() <<  "\n";
00128 
00129     EtherCtrl *etherctrl = dynamic_cast<EtherCtrl *>(M30(msg)->removeControlInfo());
00130     if (!etherctrl)
00131         error("packet `%s' from higher layer received without EtherCtrl", msg->name());
00132 
00133     EtherFrameWithLLC *frame = new EtherFrameWithLLC(msg->name(), ETH_FRAME);
00134 
00135     frame->setControl(0);
00136     frame->setSsap(etherctrl->getSsap());
00137     frame->setDsap(etherctrl->getDsap());
00138     frame->setDest(etherctrl->getDest()); // src address is filled in by MAC
00139     frame->setLength(8*(ETHER_MAC_FRAME_BYTES+ETHER_LLC_HEADER_LENGTH));
00140     delete etherctrl;
00141 
00142     frame->encapsulate(msg);
00143     if (frame->length() < 8*MIN_ETHERNET_FRAME)
00144         frame->setLength(8*MIN_ETHERNET_FRAME);
00145 
00146     send(frame, "lowerLayerOut");
00147 }


Member Data Documentation

long EtherLLC::droppedUnknownDSAP [protected]
 

Definition at line 47 of file EtherLLC.cc.

Referenced by finish(), initialize(), and processFrameFromMAC().

long EtherLLC::dsapsRegistered [protected]
 

Definition at line 43 of file EtherLLC.cc.

Referenced by finish(), handleDeregisterSAP(), handleRegisterSAP(), and initialize().

std::map<int,int> EtherLLC::dsapToPort [protected]
 

Definition at line 40 of file EtherLLC.cc.

Referenced by findPortForSAP(), handleDeregisterSAP(), and handleRegisterSAP().

int EtherLLC::seqNum [protected]
 

Definition at line 39 of file EtherLLC.cc.

Referenced by handleSendPause(), and initialize().

long EtherLLC::totalFromHigherLayer [protected]
 

Definition at line 44 of file EtherLLC.cc.

Referenced by finish(), initialize(), and processPacketFromHigherLayer().

long EtherLLC::totalFromMAC [protected]
 

Definition at line 45 of file EtherLLC.cc.

Referenced by finish(), initialize(), and processFrameFromMAC().

long EtherLLC::totalPassedUp [protected]
 

Definition at line 46 of file EtherLLC.cc.

Referenced by finish(), initialize(), and processFrameFromMAC().


The documentation for this class was generated from the following file:
Generated on Sat May 15 20:30:47 2004 for Ethernet by doxygen1.2.17