From 169b299824c47edc0c842b162bbd986ad50bf788 Mon Sep 17 00:00:00 2001
From: Ryan Izard <rizard@g.clemson.edu>
Date: Sun, 21 Dec 2014 16:07:56 -0500
Subject: [PATCH] more

---
 .../core/web/SwitchResourceBase.java          | 79 ++++++++++++-------
 .../web/serializers/OFFlowModSerializer.java  |  4 +-
 .../web/serializers/StatsReplySerializer.java |  7 +-
 .../resources/web/js/models/switchmodel.js    |  7 ++
 4 files changed, 62 insertions(+), 35 deletions(-)

diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
index bd146a72b..358d73717 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
@@ -35,6 +35,7 @@ import org.projectfloodlight.openflow.protocol.OFFeaturesRequest;
 import org.projectfloodlight.openflow.protocol.OFStatsReply;
 import org.projectfloodlight.openflow.protocol.OFStatsRequest;
 import org.projectfloodlight.openflow.protocol.OFStatsType;
+import org.projectfloodlight.openflow.protocol.OFVersion;
 import org.restlet.resource.ResourceException;
 import org.restlet.resource.ServerResource;
 import org.slf4j.Logger;
@@ -119,50 +120,68 @@ public class SwitchResourceBase extends ServerResource {
 				req = sw.getOFFactory().buildDescStatsRequest()
 				.build();
 				break;
-            case GROUP:
-				req = sw.getOFFactory().buildGroupStatsRequest()				
-				.build();
+			case GROUP:
+				if (sw.getOFFactory().getVersion().compareTo(OFVersion.OF_10) > 0) {
+					req = sw.getOFFactory().buildGroupStatsRequest()				
+							.build();
+				}
 				break;
-				
+
 			case METER:
-				req = sw.getOFFactory().buildMeterStatsRequest()
-				.setMeterId(OFMeterSerializerVer13.ALL_VAL)
-				.build();
+				if (sw.getOFFactory().getVersion().compareTo(OFVersion.OF_13) >= 0) {
+					req = sw.getOFFactory().buildMeterStatsRequest()
+							.setMeterId(OFMeterSerializerVer13.ALL_VAL)
+							.build();
+				}
 				break;
-				
-			case GROUP_DESC:				
-				req = sw.getOFFactory().buildGroupDescStatsRequest()			
-						.build();
+
+			case GROUP_DESC:			
+				if (sw.getOFFactory().getVersion().compareTo(OFVersion.OF_10) > 0) {
+					req = sw.getOFFactory().buildGroupDescStatsRequest()			
+							.build();
+				}
 				break;
-				
+
 			case GROUP_FEATURES:
-				req = sw.getOFFactory().buildGroupFeaturesStatsRequest()
-						.build();
+				if (sw.getOFFactory().getVersion().compareTo(OFVersion.OF_10) > 0) {
+					req = sw.getOFFactory().buildGroupFeaturesStatsRequest()
+							.build();
+				}
 				break;
-				
+
 			case METER_CONFIG:
-				req = sw.getOFFactory().buildMeterConfigStatsRequest()
-						.build();
+				if (sw.getOFFactory().getVersion().compareTo(OFVersion.OF_13) >= 0) {
+					req = sw.getOFFactory().buildMeterConfigStatsRequest()
+							.build();
+				}
 				break;
-				
+
 			case METER_FEATURES:
-				req = sw.getOFFactory().buildMeterFeaturesStatsRequest()
-						.build();
+				if (sw.getOFFactory().getVersion().compareTo(OFVersion.OF_13) >= 0) {
+					req = sw.getOFFactory().buildMeterFeaturesStatsRequest()
+							.build();
+				}
 				break;
-			
+
 			case TABLE:
-				req = sw.getOFFactory().buildTableStatsRequest()
-						.build();
+				if (sw.getOFFactory().getVersion().compareTo(OFVersion.OF_10) > 0) {
+					req = sw.getOFFactory().buildTableStatsRequest()
+							.build();
+				}
 				break;
-				
-			case TABLE_FEATURES:				
-				req = sw.getOFFactory().buildTableFeaturesStatsRequest()
-						.build();				
+
+			case TABLE_FEATURES:	
+				if (sw.getOFFactory().getVersion().compareTo(OFVersion.OF_10) > 0) {
+					req = sw.getOFFactory().buildTableFeaturesStatsRequest()
+							.build();		
+				}
 				break;
 			case PORT_DESC:
-				req = sw.getOFFactory().buildPortDescStatsRequest()
-				.build();
-                             break;
+				if (sw.getOFFactory().getVersion().compareTo(OFVersion.OF_13) >= 0) {
+					req = sw.getOFFactory().buildPortDescStatsRequest()
+							.build();
+				}
+				break;
 			case EXPERIMENTER: //TODO @Ryan support new OF1.1+ stats types			
 			default:
 				log.error("Stats Request Type {} not implemented yet", statType.name());
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/OFFlowModSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/OFFlowModSerializer.java
index a0ebe5b00..42d9afa8f 100644
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/OFFlowModSerializer.java
+++ b/src/main/java/net/floodlightcontroller/core/web/serializers/OFFlowModSerializer.java
@@ -27,7 +27,6 @@ import com.fasterxml.jackson.databind.SerializerProvider;
 
 import org.projectfloodlight.openflow.protocol.OFFlowMod;
 import org.projectfloodlight.openflow.protocol.OFVersion;
-import org.projectfloodlight.openflow.protocol.ver10.OFFlowModFlagsSerializerVer10;
 import org.projectfloodlight.openflow.protocol.ver11.OFFlowModFlagsSerializerVer11;
 import org.projectfloodlight.openflow.protocol.ver12.OFFlowModFlagsSerializerVer12;
 import org.projectfloodlight.openflow.protocol.ver13.OFFlowModFlagsSerializerVer13;
@@ -70,7 +69,6 @@ public class OFFlowModSerializer extends JsonSerializer<OFFlowMod> {
 
 		switch (flowMod.getVersion()) {
 		case OF_10:
-			jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer10.toWireValue(flowMod.getFlags()));
 			break;
 		case OF_11:
 			jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer11.toWireValue(flowMod.getFlags()));
@@ -93,7 +91,9 @@ public class OFFlowModSerializer extends JsonSerializer<OFFlowMod> {
 
 		// handle OF1.1+ instructions with actions within
 		if (flowMod.getVersion() == OFVersion.OF_10) {
+			jGen.writeObjectFieldStart("actions");
 			OFActionListSerializer.serializeActions(jGen, flowMod.getActions());
+			jGen.writeEndObject();
 		} else {
 			OFInstructionListSerializer.serializeInstructionList(jGen, flowMod.getInstructions());
 		} // end not-empty instructions (else)
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/StatsReplySerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/StatsReplySerializer.java
index b7a34c277..9bc3bcb4b 100644
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/StatsReplySerializer.java
+++ b/src/main/java/net/floodlightcontroller/core/web/serializers/StatsReplySerializer.java
@@ -85,7 +85,6 @@ import org.projectfloodlight.openflow.protocol.ver12.OFFlowModFlagsSerializerVer
 import org.projectfloodlight.openflow.protocol.ver12.OFPortFeaturesSerializerVer12;
 import org.projectfloodlight.openflow.protocol.ver11.OFFlowModFlagsSerializerVer11;
 import org.projectfloodlight.openflow.protocol.ver11.OFPortFeaturesSerializerVer11;
-import org.projectfloodlight.openflow.protocol.ver10.OFFlowModFlagsSerializerVer10;
 import org.projectfloodlight.openflow.protocol.ver10.OFPortFeaturesSerializerVer10;
 import org.projectfloodlight.openflow.protocol.ver13.OFPortStateSerializerVer13;
 import org.projectfloodlight.openflow.protocol.ver12.OFPortStateSerializerVer12;
@@ -741,7 +740,7 @@ public class StatsReplySerializer extends JsonSerializer<StatsReply> {
                 jGen.writeNumberField("hardTimeoutSec", entry.getHardTimeout());
                 switch (entry.getVersion()) {
                 	case OF_10:
-                		jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer10.toWireValue(entry.getFlags()));
+                		// flags not supported
                 		break;
                 	case OF_11:
                 		jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer11.toWireValue(entry.getFlags()));
@@ -764,7 +763,9 @@ public class StatsReplySerializer extends JsonSerializer<StatsReply> {
 
                 // handle OF1.1+ instructions with actions within
                 if (entry.getVersion() == OFVersion.OF_10) {
+                	jGen.writeObjectFieldStart("actions");
                 	OFActionListSerializer.serializeActions(jGen, entry.getActions());
+                	jGen.writeEndObject();
                 } else {
                    OFInstructionListSerializer.serializeInstructionList(jGen, entry.getInstructions());
                 }
@@ -776,7 +777,7 @@ public class StatsReplySerializer extends JsonSerializer<StatsReply> {
     } // end method
 
     public static void serializeDescReply(List<OFDescStatsReply> descReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
-        OFDescStatsReply descReply = descReplies.get(0); // There are only one descReply from the switch
+        OFDescStatsReply descReply = descReplies.get(0); // There is only one descReply from the switch
         jGen.writeObjectFieldStart("desc"); 
         jGen.writeStringField("version", descReply.getVersion().toString()); //return the enum name
         jGen.writeStringField("manufacturerDescription", descReply.getMfrDesc()); 
diff --git a/src/main/resources/web/js/models/switchmodel.js b/src/main/resources/web/js/models/switchmodel.js
index cb1452064..bbeabf80d 100644
--- a/src/main/resources/web/js/models/switchmodel.js
+++ b/src/main/resources/web/js/models/switchmodel.js
@@ -21,6 +21,7 @@ window.Switch = Backbone.Model.extend({
                                       hardwareDescription: '',
                                       manufacturerDescription: '',
                                       serialNumber: '',
+                                      version: '',
                                       softwareDescription: '',
                                       flowCount: ' ',
                                       packetCount: ' ',
@@ -237,6 +238,12 @@ window.Switch = Backbone.Model.extend({
                                                            },f);
                                                     } else {
                                                         f.applyActionText = "----";
+                                                        f.writeActionText = "n/a "; // need extra space at end
+                                                        f.clearActionText = "n/a";
+                                                        f.writeMetadataText = "n/a";
+                                                        f.gotoGroupText = "n/a";
+                                                        f.gotoMeterText = "n/a";
+                                                        f.experimenterText = "n/a";
                                                     }
                                                     
                                                     // build human-readable instrucions
-- 
GitLab