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