Use DeviceId in FlowEntryBuilder to avoid creating deviceId many times per
flow entry build.
Change-Id: I89e90426e1b94b8828b6f83a6dbfc33f4e7cf259
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
index b884408..7fb0eac 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
@@ -16,7 +16,6 @@
package org.onosproject.provider.of.flow.impl;
import com.google.common.collect.Lists;
-
import org.onlab.packet.EthType;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.Ip4Prefix;
@@ -48,7 +47,6 @@
import org.onosproject.net.flow.criteria.ExtensionSelectorType.ExtensionSelectorTypes;
import org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes;
import org.onosproject.net.flow.instructions.Instructions;
-import org.onosproject.openflow.controller.Dpid;
import org.onosproject.openflow.controller.ExtensionSelectorInterpreter;
import org.onosproject.openflow.controller.ExtensionTreatmentInterpreter;
import org.projectfloodlight.openflow.protocol.OFFlowMod;
@@ -86,20 +84,20 @@
import org.projectfloodlight.openflow.types.IPv6Address;
import org.projectfloodlight.openflow.types.Masked;
import org.projectfloodlight.openflow.types.OFVlanVidMatch;
+import org.projectfloodlight.openflow.types.OduSignalID;
import org.projectfloodlight.openflow.types.TransportPort;
import org.projectfloodlight.openflow.types.U32;
import org.projectfloodlight.openflow.types.U64;
import org.projectfloodlight.openflow.types.U8;
import org.projectfloodlight.openflow.types.VlanPcp;
-import org.projectfloodlight.openflow.types.OduSignalID;
import org.slf4j.Logger;
import java.util.List;
import static org.onosproject.net.flow.criteria.Criteria.matchLambda;
import static org.onosproject.net.flow.criteria.Criteria.matchOchSignalType;
-import static org.onosproject.net.flow.criteria.Criteria.matchOduSignalType;
import static org.onosproject.net.flow.criteria.Criteria.matchOduSignalId;
+import static org.onosproject.net.flow.criteria.Criteria.matchOduSignalType;
import static org.onosproject.net.flow.instructions.Instructions.modL0Lambda;
import static org.onosproject.net.flow.instructions.Instructions.modL1OduSignalId;
import static org.onosproject.provider.of.flow.impl.OpenFlowValueMapper.lookupChannelSpacing;
@@ -121,7 +119,7 @@
// the instruction type is apply instruction (immediate set in ONOS speak)
private final List<OFInstruction> instructions;
- private final Dpid dpid;
+ private final DeviceId deviceId;
public enum FlowType { STAT, REMOVED, MOD }
@@ -129,21 +127,21 @@
private final DriverService driverService;
- public FlowEntryBuilder(Dpid dpid, OFFlowStatsEntry entry, DriverService driverService) {
+ public FlowEntryBuilder(DeviceId deviceId, OFFlowStatsEntry entry, DriverService driverService) {
this.stat = entry;
this.match = entry.getMatch();
this.instructions = getInstructions(entry);
- this.dpid = dpid;
+ this.deviceId = deviceId;
this.removed = null;
this.flowMod = null;
this.type = FlowType.STAT;
this.driverService = driverService;
}
- public FlowEntryBuilder(Dpid dpid, OFFlowRemoved removed, DriverService driverService) {
+ public FlowEntryBuilder(DeviceId deviceId, OFFlowRemoved removed, DriverService driverService) {
this.match = removed.getMatch();
this.removed = removed;
- this.dpid = dpid;
+ this.deviceId = deviceId;
this.instructions = null;
this.stat = null;
this.flowMod = null;
@@ -151,9 +149,9 @@
this.driverService = driverService;
}
- public FlowEntryBuilder(Dpid dpid, OFFlowMod fm, DriverService driverService) {
+ public FlowEntryBuilder(DeviceId deviceId, OFFlowMod fm, DriverService driverService) {
this.match = fm.getMatch();
- this.dpid = dpid;
+ this.deviceId = deviceId;
this.instructions = getInstructions(fm);
this.type = FlowType.MOD;
this.flowMod = fm;
@@ -168,7 +166,7 @@
switch (this.type) {
case STAT:
builder = DefaultFlowRule.builder()
- .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
+ .forDevice(deviceId)
.withSelector(buildSelector())
.withTreatment(buildTreatment())
.withPriority(stat.getPriority())
@@ -184,7 +182,7 @@
stat.getByteCount().getValue());
case REMOVED:
builder = DefaultFlowRule.builder()
- .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
+ .forDevice(deviceId)
.withSelector(buildSelector())
.withPriority(removed.getPriority())
.makeTemporary(removed.getIdleTimeout())
@@ -200,7 +198,7 @@
case MOD:
FlowEntryState flowState = state.length > 0 ? state[0] : FlowEntryState.FAILED;
builder = DefaultFlowRule.builder()
- .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
+ .forDevice(deviceId)
.withSelector(buildSelector())
.withTreatment(buildTreatment())
.withPriority(flowMod.getPriority())
@@ -293,7 +291,7 @@
private TrafficTreatment.Builder buildActions(List<OFAction> actions,
TrafficTreatment.Builder builder) {
- DriverHandler driverHandler = getDriver(dpid);
+ DriverHandler driverHandler = getDriver(deviceId);
ExtensionTreatmentInterpreter treatmentInterpreter;
if (driverHandler.hasBehaviour(ExtensionTreatmentInterpreter.class)) {
treatmentInterpreter = driverHandler.behaviour(ExtensionTreatmentInterpreter.class);
@@ -349,7 +347,7 @@
} else if (exp.getExperimenter() == 0x2320) {
if (treatmentInterpreter != null) {
builder.extension(treatmentInterpreter.mapAction(exp),
- DeviceId.deviceId(Dpid.uri(dpid)));
+ deviceId);
}
} else {
log.warn("Unsupported OFActionExperimenter {}", exp.getExperimenter());
@@ -417,7 +415,7 @@
private void handleSetField(TrafficTreatment.Builder builder, OFActionSetField action) {
- DriverHandler driverHandler = getDriver(dpid);
+ DriverHandler driverHandler = getDriver(deviceId);
ExtensionTreatmentInterpreter treatmentInterpreter;
if (driverHandler.hasBehaviour(ExtensionTreatmentInterpreter.class)) {
treatmentInterpreter = driverHandler.behaviour(ExtensionTreatmentInterpreter.class);
@@ -436,7 +434,7 @@
if (treatmentInterpreter != null &&
treatmentInterpreter.supported(ExtensionTreatmentTypes.OFDPA_SET_VLAN_ID.type())) {
builder.extension(treatmentInterpreter.mapAction(action),
- DeviceId.deviceId(Dpid.uri(dpid)));
+ deviceId);
} else {
@SuppressWarnings("unchecked")
OFOxm<OFVlanVidMatch> vlanvid = (OFOxm<OFVlanVidMatch>) oxm;
@@ -503,7 +501,7 @@
case TUNNEL_IPV4_DST:
if (treatmentInterpreter != null &&
treatmentInterpreter.supported(ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST.type())) {
- builder.extension(treatmentInterpreter.mapAction(action), DeviceId.deviceId(Dpid.uri(dpid)));
+ builder.extension(treatmentInterpreter.mapAction(action), deviceId);
}
break;
case EXP_ODU_SIG_ID:
@@ -592,7 +590,7 @@
Ip6Prefix ip6Prefix;
Ip4Address ip;
- DriverHandler driverHandler = getDriver(dpid);
+ DriverHandler driverHandler = getDriver(deviceId);
ExtensionSelectorInterpreter selectorInterpreter;
if (driverHandler.hasBehaviour(ExtensionSelectorInterpreter.class)) {
selectorInterpreter = driverHandler.behaviour(ExtensionSelectorInterpreter.class);
@@ -648,7 +646,7 @@
if (match.getVersion().equals(OFVersion.OF_13)) {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.VLAN_VID);
builder.extension(selectorInterpreter.mapOxm(oxm),
- DeviceId.deviceId(Dpid.uri(dpid)));
+ deviceId);
} else {
break;
}
@@ -881,8 +879,7 @@
return builder.build();
}
- private DriverHandler getDriver(Dpid dpid) {
- DeviceId deviceId = DeviceId.deviceId(Dpid.uri(dpid));
+ private DriverHandler getDriver(DeviceId deviceId) {
Driver driver = driverService.getDriver(deviceId);
DriverHandler handler = new DefaultDriverHandler(new DefaultDriverData(driver, deviceId));
return handler;
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
index b8899df..7bf5878 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
@@ -425,12 +425,12 @@
@Override
public void handleMessage(Dpid dpid, OFMessage msg) {
- OpenFlowSwitch sw = controller.getSwitch(dpid);
+ DeviceId deviceId = DeviceId.deviceId(Dpid.uri(dpid));
switch (msg.getType()) {
case FLOW_REMOVED:
OFFlowRemoved removed = (OFFlowRemoved) msg;
- FlowEntry fr = new FlowEntryBuilder(dpid, removed, driverService).build();
+ FlowEntry fr = new FlowEntryBuilder(deviceId, removed, driverService).build();
providerService.flowRemoved(fr);
if (adaptiveFlowSampling) {
@@ -481,7 +481,7 @@
InternalCacheEntry entry =
pendingBatches.getIfPresent(msg.getXid());
if (entry != null) {
- entry.appendFailure(new FlowEntryBuilder(dpid, fm, driverService).build());
+ entry.appendFailure(new FlowEntryBuilder(deviceId, fm, driverService).build());
} else {
log.error("No matching batch for this error: {}", error);
}
@@ -508,7 +508,7 @@
DeviceId did = DeviceId.deviceId(Dpid.uri(dpid));
List<FlowEntry> flowEntries = replies.getEntries().stream()
- .map(entry -> new FlowEntryBuilder(dpid, entry, driverService).build())
+ .map(entry -> new FlowEntryBuilder(did, entry, driverService).build())
.collect(Collectors.toList());
if (adaptiveFlowSampling) {