fixed of13 glitches
Change-Id: Iaaaec162cc3b33f25912da8b06e509d1ff7e2ec4
Showing
5 changed files
with
70 additions
and
10 deletions
| ... | @@ -122,7 +122,7 @@ class RoleManager implements RoleHandler { | ... | @@ -122,7 +122,7 @@ class RoleManager implements RoleHandler { |
| 122 | //FIXME fix below when we actually use generation ids | 122 | //FIXME fix below when we actually use generation ids |
| 123 | .setGenerationId(U64.ZERO) | 123 | .setGenerationId(U64.ZERO) |
| 124 | .build(); | 124 | .build(); |
| 125 | - sw.sendMsg(rrm); | 125 | + sw.write(rrm); |
| 126 | return xid; | 126 | return xid; |
| 127 | } | 127 | } |
| 128 | 128 | ... | ... |
| ... | @@ -138,7 +138,7 @@ public class OFSwitchImplOVS13 extends AbstractOpenFlowSwitch { | ... | @@ -138,7 +138,7 @@ public class OFSwitchImplOVS13 extends AbstractOpenFlowSwitch { |
| 138 | .buildBarrierRequest() | 138 | .buildBarrierRequest() |
| 139 | .setXid(xid) | 139 | .setXid(xid) |
| 140 | .build(); | 140 | .build(); |
| 141 | - sendMsg(br); | 141 | + write(br); |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | @Override | 144 | @Override |
| ... | @@ -227,7 +227,7 @@ public class OFSwitchImplOVS13 extends AbstractOpenFlowSwitch { | ... | @@ -227,7 +227,7 @@ public class OFSwitchImplOVS13 extends AbstractOpenFlowSwitch { |
| 227 | .setHardTimeout(0) | 227 | .setHardTimeout(0) |
| 228 | .setXid(getNextTransactionId()) | 228 | .setXid(getNextTransactionId()) |
| 229 | .build(); | 229 | .build(); |
| 230 | - sendMsg(tableMissEntry); | 230 | + write(tableMissEntry); |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | } | 233 | } | ... | ... |
| ... | @@ -40,15 +40,15 @@ public enum OFType { | ... | @@ -40,15 +40,15 @@ public enum OFType { |
| 40 | PORT_STATUS, | 40 | PORT_STATUS, |
| 41 | PACKET_OUT, | 41 | PACKET_OUT, |
| 42 | FLOW_MOD, | 42 | FLOW_MOD, |
| 43 | + GROUP_MOD, | ||
| 43 | PORT_MOD, | 44 | PORT_MOD, |
| 45 | + TABLE_MOD, | ||
| 44 | STATS_REQUEST, | 46 | STATS_REQUEST, |
| 45 | STATS_REPLY, | 47 | STATS_REPLY, |
| 46 | BARRIER_REQUEST, | 48 | BARRIER_REQUEST, |
| 47 | BARRIER_REPLY, | 49 | BARRIER_REPLY, |
| 48 | QUEUE_GET_CONFIG_REQUEST, | 50 | QUEUE_GET_CONFIG_REQUEST, |
| 49 | QUEUE_GET_CONFIG_REPLY, | 51 | QUEUE_GET_CONFIG_REPLY, |
| 50 | - GROUP_MOD, | ||
| 51 | - TABLE_MOD, | ||
| 52 | ROLE_REQUEST, | 52 | ROLE_REQUEST, |
| 53 | ROLE_REPLY, | 53 | ROLE_REPLY, |
| 54 | GET_ASYNC_REQUEST, | 54 | GET_ASYNC_REQUEST, | ... | ... |
| ... | @@ -20,6 +20,7 @@ import org.onlab.packet.VlanId; | ... | @@ -20,6 +20,7 @@ import org.onlab.packet.VlanId; |
| 20 | import org.projectfloodlight.openflow.protocol.OFFlowRemoved; | 20 | import org.projectfloodlight.openflow.protocol.OFFlowRemoved; |
| 21 | import org.projectfloodlight.openflow.protocol.OFFlowRemovedReason; | 21 | import org.projectfloodlight.openflow.protocol.OFFlowRemovedReason; |
| 22 | import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry; | 22 | import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry; |
| 23 | +import org.projectfloodlight.openflow.protocol.OFInstructionType; | ||
| 23 | import org.projectfloodlight.openflow.protocol.action.OFAction; | 24 | import org.projectfloodlight.openflow.protocol.action.OFAction; |
| 24 | import org.projectfloodlight.openflow.protocol.action.OFActionOutput; | 25 | import org.projectfloodlight.openflow.protocol.action.OFActionOutput; |
| 25 | import org.projectfloodlight.openflow.protocol.action.OFActionSetDlDst; | 26 | import org.projectfloodlight.openflow.protocol.action.OFActionSetDlDst; |
| ... | @@ -28,11 +29,15 @@ import org.projectfloodlight.openflow.protocol.action.OFActionSetNwDst; | ... | @@ -28,11 +29,15 @@ import org.projectfloodlight.openflow.protocol.action.OFActionSetNwDst; |
| 28 | import org.projectfloodlight.openflow.protocol.action.OFActionSetNwSrc; | 29 | import org.projectfloodlight.openflow.protocol.action.OFActionSetNwSrc; |
| 29 | import org.projectfloodlight.openflow.protocol.action.OFActionSetVlanPcp; | 30 | import org.projectfloodlight.openflow.protocol.action.OFActionSetVlanPcp; |
| 30 | import org.projectfloodlight.openflow.protocol.action.OFActionSetVlanVid; | 31 | import org.projectfloodlight.openflow.protocol.action.OFActionSetVlanVid; |
| 32 | +import org.projectfloodlight.openflow.protocol.instruction.OFInstruction; | ||
| 33 | +import org.projectfloodlight.openflow.protocol.instruction.OFInstructionApplyActions; | ||
| 31 | import org.projectfloodlight.openflow.protocol.match.Match; | 34 | import org.projectfloodlight.openflow.protocol.match.Match; |
| 32 | import org.projectfloodlight.openflow.protocol.match.MatchField; | 35 | import org.projectfloodlight.openflow.protocol.match.MatchField; |
| 33 | import org.projectfloodlight.openflow.types.IPv4Address; | 36 | import org.projectfloodlight.openflow.types.IPv4Address; |
| 34 | import org.slf4j.Logger; | 37 | import org.slf4j.Logger; |
| 35 | 38 | ||
| 39 | +import com.google.common.collect.Lists; | ||
| 40 | + | ||
| 36 | public class FlowRuleBuilder { | 41 | public class FlowRuleBuilder { |
| 37 | private final Logger log = getLogger(getClass()); | 42 | private final Logger log = getLogger(getClass()); |
| 38 | 43 | ||
| ... | @@ -44,15 +49,16 @@ public class FlowRuleBuilder { | ... | @@ -44,15 +49,16 @@ public class FlowRuleBuilder { |
| 44 | 49 | ||
| 45 | private final Dpid dpid; | 50 | private final Dpid dpid; |
| 46 | 51 | ||
| 47 | - | 52 | + private final boolean addedRule; |
| 48 | 53 | ||
| 49 | 54 | ||
| 50 | public FlowRuleBuilder(Dpid dpid, OFFlowStatsEntry entry) { | 55 | public FlowRuleBuilder(Dpid dpid, OFFlowStatsEntry entry) { |
| 51 | this.stat = entry; | 56 | this.stat = entry; |
| 52 | this.match = entry.getMatch(); | 57 | this.match = entry.getMatch(); |
| 53 | - this.actions = entry.getActions(); | 58 | + this.actions = getActions(entry); |
| 54 | this.dpid = dpid; | 59 | this.dpid = dpid; |
| 55 | this.removed = null; | 60 | this.removed = null; |
| 61 | + this.addedRule = true; | ||
| 56 | } | 62 | } |
| 57 | 63 | ||
| 58 | public FlowRuleBuilder(Dpid dpid, OFFlowRemoved removed) { | 64 | public FlowRuleBuilder(Dpid dpid, OFFlowRemoved removed) { |
| ... | @@ -62,11 +68,12 @@ public class FlowRuleBuilder { | ... | @@ -62,11 +68,12 @@ public class FlowRuleBuilder { |
| 62 | this.dpid = dpid; | 68 | this.dpid = dpid; |
| 63 | this.actions = null; | 69 | this.actions = null; |
| 64 | this.stat = null; | 70 | this.stat = null; |
| 71 | + this.addedRule = false; | ||
| 65 | 72 | ||
| 66 | } | 73 | } |
| 67 | 74 | ||
| 68 | public FlowRule build() { | 75 | public FlowRule build() { |
| 69 | - if (stat != null) { | 76 | + if (addedRule) { |
| 70 | return new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)), | 77 | return new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)), |
| 71 | buildSelector(), buildTreatment(), stat.getPriority(), | 78 | buildSelector(), buildTreatment(), stat.getPriority(), |
| 72 | FlowRuleState.ADDED, stat.getDurationNsec() / 1000000, | 79 | FlowRuleState.ADDED, stat.getDurationNsec() / 1000000, |
| ... | @@ -84,6 +91,26 @@ public class FlowRuleBuilder { | ... | @@ -84,6 +91,26 @@ public class FlowRuleBuilder { |
| 84 | } | 91 | } |
| 85 | } | 92 | } |
| 86 | 93 | ||
| 94 | + private List<OFAction> getActions(OFFlowStatsEntry entry) { | ||
| 95 | + switch (entry.getVersion()) { | ||
| 96 | + case OF_10: | ||
| 97 | + return entry.getActions(); | ||
| 98 | + case OF_11: | ||
| 99 | + case OF_12: | ||
| 100 | + case OF_13: | ||
| 101 | + List<OFInstruction> ins = entry.getInstructions(); | ||
| 102 | + for (OFInstruction in : ins) { | ||
| 103 | + if (in.getType().equals(OFInstructionType.APPLY_ACTIONS)) { | ||
| 104 | + OFInstructionApplyActions apply = (OFInstructionApplyActions) in; | ||
| 105 | + return apply.getActions(); | ||
| 106 | + } | ||
| 107 | + } | ||
| 108 | + return Lists.newLinkedList(); | ||
| 109 | + default: | ||
| 110 | + log.warn("Unknown OF version {}", entry.getVersion()); | ||
| 111 | + } | ||
| 112 | + return Lists.newLinkedList(); | ||
| 113 | + } | ||
| 87 | 114 | ||
| 88 | private TrafficTreatment buildTreatment() { | 115 | private TrafficTreatment buildTreatment() { |
| 89 | TrafficTreatment.Builder builder = new DefaultTrafficTreatment.Builder(); | 116 | TrafficTreatment.Builder builder = new DefaultTrafficTreatment.Builder(); | ... | ... |
providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/OpenFlowRuleProvider.java
| ... | @@ -2,6 +2,7 @@ package org.onlab.onos.provider.of.flow.impl; | ... | @@ -2,6 +2,7 @@ package org.onlab.onos.provider.of.flow.impl; |
| 2 | 2 | ||
| 3 | import static org.slf4j.LoggerFactory.getLogger; | 3 | import static org.slf4j.LoggerFactory.getLogger; |
| 4 | 4 | ||
| 5 | +import java.util.List; | ||
| 5 | import java.util.Map; | 6 | import java.util.Map; |
| 6 | 7 | ||
| 7 | import org.apache.felix.scr.annotations.Activate; | 8 | import org.apache.felix.scr.annotations.Activate; |
| ... | @@ -24,14 +25,22 @@ import org.onlab.onos.openflow.controller.OpenFlowEventListener; | ... | @@ -24,14 +25,22 @@ import org.onlab.onos.openflow.controller.OpenFlowEventListener; |
| 24 | import org.onlab.onos.openflow.controller.OpenFlowSwitch; | 25 | import org.onlab.onos.openflow.controller.OpenFlowSwitch; |
| 25 | import org.onlab.onos.openflow.controller.OpenFlowSwitchListener; | 26 | import org.onlab.onos.openflow.controller.OpenFlowSwitchListener; |
| 26 | import org.onlab.onos.openflow.controller.RoleState; | 27 | import org.onlab.onos.openflow.controller.RoleState; |
| 28 | +import org.projectfloodlight.openflow.protocol.OFActionType; | ||
| 27 | import org.projectfloodlight.openflow.protocol.OFFlowRemoved; | 29 | import org.projectfloodlight.openflow.protocol.OFFlowRemoved; |
| 28 | import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry; | 30 | import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry; |
| 29 | import org.projectfloodlight.openflow.protocol.OFFlowStatsReply; | 31 | import org.projectfloodlight.openflow.protocol.OFFlowStatsReply; |
| 32 | +import org.projectfloodlight.openflow.protocol.OFInstructionType; | ||
| 30 | import org.projectfloodlight.openflow.protocol.OFMessage; | 33 | import org.projectfloodlight.openflow.protocol.OFMessage; |
| 31 | import org.projectfloodlight.openflow.protocol.OFPortStatus; | 34 | import org.projectfloodlight.openflow.protocol.OFPortStatus; |
| 32 | import org.projectfloodlight.openflow.protocol.OFStatsReply; | 35 | import org.projectfloodlight.openflow.protocol.OFStatsReply; |
| 33 | import org.projectfloodlight.openflow.protocol.OFStatsReplyFlags; | 36 | import org.projectfloodlight.openflow.protocol.OFStatsReplyFlags; |
| 34 | import org.projectfloodlight.openflow.protocol.OFStatsType; | 37 | import org.projectfloodlight.openflow.protocol.OFStatsType; |
| 38 | +import org.projectfloodlight.openflow.protocol.OFVersion; | ||
| 39 | +import org.projectfloodlight.openflow.protocol.action.OFAction; | ||
| 40 | +import org.projectfloodlight.openflow.protocol.action.OFActionOutput; | ||
| 41 | +import org.projectfloodlight.openflow.protocol.instruction.OFInstruction; | ||
| 42 | +import org.projectfloodlight.openflow.protocol.instruction.OFInstructionApplyActions; | ||
| 43 | +import org.projectfloodlight.openflow.types.OFPort; | ||
| 35 | import org.slf4j.Logger; | 44 | import org.slf4j.Logger; |
| 36 | 45 | ||
| 37 | import com.google.common.collect.ArrayListMultimap; | 46 | import com.google.common.collect.ArrayListMultimap; |
| ... | @@ -178,8 +187,9 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr | ... | @@ -178,8 +187,9 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr |
| 178 | //final List<FlowRule> entries = Lists.newLinkedList(); | 187 | //final List<FlowRule> entries = Lists.newLinkedList(); |
| 179 | 188 | ||
| 180 | for (OFFlowStatsEntry reply : replies.getEntries()) { | 189 | for (OFFlowStatsEntry reply : replies.getEntries()) { |
| 181 | - completeEntries.put(did, new FlowRuleBuilder(dpid, reply).build()); | 190 | + if (!tableMissRule(dpid, reply)) { |
| 182 | - //entries.add(new FlowRuleBuilder(dpid, reply).build()); | 191 | + completeEntries.put(did, new FlowRuleBuilder(dpid, reply).build()); |
| 192 | + } | ||
| 183 | } | 193 | } |
| 184 | 194 | ||
| 185 | if (!stats.getFlags().contains(OFStatsReplyFlags.REPLY_MORE)) { | 195 | if (!stats.getFlags().contains(OFStatsReplyFlags.REPLY_MORE)) { |
| ... | @@ -189,6 +199,29 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr | ... | @@ -189,6 +199,29 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr |
| 189 | } | 199 | } |
| 190 | } | 200 | } |
| 191 | 201 | ||
| 202 | + private boolean tableMissRule(Dpid dpid, OFFlowStatsEntry reply) { | ||
| 203 | + // TODO NEED TO FIND A BETTER WAY TO AVOID DOING THIS | ||
| 204 | + if (reply.getVersion().equals(OFVersion.OF_10) || | ||
| 205 | + reply.getMatch().getMatchFields().iterator().hasNext()) { | ||
| 206 | + return false; | ||
| 207 | + } | ||
| 208 | + for (OFInstruction ins : reply.getInstructions()) { | ||
| 209 | + if (ins.getType() == OFInstructionType.APPLY_ACTIONS) { | ||
| 210 | + OFInstructionApplyActions apply = (OFInstructionApplyActions) ins; | ||
| 211 | + List<OFAction> acts = apply.getActions(); | ||
| 212 | + for (OFAction act : acts) { | ||
| 213 | + if (act.getType() == OFActionType.OUTPUT) { | ||
| 214 | + OFActionOutput out = (OFActionOutput) act; | ||
| 215 | + if (out.getPort() == OFPort.CONTROLLER) { | ||
| 216 | + return true; | ||
| 217 | + } | ||
| 218 | + } | ||
| 219 | + } | ||
| 220 | + } | ||
| 221 | + } | ||
| 222 | + return false; | ||
| 223 | + } | ||
| 224 | + | ||
| 192 | } | 225 | } |
| 193 | 226 | ||
| 194 | 227 | ... | ... |
-
Please register or login to post a comment