Jonathan Hart

Add configuration setting to allow one switch to use the Corsa driver.

Change-Id: I6b17098e6d7c31a2d19ccbb0b5a56bd3b5b1e33a
...@@ -48,6 +48,10 @@ ...@@ -48,6 +48,10 @@
48 <groupId>org.apache.felix</groupId> 48 <groupId>org.apache.felix</groupId>
49 <artifactId>org.apache.felix.scr.annotations</artifactId> 49 <artifactId>org.apache.felix.scr.annotations</artifactId>
50 </dependency> 50 </dependency>
51 + <dependency>
52 + <groupId>org.osgi</groupId>
53 + <artifactId>org.osgi.compendium</artifactId>
54 + </dependency>
51 </dependencies> 55 </dependencies>
52 56
53 <build> 57 <build>
......
...@@ -89,7 +89,7 @@ public class Controller { ...@@ -89,7 +89,7 @@ public class Controller {
89 // We return a copy of the mapping so we can guarantee that 89 // We return a copy of the mapping so we can guarantee that
90 // the mapping return is the same as one that will be (or was) 90 // the mapping return is the same as one that will be (or was)
91 // dispatched to IHAListeners 91 // dispatched to IHAListeners
92 - HashMap<String, String> retval = new HashMap<String, String>(); 92 + HashMap<String, String> retval = new HashMap<>();
93 synchronized (controllerNodeIPsCache) { 93 synchronized (controllerNodeIPsCache) {
94 retval.putAll(controllerNodeIPsCache); 94 retval.putAll(controllerNodeIPsCache);
95 } 95 }
...@@ -152,6 +152,15 @@ public class Controller { ...@@ -152,6 +152,15 @@ public class Controller {
152 if (ofPort != null) { 152 if (ofPort != null) {
153 this.openFlowPort = Integer.parseInt(ofPort); 153 this.openFlowPort = Integer.parseInt(ofPort);
154 } 154 }
155 + String corsaDpid = configParams.get("corsaDpid");
156 + if (corsaDpid != null) {
157 + try {
158 + DriverManager.setCorsaDpid(new Dpid(corsaDpid));
159 + log.info("Corsa DPID set to {}", corsaDpid);
160 + } catch (NumberFormatException e) {
161 + log.warn("Malformed Corsa DPID string", e);
162 + }
163 + }
155 log.debug("OpenFlow port set to {}", this.openFlowPort); 164 log.debug("OpenFlow port set to {}", this.openFlowPort);
156 String threads = configParams.get("workerthreads"); 165 String threads = configParams.get("workerthreads");
157 this.workerThreads = threads != null ? Integer.parseInt(threads) : 16; 166 this.workerThreads = threads != null ? Integer.parseInt(threads) : 16;
...@@ -161,18 +170,13 @@ public class Controller { ...@@ -161,18 +170,13 @@ public class Controller {
161 170
162 /** 171 /**
163 * Initialize internal data structures. 172 * Initialize internal data structures.
164 - *
165 - * @param configParams configuration parameters
166 */ 173 */
167 - public void init(Map<String, String> configParams) { 174 + public void init() {
168 // These data structures are initialized here because other 175 // These data structures are initialized here because other
169 // module's startUp() might be called before ours 176 // module's startUp() might be called before ours
170 - this.controllerNodeIPsCache = new HashMap<String, String>(); 177 + this.controllerNodeIPsCache = new HashMap<>();
171 178
172 - setConfigParams(configParams);
173 this.systemStartTime = System.currentTimeMillis(); 179 this.systemStartTime = System.currentTimeMillis();
174 -
175 -
176 } 180 }
177 181
178 // ************** 182 // **************
...@@ -180,7 +184,7 @@ public class Controller { ...@@ -180,7 +184,7 @@ public class Controller {
180 // ************** 184 // **************
181 185
182 public Map<String, Long> getMemory() { 186 public Map<String, Long> getMemory() {
183 - Map<String, Long> m = new HashMap<String, Long>(); 187 + Map<String, Long> m = new HashMap<>();
184 Runtime runtime = Runtime.getRuntime(); 188 Runtime runtime = Runtime.getRuntime();
185 m.put("total", runtime.totalMemory()); 189 m.put("total", runtime.totalMemory());
186 m.put("free", runtime.freeMemory()); 190 m.put("free", runtime.freeMemory());
...@@ -213,7 +217,7 @@ public class Controller { ...@@ -213,7 +217,7 @@ public class Controller {
213 public void start(OpenFlowAgent ag) { 217 public void start(OpenFlowAgent ag) {
214 log.info("Starting OpenFlow IO"); 218 log.info("Starting OpenFlow IO");
215 this.agent = ag; 219 this.agent = ag;
216 - this.init(new HashMap<String, String>()); 220 + this.init();
217 this.run(); 221 this.run();
218 } 222 }
219 223
......
...@@ -22,6 +22,7 @@ import com.google.common.collect.Sets; ...@@ -22,6 +22,7 @@ import com.google.common.collect.Sets;
22 import org.apache.felix.scr.annotations.Activate; 22 import org.apache.felix.scr.annotations.Activate;
23 import org.apache.felix.scr.annotations.Component; 23 import org.apache.felix.scr.annotations.Component;
24 import org.apache.felix.scr.annotations.Deactivate; 24 import org.apache.felix.scr.annotations.Deactivate;
25 +import org.apache.felix.scr.annotations.Modified;
25 import org.apache.felix.scr.annotations.Service; 26 import org.apache.felix.scr.annotations.Service;
26 import org.onosproject.openflow.controller.DefaultOpenFlowPacketContext; 27 import org.onosproject.openflow.controller.DefaultOpenFlowPacketContext;
27 import org.onosproject.openflow.controller.Dpid; 28 import org.onosproject.openflow.controller.Dpid;
...@@ -33,6 +34,7 @@ import org.onosproject.openflow.controller.OpenFlowSwitchListener; ...@@ -33,6 +34,7 @@ import org.onosproject.openflow.controller.OpenFlowSwitchListener;
33 import org.onosproject.openflow.controller.PacketListener; 34 import org.onosproject.openflow.controller.PacketListener;
34 import org.onosproject.openflow.controller.RoleState; 35 import org.onosproject.openflow.controller.RoleState;
35 import org.onosproject.openflow.controller.driver.OpenFlowAgent; 36 import org.onosproject.openflow.controller.driver.OpenFlowAgent;
37 +import org.osgi.service.component.ComponentContext;
36 import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus; 38 import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus;
37 import org.projectfloodlight.openflow.protocol.OFExperimenter; 39 import org.projectfloodlight.openflow.protocol.OFExperimenter;
38 import org.projectfloodlight.openflow.protocol.OFFactories; 40 import org.projectfloodlight.openflow.protocol.OFFactories;
...@@ -52,7 +54,10 @@ import org.slf4j.Logger; ...@@ -52,7 +54,10 @@ import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory; 54 import org.slf4j.LoggerFactory;
53 55
54 import java.util.Collection; 56 import java.util.Collection;
57 +import java.util.Dictionary;
58 +import java.util.HashMap;
55 import java.util.HashSet; 59 import java.util.HashSet;
60 +import java.util.Map;
56 import java.util.Set; 61 import java.util.Set;
57 import java.util.concurrent.ConcurrentHashMap; 62 import java.util.concurrent.ConcurrentHashMap;
58 import java.util.concurrent.ExecutorService; 63 import java.util.concurrent.ExecutorService;
...@@ -102,7 +107,9 @@ public class OpenFlowControllerImpl implements OpenFlowController { ...@@ -102,7 +107,9 @@ public class OpenFlowControllerImpl implements OpenFlowController {
102 private final Controller ctrl = new Controller(); 107 private final Controller ctrl = new Controller();
103 108
104 @Activate 109 @Activate
105 - public void activate() { 110 + public void activate(ComponentContext context) {
111 + Map<String, String> properties = readComponentConfiguration(context);
112 + ctrl.setConfigParams(properties);
106 ctrl.start(agent); 113 ctrl.start(agent);
107 } 114 }
108 115
...@@ -111,6 +118,32 @@ public class OpenFlowControllerImpl implements OpenFlowController { ...@@ -111,6 +118,32 @@ public class OpenFlowControllerImpl implements OpenFlowController {
111 ctrl.stop(); 118 ctrl.stop();
112 } 119 }
113 120
121 + /**
122 + * Extracts properties from the component configuration context.
123 + *
124 + * @param context the component context
125 + */
126 + private Map<String, String> readComponentConfiguration(ComponentContext context) {
127 + Dictionary<?, ?> properties = context.getProperties();
128 + Map<String, String> outProperties = new HashMap<>();
129 + try {
130 + String strDpid = (String) properties.get("corsaDpid");
131 + if (strDpid != null) {
132 + outProperties.put("corsaDpid", strDpid);
133 + }
134 + } catch (ClassCastException e) {
135 + return outProperties;
136 + }
137 + return outProperties;
138 + }
139 +
140 + @Modified
141 + public void modified(ComponentContext context) {
142 + // Blank @Modified method to catch modifications to the context.
143 + // If no @Modified method exists, @Activate is called again
144 + // when the context is modified.
145 + }
146 +
114 @Override 147 @Override
115 public Iterable<OpenFlowSwitch> getSwitches() { 148 public Iterable<OpenFlowSwitch> getSwitches() {
116 return connectedSwitches.values(); 149 return connectedSwitches.values();
......
...@@ -16,9 +16,6 @@ ...@@ -16,9 +16,6 @@
16 package org.onosproject.openflow.drivers; 16 package org.onosproject.openflow.drivers;
17 17
18 18
19 -import java.util.Collections;
20 -import java.util.List;
21 -
22 import org.onosproject.openflow.controller.Dpid; 19 import org.onosproject.openflow.controller.Dpid;
23 import org.onosproject.openflow.controller.RoleState; 20 import org.onosproject.openflow.controller.RoleState;
24 import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch; 21 import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch;
...@@ -33,6 +30,9 @@ import org.projectfloodlight.openflow.types.TableId; ...@@ -33,6 +30,9 @@ import org.projectfloodlight.openflow.types.TableId;
33 import org.slf4j.Logger; 30 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory; 31 import org.slf4j.LoggerFactory;
35 32
33 +import java.util.Collections;
34 +import java.util.List;
35 +
36 /** 36 /**
37 * A simple implementation of a driver manager that differentiates between 37 * A simple implementation of a driver manager that differentiates between
38 * connected switches using the OF Description Statistics Reply message. 38 * connected switches using the OF Description Statistics Reply message.
...@@ -43,6 +43,8 @@ public final class DriverManager implements OpenFlowSwitchDriverFactory { ...@@ -43,6 +43,8 @@ public final class DriverManager implements OpenFlowSwitchDriverFactory {
43 43
44 private static final int LOWEST_PRIORITY = 0; 44 private static final int LOWEST_PRIORITY = 0;
45 45
46 + private static Dpid corsaDpid = new Dpid();
47 +
46 /** 48 /**
47 * Return an IOFSwitch object based on switch's manufacturer description 49 * Return an IOFSwitch object based on switch's manufacturer description
48 * from OFDescStatsReply. 50 * from OFDescStatsReply.
...@@ -56,6 +58,11 @@ public final class DriverManager implements OpenFlowSwitchDriverFactory { ...@@ -56,6 +58,11 @@ public final class DriverManager implements OpenFlowSwitchDriverFactory {
56 OFDescStatsReply desc, OFVersion ofv) { 58 OFDescStatsReply desc, OFVersion ofv) {
57 String vendor = desc.getMfrDesc(); 59 String vendor = desc.getMfrDesc();
58 String hw = desc.getHwDesc(); 60 String hw = desc.getHwDesc();
61 +
62 + if (dpid.equals(corsaDpid)) {
63 + return new OFCorsaSwitchDriver(dpid, desc);
64 + }
65 +
59 if (vendor.startsWith("Stanford University, Ericsson Research and CPqD Research") 66 if (vendor.startsWith("Stanford University, Ericsson Research and CPqD Research")
60 && 67 &&
61 hw.startsWith("OpenFlow 1.3 Reference Userspace Switch")) { 68 hw.startsWith("OpenFlow 1.3 Reference Userspace Switch")) {
...@@ -83,7 +90,7 @@ public final class DriverManager implements OpenFlowSwitchDriverFactory { ...@@ -83,7 +90,7 @@ public final class DriverManager implements OpenFlowSwitchDriverFactory {
83 } 90 }
84 91
85 log.warn("DriverManager could not identify switch desc: {}. " 92 log.warn("DriverManager could not identify switch desc: {}. "
86 - + "Assigning AbstractOpenFlowSwich", desc); 93 + + "Assigning AbstractOpenFlowSwich", desc);
87 return new AbstractOpenFlowSwitch(dpid, desc) { 94 return new AbstractOpenFlowSwitch(dpid, desc) {
88 95
89 @Override 96 @Override
...@@ -157,4 +164,8 @@ public final class DriverManager implements OpenFlowSwitchDriverFactory { ...@@ -157,4 +164,8 @@ public final class DriverManager implements OpenFlowSwitchDriverFactory {
157 return new DriverManager().getOFSwitchImpl(dpid, desc, ofv); 164 return new DriverManager().getOFSwitchImpl(dpid, desc, ofv);
158 } 165 }
159 166
167 + public static void setCorsaDpid(Dpid dpid) {
168 + corsaDpid = dpid;
169 + }
170 +
160 } 171 }
......