1 /*
2  * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package java.net;
27 
28 /**
29  * This class represents a Network Interface address. In short it's an
30  * IP address, a subnet mask and a broadcast address when the address is
31  * an IPv4 one. An IP address and a network prefix length in the case
32  * of IPv6 address.
33  *
34  * @see java.net.NetworkInterface
35  * @since 1.6
36  */
37 public class InterfaceAddress {
38     private InetAddress address = null;
39     private Inet4Address broadcast = null;
40     private short        maskLength = 0;
41 
42     /*
43      * Package private constructor. Can't be built directly, instances are
44      * obtained through the NetworkInterface class.
45      */
InterfaceAddress()46     InterfaceAddress() {
47     }
48 
49     /**
50      * Returns an {@code InetAddress} for this address.
51      *
52      * @return the {@code InetAddress} for this address.
53      */
getAddress()54     public InetAddress getAddress() {
55         return address;
56     }
57 
58     /**
59      * Returns an {@code InetAddress} for the broadcast address
60      * for this InterfaceAddress.
61      * <p>
62      * Only IPv4 networks have broadcast address therefore, in the case
63      * of an IPv6 network, {@code null} will be returned.
64      *
65      * @return the {@code InetAddress} representing the broadcast
66      *         address or {@code null} if there is no broadcast address.
67      */
getBroadcast()68     public InetAddress getBroadcast() {
69         return broadcast;
70     }
71 
72     /**
73      * Returns the network prefix length for this address. This is also known
74      * as the subnet mask in the context of IPv4 addresses.
75      * Typical IPv4 values would be 8 (255.0.0.0), 16 (255.255.0.0)
76      * or 24 (255.255.255.0). <p>
77      * Typical IPv6 values would be 128 (::1/128) or 10 (fe80::203:baff:fe27:1243/10)
78      *
79      * @return a {@code short} representing the prefix length for the
80      *         subnet of that address.
81      */
getNetworkPrefixLength()82      public short getNetworkPrefixLength() {
83         return maskLength;
84     }
85 
86     /**
87      * Compares this object against the specified object.
88      * The result is {@code true} if and only if the argument is
89      * not {@code null} and it represents the same interface address as
90      * this object.
91      * <p>
92      * Two instances of {@code InterfaceAddress} represent the same
93      * address if the InetAddress, the prefix length and the broadcast are
94      * the same for both.
95      *
96      * @param   obj   the object to compare against.
97      * @return  {@code true} if the objects are the same;
98      *          {@code false} otherwise.
99      * @see     java.net.InterfaceAddress#hashCode()
100      */
equals(Object obj)101     public boolean equals(Object obj) {
102         if (!(obj instanceof InterfaceAddress)) {
103             return false;
104         }
105         InterfaceAddress cmp = (InterfaceAddress) obj;
106         if ( !(address == null ? cmp.address == null : address.equals(cmp.address)) )
107             return false;
108         if ( !(broadcast  == null ? cmp.broadcast == null : broadcast.equals(cmp.broadcast)) )
109             return false;
110         if (maskLength != cmp.maskLength)
111             return false;
112         return true;
113     }
114 
115     /**
116      * Returns a hashcode for this Interface address.
117      *
118      * @return  a hash code value for this Interface address.
119      */
hashCode()120     public int hashCode() {
121         return address.hashCode() + ((broadcast != null) ? broadcast.hashCode() : 0) + maskLength;
122     }
123 
124     /**
125      * Converts this Interface address to a {@code String}. The
126      * string returned is of the form: InetAddress / prefix length [ broadcast address ].
127      *
128      * @return  a string representation of this Interface address.
129      */
toString()130     public String toString() {
131         return address + "/" + maskLength + " [" + broadcast + "]";
132     }
133 
134 }
135