blob: afdfddee9fd44cfa8b84117f80600bcdc80a0635 [file] [log] [blame]
Pavlin Radoslavov276cd902014-10-24 16:28:01 -07001package org.onlab.onos.net.host;
2
3import java.util.Objects;
4import org.onlab.packet.IpAddress;
5import org.onlab.packet.IpPrefix;
6
7import static com.google.common.base.MoreObjects.toStringHelper;
8import static com.google.common.base.Preconditions.checkNotNull;
9
10/**
11 * Represents a single IP address information on an interface.
12 *
13 * TODO:
14 * - Add computation for the default broadcast address if it is not
15 * specified
16 * - Add explicit checks that each IP address or prefix belong to the
17 * same IP version: IPv4/IPv6.
18 * - Inside the copy constructor we should use copy constructors for each
19 * field
20 */
21public class InterfaceIpAddress {
22 private final IpAddress ipAddress;
23 private final IpPrefix subnetAddress;
24 private final IpAddress broadcastAddress;
25 private final IpAddress peerAddress;
26
27 /**
28 * Copy constructor.
29 *
30 * @param other the object to copy from
31 */
32 public InterfaceIpAddress(InterfaceIpAddress other) {
33 // TODO: we should use copy constructors for each field
34 this.ipAddress = other.ipAddress;
35 this.subnetAddress = other.subnetAddress;
36 this.broadcastAddress = other.broadcastAddress;
37 this.peerAddress = other.peerAddress;
38 }
39
40 /**
41 * Constructor for a given IP address and a subnet address.
42 *
43 * @param ipAddress the IP address
44 * @param subnetAddress the IP subnet address
45 */
46 public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress) {
47 this.ipAddress = checkNotNull(ipAddress);
48 this.subnetAddress = checkNotNull(subnetAddress);
49 // TODO: Recompute the default broadcast address from the subnet
50 // address
51 this.broadcastAddress = null;
52 this.peerAddress = null;
53 }
54
55 /**
56 * Constructor for a given IP address and a subnet address.
57 *
58 * @param ipAddress the IP address
59 * @param subnetAddress the IP subnet address
60 * @param broadcastAddress the IP broadcast address. It can be used
61 * to specify non-default broadcast address
62 */
63 public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress,
64 IpAddress broadcastAddress) {
65 this.ipAddress = checkNotNull(ipAddress);
66 this.subnetAddress = checkNotNull(subnetAddress);
67 this.broadcastAddress = broadcastAddress;
68 this.peerAddress = null;
69 }
70
71 /**
72 * Constructor for a given IP address and a subnet address.
73 *
74 * @param ipAddress the IP address
75 * @param subnetAddress the IP subnet address
76 * @param broadcastAddress the IP broadcast address. It can be used
77 * to specify non-default broadcast address. It should be null for
78 * point-to-point interfaces with a peer address
79 * @param peerAddress the peer IP address for point-to-point interfaces
80 */
81 public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress,
82 IpAddress broadcastAddress,
83 IpAddress peerAddress) {
84 this.ipAddress = checkNotNull(ipAddress);
85 this.subnetAddress = checkNotNull(subnetAddress);
86 this.broadcastAddress = broadcastAddress;
87 this.peerAddress = peerAddress;
88 }
89
90 /**
91 * Gets the IP address.
92 *
93 * @return the IP address
94 */
95 public IpAddress ipAddress() {
96 return ipAddress;
97 }
98
99 /**
100 * Gets the IP subnet address.
101 *
102 * @return the IP subnet address
103 */
104 public IpPrefix subnetAddress() {
105 return subnetAddress;
106 }
107
108 /**
109 * Gets the subnet IP broadcast address.
110 *
111 * @return the subnet IP broadcast address
112 */
113 public IpAddress broadcastAddress() {
114 return broadcastAddress;
115 }
116
117 /**
118 * Gets the IP point-to-point interface peer address.
119 *
120 * @return the IP point-to-point interface peer address
121 */
122 public IpAddress peerAddress() {
123 return peerAddress;
124 }
125
126 @Override
127 public boolean equals(Object other) {
128 if (other == this) {
129 return true;
130 }
131 if (!(other instanceof InterfaceIpAddress)) {
132 return false;
133 }
134 InterfaceIpAddress otherAddr = (InterfaceIpAddress) other;
135
136 return Objects.equals(this.ipAddress, otherAddr.ipAddress)
137 && Objects.equals(this.subnetAddress, otherAddr.subnetAddress)
138 && Objects.equals(this.broadcastAddress,
139 otherAddr.broadcastAddress)
140 && Objects.equals(this.peerAddress, otherAddr.peerAddress);
141 }
142
143 @Override
144 public int hashCode() {
145 return Objects.hash(ipAddress, subnetAddress, broadcastAddress,
146 peerAddress);
147 }
148
149 @Override
150 public String toString() {
151 return toStringHelper(this).add("ipAddress", ipAddress)
152 .add("subnetAddress", subnetAddress)
153 .add("broadcastAddress", broadcastAddress)
154 .add("peerAddress", peerAddress)
155 .omitNullValues().toString();
156 }
157}