package es.tid.bgp.bgp4Peer.peer;
import es.tid.bgp.bgp4Peer.bgp4session.BGP4SessionClient;
import es.tid.bgp.bgp4Peer.bgp4session.BGP4SessionExistsException;
import es.tid.bgp.bgp4Peer.bgp4session.BGP4SessionsInformation;
import es.tid.bgp.bgp4Peer.updateTEDB.UpdateDispatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.Inet4Address;
/**
* Client session manager
* @author mcs
*
*/
public class BGP4SessionClientManager implements Runnable{
private BGP4SessionClient bgp4SessionClient;
private Logger log;
BGP4SessionsInformation bgp4SessionInformation;
/**
* peer contains the IP address and port where the peer listens.
*/
private BGP4LSPeerInfo peer;
private Inet4Address peerIP;
private String localBGP4Address;
private int localBGP4Port;
private int holdTime;
private int keepAliveTimer;
private Inet4Address BGPIdentifier;
private int version = 4;
private int myAutonomousSystem;
private UpdateDispatcher ud;
private Boolean updateFrom;
private Boolean sendTo;
public BGP4SessionClientManager(BGP4SessionsInformation bgp4SessionInformation,UpdateDispatcher ud, BGP4LSPeerInfo peer,int bgp4Port,String my_IPAddress,int my_bgp4Port , int holdTime,Inet4Address BGPIdentifier,int version,int myAutonomousSystem, int my_keepAliveTimer){
log=LoggerFactory.getLogger("BGP4Peer");
this.bgp4SessionInformation=bgp4SessionInformation;
this.holdTime=holdTime;
this.BGPIdentifier=BGPIdentifier;
this.version = version;
this.myAutonomousSystem=myAutonomousSystem;
this.peer = peer;
this.ud=ud;
this.localBGP4Address=my_IPAddress;
this.localBGP4Port=my_bgp4Port;
this.keepAliveTimer = my_keepAliveTimer;
this.peerIP=peer.getPeerIP();
this.setSendTo(peer.isSendToPeer());
this.setUpdateFrom(peer.isUpdateFromPeer());
}
/**
*
*
*
*/
public void run(){
if(bgp4SessionClient != null){
if (bgp4SessionClient.isAlive()){
if (bgp4SessionClient.isInterrupted()){
log.debug("Thread alive... backup session dead");
}
log.debug("Session alive and not interrupted");
return;
}
else{
try{
bgp4SessionInformation.notifySessionStart(peerIP);
log.debug("Session with BGP-LS peer"+peer +" dead, trying to establish new session");
bgp4SessionClient= new BGP4SessionClient(bgp4SessionInformation,ud,peer.getPeerIP(),peer.getPeerPort(),holdTime,BGPIdentifier,version,myAutonomousSystem,localBGP4Address, localBGP4Port,keepAliveTimer);
bgp4SessionClient.setSendTo(sendTo);
bgp4SessionClient.setUpdateFrom(updateFrom);
bgp4SessionClient.start();
} catch(BGP4SessionExistsException e){
log.debug("Checked that there is already a peer initiated session with "+this.peerIP);
}
return;
}
} else {
try{
bgp4SessionInformation.notifySessionStart(peerIP);
log.info("Trying to establish new session with peer "+ peer.getPeerIP()+" on port "+peer.getPeerPort());
bgp4SessionClient = new BGP4SessionClient(bgp4SessionInformation,ud, peer.getPeerIP(), peer.getPeerPort(), holdTime, BGPIdentifier,
version,myAutonomousSystem,localBGP4Address, localBGP4Port ,keepAliveTimer);
bgp4SessionClient.setSendTo(sendTo);
bgp4SessionClient.setUpdateFrom(updateFrom);
bgp4SessionClient.start();
} catch(BGP4SessionExistsException e){
log.debug("No need to start new connection with "+this.peerIP);
}
return;
}
}
public BGP4SessionClient getBgp4SessionClient() {
return bgp4SessionClient;
}
public void setBgp4SessionClient(BGP4SessionClient bgp4SessionClient) {
this.bgp4SessionClient = bgp4SessionClient;
}
public void killBGP4Session(){
bgp4SessionClient.killSession();
}
public void closeBGP4Session(){
log.info("Closing BGP4Session");
if (bgp4SessionClient.isAlive()){
//FIXME reason for close????
bgp4SessionClient.close();
}
}
public Boolean getUpdateFrom() {
return updateFrom;
}
public void setUpdateFrom(Boolean updateFrom) {
this.updateFrom = updateFrom;
}
public Boolean getSendTo() {
return sendTo;
}
public void setSendTo(Boolean sendTo) {
this.sendTo = sendTo;
}
}