#include <PPP.h>
Public Member Functions | |
| PPP () | |
| virtual | ~PPP () |
Protected Member Functions | |
| virtual InterfaceEntry * | registerInterface (double datarate) |
| virtual void | startTransmitting (cPacket *msg) |
| virtual PPPFrame * | encapsulate (cPacket *msg) |
| virtual cPacket * | decapsulate (PPPFrame *pppFrame) |
| virtual void | displayBusy () |
| virtual void | displayIdle () |
| virtual void | updateDisplayString () |
| virtual void | updateHasSubcribers () |
| virtual void | receiveChangeNotification (int category, const cPolymorphic *details) |
| virtual int | numInitStages () const |
| virtual void | initialize (int stage) |
| virtual void | handleMessage (cMessage *msg) |
Protected Attributes | |
| long | txQueueLimit |
| cGate * | physOutGate |
| cChannel * | datarateChannel |
| cQueue | txQueue |
| cMessage * | endTransmissionEvent |
| IPassiveQueue * | queueModule |
| InterfaceEntry * | interfaceEntry |
| NotificationBoard * | nb |
| TxNotifDetails | notifDetails |
| bool | hasSubscribers |
| std::string | oldConnColor |
| long | numSent |
| long | numRcvdOK |
| long | numBitErr |
| long | numDroppedIfaceDown |
PPP implementation.
Definition at line 35 of file PPP.h.
| PPP::PPP | ( | ) |
Definition at line 32 of file PPP.cc.
{
endTransmissionEvent = NULL;
nb = NULL;
}
| PPP::~PPP | ( | ) | [virtual] |
Definition at line 38 of file PPP.cc.
{
// kludgy way to check that nb is not deleted yet
if (nb && nb == findModuleWhereverInNode("notificationBoard", this))
nb->unsubscribe(this, NF_SUBSCRIBERLIST_CHANGED);
cancelAndDelete(endTransmissionEvent);
}
| cPacket * PPP::decapsulate | ( | PPPFrame * | pppFrame | ) | [protected, virtual] |
Definition at line 339 of file PPP.cc.
Referenced by handleMessage().
{
cPacket *msg = pppFrame->decapsulate();
delete pppFrame;
return msg;
}
| void PPP::displayBusy | ( | ) | [protected, virtual] |
Definition at line 267 of file PPP.cc.
Referenced by startTransmitting().
{
getDisplayString().setTagArg("i",1, txQueue.length()>=3 ? "red" : "yellow");
datarateChannel->getDisplayString().setTagArg("ls",0,"yellow");
datarateChannel->getDisplayString().setTagArg("ls",1,"3");
}
| void PPP::displayIdle | ( | ) | [protected, virtual] |
Definition at line 274 of file PPP.cc.
Referenced by handleMessage().
{
getDisplayString().setTagArg("i",1,"");
datarateChannel->getDisplayString().setTagArg("ls",0,oldConnColor.c_str());
datarateChannel->getDisplayString().setTagArg("ls",1,"1");
}
| PPPFrame * PPP::encapsulate | ( | cPacket * | msg | ) | [protected, virtual] |
Definition at line 331 of file PPP.cc.
Referenced by startTransmitting().
{
PPPFrame *pppFrame = new PPPFrame(msg->getName());
pppFrame->setByteLength(PPP_OVERHEAD_BYTES);
pppFrame->encapsulate(msg);
return pppFrame;
}
| void PPP::handleMessage | ( | cMessage * | msg | ) | [protected, virtual] |
Definition at line 180 of file PPP.cc.
{
if (datarateChannel==NULL)
{
EV << "Interface is not connected, dropping packet " << msg << endl;
delete msg;
numDroppedIfaceDown++;
}
else if (msg==endTransmissionEvent)
{
// Transmission finished, we can start next one.
EV << "Transmission finished.\n";
if (ev.isGUI()) displayIdle();
if (hasSubscribers)
{
// fire notification
notifDetails.setPacket(NULL);
nb->fireChangeNotification(NF_PP_TX_END, ¬ifDetails);
}
if (!txQueue.empty())
{
cPacket *pk = (cPacket *) txQueue.pop();
startTransmitting(pk);
numSent++;
}
else if (queueModule)
{
// tell queue module that we've become idle
queueModule->requestPacket();
}
}
else if (msg->arrivedOn("phys$i"))
{
if (hasSubscribers)
{
// fire notification
notifDetails.setPacket(PK(msg));
nb->fireChangeNotification(NF_PP_RX_END, ¬ifDetails);
}
// check for bit errors
if (PK(msg)->hasBitError())
{
EV << "Bit error in " << msg << endl;
numBitErr++;
delete msg;
}
else
{
// pass up payload
cPacket *payload = decapsulate(check_and_cast<PPPFrame *>(msg));
numRcvdOK++;
send(payload,"netwOut");
}
}
else // arrived on gate "netwIn"
{
if (endTransmissionEvent->isScheduled())
{
// We are currently busy, so just queue up the packet.
EV << "Received " << msg << " for transmission but transmitter busy, queueing.\n";
if (ev.isGUI() && txQueue.length()>=3) getDisplayString().setTagArg("i",1,"red");
if (txQueueLimit && txQueue.length()>txQueueLimit)
error("txQueue length exceeds %d -- this is probably due to "
"a bogus app model generating excessive traffic "
"(or if this is normal, increase txQueueLimit!)",
txQueueLimit);
txQueue.insert(msg);
}
else
{
// We are idle, so we can start transmitting right away.
EV << "Received " << msg << " for transmission\n";
startTransmitting(PK(msg));
numSent++;
}
}
if (ev.isGUI())
updateDisplayString();
}
| void PPP::initialize | ( | int | stage | ) | [protected, virtual] |
Definition at line 46 of file PPP.cc.
{
// all initialization is done in the first stage
if (stage==0)
{
txQueue.setName("txQueue");
endTransmissionEvent = new cMessage("pppEndTxEvent");
txQueueLimit = par("txQueueLimit");
interfaceEntry = NULL;
numSent = numRcvdOK = numBitErr = numDroppedIfaceDown = 0;
WATCH(numSent);
WATCH(numRcvdOK);
WATCH(numBitErr);
WATCH(numDroppedIfaceDown);
// find queueModule
queueModule = NULL;
if (par("queueModule").stringValue()[0])
{
cModule *mod = getParentModule()->getSubmodule(par("queueModule").stringValue());
queueModule = check_and_cast<IPassiveQueue *>(mod);
}
// remember the output gate now, to speed up send()
physOutGate = gate("phys$o");
// we're connected if other end of connection path is an input gate
bool connected = physOutGate->getPathEndGate()->getType()==cGate::INPUT;
// if we're connected, get the gate with transmission rate
datarateChannel = connected ? physOutGate->getTransmissionChannel() : NULL;
double datarate = connected ? datarateChannel->par("datarate").doubleValue() : 0;
// register our interface entry in IInterfaceTable
interfaceEntry = registerInterface(datarate);
// prepare to fire notifications
nb = NotificationBoardAccess().get();
notifDetails.setInterfaceEntry(interfaceEntry);
nb->subscribe(this, NF_SUBSCRIBERLIST_CHANGED);
updateHasSubcribers();
// display string stuff
if (ev.isGUI())
{
if (connected) {
oldConnColor = datarateChannel->getDisplayString().getTagArg("ls",0);
}
else {
// we are not connected: gray out our icon
getDisplayString().setTagArg("i",1,"#707070");
getDisplayString().setTagArg("i",2,"100");
}
}
// request first frame to send
if (queueModule)
{
EV << "Requesting first frame from queue module\n";
queueModule->requestPacket();
}
}
// update display string when addresses have been autoconfigured etc.
if (stage==3)
{
updateDisplayString();
}
}
| virtual int PPP::numInitStages | ( | ) | const [inline, protected, virtual] |
| void PPP::receiveChangeNotification | ( | int | category, | |
| const cPolymorphic * | details | |||
| ) | [protected, virtual] |
Called by the NotificationBoard whenever a change of a category occurs to which this client has subscribed.
Implements INotifiable.
Definition at line 325 of file PPP.cc.
{
if (category==NF_SUBSCRIBERLIST_CHANGED)
updateHasSubcribers();
}
| InterfaceEntry * PPP::registerInterface | ( | double | datarate | ) | [protected, virtual] |
Definition at line 119 of file PPP.cc.
Referenced by initialize().
{
InterfaceEntry *e = new InterfaceEntry();
// interface name: our module name without special characters ([])
char *interfaceName = new char[strlen(getParentModule()->getFullName())+1];
char *d=interfaceName;
for (const char *s=getParentModule()->getFullName(); *s; s++)
if (isalnum(*s))
*d++ = *s;
*d = '\0';
e->setName(interfaceName);
delete [] interfaceName;
// data rate
e->setDatarate(datarate);
// generate a link-layer address to be used as interface token for IPv6
InterfaceToken token(0, simulation.getUniqueNumber(), 64);
e->setInterfaceToken(token);
// MTU: typical values are 576 (Internet de facto), 1500 (Ethernet-friendly),
// 4000 (on some point-to-point links), 4470 (Cisco routers default, FDDI compatible)
e->setMtu(par("mtu"));
// capabilities
e->setMulticast(true);
e->setPointToPoint(true);
// add
IInterfaceTable *ift = InterfaceTableAccess().get();
ift->addInterface(e, this);
return e;
}
| void PPP::startTransmitting | ( | cPacket * | msg | ) | [protected, virtual] |
Definition at line 157 of file PPP.cc.
Referenced by handleMessage().
{
// if there's any control info, remove it; then encapsulate the packet
delete msg->removeControlInfo();
PPPFrame *pppFrame = encapsulate(msg);
if (ev.isGUI()) displayBusy();
if (hasSubscribers)
{
// fire notification
notifDetails.setPacket(pppFrame);
nb->fireChangeNotification(NF_PP_TX_BEGIN, ¬ifDetails);
}
// send
EV << "Starting transmission of " << pppFrame << endl;
send(pppFrame, physOutGate);
// schedule an event for the time when last bit will leave the gate.
simtime_t endTransmissionTime = datarateChannel->getTransmissionFinishTime();
scheduleAt(endTransmissionTime, endTransmissionEvent);
}
| void PPP::updateDisplayString | ( | ) | [protected, virtual] |
Definition at line 281 of file PPP.cc.
Referenced by handleMessage(), and initialize().
{
if (ev.isDisabled())
{
// speed up things
getDisplayString().setTagArg("t",0,"");
}
else if (datarateChannel!=NULL)
{
double datarate = datarateChannel->par("datarate").doubleValue();
char datarateText[40];
if (datarate>=1e9) sprintf(datarateText,"%gG", datarate/1e9);
else if (datarate>=1e6) sprintf(datarateText,"%gM", datarate/1e6);
else if (datarate>=1e3) sprintf(datarateText,"%gK", datarate/1e3);
else sprintf(datarateText,"%gbps", datarate);
/* TBD find solution for displaying IP address without dependence on IPv6 or IPv6
IPAddress addr = interfaceEntry->ipv4Data()->getIPAddress();
sprintf(buf, "%s / %s\nrcv:%ld snt:%ld", addr.isUnspecified()?"-":addr.str().c_str(), datarateText, numRcvdOK, numSent);
*/
char buf[80];
sprintf(buf, "%s\nrcv:%ld snt:%ld", datarateText, numRcvdOK, numSent);
if (numBitErr>0)
sprintf(buf+strlen(buf), "\nerr:%ld", numBitErr);
getDisplayString().setTagArg("t",0,buf);
}
else
{
char buf[80];
sprintf(buf, "not connected\ndropped:%ld", numDroppedIfaceDown);
getDisplayString().setTagArg("t",0,buf);
}
}
| void PPP::updateHasSubcribers | ( | ) | [protected, virtual] |
Definition at line 318 of file PPP.cc.
Referenced by initialize(), and receiveChangeNotification().
{
hasSubscribers = nb->hasSubscribers(NF_PP_TX_BEGIN) ||
nb->hasSubscribers(NF_PP_TX_END) ||
nb->hasSubscribers(NF_PP_RX_END);
}
cChannel* PPP::datarateChannel [protected] |
Definition at line 40 of file PPP.h.
Referenced by displayBusy(), displayIdle(), handleMessage(), initialize(), startTransmitting(), and updateDisplayString().
cMessage* PPP::endTransmissionEvent [protected] |
Definition at line 43 of file PPP.h.
Referenced by handleMessage(), initialize(), PPP(), startTransmitting(), and ~PPP().
bool PPP::hasSubscribers [protected] |
Definition at line 50 of file PPP.h.
Referenced by handleMessage(), startTransmitting(), and updateHasSubcribers().
InterfaceEntry* PPP::interfaceEntry [protected] |
Definition at line 46 of file PPP.h.
Referenced by initialize().
NotificationBoard* PPP::nb [protected] |
Definition at line 48 of file PPP.h.
Referenced by handleMessage(), initialize(), PPP(), startTransmitting(), updateHasSubcribers(), and ~PPP().
TxNotifDetails PPP::notifDetails [protected] |
Definition at line 49 of file PPP.h.
Referenced by handleMessage(), initialize(), and startTransmitting().
long PPP::numBitErr [protected] |
Definition at line 57 of file PPP.h.
Referenced by handleMessage(), initialize(), and updateDisplayString().
long PPP::numDroppedIfaceDown [protected] |
Definition at line 58 of file PPP.h.
Referenced by handleMessage(), initialize(), and updateDisplayString().
long PPP::numRcvdOK [protected] |
Definition at line 56 of file PPP.h.
Referenced by handleMessage(), initialize(), and updateDisplayString().
long PPP::numSent [protected] |
Definition at line 55 of file PPP.h.
Referenced by handleMessage(), initialize(), and updateDisplayString().
std::string PPP::oldConnColor [protected] |
Definition at line 52 of file PPP.h.
Referenced by displayIdle(), and initialize().
cGate* PPP::physOutGate [protected] |
Definition at line 39 of file PPP.h.
Referenced by initialize(), and startTransmitting().
IPassiveQueue* PPP::queueModule [protected] |
Definition at line 44 of file PPP.h.
Referenced by handleMessage(), and initialize().
cQueue PPP::txQueue [protected] |
Definition at line 42 of file PPP.h.
Referenced by displayBusy(), handleMessage(), and initialize().
long PPP::txQueueLimit [protected] |
Definition at line 38 of file PPP.h.
Referenced by handleMessage(), and initialize().
1.7.1