From 24066c8e693870878a08b2d282d39c43986f5f8c Mon Sep 17 00:00:00 2001 From: Ryan Izard <rizard@g.clemson.edu> Date: Tue, 23 Jun 2015 09:33:28 -0400 Subject: [PATCH] Clarified some log messages for negotiating OpenFlow versions. More importantly, included a patch to ignore all PORT_STATUS messages during the WaitFeaturesReplyState. OVS will periodically send such a message if it's connecting to the controller and being created (e.g. by mininet) at the same time. We will explicitly query the port status/configuration later, so ignoring this message now is fine. --- .../core/internal/OFChannelHandler.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java index 91d360aba..7f3463bdd 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java +++ b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java @@ -46,6 +46,7 @@ import org.projectfloodlight.openflow.protocol.OFHello; import org.projectfloodlight.openflow.protocol.OFHelloElem; import org.projectfloodlight.openflow.protocol.OFHelloElemVersionbitmap; import org.projectfloodlight.openflow.protocol.OFMessage; +import org.projectfloodlight.openflow.protocol.OFPortStatus; import org.projectfloodlight.openflow.protocol.OFVersion; import org.projectfloodlight.openflow.protocol.ver13.OFHelloElemTypeSerializerVer13; import org.projectfloodlight.openflow.protocol.ver14.OFHelloElemTypeSerializerVer14; @@ -121,6 +122,10 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { // we only expect features reply in the WAIT_FEATURES_REPLY state illegalMessageReceived(m); } + + void processOFPortStatus(OFPortStatus m) { + unhandledMessageReceived(m); + } private final boolean channelHandshakeComplete; @@ -270,6 +275,9 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { case ECHO_REQUEST: processOFEchoRequest((OFEchoRequest)m); break; + case PORT_STATUS: + processOFPortStatus((OFPortStatus)m); + break; default: illegalMessageReceived(m); break; @@ -317,7 +325,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { void processOFHello(OFHello m) throws IOException { OFVersion theirVersion = m.getVersion(); OFVersion commonVersion = null; - /* First, check if there's a version bitmap supplied. WE WILL ALWAYS HAVE a version bitmap . */ + /* First, check if there's a version bitmap supplied. WE WILL ALWAYS HAVE a controller-provided version bitmap. */ if (theirVersion.compareTo(OFVersion.OF_13) >= 0 && !m.getElements().isEmpty()) { List<U32> bitmaps = new ArrayList<U32>(); List<OFHelloElem> elements = m.getElements(); @@ -334,11 +342,11 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { /* Lookup highest, common supported OpenFlow version */ commonVersion = computeOFVersionFromBitmap(bitmaps); if (commonVersion == null) { - log.error("Could not negotiate OpenFlow version via version bitmap algorithm."); + log.error("Could not negotiate common OpenFlow version for {} with greatest version bitmap algorithm.", channel.getRemoteAddress()); channel.disconnect(); return; } else { - log.info("Negotiated OpenFlow version of {} with version bitmap algorithm.", commonVersion.toString()); + log.info("Negotiated OpenFlow version of {} for {} with greatest version bitmap algorithm.", commonVersion.toString(), channel.getRemoteAddress()); factory = OFFactories.getFactory(commonVersion); OFMessageDecoder decoder = pipeline.get(OFMessageDecoder.class); decoder.setVersion(commonVersion); @@ -346,16 +354,16 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { } /* If there's not a bitmap present, choose the lower of the two supported versions. */ else if (theirVersion.compareTo(factory.getVersion()) < 0) { - log.info("Negotiated down to switch OpenFlow version of {} using lesser hello header algorithm.", theirVersion.toString()); + log.info("Negotiated down to switch OpenFlow version of {} for {} using lesser hello header algorithm.", theirVersion.toString(), channel.getRemoteAddress()); factory = OFFactories.getFactory(theirVersion); OFMessageDecoder decoder = pipeline.get(OFMessageDecoder.class); decoder.setVersion(theirVersion); } /* else The controller's version is < or = the switch's, so keep original controller factory. */ else if (theirVersion.equals(factory.getVersion())) { - log.info("Negotiated equal OpenFlow versions to version {} using lesser hello header algorithm."); + log.info("Negotiated equal OpenFlow version of {} for {} using lesser hello header algorithm.", factory.getVersion().toString(), channel.getRemoteAddress()); } else { - log.info("Negotiated down to controller OpenFlow version of {} using lesser hello header algorithm.", factory.getVersion().toString()); + log.info("Negotiated down to controller OpenFlow version of {} for {} using lesser hello header algorithm.", factory.getVersion().toString(), channel.getRemoteAddress()); } setState(new WaitFeaturesReplyState()); @@ -406,11 +414,16 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { * we are. */ if (m.getVersion().equals(factory.getVersion())) { - log.warn("Ignoring second hello in state {}. Might be a Brocade.", state.toString()); + log.warn("Ignoring second hello from {} in state {}. Might be a Brocade.", channel.getRemoteAddress(), state.toString()); } else { super.processOFHello(m); /* Versions don't match as they should; abort */ } } + + @Override + void processOFPortStatus(OFPortStatus m) { + log.warn("Ignoring PORT_STATUS message from {} during OpenFlow channel establishment. Ports will be explicitly queried in a later state.", channel.getRemoteAddress()); + } @Override void enterState() throws IOException { -- GitLab