VLANs(802.1Q)forOMNet++  0.5Beta
VlanNetConfig Class Reference

A NetworkConfigurator to handle vlans on initialization. More...

#include <VlanNetConfig.h>

List of all members.

Public Member Functions

uint16_t getVlanFromIfName (std::string ifname)
uint32_t getNetAddrForVlan (uint16_t vlan)
virtual void hostRemoved (cModule *h)
 Handle Hosts that are dynamically removed.
virtual void hostAdded (cModule *h)
 Handle Hosts that are dynamically added.

Protected Member Functions

virtual void initialize (int stage)
virtual void assignAddresses (cTopology &topo, NodeInfoVector &nodeInfo)
virtual void setDisplayString (cTopology &topo, NodeInfoVector &nodeInfo)
virtual void initializeNextAvailableIPz ()

Protected Attributes

uint32 networkAddress
uint32 netmask
VlanIPInfo vlanInfo

Detailed Description

A NetworkConfigurator to handle vlans on initialization.

Not many parameters available... What it actually does is to take the 10.x.x.0/24 subnet for each vlan. 10.0.0.0/24 is always going to be the real device. the x.x is replaced by the vlan ID. DrawBack: This means that each vlan is allowed 254 machines(hosts+network devices).


Member Function Documentation

void VlanNetConfig::assignAddresses ( cTopology &  topo,
NodeInfoVector &  nodeInfo 
) [protected, virtual]
                                                                            {

    int numIPNodes = 0;
    for (int i=0; i<topo.getNumNodes(); i++)
    {
        // skip bus types
        if (!nodeInfo[i].isIPNode)
            continue;

        uint32 addr = networkAddress | uint32(++numIPNodes);
        if (numIPNodes==255) error("To many nodes, we are out of IPs");
        nodeInfo[i].address.set(addr);

        // find interface table and assign address to all (non-loopback) interfaces
        IInterfaceTable *ift = nodeInfo[i].ift;
        for (int k=0; k<ift->getNumInterfaces(); k++)
        {
            InterfaceEntry *ie = ift->getInterface(k);
            if (ie->isLoopback()) continue;

                        uint16_t vlan = getVlanFromIfName( ie->getFullName() );


                        VlanIPInfo::iterator it = vlanInfo.find(vlan);
                        if (it == vlanInfo.end()){
                                vlanInfo[vlan].numHosts = 1;
                        }else{
                                if (vlanInfo[vlan].numHosts == 254)
                                        error("netmask too large, not enough addresses for all nodes "
                                                        "for vlan %d", vlan);
                                vlanInfo[vlan].numHosts++;
                        }

                        addr=getNetAddrForVlan(vlan)|vlanInfo[vlan].numHosts;

                        ie->ipv4Data()->setIPAddress(IPAddress(addr));
                        ie->ipv4Data()->setNetmask(netmask);
                        // full address must match for local delivery

        }
    }
}
uint32_t VlanNetConfig::getNetAddrForVlan ( uint16_t  vlan)
                                                      {
        uint32_t vl = vlan&0x00FFL;
        uint32_t vh = vlan>>8;
        vh=vh<<8*2;
        vl=vl<<8;
        return (networkAddress|vh|vl);
}
uint16_t VlanNetConfig::getVlanFromIfName ( std::string  ifname)
                                                         {
        uint subif = ifname.find('.');
        uint16_t vlan=0;
        if (subif!=string::npos){
                vlan = atoi(ifname.substr(subif+1).c_str());
        }

        return vlan;
}
void VlanNetConfig::hostAdded ( cModule *  h) [virtual]

Handle Hosts that are dynamically added.

                                        {
        Enter_Method_Silent("hostAdded");
        IInterfaceTable * ift=IPAddressResolver().interfaceTableOf(h);
        for (int k=0; k<ift->getNumInterfaces(); k++)
        {
                InterfaceEntry *ie = ift->getInterface(k);
                if (ie->isLoopback()) continue;

                uint16_t vlan = getVlanFromIfName( ie->getFullName() );

                // Check that there is at least 1
                if (vlanInfo[vlan].nextAvailIP.size() == 0)
                        error("No more IPs for vlan %d", vlan);

                // Assign it
                uint32_t nip = vlanInfo[vlan].nextAvailIP.top();
                vlanInfo[vlan].nextAvailIP.pop();
                ie->ipv4Data()->setIPAddress(IPAddress(nip));
                ie->ipv4Data()->setNetmask(netmask);
                vlanInfo[vlan].numHosts++;

                // Now, if the stack is empty it means that we pulled the
                // IP with the maximum number (last one assigned on initialization).
                // We have to push the next ip (++) into the stack (if available)
                if (vlanInfo[vlan].nextAvailIP.size() == 0){
                        if (vlanInfo[vlan].numHosts == 254) continue; // Skip if no more IPs

                        nip = getNetAddrForVlan(vlan)|(vlanInfo[vlan].numHosts+1);
                        vlanInfo[vlan].nextAvailIP.push(nip);
                }
        }
}
void VlanNetConfig::hostRemoved ( cModule *  h) [virtual]

Handle Hosts that are dynamically removed.

                                          {
        Enter_Method_Silent("hostRemoved");
        IInterfaceTable * ift=IPAddressResolver().interfaceTableOf(h);
        for (int k=0; k<ift->getNumInterfaces(); k++)
        {
                InterfaceEntry *ie = ift->getInterface(k);
                if (ie->isLoopback()) continue;

                uint16_t vlan = getVlanFromIfName( ie->getFullName() );
                IPAddress freedIP = ie->ipv4Data()->getIPAddress();
                vlanInfo[vlan].nextAvailIP.push(freedIP.getInt());
                vlanInfo[vlan].numHosts--;
        }
}
void VlanNetConfig::initialize ( int  stage) [protected, virtual]
{
        if (stage==0){
         // assign IP addresses
         networkAddress = IPAddress("10.0.0.0").getInt();
         netmask = IPAddress("255.255.255.0").getInt();
        }

        FlatNetworkConfigurator::initialize(stage);

        if (stage==numInitStages()-1){
                // Initialize Stacks
                initializeNextAvailableIPz();

                WATCH_MAP(vlanInfo);
        }
}
void VlanNetConfig::initializeNextAvailableIPz ( ) [protected, virtual]
                                              {
        VlanIPInfo::iterator it = vlanInfo.begin();
        for (;it!=vlanInfo.end(); ++it){
                // It means we do not have more ips... but we actually don't
                // need more at this stage. The error occurs on host addition
                if (it->second.numHosts == 254) continue;

                uint32_t nip = getNetAddrForVlan(it->first)|(it->second.numHosts+1);
                EV << "Next Available IP for vlan "<<it->first<<" is: "<<IPAddress(nip)<<endl;
                it->second.nextAvailIP.push(nip);
        }
}
void VlanNetConfig::setDisplayString ( cTopology &  topo,
NodeInfoVector &  nodeInfo 
) [protected, virtual]
{
    int numIPNodes = 0;
    for (int i=0; i<topo.getNumNodes(); i++)
        if (nodeInfo[i].isIPNode)
            numIPNodes++;

    // update display string
    char buf[100];
    sprintf(buf, "%d IP nodes\nin %d vlans\n(%d non-IP nodes)", numIPNodes, (int)vlanInfo.size(),topo.getNumNodes()-numIPNodes);
    getDisplayString().setTagArg("t",0,buf);
}

Member Data Documentation

uint32 VlanNetConfig::netmask [protected]
uint32 VlanNetConfig::networkAddress [protected]

The documentation for this class was generated from the following files:
 All Classes Files Functions Variables Typedefs Friends Defines