+ private boolean startAcceptConnections() {
+ if (running) {
+ try {
+ // obtain a selector
+ selector = SelectorProvider.provider().openSelector();
+ // create the listening socket
+ serverSocket = ServerSocketChannel.open();
+ serverSocket.configureBlocking(false);
+ serverSocket.socket().bind(
+ new java.net.InetSocketAddress(controllerIP,
+ openFlowPort));
+ serverSocket.socket().setReuseAddress(true);
+ // register this socket for accepting incoming
+ // connections
+ serverSelectionKey = serverSocket.register(selector,
+ SelectionKey.OP_ACCEPT);
+ } catch (IOException e) {
+ logger.error(
+ "Failed to listen on {}:{}, exit",
+ (controllerIP == null) ? "" : controllerIP
+ .getHostAddress(), openFlowPort);
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isNetInterfaceUp(boolean currentlyUp) {
+ if (controllerIP == null) {
+ // for wildcard address, return since there is always an "up"
+ // interface (such as loopback)
+ return true;
+ }
+ boolean up;
+ try {
+ if (netInt == null) {
+ logger.warn("Can't find any operational interface for address {}",
+ controllerIP.getHostAddress());
+ return false;
+ }
+ up = netInt.isUp();
+ if (!up) {
+ // always generate log if the interface is down
+ logger.warn("Interface {} with address {} is DOWN!",
+ netInt.getDisplayName(),
+ controllerIP.getHostAddress());
+ } else {
+ if (!currentlyUp) {
+ // only generate log if the interface changes from down to up
+ logger.info("Interface {} with address {} is UP!",
+ netInt.getDisplayName(),
+ controllerIP.getHostAddress());
+ }
+ }
+ } catch (SocketException e) {
+ logger.warn("Interface {} with address {} is DOWN!",
+ netInt.getDisplayName(),
+ controllerIP.getHostAddress());
+ up = false;
+ }
+ return up;
+ }
+
+ private void waitUntilInterfaceUp() {
+ if (controllerIP == null) {
+ // for wildcard address, return since there is always an "up"
+ // interface (such as loopback)
+ return;
+ }
+ boolean isUp = false;
+ do {
+ try {
+ // get the network interface from the address
+ netInt = NetworkInterface.getByInetAddress(controllerIP);
+ isUp = isNetInterfaceUp(isUp);
+ if (!isUp) {
+ Thread.sleep(5000);
+ }
+ } catch (Exception e) {
+ }
+ } while ((!isUp) && (running));
+ }