package es.tid.tedb.ospfv2;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.LinkedBlockingQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import es.tid.ospf.ospfv2.lsa.LSA;
import es.tid.ospf.ospfv2.lsa.OSPFTEv2LSA;
/**
* OSPF Session over a TCP Connection. This can be later changed to sending the OSPF directly with a raw socket
*
* @author ogondio, fmn
*
*/
public class OSPFSession extends Thread {
private DataInputStream in;
/**
* The queue to store the LSAs
*/
private LinkedBlockingQueue<OSPFTEv2LSA> lsaQueue;
/**
* The socket where the LSAs are received
*/
private Socket ss;
/**
* OSPF logger
*/
private Logger log;
public OSPFSession(Socket ss, LinkedBlockingQueue<OSPFTEv2LSA> lsaQueue){
log=LoggerFactory.getLogger("OSPFParser");
this.lsaQueue = lsaQueue;
this.ss=ss;
}
public void run(){
log.info("OSPF Socket opened");
try {
this.in = new DataInputStream(ss.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true) {
try {
byte[] msg =readLSA(in);
log.info("OSPF LSA READ");
LSA lsa = new OSPFTEv2LSA(msg,0);
//Meter en la cola
this.lsaQueue.put((OSPFTEv2LSA) lsa);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
log.warn("OSPF Socket ends");
return;
}//Read a new message
}
}
// Read LSA message from TCP stream
protected byte[] readLSA(DataInputStream in) throws IOException{
byte[] ret = null;
byte[] hdr = new byte[20];
byte[] temp = null;
boolean endHdr = false;
int r = 0;
int length = 0;
boolean endMsg = false;
int offset = 0;
while (!endMsg) {
try {
if (endHdr) {
r = in.read(temp, offset, 1);
}
else {
r = in.read(hdr, offset, 1);
}
}catch (IOException e){
//log.warn("Error reading data: "+ e.getMessage());
throw e;
}catch (Exception e) {
throw new IOException();
}
if (r > 0) {
if (offset == 18) {
length = ((int)hdr[offset]&0xFF) << 8;
}
if (offset == 19) {
length = length | (((int)hdr[offset]&0xFF));
temp = new byte[length];
endHdr = true;
System.arraycopy(hdr, 0, temp, 0, 20);
}
if ((length > 0) && (offset == length - 1)) {
endMsg = true;
}
offset++;
}
else if (r==-1){
//log.warn("End of stream has been reached");
throw new IOException();
}
}
if (length > 0) {
ret = new byte[length];
System.arraycopy(temp, 0, ret, 0, length);
}
return ret;
}
}