Do not send table stats request if unsupported

Change-Id: Ia66447aad1eeb0a01577215e4c5985526dadd274
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 a67a4e3..f3e32ab 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 @@
 
 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;
@@ -81,6 +82,14 @@
     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 0ec8071..24a51b6 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
@@ -528,6 +528,11 @@
     }
 
     @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 47c49bc..ef013b59 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.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 @@
             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) {