package es.tid.bgp.bgp4Peer.peer;
import es.tid.bgp.bgp4Peer.bgp4session.BGP4PeerInitiatedSession;
import es.tid.bgp.bgp4Peer.bgp4session.BGP4SessionsInformation;
import es.tid.bgp.bgp4Peer.updateTEDB.UpdateDispatcher;
import es.tid.tedb.TEDB;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
public class BGP4SessionServerManager implements Runnable {
private BGP4PeerInitiatedSession bgp4SessionServer;
private Logger log;
BGP4SessionsInformation bgp4SessionsInformation;
int bgp4Port;
private int holdTime;
private int keepAliveTimer;
private Inet4Address BGPIdentifier;
private int version = 4;
private int myAutonomousSystem;
private boolean noDelay;
private boolean isTest=false;
private TEDB tedb;
private UpdateDispatcher ud;
Inet4Address localBGP4Address;
private Boolean updateFrom;
private Boolean sendTo;
private LinkedList<BGP4LSPeerInfo> peersToConnect;
public BGP4SessionServerManager(BGP4SessionsInformation bgp4SessionInformation, TEDB tedb,UpdateDispatcher ud, int bgp4Port,int holdTime,Inet4Address BGPIdentifier,int version,int myAutonomousSystem,boolean noDelay,Inet4Address localAddress ,int mykeepAliveTimer, LinkedList<BGP4LSPeerInfo> peersToConnect ){
log = LoggerFactory.getLogger("BGP4Peer");
this.holdTime=holdTime;
this.BGPIdentifier=BGPIdentifier;
this.version = version;
this.myAutonomousSystem=myAutonomousSystem;
this.bgp4SessionsInformation=bgp4SessionInformation;
this.bgp4Port=bgp4Port;
this.noDelay=noDelay;
this.tedb=tedb;
this.ud=ud;
this.localBGP4Address=localAddress;
this.keepAliveTimer = mykeepAliveTimer;
this.peersToConnect=peersToConnect;
}
public BGP4SessionServerManager(BGP4SessionsInformation bgp4SessionInformation, TEDB tedb,UpdateDispatcher ud, int bgp4Port,int holdTime,Inet4Address BGPIdentifier,int version,int myAutonomousSystem,boolean noDelay,Inet4Address localAddress ,int mykeepAliveTimer, LinkedList<BGP4LSPeerInfo> peersToConnect, boolean test){
log = LoggerFactory.getLogger("BGP4Peer");
this.holdTime=holdTime;
this.BGPIdentifier=BGPIdentifier;
this.version = version;
this.myAutonomousSystem=myAutonomousSystem;
this.bgp4SessionsInformation=bgp4SessionInformation;
this.bgp4Port=bgp4Port;
this.noDelay=noDelay;
this.tedb=tedb;
this.ud=ud;
this.localBGP4Address=localAddress;
this.keepAliveTimer = mykeepAliveTimer;
this.peersToConnect=peersToConnect;
this.isTest=test;
}
public Boolean getSendTo() {
return sendTo;
}
public void setSendTo(Boolean sendTo) {
this.sendTo = sendTo;
}
public Boolean getUpdateFrom() {
return updateFrom;
}
public void setUpdateFrom(Boolean updateFrom) {
this.updateFrom = updateFrom;
}
@Override
public void run() {
ServerSocket serverSocket = null;
boolean listening = true;
try {
log.debug("SERVER Listening on port: "+ bgp4Port);
log.debug("SERVER Listening on address: "+ localBGP4Address);
serverSocket = new ServerSocket( bgp4Port,0,localBGP4Address);
} catch (IOException e) {
log.error("Could not listen on port: "+ bgp4Port);
System.exit(-1);
}
while (listening) {
try {
Socket sock=serverSocket.accept();
bgp4SessionServer = new BGP4PeerInitiatedSession(sock,bgp4SessionsInformation,ud,holdTime,BGPIdentifier,version,myAutonomousSystem,noDelay,keepAliveTimer);
if (isTest){
log.info("isTest");
bgp4SessionServer.setSendTo(true);
bgp4SessionServer.start();
}
else {
log.info("Not Test");
for (int i = 0; i < this.peersToConnect.size(); i++) {
try {
Inet4Address add = peersToConnect.get(i).getPeerIP();
if (add == null) {
log.warn("peer IP address shouldn't be null");
} else {
if (add.equals(sock.getInetAddress())) {
log.debug("FOUND " + add);
bgp4SessionServer.setSendTo(this.peersToConnect.get(i).isSendToPeer());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
bgp4SessionServer.start();
}
}catch (Exception e) {
e.printStackTrace();
}
}
try {
log.info("Closing the socket");
serverSocket.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}