package es.tid.tedb;
import org.jgrapht.graph.DirectedWeightedMultigraph;
import org.jgrapht.graph.SimpleDirectedWeightedGraph;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.Inet4Address;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;
/**
* Base de datos de ingenieria de trafico
* CLASE DE PRUEBA REESTRUCTURAR DESPUES!!!!!!!!!!
* @author ogondio
*
*/
public class MDTEDB implements MultiDomainTEDB {
private long graphId;
private DirectedWeightedMultigraph<Object,InterDomainEdge> networkDomainGraph;
public SimpleDirectedWeightedGraph<Object,IntraDomainEdge> networkGraph;
//private LinkedList<InterDomainEdge> interDomainLinks;
public SimpleTEDB simple_ted;
private Logger log;
private boolean addBidirectional;
/**
* Table with IP address/prefix --> domain
*/
LinkedList<ReachabilityEntry> reachability;
public MDTEDB(){
log=LoggerFactory.getLogger("BGP4Peer");
networkDomainGraph=new DirectedWeightedMultigraph<Object,InterDomainEdge> (InterDomainEdge.class);
addBidirectional=true;//FIXME: ESTO ES UN APA�O TEMPORAL
reachability=new LinkedList<ReachabilityEntry>();
//interDomainLinks = new LinkedList<InterDomainEdge>();
}
public DirectedWeightedMultigraph<Object,InterDomainEdge> getDuplicatedMDNetworkGraph(){
DirectedWeightedMultigraph<Object,InterDomainEdge> graphCopy= (DirectedWeightedMultigraph<Object, InterDomainEdge>) networkDomainGraph.clone();
return graphCopy;
}
public DirectedWeightedMultigraph<Object, InterDomainEdge> getNetworkDomainGraph() {
return networkDomainGraph;
}
public void setNetworkDomainGraph(
DirectedWeightedMultigraph<Object, InterDomainEdge> networkDomainGraph) {
this.networkDomainGraph = networkDomainGraph;
}
public void initializeFromFile(String file){
networkDomainGraph=FileTEDBUpdater.readMDNetwork(file);
}
public void initializeFromFile(String file, String learntFrom){
networkDomainGraph=FileTEDBUpdater.readMDNetwork(file, learntFrom);
}
public void initializeFromFileInterDomainLinks(String file){
}
public void initializeFullTEDFromFile(String file){
networkGraph=FileTEDBUpdater.readNetwork(file);
}
public long getGraphId() {
return graphId;
}
public void setGraphId(long graphId) {
this.graphId = graphId;
}
public SimpleDirectedWeightedGraph<Object, IntraDomainEdge> getDuplicatedNetworkGraph() {
return networkGraph;
}
public synchronized void addInterdomainLink( Object localDomainID, Object localRouterASBR, long localRouterASBRIf, Object remoteDomainID, Object remoteRouterASBR, long remoteRouterASBRIf, TE_Information te_info){
if (!networkDomainGraph.containsVertex(localDomainID)){
networkDomainGraph.addVertex(localDomainID);
log.debug("Vertex (domain) "+localDomainID+" added");
}
if (!networkDomainGraph.containsVertex(remoteDomainID)){
networkDomainGraph.addVertex(remoteDomainID);
log.debug("Vertex (domain) "+remoteDomainID+" added");
}
log.debug("Looking to add "+localRouterASBR+":"+localRouterASBRIf+" ("+localDomainID+") -->"+remoteRouterASBR+":"+remoteRouterASBRIf+" ("+remoteDomainID+")");
Set<InterDomainEdge> edgeset= networkDomainGraph.edgesOf(localDomainID);
Iterator <InterDomainEdge> iterador=edgeset.iterator();
boolean edgeFound=false;
InterDomainEdge interDomainEdgeFound=null;
if (edgeset.size() == 0)
log.debug("Edge set size = 0");
while (iterador.hasNext()){
InterDomainEdge interDomainEdge=iterador.next();
log.debug("existing edge: "+interDomainEdge.toString());
if (interDomainEdge.getSrc_router_id().equals(localRouterASBR)){
log.debug("Local router is the same!!!");
if (interDomainEdge.getDst_router_id().equals(remoteRouterASBR)){
log.debug("Destination router is the same!!!");
edgeFound=true;
interDomainEdgeFound=interDomainEdge;
}
else {
log.debug("Destination router is NOT the same!!!");
}
}else {
log.debug("Local router is NOT the same!!!");
}
}
if (edgeFound==false) {
InterDomainEdge newInterDomainEdge =new InterDomainEdge();
newInterDomainEdge.setSrc_router_id(localRouterASBR);
newInterDomainEdge.setDst_router_id(remoteRouterASBR);
newInterDomainEdge.setSrc_if_id(localRouterASBRIf);
newInterDomainEdge.setDst_if_id(remoteRouterASBRIf);
newInterDomainEdge.setDomain_dst_router(remoteDomainID);
newInterDomainEdge.setDomain_src_router(localDomainID);
if (te_info != null)
newInterDomainEdge.setTE_info(te_info);
networkDomainGraph.addEdge(localDomainID, remoteDomainID, newInterDomainEdge);
log.info("New interdomain edge between "+localDomainID+" and "+remoteDomainID+" received");
}else {
if (te_info != null){
//FIXME: Update of TE info to be optimized
log.debug("TE_info updated");
interDomainEdgeFound.setTE_info(te_info);
}
}
}
public void addReachabilityIPv4(Inet4Address domainId,Inet4Address aggregatedIPRange,int prefix){
ReachabilityEntry ra=new ReachabilityEntry();
ra.setAggregatedIPRange(aggregatedIPRange);
long resta=((long)0x1<<prefix)-1;
long maskLong=resta<<(32-prefix);
byte[] mask=new byte[4];
mask[0]=(byte)(maskLong>>>24 & 0xFF);
mask[1]=(byte)(maskLong>>>16 & 0xFF);
mask[2]=(byte)(maskLong>>>8 & 0xFF);
mask[3]=(byte)(maskLong& 0xFF);
ra.setMask(mask);
ra.setDomainId(domainId);
ra.setPrefix(prefix);
if (!(reachability.contains(ra))){
reachability.add(ra);
}
return;
}
public String printMDTopology(){
String topoString;
Set<Object> vetexSet= networkDomainGraph.vertexSet();
Iterator <Object> vertexIterator=vetexSet.iterator();
topoString="Domains: \r\n";
while (vertexIterator.hasNext()){
Object vertex= vertexIterator.next();
topoString=topoString+"\t"+vertex.toString()+"\r\n";
}
topoString=topoString+"Interdomain list: \r\n";
Set<InterDomainEdge> edgeSet= networkDomainGraph.edgeSet();
Iterator <InterDomainEdge> edgeIterator=edgeSet.iterator();
while (edgeIterator.hasNext()){
InterDomainEdge edge= edgeIterator.next();
topoString=topoString+"\t"+edge.toString()+"\r\n";
}
return topoString;
}
// public String printMD2Topology(){
// String topoString;
// Set<Object> vetexSet= networkDomainGraph.vertexSet();
// Iterator <Object> vertexIterator=vetexSet.iterator();
// topoString="Domains: \r\n";
// while (vertexIterator.hasNext()){
// Object vertex= vertexIterator.next();
// topoString=topoString+"\t"+vertex.toString()+"\r\n";
// }
// topoString=topoString+"Interdomain list: \r\n";
// Iterator <InterDomainEdge> edgeIterator=interDomainLinks.iterator();
// while (edgeIterator.hasNext()){
// InterDomainEdge edge= edgeIterator.next();
// topoString=topoString+"\t"+edge.toString()+"\r\n";
// }
//
// return topoString;
// }
//Check resources SSON and WSON
public boolean CheckLocalResources(long ifID, Object ip){
Iterator<InterDomainEdge> iteredges = networkDomainGraph.edgeSet().iterator();
InterDomainEdge link;
while (iteredges.hasNext())
{
link = iteredges.next();
if ((link.getSrc_if_id()==(ifID)))
{
log.info("InterDomain Link Found to "+link.getDst_router_id().toString());
return true;
}
}
return false;
}
@Override
public String printTopology() {
// TODO Auto-generated method stub
return printMDTopology();
}
public LinkedList<InterDomainEdge> getInterDomainLinks() {
return new LinkedList<InterDomainEdge>(networkDomainGraph.edgeSet());
}
@Override
public boolean isITtedb() {
// TODO Auto-generated method stub
return false;
}
public SimpleTEDB getSimple_ted() {
return simple_ted;
}
public void setSimple_ted(SimpleTEDB simple_ted) {
this.simple_ted = simple_ted;
}
public LinkedList<ReachabilityEntry> getReachability() {
return reachability;
}
public void setReachability(LinkedList<ReachabilityEntry> reachability) {
this.reachability = reachability;
}
}