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 |
Definition at line 36 of file EtherLLC.cc.
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
||||||||||||||||
|
|
|
|
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 }
|
|
|
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 }
|
|
|
Definition at line 47 of file EtherLLC.cc. Referenced by finish(), initialize(), and processFrameFromMAC(). |
|
|
Definition at line 43 of file EtherLLC.cc. Referenced by finish(), handleDeregisterSAP(), handleRegisterSAP(), and initialize(). |
|
|
Definition at line 40 of file EtherLLC.cc. Referenced by findPortForSAP(), handleDeregisterSAP(), and handleRegisterSAP(). |
|
|
Definition at line 39 of file EtherLLC.cc. Referenced by handleSendPause(), and initialize(). |
|
|
Definition at line 44 of file EtherLLC.cc. Referenced by finish(), initialize(), and processPacketFromHigherLayer(). |
|
|
Definition at line 45 of file EtherLLC.cc. Referenced by finish(), initialize(), and processFrameFromMAC(). |
|
|
Definition at line 46 of file EtherLLC.cc. Referenced by finish(), initialize(), and processFrameFromMAC(). |
1.2.17