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