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 }
|
|
|
|
|
|
|
|
|