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