#include <MACRelayUnitBase.h>
Classes | |
| struct | AddressEntry |
| struct | MAC_compare |
Protected Types | |
| typedef std::map< MACAddress, AddressEntry, MAC_compare > | AddressTable |
Protected Member Functions | |
| virtual void | initialize () |
| virtual void | handleAndDispatchFrame (EtherFrame *frame, int inputport) |
| virtual void | broadcastFrame (EtherFrame *frame, int inputport) |
| virtual void | readAddressTable (const char *fileName) |
| virtual void | updateTableWithAddress (MACAddress &address, int portno) |
| virtual int | getPortForAddress (MACAddress &address) |
| virtual void | printAddressTable () |
| virtual void | removeAgedEntriesFromTable () |
| virtual void | removeOldestTableEntry () |
| virtual void | sendPauseFrame (int portno, int pauseUnits) |
Protected Attributes | |
| int | numPorts |
| int | addressTableSize |
| simtime_t | agingTime |
| AddressTable | addresstable |
| int | seqNum |
Implements base switching functionality of Ethernet switches. Note that neither activity() nor handleMessage() is redefined here -- active behavior (incl. queueing and performance aspects) must be addressed in subclasses.
Definition at line 36 of file MACRelayUnitBase.h.
typedef std::map<MACAddress, AddressEntry, MAC_compare> MACRelayUnitBase::AddressTable [protected] |
Definition at line 53 of file MACRelayUnitBase.h.
| void MACRelayUnitBase::broadcastFrame | ( | EtherFrame * | frame, | |
| int | inputport | |||
| ) | [protected, virtual] |
Utility function: sends the frame on all ports except inputport. The message pointer should not be referenced any more after this call.
Definition at line 123 of file MACRelayUnitBase.cc.
Referenced by handleAndDispatchFrame().
{
for (int i=0; i<numPorts; ++i)
if (i!=inputport)
send((EtherFrame*)frame->dup(), "lowerLayerOut", i);
delete frame;
}
| int MACRelayUnitBase::getPortForAddress | ( | MACAddress & | address | ) | [protected, virtual] |
Returns output port for address, or -1 if unknown.
Definition at line 212 of file MACRelayUnitBase.cc.
Referenced by handleAndDispatchFrame().
{
AddressTable::iterator iter = addresstable.find(address);
if (iter == addresstable.end())
{
// not found
return -1;
}
if (iter->second.insertionTime + agingTime <= simTime())
{
// don't use (and throw out) aged entries
EV << "Ignoring and deleting aged entry: "<< iter->first << " --> port" << iter->second.portno << "\n";
addresstable.erase(iter);
return -1;
}
return iter->second.portno;
}
| void MACRelayUnitBase::handleAndDispatchFrame | ( | EtherFrame * | frame, | |
| int | inputport | |||
| ) | [protected, virtual] |
Updates address table with source address, determines output port and sends out (or broadcasts) frame on ports. Includes calls to updateTableWithAddress() and getPortForAddress().
The message pointer should not be referenced any more after this call.
Definition at line 88 of file MACRelayUnitBase.cc.
Referenced by MACRelayUnitPP::processFrame(), and MACRelayUnitNP::processFrame().
{
// update address table
updateTableWithAddress(frame->getSrc(), inputport);
// handle broadcast frames first
if (frame->getDest().isBroadcast())
{
EV << "Broadcasting broadcast frame " << frame << endl;
broadcastFrame(frame, inputport);
return;
}
// Finds output port of destination address and sends to output port
// if not found then broadcasts to all other ports instead
int outputport = getPortForAddress(frame->getDest());
if (inputport==outputport)
{
EV << "Output port is same as input port, " << frame->getFullName() <<
" dest " << frame->getDest() << ", discarding frame\n";
delete frame;
return;
}
if (outputport>=0)
{
EV << "Sending frame " << frame << " with dest address " << frame->getDest() << " to port " << outputport << endl;
send(frame, "lowerLayerOut", outputport);
}
else
{
EV << "Dest address " << frame->getDest() << " unknown, broadcasting frame " << frame << endl;
broadcastFrame(frame, inputport);
}
}
| void MACRelayUnitBase::initialize | ( | ) | [protected, virtual] |
Read parameters parameters.
Reimplemented in MACRelayUnitNP, and MACRelayUnitPP.
Definition at line 64 of file MACRelayUnitBase.cc.
{
// number of ports
numPorts = gate("lowerLayerOut",0)->size();
if (gate("lowerLayerIn",0)->size()!=numPorts)
error("the sizes of the lowerLayerIn[] and lowerLayerOut[] gate vectors must be the same");
// other parameters
addressTableSize = par("addressTableSize");
addressTableSize = addressTableSize >= 0 ? addressTableSize : 0;
agingTime = par("agingTime");
agingTime = agingTime > 0 ? agingTime : 10;
// Option to pre-read in Address Table. To turn ot off, set addressTableFile to empty string
const char *addressTableFile = par("addressTableFile");
if (addressTableFile && *addressTableFile)
readAddressTable(addressTableFile);
seqNum = 0;
WATCH_MAP(addresstable);
}
| void MACRelayUnitBase::printAddressTable | ( | ) | [protected, virtual] |
Prints contents of address table on ev.
Definition at line 131 of file MACRelayUnitBase.cc.
Referenced by MACRelayUnitPP::processFrame(), and MACRelayUnitNP::processFrame().
{
AddressTable::iterator iter;
EV << "Address Table (" << addresstable.size() << " entries):\n";
for (iter = addresstable.begin(); iter!=addresstable.end(); ++iter)
{
EV << " " << iter->first << " --> port" << iter->second.portno <<
(iter->second.insertionTime+agingTime <= simTime() ? " (aged)" : "") << endl;
}
}
| void MACRelayUnitBase::readAddressTable | ( | const char * | fileName | ) | [protected, virtual] |
Pre-reads in entries for Address Table during initialization.
Definition at line 231 of file MACRelayUnitBase.cc.
Referenced by initialize().
{
FILE *fp = fopen(fileName, "r");
if (fp == NULL)
error("cannot open address table file `%s'", fileName);
// Syntax of the file goes as:
// Address in hexadecimal representation, Portno
// ffffffff 1
// ffffeed1 2
// aabcdeff 3
//
// etc...
//
// Each iteration of the loop reads in an entire line i.e. up to '\n' or EOF characters
// and uses strtok to extract tokens from the resulting string
char *line;
int lineno = 0;
while ((line = fgetline(fp)) != NULL)
{
lineno++;
// lines beginning with '#' are treated as comments
if (line[0]=='#')
continue;
// scan in hexaddress
char *hexaddress = strtok(line, " \t");
// scan in port number
char *portno = strtok(NULL, " \t");
// empty line?
if (!hexaddress)
continue;
// broken line?
if (!portno)
error("line %d invalid in address table file `%s'", lineno, fileName);
// Create an entry with address and portno and insert into table
AddressEntry entry;
entry.insertionTime = 0;
entry.portno = atoi(portno);
addresstable[MACAddress(hexaddress)] = entry;
// Garbage collection before next iteration
delete [] line;
}
fclose(fp);
}
| void MACRelayUnitBase::removeAgedEntriesFromTable | ( | ) | [protected, virtual] |
Utility function: throws out all aged entries from table.
Definition at line 142 of file MACRelayUnitBase.cc.
Referenced by updateTableWithAddress().
{
for (AddressTable::iterator iter = addresstable.begin(); iter != addresstable.end();)
{
AddressTable::iterator cur = iter++; // iter will get invalidated after erase()
AddressEntry& entry = cur->second;
if (entry.insertionTime + agingTime <= simTime())
{
EV << "Removing aged entry from Address Table: " <<
cur->first << " --> port" << cur->second.portno << "\n";
addresstable.erase(cur);
}
}
}
| void MACRelayUnitBase::removeOldestTableEntry | ( | ) | [protected, virtual] |
Utility function: throws out oldest (not necessarily aged) entry from table.
Definition at line 157 of file MACRelayUnitBase.cc.
Referenced by updateTableWithAddress().
{
AddressTable::iterator oldest = addresstable.end();
simtime_t oldestInsertTime = simTime()+1;
for (AddressTable::iterator iter = addresstable.begin(); iter != addresstable.end(); iter++)
{
if (iter->second.insertionTime < oldestInsertTime)
{
oldest = iter;
oldestInsertTime = iter->second.insertionTime;
}
}
if (oldest != addresstable.end())
{
EV << "Table full, removing oldest entry: " <<
oldest->first << " --> port" << oldest->second.portno << "\n";
addresstable.erase(oldest);
}
}
| void MACRelayUnitBase::sendPauseFrame | ( | int | portno, | |
| int | pauseUnits | |||
| ) | [protected, virtual] |
Utility function (for use by subclasses) to send a flow control PAUSE frame on the given port.
Definition at line 283 of file MACRelayUnitBase.cc.
Referenced by MACRelayUnitPP::handleIncomingFrame(), and MACRelayUnitNP::handleIncomingFrame().
{
EV << "Creating and sending PAUSE frame on port " << portno << " with duration=" << pauseUnits << " units\n";
// create Ethernet frame
char framename[40];
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", portno);
}
| void MACRelayUnitBase::updateTableWithAddress | ( | MACAddress & | address, | |
| int | portno | |||
| ) | [protected, virtual] |
Enters address into table.
Definition at line 177 of file MACRelayUnitBase.cc.
Referenced by handleAndDispatchFrame().
{
AddressTable::iterator iter;
iter = addresstable.find(address);
if (iter == addresstable.end())
{
// Observe finite table size
if (addressTableSize!=0 && addresstable.size() == (unsigned int)addressTableSize)
{
// lazy removal of aged entries: only if table gets full (this step is not strictly needed)
EV << "Making room in Address Table by throwing out aged entries.\n";
removeAgedEntriesFromTable();
if (addresstable.size() == (unsigned int)addressTableSize)
removeOldestTableEntry();
}
// Add entry to table
EV << "Adding entry to Address Table: "<< address << " --> port" << portno << "\n";
AddressEntry entry;
entry.portno = portno;
entry.insertionTime = simTime();
addresstable[address] = entry;
}
else
{
// Update existing entry
EV << "Updating entry in Address Table: "<< address << " --> port" << portno << "\n";
AddressEntry& entry = iter->second;
entry.insertionTime = simTime();
entry.portno = portno;
}
}
AddressTable MACRelayUnitBase::addresstable [protected] |
Definition at line 60 of file MACRelayUnitBase.h.
Referenced by getPortForAddress(), initialize(), printAddressTable(), readAddressTable(), removeAgedEntriesFromTable(), removeOldestTableEntry(), and updateTableWithAddress().
int MACRelayUnitBase::addressTableSize [protected] |
Definition at line 57 of file MACRelayUnitBase.h.
Referenced by MACRelayUnitPP::initialize(), MACRelayUnitNP::initialize(), initialize(), and updateTableWithAddress().
simtime_t MACRelayUnitBase::agingTime [protected] |
Definition at line 58 of file MACRelayUnitBase.h.
Referenced by getPortForAddress(), MACRelayUnitPP::initialize(), MACRelayUnitNP::initialize(), initialize(), printAddressTable(), and removeAgedEntriesFromTable().
int MACRelayUnitBase::numPorts [protected] |
Definition at line 56 of file MACRelayUnitBase.h.
Referenced by broadcastFrame(), MACRelayUnitPP::handleIncomingFrame(), MACRelayUnitNP::handleIncomingFrame(), MACRelayUnitPP::initialize(), MACRelayUnitNP::initialize(), and initialize().
int MACRelayUnitBase::seqNum [protected] |
Definition at line 62 of file MACRelayUnitBase.h.
Referenced by initialize(), and sendPauseFrame().
1.7.1