|
INET Framework for OMNeT++/OMNEST
|
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 }