WifiNative.java revision e2639d782eef1365a98dbd2639be23a6dd06e691
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 44555bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff public boolean setP2pGroupIdle(String iface, int time) { 44655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff return doBooleanCommand("SET interface=" + iface + " 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) { 47055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff return doBooleanCommand("P2P_SET conc_priority " + 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 539ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (joinExistingGroup) args.add("join"); 54055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 541bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff //TODO: This can be adapted based on device plugged in state and 542bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff //device battery state 5432b8edd0c485f74067605c19983e3e7f44b20ec50repo sync int groupOwnerIntent = config.groupOwnerIntent; 5442b8edd0c485f74067605c19983e3e7f44b20ec50repo sync if (groupOwnerIntent < 0 || groupOwnerIntent > 15) { 545fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff groupOwnerIntent = DEFAULT_GROUP_OWNER_INTENT; 5462b8edd0c485f74067605c19983e3e7f44b20ec50repo sync } 5472b8edd0c485f74067605c19983e3e7f44b20ec50repo sync args.add("go_intent=" + groupOwnerIntent); 54855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 5492b8edd0c485f74067605c19983e3e7f44b20ec50repo sync String command = "P2P_CONNECT "; 55055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync for (String s : args) command += s + " "; 55155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 5522b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doStringCommand(command); 55355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 55455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 555fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public boolean p2pCancelConnect() { 556651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff return doBooleanCommand("P2P_CANCEL"); 557651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff } 558651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 559fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public boolean p2pProvisionDiscovery(WifiP2pConfig config) { 560618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (config == null) return false; 561618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 562618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff switch (config.wps.setup) { 563618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WpsInfo.PBC: 564618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " pbc"); 565618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WpsInfo.DISPLAY: 566618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //We are doing display, so provision discovery is keypad 567618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " keypad"); 568618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WpsInfo.KEYPAD: 569618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //We are doing keypad, so provision discovery is display 570618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " display"); 571618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff default: 572618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 573618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 574618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return false; 575618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 576618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 577fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public boolean p2pGroupAdd() { 5782b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_GROUP_ADD"); 57955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 58055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 581fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public boolean p2pGroupRemove(String iface) { 58286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff if (TextUtils.isEmpty(iface)) return false; 5832b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_GROUP_REMOVE " + iface); 58455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 58555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 586fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public boolean p2pReject(String deviceAddress) { 5872b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_REJECT " + deviceAddress); 58855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 58955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 59055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /* Invite a peer to a group */ 591fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public boolean p2pInvite(WifiP2pGroup group, String deviceAddress) { 59286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff if (TextUtils.isEmpty(deviceAddress)) return false; 593ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 594ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (group == null) { 595ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff return doBooleanCommand("P2P_INVITE peer=" + deviceAddress); 596ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 597ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff return doBooleanCommand("P2P_INVITE group=" + group.getInterface() 598ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff + " peer=" + deviceAddress + " go_dev_addr=" + group.getOwner().deviceAddress); 599ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 600ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 601ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 602ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff /* Reinvoke a persistent connection */ 603fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public boolean p2pReinvoke(int netId, String deviceAddress) { 60486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff if (TextUtils.isEmpty(deviceAddress) || netId < 0) return false; 605ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 606ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff return doBooleanCommand("P2P_INVITE persistent=" + netId + " peer=" + deviceAddress); 60755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 6088c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync 609ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 610fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public String p2pGetDeviceAddress() { 6111f095869536472c178046bb63c59947508eac4a6Irfan Sheriff String status = status(); 6124be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff if (status == null) return ""; 6134be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 6144be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff String[] tokens = status.split("\n"); 6154be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff for (String token : tokens) { 6164be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff if (token.startsWith("p2p_device_address=")) { 6174be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff String[] nameValue = token.split("="); 6184be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff if (nameValue.length != 2) break; 6194be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff return nameValue[1]; 6204be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 6214be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 6224be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff return ""; 6234be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 6244be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 62561472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga public boolean isGroupOwner(String deviceAddress) { 62661472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga /* BSS returns details only for a GO */ 62761472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga String bssInfo = doStringCommand("BSS p2p_dev_addr=" + deviceAddress); 62861472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga if (TextUtils.isEmpty(bssInfo)) return false; 62961472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga return true; 63061472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga } 63161472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga 632fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public String p2pPeer(String deviceAddress) { 6338c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync return doStringCommand("P2P_PEER " + deviceAddress); 6348c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync } 63521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 63621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public boolean p2pServiceAdd(WifiP2pServiceInfo servInfo) { 63721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* 63821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * P2P_SERVICE_ADD bonjour <query hexdump> <RDATA hexdump> 63921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * P2P_SERVICE_ADD upnp <version hex> <service> 64021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 64121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * e.g) 64221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * [Bonjour] 64321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * # IP Printing over TCP (PTR) (RDATA=MyPrinter._ipp._tcp.local.) 64421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * P2P_SERVICE_ADD bonjour 045f697070c00c000c01 094d795072696e746572c027 64521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * # IP Printing over TCP (TXT) (RDATA=txtvers=1,pdl=application/postscript) 64621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * P2P_SERVICE_ADD bonjour 096d797072696e746572045f697070c00c001001 64721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 09747874766572733d311a70646c3d6170706c69636174696f6e2f706f7374736372797074 64821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 64921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * [UPnP] 65021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012 65121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice 65221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp 65321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * -org:device:InternetGatewayDevice:1 65421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9322-123456789012::urn:schemas-upnp 65521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * -org:service:ContentDirectory:2 65621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 65721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (String s : servInfo.getSupplicantQueryList()) { 65821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff String command = "P2P_SERVICE_ADD"; 65921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff command += (" " + s); 66021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!doBooleanCommand(command)) { 66121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 66221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 66321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 66421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 66521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 66621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 66721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public boolean p2pServiceDel(WifiP2pServiceInfo servInfo) { 66821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* 66921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * P2P_SERVICE_DEL bonjour <query hexdump> 67021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * P2P_SERVICE_DEL upnp <version hex> <service> 67121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 67221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (String s : servInfo.getSupplicantQueryList()) { 67321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff String command = "P2P_SERVICE_DEL "; 67421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 67521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff String[] data = s.split(" "); 67621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (data.length < 2) { 67721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 67821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 67921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if ("upnp".equals(data[0])) { 68021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff command += s; 68121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } else if ("bonjour".equals(data[0])) { 68221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff command += data[0]; 68321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff command += (" " + data[1]); 68421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } else { 68521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 68621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 68721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!doBooleanCommand(command)) { 68821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 68921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 69021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 69121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 69221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 69321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 69421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public boolean p2pServiceFlush() { 69521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return doBooleanCommand("P2P_SERVICE_FLUSH"); 69621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 69721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 69821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public String p2pServDiscReq(String addr, String query) { 69921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff String command = "P2P_SERV_DISC_REQ"; 70021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff command += (" " + addr); 70121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff command += (" " + query); 70221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 70321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return doStringCommand(command); 70421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 70521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 70621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public boolean p2pServDiscCancelReq(String id) { 70721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return doBooleanCommand("P2P_SERV_DISC_CANCEL_REQ " + id); 70821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 710