diff --git a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java index a67a4e3132..f3e32abe4f 100644 --- a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java +++ b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java @@ -17,6 +17,7 @@ package org.onosproject.openflow.controller; import org.onosproject.net.Device; import org.projectfloodlight.openflow.protocol.OFFactory; +import org.projectfloodlight.openflow.protocol.OFFeaturesReply; import org.projectfloodlight.openflow.protocol.OFMessage; import org.projectfloodlight.openflow.protocol.OFMeterFeatures; import org.projectfloodlight.openflow.protocol.OFPortDesc; @@ -80,6 +81,14 @@ public interface OpenFlowSwitch { */ OFMeterFeatures getMeterFeatures(); + /** + * Fetches the features of this switch. + * @return unmodifiable features + */ + default OFFeaturesReply features() { + return null; + } + /** * Provides the factory for this OF version. * @return OF version specific factory. diff --git a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java index 0ec80712a1..24a51b638a 100644 --- a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java +++ b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java @@ -527,6 +527,11 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour } } + @Override + public OFFeaturesReply features() { + return this.features; + } + @Override public String manufacturerDescription() { return this.desc.getMfrDesc(); 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 47c49bc761..ef013b594a 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 @@ -66,6 +66,7 @@ import org.onosproject.provider.of.flow.util.FlowEntryBuilder; import org.osgi.service.component.ComponentContext; import org.projectfloodlight.openflow.protocol.OFBadRequestCode; import org.projectfloodlight.openflow.protocol.OFBarrierRequest; +import org.projectfloodlight.openflow.protocol.OFCapabilities; import org.projectfloodlight.openflow.protocol.OFErrorMsg; import org.projectfloodlight.openflow.protocol.OFFlowLightweightStatsReply; import org.projectfloodlight.openflow.protocol.OFFlowMod; @@ -253,9 +254,11 @@ public class OpenFlowRuleProvider extends AbstractProvider stopCollectorIfNeeded(simpleCollectors.put(new Dpid(sw.getId()), fsc)); fsc.start(); } - TableStatisticsCollector tsc = new TableStatisticsCollector(timer, sw, flowPollFrequency); - stopCollectorIfNeeded(tableStatsCollectors.put(new Dpid(sw.getId()), tsc)); - tsc.start(); + if (sw.features().getCapabilities().contains(OFCapabilities.TABLE_STATS)) { + TableStatisticsCollector tsc = new TableStatisticsCollector(timer, sw, flowPollFrequency); + stopCollectorIfNeeded(tableStatsCollectors.put(new Dpid(sw.getId()), tsc)); + tsc.start(); + } } private void stopCollectorIfNeeded(SwitchDataCollector collector) {