com_android_server_wifi_WifiNative.cpp revision c591ab3b5ff4ac8dade1c7eb88ec83f3572f999b
1155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* 2155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Copyright 2008, The Android Open Source Project 3155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 4155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Licensed under the Apache License, Version 2.0 (the "License"); 5155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * you may not use this file except in compliance with the License. 6155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * You may obtain a copy of the License at 7155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 8155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * http://www.apache.org/licenses/LICENSE-2.0 9155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 10155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Unless required by applicable law or agreed to in writing, software 11155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * distributed under the License is distributed on an "AS IS" BASIS, 12155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * See the License for the specific language governing permissions and 14155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * limitations under the License. 15155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 16155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 17155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#define LOG_TAG "wifi" 18155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 19155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include "jni.h" 20155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <ScopedUtfChars.h> 21155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <utils/misc.h> 22155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <android_runtime/AndroidRuntime.h> 23155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <utils/Log.h> 24155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <utils/String16.h> 25e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#include <ctype.h> 26155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 27155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include "wifi.h" 287ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde#include "wifi_hal.h" 297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include "jni_helper.h" 30155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 31155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#define REPLY_BUF_SIZE 4096 // wpa_supplicant's maximum size. 32155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#define EVENT_BUF_SIZE 2048 33155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 34155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandenamespace android { 35155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 36155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jint DBG = false; 37155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 38155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic bool doCommand(JNIEnv* env, jstring javaCommand, 39155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char* reply, size_t reply_len) { 40155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ScopedUtfChars command(env, javaCommand); 41155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (command.c_str() == NULL) { 42155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; // ScopedUtfChars already threw on error. 43155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 44155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 45155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) { 46155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ALOGD("doCommand: %s", command.c_str()); 47155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 48155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 49155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande --reply_len; // Ensure we have room to add NUL termination. 50155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (::wifi_command(command.c_str(), reply, &reply_len) != 0) { 51155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 52155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 53155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 54155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Strip off trailing newline. 55155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (reply_len > 0 && reply[reply_len-1] == '\n') { 56155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande reply[reply_len-1] = '\0'; 57155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 58155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande reply[reply_len] = '\0'; 59155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 60155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return true; 61155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 62155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 63155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jint doIntCommand(JNIEnv* env, jstring javaCommand) { 64155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char reply[REPLY_BUF_SIZE]; 65155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!doCommand(env, javaCommand, reply, sizeof(reply))) { 66155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return -1; 67155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 68155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return static_cast<jint>(atoi(reply)); 69155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 70155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 71155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean doBooleanCommand(JNIEnv* env, jstring javaCommand) { 72155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char reply[REPLY_BUF_SIZE]; 73155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!doCommand(env, javaCommand, reply, sizeof(reply))) { 74155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return JNI_FALSE; 75155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 76155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (strcmp(reply, "OK") == 0); 77155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 78155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 79155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Send a command to the supplicant, and return the reply as a String. 80155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jstring doStringCommand(JNIEnv* env, jstring javaCommand) { 81155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char reply[REPLY_BUF_SIZE]; 82155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!doCommand(env, javaCommand, reply, sizeof(reply))) { 83155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NULL; 84155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 85155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return env->NewStringUTF(reply); 86155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 87155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 88155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_isDriverLoaded(JNIEnv* env, jobject) 89155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 90155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::is_wifi_driver_loaded() == 1); 91155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 92155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 93155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_loadDriver(JNIEnv* env, jobject) 94155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 95155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_load_driver() == 0); 96155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 97155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 98155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_unloadDriver(JNIEnv* env, jobject) 99155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 100155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_unload_driver() == 0); 101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_startSupplicant(JNIEnv* env, jobject, jboolean p2pSupported) 104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_start_supplicant(p2pSupported) == 0); 106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 107155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 108155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_killSupplicant(JNIEnv* env, jobject, jboolean p2pSupported) 109155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_stop_supplicant(p2pSupported) == 0); 111155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 112155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject) 114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 115155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_connect_to_supplicant() == 0); 116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 117155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 118155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic void android_net_wifi_closeSupplicantConnection(JNIEnv* env, jobject) 119155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 120155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ::wifi_close_supplicant_connection(); 121155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 122155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 123155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject) 124155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char buf[EVENT_BUF_SIZE]; 126155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int nread = ::wifi_wait_for_event(buf, sizeof buf); 127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (nread > 0) { 128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return env->NewStringUTF(buf); 129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NULL; 131155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jobject, jstring javaCommand) { 135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return doBooleanCommand(env, javaCommand); 136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jint android_net_wifi_doIntCommand(JNIEnv* env, jobject, jstring javaCommand) { 139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return doIntCommand(env, javaCommand); 140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 141155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 142155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jstring android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring javaCommand) { 143155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return doStringCommand(env,javaCommand); 144155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 145155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1467f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde/* wifi_hal <==> WifiNative bridge */ 1477f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 148b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jclass mCls; /* saved WifiNative object */ 1497f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndestatic JavaVM *mVM; /* saved JVM pointer */ 1507f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 151aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallestatic const char *WifiHandleVarName = "sWifiHalHandle"; 152aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallestatic const char *WifiIfaceHandleVarName = "sWifiIfaceHandles"; 1537f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndestatic jmethodID OnScanResultsMethodID; 1547f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 1557f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndestatic JNIEnv *getEnv() { 1567f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde JNIEnv *env = NULL; 1577f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 1587f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return env; 1597f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 1607f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 161b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic wifi_handle getWifiHandle(JNIEnv *env, jclass cls) { 162b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande return (wifi_handle) getStaticLongField(env, cls, WifiHandleVarName); 1637f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 1647f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 165b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic wifi_interface_handle getIfaceHandle(JNIEnv *env, jclass cls, jint index) { 166b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande return (wifi_interface_handle) getStaticLongArrayField(env, cls, WifiIfaceHandleVarName, index); 1677f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 1687f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 169b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpandestatic jobject createScanResult(JNIEnv *env, wifi_scan_result *result) { 170f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 171b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande // ALOGD("creating scan result"); 172f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 173f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 174f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde if (scanResult == NULL) { 175f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGE("Error in creating scan result"); 176f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde return NULL; 177f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde } 178f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 179b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande // ALOGD("setting SSID to %s", result.ssid); 180b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setStringField(env, scanResult, "SSID", result->ssid); 181f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 182f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde char bssid[32]; 183b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result->bssid[0], result->bssid[1], 184b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande result->bssid[2], result->bssid[3], result->bssid[4], result->bssid[5]); 185f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 186f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde setStringField(env, scanResult, "BSSID", bssid); 187f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 188b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setIntField(env, scanResult, "level", result->rssi); 189b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setIntField(env, scanResult, "frequency", result->channel); 190b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setLongField(env, scanResult, "timestamp", result->ts); 191f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 192f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde return scanResult; 193f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde} 194f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 195b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jboolean android_net_wifi_startHal(JNIEnv* env, jclass cls) { 196b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 197aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1987ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde if (halHandle == NULL) { 1997ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde wifi_error res = wifi_initialize(&halHandle); 2007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (res == WIFI_SUCCESS) { 201b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongField(env, cls, WifiHandleVarName, (jlong)halHandle); 202aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGD("Did set static halHandle = %p", halHandle); 2037f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2047f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde env->GetJavaVM(&mVM); 205b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mCls = (jclass) env->NewGlobalRef(cls); 206b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("halHandle = %p, mVM = %p, mCls = %p", halHandle, mVM, mCls); 2077ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde return res == WIFI_SUCCESS; 2087f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 2097f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return true; 2107ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde } 2117ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 2127ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 2137ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapndevoid android_net_wifi_hal_cleaned_up_handler(wifi_handle handle) { 2147ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde ALOGD("In wifi cleaned up handler"); 2157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 2167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde JNIEnv * env = getEnv(); 217b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongField(env, mCls, WifiHandleVarName, 0); 218b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande env->DeleteGlobalRef(mCls); 219b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mCls = NULL; 2207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde mVM = NULL; 2217ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 2227ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 223b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic void android_net_wifi_stopHal(JNIEnv* env, jclass cls) { 2247ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde ALOGD("In wifi stop Hal"); 225b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 2267ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde wifi_cleanup(halHandle, android_net_wifi_hal_cleaned_up_handler); 2277ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 2287ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 229b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic void android_net_wifi_waitForHalEvents(JNIEnv* env, jclass cls) { 2307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 231b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("waitForHalEvents called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 2327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 233b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 2347ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde wifi_event_loop(halHandle); 2357ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 2367ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 237b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic int android_net_wifi_getInterfaces(JNIEnv *env, jclass cls) { 2387f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde int n = 0; 239b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 2407f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde wifi_interface_handle *ifaceHandles = NULL; 2417f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde int result = wifi_get_ifaces(halHandle, &n, &ifaceHandles); 2427f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (result < 0) { 2437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return result; 2447f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2457f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 24607ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande if (n < 0) { 24707ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande THROW(env, "android_net_wifi_getInterfaces no interfaces"); 248aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 249aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 250aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 251aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (ifaceHandles == NULL) { 252aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle THROW(env, "android_net_wifi_getInterfaces null interface array"); 253aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 254aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 255aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 25607ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande if (n > 8) { 25707ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande THROW(env, "Too many interfaces"); 25807ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande return 0; 25907ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande } 26007ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande 2617f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlongArray array = (env)->NewLongArray(n); 2627f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (array == NULL) { 2637f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing array"); 2647f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return 0; 2657f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2667f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 2677f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlong elems[8]; 2687f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde for (int i = 0; i < n; i++) { 2697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde elems[i] = reinterpret_cast<jlong>(ifaceHandles[i]); 2707f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2717f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde env->SetLongArrayRegion(array, 0, n, elems); 272b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongArrayField(env, cls, WifiIfaceHandleVarName, array); 2737f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 2747f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return (result < 0) ? result : n; 2757f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 2767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 277b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jstring android_net_wifi_getInterfaceName(JNIEnv *env, jclass cls, jint i) { 2787f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde char buf[EVENT_BUF_SIZE]; 2797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 280b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande jlong value = getStaticLongArrayField(env, cls, WifiIfaceHandleVarName, i); 2817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde wifi_interface_handle handle = (wifi_interface_handle) value; 2827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde int result = ::wifi_get_iface_name(handle, buf, sizeof(buf)); 2837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (result < 0) { 2847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return NULL; 2857f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 2867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return env->NewStringUTF(buf); 2877f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 2887f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 2897f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 290b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 291766cb4b1fa3b93c146952eacbf6756f67f172ec1Vinit Deshapndestatic void onScanResultsAvailable(wifi_request_id id, unsigned num_results) { 292766cb4b1fa3b93c146952eacbf6756f67f172ec1Vinit Deshapnde 2937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde JNIEnv *env = NULL; 2947f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 2957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 296b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("onScanResultsAvailable called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 297766cb4b1fa3b93c146952eacbf6756f67f172ec1Vinit Deshapnde 298b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onScanResultsAvailable", "(I)V", id); 299e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 300e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 301b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpandestatic void onScanEvent(wifi_scan_event event, unsigned status) { 302b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande JNIEnv *env = NULL; 303b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande mVM->AttachCurrentThread(&env, NULL); 304b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 305b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande ALOGD("onScanStatus called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 306b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 307b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande reportEvent(env, mCls, "onScanStatus", "(I)V", status); 308b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande} 309b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 310f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapndestatic void onFullScanResult(wifi_request_id id, wifi_scan_result *result) { 311f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 312f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde JNIEnv *env = NULL; 313f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 314f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 315b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("onFullScanResult called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 316f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 317b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande jobject scanResult = createScanResult(env, result); 318f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 319f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGD("Creating a byte array of length %d", result->ie_length); 320f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 321f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde jbyteArray elements = env->NewByteArray(result->ie_length); 322f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde if (elements == NULL) { 323f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGE("Error in allocating array"); 324f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde return; 325f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde } 326f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 327f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGE("Setting byte array"); 328f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 329f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde jbyte *bytes = (jbyte *)&(result->ie_data[0]); 330f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde env->SetByteArrayRegion(elements, 0, result->ie_length, bytes); 331f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 332f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGE("Returning result"); 333f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 334b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onFullScanResult", "(ILandroid/net/wifi/ScanResult;[B)V", id, 335f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde scanResult, elements); 336b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 337b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande env->DeleteLocalRef(scanResult); 338b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande env->DeleteLocalRef(elements); 339f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde} 340f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 341e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_startScan( 342b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject settings) { 343e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 344b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 345e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("starting scan on interface[%d] = %p", iface, handle); 346e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 347e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_scan_cmd_params params; 348e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(¶ms, 0, sizeof(params)); 349aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 350e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.base_period = getIntField(env, settings, "base_period_ms"); 351e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.max_ap_per_scan = getIntField(env, settings, "max_ap_per_scan"); 352c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande params.report_threshold_percent = getIntField(env, settings, "report_threshold_percent"); 353c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande params.report_threshold_num_scans = getIntField(env, settings, "report_threshold_num_scans"); 354aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 355c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGD("Initialized common fields %d, %d, %d, %d", params.base_period, params.max_ap_per_scan, 356c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande params.report_threshold_percent, params.report_threshold_num_scans); 357e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 358e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *bucket_array_type = "[Lcom/android/server/wifi/WifiNative$BucketSettings;"; 359e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *channel_array_type = "[Lcom/android/server/wifi/WifiNative$ChannelSettings;"; 360aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 361e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray buckets = (jobjectArray)getObjectField(env, settings, "buckets", bucket_array_type); 362e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.num_buckets = getIntField(env, settings, "num_buckets"); 363aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 364e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized num_buckets to %d", params.num_buckets); 365e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 366e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (int i = 0; i < params.num_buckets; i++) { 367e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject bucket = getObjectArrayField(env, settings, "buckets", bucket_array_type, i); 368aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 369e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].bucket = getIntField(env, bucket, "bucket"); 370e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].band = (wifi_band) getIntField(env, bucket, "band"); 371e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].period = getIntField(env, bucket, "period_ms"); 372aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 373e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized common bucket fields %d:%d:%d", params.buckets[i].bucket, 374e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].band, params.buckets[i].period); 375e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 376e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde int report_events = getIntField(env, bucket, "report_events"); 377e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].report_events = report_events; 378aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 379e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized report events to %d", params.buckets[i].report_events); 380e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 381e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray channels = (jobjectArray)getObjectField( 382e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env, bucket, "channels", channel_array_type); 383aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 384e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].num_channels = getIntField(env, bucket, "num_channels"); 385e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized num_channels to %d", params.buckets[i].num_channels); 386e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 387e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (int j = 0; j < params.buckets[i].num_channels; j++) { 388e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject channel = getObjectArrayField(env, bucket, "channels", channel_array_type, j); 389aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 390e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].channels[j].channel = getIntField(env, channel, "frequency"); 391e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].channels[j].dwellTimeMs = getIntField(env, channel, "dwell_time_ms"); 392aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 393e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde bool passive = getBoolField(env, channel, "passive"); 394e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].channels[j].passive = (passive ? 1 : 0); 395e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 396e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized channel %d", params.buckets[i].channels[j].channel); 397e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 398e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 399e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 400e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized all fields"); 401e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 402e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_scan_result_handler handler; 403e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&handler, 0, sizeof(handler)); 404e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_scan_results_available = &onScanResultsAvailable; 405f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde handler.on_full_scan_result = &onFullScanResult; 406b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande handler.on_scan_event = &onScanEvent; 407e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 408e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return wifi_start_gscan(id, handle, params, handler) == WIFI_SUCCESS; 409e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 410e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 411b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jboolean android_net_wifi_stopScan(JNIEnv *env, jclass cls, jint iface, jint id) { 412b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 413e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("stopping scan on interface[%d] = %p", iface, handle); 414e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 415e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return wifi_stop_gscan(id, handle) == WIFI_SUCCESS; 416e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 417e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 418c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpandestatic int compare_scan_result_timestamp(const void *v1, const void *v2) { 419c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande const wifi_scan_result *result1 = static_cast<const wifi_scan_result *>(v1); 420c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande const wifi_scan_result *result2 = static_cast<const wifi_scan_result *>(v2); 421c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return result1->ts - result2->ts; 422c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande} 423c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 424e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jobject android_net_wifi_getScanResults( 425b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jboolean flush) { 426e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 427c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande wifi_cached_scan_results scan_data[64]; 428c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande int num_scan_data = 64; 429e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 430b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 431e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("getting scan results on interface[%d] = %p", iface, handle); 432c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 433c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande byte b = flush ? 0 : 0xFF; 434c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande int result = wifi_get_cached_gscan_results(handle, b, num_scan_data, scan_data, &num_scan_data); 435e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (result == WIFI_SUCCESS) { 436c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobjectArray scanData = createObjectArray(env, 437c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande "android/net/wifi/WifiScanner$ScanData", num_scan_data); 438c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanData == NULL) { 439c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in allocating array of scanData"); 440e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 441e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 442e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 443c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande for (int i = 0; i < num_scan_data; i++) { 444c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 445c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobject data = createObject(env, "android/net/wifi/WifiScanner$ScanData"); 446c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (data == NULL) { 447c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in allocating scanData"); 448c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return NULL; 449c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 450e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 451c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, data, "mId", scan_data[i].scan_id); 452c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, data, "mFlags", scan_data[i].flags); 453e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 454c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande /* sort all scan results by timestamp */ 455c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande qsort(scan_data[i].results, scan_data[i].num_results, 456c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande sizeof(wifi_scan_result), compare_scan_result_timestamp); 457c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 458c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobjectArray scanResults = createObjectArray(env, 459c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande "android/net/wifi/ScanResult", scan_data[i].num_results); 460c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanResults == NULL) { 461c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in allocating scanResult array"); 462e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 463e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 464e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 465c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande wifi_scan_result *results = scan_data[i].results; 466c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande for (int j = 0; j < scan_data[i].num_results; j++) { 467c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 468c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 469c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanResult == NULL) { 470c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in creating scan result"); 471c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return NULL; 472c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 4737f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 474c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setStringField(env, scanResult, "SSID", results[j].ssid); 475e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 476c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande char bssid[32]; 477c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[j].bssid[0], 478c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande results[j].bssid[1], results[j].bssid[2], results[j].bssid[3], 479c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande results[j].bssid[4], results[j].bssid[5]); 480e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 481c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setStringField(env, scanResult, "BSSID", bssid); 482c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 483c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, scanResult, "level", results[j].rssi); 484c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, scanResult, "frequency", results[j].channel); 485c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setLongField(env, scanResult, "timestamp", results[j].ts); 486c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 487c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande env->SetObjectArrayElement(scanResults, j, scanResult); 488c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande env->DeleteLocalRef(scanResult); 489c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 490e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 491c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setObjectField(env, data, "mResults", "[Landroid/net/wifi/ScanResult;", scanResults); 492c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande env->SetObjectArrayElement(scanData, i, data); 493e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 494e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 495c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return scanData; 496e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } else { 497e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 498e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 499e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 500e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 501e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 502e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_getScanCapabilities( 503b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jobject capabilities) { 504e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 505b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 506e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("getting scan capabilities on interface[%d] = %p", iface, handle); 507e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 508e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_gscan_capabilities c; 509e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&c, 0, sizeof(c)); 510e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde int result = wifi_get_gscan_capabilities(handle, &c); 511e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (result != WIFI_SUCCESS) { 512e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("failed to get capabilities : %d", result); 513e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return JNI_FALSE; 514e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 515e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 516e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_scan_cache_size", c.max_scan_cache_size); 517e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_scan_buckets", c.max_scan_buckets); 518e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_ap_cache_per_scan", c.max_ap_cache_per_scan); 519e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_rssi_sample_size", c.max_rssi_sample_size); 520e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_scan_reporting_threshold", c.max_scan_reporting_threshold); 521e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_hotlist_aps", c.max_hotlist_aps); 522e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_significant_wifi_change_aps", 523e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde c.max_significant_wifi_change_aps); 524e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 525e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return JNI_TRUE; 526e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 527e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 528e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 529e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic byte parseHexChar(char ch) { 530e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (isdigit(ch)) 531e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - '0'; 532e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else if ('A' <= ch && ch <= 'F') 533e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - 'A' + 10; 534e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else if ('a' <= ch && ch <= 'f') 535e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - 'a' + 10; 536e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else { 537e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("invalid character in bssid %c", ch); 538e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return 0; 539e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 540e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 541e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 542e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic byte parseHexByte(const char * &str) { 543e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde byte b = parseHexChar(str[0]); 544e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (str[1] == ':' || str[1] == '\0') { 545e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde str += 2; 546e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return b; 547e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } else { 548e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde b = b << 4 | parseHexChar(str[1]); 549e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde str += 3; 550e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return b; 551e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 552e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 553e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 554e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic void parseMacAddress(const char *str, mac_addr addr) { 555e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[0] = parseHexByte(str); 556e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[1] = parseHexByte(str); 557e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2] = parseHexByte(str); 558e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[3] = parseHexByte(str); 559e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[4] = parseHexByte(str); 560e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[5] = parseHexByte(str); 561e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 562e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 563143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic bool parseMacAddress(JNIEnv *env, jobject obj, mac_addr addr) { 564143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jstring macAddrString = (jstring) getObjectField( 565143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande env, obj, "bssid", "Ljava/lang/String;"); 566143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 567143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (macAddrString == NULL) { 568143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error getting bssid field"); 569143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return false; 570143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 571143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 572143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande const char *bssid = env->GetStringUTFChars(macAddrString, NULL); 573143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (bssid == NULL) { 574143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error getting bssid"); 575143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return false; 576143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 577143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 578143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande parseMacAddress(bssid, addr); 579143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return true; 580143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 581143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 582e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic void onHotlistApFound(wifi_request_id id, 583e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde unsigned num_results, wifi_scan_result *results) { 584e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 585e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde JNIEnv *env = NULL; 586e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 587e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 588e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("onHotlistApFound called, vm = %p, obj = %p, env = %p, num_results = %d", 589b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mVM, mCls, env, num_results); 590e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 591e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); 5927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (clsScanResult == NULL) { 5937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in accessing class"); 5947f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 5957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 5967f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 5977f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); 5987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (scanResults == NULL) { 5997f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in allocating array"); 6007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 6017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 6027f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 6037f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde for (unsigned i = 0; i < num_results; i++) { 6047f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 605e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 6067f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (scanResult == NULL) { 6077f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in creating scan result"); 6087f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 6097f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 6107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 6117f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setStringField(env, scanResult, "SSID", results[i].ssid); 6127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 6137f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde char bssid[32]; 614e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], 6157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde results[i].bssid[2], results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); 6167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 6177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setStringField(env, scanResult, "BSSID", bssid); 6187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 6197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setIntField(env, scanResult, "level", results[i].rssi); 620e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, scanResult, "frequency", results[i].channel); 6217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setLongField(env, scanResult, "timestamp", results[i].ts); 622e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 623e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->SetObjectArrayElement(scanResults, i, scanResult); 624e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 625e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Found AP %32s %s", results[i].ssid, bssid); 626e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 627e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 628b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onHotlistApFound", "(I[Landroid/net/wifi/ScanResult;)V", 629e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde id, scanResults); 630e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 631e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 632e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpandestatic void onHotlistApLost(wifi_request_id id, 633e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande unsigned num_results, wifi_scan_result *results) { 634e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 635e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande JNIEnv *env = NULL; 636e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande mVM->AttachCurrentThread(&env, NULL); 637e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 638e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGD("onHotlistApLost called, vm = %p, obj = %p, env = %p, num_results = %d", 639e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande mVM, mCls, env, num_results); 640e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 641e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); 642e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (clsScanResult == NULL) { 643e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGE("Error in accessing class"); 644e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 645e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 646e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 647e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); 648e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (scanResults == NULL) { 649e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGE("Error in allocating array"); 650e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 651e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 652e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 653e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande for (unsigned i = 0; i < num_results; i++) { 654e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 655e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 656e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (scanResult == NULL) { 657e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGE("Error in creating scan result"); 658e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 659e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 660e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 661e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setStringField(env, scanResult, "SSID", results[i].ssid); 662e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 663e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande char bssid[32]; 664e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], 665e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande results[i].bssid[2], results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); 666e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 667e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setStringField(env, scanResult, "BSSID", bssid); 668e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 669e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setIntField(env, scanResult, "level", results[i].rssi); 670e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setIntField(env, scanResult, "frequency", results[i].channel); 671e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setLongField(env, scanResult, "timestamp", results[i].ts); 672e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 673e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande env->SetObjectArrayElement(scanResults, i, scanResult); 674e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 675e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGD("Lost AP %32s %s", results[i].ssid, bssid); 676e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 677e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 678e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande reportEvent(env, mCls, "onHotlistApLost", "(I[Landroid/net/wifi/ScanResult;)V", 679e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande id, scanResults); 680e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande} 681e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 682e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 683e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_setHotlist( 684b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject ap) { 685e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 686b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 687e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("setting hotlist on interface[%d] = %p", iface, handle); 688e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 689e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_bssid_hotlist_params params; 690e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(¶ms, 0, sizeof(params)); 691e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 692e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande params.lost_ap_sample_size = getIntField(env, ap, "apLostThreshold"); 693e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 694e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray array = (jobjectArray) getObjectField(env, ap, 695b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande "bssidInfos", "[Landroid/net/wifi/WifiScanner$BssidInfo;"); 696a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.num_ap = env->GetArrayLength(array); 697e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 698a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande if (params.num_ap == 0) { 699e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in accesing array"); 700e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 701e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 702e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 703a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande for (int i = 0; i < params.num_ap; i++) { 704e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject objAp = env->GetObjectArrayElement(array, i); 705e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 706e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jstring macAddrString = (jstring) getObjectField( 707e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env, objAp, "bssid", "Ljava/lang/String;"); 708e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (macAddrString == NULL) { 709e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid field"); 710e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 711e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 712e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 713e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *bssid = env->GetStringUTFChars(macAddrString, NULL); 714e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (bssid == NULL) { 715e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid"); 716e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 717e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 718a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande parseMacAddress(bssid, params.ap[i].bssid); 719e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 720e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mac_addr addr; 721a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande memcpy(addr, params.ap[i].bssid, sizeof(mac_addr)); 722e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 723e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssidOut[32]; 724e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde sprintf(bssidOut, "%0x:%0x:%0x:%0x:%0x:%0x", addr[0], addr[1], 725e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2], addr[3], addr[4], addr[5]); 726e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 727e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Added bssid %s", bssidOut); 728e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 729a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].low = getIntField(env, objAp, "low"); 730a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].high = getIntField(env, objAp, "high"); 731e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 732e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 733e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_hotlist_ap_found_handler handler; 734e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&handler, 0, sizeof(handler)); 735e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 736e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_hotlist_ap_found = &onHotlistApFound; 737e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande handler.on_hotlist_ap_lost = &onHotlistApLost; 738e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return wifi_set_bssid_hotlist(id, handle, params, handler) == WIFI_SUCCESS; 739e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 740e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 741e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_resetHotlist( 742b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id) { 743e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 744b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 745e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("resetting hotlist on interface[%d] = %p", iface, handle); 746e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 747e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return wifi_reset_bssid_hotlist(id, handle) == WIFI_SUCCESS; 748e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 749e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 750a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpandevoid onSignificantWifiChange(wifi_request_id id, 751a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande unsigned num_results, wifi_significant_change_result **results) { 752e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde JNIEnv *env = NULL; 753e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 754e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 755b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("onSignificantWifiChange called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 756e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 757e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); 758e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (clsScanResult == NULL) { 759e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in accessing class"); 760e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 761e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 762e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 763e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); 764e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (scanResults == NULL) { 765e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in allocating array"); 766e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 767e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 768e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 769e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (unsigned i = 0; i < num_results; i++) { 770e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 771a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande wifi_significant_change_result result = *(results[i]); 772a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande 773e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 774e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (scanResult == NULL) { 775e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in creating scan result"); 776e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 777e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 778e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 779a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande // setStringField(env, scanResult, "SSID", results[i].ssid); 780e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 781e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssid[32]; 782a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result.bssid[0], result.bssid[1], 783a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande result.bssid[2], result.bssid[3], result.bssid[4], result.bssid[5]); 784e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 785e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setStringField(env, scanResult, "BSSID", bssid); 786e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 7874dbfefd99e51ab1cca058026c90f8093b099198bVinit Deshpande setIntField(env, scanResult, "level", result.rssi[0]); 788a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande setIntField(env, scanResult, "frequency", result.channel); 789a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande // setLongField(env, scanResult, "timestamp", result.ts); 7907f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7917f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde env->SetObjectArrayElement(scanResults, i, scanResult); 7927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 7937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 794b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onSignificantWifiChange", "(I[Landroid/net/wifi/ScanResult;)V", 795e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde id, scanResults); 796e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 7977f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 7987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 799e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_trackSignificantWifiChange( 800b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject settings) { 8017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 802b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 803e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("tracking significant wifi change on interface[%d] = %p", iface, handle); 8047f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 805e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_significant_change_params params; 8067f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde memset(¶ms, 0, sizeof(params)); 8077f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 808e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.rssi_sample_size = getIntField(env, settings, "rssiSampleSize"); 809e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.lost_ap_sample_size = getIntField(env, settings, "lostApSampleSize"); 810e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.min_breaching = getIntField(env, settings, "minApsBreachingThreshold"); 811e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 812b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande const char *bssid_info_array_type = "[Landroid/net/wifi/WifiScanner$BssidInfo;"; 813b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande jobjectArray bssids = (jobjectArray)getObjectField( 814b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande env, settings, "bssidInfos", bssid_info_array_type); 815b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande params.num_ap = env->GetArrayLength(bssids); 816e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 817a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande if (params.num_ap == 0) { 818aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGE("Error in accessing array"); 819e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 820e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 821e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 822e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized common fields %d, %d, %d, %d", params.rssi_sample_size, 823a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.lost_ap_sample_size, params.min_breaching, params.num_ap); 824e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 825a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande for (int i = 0; i < params.num_ap; i++) { 826b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande jobject objAp = env->GetObjectArrayElement(bssids, i); 827e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 828e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jstring macAddrString = (jstring) getObjectField( 829e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env, objAp, "bssid", "Ljava/lang/String;"); 830e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (macAddrString == NULL) { 831e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid field"); 832e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 833e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 834e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 835e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *bssid = env->GetStringUTFChars(macAddrString, NULL); 836e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (bssid == NULL) { 837e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid"); 838e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 839e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 840e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 841e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mac_addr addr; 842e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde parseMacAddress(bssid, addr); 843a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande memcpy(params.ap[i].bssid, addr, sizeof(mac_addr)); 844e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 845e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssidOut[32]; 8464dbfefd99e51ab1cca058026c90f8093b099198bVinit Deshpande sprintf(bssidOut, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], 847e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2], addr[3], addr[4], addr[5]); 848e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 849a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].low = getIntField(env, objAp, "low"); 850a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].high = getIntField(env, objAp, "high"); 851e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 852a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande ALOGD("Added bssid %s, [%04d, %04d]", bssidOut, params.ap[i].low, params.ap[i].high); 853e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 854e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 855a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande ALOGD("Added %d bssids", params.num_ap); 856e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 857e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_significant_change_handler handler; 8587f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde memset(&handler, 0, sizeof(handler)); 8597f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 860e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_significant_change = &onSignificantWifiChange; 861e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return wifi_set_significant_change_handler(id, handle, params, handler) == WIFI_SUCCESS; 8627f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 8637f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 864e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_untrackSignificantWifiChange( 865b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id) { 866e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 867b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 868e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("resetting significant wifi change on interface[%d] = %p", iface, handle); 8697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 870e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return wifi_reset_significant_change_handler(id, handle) == WIFI_SUCCESS; 8717f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 8727ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 873aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallewifi_iface_stat link_stat; 874200e8ee5097134010a6edee8d031bb02ff7eeb5avandwallewifi_radio_stat radio_stat; // L release has support for only one radio 875aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 876aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallevoid onLinkStatsResults(wifi_request_id id, wifi_iface_stat *iface_stat, 877200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle int num_radios, wifi_radio_stat *radio_stats) 878aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{ 879200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle if (iface_stat != 0) { 880200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memcpy(&link_stat, iface_stat, sizeof(wifi_iface_stat)); 881200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } else { 882200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memset(&link_stat, 0, sizeof(wifi_iface_stat)); 883200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } 884200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 885200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle if (num_radios > 0 && radio_stats != 0) { 886200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memcpy(&radio_stat, radio_stats, sizeof(wifi_radio_stat)); 887200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } else { 888200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memset(&radio_stat, 0, sizeof(wifi_radio_stat)); 889200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } 890aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 891aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 892b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jobject android_net_wifi_getLinkLayerStats (JNIEnv *env, jclass cls, jint iface) { 893aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 894aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle wifi_stats_result_handler handler; 895aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle memset(&handler, 0, sizeof(handler)); 896aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle handler.on_link_stats_results = &onLinkStatsResults; 897b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 898aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle int result = wifi_get_link_stats(0, handle, handler); 899aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (result < 0) { 900200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle ALOGE("android_net_wifi_getLinkLayerStats: failed to get link statistics\n"); 901aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return NULL; 902aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 903aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 904aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jobject wifiLinkLayerStats = createObject(env, "android/net/wifi/WifiLinkLayerStats"); 905aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (wifiLinkLayerStats == NULL) { 906aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGE("Error in allocating wifiLinkLayerStats"); 907aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return NULL; 908aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 909aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 910aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setIntField(env, wifiLinkLayerStats, "beacon_rx", link_stat.beacon_rx); 911aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setIntField(env, wifiLinkLayerStats, "rssi_mgmt", link_stat.rssi_mgmt); 912aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_be", link_stat.ac[WIFI_AC_BE].rx_mpdu); 913aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_bk", link_stat.ac[WIFI_AC_BK].rx_mpdu); 914aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_vi", link_stat.ac[WIFI_AC_VI].rx_mpdu); 915aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_vo", link_stat.ac[WIFI_AC_VO].rx_mpdu); 916aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_be", link_stat.ac[WIFI_AC_BE].tx_mpdu); 917aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_bk", link_stat.ac[WIFI_AC_BK].tx_mpdu); 918aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_vi", link_stat.ac[WIFI_AC_VI].tx_mpdu); 919aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_vo", link_stat.ac[WIFI_AC_VO].tx_mpdu); 920aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_be", link_stat.ac[WIFI_AC_BE].mpdu_lost); 921aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_bk", link_stat.ac[WIFI_AC_BK].mpdu_lost); 922aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_vi", link_stat.ac[WIFI_AC_VI].mpdu_lost); 923aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_vo", link_stat.ac[WIFI_AC_VO].mpdu_lost); 924aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_be", link_stat.ac[WIFI_AC_BE].retries); 925aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_bk", link_stat.ac[WIFI_AC_BK].retries); 926aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_vi", link_stat.ac[WIFI_AC_VI].retries); 927aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_vo", link_stat.ac[WIFI_AC_VO].retries); 928aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 929200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 930200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "on_time", radio_stat.on_time); 931200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "tx_time", radio_stat.tx_time); 932200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "rx_time", radio_stat.rx_time); 933200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "on_time_scan", radio_stat.on_time_scan); 934200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 935aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return wifiLinkLayerStats; 936aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 937e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 938c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpandestatic jint android_net_wifi_getSupportedFeatures(JNIEnv *env, jclass cls, jint iface) { 939c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 940a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande feature_set set = 0; 941a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 942a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande wifi_error result = WIFI_SUCCESS; 943c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande /* 944a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande set = WIFI_FEATURE_INFRA 945a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_INFRA_5G 946a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_HOTSPOT 947a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_P2P 948a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_SOFT_AP 949a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_GSCAN 950a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_PNO 951a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_TDLS 952a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_EPR; 953c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande */ 954a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 955c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande result = wifi_get_supported_feature_set(handle, &set); 956a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande if (result == WIFI_SUCCESS) { 957c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande /* Temporary workaround for RTT capability */ 958c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande set = set | WIFI_FEATURE_D2AP_RTT; 959c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande ALOGD("wifi_get_supported_feature_set returned set = 0x%x", set); 960a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande return set; 961a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } else { 962c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande ALOGD("wifi_get_supported_feature_set returned error = 0x%x", result); 963a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande return 0; 964a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } 965a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande} 966a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 967143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic void onRttResults(wifi_request_id id, unsigned num_results, wifi_rtt_result results[]) { 968143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande JNIEnv *env = NULL; 969143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande mVM->AttachCurrentThread(&env, NULL); 970143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 971143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGD("onRttResults called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 972143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 973143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jclass clsRttResult = (env)->FindClass("android/net/wifi/RttManager$RttResult"); 974143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (clsRttResult == NULL) { 975143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error in accessing class"); 976143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 977143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 978143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 979143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jobjectArray rttResults = env->NewObjectArray(num_results, clsRttResult, NULL); 980143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (rttResults == NULL) { 981143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error in allocating array"); 982143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 983143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 984143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 985143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande for (unsigned i = 0; i < num_results; i++) { 986143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 987143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_rtt_result& result = results[i]; 988143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 989143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jobject rttResult = createObject(env, "android/net/wifi/RttManager$RttResult"); 990143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (rttResult == NULL) { 991143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error in creating rtt result"); 992143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 993143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 994143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 995143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande char bssid[32]; 996143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result.addr[0], result.addr[1], 997143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande result.addr[2], result.addr[3], result.addr[4], result.addr[5]); 998143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 999143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande setStringField(env, rttResult, "bssid", bssid); 100002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setIntField(env, rttResult, "status", result.status); 100102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setIntField(env, rttResult, "requestType", result.type); 100202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setLongField(env, rttResult, "ts", result.ts); 100302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setIntField(env, rttResult, "rssi", result.rssi); 100402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setIntField(env, rttResult, "rssi_spread", result.rssi_spread); 100502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setIntField(env, rttResult, "tx_rate", result.tx_rate.bitrate); 100602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setLongField(env, rttResult, "rtt_ns", result.rtt); 100702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setLongField(env, rttResult, "rtt_sd_ns", result.rtt_sd); 100802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setLongField(env, rttResult, "rtt_spread_ns", result.rtt_spread); 100902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setIntField(env, rttResult, "distance_cm", result.distance); 101002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setIntField(env, rttResult, "distance_sd_cm", result.distance_sd); 101102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande setIntField(env, rttResult, "distance_spread_cm", result.distance_spread); 1012143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1013143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande env->SetObjectArrayElement(rttResults, i, rttResult); 1014143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1015143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1016143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande reportEvent(env, mCls, "onRttResults", "(I[Landroid/net/wifi/RttManager$RttResult;)V", 1017143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande id, rttResults); 1018143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1019143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 102002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpandeconst int MaxRttConfigs = 16; 102102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 1022143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic jboolean android_net_wifi_requestRange( 1023143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject params) { 1024143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1025143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1026143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGD("sending rtt request [%d] = %p", id, handle); 1027143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 102802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande wifi_rtt_config configs[MaxRttConfigs]; 102902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande memset(&configs, 0, sizeof(configs)); 103002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 103102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande int len = env->GetArrayLength((jobjectArray)params); 103202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (len > MaxRttConfigs) { 103302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande return false; 103402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 103502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 103602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande for (int i = 0; i < len; i++) { 103702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 103802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande jobject param = env->GetObjectArrayElement((jobjectArray)params, i); 103902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (param == NULL) { 104002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande ALOGD("could not get element %d", i); 104102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande continue; 104202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1043143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 104402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande wifi_rtt_config &config = configs[i]; 104502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 104602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande parseMacAddress(env, param, config.addr); 104702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.type = (wifi_rtt_type)getIntField(env, param, "requestType"); 104802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.peer = (wifi_peer_type)getIntField(env, param, "deviceType"); 104902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.channel.center_freq = getIntField(env, param, "frequency"); 105002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.channel.width = (wifi_channel_width)getIntField(env, param, "channelWidth"); 105102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.num_samples_per_measurement = getIntField(env, param, "num_samples"); 105202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.num_retries_per_measurement = getIntField(env, param, "num_retries"); 105302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1054143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1055143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_rtt_event_handler handler; 1056143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande handler.on_rtt_results = &onRttResults; 1057143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 105802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande return wifi_rtt_range_request(id, handle, len, configs, handler) == WIFI_SUCCESS; 1059143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1060143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1061143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic jboolean android_net_wifi_cancelRange( 1062042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject params) { 1063143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1064143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1065143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGD("cancelling rtt request [%d] = %p", id, handle); 1066143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 106702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande mac_addr addrs[MaxRttConfigs]; 106802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande memset(&addrs, 0, sizeof(addrs)); 106902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 107002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande int len = env->GetArrayLength((jobjectArray)params); 107102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (len > MaxRttConfigs) { 107202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande return false; 107302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1074143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 107502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande for (int i = 0; i < len; i++) { 107602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 107702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande jobject param = env->GetObjectArrayElement((jobjectArray)params, i); 107802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (param == NULL) { 107902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande ALOGD("could not get element %d", i); 108002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande continue; 108102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 108202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 108302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande parseMacAddress(env, param, addrs[i]); 108402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1085143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 108602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande return wifi_rtt_range_cancel(id, handle, len, addrs) == WIFI_SUCCESS; 1087143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1088143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1089042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpandestatic jboolean android_net_wifi_setScanningMacOui(JNIEnv *env, jclass cls, 1090042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande jint iface, jbyteArray param) { 1091042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1092042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1093042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGD("setting scan oui %p", handle); 1094042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1095042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande static const unsigned oui_len = 3; /* OUI is upper 3 bytes of mac_address */ 1096042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande int len = env->GetArrayLength(param); 1097042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande if (len != oui_len) { 1098042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGE("invalid oui length %d", len); 1099042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande return false; 1100042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande } 1101042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1102042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande jbyte* bytes = env->GetByteArrayElements(param, NULL); 1103042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande if (bytes == NULL) { 1104042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGE("failed to get array"); 1105042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande return false; 1106042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande } 1107042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1108042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande return wifi_set_scanning_mac_oui(handle, (byte *)bytes) == WIFI_SUCCESS; 1109042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande} 1110042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1111efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpandestatic jintArray android_net_wifi_getValidChannels(JNIEnv *env, jclass cls, 1112efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande jint iface, jint band) { 1113efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1114efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1115efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande ALOGD("getting valid channels %p", handle); 1116efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1117efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande static const int MaxChannels = 64; 1118efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande wifi_channel channels[64]; 1119efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande int num_channels = 0; 1120efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande wifi_error result = wifi_get_valid_channels(handle, band, MaxChannels, 1121efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande channels, &num_channels); 1122efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1123efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande if (result == WIFI_SUCCESS) { 1124efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande jintArray channelArray = env->NewIntArray(num_channels); 1125efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande if (channelArray == NULL) { 1126efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande ALOGE("failed to allocate channel list"); 1127efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return NULL; 1128efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } 1129efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1130efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande env->SetIntArrayRegion(channelArray, 0, num_channels, channels); 1131efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return channelArray; 1132efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } else { 1133efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande ALOGE("failed to get channel list : %d", result); 1134efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return NULL; 1135efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } 1136efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande} 1137efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 113890b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpandestatic jboolean android_net_wifi_setDfsFlag(JNIEnv *env, jclass cls, jint iface, jboolean dfs) { 113990b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 114090b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande ALOGD("setting dfs flag to %s, %p", dfs ? "true" : "false", handle); 114190b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande 114290b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande u32 nodfs = dfs ? 0 : 1; 114390b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande wifi_error result = wifi_set_nodfs_flag(handle, nodfs); 114490b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande return result == WIFI_SUCCESS; 114590b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande} 114690b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande 1147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// ---------------------------------------------------------------------------- 1148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1149155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* 1150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * JNI registration. 1151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic JNINativeMethod gWifiMethods[] = { 1153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* name, signature, funcPtr */ 1154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "loadDriver", "()Z", (void *)android_net_wifi_loadDriver }, 1156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "isDriverLoaded", "()Z", (void *)android_net_wifi_isDriverLoaded }, 1157155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "unloadDriver", "()Z", (void *)android_net_wifi_unloadDriver }, 1158155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "startSupplicant", "(Z)Z", (void *)android_net_wifi_startSupplicant }, 1159155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "killSupplicant", "(Z)Z", (void *)android_net_wifi_killSupplicant }, 1160155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "connectToSupplicantNative", "()Z", (void *)android_net_wifi_connectToSupplicant }, 1161155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "closeSupplicantConnectionNative", "()V", 1162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande (void *)android_net_wifi_closeSupplicantConnection }, 1163155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "waitForEventNative", "()Ljava/lang/String;", (void*)android_net_wifi_waitForEvent }, 1164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doBooleanCommandNative", "(Ljava/lang/String;)Z", (void*)android_net_wifi_doBooleanCommand }, 1165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doIntCommandNative", "(Ljava/lang/String;)I", (void*)android_net_wifi_doIntCommand }, 1166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doStringCommandNative", "(Ljava/lang/String;)Ljava/lang/String;", 1167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande (void*) android_net_wifi_doStringCommand }, 11687ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "startHalNative", "()Z", (void*) android_net_wifi_startHal }, 11697ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "stopHalNative", "()V", (void*) android_net_wifi_stopHal }, 11707ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "waitForHalEventNative", "()V", (void*) android_net_wifi_waitForHalEvents }, 11717f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde { "getInterfacesNative", "()I", (void*) android_net_wifi_getInterfaces}, 11727f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde { "getInterfaceNameNative", "(I)Ljava/lang/String;", (void*) android_net_wifi_getInterfaceName}, 1173e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "getScanCapabilitiesNative", "(ILcom/android/server/wifi/WifiNative$ScanCapabilities;)Z", 1174e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void *) android_net_wifi_getScanCapabilities}, 1175e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "startScanNative", "(IILcom/android/server/wifi/WifiNative$ScanSettings;)Z", 1176e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_startScan}, 1177e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "stopScanNative", "(II)Z", (void*) android_net_wifi_stopScan}, 1178c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande { "getScanResultsNative", "(IZ)[Landroid/net/wifi/WifiScanner$ScanData;", 1179e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void *) android_net_wifi_getScanResults}, 1180e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "setHotlistNative", "(IILandroid/net/wifi/WifiScanner$HotlistSettings;)Z", 1181e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_setHotlist}, 1182e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "resetHotlistNative", "(II)Z", (void*) android_net_wifi_resetHotlist}, 1183e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "trackSignificantWifiChangeNative", "(IILandroid/net/wifi/WifiScanner$WifiChangeSettings;)Z", 1184e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_trackSignificantWifiChange}, 1185e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "untrackSignificantWifiChangeNative", "(II)Z", 1186aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle (void*) android_net_wifi_untrackSignificantWifiChange}, 1187aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle { "getWifiLinkLayerStatsNative", "(I)Landroid/net/wifi/WifiLinkLayerStats;", 1188a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande (void*) android_net_wifi_getLinkLayerStats}, 1189c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande { "getSupportedFeatureSetNative", "(I)I", 1190143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande (void*) android_net_wifi_getSupportedFeatures}, 1191143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande { "requestRangeNative", "(II[Landroid/net/wifi/RttManager$RttParams;)Z", 1192143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande (void*) android_net_wifi_requestRange}, 1193143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande { "cancelRangeRequestNative", "(II[Landroid/net/wifi/RttManager$RttParams;)Z", 1194042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande (void*) android_net_wifi_cancelRange}, 119590b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande { "setScanningMacOuiNative", "(I[B)Z", (void*) android_net_wifi_setScanningMacOui}, 119690b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande { "getChannelsForBandNative", "(II)[I", (void*) android_net_wifi_getValidChannels}, 119790b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande { "setDfsFlagNative", "(IZ)Z", (void*) android_net_wifi_setDfsFlag } 1198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 1199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeint register_android_net_wifi_WifiNative(JNIEnv* env) { 1201155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return AndroidRuntime::registerNativeMethods(env, 1202155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com/android/server/wifi/WifiNative", gWifiMethods, NELEM(gWifiMethods)); 1203155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 1204155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1205155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1206155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* User to register native functions */ 1207155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeextern "C" 1208155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandejint Java_com_android_server_wifi_WifiNative_registerNatives(JNIEnv* env, jclass clazz) { 1209155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return AndroidRuntime::registerNativeMethods(env, 1210155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com/android/server/wifi/WifiNative", gWifiMethods, NELEM(gWifiMethods)); 1211155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 1212155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1213155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; // namespace android 1214