Protected Member Functions | |
virtual void | initialize () |
virtual void | handleMessage (cMessage *msg) |
virtual void | finish () |
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 |
|
00186 { 00187 if (par("writeScalars").boolValue()) 00188 { 00189 recordScalar("packets from higher layer", totalFromHigherLayer); 00190 recordScalar("frames from MAC", totalFromMAC); 00191 } 00192 }
|
|
00073 { 00074 if (msg->arrivedOn("lowerLayerIn")) 00075 { 00076 processFrameFromMAC(check_and_cast<EtherFrame *>(msg)); 00077 } 00078 else 00079 { 00080 // from higher layer 00081 switch(msg->kind()) 00082 { 00083 case IEEE802CTRL_DATA: 00084 case 0: // default message kind (0) is also accepted 00085 processPacketFromHigherLayer(msg); 00086 break; 00087 00088 case IEEE802CTRL_SENDPAUSE: 00089 // higher layer want MAC to send PAUSE frame 00090 handleSendPause(msg); 00091 break; 00092 00093 default: 00094 error("received message `%s' with unknown message kind %d", msg->name(), msg->kind()); 00095 } 00096 } 00097 00098 if (ev.isGUI()) 00099 updateDisplayString(); 00100 }
|
|
00160 { 00161 Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl*>(msg->removeControlInfo()); 00162 if (!etherctrl) 00163 error("PAUSE command `%s' from higher layer received without Ieee802Ctrl", msg->name()); 00164 int pauseUnits = etherctrl->getPauseUnits(); 00165 delete etherctrl; 00166 00167 EV << "Creating and sending PAUSE frame, with duration=" << pauseUnits << " units\n"; 00168 00169 // create Ethernet frame 00170 char framename[30]; 00171 sprintf(framename, "pause-%d-%d", id(), seqNum++); 00172 EtherPauseFrame *frame = new EtherPauseFrame(framename, ETH_PAUSE); 00173 frame->setPauseTime(pauseUnits); 00174 00175 frame->setByteLength(ETHER_MAC_FRAME_BYTES+ETHER_PAUSE_COMMAND_BYTES); 00176 if (frame->byteLength() < MIN_ETHERNET_FRAME) 00177 frame->setByteLength(MIN_ETHERNET_FRAME); 00178 00179 send(frame, "lowerLayerOut"); 00180 delete msg; 00181 00182 totalPauseSent++; 00183 }
|
|
00062 { 00063 seqNum = 0; 00064 WATCH(seqNum); 00065 00066 totalFromHigherLayer = totalFromMAC = totalPauseSent = 0; 00067 WATCH(totalFromHigherLayer); 00068 WATCH(totalFromMAC); 00069 WATCH(totalPauseSent); 00070 }
|
|
00139 { 00140 totalFromMAC++; 00141 00142 // decapsulate and attach control info 00143 cMessage *higherlayermsg = frame->decapsulate(); 00144 00145 // add Ieee802Ctrl to packet 00146 Ieee802Ctrl *etherctrl = new Ieee802Ctrl(); 00147 etherctrl->setSrc(frame->getSrc()); 00148 etherctrl->setDest(frame->getDest()); 00149 higherlayermsg->setControlInfo(etherctrl); 00150 00151 EV << "Decapsulating frame `" << frame->name() <<"', passing up contained " 00152 "packet `" << higherlayermsg->name() << "' to higher layer\n"; 00153 00154 // pass up to higher layers. 00155 send(higherlayermsg, "upperLayerOut"); 00156 delete frame; 00157 }
|
|
00110 { 00111 if (msg->byteLength() > MAX_ETHERNET_DATA) 00112 error("packet from higher layer (%d bytes) exceeds maximum Ethernet payload length (%d)", msg->byteLength(), MAX_ETHERNET_DATA); 00113 00114 totalFromHigherLayer++; 00115 00116 // Creates MAC header information and encapsulates received higher layer data 00117 // with this information and transmits resultant frame to lower layer 00118 00119 // create Ethernet frame, fill it in from Ieee802Ctrl and encapsulate msg in it 00120 EV << "Encapsulating higher layer packet `" << msg->name() <<"' for MAC\n"; 00121 00122 Ieee802Ctrl *etherctrl = check_and_cast<Ieee802Ctrl*>(msg->removeControlInfo()); 00123 EthernetIIFrame *frame = new EthernetIIFrame(msg->name(), ETH_FRAME); 00124 00125 frame->setSrc(etherctrl->getSrc()); // if blank, will be filled in by MAC 00126 frame->setDest(etherctrl->getDest()); 00127 frame->setEtherType(etherctrl->getEtherType()); 00128 frame->setByteLength(ETHER_MAC_FRAME_BYTES); 00129 delete etherctrl; 00130 00131 frame->encapsulate(msg); 00132 if (frame->byteLength() < MIN_ETHERNET_FRAME) 00133 frame->setByteLength(MIN_ETHERNET_FRAME); // "padding" 00134 00135 send(frame, "lowerLayerOut"); 00136 }
|
|
00103 { 00104 char buf[80]; 00105 sprintf(buf, "passed up: %ld\nsent: %ld", totalFromMAC, totalFromHigherLayer); 00106 displayString().setTagArg("t",0,buf); 00107 }
|
|
|
|
|
|
|
|
|