Protected Member Functions | |
| virtual void | initialize () |
| virtual void | handleMessage (cMessage *msg) |
| virtual void | finish () |
| virtual void | registerInterface () |
| virtual void | processPacketFromHigherLayer (cMessage *msg) |
| virtual void | processFrameFromMAC (EtherFrame *msg) |
| virtual void | handleSendPause (cMessage *msg) |
| virtual void | updateDisplayString () |
Protected Attributes | |
| int | seqNum |
| long | totalFromHigherLayer |
| long | totalFromMAC |
| long | totalPauseSent |
|
|
00190 {
00191 if (par("writeScalars").boolValue())
00192 {
00193 recordScalar("packets from higher layer", totalFromHigherLayer);
00194 recordScalar("frames from MAC", totalFromMAC);
00195 }
00196 }
|
|
|
00077 {
00078 if (msg->arrivedOn("lowerLayerIn"))
00079 {
00080 processFrameFromMAC(check_and_cast<EtherFrame *>(msg));
00081 }
00082 else
00083 {
00084 // from higher layer
00085 switch(msg->kind())
00086 {
00087 case IEEE802CTRL_DATA:
00088 case 0: // default message kind (0) is also accepted
00089 processPacketFromHigherLayer(msg);
00090 break;
00091
00092 case IEEE802CTRL_SENDPAUSE:
00093 // higher layer want MAC to send PAUSE frame
00094 handleSendPause(msg);
00095 break;
00096
00097 default:
00098 error("received message `%s' with unknown message kind %d", msg->name(), msg->kind());
00099 }
00100 }
00101
00102 if (ev.isGUI())
00103 updateDisplayString();
00104 }
|
|
|
00164 {
00165 Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl*>(msg->removeControlInfo());
00166 if (!etherctrl)
00167 error("PAUSE command `%s' from higher layer received without Ieee802Ctrl", msg->name());
00168 int pauseUnits = etherctrl->getPauseUnits();
00169 delete etherctrl;
00170
00171 EV << "Creating and sending PAUSE frame, with duration=" << pauseUnits << " units\n";
00172
00173 // create Ethernet frame
00174 char framename[30];
00175 sprintf(framename, "pause-%d-%d", id(), seqNum++);
00176 EtherPauseFrame *frame = new EtherPauseFrame(framename, ETH_PAUSE);
00177 frame->setPauseTime(pauseUnits);
00178
00179 frame->setByteLength(ETHER_MAC_FRAME_BYTES+ETHER_PAUSE_COMMAND_BYTES);
00180 if (frame->byteLength() < MIN_ETHERNET_FRAME)
00181 frame->setByteLength(MIN_ETHERNET_FRAME);
00182
00183 send(frame, "lowerLayerOut");
00184 delete msg;
00185
00186 totalPauseSent++;
00187 }
|
|
|
00063 {
00064 seqNum = 0;
00065 WATCH(seqNum);
00066
00067 totalFromHigherLayer = totalFromMAC = totalPauseSent = 0;
00068 WATCH(totalFromHigherLayer);
00069 WATCH(totalFromMAC);
00070 WATCH(totalPauseSent);
00071
00072 // register ourselves in InterfaceTable
00073 registerInterface();
00074 }
|
|
|
00143 {
00144 totalFromMAC++;
00145
00146 // decapsulate and attach control info
00147 cMessage *higherlayermsg = frame->decapsulate();
00148
00149 // add Ieee802Ctrl to packet
00150 Ieee802Ctrl *etherctrl = new Ieee802Ctrl();
00151 etherctrl->setSrc(frame->getSrc());
00152 etherctrl->setDest(frame->getDest());
00153 higherlayermsg->setControlInfo(etherctrl);
00154
00155 EV << "Decapsulating frame `" << frame->name() <<"', passing up contained "
00156 "packet `" << higherlayermsg->name() << "' to higher layer\n";
00157
00158 // pass up to higher layers.
00159 send(higherlayermsg, "upperLayerOut");
00160 delete frame;
00161 }
|
|
|
00114 {
00115 if (msg->byteLength() > MAX_ETHERNET_DATA)
00116 error("packet from higher layer (%d bytes) exceeds maximum Ethernet payload length (%d)", msg->byteLength(), MAX_ETHERNET_DATA);
00117
00118 totalFromHigherLayer++;
00119
00120 // Creates MAC header information and encapsulates received higher layer data
00121 // with this information and transmits resultant frame to lower layer
00122
00123 // create Ethernet frame, fill it in from Ieee802Ctrl and encapsulate msg in it
00124 EV << "Encapsulating higher layer packet `" << msg->name() <<"' for MAC\n";
00125
00126 Ieee802Ctrl *etherctrl = check_and_cast<Ieee802Ctrl*>(msg->removeControlInfo());
00127 EthernetIIFrame *frame = new EthernetIIFrame(msg->name(), ETH_FRAME);
00128
00129 frame->setSrc(etherctrl->getSrc()); // if blank, will be filled in by MAC
00130 frame->setDest(etherctrl->getDest());
00131 frame->setEtherType(etherctrl->getEtherType());
00132 frame->setByteLength(ETHER_MAC_FRAME_BYTES);
00133 delete etherctrl;
00134
00135 frame->encapsulate(msg);
00136 if (frame->byteLength() < MIN_ETHERNET_FRAME)
00137 frame->setByteLength(MIN_ETHERNET_FRAME); // "padding"
00138
00139 send(frame, "lowerLayerOut");
00140 }
|
|
|
00199 {
00200 InterfaceEntry *e = new InterfaceEntry();
00201
00202 // interface name: NetworkInterface module's name without special characters ([])
00203 // --> Emin : Parent module name is used since EtherEncap belongs to EthernetInterface.
00204 char *interfaceName = new char[strlen(parentModule()->fullName())+1];
00205 char *d=interfaceName;
00206 for (const char *s=parentModule()->fullName(); *s; s++)
00207 if (isalnum(*s))
00208 *d++ = *s;
00209 *d = '\0';
00210
00211 e->setName(interfaceName);
00212 delete [] interfaceName;
00213
00214 MACAddress myMACAddress = ((EtherMAC *)parentModule()->submodule("mac"))->getMACAddress();
00215 e->setMACAddress(myMACAddress);
00216
00217 // generate interface identifier for IPv6
00218 e->setInterfaceToken(myMACAddress.formInterfaceIdentifier());
00219
00220 // MTU is 1500 on Ethernet
00221 e->setMtu(1500);
00222
00223 // capabilities
00224 e->setBroadcast(true);
00225 e->setMulticast(true);
00226 e->setPointToPoint(false);
00227
00228 // add
00229 InterfaceTable *ift = InterfaceTableAccess().get();
00230 ift->addInterface(e, this);
00231 }
|
|
|
00107 {
00108 char buf[80];
00109 sprintf(buf, "passed up: %ld\nsent: %ld", totalFromMAC, totalFromHigherLayer);
00110 displayString().setTagArg("t",0,buf);
00111 }
|
|
|
|
|
|
|
|
|
|
|
|
|
1.4.1