From 50a63ba6f7fac575419e9d9aca0a593b36b36269 Mon Sep 17 00:00:00 2001 From: Diti Bhatia Date: Wed, 18 Sep 2013 19:06:08 -0700 Subject: [PATCH] Added validation for protocol field while adding flow Signed-off-by: Diti Bhatia Change-Id: Iac1a49ce0b3fa576ba07ea48b2afe978d6ced661 --- .../forwardingrulesmanager/FlowConfig.java | 12 ++++++++++++ .../controller/sal/utils/IPProtocols.java | 18 ++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java index ba69c8a3d2..62d6855e10 100644 --- a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java +++ b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java @@ -655,6 +655,14 @@ public class FlowConfig implements Serializable { return ((to >= 0) && (to <= 0xffff)); } + public boolean isProtocolValid(String protocol) { + int protocol_number = IPProtocols.getProtocolNumberInt(protocol); + if (protocol_number < 1 || protocol_number > 255) { + return false; + } + return true; + } + private Status conflictWithContainerFlow(IContainer container) { // Return true if it's default container if (container.getName().equals(GlobalConstants.DEFAULT.toString())) { @@ -762,6 +770,10 @@ public class FlowConfig implements Serializable { } } + if ((protocol != null) && !isProtocolValid(protocol)) { + return new Status(StatusCode.BADREQUEST, String.format("Protocol %s is not valid", protocol)); + } + if ((tosBits != null) && !isTOSBitsValid(tosBits)) { return new Status(StatusCode.BADREQUEST, String.format("IP ToS bits %s is not in the range 0 - 63", tosBits)); diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/utils/IPProtocols.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/utils/IPProtocols.java index cdb4463c02..66e6e65706 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/utils/IPProtocols.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/utils/IPProtocols.java @@ -168,7 +168,8 @@ public enum IPProtocols { WESP("WESP",141), ROHC("ROHC",142); */ - private static final String regexNumberString = "^[0-9]+$"; + private static final String regexDecimalString = "^[0-9]{3}$"; + private static final String regexHexString = "^(0(x|X))[0-9a-fA-F]{2}$"; private String protocolName; private int protocolNumber; @@ -215,7 +216,10 @@ public enum IPProtocols { } public static short getProtocolNumberShort(String name) { - if (name.matches(regexNumberString)) { + if (name.matches(regexHexString)) { + return Short.valueOf(Short.decode(name)); + } + if (name.matches(regexDecimalString)) { return Short.valueOf(name); } for (IPProtocols proto : IPProtocols.values()) { @@ -227,7 +231,10 @@ public enum IPProtocols { } public static int getProtocolNumberInt(String name) { - if (name.matches(regexNumberString)) { + if (name.matches(regexHexString)) { + return Integer.valueOf(Integer.decode(name)); + } + if (name.matches(regexDecimalString)) { return Integer.valueOf(name); } for (IPProtocols proto : IPProtocols.values()) { @@ -239,7 +246,10 @@ public enum IPProtocols { } public static byte getProtocolNumberByte(String name) { - if (name.matches(regexNumberString)) { + if (name.matches(regexHexString)) { + return Integer.valueOf(Integer.decode(name)).byteValue(); + } + if (name.matches(regexDecimalString)) { return Integer.valueOf(name).byteValue(); } for (IPProtocols proto : IPProtocols.values()) { -- 2.36.6