Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

EtherEncap Class Reference

List of all members.

Detailed Description

Performs Ethernet II encapsulation/decapsulation. More info in the NED file.


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


Member Function Documentation

void EtherEncap::finish  )  [protected, virtual]
 

00190 {
00191     if (par("writeScalars").boolValue())
00192     {
00193         recordScalar("packets from higher layer", totalFromHigherLayer);
00194         recordScalar("frames from MAC", totalFromMAC);
00195     }
00196 }

void EtherEncap::handleMessage cMessage *  msg  )  [protected, virtual]
 

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 }

void EtherEncap::handleSendPause cMessage *  msg  )  [protected, virtual]
 

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 }

void EtherEncap::initialize  )  [protected, virtual]
 

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 }

void EtherEncap::processFrameFromMAC EtherFrame *  msg  )  [protected, virtual]
 

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 }

void EtherEncap::processPacketFromHigherLayer cMessage *  msg  )  [protected, virtual]
 

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 }

void EtherEncap::registerInterface  )  [protected, virtual]
 

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 }

void EtherEncap::updateDisplayString  )  [protected, virtual]
 

00107 {
00108     char buf[80];
00109     sprintf(buf, "passed up: %ld\nsent: %ld", totalFromMAC, totalFromHigherLayer);
00110     displayString().setTagArg("t",0,buf);
00111 }


Member Data Documentation

int EtherEncap::seqNum [protected]
 

long EtherEncap::totalFromHigherLayer [protected]
 

long EtherEncap::totalFromMAC [protected]
 

long EtherEncap::totalPauseSent [protected]
 


The documentation for this class was generated from the following file:
Generated on Sat Apr 1 20:52:21 2006 for INET Framework for OMNeT++/OMNEST by  doxygen 1.4.1