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