Protected Member Functions | Protected Attributes

EtherLLC Class Reference

#include <EtherLLC.h>

List of all members.

Protected Member Functions

virtual void initialize ()
virtual void handleMessage (cMessage *msg)
virtual void finish ()
virtual void processPacketFromHigherLayer (cPacket *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)
virtual void updateDisplayString ()

Protected Attributes

int seqNum
std::map< int, int > dsapToPort
long dsapsRegistered
long totalFromHigherLayer
long totalFromMAC
long totalPassedUp
long droppedUnknownDSAP

Detailed Description

Implements the LLC sub-layer of the Datalink Layer in Ethernet networks

Definition at line 28 of file EtherLLC.h.


Member Function Documentation

int EtherLLC::findPortForSAP ( int  sap  )  [protected, virtual]

Definition at line 156 of file EtherLLC.cc.

Referenced by processFrameFromMAC().

{
    // here we actually do two lookups, but what the hell...
    if (dsapToPort.find(dsap)==dsapToPort.end())
        return -1;
    return dsapToPort[dsap];
}

void EtherLLC::finish (  )  [protected, virtual]

Definition at line 222 of file EtherLLC.cc.

{
    recordScalar("dsaps registered", dsapsRegistered);
    recordScalar("packets from higher layer", totalFromHigherLayer);
    recordScalar("frames from MAC", totalFromMAC);
    recordScalar("packets passed up", totalPassedUp);
    recordScalar("packets dropped - unknown DSAP", droppedUnknownDSAP);
}

void EtherLLC::handleDeregisterSAP ( cMessage *  msg  )  [protected, virtual]

Definition at line 182 of file EtherLLC.cc.

Referenced by handleMessage().

{
    Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl *>(msg->removeControlInfo());
    if (!etherctrl)
        error("packet `%s' from higher layer received without Ieee802Ctrl", msg->getName());
    int dsap = etherctrl->getDsap();

    EV << "Deregistering higher layer with DSAP=" << dsap << "\n";

    // delete from table (don't care if it's not in there)
    dsapToPort.erase(dsapToPort.find(dsap));
    dsapsRegistered = dsapToPort.size();
    delete msg;
}

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

Definition at line 37 of file EtherLLC.cc.

{
    if (msg->arrivedOn("lowerLayerIn"))
    {
        // frame received from lower layer
        processFrameFromMAC(check_and_cast<EtherFrameWithLLC *>(msg));
    }
    else
    {
        switch (msg->getKind())
        {
          case IEEE802CTRL_DATA:
            // data received from higher layer
            processPacketFromHigherLayer(PK(msg));
            break;

          case IEEE802CTRL_REGISTER_DSAP:
            // higher layer registers itself
            handleRegisterSAP(msg);
            break;

          case IEEE802CTRL_DEREGISTER_DSAP:
            // higher layer deregisters itself
            handleDeregisterSAP(msg);
            break;

          case IEEE802CTRL_SENDPAUSE:
            // higher layer want MAC to send PAUSE frame
            handleSendPause(msg);
            break;

          default:
            error("received message `%s' with unknown message kind %d",
                  msg->getName(), msg->getKind());
        }
    }

    if (ev.isGUI())
        updateDisplayString();
}

void EtherLLC::handleRegisterSAP ( cMessage *  msg  )  [protected, virtual]

Definition at line 164 of file EtherLLC.cc.

Referenced by handleMessage().

{
    int port = msg->getArrivalGate()->getIndex();
    Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl *>(msg->removeControlInfo());
    if (!etherctrl)
        error("packet `%s' from higher layer received without Ieee802Ctrl", msg->getName());
    int dsap = etherctrl->getDsap();

    EV << "Registering higher layer with DSAP=" << dsap << " on port=" << port << "\n";

    if (dsapToPort.find(dsap)!=dsapToPort.end())
        error("DSAP=%d already registered with port=%d", dsap, dsapToPort[dsap]);

    dsapToPort[dsap] = port;
    dsapsRegistered = dsapToPort.size();
    delete msg;
}

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

Definition at line 198 of file EtherLLC.cc.

Referenced by handleMessage().

{
    Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl *>(msg->removeControlInfo());
    if (!etherctrl)
        error("PAUSE command `%s' from higher layer received without Ieee802Ctrl", msg->getName());

    int pauseUnits = etherctrl->getPauseUnits();
    EV << "Creating and sending PAUSE frame, with duration=" << pauseUnits << " units\n";

    // create Ethernet frame
    char framename[30];
    sprintf(framename, "pause-%d-%d", getId(), seqNum++);
    EtherPauseFrame *frame = new EtherPauseFrame(framename);
    frame->setPauseTime(pauseUnits);

    frame->setByteLength(ETHER_MAC_FRAME_BYTES+ETHER_PAUSE_COMMAND_BYTES);
    if (frame->getByteLength() < MIN_ETHERNET_FRAME)
        frame->setByteLength(MIN_ETHERNET_FRAME);

    send(frame, "lowerLayerOut");

    delete msg;
}

void EtherLLC::initialize (  )  [protected, virtual]
void EtherLLC::processFrameFromMAC ( EtherFrameWithLLC *  msg  )  [protected, virtual]

Definition at line 123 of file EtherLLC.cc.

Referenced by handleMessage().

{
    totalFromMAC++;

    // decapsulate it and pass up to higher layers.
    int sap = frame->getDsap();
    int port = findPortForSAP(sap);
    if (port<0)
    {
        EV << "No higher layer registered for DSAP="<< sap <<", discarding frame `" << frame->getName() <<"'\n";
        droppedUnknownDSAP++;
        delete frame;
        return;
    }

    cPacket *higherlayermsg = frame->decapsulate();

    Ieee802Ctrl *etherctrl = new Ieee802Ctrl();
    etherctrl->setSsap(frame->getSsap());
    etherctrl->setDsap(frame->getDsap());
    etherctrl->setSrc(frame->getSrc());
    etherctrl->setDest(frame->getDest());
    higherlayermsg->setControlInfo(etherctrl);

    EV << "Decapsulating frame `" << frame->getName() <<"', "
          "passing up contained packet `" << higherlayermsg->getName() << "' "
          "to higher layer " << port << "\n";

    send(higherlayermsg, "upperLayerOut", port);
    totalPassedUp++;
    delete frame;
}

void EtherLLC::processPacketFromHigherLayer ( cPacket *  msg  )  [protected, virtual]

Definition at line 89 of file EtherLLC.cc.

Referenced by handleMessage().

{
    if (msg->getByteLength() > (MAX_ETHERNET_DATA-ETHER_LLC_HEADER_LENGTH))
        error("packet from higher layer (%d bytes) plus LLC header exceed maximum Ethernet payload length (%d)", (int)(msg->getByteLength()), MAX_ETHERNET_DATA);

    totalFromHigherLayer++;

    // Creates MAC header information and encapsulates received higher layer data
    // with this information and transmits resultant frame to lower layer

    // create Ethernet frame, fill it in from Ieee802Ctrl and encapsulate msg in it
    EV << "Encapsulating higher layer packet `" << msg->getName() <<"' for MAC\n";
    EV << "Sent from " << simulation.getModule(msg->getSenderModuleId())->getFullPath() << " at " << msg->getSendingTime() << " and was created " << msg->getCreationTime() <<  "\n";

    Ieee802Ctrl *etherctrl = dynamic_cast<Ieee802Ctrl *>(msg->removeControlInfo());
    if (!etherctrl)
        error("packet `%s' from higher layer received without Ieee802Ctrl", msg->getName());

    EtherFrameWithLLC *frame = new EtherFrameWithLLC(msg->getName());

    frame->setControl(0);
    frame->setSsap(etherctrl->getSsap());
    frame->setDsap(etherctrl->getDsap());
    frame->setDest(etherctrl->getDest()); // src address is filled in by MAC
    frame->setByteLength(ETHER_MAC_FRAME_BYTES+ETHER_LLC_HEADER_LENGTH);
    delete etherctrl;

    frame->encapsulate(msg);
    if (frame->getByteLength() < MIN_ETHERNET_FRAME)
        frame->setByteLength(MIN_ETHERNET_FRAME);

    send(frame, "lowerLayerOut");
}

void EtherLLC::updateDisplayString (  )  [protected, virtual]

Definition at line 78 of file EtherLLC.cc.

Referenced by handleMessage().

{
    char buf[80];
    sprintf(buf, "passed up: %ld\nsent: %ld", totalPassedUp, totalFromHigherLayer);
    if (droppedUnknownDSAP>0)
    {
        sprintf(buf+strlen(buf), "\ndropped (wrong DSAP): %ld", droppedUnknownDSAP);
    }
    getDisplayString().setTagArg("t",0,buf);
}


Member Data Documentation

long EtherLLC::droppedUnknownDSAP [protected]

Definition at line 39 of file EtherLLC.h.

Referenced by finish(), initialize(), processFrameFromMAC(), and updateDisplayString().

long EtherLLC::dsapsRegistered [protected]

Definition at line 35 of file EtherLLC.h.

Referenced by finish(), handleDeregisterSAP(), handleRegisterSAP(), and initialize().

std::map<int,int> EtherLLC::dsapToPort [protected]

Definition at line 32 of file EtherLLC.h.

Referenced by findPortForSAP(), handleDeregisterSAP(), and handleRegisterSAP().

int EtherLLC::seqNum [protected]

Definition at line 31 of file EtherLLC.h.

Referenced by handleSendPause(), and initialize().

Definition at line 36 of file EtherLLC.h.

Referenced by finish(), initialize(), processPacketFromHigherLayer(), and updateDisplayString().

long EtherLLC::totalFromMAC [protected]

Definition at line 37 of file EtherLLC.h.

Referenced by finish(), initialize(), and processFrameFromMAC().

long EtherLLC::totalPassedUp [protected]

Definition at line 38 of file EtherLLC.h.

Referenced by finish(), initialize(), processFrameFromMAC(), and updateDisplayString().


The documentation for this class was generated from the following files: