Showing
4 changed files
with
56 additions
and
11 deletions
1 | package org.onlab.onos.of.controller.impl; | 1 | package org.onlab.onos.of.controller.impl; |
2 | 2 | ||
3 | +import static org.onlab.util.Tools.namedThreads; | ||
4 | + | ||
3 | import java.util.HashSet; | 5 | import java.util.HashSet; |
6 | +import java.util.List; | ||
7 | +import java.util.Map; | ||
4 | import java.util.Set; | 8 | import java.util.Set; |
5 | import java.util.concurrent.ConcurrentHashMap; | 9 | import java.util.concurrent.ConcurrentHashMap; |
10 | +import java.util.concurrent.ExecutorService; | ||
11 | +import java.util.concurrent.Executors; | ||
6 | import java.util.concurrent.locks.Lock; | 12 | import java.util.concurrent.locks.Lock; |
7 | import java.util.concurrent.locks.ReentrantLock; | 13 | import java.util.concurrent.locks.ReentrantLock; |
8 | 14 | ||
... | @@ -13,6 +19,7 @@ import org.apache.felix.scr.annotations.Service; | ... | @@ -13,6 +19,7 @@ import org.apache.felix.scr.annotations.Service; |
13 | import org.onlab.onos.of.controller.DefaultOpenFlowPacketContext; | 19 | import org.onlab.onos.of.controller.DefaultOpenFlowPacketContext; |
14 | import org.onlab.onos.of.controller.Dpid; | 20 | import org.onlab.onos.of.controller.Dpid; |
15 | import org.onlab.onos.of.controller.OpenFlowController; | 21 | import org.onlab.onos.of.controller.OpenFlowController; |
22 | +import org.onlab.onos.of.controller.OpenFlowEventListener; | ||
16 | import org.onlab.onos.of.controller.OpenFlowPacketContext; | 23 | import org.onlab.onos.of.controller.OpenFlowPacketContext; |
17 | import org.onlab.onos.of.controller.OpenFlowSwitch; | 24 | import org.onlab.onos.of.controller.OpenFlowSwitch; |
18 | import org.onlab.onos.of.controller.OpenFlowSwitchListener; | 25 | import org.onlab.onos.of.controller.OpenFlowSwitchListener; |
... | @@ -22,10 +29,12 @@ import org.onlab.onos.of.controller.driver.OpenFlowAgent; | ... | @@ -22,10 +29,12 @@ import org.onlab.onos.of.controller.driver.OpenFlowAgent; |
22 | import org.projectfloodlight.openflow.protocol.OFMessage; | 29 | import org.projectfloodlight.openflow.protocol.OFMessage; |
23 | import org.projectfloodlight.openflow.protocol.OFPacketIn; | 30 | import org.projectfloodlight.openflow.protocol.OFPacketIn; |
24 | import org.projectfloodlight.openflow.protocol.OFPortStatus; | 31 | import org.projectfloodlight.openflow.protocol.OFPortStatus; |
32 | +import org.projectfloodlight.openflow.protocol.OFType; | ||
25 | import org.slf4j.Logger; | 33 | import org.slf4j.Logger; |
26 | import org.slf4j.LoggerFactory; | 34 | import org.slf4j.LoggerFactory; |
27 | 35 | ||
28 | import com.google.common.collect.ArrayListMultimap; | 36 | import com.google.common.collect.ArrayListMultimap; |
37 | +import com.google.common.collect.Maps; | ||
29 | import com.google.common.collect.Multimap; | 38 | import com.google.common.collect.Multimap; |
30 | 39 | ||
31 | @Component(immediate = true) | 40 | @Component(immediate = true) |
... | @@ -35,6 +44,10 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -35,6 +44,10 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
35 | private static final Logger log = | 44 | private static final Logger log = |
36 | LoggerFactory.getLogger(OpenFlowControllerImpl.class); | 45 | LoggerFactory.getLogger(OpenFlowControllerImpl.class); |
37 | 46 | ||
47 | + private final ExecutorService executor = Executors.newFixedThreadPool(16, | ||
48 | + namedThreads("of-event-dispatch-%d")); | ||
49 | + | ||
50 | + | ||
38 | protected ConcurrentHashMap<Dpid, OpenFlowSwitch> connectedSwitches = | 51 | protected ConcurrentHashMap<Dpid, OpenFlowSwitch> connectedSwitches = |
39 | new ConcurrentHashMap<Dpid, OpenFlowSwitch>(); | 52 | new ConcurrentHashMap<Dpid, OpenFlowSwitch>(); |
40 | protected ConcurrentHashMap<Dpid, OpenFlowSwitch> activeMasterSwitches = | 53 | protected ConcurrentHashMap<Dpid, OpenFlowSwitch> activeMasterSwitches = |
... | @@ -43,11 +56,12 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -43,11 +56,12 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
43 | new ConcurrentHashMap<Dpid, OpenFlowSwitch>(); | 56 | new ConcurrentHashMap<Dpid, OpenFlowSwitch>(); |
44 | 57 | ||
45 | protected OpenFlowSwitchAgent agent = new OpenFlowSwitchAgent(); | 58 | protected OpenFlowSwitchAgent agent = new OpenFlowSwitchAgent(); |
46 | - protected Set<OpenFlowSwitchListener> ofEventListener = new HashSet<>(); | 59 | + protected Set<OpenFlowSwitchListener> ofSwitchListener = new HashSet<>(); |
47 | 60 | ||
48 | protected Multimap<Integer, PacketListener> ofPacketListener = | 61 | protected Multimap<Integer, PacketListener> ofPacketListener = |
49 | ArrayListMultimap.create(); | 62 | ArrayListMultimap.create(); |
50 | 63 | ||
64 | + protected Map<OFType, List<OpenFlowEventListener>> ofEventListener = Maps.newHashMap(); | ||
51 | 65 | ||
52 | private final Controller ctrl = new Controller(); | 66 | private final Controller ctrl = new Controller(); |
53 | 67 | ||
... | @@ -93,14 +107,14 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -93,14 +107,14 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
93 | 107 | ||
94 | @Override | 108 | @Override |
95 | public void addListener(OpenFlowSwitchListener listener) { | 109 | public void addListener(OpenFlowSwitchListener listener) { |
96 | - if (!ofEventListener.contains(listener)) { | 110 | + if (!ofSwitchListener.contains(listener)) { |
97 | - this.ofEventListener.add(listener); | 111 | + this.ofSwitchListener.add(listener); |
98 | } | 112 | } |
99 | } | 113 | } |
100 | 114 | ||
101 | @Override | 115 | @Override |
102 | public void removeListener(OpenFlowSwitchListener listener) { | 116 | public void removeListener(OpenFlowSwitchListener listener) { |
103 | - this.ofEventListener.remove(listener); | 117 | + this.ofSwitchListener.remove(listener); |
104 | } | 118 | } |
105 | 119 | ||
106 | @Override | 120 | @Override |
... | @@ -122,7 +136,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -122,7 +136,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
122 | public void processPacket(Dpid dpid, OFMessage msg) { | 136 | public void processPacket(Dpid dpid, OFMessage msg) { |
123 | switch (msg.getType()) { | 137 | switch (msg.getType()) { |
124 | case PORT_STATUS: | 138 | case PORT_STATUS: |
125 | - for (OpenFlowSwitchListener l : ofEventListener) { | 139 | + for (OpenFlowSwitchListener l : ofSwitchListener) { |
126 | l.portChanged(dpid, (OFPortStatus) msg); | 140 | l.portChanged(dpid, (OFPortStatus) msg); |
127 | } | 141 | } |
128 | break; | 142 | break; |
... | @@ -134,6 +148,12 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -134,6 +148,12 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
134 | p.handlePacket(pktCtx); | 148 | p.handlePacket(pktCtx); |
135 | } | 149 | } |
136 | break; | 150 | break; |
151 | + case FLOW_REMOVED: | ||
152 | + case ERROR: | ||
153 | + case STATS_REPLY: | ||
154 | + case BARRIER_REPLY: | ||
155 | + executor.submit(new OFMessageHandler(dpid, msg)); | ||
156 | + break; | ||
137 | default: | 157 | default: |
138 | log.warn("Handling message type {} not yet implemented {}", | 158 | log.warn("Handling message type {} not yet implemented {}", |
139 | msg.getType(), msg); | 159 | msg.getType(), msg); |
... | @@ -164,7 +184,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -164,7 +184,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
164 | } else { | 184 | } else { |
165 | log.error("Added switch {}", dpid); | 185 | log.error("Added switch {}", dpid); |
166 | connectedSwitches.put(dpid, sw); | 186 | connectedSwitches.put(dpid, sw); |
167 | - for (OpenFlowSwitchListener l : ofEventListener) { | 187 | + for (OpenFlowSwitchListener l : ofSwitchListener) { |
168 | l.switchAdded(dpid); | 188 | l.switchAdded(dpid); |
169 | } | 189 | } |
170 | return true; | 190 | return true; |
... | @@ -277,7 +297,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -277,7 +297,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
277 | if (sw == null) { | 297 | if (sw == null) { |
278 | sw = activeEqualSwitches.remove(dpid); | 298 | sw = activeEqualSwitches.remove(dpid); |
279 | } | 299 | } |
280 | - for (OpenFlowSwitchListener l : ofEventListener) { | 300 | + for (OpenFlowSwitchListener l : ofSwitchListener) { |
281 | l.switchRemoved(dpid); | 301 | l.switchRemoved(dpid); |
282 | } | 302 | } |
283 | } | 303 | } |
... | @@ -288,5 +308,26 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -288,5 +308,26 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
288 | } | 308 | } |
289 | } | 309 | } |
290 | 310 | ||
311 | + private final class OFMessageHandler implements Runnable { | ||
312 | + | ||
313 | + private final OFMessage msg; | ||
314 | + private final Dpid dpid; | ||
315 | + | ||
316 | + public OFMessageHandler(Dpid dpid, OFMessage msg) { | ||
317 | + this.msg = msg; | ||
318 | + this.dpid = dpid; | ||
319 | + } | ||
320 | + | ||
321 | + @Override | ||
322 | + public void run() { | ||
323 | + List<OpenFlowEventListener> listeners = | ||
324 | + ofEventListener.get(OFType.FLOW_REMOVED); | ||
325 | + for (OpenFlowEventListener listener : listeners) { | ||
326 | + listener.handleMessage(dpid, msg); | ||
327 | + } | ||
328 | + } | ||
329 | + | ||
330 | + } | ||
331 | + | ||
291 | 332 | ||
292 | } | 333 | } | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -46,7 +46,7 @@ public class OpenFlowCorePacketContext extends DefaultPacketContext { | ... | @@ -46,7 +46,7 @@ public class OpenFlowCorePacketContext extends DefaultPacketContext { |
46 | private void sendBufferedPacket() { | 46 | private void sendBufferedPacket() { |
47 | List<Instruction> ins = treatmentBuilder().build().instructions(); | 47 | List<Instruction> ins = treatmentBuilder().build().instructions(); |
48 | OFPort p = null; | 48 | OFPort p = null; |
49 | - //TODO: support arbitrary list of treatments | 49 | + //TODO: support arbitrary list of treatments must be supported in ofPacketContext |
50 | for (Instruction i : ins) { | 50 | for (Instruction i : ins) { |
51 | if (i.type() == Type.OUTPUT) { | 51 | if (i.type() == Type.OUTPUT) { |
52 | p = buildPort(((OutputInstruction) i).port()); | 52 | p = buildPort(((OutputInstruction) i).port()); | ... | ... |
... | @@ -118,7 +118,7 @@ public final class IpAddress { | ... | @@ -118,7 +118,7 @@ public final class IpAddress { |
118 | if (mask > MAX_INET_MASK) { | 118 | if (mask > MAX_INET_MASK) { |
119 | throw new IllegalArgumentException( | 119 | throw new IllegalArgumentException( |
120 | "Value of subnet mask cannot exceed " | 120 | "Value of subnet mask cannot exceed " |
121 | - + MAX_INET_MASK); | 121 | + + MAX_INET_MASK); |
122 | } | 122 | } |
123 | } | 123 | } |
124 | 124 | ||
... | @@ -200,7 +200,7 @@ public final class IpAddress { | ... | @@ -200,7 +200,7 @@ public final class IpAddress { |
200 | byte [] net = new byte [4]; | 200 | byte [] net = new byte [4]; |
201 | byte [] mask = bytes(mask()); | 201 | byte [] mask = bytes(mask()); |
202 | for (int i = 0; i < INET_LEN; i++) { | 202 | for (int i = 0; i < INET_LEN; i++) { |
203 | - net[i] = (byte) (octets[i] & mask[i]); | 203 | + net[i] = (byte) (octets[i] & mask[i]); |
204 | } | 204 | } |
205 | return new IpAddress(version, net, netmask); | 205 | return new IpAddress(version, net, netmask); |
206 | } | 206 | } |
... | @@ -221,11 +221,15 @@ public final class IpAddress { | ... | @@ -221,11 +221,15 @@ public final class IpAddress { |
221 | byte [] host = new byte [INET_LEN]; | 221 | byte [] host = new byte [INET_LEN]; |
222 | byte [] mask = bytes(mask()); | 222 | byte [] mask = bytes(mask()); |
223 | for (int i = 0; i < INET_LEN; i++) { | 223 | for (int i = 0; i < INET_LEN; i++) { |
224 | - host[i] = (byte) (octets[i] & ~mask[i]); | 224 | + host[i] = (byte) (octets[i] & ~mask[i]); |
225 | } | 225 | } |
226 | return new IpAddress(version, host, netmask); | 226 | return new IpAddress(version, host, netmask); |
227 | } | 227 | } |
228 | 228 | ||
229 | + public boolean isMasked() { | ||
230 | + return mask() != 0; | ||
231 | + } | ||
232 | + | ||
229 | @Override | 233 | @Override |
230 | public int hashCode() { | 234 | public int hashCode() { |
231 | final int prime = 31; | 235 | final int prime = 31; | ... | ... |
-
Please register or login to post a comment