From 8f663452c3c03428b41186631922085bc094c589 Mon Sep 17 00:00:00 2001 From: Katelyn Kasperowicz Date: Fri, 20 Dec 2013 07:42:15 -0800 Subject: [PATCH] Update SubnetConfig Validation -SubnetConfig now validates that the address does not begin with 0 or 255 -Validates that host address is not set to all zeros or ones -Caught exception when subnet not set to number Change-Id: I825e2d54b48b7f74e35cfde8dc7e5967dac11684 Signed-off-by: Katelyn Kasperowicz --- .../switchmanager/SubnetConfig.java | 50 +++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SubnetConfig.java b/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SubnetConfig.java index 189476a5d1..4f06b79f49 100644 --- a/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SubnetConfig.java +++ b/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SubnetConfig.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -35,8 +34,8 @@ import org.opendaylight.controller.sal.utils.StatusCode; @XmlAccessorType(XmlAccessType.NONE) public class SubnetConfig implements Cloneable, Serializable { private static final long serialVersionUID = 1L; - private static final String prettyFields[] = { GUIField.NAME.toString(), - GUIField.GATEWAYIP.toString(), GUIField.NODEPORTS.toString() }; + private static final String prettyFields[] = { GUIField.NAME.toString(), GUIField.GATEWAYIP.toString(), + GUIField.NODEPORTS.toString() }; /** * Name of the subnet @@ -44,14 +43,13 @@ public class SubnetConfig implements Cloneable, Serializable { @XmlElement private String name; /** - * A.B.C.D/MM Where A.B.C.D is the Default - * Gateway IP (L3) or ARP Querier IP (L2) + * A.B.C.D/MM Where A.B.C.D is the Default Gateway IP (L3) or ARP Querier IP + * (L2) */ @XmlElement private String subnet; /** - * Set of node connectors in the format: - * Port Type|Port Id@Node Type|Node Id + * Set of node connectors in the format: Port Type|Port Id@Node Type|Node Id */ @XmlElement private List nodeConnectors; @@ -68,7 +66,8 @@ public class SubnetConfig implements Cloneable, Serializable { public SubnetConfig(SubnetConfig subnetConfig) { name = subnetConfig.name; subnet = subnetConfig.subnet; - nodeConnectors = (subnetConfig.nodeConnectors == null) ? null : new ArrayList(subnetConfig.nodeConnectors); + nodeConnectors = (subnetConfig.nodeConnectors == null) ? null : new ArrayList( + subnetConfig.nodeConnectors); } public String getName() { @@ -96,22 +95,43 @@ public class SubnetConfig implements Cloneable, Serializable { public Short getIPMaskLen() { Short maskLen = 0; String[] s = subnet.split("/"); - maskLen = (s.length == 2) ? Short.valueOf(s[1]) : 32; + + try { + maskLen = (s.length == 2) ? Short.valueOf(s[1]) : 32; + } catch (NumberFormatException e) { + maskLen = 32; + } return maskLen; } private Status validateSubnetAddress() { if (!NetUtils.isIPAddressValid(subnet)) { - return new Status(StatusCode.BADREQUEST, String.format("Invalid Subnet configuration: Invalid address: %s", subnet)); + return new Status(StatusCode.BADREQUEST, String.format("Invalid Subnet configuration: Invalid address: %s", + subnet)); + } + if ((this.getIPMaskLen() == 0) || (this.getIPMaskLen() == 32)) { + return new Status(StatusCode.BADREQUEST, String.format("Invalid Subnet configuration: Invalid mask: /%s", + this.getIPMaskLen())); } - if((this.getIPMaskLen() == 0) || (this.getIPMaskLen() == 32)) { - return new Status(StatusCode.BADREQUEST, String.format("Invalid Subnet configuration: Invalid mask: /%s", this.getIPMaskLen())); + + //checks that address doesn't start with 0 or 255 + String address = subnet.split("/")[0]; + if (address.startsWith("0.") || address.startsWith("255.")) { + return new Status(StatusCode.BADREQUEST, String.format("Invalid Subnet configuration: Invalid address: %s", address)); } + byte[] bytePrefix = NetUtils.getSubnetPrefix(this.getIPAddress(), this.getIPMaskLen()).getAddress(); long prefix = BitBufferHelper.getLong(bytePrefix); if (prefix == 0) { return new Status(StatusCode.BADREQUEST, "Invalid network source address: subnet zero"); } + + //check that host is not set to all 0's or 1's + long hostAddress = BitBufferHelper.getLong(this.getIPAddress().getAddress()) - prefix; + if (hostAddress == 0 || hostAddress == Math.pow(2, 32-this.getIPMaskLen()) - 1) { + return new Status(StatusCode.BADREQUEST, String.format("Invalid subnet gateway address: /%s", subnet)); + } + return new Status(StatusCode.SUCCESS); } @@ -158,7 +178,8 @@ public class SubnetConfig implements Cloneable, Serializable { } public boolean isGlobal() { - // If no ports are specified to be part of the domain, then it's a global domain IP + // If no ports are specified to be part of the domain, then it's a + // global domain IP return (nodeConnectors == null || nodeConnectors.isEmpty()); } @@ -180,8 +201,7 @@ public class SubnetConfig implements Cloneable, Serializable { @Override public String toString() { - return ("SubnetConfig [Name=" + name + ", Subnet=" + subnet - + ", NodeConnectors=" + nodeConnectors + "]"); + return ("SubnetConfig [Name=" + name + ", Subnet=" + subnet + ", NodeConnectors=" + nodeConnectors + "]"); } /** -- 2.36.6