Low level openflow drivers have been promoted to the driver subsystem.
All new device drivers should provide a handshaking behaviour as well
as well as a pipeline behaviour.
Change-Id: I883830b074e5d254a8cc6100e6c4fa0023594a36
diff --git a/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/Controller.java b/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/Controller.java
index 2e20126..bf3a9ed 100644
--- a/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/Controller.java
+++ b/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/Controller.java
@@ -21,10 +21,13 @@
import org.jboss.netty.channel.group.ChannelGroup;
import org.jboss.netty.channel.group.DefaultChannelGroup;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
+import org.onosproject.net.driver.DefaultDriverData;
+import org.onosproject.net.driver.DefaultDriverHandler;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverService;
import org.onosproject.openflow.controller.Dpid;
import org.onosproject.openflow.controller.driver.OpenFlowAgent;
import org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver;
-import org.onosproject.openflow.drivers.DriverManager;
import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
import org.projectfloodlight.openflow.protocol.OFFactories;
import org.projectfloodlight.openflow.protocol.OFFactory;
@@ -70,6 +73,7 @@
// Perf. related configuration
protected static final int SEND_BUFFER_SIZE = 4 * 1024 * 1024;
+ private DriverService driverService;
// ***************
// Getters/Setters
@@ -152,15 +156,7 @@
if (ofPort != null) {
this.openFlowPort = Integer.parseInt(ofPort);
}
- String corsaDpid = configParams.get("corsaDpid");
- if (corsaDpid != null) {
- try {
- DriverManager.setCorsaDpid(new Dpid(corsaDpid));
- log.info("Corsa DPID set to {}", corsaDpid);
- } catch (NumberFormatException e) {
- log.warn("Malformed Corsa DPID string", e);
- }
- }
+
log.debug("OpenFlow port set to {}", this.openFlowPort);
String threads = configParams.get("workerthreads");
this.workerThreads = threads != null ? Integer.parseInt(threads) : 16;
@@ -206,17 +202,28 @@
* @return switch instance
*/
protected OpenFlowSwitchDriver getOFSwitchInstance(long dpid,
- OFDescStatsReply desc, OFVersion ofv) {
- OpenFlowSwitchDriver sw = DriverManager.getSwitch(new Dpid(dpid),
- desc, ofv);
- sw.setAgent(agent);
- sw.setRoleHandler(new RoleManager(sw));
- return sw;
+ OFDescStatsReply desc,
+ OFVersion ofv) {
+ Driver driver = driverService
+ .getDriver(desc.getMfrDesc(), desc.getHwDesc(), desc.getSwDesc());
+
+ if (driver.hasBehaviour(OpenFlowSwitchDriver.class)) {
+ OpenFlowSwitchDriver ofSwitchDriver = driver.createBehaviour(new DefaultDriverHandler(
+ new DefaultDriverData(driver)), OpenFlowSwitchDriver.class);
+ ofSwitchDriver.init(new Dpid(dpid), desc, ofv);
+ ofSwitchDriver.setAgent(agent);
+ ofSwitchDriver.setRoleHandler(new RoleManager(ofSwitchDriver));
+ return ofSwitchDriver;
+ }
+ log.error("No OpenFlow driver for {} : {}", dpid, desc);
+ return null;
+
}
- public void start(OpenFlowAgent ag) {
+ public void start(OpenFlowAgent ag, DriverService driverService) {
log.info("Starting OpenFlow IO");
this.agent = ag;
+ this.driverService = driverService;
this.init();
this.run();
}
diff --git a/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java b/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
index d140a71..b59ce18 100644
--- a/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
+++ b/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
@@ -23,7 +23,10 @@
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Modified;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.Service;
+import org.onosproject.net.driver.DriverService;
import org.onosproject.openflow.controller.DefaultOpenFlowPacketContext;
import org.onosproject.openflow.controller.Dpid;
import org.onosproject.openflow.controller.OpenFlowController;
@@ -76,6 +79,9 @@
private static final Logger log =
LoggerFactory.getLogger(OpenFlowControllerImpl.class);
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected DriverService driverService;
+
private final ExecutorService executorMsgs =
Executors.newFixedThreadPool(32, groupedThreads("onos/of", "event-stats-%d"));
@@ -115,7 +121,7 @@
public void activate(ComponentContext context) {
Map<String, String> properties = readComponentConfiguration(context);
ctrl.setConfigParams(properties);
- ctrl.start(agent);
+ ctrl.start(agent, driverService);
}
@Deactivate
diff --git a/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/RoleManager.java b/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/RoleManager.java
index eac39c3..2d7e2e7 100644
--- a/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/RoleManager.java
+++ b/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/RoleManager.java
@@ -15,10 +15,8 @@
*/
package org.onosproject.openflow.controller.impl;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.concurrent.TimeUnit;
-
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
import org.onosproject.openflow.controller.RoleState;
import org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver;
import org.onosproject.openflow.controller.driver.RoleHandler;
@@ -30,7 +28,6 @@
import org.projectfloodlight.openflow.protocol.OFErrorType;
import org.projectfloodlight.openflow.protocol.OFExperimenter;
import org.projectfloodlight.openflow.protocol.OFFactories;
-import org.projectfloodlight.openflow.protocol.OFMessage;
import org.projectfloodlight.openflow.protocol.OFNiciraControllerRole;
import org.projectfloodlight.openflow.protocol.OFNiciraControllerRoleReply;
import org.projectfloodlight.openflow.protocol.OFRoleReply;
@@ -42,8 +39,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
/**
@@ -103,7 +100,7 @@
.setXid(xid)
.setRole(roleToSend)
.build();
- sw.write(Collections.<OFMessage>singletonList(roleRequest));
+ sw.sendRoleRequest(roleRequest);
return xid;
}
@@ -133,7 +130,8 @@
//FIXME fix below when we actually use generation ids
.setGenerationId(U64.ZERO)
.build();
- sw.write(rrm);
+
+ sw.sendRoleRequest(rrm);
return xid;
}
diff --git a/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/RoleManagerTest.java b/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/RoleManagerTest.java
index fb0e406..06929d2 100644
--- a/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/RoleManagerTest.java
+++ b/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/RoleManagerTest.java
@@ -15,15 +15,14 @@
*/
package org.onosproject.openflow.controller.impl;
-import java.io.IOException;
-import java.util.List;
-
import org.jboss.netty.channel.Channel;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import org.onosproject.net.driver.DriverData;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.openflow.controller.Dpid;
import org.onosproject.openflow.controller.RoleState;
-import org.onosproject.openflow.controller.OpenFlowSwitch.TableType;
import org.onosproject.openflow.controller.driver.OpenFlowAgent;
import org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver;
import org.onosproject.openflow.controller.driver.RoleHandler;
@@ -39,12 +38,16 @@
import org.projectfloodlight.openflow.protocol.OFPortDesc;
import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
import org.projectfloodlight.openflow.protocol.OFVersion;
-import org.projectfloodlight.openflow.types.TableId;
import org.projectfloodlight.openflow.types.U64;
+import java.io.IOException;
+import java.util.List;
+
import static org.junit.Assert.assertEquals;
-import static org.onosproject.openflow.controller.RoleState.*;
-import static org.onosproject.openflow.controller.driver.RoleRecvStatus.*;
+import static org.onosproject.openflow.controller.RoleState.MASTER;
+import static org.onosproject.openflow.controller.RoleState.SLAVE;
+import static org.onosproject.openflow.controller.driver.RoleRecvStatus.MATCHED_CURRENT_ROLE;
+import static org.onosproject.openflow.controller.driver.RoleRecvStatus.OTHER_EXPECTATION;
public class RoleManagerTest {
@@ -112,9 +115,6 @@
public void sendMsg(List<OFMessage> msgs) {
}
- @Override
- public void transformAndSendMsg(OFMessage msg, TableType tableType) {
- }
@Override
public void handleMessage(OFMessage fromSwitch) {
@@ -224,6 +224,11 @@
}
@Override
+ public void sendRoleRequest(OFMessage message) {
+
+ }
+
+ @Override
public boolean connectSwitch() {
return false;
}
@@ -293,19 +298,16 @@
}
@Override
+ public void init(Dpid dpid, OFDescStatsReply desc, OFVersion ofv) {
+
+ }
+
+ @Override
public boolean isConnected() {
return false;
}
@Override
- public void write(OFMessage msg) {
- }
-
- @Override
- public void write(List<OFMessage> msgs) {
- }
-
- @Override
public void returnRoleReply(RoleState requested, RoleState response) {
failed = requested;
}
@@ -316,9 +318,23 @@
}
@Override
- public TableType getTableType(TableId tid) {
- return TableType.NONE;
+ public DriverHandler handler() {
+ return null;
}
+ @Override
+ public void setHandler(DriverHandler handler) {
+
+ }
+
+ @Override
+ public DriverData data() {
+ return null;
+ }
+
+ @Override
+ public void setData(DriverData data) {
+
+ }
}
}