WifiNative.java revision de1e9fa9fbc4b7f4b08415d805a6e5212e655d95
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.wifi;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pConfig;
2055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pGroup;
2155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pDevice;
22618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriffimport android.text.TextUtils;
2321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
2421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
2555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.util.Log;
2655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
2755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.io.InputStream;
2855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.lang.Process;
2955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.ArrayList;
3055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.List;
3155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
331f095869536472c178046bb63c59947508eac4a6Irfan Sheriff * Native calls for bring up/shut down of the supplicant daemon and for
341f095869536472c178046bb63c59947508eac4a6Irfan Sheriff * sending requests to the supplicant daemon
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
361f095869536472c178046bb63c59947508eac4a6Irfan Sheriff * waitForEvent() is called on the monitor thread for events. All other methods
371f095869536472c178046bb63c59947508eac4a6Irfan Sheriff * must be serialized from the framework.
3855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync *
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiNative {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
437d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff    private static final boolean DBG = false;
447d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff    private final String mTAG;
45fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    private static final int DEFAULT_GROUP_OWNER_INTENT = 7;
46fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2;
505d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
51fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    String mInterface = "";
5244b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean loadDriver();
54a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff
55a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff    public native static boolean isDriverLoaded();
565d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean unloadDriver();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
597d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff    public native static boolean startSupplicant(boolean p2pSupported);
60f42c39b3d188ebb3ba9003cffc530717829fe874Irfan Sheriff
615d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff    /* Sends a kill signal to supplicant. To be used when we have lost connection
625d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff       or when the supplicant is hung */
6396071a7031bac06e3f249610b010ad5651efe8aeIrfan Sheriff    public native static boolean killSupplicant();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    private native boolean connectToSupplicant(String iface);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    private native void closeSupplicantConnection(String iface);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
691f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    /**
701f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * Wait for the supplicant to send an event, returning the event string.
711f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * @return the event string sent by the supplicant.
721f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     */
73fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    private native String waitForEvent(String iface);
7444b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff
75fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    private native boolean doBooleanCommand(String iface, String command);
7644b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff
77fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    private native int doIntCommand(String iface, String command);
7844b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff
79fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    private native String doStringCommand(String iface, String command);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public WifiNative(String iface) {
82fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff        mInterface = iface;
837d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff        mTAG = "WifiNative-" + iface;
8444b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff    }
8544b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff
86fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean connectToSupplicant() {
87fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff        return connectToSupplicant(mInterface);
8844b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff    }
895d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
90fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public void closeSupplicantConnection() {
91fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff        closeSupplicantConnection(mInterface);
9244b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff    }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
94fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String waitForEvent() {
95fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff        return waitForEvent(mInterface);
9644b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff    }
9744b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff
98fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    private boolean doBooleanCommand(String command) {
997d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff        if (DBG) Log.d(mTAG, "doBoolean: " + command);
100fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff        return doBooleanCommand(mInterface, command);
10144b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff    }
10244b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff
103fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    private int doIntCommand(String command) {
1047d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff        if (DBG) Log.d(mTAG, "doInt: " + command);
105fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff        return doIntCommand(mInterface, command);
10644b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff    }
10744b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff
108fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    private String doStringCommand(String command) {
1097d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff        if (DBG) Log.d(mTAG, "doString: " + command);
110fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff        return doStringCommand(mInterface, command);
11144b330dfb0aeecb4e2ac97ff72a5abfb341c74fbIrfan Sheriff    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
113fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean ping() {
1141f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        String pong = doStringCommand("PING");
1151f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return (pong != null && pong.equals("PONG"));
1161f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
118fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean scan() {
1191f095869536472c178046bb63c59947508eac4a6Irfan Sheriff       return doBooleanCommand("SCAN");
1201f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
122fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setScanMode(boolean setActive) {
1231f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        if (setActive) {
1241f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            return doBooleanCommand("DRIVER SCAN-ACTIVE");
1251f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        } else {
1261f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            return doBooleanCommand("DRIVER SCAN-PASSIVE");
1271f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        }
1281f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1301f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    /* Does a graceful shutdown of supplicant. Is a common stop function for both p2p and sta.
1311f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     *
1321f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * Note that underneath we use a harsh-sounding "terminate" supplicant command
1331f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * for a graceful stop and a mild-sounding "stop" interface
1341f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * to kill the process
1351f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     */
136fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean stopSupplicant() {
1371f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("TERMINATE");
1381f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
140fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String listNetworks() {
1411f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doStringCommand("LIST_NETWORKS");
1421f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1435d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
144fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public int addNetwork() {
1451f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doIntCommand("ADD_NETWORK");
1461f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
148fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setNetworkVariable(int netId, String name, String value) {
1491f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        if (TextUtils.isEmpty(name) || TextUtils.isEmpty(value)) return false;
1501f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("SET_NETWORK " + netId + " " + name + " " + value);
1511f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
153fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String getNetworkVariable(int netId, String name) {
1541f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        if (TextUtils.isEmpty(name)) return null;
1551f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doStringCommand("GET_NETWORK " + netId + " " + name);
1561f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
158fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean removeNetwork(int netId) {
1591f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("REMOVE_NETWORK " + netId);
1601f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
16196071a7031bac06e3f249610b010ad5651efe8aeIrfan Sheriff
162fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean enableNetwork(int netId, boolean disableOthers) {
1631f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        if (disableOthers) {
1641f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            return doBooleanCommand("SELECT_NETWORK " + netId);
1651f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        } else {
1661f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            return doBooleanCommand("ENABLE_NETWORK " + netId);
1671f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        }
1681f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
170fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean disableNetwork(int netId) {
1711f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DISABLE_NETWORK " + netId);
1721f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
174fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean reconnect() {
1751f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("RECONNECT");
1761f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
178fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean reassociate() {
1791f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("REASSOCIATE");
1801f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
182fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean disconnect() {
1831f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DISCONNECT");
1841f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1851f095869536472c178046bb63c59947508eac4a6Irfan Sheriff
186fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String status() {
1871f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doStringCommand("STATUS");
1881f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1891f095869536472c178046bb63c59947508eac4a6Irfan Sheriff
190fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String getMacAddress() {
1911f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        //Macaddr = XX.XX.XX.XX.XX.XX
1921f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        String ret = doStringCommand("DRIVER MACADDR");
1931f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        if (!TextUtils.isEmpty(ret)) {
1941f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            String[] tokens = ret.split(" = ");
1951f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            if (tokens.length == 2) return tokens[1];
1961f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        }
1971f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return null;
1981f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
1991f095869536472c178046bb63c59947508eac4a6Irfan Sheriff
200fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String scanResults() {
2011f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doStringCommand("SCAN_RESULTS");
2021f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
2031f095869536472c178046bb63c59947508eac4a6Irfan Sheriff
204fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean startDriver() {
2051f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DRIVER START");
2061f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
2071f095869536472c178046bb63c59947508eac4a6Irfan Sheriff
208fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean stopDriver() {
2091f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DRIVER STOP");
2101f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
212b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff
213b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff    /**
214b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * Start filtering out Multicast V4 packets
215b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * @return {@code true} if the operation succeeded, {@code false} otherwise
2161f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     *
2171f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * Multicast filtering rules work as follows:
2181f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     *
2191f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * The driver can filter multicast (v4 and/or v6) and broadcast packets when in
2201f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * a power optimized mode (typically when screen goes off).
2211f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     *
2221f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * In order to prevent the driver from filtering the multicast/broadcast packets, we have to
2231f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * add a DRIVER RXFILTER-ADD rule followed by DRIVER RXFILTER-START to make the rule effective
2241f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     *
2251f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * DRIVER RXFILTER-ADD Num
2261f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     *   where Num = 0 - Unicast, 1 - Broadcast, 2 - Mutil4 or 3 - Multi6
2271f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     *
2281f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * and DRIVER RXFILTER-START
2291f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * In order to stop the usage of these rules, we do
2301f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     *
2311f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * DRIVER RXFILTER-STOP
2321f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * DRIVER RXFILTER-REMOVE Num
2331f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     *   where Num is as described for RXFILTER-ADD
2341f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     *
2351f095869536472c178046bb63c59947508eac4a6Irfan Sheriff     * The  SETSUSPENDOPT driver command overrides the filtering rules
236b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     */
237fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean startFilteringMulticastV4Packets() {
2381f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DRIVER RXFILTER-STOP")
2391f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            && doBooleanCommand("DRIVER RXFILTER-REMOVE 2")
2401f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            && doBooleanCommand("DRIVER RXFILTER-START");
2411f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
242b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff
243b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff    /**
244b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * Stop filtering out Multicast V4 packets.
245b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * @return {@code true} if the operation succeeded, {@code false} otherwise
246b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     */
247fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean stopFilteringMulticastV4Packets() {
2481f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DRIVER RXFILTER-STOP")
2491f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            && doBooleanCommand("DRIVER RXFILTER-ADD 2")
2501f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            && doBooleanCommand("DRIVER RXFILTER-START");
2511f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
252b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
254b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * Start filtering out Multicast V6 packets
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded, {@code false} otherwise
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
257fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean startFilteringMulticastV6Packets() {
2581f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DRIVER RXFILTER-STOP")
2591f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            && doBooleanCommand("DRIVER RXFILTER-REMOVE 3")
2601f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            && doBooleanCommand("DRIVER RXFILTER-START");
2611f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
264b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * Stop filtering out Multicast V6 packets.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded, {@code false} otherwise
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
267fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean stopFilteringMulticastV6Packets() {
2681f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DRIVER RXFILTER-STOP")
2691f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            && doBooleanCommand("DRIVER RXFILTER-ADD 3")
2701f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            && doBooleanCommand("DRIVER RXFILTER-START");
2711f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
273fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public int getBand() {
2741f095869536472c178046bb63c59947508eac4a6Irfan Sheriff       String ret = doStringCommand("DRIVER GETBAND");
2751f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        if (!TextUtils.isEmpty(ret)) {
2761f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            //reply is "BAND X" where X is the band
2771f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            String[] tokens = ret.split(" ");
2781f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            try {
2791f095869536472c178046bb63c59947508eac4a6Irfan Sheriff                if (tokens.length == 2) return Integer.parseInt(tokens[1]);
2801f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            } catch (NumberFormatException e) {
2811f095869536472c178046bb63c59947508eac4a6Irfan Sheriff                return -1;
2821f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            }
2831f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        }
2841f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return -1;
2851f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
28625c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff
287fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setBand(int band) {
2881f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DRIVER SETBAND " + band);
2891f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
290ea8bd1d1676dd96f8f9726bb8f67fa18dec7b9c1Mikael Kanstrup
2911f095869536472c178046bb63c59947508eac4a6Irfan Sheriff   /**
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the bluetooth coexistence mode.
2935d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff     *
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode One of {@link #BLUETOOTH_COEXISTENCE_MODE_DISABLED},
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #BLUETOOTH_COEXISTENCE_MODE_ENABLED}, or
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #BLUETOOTH_COEXISTENCE_MODE_SENSE}.
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the mode was successfully set.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
299fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setBluetoothCoexistenceMode(int mode) {
3001f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DRIVER BTCOEXMODE " + mode);
3011f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
302b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project
303b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    /**
304b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * Enable or disable Bluetooth coexistence scan mode. When this mode is on,
305b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * some of the low-level scan parameters used by the driver are changed to
306b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * reduce interference with A2DP streaming.
307b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     *
308b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * @param isSet whether to enable or disable this mode
309b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * @return {@code true} if the command succeeded, {@code false} otherwise.
310b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     */
311fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setBluetoothCoexistenceScanMode(boolean setCoexScanMode) {
3121f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        if (setCoexScanMode) {
3131f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            return doBooleanCommand("DRIVER BTCOEXSCAN-START");
3141f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        } else {
3151f095869536472c178046bb63c59947508eac4a6Irfan Sheriff            return doBooleanCommand("DRIVER BTCOEXSCAN-STOP");
3161f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        }
3171f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
3185ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff
319fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean saveConfig() {
3201f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        // Make sure we never write out a value for AP_SCAN other than 1
3211f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("AP_SCAN 1") && doBooleanCommand("SAVE_CONFIG");
3221f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
3235876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff
324fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setScanResultHandling(int mode) {
3251f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("AP_SCAN " + mode);
3261f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
327ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff
328fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean addToBlacklist(String bssid) {
3291f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        if (TextUtils.isEmpty(bssid)) return false;
3301f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("BLACKLIST " + bssid);
3311f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
332fcc0845cf9990470d498dcaa036f0ae6487ddf34Irfan Sheriff
333fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean clearBlacklist() {
3341f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("BLACKLIST clear");
3351f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
3362b7f63887e39079a52592fb4507d8daaf90e8afaIrfan Sheriff
337fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setSuspendOptimizations(boolean enabled) {
3381f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        if (enabled) {
339262f766ac8bd330008e1f0a61c1a37c64108b17cIrfan Sheriff            return doBooleanCommand("DRIVER SETSUSPENDMODE 1");
3401f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        } else {
341262f766ac8bd330008e1f0a61c1a37c64108b17cIrfan Sheriff            return doBooleanCommand("DRIVER SETSUSPENDMODE 0");
3421f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        }
3431f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
34455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
345fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setCountryCode(String countryCode) {
3461f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("DRIVER COUNTRY " + countryCode);
3471f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
34855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
349fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public void enableBackgroundScan(boolean enable) {
3501f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        if (enable) {
351e2639d782eef1365a98dbd2639be23a6dd06e691Irfan Sheriff            doBooleanCommand("SET pno 1");
3521f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        } else {
353e2639d782eef1365a98dbd2639be23a6dd06e691Irfan Sheriff            doBooleanCommand("SET pno 0");
3541f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        }
3551f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
35655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
357fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public void setScanInterval(int scanInterval) {
3581f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        doBooleanCommand("SCAN_INTERVAL " + scanInterval);
3591f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
36055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
361921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff    /** Example output:
362921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff     * RSSI=-65
363921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff     * LINKSPEED=48
364921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff     * NOISE=9999
365921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff     * FREQUENCY=0
366921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff     */
367fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String signalPoll() {
368921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff        return doStringCommand("SIGNAL_POLL");
369921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff    }
370921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff
371fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean startWpsPbc(String bssid) {
37286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        if (TextUtils.isEmpty(bssid)) {
37386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff            return doBooleanCommand("WPS_PBC");
37486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        } else {
37586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff            return doBooleanCommand("WPS_PBC " + bssid);
37686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        }
3771f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
3781f095869536472c178046bb63c59947508eac4a6Irfan Sheriff
37955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    public boolean startWpsPbc(String iface, String bssid) {
38055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        if (TextUtils.isEmpty(bssid)) {
38155bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff            return doBooleanCommand("WPS_PBC interface=" + iface);
38255bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        } else {
38355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff            return doBooleanCommand("WPS_PBC interface=" + iface + " " + bssid);
38455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        }
38555bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    }
38655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff
387fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean startWpsPinKeypad(String pin) {
38886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        if (TextUtils.isEmpty(pin)) return false;
3892b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("WPS_PIN any " + pin);
3902b8edd0c485f74067605c19983e3e7f44b20ec50repo sync    }
3912b8edd0c485f74067605c19983e3e7f44b20ec50repo sync
39255bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    public boolean startWpsPinKeypad(String iface, String pin) {
39355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        if (TextUtils.isEmpty(pin)) return false;
39455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        return doBooleanCommand("WPS_PIN interface=" + iface + " any " + pin);
39555bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    }
39655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff
39755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff
398fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String startWpsPinDisplay(String bssid) {
39986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        if (TextUtils.isEmpty(bssid)) {
40086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff            return doStringCommand("WPS_PIN any");
40186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        } else {
40286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff            return doStringCommand("WPS_PIN " + bssid);
40386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        }
4041f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
4051f095869536472c178046bb63c59947508eac4a6Irfan Sheriff
40655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    public String startWpsPinDisplay(String iface, String bssid) {
40755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        if (TextUtils.isEmpty(bssid)) {
40855bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff            return doStringCommand("WPS_PIN interface=" + iface + " any");
40955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        } else {
41055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff            return doStringCommand("WPS_PIN interface=" + iface + " " + bssid);
41155bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        }
41255bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    }
41355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff
4141f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    /* Configures an access point connection */
415fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean startWpsRegistrar(String bssid, String pin) {
41686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        if (TextUtils.isEmpty(bssid) || TextUtils.isEmpty(pin)) return false;
4171f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("WPS_REG " + bssid + " " + pin);
4181f095869536472c178046bb63c59947508eac4a6Irfan Sheriff    }
4191f095869536472c178046bb63c59947508eac4a6Irfan Sheriff
42086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public boolean cancelWps() {
42186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        return doBooleanCommand("WPS_CANCEL");
42286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    }
42386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff
424fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setPersistentReconnect(boolean enabled) {
4259322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff        int value = (enabled == true) ? 1 : 0;
4261f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("SET persistent_reconnect " + value);
4279322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff    }
4289322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff
429fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setDeviceName(String name) {
4301f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("SET device_name " + name);
4319322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff    }
4329322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff
433fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setDeviceType(String type) {
4341f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("SET device_type " + type);
4359322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff    }
4369322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff
437fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setConfigMethods(String cfg) {
4381f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("SET config_methods " + cfg);
439618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff    }
440618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff
441fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean setP2pSsidPostfix(String postfix) {
4421f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        return doBooleanCommand("SET p2p_ssid_postfix " + postfix);
443530040e0b9458994c02f4392765db168128d48daIrfan Sheriff    }
444530040e0b9458994c02f4392765db168128d48daIrfan Sheriff
445de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff    public boolean setP2pGroupIdle(int time) {
446de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff        return doBooleanCommand("SET p2p_group_idle " + time);
44755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    }
44855bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff
449e2639d782eef1365a98dbd2639be23a6dd06e691Irfan Sheriff    public void setPowerSave(boolean enabled) {
450e2639d782eef1365a98dbd2639be23a6dd06e691Irfan Sheriff        if (enabled) {
451e2639d782eef1365a98dbd2639be23a6dd06e691Irfan Sheriff            doBooleanCommand("SET ps 1");
452e2639d782eef1365a98dbd2639be23a6dd06e691Irfan Sheriff        } else {
453e2639d782eef1365a98dbd2639be23a6dd06e691Irfan Sheriff            doBooleanCommand("SET ps 0");
454e2639d782eef1365a98dbd2639be23a6dd06e691Irfan Sheriff        }
455e2639d782eef1365a98dbd2639be23a6dd06e691Irfan Sheriff    }
456e2639d782eef1365a98dbd2639be23a6dd06e691Irfan Sheriff
45755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    public boolean setP2pPowerSave(String iface, boolean enabled) {
45855bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        if (enabled) {
45955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff            return doBooleanCommand("P2P_SET interface=" + iface + " ps 1");
46055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        } else {
46155bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff            return doBooleanCommand("P2P_SET interface=" + iface + " ps 0");
46255bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff        }
46355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    }
46455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff
46555bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    /**
46655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff     * "sta" prioritizes STA connection over P2P and "p2p" prioritizes
46755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff     * P2P connection over STA
46855bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff     */
46955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    public boolean setConcurrencyPriority(String s) {
470de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff        return doBooleanCommand("P2P_SET conc_pref " + s);
47155bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff    }
47255bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff
473fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pFind() {
4742b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_FIND");
47555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
47655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
477fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pFind(int timeout) {
47855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        if (timeout <= 0) {
47955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync            return p2pFind();
48055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        }
4812b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_FIND " + timeout);
48255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
48355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
4847d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff    public boolean p2pStopFind() {
4857d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff       return doBooleanCommand("P2P_STOP_FIND");
4867d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff    }
4877d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff
488fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pListen() {
4892b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_LISTEN");
49055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
49155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
492fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pListen(int timeout) {
49355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        if (timeout <= 0) {
49455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync            return p2pListen();
49555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        }
4962b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_LISTEN " + timeout);
49755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
49855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
499fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pFlush() {
5002b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_FLUSH");
50155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
50255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
50355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    /* p2p_connect <peer device address> <pbc|pin|PIN#> [label|display|keypad]
50455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        [persistent] [join|auth] [go_intent=<0..15>] [freq=<in MHz>] */
505fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String p2pConnect(WifiP2pConfig config, boolean joinExistingGroup) {
50655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        if (config == null) return null;
50755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        List<String> args = new ArrayList<String>();
508651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff        WpsInfo wps = config.wps;
50955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        args.add(config.deviceAddress);
51055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
5116f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff        switch (wps.setup) {
512651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff            case WpsInfo.PBC:
51355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                args.add("pbc");
51455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                break;
515651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff            case WpsInfo.DISPLAY:
516618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                if (TextUtils.isEmpty(wps.pin)) {
517618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                    args.add("pin");
518618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                } else {
519618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                    args.add(wps.pin);
520618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                }
52155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                args.add("display");
52255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                break;
523651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff            case WpsInfo.KEYPAD:
5246f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff                args.add(wps.pin);
52555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                args.add("keypad");
52655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                break;
527651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff            case WpsInfo.LABEL:
5286f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff                args.add(wps.pin);
52955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                args.add("label");
53055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync            default:
53155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                break;
53255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        }
53355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
534f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff        //TODO: Add persist behavior once the supplicant interaction is fixed for both
535f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff        // group and client scenarios
536ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        /* Persist unless there is an explicit request to not do so*/
537f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff        //if (config.persist != WifiP2pConfig.Persist.NO) args.add("persistent");
538f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff
539de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff        if (joinExistingGroup) {
540de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff            args.add("join");
541de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff        } else {
542de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff            //TODO: This can be adapted based on device plugged in state and
543de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff            //device battery state
544de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff            int groupOwnerIntent = config.groupOwnerIntent;
545de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff            if (groupOwnerIntent < 0 || groupOwnerIntent > 15) {
546de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff                groupOwnerIntent = DEFAULT_GROUP_OWNER_INTENT;
547de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff            }
548de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff            args.add("go_intent=" + groupOwnerIntent);
5492b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        }
55055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
5512b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        String command = "P2P_CONNECT ";
55255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        for (String s : args) command += s + " ";
55355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
5542b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doStringCommand(command);
55555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
55655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
557fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pCancelConnect() {
558651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff        return doBooleanCommand("P2P_CANCEL");
559651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff    }
560651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff
561fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pProvisionDiscovery(WifiP2pConfig config) {
562618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff        if (config == null) return false;
563618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff
564618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff        switch (config.wps.setup) {
565618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff            case WpsInfo.PBC:
566618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " pbc");
567618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff            case WpsInfo.DISPLAY:
568618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                //We are doing display, so provision discovery is keypad
569618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " keypad");
570618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff            case WpsInfo.KEYPAD:
571618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                //We are doing keypad, so provision discovery is display
572618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " display");
573618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff            default:
574618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                break;
575618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff        }
576618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff        return false;
577618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff    }
578618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff
579fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pGroupAdd() {
5802b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_GROUP_ADD");
58155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
58255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
583fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pGroupRemove(String iface) {
58486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        if (TextUtils.isEmpty(iface)) return false;
5852b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_GROUP_REMOVE " + iface);
58655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
58755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
588fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pReject(String deviceAddress) {
5892b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_REJECT " + deviceAddress);
59055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
59155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
59255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    /* Invite a peer to a group */
593fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pInvite(WifiP2pGroup group, String deviceAddress) {
59486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        if (TextUtils.isEmpty(deviceAddress)) return false;
595ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff
596ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        if (group == null) {
597ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff            return doBooleanCommand("P2P_INVITE peer=" + deviceAddress);
598ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        } else {
599ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff            return doBooleanCommand("P2P_INVITE group=" + group.getInterface()
600ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff                    + " peer=" + deviceAddress + " go_dev_addr=" + group.getOwner().deviceAddress);
601ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        }
602ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff    }
603ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff
604ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff    /* Reinvoke a persistent connection */
605fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public boolean p2pReinvoke(int netId, String deviceAddress) {
60686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff        if (TextUtils.isEmpty(deviceAddress) || netId < 0) return false;
607ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff
608ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        return doBooleanCommand("P2P_INVITE persistent=" + netId + " peer=" + deviceAddress);
60955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
6108c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync
611ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff
612fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String p2pGetDeviceAddress() {
6131f095869536472c178046bb63c59947508eac4a6Irfan Sheriff        String status = status();
6144be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        if (status == null) return "";
6154be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff
6164be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        String[] tokens = status.split("\n");
6174be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        for (String token : tokens) {
6184be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff            if (token.startsWith("p2p_device_address=")) {
6194be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff                String[] nameValue = token.split("=");
6204be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff                if (nameValue.length != 2) break;
6214be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff                return nameValue[1];
6224be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff            }
6234be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        }
6244be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        return "";
6254be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff    }
6264be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff
62761472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga    public boolean isGroupOwner(String deviceAddress) {
62861472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga        /* BSS returns details only for a GO */
62961472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga        String bssInfo = doStringCommand("BSS p2p_dev_addr=" + deviceAddress);
63061472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga        if (TextUtils.isEmpty(bssInfo)) return false;
63161472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga        return true;
63261472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga    }
63361472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga
634fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff    public String p2pPeer(String deviceAddress) {
6358c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        return doStringCommand("P2P_PEER " + deviceAddress);
6368c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync    }
63721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
63821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public boolean p2pServiceAdd(WifiP2pServiceInfo servInfo) {
63921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        /*
64021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * P2P_SERVICE_ADD bonjour <query hexdump> <RDATA hexdump>
64121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * P2P_SERVICE_ADD upnp <version hex> <service>
64221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         *
64321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * e.g)
64421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * [Bonjour]
64521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * # IP Printing over TCP (PTR) (RDATA=MyPrinter._ipp._tcp.local.)
64621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * P2P_SERVICE_ADD bonjour 045f697070c00c000c01 094d795072696e746572c027
64721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * # IP Printing over TCP (TXT) (RDATA=txtvers=1,pdl=application/postscript)
64821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * P2P_SERVICE_ADD bonjour 096d797072696e746572045f697070c00c001001
64921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         *  09747874766572733d311a70646c3d6170706c69636174696f6e2f706f7374736372797074
65021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         *
65121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * [UPnP]
65221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012
65321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice
65421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp
65521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * -org:device:InternetGatewayDevice:1
65621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9322-123456789012::urn:schemas-upnp
65721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * -org:service:ContentDirectory:2
65821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         */
65921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        for (String s : servInfo.getSupplicantQueryList()) {
66021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            String command = "P2P_SERVICE_ADD";
66121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            command += (" " + s);
66221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            if (!doBooleanCommand(command)) {
66321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                return false;
66421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
66521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
66621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return true;
66721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
66821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
66921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public boolean p2pServiceDel(WifiP2pServiceInfo servInfo) {
67021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        /*
67121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * P2P_SERVICE_DEL bonjour <query hexdump>
67221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * P2P_SERVICE_DEL upnp <version hex> <service>
67321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         */
67421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        for (String s : servInfo.getSupplicantQueryList()) {
67521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            String command = "P2P_SERVICE_DEL ";
67621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
67721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            String[] data = s.split(" ");
67821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            if (data.length < 2) {
67921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                return false;
68021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
68121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            if ("upnp".equals(data[0])) {
68221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                command += s;
68321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            } else if ("bonjour".equals(data[0])) {
68421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                command += data[0];
68521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                command += (" " + data[1]);
68621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            } else {
68721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                return false;
68821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
68921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            if (!doBooleanCommand(command)) {
69021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                return false;
69121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
69221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
69321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return true;
69421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
69521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
69621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public boolean p2pServiceFlush() {
69721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return doBooleanCommand("P2P_SERVICE_FLUSH");
69821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
69921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
70021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public String p2pServDiscReq(String addr, String query) {
70121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        String command = "P2P_SERV_DISC_REQ";
70221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        command += (" " + addr);
70321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        command += (" " + query);
70421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
70521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return doStringCommand(command);
70621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
70721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
70821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public boolean p2pServDiscCancelReq(String id) {
70921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return doBooleanCommand("P2P_SERV_DISC_CANCEL_REQ " + id);
71021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
712