blob: aaaac3b7646f3b5106baab0b2caca91af813f193 [file] [log] [blame]
Yotam Harchol4d634682013-09-26 13:21:06 -07001package org.projectfloodlight.openflow.types;
2
Sovietaced88e74ec2014-06-16 23:02:45 -07003import com.google.common.base.Preconditions;
4
Yotam Harchol4d634682013-09-26 13:21:06 -07005
6public abstract class IPAddressWithMask<F extends IPAddress<F>> extends Masked<F> {
7
8 protected IPAddressWithMask(F value, F mask) {
9 super(value, mask);
10 }
11
Yotam Harcholeb023dc2013-09-26 15:45:44 -070012 public abstract IPVersion getIpVersion();
Yotam Harchol4d634682013-09-26 13:21:06 -070013
Aditya Vaja98c96e72014-03-11 15:19:01 -070014 public F getSubnetBroadcastAddress() {
Aditya Vajab21043d2014-03-11 13:34:06 -070015 if (!mask.isCidrMask()) {
16 throw new IllegalArgumentException("Mask Invalid " + mask +
17 " cannot get subnet for non CIDR mask");
18 }
Aditya Vaja56b8b182014-03-11 13:13:58 -070019 return value.or(mask.not());
20 }
21
Aditya Vaja98c96e72014-03-11 15:19:01 -070022 public boolean isSubnetBroadcastAddress(F candidate) {
Aditya Vaja56b8b182014-03-11 13:13:58 -070023 return getSubnetBroadcastAddress().equals(candidate);
24 }
25
Yotam Harchol4d634682013-09-26 13:21:06 -070026 public static IPAddressWithMask<?> of(String ip) {
Sovietaced88e74ec2014-06-16 23:02:45 -070027 Preconditions.checkNotNull(ip, "string ip must not be null");
28
Yotam Harchol4d634682013-09-26 13:21:06 -070029 if (ip.indexOf('.') != -1)
30 return IPv4AddressWithMask.of(ip);
31 else if (ip.indexOf(':') != -1)
32 return IPv6AddressWithMask.of(ip);
33 else
34 throw new IllegalArgumentException("IP Address not well formed: " + ip);
35 }
36
Gregor Maier1ff55972013-12-11 02:22:56 -080037 @Override
Gregor Maier7f987e62013-12-10 19:34:18 -080038 public String toString() {
39 StringBuilder res = new StringBuilder();
40 res.append(value.toString());
41
42 res.append('/');
Gregor Maier5615b6c2013-12-11 22:29:07 -080043 if (mask.isCidrMask()) {
Gregor Maier7f987e62013-12-10 19:34:18 -080044 // CIDR notation
45 res.append(mask.asCidrMaskLength());
46 } else {
47 // Full address mask
48 res.append(mask.toString());
49 }
50
51 return res.toString();
52 }
53
Sovietaced88e74ec2014-06-16 23:02:45 -070054 public boolean contains(IPAddress<?> ip) {
55 Preconditions.checkNotNull(ip, "ip must not be null");
56
57 // Ensure mask and IP of the same version
58 if(getIpVersion() == ip.getIpVersion()) {
59 if(getIpVersion() == IPVersion.IPv4) {
60 IPv4AddressWithMask ipv4mask = (IPv4AddressWithMask) this;
61 IPv4Address ipv4 = (IPv4Address) ip;
62 return ipv4mask.matches(ipv4);
63 } else {
64 IPv6AddressWithMask ipv6mask = (IPv6AddressWithMask) this;
65 IPv6Address ipv6 = (IPv6Address) ip;
66 return ipv6mask.matches(ipv6);
67 }
68 }
69 return false;
70 }
71
Yotam Harchol4d634682013-09-26 13:21:06 -070072}