1353ced79b49269151b056c4b06dc632801b59497San Mehat/* 2353ced79b49269151b056c4b06dc632801b59497San Mehat * Copyright (C) 2008 The Android Open Source Project 3353ced79b49269151b056c4b06dc632801b59497San Mehat * 4353ced79b49269151b056c4b06dc632801b59497San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5353ced79b49269151b056c4b06dc632801b59497San Mehat * you may not use this file except in compliance with the License. 6353ced79b49269151b056c4b06dc632801b59497San Mehat * You may obtain a copy of the License at 7353ced79b49269151b056c4b06dc632801b59497San Mehat * 8353ced79b49269151b056c4b06dc632801b59497San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9353ced79b49269151b056c4b06dc632801b59497San Mehat * 10353ced79b49269151b056c4b06dc632801b59497San Mehat * Unless required by applicable law or agreed to in writing, software 11353ced79b49269151b056c4b06dc632801b59497San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12353ced79b49269151b056c4b06dc632801b59497San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13353ced79b49269151b056c4b06dc632801b59497San Mehat * See the License for the specific language governing permissions and 14353ced79b49269151b056c4b06dc632801b59497San Mehat * limitations under the License. 15353ced79b49269151b056c4b06dc632801b59497San Mehat */ 16353ced79b49269151b056c4b06dc632801b59497San Mehat 17353ced79b49269151b056c4b06dc632801b59497San Mehatpackage android.net; 18353ced79b49269151b056c4b06dc632801b59497San Mehat 19353ced79b49269151b056c4b06dc632801b59497San Mehatimport android.os.Parcel; 20ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkeyimport android.os.Parcelable; 21ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 22ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkeyimport com.google.android.collect.Sets; 23353ced79b49269151b056c4b06dc632801b59497San Mehat 24ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkeyimport java.util.HashSet; 2504808c294027f8bc318643a94c85a999257d7f52Robert Greenwalt 26353ced79b49269151b056c4b06dc632801b59497San Mehat/** 27ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey * Configuration details for a network interface. 28ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey * 29353ced79b49269151b056c4b06dc632801b59497San Mehat * @hide 30353ced79b49269151b056c4b06dc632801b59497San Mehat */ 31353ced79b49269151b056c4b06dc632801b59497San Mehatpublic class InterfaceConfiguration implements Parcelable { 32ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey private String mHwAddr; 33ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey private LinkAddress mAddr; 34ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey private HashSet<String> mFlags = Sets.newHashSet(); 35353ced79b49269151b056c4b06dc632801b59497San Mehat 36ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey private static final String FLAG_UP = "up"; 37ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey private static final String FLAG_DOWN = "down"; 38353ced79b49269151b056c4b06dc632801b59497San Mehat 39ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey @Override 40353ced79b49269151b056c4b06dc632801b59497San Mehat public String toString() { 41ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey final StringBuilder builder = new StringBuilder(); 42ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey builder.append("mHwAddr=").append(mHwAddr); 43ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey builder.append(" mAddr=").append(String.valueOf(mAddr)); 44ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey builder.append(" mFlags=").append(getFlags()); 45ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey return builder.toString(); 46ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 47ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 48ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey public Iterable<String> getFlags() { 49ba2896e939f359e5857149f1a27212db71be012bJeff Sharkey return mFlags; 50ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 51ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 52ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public boolean hasFlag(String flag) { 53ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey validateFlag(flag); 54ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey return mFlags.contains(flag); 55ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 56ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 57ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public void clearFlag(String flag) { 58ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey validateFlag(flag); 59ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey mFlags.remove(flag); 60ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 61ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 62ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public void setFlag(String flag) { 63ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey validateFlag(flag); 64ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey mFlags.add(flag); 65ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 66ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 67ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey /** 68ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey * Set flags to mark interface as up. 69ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey */ 70ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public void setInterfaceUp() { 71ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey mFlags.remove(FLAG_DOWN); 72ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey mFlags.add(FLAG_UP); 73ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 74353ced79b49269151b056c4b06dc632801b59497San Mehat 75ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey /** 76ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey * Set flags to mark interface as down. 77ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey */ 78ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public void setInterfaceDown() { 79ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey mFlags.remove(FLAG_UP); 80ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey mFlags.add(FLAG_DOWN); 81ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 82353ced79b49269151b056c4b06dc632801b59497San Mehat 83ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public LinkAddress getLinkAddress() { 84ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey return mAddr; 85ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 86ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 87ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public void setLinkAddress(LinkAddress addr) { 88ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey mAddr = addr; 89ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 90ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 91ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public String getHardwareAddress() { 92ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey return mHwAddr; 93ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 94ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 95ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public void setHardwareAddress(String hwAddr) { 96ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey mHwAddr = hwAddr; 97353ced79b49269151b056c4b06dc632801b59497San Mehat } 98353ced79b49269151b056c4b06dc632801b59497San Mehat 9929552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff /** 10029552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff * This function determines if the interface is up and has a valid IP 10129552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff * configuration (IP address has a non zero octet). 10229552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff * 10329552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff * Note: It is supposed to be quick and hence should not initiate 10429552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff * any network activity 10529552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff */ 10629552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff public boolean isActive() { 10729552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff try { 108ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey if (hasFlag(FLAG_UP)) { 109ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey for (byte b : mAddr.getAddress().getAddress()) { 11029552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff if (b != 0) return true; 11129552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff } 11229552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff } 11329552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff } catch (NullPointerException e) { 11429552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff return false; 11529552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff } 11629552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff return false; 11729552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff } 11829552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff 119ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey /** {@inheritDoc} */ 120353ced79b49269151b056c4b06dc632801b59497San Mehat public int describeContents() { 121353ced79b49269151b056c4b06dc632801b59497San Mehat return 0; 122353ced79b49269151b056c4b06dc632801b59497San Mehat } 123353ced79b49269151b056c4b06dc632801b59497San Mehat 124ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey /** {@inheritDoc} */ 125353ced79b49269151b056c4b06dc632801b59497San Mehat public void writeToParcel(Parcel dest, int flags) { 126ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey dest.writeString(mHwAddr); 127ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey if (mAddr != null) { 12804808c294027f8bc318643a94c85a999257d7f52Robert Greenwalt dest.writeByte((byte)1); 129ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey dest.writeParcelable(mAddr, flags); 13004808c294027f8bc318643a94c85a999257d7f52Robert Greenwalt } else { 13104808c294027f8bc318643a94c85a999257d7f52Robert Greenwalt dest.writeByte((byte)0); 13204808c294027f8bc318643a94c85a999257d7f52Robert Greenwalt } 133ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey dest.writeInt(mFlags.size()); 134ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey for (String flag : mFlags) { 135ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey dest.writeString(flag); 136ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 137353ced79b49269151b056c4b06dc632801b59497San Mehat } 138353ced79b49269151b056c4b06dc632801b59497San Mehat 139ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public static final Creator<InterfaceConfiguration> CREATOR = new Creator< 140ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey InterfaceConfiguration>() { 141ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public InterfaceConfiguration createFromParcel(Parcel in) { 142ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey InterfaceConfiguration info = new InterfaceConfiguration(); 143ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey info.mHwAddr = in.readString(); 144ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey if (in.readByte() == 1) { 145ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey info.mAddr = in.readParcelable(null); 146353ced79b49269151b056c4b06dc632801b59497San Mehat } 147ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey final int size = in.readInt(); 148ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey for (int i = 0; i < size; i++) { 149ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey info.mFlags.add(in.readString()); 150353ced79b49269151b056c4b06dc632801b59497San Mehat } 151ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey return info; 152ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 153ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 154ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public InterfaceConfiguration[] newArray(int size) { 155ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey return new InterfaceConfiguration[size]; 156ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 157ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey }; 158ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 159ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey private static void validateFlag(String flag) { 160ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey if (flag.indexOf(' ') >= 0) { 161ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey throw new IllegalArgumentException("flag contains space: " + flag); 162ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 163ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 164353ced79b49269151b056c4b06dc632801b59497San Mehat} 165