• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 android.net;
18 
19 import android.os.Parcel;
20 import android.os.Parcelable;
21 
22 import java.net.Inet4Address;
23 import java.net.InetAddress;
24 import java.net.InterfaceAddress;
25 import java.net.UnknownHostException;
26 
27 /**
28  * Identifies an address of a network link
29  * @hide
30  */
31 public class LinkAddress implements Parcelable {
32     /**
33      * IPv4 or IPv6 address.
34      */
35     private final InetAddress address;
36 
37     /**
38      * Network prefix length
39      */
40     private final int prefixLength;
41 
LinkAddress(InetAddress address, int prefixLength)42     public LinkAddress(InetAddress address, int prefixLength) {
43         if (address == null || prefixLength < 0 ||
44                 ((address instanceof Inet4Address) && prefixLength > 32) ||
45                 (prefixLength > 128)) {
46             throw new IllegalArgumentException("Bad LinkAddress params " + address +
47                     prefixLength);
48         }
49         this.address = address;
50         this.prefixLength = prefixLength;
51     }
52 
LinkAddress(InterfaceAddress interfaceAddress)53     public LinkAddress(InterfaceAddress interfaceAddress) {
54         this.address = interfaceAddress.getAddress();
55         this.prefixLength = interfaceAddress.getNetworkPrefixLength();
56     }
57 
58     @Override
toString()59     public String toString() {
60         return (address == null ? "" : (address.getHostAddress() + "/" + prefixLength));
61     }
62 
63     /**
64      * Compares this {@code LinkAddress} instance against the specified address
65      * in {@code obj}. Two addresses are equal if their InetAddress and prefixLength
66      * are equal
67      *
68      * @param obj the object to be tested for equality.
69      * @return {@code true} if both objects are equal, {@code false} otherwise.
70      */
71     @Override
equals(Object obj)72     public boolean equals(Object obj) {
73         if (!(obj instanceof LinkAddress)) {
74             return false;
75         }
76         LinkAddress linkAddress = (LinkAddress) obj;
77         return this.address.equals(linkAddress.address) &&
78             this.prefixLength == linkAddress.prefixLength;
79     }
80 
81     @Override
82     /*
83      * generate hashcode based on significant fields
84      */
hashCode()85     public int hashCode() {
86         return ((null == address) ? 0 : address.hashCode()) + prefixLength;
87     }
88 
89     /**
90      * Returns the InetAddress for this address.
91      */
getAddress()92     public InetAddress getAddress() {
93         return address;
94     }
95 
96     /**
97      * Get network prefix length
98      */
getNetworkPrefixLength()99     public int getNetworkPrefixLength() {
100         return prefixLength;
101     }
102 
103     /**
104      * Implement the Parcelable interface
105      * @hide
106      */
describeContents()107     public int describeContents() {
108         return 0;
109     }
110 
111     /**
112      * Implement the Parcelable interface.
113      * @hide
114      */
writeToParcel(Parcel dest, int flags)115     public void writeToParcel(Parcel dest, int flags) {
116         if (address != null) {
117             dest.writeByte((byte)1);
118             dest.writeByteArray(address.getAddress());
119             dest.writeInt(prefixLength);
120         } else {
121             dest.writeByte((byte)0);
122         }
123     }
124 
125     /**
126      * Implement the Parcelable interface.
127      * @hide
128      */
129     public static final Creator<LinkAddress> CREATOR =
130         new Creator<LinkAddress>() {
131             public LinkAddress createFromParcel(Parcel in) {
132                 InetAddress address = null;
133                 int prefixLength = 0;
134                 if (in.readByte() == 1) {
135                     try {
136                         address = InetAddress.getByAddress(in.createByteArray());
137                         prefixLength = in.readInt();
138                     } catch (UnknownHostException e) { }
139                 }
140                 return new LinkAddress(address, prefixLength);
141             }
142 
143             public LinkAddress[] newArray(int size) {
144                 return new LinkAddress[size];
145             }
146         };
147 }
148