From 46936a40a5db820b867b1406a4ad3206ab48c747 Mon Sep 17 00:00:00 2001
From: Ryan Izard <rizard@g.clemson.edu>
Date: Tue, 30 Dec 2014 19:07:41 -0500
Subject: [PATCH] Last-minute SFP additions to catch some exceptions. Still
 have more to go, but they can wait, since it'd be from user error.

---
 .../StaticFlowEntryPusher.java                |  9 +++--
 .../util/InstructionUtils.java                | 36 +++++++++++++++++++
 2 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java b/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java
index 9153b1245..ded0cb5e3 100644
--- a/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java
+++ b/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java
@@ -64,6 +64,7 @@ import org.projectfloodlight.openflow.protocol.OFFlowRemovedReason;
 import org.projectfloodlight.openflow.protocol.OFPortDesc;
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.projectfloodlight.openflow.protocol.OFType;
+import org.projectfloodlight.openflow.protocol.OFVersion;
 import org.projectfloodlight.openflow.types.DatapathId;
 import org.projectfloodlight.openflow.types.TableId;
 import org.projectfloodlight.openflow.types.U16;
@@ -383,7 +384,11 @@ implements IOFSwitchListener, IFloodlightModule, IStaticFlowEntryPusherService,
 						return;
 					}
 				} else if (key.equals(COLUMN_TABLE_ID)) {
-					fmb.setTableId(TableId.of(Integer.parseInt((String) row.get(key)))); // support multiple flow tables for OF1.1+
+					if (fmb.getVersion().compareTo(OFVersion.OF_10) > 0) {
+						fmb.setTableId(TableId.of(Integer.parseInt((String) row.get(key)))); // support multiple flow tables for OF1.1+
+					} else {
+						log.error("Table not supported in OpenFlow 1.0");
+					}
 				} else if (key.equals(COLUMN_ACTIONS)) {
 					ActionUtils.fromString(fmb, (String) row.get(COLUMN_ACTIONS), log);
 				} else if (key.equals(COLUMN_COOKIE)) {
@@ -424,7 +429,7 @@ implements IOFSwitchListener, IFloodlightModule, IStaticFlowEntryPusherService,
 		try {
 			fmb.setMatch(MatchUtils.fromString(match, fmb.getVersion()));
 		} catch (IllegalArgumentException e) {
-			log.debug("ignoring flow entry {} on switch {} with illegal OFMatch() key: " + match, entryName, switchName);
+			log.debug("Ignoring flow entry {} on switch {} with illegal OFMatch() key: " + match, entryName, switchName);
 			return;
 		}
 //sanjivini		
diff --git a/src/main/java/net/floodlightcontroller/util/InstructionUtils.java b/src/main/java/net/floodlightcontroller/util/InstructionUtils.java
index 252aac8d9..68516510a 100644
--- a/src/main/java/net/floodlightcontroller/util/InstructionUtils.java
+++ b/src/main/java/net/floodlightcontroller/util/InstructionUtils.java
@@ -5,6 +5,7 @@ import java.util.List;
 
 import org.projectfloodlight.openflow.protocol.OFFactories;
 import org.projectfloodlight.openflow.protocol.OFFlowMod;
+import org.projectfloodlight.openflow.protocol.OFVersion;
 import org.projectfloodlight.openflow.protocol.instruction.OFInstruction;
 import org.projectfloodlight.openflow.protocol.instruction.OFInstructionApplyActions;
 import org.projectfloodlight.openflow.protocol.instruction.OFInstructionClearActions;
@@ -88,6 +89,12 @@ public class InstructionUtils {
 		if (instStr == null || instStr.equals("")) {
 			return;
 		}
+		
+		if (fmb.getVersion().compareTo(OFVersion.OF_11) < 0) {
+			log.error("Goto Table Instruction not supported in OpenFlow 1.0");
+			return;
+		}
+		
 		// Split into pairs of key=value
 		String[] keyValue = instStr.split("=");
 		if (keyValue.length != 2) {
@@ -129,6 +136,12 @@ public class InstructionUtils {
 		if (inst == null || inst.equals("")) {
 			return;
 		}
+		
+		if (fmb.getVersion().compareTo(OFVersion.OF_11) < 0) {
+			log.error("Write Metadata Instruction not supported in OpenFlow 1.0");
+			return;
+		}
+		
 		// Split into pairs of key=value
 		String[] tokens = inst.split(",");
 		if (tokens.length != 2) {
@@ -181,6 +194,12 @@ public class InstructionUtils {
 	 * @param log
 	 */
 	public static void writeActionsFromString(OFFlowMod.Builder fmb, String inst, Logger log) {
+		
+		if (fmb.getVersion().compareTo(OFVersion.OF_11) < 0) {
+			log.error("Write Actions Instruction not supported in OpenFlow 1.0");
+			return;
+		}
+		
 		OFFlowMod.Builder tmpFmb = OFFactories.getFactory(fmb.getVersion()).buildFlowModify(); // ActionUtils.fromString() will use setActions(), which should not be used for OF1.3; use temp to avoid overwriting any applyActions data
 		OFInstructionWriteActions.Builder ib = OFFactories.getFactory(fmb.getVersion()).instructions().buildWriteActions();
 		ActionUtils.fromString(tmpFmb, inst, log);
@@ -212,6 +231,12 @@ public class InstructionUtils {
 	 * @param log
 	 */
 	public static void applyActionsFromString(OFFlowMod.Builder fmb, String inst, Logger log) {
+		
+		if (fmb.getVersion().compareTo(OFVersion.OF_11) < 0) {
+			log.error("Apply Actions Instruction not supported in OpenFlow 1.0");
+			return;
+		}
+		
 		OFFlowMod.Builder tmpFmb = OFFactories.getFactory(fmb.getVersion()).buildFlowModify();
 		OFInstructionApplyActions.Builder ib = OFFactories.getFactory(fmb.getVersion()).instructions().buildApplyActions();
 		ActionUtils.fromString(tmpFmb, inst, log);
@@ -243,6 +268,12 @@ public class InstructionUtils {
 	 * @param log
 	 */
 	public static void clearActionsFromString(OFFlowMod.Builder fmb, String inst, Logger log) {
+		
+		if (fmb.getVersion().compareTo(OFVersion.OF_11) < 0) {
+			log.error("Clear Actions Instruction not supported in OpenFlow 1.0");
+			return;
+		}
+		
 		if (inst != null && inst.isEmpty()) {
 			OFInstructionClearActions i = OFFactories.getFactory(fmb.getVersion()).instructions().clearActions();
 			log.debug("Appending ClearActions instruction: {}", i);
@@ -279,6 +310,11 @@ public class InstructionUtils {
 		if (inst == null || inst.isEmpty()) {
 			return;
 		}
+		
+		if (fmb.getVersion().compareTo(OFVersion.OF_13) < 0) {
+			log.error("Goto Meter Instruction not supported in OpenFlow 1.0, 1.1, or 1.2");
+			return;
+		}
 
 		OFInstructionMeter.Builder ib = OFFactories.getFactory(fmb.getVersion()).instructions().buildMeter();
 
-- 
GitLab