LinkAddress.java revision 96ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1
1ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff/*
2ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * Copyright (C) 2010 The Android Open Source Project
3ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff *
4ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License");
5ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * you may not use this file except in compliance with the License.
6ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * You may obtain a copy of the License at
7ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff *
8ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff *      http://www.apache.org/licenses/LICENSE-2.0
9ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff *
10ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * Unless required by applicable law or agreed to in writing, software
11ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS,
12ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * See the License for the specific language governing permissions and
14ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * limitations under the License.
15ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff */
16ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
17ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffpackage android.net;
18ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
19ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffimport android.os.Parcel;
20ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffimport android.os.Parcelable;
21ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
22ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffimport java.net.InetAddress;
23ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffimport java.net.InterfaceAddress;
24ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffimport java.net.UnknownHostException;
25ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
26ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff/**
27ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * Identifies an address of a network link
28ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * @hide
29ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff */
30ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffpublic class LinkAddress implements Parcelable {
31ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
32ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * IPv4 or IPv6 address.
33ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
34ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    private final InetAddress address;
35ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
36ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
3796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * Network prefix length
38ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
3996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    private final int prefixLength;
40ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
41ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public LinkAddress(InetAddress address, InetAddress mask) {
42ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        this.address = address;
4396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        this.prefixLength = computeprefixLength(mask);
44ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
45ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
4696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    public LinkAddress(InetAddress address, int prefixLength) {
47ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        this.address = address;
4896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        this.prefixLength = prefixLength;
49ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
50ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
51ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public LinkAddress(InterfaceAddress interfaceAddress) {
52ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        this.address = interfaceAddress.getAddress();
5396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        this.prefixLength = interfaceAddress.getNetworkPrefixLength();
54ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
55ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
5696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    private static int computeprefixLength(InetAddress mask) {
57ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        int count = 0;
58ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        for (byte b : mask.getAddress()) {
59ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            for (int i = 0; i < 8; ++i) {
60ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                if ((b & (1 << i)) != 0) {
61ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                    ++count;
62ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                }
63ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            }
64ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        }
65ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        return count;
66ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
67ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
68ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    @Override
69ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public String toString() {
7096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        return (address == null ? "" : (address.getHostAddress() + "/" + prefixLength));
71ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
72ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
73ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
74ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Compares this {@code LinkAddress} instance against the specified address
7596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * in {@code obj}. Two addresses are equal if their InetAddress and prefixLength
76ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * are equal
77ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     *
78ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * @param obj the object to be tested for equality.
79ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * @return {@code true} if both objects are equal, {@code false} otherwise.
80ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
81ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    @Override
82ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public boolean equals(Object obj) {
83ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        if (!(obj instanceof LinkAddress)) {
84ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            return false;
85ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        }
86ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        LinkAddress linkAddress = (LinkAddress) obj;
87ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        return this.address.equals(linkAddress.address) &&
8896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            this.prefixLength == linkAddress.prefixLength;
89ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
90ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
91ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
92ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Returns the InetAddress for this address.
93ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
94ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public InetAddress getAddress() {
95ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        return address;
96ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
97ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
98ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
99ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Get network prefix length
100ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
10196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    public int getNetworkPrefixLength() {
10296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        return prefixLength;
103ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
104ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
105ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
106ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Implement the Parcelable interface
107ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * @hide
108ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
109ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public int describeContents() {
110ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        return 0;
111ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
112ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
113ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
114ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Implement the Parcelable interface.
115ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * @hide
116ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
117ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public void writeToParcel(Parcel dest, int flags) {
118ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        if (address != null) {
119ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            dest.writeByte((byte)1);
120ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            dest.writeByteArray(address.getAddress());
12196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            dest.writeInt(prefixLength);
122ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        } else {
123ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            dest.writeByte((byte)0);
124ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        }
125ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
126ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
127ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
128ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Implement the Parcelable interface.
129ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * @hide
130ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
131ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public static final Creator<LinkAddress> CREATOR =
132ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        new Creator<LinkAddress>() {
133ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            public LinkAddress createFromParcel(Parcel in) {
134ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                InetAddress address = null;
13596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff                int prefixLength = 0;
136ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                if (in.readByte() == 1) {
137ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                    try {
138ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                        address = InetAddress.getByAddress(in.createByteArray());
13996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff                        prefixLength = in.readInt();
140ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                    } catch (UnknownHostException e) { }
141ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                }
14296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff                return new LinkAddress(address, prefixLength);
143ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            }
144ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
145ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            public LinkAddress[] newArray(int size) {
146ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                return new LinkAddress[size];
147ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            }
148ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        };
149ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff}
150