blob: 6bd553970a97a43ebc18eb51f60bc4e718fac35a [file] [log] [blame]
Yotam Harcholf3f11152013-09-05 16:47:16 -07001package org.projectfloodlight.openflow.types;
2
Ronald Liaf8d3e72014-07-05 01:26:28 -07003import javax.annotation.Nonnull;
4
Sovietaced9dfc1ef2014-06-27 11:13:57 -07005import com.google.common.base.Preconditions;
6
Yotam Harchol4d634682013-09-26 13:21:06 -07007
8public class IPv4AddressWithMask extends IPAddressWithMask<IPv4Address> {
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -07009 public final static IPv4AddressWithMask NONE = of(IPv4Address.NONE, IPv4Address.NONE);
Yotam Harcholf3f11152013-09-05 16:47:16 -070010
Yotam Harchol9a617aa2013-09-16 14:10:17 -070011 private IPv4AddressWithMask(int rawValue, int rawMask) {
Yotam Harchola289d552013-09-16 10:10:40 -070012 super(IPv4Address.of(rawValue), IPv4Address.of(rawMask));
Yotam Harcholf3f11152013-09-05 16:47:16 -070013 }
Yotam Harchol9a617aa2013-09-16 14:10:17 -070014
15 private IPv4AddressWithMask(IPv4Address value, IPv4Address mask) {
Yotam Harcholf3f11152013-09-05 16:47:16 -070016 super(value, mask);
17 }
Yotam Harchol9a617aa2013-09-16 14:10:17 -070018
Yotam Harchol4d634682013-09-26 13:21:06 -070019 @Override
Yotam Harcholeb023dc2013-09-26 15:45:44 -070020 public IPVersion getIpVersion() {
21 return IPVersion.IPv4;
Yotam Harchol4d634682013-09-26 13:21:06 -070022 }
23
Ronald Liaf8d3e72014-07-05 01:26:28 -070024 /**
25 * Returns an {@code IPv4AddressWithMask} object that represents the given
Ronald Li382589f2014-07-06 23:58:08 -070026 * raw IP address masked by the given raw IP address mask.
Ronald Liaf8d3e72014-07-05 01:26:28 -070027 *
28 * @param rawValue the raw IP address to be masked
29 * @param rawMask the raw IP address mask
30 * @return an {@code IPv4AddressWithMask} object that represents
31 * the given raw IP address masked by the given raw IP
32 * address mask
Ronald Li8a0b53c2014-07-05 02:33:43 -070033 * @deprecated replaced by {@link IPv4Address#of(int)} followed by
34 * {@link IPv4Address#withMask(int)}
Ronald Liaf8d3e72014-07-05 01:26:28 -070035 */
36 @Nonnull
Ronald Li8a0b53c2014-07-05 02:33:43 -070037 @Deprecated
Ronald Liaf8d3e72014-07-05 01:26:28 -070038 public static IPv4AddressWithMask of(final int rawValue, final int rawMask) {
Yotam Harchol9a617aa2013-09-16 14:10:17 -070039 return new IPv4AddressWithMask(rawValue, rawMask);
Yotam Harcholf3f11152013-09-05 16:47:16 -070040 }
Yotam Harchol9a617aa2013-09-16 14:10:17 -070041
Ronald Liaf8d3e72014-07-05 01:26:28 -070042 /**
43 * Returns an {@code IPv4AddressWithMask} object that represents the given
Ronald Li382589f2014-07-06 23:58:08 -070044 * IP address masked by the given IP address mask. Both arguments are given
Ronald Liaf8d3e72014-07-05 01:26:28 -070045 * as {@code IPv4Address} objects.
46 *
47 * @param value the IP address to be masked
48 * @param mask the IP address mask
49 * @return an {@code IPv4AddressWithMask} object that represents
50 * the given IP address masked by the given IP address mask
51 * @throws NullPointerException if any of the given {@code IPv4Address}
52 * objects were {@code null}
53 */
54 @Nonnull
55 public static IPv4AddressWithMask of(
56 @Nonnull final IPv4Address value,
57 @Nonnull final IPv4Address mask) {
Sovietaced9dfc1ef2014-06-27 11:13:57 -070058 Preconditions.checkNotNull(value, "value must not be null");
59 Preconditions.checkNotNull(mask, "mask must not be null");
60
Yotam Harchol9a617aa2013-09-16 14:10:17 -070061 return new IPv4AddressWithMask(value, mask);
Yotam Harcholf3f11152013-09-05 16:47:16 -070062 }
Yotam Harchol9a617aa2013-09-16 14:10:17 -070063
Ronald Liaf8d3e72014-07-05 01:26:28 -070064 /**
65 * Returns an {@code IPv4AddressWithMask} object that corresponds to
Ronald Li382589f2014-07-06 23:58:08 -070066 * the given string in CIDR notation or other acceptable notations.
Ronald Liaf8d3e72014-07-05 01:26:28 -070067 * <p>
68 * The following notations are accepted.
69 * <table><tr>
70 * <th>Notation</th><th>Example</th><th>Notes</th>
71 * </tr><tr>
72 * <td>IPv4 address only</td><td>{@code 1.2.3.4}</td><td>The subnet mask of
73 * prefix length 32 (i.e. {@code 255.255.255.255}) is assumed.</td>
74 * </tr><tr>
75 * <td>IPv4 address/mask</td><td>{@code 1.2.3.4/255.255.255.0}</td>
76 * </tr><tr>
77 * <td>CIDR notation</td><td>{@code 1.2.3.4/24}</td>
78 * </tr></table>
79 *
80 * @param string the string in acceptable notations
81 * @return an {@code IPv4AddressWithMask} object that corresponds to
82 * the given string in acceptable notations
83 * @throws NullPointerException if the given string was {@code null}
84 * @throws IllegalArgumentException if the given string was malformed
85 */
86 @Nonnull
87 public static IPv4AddressWithMask of(@Nonnull final String string) {
Sovietaced9dfc1ef2014-06-27 11:13:57 -070088 Preconditions.checkNotNull(string, "string must not be null");
89
Yotam Harcholf3f11152013-09-05 16:47:16 -070090 int slashPos;
91 String ip = string;
Ronald Lia780c372014-07-03 17:34:50 -070092 int cidrMaskLength = 32;
Yotam Harchola289d552013-09-16 10:10:40 -070093 IPv4Address maskAddress = null;
Yotam Harcholf3f11152013-09-05 16:47:16 -070094
95 // Read mask suffix
96 if ((slashPos = string.indexOf('/')) != -1) {
97 ip = string.substring(0, slashPos);
98 try {
99 String suffix = string.substring(slashPos + 1);
100 if (suffix.length() == 0)
101 throw new IllegalArgumentException("IP Address not well formed: " + string);
102 if (suffix.indexOf('.') != -1) {
103 // Full mask
Yotam Harchola289d552013-09-16 10:10:40 -0700104 maskAddress = IPv4Address.of(suffix);
Yotam Harcholf3f11152013-09-05 16:47:16 -0700105 } else {
106 // CIDR Suffix
Ronald Lia780c372014-07-03 17:34:50 -0700107 cidrMaskLength = Integer.parseInt(suffix);
Yotam Harcholf3f11152013-09-05 16:47:16 -0700108 }
109 } catch (NumberFormatException e) {
110 throw new IllegalArgumentException("IP Address not well formed: " + string);
111 }
Yotam Harcholf3f11152013-09-05 16:47:16 -0700112 }
Yotam Harchol9a617aa2013-09-16 14:10:17 -0700113
Yotam Harcholf3f11152013-09-05 16:47:16 -0700114 // Read IP
Yotam Harchola289d552013-09-16 10:10:40 -0700115 IPv4Address ipv4 = IPv4Address.of(ip);
Yotam Harchol9a617aa2013-09-16 14:10:17 -0700116
Yotam Harcholf3f11152013-09-05 16:47:16 -0700117 if (maskAddress != null) {
118 // Full address mask
Yotam Harchol9a617aa2013-09-16 14:10:17 -0700119 return IPv4AddressWithMask.of(ipv4, maskAddress);
Yotam Harcholf3f11152013-09-05 16:47:16 -0700120 } else {
Ronald Lia780c372014-07-03 17:34:50 -0700121 return IPv4AddressWithMask.of(
122 ipv4, IPv4Address.ofCidrMaskLength(cidrMaskLength));
Yotam Harcholf3f11152013-09-05 16:47:16 -0700123 }
124 }
Sovietaced77d99492014-06-24 12:58:47 -0700125
Sovietaced07cc8eb2014-06-24 11:55:26 -0700126 @Override
127 public boolean contains(IPAddress<?> ip) {
Sovietaced9dfc1ef2014-06-27 11:13:57 -0700128 Preconditions.checkNotNull(ip, "ip must not be null");
Sovietaced77d99492014-06-24 12:58:47 -0700129
130 if(ip.getIpVersion() == IPVersion.IPv4) {
131 IPv4Address ipv4 = (IPv4Address) ip;
132 return this.matches(ipv4);
133 }
134
135 return false;
Sovietaced07cc8eb2014-06-24 11:55:26 -0700136 }
Yotam Harcholf3f11152013-09-05 16:47:16 -0700137}