LinkAddress.java revision b979f79158f9c470fa09ff3b96d72db274262201
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
22b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwaltimport java.net.Inet4Address;
23ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffimport java.net.InetAddress;
24ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffimport java.net.InterfaceAddress;
25ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffimport java.net.UnknownHostException;
26ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
27ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff/**
28ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * Identifies an address of a network link
29ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff * @hide
30ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff */
31ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriffpublic class LinkAddress implements Parcelable {
32ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
33ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * IPv4 or IPv6 address.
34ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
35ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    private final InetAddress address;
36ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
37ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
3896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * Network prefix length
39ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
4096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    private final int prefixLength;
41ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
4296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    public LinkAddress(InetAddress address, int prefixLength) {
43b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt        if (address == null || prefixLength < 0 ||
44b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt                ((address instanceof Inet4Address) && prefixLength > 32) ||
45b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt                (prefixLength > 128)) {
46b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt            throw new IllegalArgumentException("Bad LinkAddress params " + address +
47b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt                    prefixLength);
48b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt        }
49ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        this.address = address;
5096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        this.prefixLength = prefixLength;
51ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
52ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
53ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public LinkAddress(InterfaceAddress interfaceAddress) {
54ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        this.address = interfaceAddress.getAddress();
5596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        this.prefixLength = interfaceAddress.getNetworkPrefixLength();
56ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
57ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
58ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    @Override
59ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public String toString() {
6096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        return (address == null ? "" : (address.getHostAddress() + "/" + prefixLength));
61ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
62ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
63ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
64ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Compares this {@code LinkAddress} instance against the specified address
6596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff     * in {@code obj}. Two addresses are equal if their InetAddress and prefixLength
66ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * are equal
67ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     *
68ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * @param obj the object to be tested for equality.
69ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * @return {@code true} if both objects are equal, {@code false} otherwise.
70ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
71ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    @Override
72ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public boolean equals(Object obj) {
73ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        if (!(obj instanceof LinkAddress)) {
74ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            return false;
75ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        }
76ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        LinkAddress linkAddress = (LinkAddress) obj;
77ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        return this.address.equals(linkAddress.address) &&
7896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            this.prefixLength == linkAddress.prefixLength;
79ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
80ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
81ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
82ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Returns the InetAddress for this address.
83ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
84ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public InetAddress getAddress() {
85ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        return address;
86ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
87ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
88ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
89ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Get network prefix length
90ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
9196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    public int getNetworkPrefixLength() {
9296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        return prefixLength;
93ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
94ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
95ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
96ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Implement the Parcelable interface
97ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * @hide
98ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
99ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public int describeContents() {
100ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        return 0;
101ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
102ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
103ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
104ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Implement the Parcelable interface.
105ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * @hide
106ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
107ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public void writeToParcel(Parcel dest, int flags) {
108ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        if (address != null) {
109ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            dest.writeByte((byte)1);
110ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            dest.writeByteArray(address.getAddress());
11196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            dest.writeInt(prefixLength);
112ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        } else {
113ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            dest.writeByte((byte)0);
114ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        }
115ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    }
116ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
117ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    /**
118ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * Implement the Parcelable interface.
119ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     * @hide
120ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff     */
121ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff    public static final Creator<LinkAddress> CREATOR =
122ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        new Creator<LinkAddress>() {
123ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            public LinkAddress createFromParcel(Parcel in) {
124ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                InetAddress address = null;
12596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff                int prefixLength = 0;
126ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                if (in.readByte() == 1) {
127ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                    try {
128ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                        address = InetAddress.getByAddress(in.createByteArray());
12996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff                        prefixLength = in.readInt();
130ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                    } catch (UnknownHostException e) { }
131ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                }
13296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff                return new LinkAddress(address, prefixLength);
133ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            }
134ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff
135ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            public LinkAddress[] newArray(int size) {
136ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff                return new LinkAddress[size];
137ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff            }
138ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff        };
139ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff}
140