package es.tid.bgp.bgp4Peer.peer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.net.Inet4Address; import java.net.UnknownHostException; import java.util.LinkedList; /** * Parameters to configure the BGP4 session * @author mcs * */ public class BGP4Parameters { private Logger log = LoggerFactory.getLogger("BGP4Peer"); /** * TCP port where the BGP is listening for incoming bgp4 connections * Experimental use only. Default and standard is 179 */ private int BGP4Port = 179; /** * TCP port to connect to manage the BGP connection */ private int BGP4ManagementPort = 1112; /** * Local BGP4 address of this peer */ private String localBGPAddress = "127.0.0.1"; /** * Local port to connect with BGP Peer. */ private int localBGPPort = 0; /** * Log file */ private String BGP4LogFile="BGP4Parser.log"; /** * Log file Client */ private String BGP4LogFileClient="BGP4Client.log"; /** * Log file Client */ private String BGP4LogFileServer="BGP4Server.log"; /** * Name of the configuration file */ private String confFile; /** * If the tcp no delay option is used or not. */ private boolean nodelay=false; /** * Waiting Time to connect to clients */ long delay = 6000; /** * List of peers to establish connection. */ private LinkedList<BGP4LSPeerInfo> peersToConnect; /** * Parameter used to set traces meanwhile the execution. */ private boolean setTraces=true; /** * OPEN PARAMENTERS */ int holdTime=90; /** * OPEN PARAMENTERS */ private boolean isTest=false; /** * Time between sending keepalives */ int keepAliveTimer=30; /** * Time between topology updates */ long sendTopoDelay=30000; private boolean saveTopologyDB=false; private Inet4Address topologyDBIP; private int topologyDBport; public int getKeepAliveTimer() { return keepAliveTimer; } public void setKeepAliveTimer(int keepAliveTimer) { this.keepAliveTimer = keepAliveTimer; } String BGPIdentifier = null; int myAutonomousSystem=1; int version=0x04; /** * This parameter can have three options: fromXML, fromOSPF, fromBGP * Explain the way the topology module learns the topology */ private String learnTopology="fromBGP"; /** * XML File to read and generate the topology */ private String topologyFile; private int numberTriesToConnect=3; /** * True: This peer sends the interdomain links of the topology to other peers * False: This peer does NOT send the topology to other peers */ private boolean sendTopology=false; /** * True: This peer sends the whole topology to other peers * False: This peer does NOT send the intradomain linksto other peers */ private boolean sendIntradomainLinks=false; /** * Instance identifier for NodeNLRI (Types defined in class InstanceIDTypes) */ private int instanceID=0; /** * Constructor */ BGP4Parameters(){ confFile="BGP4Parameters.xml"; peersToConnect =new LinkedList<BGP4LSPeerInfo>(); } /** * Constructor */ BGP4Parameters(String confFile){ peersToConnect =new LinkedList<BGP4LSPeerInfo>(); if (confFile!=null){ this.confFile=confFile; }else { confFile="BGP4Parameters.xml"; } } public void initialize(){ try { System.out.println("Parsing Config File::"+confFile); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); DefaultHandler handler = new DefaultHandler() { boolean peer = false; boolean send = false; boolean receive = false; boolean peerPort = false; BGP4LSPeerInfo peerInfo=null; String tempVal; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("configPeer")){ log.debug("Found peer configuration"); } else if (qName.equalsIgnoreCase("peer")){ peer = true; } else if (qName.equalsIgnoreCase("export")){ send = true; } else if (qName.equalsIgnoreCase("import")){ receive = true; }else if (qName.equalsIgnoreCase("peerPort")){ peerPort = true; } } public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equalsIgnoreCase("BGP4Port")) { BGP4Port=Integer.parseInt(tempVal.trim()); } else if (qName.equalsIgnoreCase("BGP4ManagementPort")){ BGP4ManagementPort = Integer.parseInt(tempVal.trim()); } else if (qName.equalsIgnoreCase("BGP4LogFile")) { BGP4LogFile=tempVal.trim(); } else if (qName.equalsIgnoreCase("BGP4LogFileClient")) { BGP4LogFileClient=tempVal.trim(); } else if (qName.equalsIgnoreCase("BGP4LogFileServer")) { BGP4LogFileServer=tempVal.trim(); } else if (qName.equalsIgnoreCase("nodelay")) { nodelay=Boolean.parseBoolean(tempVal.trim()); } else if (qName.equalsIgnoreCase("isTest")) { isTest=Boolean.parseBoolean(tempVal.trim()); } else if (qName.equalsIgnoreCase("setTraces")) { setTraces=Boolean.parseBoolean(tempVal.trim()); } else if (qName.equalsIgnoreCase("saveTopologyDB")) { saveTopologyDB=Boolean.parseBoolean(tempVal.trim()); } else if (qName.equalsIgnoreCase("topologyDBIP")) { try { topologyDBIP =(Inet4Address)Inet4Address.getByName(tempVal.trim()); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if (qName.equalsIgnoreCase("topologyDBport")) { topologyDBport=Integer.parseInt(tempVal.trim()); } else if (qName.equalsIgnoreCase("sendTopology")) { sendTopology=Boolean.parseBoolean(tempVal.trim()); } else if (qName.equalsIgnoreCase("sendIntradomainLinks")) { sendIntradomainLinks=Boolean.parseBoolean(tempVal.trim()); sendTopology = true;//si se envian los intradomain entonces se enviara la topologia entera } else if(qName.equalsIgnoreCase("holdTime")) { holdTime=Integer.parseInt(tempVal.trim()); } else if(qName.equalsIgnoreCase("keepAliveTimer")) { keepAliveTimer=Integer.parseInt(tempVal.trim()); } else if (qName.equalsIgnoreCase("version")){ version = Integer.parseInt(tempVal.trim()); } else if (qName.equalsIgnoreCase("myAutonomousSystem")){ myAutonomousSystem = Integer.parseInt(tempVal.trim()); } else if (qName.equalsIgnoreCase("localBGPAddress")){//El BGP Identifier es la local BGP Address. //BGPIdentifier = tempVal.trim(); localBGPAddress=tempVal.trim(); } else if (qName.equalsIgnoreCase("BGPIdentifier")){//El BGP Identifier es la local BGP Address. BGPIdentifier = tempVal.trim(); } else if (qName.equalsIgnoreCase("delay")){ delay = Long.parseLong(tempVal.trim()); } else if (qName.equalsIgnoreCase("sendTopoDelay")){ sendTopoDelay = Long.parseLong(tempVal.trim()); } /* else if (qName.equalsIgnoreCase("peer")){ String peerBGP_IPaddress = tempVal.trim(); peersToConnect.add(peerBGP_IPaddress); }*/ else if (qName.equalsIgnoreCase("TopologyFile")) { topologyFile=tempVal.trim(); } else if (qName.equalsIgnoreCase("learnTopology")) { learnTopology=tempVal.trim(); } else if (qName.equalsIgnoreCase("numberTriesToConnect")){ numberTriesToConnect = Integer.parseInt(tempVal.trim()); } else if (qName.equalsIgnoreCase("instanceID")){ instanceID = Integer.parseInt(tempVal.trim()); } else if (qName.equalsIgnoreCase("localBGPPort")){ localBGPPort = Integer.parseInt(tempVal.trim()); } // else if (qName.equalsIgnoreCase("configPeer")){ // log.info("peers....." + peersToConnect.toString()); // } } public void characters(char[] ch, int start, int length) throws SAXException { tempVal = new String(ch,start,length); if(peer){ peerInfo= new BGP4LSPeerInfo(); String peerBGP_IPaddress = new String(ch, start, length); Inet4Address peerBGPIP; try { peerBGPIP=(Inet4Address)Inet4Address.getByName(peerBGP_IPaddress.trim()); peerInfo.setPeerIP(peerBGPIP); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } peersToConnect.add(peerInfo); peer = false; } else if(send){ String sendInfo = new String(ch, start, length); peerInfo.setSendToPeer(Boolean.parseBoolean(sendInfo.trim())); send = false; } else if(receive){ String update_from = new String(ch, start, length); peerInfo.setUpdateFromPeer(Boolean.parseBoolean(update_from.trim())); receive = false; }else if (peerPort){ String peer_port = new String(ch, start, length); peerInfo.setPeerPort(Integer.parseInt(peer_port.trim())); peerPort = false; } } }; saxParser.parse(confFile, handler); }catch (Exception e) { log.error("Problems reading config"); e.printStackTrace(); System.exit(1); } } public int getBGP4Port() { return BGP4Port; } public void setBGP4Port(int bGP4Port) { BGP4Port = bGP4Port; } public int getBGP4ManagementPort() { return BGP4ManagementPort; } public void setBGP4ManagementPort(int bGP4ManagementPort) { BGP4ManagementPort = bGP4ManagementPort; } public String getBGP4LogFile() { return BGP4LogFile; } public void setBGP4LogFile(String bGP4LogFile) { BGP4LogFile = bGP4LogFile; } public boolean isSetTraces() { return setTraces; } public void setSetTraces(boolean setTraces) { this.setTraces = setTraces; } public boolean isTest() { return isTest; } public void setisTest(boolean test) { this.isTest = test; } public String getConfFile() { return confFile; } public void setConfFile(String confFile) { this.confFile = confFile; } public boolean isNodelay() { return nodelay; } public void setNodelay(boolean nodelay) { this.nodelay = nodelay; } public int getHoldTime() { return holdTime; } public void setHoldTime(int holdTime) { this.holdTime = holdTime; } public String getBGPIdentifier() { return BGPIdentifier; } public void setBGPIdentifier(String bGPIdentifier) { BGPIdentifier = bGPIdentifier; } public int getMyAutonomousSystem() { return myAutonomousSystem; } public void setMyAutonomousSystem(int myAutonomousSystem) { this.myAutonomousSystem = myAutonomousSystem; } public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } public LinkedList<BGP4LSPeerInfo> getPeersToConnect() { return peersToConnect; } public void setPeersToConnect(LinkedList<BGP4LSPeerInfo> peersToConnect) { this.peersToConnect = peersToConnect; } public String getLearnTopology() { return learnTopology; } public void setLearnTopology(String learnTopology) { this.learnTopology = learnTopology; } public String getTopologyFile() { return topologyFile; } public void setTopologyFile(String topologyFile) { this.topologyFile = topologyFile; } public int getNumberTriesToConnect() { return numberTriesToConnect; } public void setNumberTriesToConnect(int numberTriesToConnect) { this.numberTriesToConnect = numberTriesToConnect; } public long getDelay() { return delay; } public void setDelay(long delay) { this.delay = delay; } public boolean isSendTopology() { return sendTopology; } public void setSendTopology(boolean sendTopology) { this.sendTopology = sendTopology; } public String getBGP4LogFileClient() { return BGP4LogFileClient; } public void setBGP4LogFileClient(String bGP4LogFileClient) { BGP4LogFileClient = bGP4LogFileClient; } public String getBGP4LogFileServer() { return BGP4LogFileServer; } public void setBGP4LogFileServer(String bGP4LogFileServer) { BGP4LogFileServer = bGP4LogFileServer; } public int getInstanceID() { return instanceID; } public void setInstanceID(int instanceID) { this.instanceID = instanceID; } public boolean isSendIntradomainLinks() { return sendIntradomainLinks; } public void setSendIntradomainLinks(boolean sendIntradomainLinks) { this.sendIntradomainLinks = sendIntradomainLinks; } public String getLocalBGPAddress() { return localBGPAddress; } public void setLocalBGPAddress(String localBGPAddress) { this.localBGPAddress = localBGPAddress; } public int getLocalBGPPort() { return localBGPPort; } public long getSendTopoDelay() { return sendTopoDelay; } public void setSendTopoDelay(long sendTopoDelay) { this.sendTopoDelay = sendTopoDelay; } public boolean isSaveTopologyDB() { return saveTopologyDB; } public void setSaveTopologyDB(boolean saveTopologyDB) { this.saveTopologyDB = saveTopologyDB; } public Inet4Address getTopologyDBIP() { return topologyDBIP; } public void setTopologyDBIP(Inet4Address topologyDBIP) { this.topologyDBIP = topologyDBIP; } public int getTopologyDBport() { return topologyDBport; } public void setTopologyDBport(int topologyDBport) { this.topologyDBport = topologyDBport; } }