package com.lumaserv.bgp; import com.lumaserv.bgp.protocol.BGPPacket; import com.lumaserv.bgp.protocol.message.BGPOpen; import lombok.Getter; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class BGPServer implements Runnable { final ServerSocket serverSocket; @Getter final List sessionConfigurations = new ArrayList<>(); public BGPServer() throws IOException { this(179); } public BGPServer(int port) throws IOException { serverSocket = new ServerSocket(port); } private static boolean checkEqual(byte[] a, byte[] b) { if(a == b) return true; if(a == null || b == null) return false; if(a.length != b.length) return false; for(int i=0; i c.getRemoteAs() == request.getAsn()) .findFirst() .orElse(null); if(config == null) continue; BGPSession session = new BGPSession(socket, config); config.getListener().onOpen(session); BGPOpen response = new BGPOpen() .setAsn(config.getLocalAs()) .setHoldTime(request.getHoldTime()) .setVersion(request.getVersion()) .setIdentifier(config.getLocalIdentifier()); try { socket.getOutputStream().write(new BGPPacket().setType(BGPPacket.Type.OPEN).setMessage(response).build()); } catch (IOException e) { e.printStackTrace(); } session.keepAlive(); new Thread(session).start(); } catch (IOException ex) { ex.printStackTrace(); } } } public boolean connect(BGPSessionConfiguration config, String host) throws IOException { return connect(config, host, 179); } public boolean connect(BGPSessionConfiguration config, String host, int port) throws IOException { try { byte version = 4; int holdTime = 90; Socket socket = new Socket(host, port); BGPOpen request = new BGPOpen() .setAsn(config.getLocalAs()) .setHoldTime(holdTime) .setVersion(version) .setIdentifier(config.getLocalIdentifier()); socket.getOutputStream().write(new BGPPacket().setType(BGPPacket.Type.OPEN).setMessage(request).build()); System.out.println("Sent open"); BGPPacket packet = BGPPacket.read(socket.getInputStream()); System.out.println("Received packet"); if(packet.getType() != BGPPacket.Type.OPEN) { // TODO close System.out.println("Bad open"); return false; } System.out.println("Received open"); BGPOpen response = (BGPOpen)packet.getMessage(); if(config.getRemoteAs() != response.getAsn()) { // TODO shutdown, close System.out.println("Bad asn:" + config.getRemoteAs() + "!=" + response.getAsn()); return false; } BGPSession session = new BGPSession(socket, config); config.getListener().onOpen(session); session.keepAlive(); System.out.println("Sent keepalive"); new Thread(session).start(); return true; } catch (IOException ex) { ex.printStackTrace(); throw(ex); } } }