• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package java.net;
18 
19 /**
20  * Identifies one of a network interface's addresses.
21  * These are passed back from the JNI behind NetworkInterface.getNetworkInterfaces.
22  * Multiple addresses for the same interface are collected together on the Java side.
23  *
24  * @since 1.6
25  */
26 public class InterfaceAddress {
27     /**
28      * An IPv4 or IPv6 address.
29      */
30     private final InetAddress address;
31 
32     /**
33      * The IPv4 broadcast address, or null for IPv6.
34      */
35     private final InetAddress broadcastAddress;
36 
37     private final short prefixLength;
38 
39     /**
40      * For IPv4.
41      */
InterfaceAddress(Inet4Address address, Inet4Address broadcastAddress, Inet4Address mask)42     InterfaceAddress(Inet4Address address, Inet4Address broadcastAddress, Inet4Address mask) {
43         this.address = address;
44         this.broadcastAddress = broadcastAddress;
45         this.prefixLength = countPrefixLength(mask);
46     }
47 
48     /**
49      * For IPv6.
50      */
InterfaceAddress(Inet6Address address, short prefixLength)51     InterfaceAddress(Inet6Address address, short prefixLength) {
52         this.address = address;
53         this.broadcastAddress = null;
54         this.prefixLength = prefixLength;
55     }
56 
countPrefixLength(Inet4Address mask)57     private static short countPrefixLength(Inet4Address mask) {
58         short count = 0;
59         for (byte b : mask.ipaddress) {
60             for (int i = 0; i < 8; ++i) {
61                 if ((b & (1 << i)) != 0) {
62                     ++count;
63                 }
64             }
65         }
66         return count;
67     }
68 
69     /**
70      * Tests whether this object is equal to another one. Returns true if
71      * the address, broadcast address and prefix length are all equal.
72      *
73      * @param obj the object to be compared.
74      * @return true if 'obj' is equal to this InterfaceAddress, false otherwise.
75      */
76     @Override
equals(Object obj)77     public boolean equals(Object obj) {
78         if (obj == this){
79             return true;
80         }
81         if (!(obj instanceof InterfaceAddress)) {
82             return false;
83         }
84         InterfaceAddress rhs = (InterfaceAddress) obj;
85         return ((address == null) ? rhs.address == null : address.equals(rhs.address)) &&
86                 (rhs.prefixLength == prefixLength) &&
87                 ((broadcastAddress == null) ? rhs.broadcastAddress == null : broadcastAddress.equals(rhs.broadcastAddress));
88     }
89 
90     @Override
hashCode()91     public int hashCode() {
92         int hashCode = address == null ? 0 : -address.hashCode();
93         hashCode += broadcastAddress == null ? 0 : broadcastAddress.hashCode();
94         hashCode += prefixLength;
95         return hashCode;
96     }
97 
98     /**
99      * Returns a string containing this interface's address, prefix length, and broadcast address.
100      * For example: {@code "/172.18.103.112/23 [/172.18.103.255]"} or
101      * {@code "/0:0:0:0:0:0:0:1%1/128 [null]"}.
102      */
toString()103     @Override public String toString() {
104         return address + "/" + prefixLength + " [" + broadcastAddress + "]";
105     }
106 
107     /**
108      * Returns the InetAddress for this address.
109      */
getAddress()110     public InetAddress getAddress() {
111         return address;
112     }
113 
114     /**
115      * Returns the subnet-directed broadcast address if this is an IPv4 interface, null otherwise.
116      */
getBroadcast()117     public InetAddress getBroadcast() {
118         return broadcastAddress;
119     }
120 
121     /**
122      * Returns the network prefix length in bits.
123      * (In IPv4 parlance, this is known as the subnet mask,
124      * but this method applies to IPv6 addresses too.)
125      */
getNetworkPrefixLength()126     public short getNetworkPrefixLength() {
127         return prefixLength;
128     }
129 }
130