sl.wakeup();
}
protected void handleSwitchEvent(SelectionKey key, SocketChannel sock) {
OFSwitch sw = switchSockets.get(sock);
OFMessageAsyncStream stream = sw.getStream();
try {
if (key.isReadable()) {
List<OFMessage> msgs = stream.read();
if (msgs == null) {
key.cancel();
switchSockets.remove(sock);
return;
}
for (OFMessage m : msgs) {
switch (m.getType()) {
case PACKET_IN:
sw.handlePacketIn((OFPacketIn) m);
break;
case HELLO:
System.err.println("GOT HELLO from " + sw);
break;
case ECHO_REQUEST:
OFEchoReply reply = (OFEchoReply) stream
.getMessageFactory().getMessage(
OFType.ECHO_REPLY);
reply.setXid(m.getXid());
stream.write(reply);
break;
default:
System.err.println("Unhandled OF message: "
+ m.getType() + " from "
+ sock.socket().getInetAddress());
}
}
}
if (key.isWritable()) {
stream.flush();
}
/**
* Only register for interest in R OR W, not both, causes stream
* deadlock after some period of time
*/
if (stream.needsFlush())
key.interestOps(SelectionKey.OP_WRITE);
else
key.interestOps(SelectionKey.OP_READ);
} catch (IOException e) {
// if we have an exception, disconnect the switch