Protected Member Functions

NetworkInfo Class Reference

#include <NetworkInfo.h>

Inheritance diagram for NetworkInfo:
IScriptable

List of all members.

Protected Member Functions

virtual void initialize ()
virtual void handleMessage (cMessage *msg)
virtual void processCommand (const cXMLElement &node)
virtual void dumpRoutingInfo (cModule *target, const char *filename, bool append, bool compat)

Detailed Description

TODO documentation

Definition at line 28 of file NetworkInfo.h.


Member Function Documentation

void NetworkInfo::dumpRoutingInfo ( cModule *  target,
const char *  filename,
bool  append,
bool  compat 
) [protected, virtual]

Definition at line 56 of file NetworkInfo.cc.

Referenced by processCommand().

{
    std::ofstream s;
    s.open(filename, append?(std::ios::app):(std::ios::out));
    if (s.fail())
        error("cannot open `%s' for write", filename);

    if (compat) s << "Kernel IP routing table" << endl;
    s << "Destination     Gateway         Genmask         ";
    if (compat) s << "Flags ";
    s << "Metric ";
    if (compat) s << "Ref    Use ";
    s << "Iface" << endl;

    cModule *rtmod = target->getSubmodule("routingTable");
    if (rtmod)
    {
        std::vector<std::string> lines;

        IRoutingTable *rt = check_and_cast<IRoutingTable *>(rtmod);
        for (int i = 0; i < rt->getNumRoutes(); i++)
        {
            IPAddress host = rt->getRoute(i)->getHost();

            if (host.isMulticast())
                continue;

            if (rt->getRoute(i)->getInterface()->isLoopback())
                continue;

            IPAddress netmask = rt->getRoute(i)->getNetmask();
            IPAddress gateway = rt->getRoute(i)->getGateway();
            int metric = rt->getRoute(i)->getMetric();

            std::ostringstream line;

            line << std::left;
            IPAddress dest = compat ? host.doAnd(netmask) : host;
            line.width(16);
            if (dest.isUnspecified()) line << "0.0.0.0"; else line << dest;

            line.width(16);
            if (gateway.isUnspecified()) line << "0.0.0.0"; else line << gateway;

            line.width(16);
            if (netmask.isUnspecified()) line << "0.0.0.0"; else line << netmask;

            if (compat)
            {
                int pad = 3;
                line << "U"; // routes in INET are always up
                if (!gateway.isUnspecified()) line << "G"; else ++pad;
                if (netmask.equals(IPAddress::ALLONES_ADDRESS)) line << "H"; else ++pad;
                line.width(pad);
                line << " ";
            }

            line.width(7);
            if (compat && rt->getRoute(i)->getSource() == IPRoute::IFACENETMASK)
                metric = 0;
            line << metric;

            if (compat) line << "0        0 ";

            line << rt->getRoute(i)->getInterfaceName() << endl;

            if (compat)
                lines.push_back(line.str());
            else
                s << line.str();
        }

        if (compat)
        {
            // sort to avoid random order
            // typically routing tables are sorted by netmask prefix length (descending)
            // sorting by reversed natural order looks weired, but allows easy comparison
            // with `route -n | sort -r` output by means of `diff` command...
            std::sort(lines.begin(), lines.end());
            for (std::vector<std::string>::reverse_iterator it = lines.rbegin(); it != lines.rend(); it++)
                s << *it;
        }
    }
    s << endl;
    s.close();
}

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

Definition at line 34 of file NetworkInfo.cc.

{
    ASSERT(false);
}

void NetworkInfo::initialize (  )  [protected, virtual]

Definition at line 29 of file NetworkInfo.cc.

{
    // so far no initialization
}

void NetworkInfo::processCommand ( const cXMLElement &  node  )  [protected, virtual]

Called by ScenarioManager whenever a script command needs to be carried out by the module.

The command is represented by the XML element or element tree. The command name can be obtained as:

 const char *command = node->getTagName()
 

Parameters are XML attributes, e.g. a "neighbour" parameter can be retrieved as:

 const char *attr = node->getAttribute("neighbour")
 

More complex input can be passed in child elements.

See also:
cXMLElement

Implements IScriptable.

Definition at line 39 of file NetworkInfo.cc.

{
    cModule *target = simulation.getModuleByPath(node.getAttribute("target"));

    if (!strcmp(node.getTagName(), "routing"))
    {
        const char *filename = node.getAttribute("file");
        ASSERT(filename);
        const char *mode = node.getAttribute("mode");
        const char *compat = node.getAttribute("compat");

        dumpRoutingInfo(target, filename, (mode && !strcmp(mode, "a")), (compat && !strcmp(compat, "linux")));
    }
    else
        ASSERT(false);
}


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