Required changes to support OF1.4, 1.5.
- OVS with OF1.4 passed `stc smoke` test
- OVS with OF1.5 still has issue
As of OVS 2.5.0, OF1.5 mode responds with ill-formed of_meter_features_stats_reply
org.projectfloodlight.openflow.exceptions.OFParseError: Wrong length: Expected=40(40), got=32
at org.projectfloodlight.openflow.protocol.ver15.OFMeterFeaturesStatsReplyVer15$Reader.readFrom(OFMeterFeaturesStatsReplyVer15.java:281)
Change-Id: Ib78b9d92ecfb4bb667e24c4ee95bcd09aec160a6
diff --git a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
index 5e0fae4..2b003d1 100644
--- a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
+++ b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
@@ -327,6 +327,8 @@
sw.sendMsg(fact.buildFeaturesRequest().setXid(0).build());
break;
case OF_13:
+ case OF_14:
+ case OF_15:
sw.sendMsg(fact.buildPortDescStatsRequest().setXid(0).build());
break;
default:
@@ -977,11 +979,13 @@
if (status.getReason() != OFPortReason.DELETE) {
return buildPortDescription(port);
} else {
- PortNumber portNo = PortNumber.portNumber(port.getPortNo().getPortNumber());
- Port.Type type = port.getCurr().contains(OFPortFeatures.PF_FIBER) ? FIBER : COPPER;
- SparseAnnotations annotations = makePortAnnotation(port.getName(), port.getHwAddr().toString()).build();
- return new DefaultPortDescription(portNo, false, true, type,
- portSpeed(port), annotations);
+ PortDescription desc = buildPortDescription(port);
+ if (desc.isEnabled()) {
+ return DefaultPortDescription.builder(desc)
+ .isEnabled(false)
+ .build();
+ }
+ return desc;
}
}
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
index 6ed4cca..921ed93 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
@@ -134,6 +134,7 @@
return new FlowModBuilderVer10(flowRule, factory, xid, driverService);
case OF_13:
case OF_14:
+ case OF_15:
return new FlowModBuilderVer13(flowRule, factory, xid, driverService);
default:
throw new UnsupportedOperationException(
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java
index 9fa03be..da30eea 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java
@@ -53,6 +53,7 @@
import org.projectfloodlight.openflow.protocol.OFFlowRemoved;
import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry;
import org.projectfloodlight.openflow.protocol.OFMatchV3;
+import org.projectfloodlight.openflow.protocol.OFObject;
import org.projectfloodlight.openflow.protocol.OFVersion;
import org.projectfloodlight.openflow.protocol.action.OFAction;
import org.projectfloodlight.openflow.protocol.action.OFActionCircuit;
@@ -268,6 +269,8 @@
case OF_11:
case OF_12:
case OF_13:
+ case OF_14:
+ case OF_15:
return entry.getInstructions();
default:
log.warn("Unknown OF version {}", entry.getVersion());
@@ -283,6 +286,8 @@
case OF_11:
case OF_12:
case OF_13:
+ case OF_14:
+ case OF_15:
return entry.getInstructions();
default:
log.warn("Unknown OF version {}", entry.getVersion());
@@ -743,7 +748,7 @@
case VLAN_VID:
if (selectorInterpreter != null &&
selectorInterpreter.supported(ExtensionSelectorTypes.OFDPA_MATCH_VLAN_VID.type())) {
- if (match.getVersion().equals(OFVersion.OF_13)) {
+ if (isOF13OrLater(match)) {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.VLAN_VID);
builder.extension(selectorInterpreter.mapOxm(oxm),
deviceId);
@@ -1079,7 +1084,7 @@
case OFDPA_OVID:
if (selectorInterpreter != null &&
selectorInterpreter.supported(ExtensionSelectorTypes.OFDPA_MATCH_OVID.type())) {
- if (match.getVersion().equals(OFVersion.OF_13)) {
+ if (isOF13OrLater(match)) {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.OFDPA_OVID);
builder.extension(selectorInterpreter.mapOxm(oxm),
deviceId);
@@ -1091,7 +1096,7 @@
case OFDPA_MPLS_L2_PORT:
if (selectorInterpreter != null &&
selectorInterpreter.supported(ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type())) {
- if (match.getVersion().equals(OFVersion.OF_13)) {
+ if (isOF13OrLater(match)) {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.OFDPA_MPLS_L2_PORT);
builder.extension(selectorInterpreter.mapOxm(oxm),
deviceId);
@@ -1108,6 +1113,14 @@
return builder.build();
}
+ /**
+ * @param obj OpenFlow object to test
+ * @return true if OFObject is OF_13 or later
+ */
+ private static boolean isOF13OrLater(OFObject obj) {
+ return obj.getVersion().wireVersion >= OFVersion.OF_13.wireVersion;
+ }
+
private DriverHandler getDriver(DeviceId devId) {
Driver driver = driverService.getDriver(devId);
DriverHandler handler = new DefaultDriverHandler(new DefaultDriverData(driver, devId));