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 83ce5d913387c7fa4792ccb0dd13d79b6636c300a7Christopher Wiley /** 84ce5d913387c7fa4792ccb0dd13d79b6636c300a7Christopher Wiley * Set flags so that no changes will be made to the up/down status. 85ce5d913387c7fa4792ccb0dd13d79b6636c300a7Christopher Wiley */ 86ce5d913387c7fa4792ccb0dd13d79b6636c300a7Christopher Wiley public void ignoreInterfaceUpDownStatus() { 87ce5d913387c7fa4792ccb0dd13d79b6636c300a7Christopher Wiley mFlags.remove(FLAG_UP); 88ce5d913387c7fa4792ccb0dd13d79b6636c300a7Christopher Wiley mFlags.remove(FLAG_DOWN); 89ce5d913387c7fa4792ccb0dd13d79b6636c300a7Christopher Wiley } 90ce5d913387c7fa4792ccb0dd13d79b6636c300a7Christopher Wiley 91ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public LinkAddress getLinkAddress() { 92ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey return mAddr; 93ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 94ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 95ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public void setLinkAddress(LinkAddress addr) { 96ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey mAddr = addr; 97ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 98ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 99ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public String getHardwareAddress() { 100ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey return mHwAddr; 101ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 102ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 103ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public void setHardwareAddress(String hwAddr) { 104ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey mHwAddr = hwAddr; 105353ced79b49269151b056c4b06dc632801b59497San Mehat } 106353ced79b49269151b056c4b06dc632801b59497San Mehat 10729552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff /** 10829552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff * This function determines if the interface is up and has a valid IP 10929552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff * configuration (IP address has a non zero octet). 11029552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff * 11129552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff * Note: It is supposed to be quick and hence should not initiate 11229552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff * any network activity 11329552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff */ 11429552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff public boolean isActive() { 11529552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff try { 11687100cce398504075bc47c5bc6b5f15f4820a786Christopher Wiley if (isUp()) { 117ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey for (byte b : mAddr.getAddress().getAddress()) { 11829552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff if (b != 0) return true; 11929552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff } 12029552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff } 12129552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff } catch (NullPointerException e) { 12229552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff return false; 12329552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff } 12429552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff return false; 12529552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff } 12629552095e19e3faf2006ac1051da41d9bd212d6fIrfan Sheriff 12708395dce6a369eb5bda3852d4988bcfa3c7685c7Christopher Wiley public boolean isUp() { 12808395dce6a369eb5bda3852d4988bcfa3c7685c7Christopher Wiley return hasFlag(FLAG_UP); 12908395dce6a369eb5bda3852d4988bcfa3c7685c7Christopher Wiley } 13008395dce6a369eb5bda3852d4988bcfa3c7685c7Christopher Wiley 131ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey /** {@inheritDoc} */ 132353ced79b49269151b056c4b06dc632801b59497San Mehat public int describeContents() { 133353ced79b49269151b056c4b06dc632801b59497San Mehat return 0; 134353ced79b49269151b056c4b06dc632801b59497San Mehat } 135353ced79b49269151b056c4b06dc632801b59497San Mehat 136ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey /** {@inheritDoc} */ 137353ced79b49269151b056c4b06dc632801b59497San Mehat public void writeToParcel(Parcel dest, int flags) { 138ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey dest.writeString(mHwAddr); 139ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey if (mAddr != null) { 14004808c294027f8bc318643a94c85a999257d7f52Robert Greenwalt dest.writeByte((byte)1); 141ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey dest.writeParcelable(mAddr, flags); 14204808c294027f8bc318643a94c85a999257d7f52Robert Greenwalt } else { 14304808c294027f8bc318643a94c85a999257d7f52Robert Greenwalt dest.writeByte((byte)0); 14404808c294027f8bc318643a94c85a999257d7f52Robert Greenwalt } 145ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey dest.writeInt(mFlags.size()); 146ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey for (String flag : mFlags) { 147ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey dest.writeString(flag); 148ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 149353ced79b49269151b056c4b06dc632801b59497San Mehat } 150353ced79b49269151b056c4b06dc632801b59497San Mehat 151ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public static final Creator<InterfaceConfiguration> CREATOR = new Creator< 152ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey InterfaceConfiguration>() { 153ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public InterfaceConfiguration createFromParcel(Parcel in) { 154ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey InterfaceConfiguration info = new InterfaceConfiguration(); 155ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey info.mHwAddr = in.readString(); 156ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey if (in.readByte() == 1) { 157ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey info.mAddr = in.readParcelable(null); 158353ced79b49269151b056c4b06dc632801b59497San Mehat } 159ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey final int size = in.readInt(); 160ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey for (int i = 0; i < size; i++) { 161ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey info.mFlags.add(in.readString()); 162353ced79b49269151b056c4b06dc632801b59497San Mehat } 163ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey return info; 164ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 165ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 166ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey public InterfaceConfiguration[] newArray(int size) { 167ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey return new InterfaceConfiguration[size]; 168ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 169ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey }; 170ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey 171ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey private static void validateFlag(String flag) { 172ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey if (flag.indexOf(' ') >= 0) { 173ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey throw new IllegalArgumentException("flag contains space: " + flag); 174ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 175ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey } 176353ced79b49269151b056c4b06dc632801b59497San Mehat} 177