Brian O'Connor
Committed by Gerrit Code Review

ONOS-3529 Updating FlowEntryBuilder to avoid calling getTable on OF_1.0 messages

Change-Id: Id67a07855e0aed0cbd0612a28914c54d802af2cc
...@@ -49,6 +49,7 @@ import org.onosproject.openflow.controller.ExtensionTreatmentInterpreter; ...@@ -49,6 +49,7 @@ import org.onosproject.openflow.controller.ExtensionTreatmentInterpreter;
49 import org.projectfloodlight.openflow.protocol.OFFlowMod; 49 import org.projectfloodlight.openflow.protocol.OFFlowMod;
50 import org.projectfloodlight.openflow.protocol.OFFlowRemoved; 50 import org.projectfloodlight.openflow.protocol.OFFlowRemoved;
51 import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry; 51 import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry;
52 +import org.projectfloodlight.openflow.protocol.OFVersion;
52 import org.projectfloodlight.openflow.protocol.action.OFAction; 53 import org.projectfloodlight.openflow.protocol.action.OFAction;
53 import org.projectfloodlight.openflow.protocol.action.OFActionCircuit; 54 import org.projectfloodlight.openflow.protocol.action.OFActionCircuit;
54 import org.projectfloodlight.openflow.protocol.action.OFActionEnqueue; 55 import org.projectfloodlight.openflow.protocol.action.OFActionEnqueue;
...@@ -157,50 +158,59 @@ public class FlowEntryBuilder { ...@@ -157,50 +158,59 @@ public class FlowEntryBuilder {
157 } 158 }
158 159
159 public FlowEntry build(FlowEntryState... state) { 160 public FlowEntry build(FlowEntryState... state) {
160 - FlowRule rule; 161 + FlowRule.Builder builder;
161 - switch (this.type) { 162 + try {
162 - case STAT: 163 + switch (this.type) {
163 - rule = DefaultFlowRule.builder() 164 + case STAT:
164 - .forDevice(DeviceId.deviceId(Dpid.uri(dpid))) 165 + builder = DefaultFlowRule.builder()
165 - .withSelector(buildSelector()) 166 + .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
166 - .withTreatment(buildTreatment()) 167 + .withSelector(buildSelector())
167 - .withPriority(stat.getPriority()) 168 + .withTreatment(buildTreatment())
168 - .makeTemporary(stat.getIdleTimeout()) 169 + .withPriority(stat.getPriority())
169 - .withCookie(stat.getCookie().getValue()) 170 + .makeTemporary(stat.getIdleTimeout())
170 - .forTable(stat.getTableId().getValue()) 171 + .withCookie(stat.getCookie().getValue())
171 - .build(); 172 + .forTable(stat.getTableId().getValue());
172 - 173 +
173 - return new DefaultFlowEntry(rule, FlowEntryState.ADDED, 174 + return new DefaultFlowEntry(builder.build(), FlowEntryState.ADDED,
174 - stat.getDurationSec(), stat.getPacketCount().getValue(), 175 + stat.getDurationSec(),
175 - stat.getByteCount().getValue()); 176 + stat.getPacketCount().getValue(),
176 - case REMOVED: 177 + stat.getByteCount().getValue());
177 - rule = DefaultFlowRule.builder() 178 + case REMOVED:
178 - .forDevice(DeviceId.deviceId(Dpid.uri(dpid))) 179 + builder = DefaultFlowRule.builder()
179 - .withSelector(buildSelector()) 180 + .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
180 - .withPriority(removed.getPriority()) 181 + .withSelector(buildSelector())
181 - .makeTemporary(removed.getIdleTimeout()) 182 + .withPriority(removed.getPriority())
182 - .withCookie(removed.getCookie().getValue()) 183 + .makeTemporary(removed.getIdleTimeout())
183 - .forTable(removed.getTableId().getValue()) 184 + .withCookie(removed.getCookie().getValue());
184 - .build(); 185 + if (removed.getVersion() != OFVersion.OF_10) {
185 - 186 + builder.forTable(removed.getTableId().getValue());
186 - return new DefaultFlowEntry(rule, FlowEntryState.REMOVED, removed.getDurationSec(), 187 + }
187 - removed.getPacketCount().getValue(), removed.getByteCount().getValue()); 188 +
188 - case MOD: 189 + return new DefaultFlowEntry(builder.build(), FlowEntryState.REMOVED,
189 - FlowEntryState flowState = state.length > 0 ? state[0] : FlowEntryState.FAILED; 190 + removed.getDurationSec(),
190 - rule = DefaultFlowRule.builder() 191 + removed.getPacketCount().getValue(),
191 - .forDevice(DeviceId.deviceId(Dpid.uri(dpid))) 192 + removed.getByteCount().getValue());
192 - .withSelector(buildSelector()) 193 + case MOD:
193 - .withTreatment(buildTreatment()) 194 + FlowEntryState flowState = state.length > 0 ? state[0] : FlowEntryState.FAILED;
194 - .withPriority(flowMod.getPriority()) 195 + builder = DefaultFlowRule.builder()
195 - .makeTemporary(flowMod.getIdleTimeout()) 196 + .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
196 - .withCookie(flowMod.getCookie().getValue()) 197 + .withSelector(buildSelector())
197 - .forTable(flowMod.getTableId().getValue()) 198 + .withTreatment(buildTreatment())
198 - .build(); 199 + .withPriority(flowMod.getPriority())
199 - 200 + .makeTemporary(flowMod.getIdleTimeout())
200 - return new DefaultFlowEntry(rule, flowState, 0, 0, 0); 201 + .withCookie(flowMod.getCookie().getValue());
201 - default: 202 + if (flowMod.getVersion() != OFVersion.OF_10) {
202 - log.error("Unknown flow type : {}", this.type); 203 + builder.forTable(flowMod.getTableId().getValue());
203 - return null; 204 + }
205 +
206 + return new DefaultFlowEntry(builder.build(), flowState, 0, 0, 0);
207 + default:
208 + log.error("Unknown flow type : {}", this.type);
209 + return null;
210 + }
211 + } catch (UnsupportedOperationException e) {
212 + log.warn("Error building flow entry", e);
213 + return null;
204 } 214 }
205 215
206 } 216 }
......