Skip to content
Snippets Groups Projects
Commit d8b1fa1d authored by Rob Adams's avatar Rob Adams
Browse files

Merge branch 'master' of github.com:floodlight/floodlight into newdevicemanager

parents 3b72d7e8 a737bf94
No related branches found
No related tags found
No related merge requests found
......@@ -35,6 +35,8 @@
<property name="packetstreamer-gen" location="lib/gen-java" />
<property name="packetstreamer-gen-build" location="lib/gen-java-bin"/>
<property name="packetstreamer-thrift-jar" value="packetstreamer-thrift.jar"/>
<property name="floodlight-nodeps-jar" location="${target}/floodlight-nodeps.jar"/>
<property name="floodlight-debian-jar" location="${target}/floodlight-debian.jar"/>
<property name="floodlight-jar" location="${target}/floodlight.jar"/>
<property name="floodlight-test-jar" location="${target}/floodlight-test.jar"/>
......@@ -56,6 +58,15 @@
<include name="jython-2.5.2.jar"/>
<include name="libthrift-0.7.0.jar"/>
</patternset>
<!-- Dependencies we can't get from Debian/Ubuntu. -->
<patternset id="debian-lib">
<include name="org.restlet-2.1-RC1.jar"/>
<include name="org.restlet.ext.jackson-2.1-RC1.jar"/>
<include name="org.restlet.ext.simple-2.1-RC1.jar"/>
<include name="org.restlet.ext.slf4j-2.1-RC1.jar"/>
<include name="libthrift-0.7.0.jar"/>
<include name="simple-4.1.21.jar"/>
</patternset>
<patternset id="genlib">
<include name="${packetstreamer-thrift-jar}"/>
</patternset>
......@@ -201,7 +212,7 @@
<target name="coverage" depends="instrument,test,coverage-report"/>
<target name="dist" depends="compile,compile-test">
<jar destfile="${floodlight-jar}" filesetmanifest="mergewithoutmain">
<jar destfile="${floodlight-nodeps-jar}" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
<attribute name="Class-Path" value="."/>
......@@ -211,12 +222,30 @@
<fileset dir="${python-src}">
<include name="**/*.py"/>
</fileset>
<zipgroupfileset dir="${target}/lib">
<patternset refid="genlib"/>
</zipgroupfileset>
</jar>
<jar destfile="${floodlight-jar}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
<attribute name="Class-Path" value="."/>
</manifest>
<zipgroupfileset dir="lib">
<patternset refid="lib"/>
</zipgroupfileset>
<zipgroupfileset dir="${target}/lib">
<patternset refid="genlib"/>
<zipfileset src="${floodlight-nodeps-jar}"/>
</jar>
<jar destfile="${floodlight-debian-jar}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
<!-- JARs under /usr/share/java on Debian/Ubuntu -->
<attribute name="Class-Path" value="args4j.jar slf4j-api.jar logback-core.jar logback-classic.jar jackson-core-asl.jar jackson-mapper-asl.jar easymock.jar netty.jar concurrentlinkedhashmap-lru.jar jython.jar antlr3-runtime.jar asm3.jar asm3-tree.jar ."/>
</manifest>
<zipgroupfileset dir="lib">
<patternset refid="debian-lib"/>
</zipgroupfileset>
<zipfileset src="${floodlight-nodeps-jar}"/>
</jar>
<jar destfile="${floodlight-test-jar}" filesetmanifest="mergewithoutmain">
<manifest>
......
......@@ -2,7 +2,7 @@ Source: floodlight
Section: net
Priority: extra
Maintainer: Rich Lane <rlane@bigswitch.com>
Build-Depends: debhelper (>= 8.0.0), javahelper (>= 0.40ubuntu1)
Build-Depends: debhelper (>= 8.0.0), javahelper (>= 0.40ubuntu1), liblogback-java, libjackson-json-java, libeasymock-java, libslf4j-java, libsimple-xml-java, libnetty-java, libargs4j-java, libconcurrentlinkedhashmap-java, jython
Standards-Version: 3.9.2
Homepage: http://floodlight.openflowhub.org/
Vcs-Git: git://github.com/floodlight/floodlight.git
......
target/floodlight.jar usr/share/java
target/floodlight-debian.jar usr/share/java
debian/misc/floodlight usr/bin
#!/bin/sh
exec java -jar /usr/share/java/floodlight.jar "$@"
exec java -jar /usr/share/java/floodlight-debian.jar "$@"
......@@ -334,6 +334,17 @@ public class Controller implements IFloodlightProviderService {
sw.getAttribute(IOFSwitch.SWITCH_SUPPORTS_NX_ROLE);
if ((supportsNxRole != null) && supportsNxRole) {
sendNxRoleRequest(sw, role);
} else if (supportsNxRole != null && !supportsNxRole) {
// We know switch does not support role-request (and so sw.role is null)
// but we may have just switched roles from MASTER to SLAVE in which
// case we should disconnect switch
if (getRole() == Role.SLAVE && sw.getRole() == null) {
log.error("Disconnecting switch {} that doesn't support " +
"role request messages from a controller that went to SLAVE mode");
// Closing the channel should result in a call to
// channelDisconnect which updates all state
sw.getChannel().close();
}
}
}
......@@ -587,14 +598,14 @@ public class Controller implements IFloodlightProviderService {
role);
state.nxRoleRequestXid = sendNxRoleRequest(sw, role);
} else {
// The hasNxRole field is just a flag that's checked before
// advancing the handshake state to READY. In this case, if role
// support isn't enabled for the controller, then we're not
// sending the role request probe to the switch so we don't need
// to wait for a reply/error before transitioning to the READY
// state.
// if role support isn't enabled for the controller, then we're
// not sending the role request probe to the switch
log.info("This controllers role is null - not sending role-" +
"request-msg");
"request-msg");
// The hasNxRole field is just a flag that's checked before
// advancing the handshake state to READY. In this case,
// we set the flag, so we don't need to wait for a
// reply/error before transitioning to the READY state.
state.hasNxRoleReply = true;
}
}
......@@ -606,7 +617,7 @@ public class Controller implements IFloodlightProviderService {
state.hsState = HandshakeState.READY;
if (getRole() == Role.SLAVE && sw.getRole() == null) {
// When the controller is currently in the slave role and
// When the controller is in the slave role and
// the switch doesn't understand the role request message -
// we disconnect the switch! The expected behavior is that
// the switch will probably try to reconnect repeatedly
......@@ -614,8 +625,9 @@ public class Controller implements IFloodlightProviderService {
// while will give-up and move on to the next controller-IP
// configured on the switch. This is the serial failover
// mechanism from OpenFlow spec v1.0.
log.error("Disconnecting switch {} that doesn't support " +
"role request messages from a slave controller");
log.error("Disconnecting switch from SLAVE controller." +
" Switch {} doesn't support role request messages",
sw.getId());
sw.setConnected(false);
connectedSwitches.remove(sw.getId());
sw.getChannel().close();
......
......@@ -19,6 +19,8 @@ package net.floodlightcontroller.core.internal;
import static org.easymock.EasyMock.*;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
......@@ -31,6 +33,7 @@ import java.util.concurrent.TimeUnit;
import net.floodlightcontroller.core.FloodlightProvider;
import net.floodlightcontroller.core.FloodlightContext;
import net.floodlightcontroller.core.IFloodlightProviderService;
import net.floodlightcontroller.core.IFloodlightProviderService.Role;
import net.floodlightcontroller.core.IOFMessageFilterManagerService;
import net.floodlightcontroller.core.IOFMessageListener;
import net.floodlightcontroller.core.IOFMessageListener.Command;
......@@ -55,14 +58,19 @@ import net.floodlightcontroller.test.FloodlightTestCase;
import net.floodlightcontroller.threadpool.IThreadPoolService;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelStateEvent;
import org.junit.Test;
import org.openflow.protocol.OFError;
import org.openflow.protocol.OFFeaturesReply;
import org.openflow.protocol.OFMessage;
import org.openflow.protocol.OFPacketIn;
import org.openflow.protocol.OFPacketOut;
import org.openflow.protocol.OFPhysicalPort;
import org.openflow.protocol.OFPort;
import org.openflow.protocol.OFStatisticsReply;
import org.openflow.protocol.OFType;
import org.openflow.protocol.OFError.OFBadRequestCode;
import org.openflow.protocol.OFError.OFErrorType;
import org.openflow.protocol.OFPacketIn.OFPacketInReason;
import org.openflow.protocol.action.OFAction;
import org.openflow.protocol.action.OFActionOutput;
......@@ -464,7 +472,6 @@ public class ControllerTest extends FloodlightTestCase {
expect(channel2.getRemoteAddress()).andReturn(null);
expect(newsw.getFeaturesReply()).andReturn(new OFFeaturesReply()).anyTimes();
expect(newsw.getPorts()).andReturn(new HashMap<Short,OFPhysicalPort>());
controller.activeSwitches.put(0L, oldsw);
replay(newsw, channel, channel2);
......@@ -472,4 +479,67 @@ public class ControllerTest extends FloodlightTestCase {
verify(newsw, channel, channel2);
}
@Test
public void testRoleChangeForSerialFailoverSwitch() throws Exception {
IOFSwitch newsw = createMock(IOFSwitch.class);
expect(newsw.getId()).andReturn(0L).anyTimes();
expect(newsw.getStringId()).andReturn("00:00:00:00:00:00:00").anyTimes();
Channel channel2 = createMock(Channel.class);
expect(newsw.getChannel()).andReturn(channel2);
// newsw.role is null because the switch does not support
// role request messages
expect(newsw.getRole()).andReturn(null);
expect(newsw.getAttribute(IOFSwitch.SWITCH_SUPPORTS_NX_ROLE))
.andReturn(false);
// switch is connected
controller.connectedSwitches.put(0L, newsw);
// the switch should get disconnected when role is changed to SLAVE
expect(channel2.close()).andReturn(null);
replay(newsw, channel2);
controller.setRole(Role.SLAVE);
verify(newsw, channel2);
}
@Test
public void testSlaveRoleHandshakeForSerialFailoverSwitch()
throws Exception {
controller.role = Role.SLAVE;
OFFeaturesReply featuresReply = new OFFeaturesReply();
featuresReply.setDatapathId(0L);
featuresReply.setPorts(new ArrayList<OFPhysicalPort>());
OFChannelState state = new OFChannelState();
state.hsState = OFChannelState.HandshakeState.FEATURES_REPLY;
state.hasDescription = true;
state.hasGetConfigReply = true;
Controller.OFChannelHandler chdlr = controller.new OFChannelHandler(state);
Channel ch = createMock(Channel.class);
ChannelStateEvent e = createMock(ChannelStateEvent.class);
expect(e.getChannel()).andReturn(ch).anyTimes();
SocketAddress sa = new InetSocketAddress(45454);
expect(ch.getRemoteAddress()).andReturn(sa);
expect(ch.write(anyObject())).andReturn(null);
// the error returned when role request message is not supported by sw
OFMessage msg = new OFError();
msg.setType(OFType.ERROR);
((OFError) msg).setErrorType(OFErrorType.OFPET_BAD_REQUEST);
((OFError) msg).setErrorCode(OFBadRequestCode.OFPBRC_BAD_VENDOR);
// the switch connection should get disconnected when the controller is
// in SLAVE mode and the switch does not support role-request messages
expect(ch.close()).andReturn(null);
replay(ch, e);
chdlr.channelConnected(null, e);
chdlr.sw.setFeaturesReply(featuresReply);
chdlr.processOFMessage(msg);
verify(ch, e);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment