INET Framework for OMNeT++/OMNEST
RoutingTableXmlParser.cc
Go to the documentation of this file.
00001 //
00002 // Copyright (C) 2000 Institut fuer Telematik, Universitaet Karlsruhe
00003 // Copyright (C) 2004 Andras Varga
00004 //
00005 // This program is free software; you can redistribute it and/or
00006 // modify it under the terms of the GNU General Public License
00007 // as published by the Free Software Foundation; either version 2
00008 // of the License, or (at your option) any later version.
00009 //
00010 // This program is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with this program; if not, write to the Free Software
00017 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00018 //
00019 
00020 
00021 //  Cleanup and rewrite: Andras Varga, 2004
00022 
00023 
00024 #include "RoutingTableXmlParser.h"
00025 #include "IPv4InterfaceData.h"
00026 #include <stdlib.h>
00027 #include <omnetpp.h>
00028 #include <string>
00029 
00030 
00031 
00032 RoutingTableXmlParser::RoutingTableXmlParser(IInterfaceTable *i, IRoutingTable *r)
00033 {
00034     ift = i;
00035     rt = r;
00036 }
00037 
00038 
00039 bool RoutingTableXmlParser::readRoutingTableFromXml(const char *filename, const char *RouterId)
00040 {
00041     cXMLElement* routerConfig = ev.getXMLDocument(filename);
00042     if (routerConfig == NULL) {
00043         return false;
00044     }
00045 
00046     // load information on this router
00047     std::string routerXPath("Router[@id='");
00048     routerXPath += RouterId;
00049     routerXPath += "']";
00050 
00051     cXMLElement* routerNode = routerConfig->getElementByPath(routerXPath.c_str());
00052     if (routerNode == NULL)
00053         opp_error("No configuration for Router ID: %s", RouterId);
00054 
00055     cXMLElement* IntNode = routerNode->getFirstChildWithTag("Interfaces");
00056     if (IntNode)
00057         readInterfaceFromXml(IntNode);
00058 
00059     cXMLElement* routingNode = routerNode->getFirstChildWithTag("Routing");
00060     if (routingNode){
00061        cXMLElement* staticNode = routingNode->getFirstChildWithTag("Static");
00062        if (staticNode)
00063           readStaticRouteFromXml(staticNode);
00064     }
00065     return true;
00066 }
00067 
00068 void RoutingTableXmlParser::readInterfaceFromXml(cXMLElement* Node)
00069 {
00070     InterfaceEntry* ie;
00071 
00072     cXMLElementList intConfig = Node->getChildren();
00073     for (cXMLElementList::iterator intConfigIt = intConfig.begin(); intConfigIt != intConfig.end(); intConfigIt++)
00074     {
00075       std::string nodeName = (*intConfigIt)->getTagName();
00076       if (nodeName == "Interface" && (*intConfigIt)->getAttribute("name"))
00077       {
00078         std::string intName=(*intConfigIt)->getAttribute("name");
00079         std::string typeName=intName.substr(0,3);
00080         
00081         ie=ift->getInterfaceByName(intName.c_str());
00082         
00083         if (!ie)
00084           opp_error("Error in routing file: interface name `%s' not registered by any L2 module", intName.c_str());
00085         
00086         //implicitne nastavenia
00087         if (typeName=="eth")
00088               ie->setBroadcast(true);
00089         if (typeName=="ppp")
00090               ie->setPointToPoint(true);
00091               
00092         IPv4InterfaceData::IPAddressVector mcg = ie->ipv4Data()->getMulticastGroups();
00093         
00094         //registracia do multicast groups
00095         mcg.push_back(IPAddress("224.0.0.1"));
00096         mcg.push_back(IPAddress("224.0.0.2"));
00097         ie->ipv4Data()->setMulticastGroups(mcg);
00098         
00099         ie->ipv4Data()->setMetric(1); 
00100         ie->setMtu(1500);
00101         
00102         cXMLElementList ifDetails = (*intConfigIt)->getChildren();  
00103         for (cXMLElementList::iterator ifElemIt = ifDetails.begin(); ifElemIt != ifDetails.end(); ifElemIt++) 
00104         {
00105           std::string nodeName = (*ifElemIt)->getTagName();
00106           
00107           if (nodeName=="IPAddress") 
00108           {
00109             ie->ipv4Data()->setIPAddress(IPAddress((*ifElemIt)->getNodeValue()));
00110           }
00111           
00112           if (nodeName=="Mask") 
00113           {
00114             ie->ipv4Data()->setNetmask(IPAddress((*ifElemIt)->getNodeValue()));
00115           }
00116           
00117           if (nodeName=="MTU") 
00118           {
00119             ie->setMtu(atoi((*ifElemIt)->getNodeValue()));
00120           }
00121             
00122         }
00123         
00124       }
00125     }    
00126 }
00127 
00128 void RoutingTableXmlParser::readStaticRouteFromXml(cXMLElement* Node)
00129 {
00130   cXMLElementList intConfig = Node->getChildren();
00131   for (cXMLElementList::iterator intConfigIt = intConfig.begin(); intConfigIt != intConfig.end(); intConfigIt++)
00132   {
00133     std::string nodeName = (*intConfigIt)->getTagName();
00134     if (nodeName == "Route")
00135     {
00136         IPRoute *e = new IPRoute();
00137         cXMLElementList ifDetails = (*intConfigIt)->getChildren();  
00138         for (cXMLElementList::iterator ifElemIt = ifDetails.begin(); ifElemIt != ifDetails.end(); ifElemIt++) 
00139         {
00140           std::string nodeName = (*ifElemIt)->getTagName();
00141           
00142           if (nodeName=="NetworkAddress") 
00143           {
00144             e->setHost(IPAddress((*ifElemIt)->getNodeValue()));
00145           }
00146           
00147           if (nodeName=="NetworkMask") 
00148           {
00149             e->setNetmask(IPAddress((*ifElemIt)->getNodeValue()));
00150           }
00151           
00152           if (nodeName=="NextHopAddress") 
00153           {
00154             e->setGateway(IPAddress((*ifElemIt)->getNodeValue()));
00155             InterfaceEntry *intf=NULL;
00156             for (int i=0; i<ift->getNumInterfaces(); i++)
00157             {
00158               intf = ift->getInterface(i);
00159               if (((intf->ipv4Data()->getIPAddress()).doAnd(intf->ipv4Data()->getNetmask()))==((e->getGateway()).doAnd(intf->ipv4Data()->getNetmask())))
00160                   break;
00161                
00162             }
00163             if (intf)
00164               e->setInterface(intf);
00165             else
00166               opp_error("Error.");
00167             e->setMetric(1);
00168           }
00169           if (nodeName=="ExitInterface") 
00170           {
00171             InterfaceEntry *ie=ift->getInterfaceByName((*ifElemIt)->getNodeValue());
00172             if (!ie)
00173                 opp_error("Interface does not exists");
00174             
00175             e->setInterface(ie);
00176             e->setGateway(IPAddress::UNSPECIFIED_ADDRESS);
00177             e->setMetric(0);
00178           }
00179           if (nodeName=="StaticRouteMetric") 
00180           {
00181             e->setMetric(atoi((*ifElemIt)->getNodeValue()));
00182           }  
00183         }
00184         rt->addRoute(e);
00185     }
00186     
00187   }
00188 }