
es.tid.bgp.bgp4Peer.bgp4session.BGP4PeerInitiatedSession Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of topology Show documentation
Show all versions of topology Show documentation
Traffic Engineering Database, BGP-LS peer, Topology Module
The newest version!
package es.tid.bgp.bgp4Peer.bgp4session;
import es.tid.bgp.bgp4.messages.BGP4Message;
import es.tid.bgp.bgp4.messages.BGP4MessageTypes;
import es.tid.bgp.bgp4.messages.BGP4Update;
import es.tid.bgp.bgp4Peer.peer.BGP4Exception;
import es.tid.bgp.bgp4Peer.updateTEDB.UpdateDispatcher;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketException;
import java.util.Timer;
/**
* BGP4 session server
*
* @author mcs
*
*/
public class BGP4PeerInitiatedSession extends GenericBGP4Session{
/**
* Class to dispatch the BGP4 update messages.
* If a BGP5 update message is received, it is stored in a queue of UpdateDispatcher.
*/
private UpdateDispatcher updateDispatcher;
/**
* Constructor of the BGP4 Session
* @param s Socket of the BGP4Peer-BGP4Peer Communication
* @param bgp4SessionsInformation bgp4SessionsInformation
* @param updateDispatcher updateDispatcher
* @param holdTime holdTime
* @param BGPIdentifier BGPIdentifier
* @param version version
* @param myAutonomousSystem myAutonomousSystem
* @param noDelay noDelay
* @param keepAliveTimer keepAliveTimer
*/
public BGP4PeerInitiatedSession(Socket s, BGP4SessionsInformation bgp4SessionsInformation, UpdateDispatcher updateDispatcher,int holdTime,Inet4Address BGPIdentifier,int version,int myAutonomousSystem,boolean noDelay,int keepAliveTimer ){
super(bgp4SessionsInformation, holdTime, BGPIdentifier, version, myAutonomousSystem,keepAliveTimer);
this.setFSMstate(BGP4StateSession.BGP4_STATE_IDLE);
log=LoggerFactory.getLogger("BGP4Server");
log.debug("New BGP4Session: "+s);
this.socket = s;
try {
s.setTcpNoDelay(noDelay);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.newSessionId();
this.remotePeerIP =(Inet4Address) ((InetSocketAddress) socket.getRemoteSocketAddress()).getAddress();
timer=new Timer();
this.updateDispatcher = updateDispatcher;
//this.keepAliveLocal=params.getKeepAliveTimer();
//this.deadTimerLocal=params.getDeadTimer();
}
/**
* Initiates a Session the BGP-4 Peers
*/
public void run() {
try {
initializeBGP4Session();
} catch (BGP4Exception e2) {
// TODO Auto-generated catch block
try {
this.socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
log.info("BGP4 Session established with peer "+this.remotePeerIP);
this.deadTimerT=new DeadTimerThread(this, this.holdTime);
startDeadTimer();
this.keepAliveT=new KeepAliveThread(out, this.keepAliveTimer);
startKeepAlive();
//Listen to new messages
try{
while(this.FSMstate==BGP4StateSession.BGP4_STATE_SESSION_UP) {
try {
this.msg = readBGP4Msg(in);//Read a new message
}catch (IOException e){
cancelDeadTimer();
cancelKeepAlive();
timer.cancel();
try {
in.close();
out.close();
} catch (Exception e1) {
log.warn("Exception Closing BGP4 Session with "+this.remotePeerIP);
}
log.debug("Finishing BGP4 Session with "+this.remotePeerIP);
return;
}
if (this.msg != null) {//If null, it is not a valid PCEP message
boolean bgp4Msg = true;//By now, we assume a valid PCEP message has arrived
//Depending on the type a different action is performed
switch(BGP4Message.getMessageType(this.msg)) {
case BGP4MessageTypes.MESSAGE_OPEN:
log.debug("OPEN message received");
//After the session has been started, ignore subsequent OPEN messages
log.warn("OPEN message ignored");
break;
case BGP4MessageTypes.MESSAGE_KEEPALIVE:
log.debug("KEEPALIVE message received from "+this.remotePeerIP);
//The Keepalive message allows to reset the deadtimer
break;
case BGP4MessageTypes.MESSAGE_NOTIFICATION:
log.info("NOTIFICATION message from "+this.remotePeerIP);
break;
case BGP4MessageTypes.MESSAGE_UPDATE:
log.debug("UPDATE message from "+this.remotePeerIP);
BGP4Update bgp4Update = new BGP4Update(msg);
log.debug(bgp4Update.toString());
bgp4Update.setLearntFrom(this.getRemotePeerIP().toString());
updateDispatcher.dispatchRequests(bgp4Update);
break;
default:
log.warn("ERROR: unexpected message from "+this.remotePeerIP);
bgp4Msg = false;
}
if (bgp4Msg) {
//Reseting Dead Timer as BGP4 Session Message has arrived
resetDeadTimer();
}
}
}
}finally{
log.error("BGP4 session with peer "+this.remotePeerIP+" has been closed");
cancelDeadTimer();
cancelKeepAlive();
this.FSMstate=BGP4StateSession.BGP4_STATE_IDLE;
endSession();
}
}
@Override
public void close() {
// TODO Auto-generated method stub
}
@Override
protected void endSession() {
// TODO Auto-generated method stub
log.debug("Ending session with id "+this.getSessionId()+" from peer "+this.remotePeerIP);
BGP4SessionsInformation.deleteSession(this.getSessionId());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy