com_android_server_wifi_WifiNative.cpp revision ec61e7731968be994a23f2bd138f6761c8aea498
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> 26be3b27a3749af234b5fd7340aefb9f25060fb433xinhe#include <sys/socket.h> 27be3b27a3749af234b5fd7340aefb9f25060fb433xinhe#include <linux/if.h> 28155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 29155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include "wifi.h" 307ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde#include "wifi_hal.h" 317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include "jni_helper.h" 3212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe#include "rtt.h" 33ec61e7731968be994a23f2bd138f6761c8aea498xinhe#include "wifi_hal_stub.h" 34155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#define REPLY_BUF_SIZE 4096 // wpa_supplicant's maximum size. 35155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#define EVENT_BUF_SIZE 2048 36155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 37155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandenamespace android { 38155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 39155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jint DBG = false; 40155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 41ec61e7731968be994a23f2bd138f6761c8aea498xinhe//Please put all HAL function call here and call from the function table instead of directly call 42ec61e7731968be994a23f2bd138f6761c8aea498xinhestatic wifi_hal_fn hal_fn; 43ec61e7731968be994a23f2bd138f6761c8aea498xinheint init_wifi_hal_func_table(wifi_hal_fn *hal_fn) { 44ec61e7731968be994a23f2bd138f6761c8aea498xinhe if (hal_fn == NULL) { 45ec61e7731968be994a23f2bd138f6761c8aea498xinhe return -1; 46ec61e7731968be994a23f2bd138f6761c8aea498xinhe } 47ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_initialize = wifi_initialize_stub; 48ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_cleanup = wifi_cleanup_stub; 49ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_event_loop = wifi_event_loop_stub; 50ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_error_info = wifi_get_error_info_stub; 51ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_supported_feature_set = wifi_get_supported_feature_set_stub; 52ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_concurrency_matrix = wifi_get_concurrency_matrix_stub; 53ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_scanning_mac_oui = wifi_set_scanning_mac_oui_stub; 54ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_supported_channels = wifi_get_supported_channels_stub; 55ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_is_epr_supported = wifi_is_epr_supported_stub; 56ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_ifaces = wifi_get_ifaces_stub; 57ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_iface_name = wifi_get_iface_name_stub; 58ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_reset_iface_event_handler = wifi_reset_iface_event_handler_stub; 59ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_start_gscan = wifi_start_gscan_stub; 60ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_stop_gscan = wifi_stop_gscan_stub; 61ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_bssid_hotlist = wifi_set_bssid_hotlist_stub; 62ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_reset_bssid_hotlist = wifi_reset_bssid_hotlist_stub; 63ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_significant_change_handler = wifi_set_significant_change_handler_stub; 64ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_reset_significant_change_handler = wifi_reset_significant_change_handler_stub; 65ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_gscan_capabilities = wifi_get_gscan_capabilities_stub; 66ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_link_stats = wifi_set_link_stats_stub; 67ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_link_stats = wifi_get_link_stats_stub; 68ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_clear_link_stats = wifi_clear_link_stats_stub; 69ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_valid_channels = wifi_get_valid_channels_stub; 70ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_rtt_range_request = wifi_rtt_range_request_stub; 71ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_rtt_range_cancel = wifi_rtt_range_cancel_stub; 72ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_rtt_capabilities = wifi_get_rtt_capabilities_stub; 73ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_nodfs_flag = wifi_set_nodfs_flag_stub; 74ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_start_logging = wifi_start_logging_stub; 75ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_epno_list = wifi_set_epno_list_stub; 76ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_country_code = wifi_set_country_code_stub; 77ec61e7731968be994a23f2bd138f6761c8aea498xinhe 78ec61e7731968be994a23f2bd138f6761c8aea498xinhe return 0; 79ec61e7731968be994a23f2bd138f6761c8aea498xinhe} 80ec61e7731968be994a23f2bd138f6761c8aea498xinhe 81155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic bool doCommand(JNIEnv* env, jstring javaCommand, 82155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char* reply, size_t reply_len) { 83155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ScopedUtfChars command(env, javaCommand); 84155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (command.c_str() == NULL) { 85155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; // ScopedUtfChars already threw on error. 86155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 87155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 88155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) { 89155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ALOGD("doCommand: %s", command.c_str()); 90155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 91155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 92155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande --reply_len; // Ensure we have room to add NUL termination. 93155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (::wifi_command(command.c_str(), reply, &reply_len) != 0) { 94155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 95155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 96155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 97155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Strip off trailing newline. 98155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (reply_len > 0 && reply[reply_len-1] == '\n') { 99155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande reply[reply_len-1] = '\0'; 100155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande reply[reply_len] = '\0'; 102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return true; 104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jint doIntCommand(JNIEnv* env, jstring javaCommand) { 107155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char reply[REPLY_BUF_SIZE]; 108155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!doCommand(env, javaCommand, reply, sizeof(reply))) { 109155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return -1; 110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 111155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return static_cast<jint>(atoi(reply)); 112155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean doBooleanCommand(JNIEnv* env, jstring javaCommand) { 115155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char reply[REPLY_BUF_SIZE]; 116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!doCommand(env, javaCommand, reply, sizeof(reply))) { 117155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return JNI_FALSE; 118155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 119155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (strcmp(reply, "OK") == 0); 120155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 121155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 122155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Send a command to the supplicant, and return the reply as a String. 123155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jstring doStringCommand(JNIEnv* env, jstring javaCommand) { 124155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char reply[REPLY_BUF_SIZE]; 125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!doCommand(env, javaCommand, reply, sizeof(reply))) { 126155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NULL; 127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return env->NewStringUTF(reply); 129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 131155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_isDriverLoaded(JNIEnv* env, jobject) 132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::is_wifi_driver_loaded() == 1); 134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_loadDriver(JNIEnv* env, jobject) 137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_load_driver() == 0); 139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 141155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_unloadDriver(JNIEnv* env, jobject) 142155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 143155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_unload_driver() == 0); 144155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 145155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 146155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_startSupplicant(JNIEnv* env, jobject, jboolean p2pSupported) 147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_start_supplicant(p2pSupported) == 0); 149155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_killSupplicant(JNIEnv* env, jobject, jboolean p2pSupported) 152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_stop_supplicant(p2pSupported) == 0); 154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject) 157155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 158155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_connect_to_supplicant() == 0); 159155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 160155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 161155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic void android_net_wifi_closeSupplicantConnection(JNIEnv* env, jobject) 162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 163155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ::wifi_close_supplicant_connection(); 164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject) 167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 168155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char buf[EVENT_BUF_SIZE]; 169155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int nread = ::wifi_wait_for_event(buf, sizeof buf); 170155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (nread > 0) { 171155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return env->NewStringUTF(buf); 172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NULL; 174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 176155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 177155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jobject, jstring javaCommand) { 178155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return doBooleanCommand(env, javaCommand); 179155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 180155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 181155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jint android_net_wifi_doIntCommand(JNIEnv* env, jobject, jstring javaCommand) { 182155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return doIntCommand(env, javaCommand); 183155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 184155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 185155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jstring android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring javaCommand) { 186155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return doStringCommand(env,javaCommand); 187155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 188155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1897f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde/* wifi_hal <==> WifiNative bridge */ 1907f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 191b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jclass mCls; /* saved WifiNative object */ 1927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndestatic JavaVM *mVM; /* saved JVM pointer */ 1937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 194aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallestatic const char *WifiHandleVarName = "sWifiHalHandle"; 195aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallestatic const char *WifiIfaceHandleVarName = "sWifiIfaceHandles"; 1967f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndestatic jmethodID OnScanResultsMethodID; 1977f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 1987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndestatic JNIEnv *getEnv() { 1997f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde JNIEnv *env = NULL; 2007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 2017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return env; 2027f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 2037f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 204b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic wifi_handle getWifiHandle(JNIEnv *env, jclass cls) { 205b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande return (wifi_handle) getStaticLongField(env, cls, WifiHandleVarName); 2067f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 2077f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 208b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic wifi_interface_handle getIfaceHandle(JNIEnv *env, jclass cls, jint index) { 209b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande return (wifi_interface_handle) getStaticLongArrayField(env, cls, WifiIfaceHandleVarName, index); 2107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 2117f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 212b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpandestatic jobject createScanResult(JNIEnv *env, wifi_scan_result *result) { 213f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 214b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande // ALOGD("creating scan result"); 215f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 216f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 217f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde if (scanResult == NULL) { 218f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGE("Error in creating scan result"); 219f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde return NULL; 220f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde } 221f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 222b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande // ALOGD("setting SSID to %s", result.ssid); 223b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setStringField(env, scanResult, "SSID", result->ssid); 224f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 225f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde char bssid[32]; 226b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result->bssid[0], result->bssid[1], 227b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande result->bssid[2], result->bssid[3], result->bssid[4], result->bssid[5]); 228f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 229f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde setStringField(env, scanResult, "BSSID", bssid); 230f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 231b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setIntField(env, scanResult, "level", result->rssi); 232b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setIntField(env, scanResult, "frequency", result->channel); 233b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setLongField(env, scanResult, "timestamp", result->ts); 234f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 235f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde return scanResult; 236f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde} 237f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 238be3b27a3749af234b5fd7340aefb9f25060fb433xinheint set_iface_flags(const char *ifname, int dev_up) { 239be3b27a3749af234b5fd7340aefb9f25060fb433xinhe struct ifreq ifr; 240be3b27a3749af234b5fd7340aefb9f25060fb433xinhe int ret; 241be3b27a3749af234b5fd7340aefb9f25060fb433xinhe int sock = socket(PF_INET, SOCK_DGRAM, 0); 242be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (sock < 0) { 243be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("Bad socket: %d\n", sock); 244be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return -errno; 245be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 246be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 247be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("setting interface %s flags (%s)\n", ifname, dev_up ? "UP" : "DOWN"); 248be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 249be3b27a3749af234b5fd7340aefb9f25060fb433xinhe memset(&ifr, 0, sizeof(ifr)); 250be3b27a3749af234b5fd7340aefb9f25060fb433xinhe strlcpy(ifr.ifr_name, ifname, IFNAMSIZ); 251be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 252be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("reading old value\n"); 253be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 254be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (ioctl(sock, SIOCGIFFLAGS, &ifr) != 0) { 255be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ret = errno ? -errno : -999; 256be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("Could not read interface %s flags: %d\n", ifname, errno); 257be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 258be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return ret; 259be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } else { 260be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("writing new value\n"); 261be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 262be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 263be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (dev_up) { 264be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (ifr.ifr_flags & IFF_UP) { 265be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("interface %s is already up\n", ifname); 266be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 267be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return 0; 268be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 269be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ifr.ifr_flags |= IFF_UP; 270be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } else { 271be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (!(ifr.ifr_flags & IFF_UP)) { 272be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("interface %s is already down\n", ifname); 273be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 274be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return 0; 275be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 276be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ifr.ifr_flags &= ~IFF_UP; 277be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 278be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 279be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (ioctl(sock, SIOCSIFFLAGS, &ifr) != 0) { 280be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("Could not set interface %s flags \n", ifname); 281be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 282be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return ret; 283be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } else { 284be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("set interface %s flags (%s)\n", ifname, dev_up ? "UP" : "DOWN"); 285be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 286be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 287be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return 0; 288be3b27a3749af234b5fd7340aefb9f25060fb433xinhe} 289be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 290b830d76fbf5fa4077531b516066faa2fdbb92e81xinhestatic jboolean android_net_wifi_toggle_interface(JNIEnv* env, jclass cls, int toggle) { 291b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe return(set_iface_flags("wlan0", toggle) == 0); 292b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe} 293b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe 294b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jboolean android_net_wifi_startHal(JNIEnv* env, jclass cls) { 295b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 2967ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde if (halHandle == NULL) { 297ec61e7731968be994a23f2bd138f6761c8aea498xinhe 298ec61e7731968be994a23f2bd138f6761c8aea498xinhe if(init_wifi_hal_func_table(&hal_fn) != 0 ) { 299ec61e7731968be994a23f2bd138f6761c8aea498xinhe ALOGD("Can not initialize the basic function pointer table"); 300ec61e7731968be994a23f2bd138f6761c8aea498xinhe return false; 301ec61e7731968be994a23f2bd138f6761c8aea498xinhe } 302ec61e7731968be994a23f2bd138f6761c8aea498xinhe 303ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error res = init_wifi_vendor_hal_func_table(&hal_fn); 304ec61e7731968be994a23f2bd138f6761c8aea498xinhe if (res != WIFI_SUCCESS) { 305ec61e7731968be994a23f2bd138f6761c8aea498xinhe ALOGD("Can not initialize the vendor function pointer table"); 306ec61e7731968be994a23f2bd138f6761c8aea498xinhe return false; 307ec61e7731968be994a23f2bd138f6761c8aea498xinhe } 308ec61e7731968be994a23f2bd138f6761c8aea498xinhe 309be3b27a3749af234b5fd7340aefb9f25060fb433xinhe int ret = set_iface_flags("wlan0", 1); 310be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if(ret != 0) { 311be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return false; 312be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 313ec61e7731968be994a23f2bd138f6761c8aea498xinhe 314ec61e7731968be994a23f2bd138f6761c8aea498xinhe res = hal_fn.wifi_initialize(&halHandle); 3157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (res == WIFI_SUCCESS) { 316b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongField(env, cls, WifiHandleVarName, (jlong)halHandle); 317aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGD("Did set static halHandle = %p", halHandle); 3187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde env->GetJavaVM(&mVM); 320b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mCls = (jclass) env->NewGlobalRef(cls); 321b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("halHandle = %p, mVM = %p, mCls = %p", halHandle, mVM, mCls); 3227ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde return res == WIFI_SUCCESS; 3237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 324826282265badbd85c5386573fbced1755696fe83xinhe return (set_iface_flags("wlan0", 1) == 0); 3257ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde } 3267ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3277ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 3287ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapndevoid android_net_wifi_hal_cleaned_up_handler(wifi_handle handle) { 3297ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde ALOGD("In wifi cleaned up handler"); 3307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde JNIEnv * env = getEnv(); 332b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongField(env, mCls, WifiHandleVarName, 0); 333b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande env->DeleteGlobalRef(mCls); 334b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mCls = NULL; 3357f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde mVM = NULL; 3367ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3377ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 338b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic void android_net_wifi_stopHal(JNIEnv* env, jclass cls) { 3397ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde ALOGD("In wifi stop Hal"); 340b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe 341b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 342ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn.wifi_cleanup(halHandle, android_net_wifi_hal_cleaned_up_handler); 343be3b27a3749af234b5fd7340aefb9f25060fb433xinhe set_iface_flags("wlan0", 0); 3447ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3457ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 346b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic void android_net_wifi_waitForHalEvents(JNIEnv* env, jclass cls) { 3477f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 348b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("waitForHalEvents called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 3497f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 350b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 351ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn.wifi_event_loop(halHandle); 3527ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3537ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 354b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic int android_net_wifi_getInterfaces(JNIEnv *env, jclass cls) { 3557f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde int n = 0; 356b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 3577f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde wifi_interface_handle *ifaceHandles = NULL; 358ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_ifaces(halHandle, &n, &ifaceHandles); 3597f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (result < 0) { 3607f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return result; 3617f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3627f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 36307ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande if (n < 0) { 36407ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande THROW(env, "android_net_wifi_getInterfaces no interfaces"); 365aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 366aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 367aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 368aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (ifaceHandles == NULL) { 369aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle THROW(env, "android_net_wifi_getInterfaces null interface array"); 370aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 371aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 372aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 37307ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande if (n > 8) { 37407ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande THROW(env, "Too many interfaces"); 37507ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande return 0; 37607ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande } 37707ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande 3787f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlongArray array = (env)->NewLongArray(n); 3797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (array == NULL) { 3807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing array"); 3817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return 0; 3827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlong elems[8]; 3857f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde for (int i = 0; i < n; i++) { 3867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde elems[i] = reinterpret_cast<jlong>(ifaceHandles[i]); 3877f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3887f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde env->SetLongArrayRegion(array, 0, n, elems); 389b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongArrayField(env, cls, WifiIfaceHandleVarName, array); 3907f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3917f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return (result < 0) ? result : n; 3927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 3937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 394b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jstring android_net_wifi_getInterfaceName(JNIEnv *env, jclass cls, jint i) { 3957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde char buf[EVENT_BUF_SIZE]; 3967f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 397b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande jlong value = getStaticLongArrayField(env, cls, WifiIfaceHandleVarName, i); 3987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde wifi_interface_handle handle = (wifi_interface_handle) value; 399ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_iface_name(handle, buf, sizeof(buf)); 4007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (result < 0) { 4017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return NULL; 4027f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 4037f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return env->NewStringUTF(buf); 4047f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 4057f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 4067f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 407b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 408766cb4b1fa3b93c146952eacbf6756f67f172ec1Vinit Deshapndestatic void onScanResultsAvailable(wifi_request_id id, unsigned num_results) { 409766cb4b1fa3b93c146952eacbf6756f67f172ec1Vinit Deshapnde 4107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde JNIEnv *env = NULL; 4117f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 4127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 413b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("onScanResultsAvailable called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 414766cb4b1fa3b93c146952eacbf6756f67f172ec1Vinit Deshapnde 415b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onScanResultsAvailable", "(I)V", id); 416e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 417e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 418b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpandestatic void onScanEvent(wifi_scan_event event, unsigned status) { 419b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande JNIEnv *env = NULL; 420b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande mVM->AttachCurrentThread(&env, NULL); 421b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 422b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande ALOGD("onScanStatus called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 423b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 424827bc400bfb327a7c0bb2ed03f17d88c56cf85aaNavtej Singh Mann reportEvent(env, mCls, "onScanStatus", "(I)V", event); 425b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande} 426b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 427f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapndestatic void onFullScanResult(wifi_request_id id, wifi_scan_result *result) { 428f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 429f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde JNIEnv *env = NULL; 430f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 431f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 432b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("onFullScanResult called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 433f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 434b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande jobject scanResult = createScanResult(env, result); 435f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 436f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGD("Creating a byte array of length %d", result->ie_length); 437f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 438f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde jbyteArray elements = env->NewByteArray(result->ie_length); 439f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde if (elements == NULL) { 440f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGE("Error in allocating array"); 441f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde return; 442f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde } 443f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 444f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGE("Setting byte array"); 445f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 446f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde jbyte *bytes = (jbyte *)&(result->ie_data[0]); 447f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde env->SetByteArrayRegion(elements, 0, result->ie_length, bytes); 448f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 449f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGE("Returning result"); 450f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 451b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onFullScanResult", "(ILandroid/net/wifi/ScanResult;[B)V", id, 452f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde scanResult, elements); 453b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 454b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande env->DeleteLocalRef(scanResult); 455b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande env->DeleteLocalRef(elements); 456f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde} 457f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 458e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_startScan( 459b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject settings) { 460e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 461b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 462e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("starting scan on interface[%d] = %p", iface, handle); 463e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 464e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_scan_cmd_params params; 465e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(¶ms, 0, sizeof(params)); 466aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 467e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.base_period = getIntField(env, settings, "base_period_ms"); 468e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.max_ap_per_scan = getIntField(env, settings, "max_ap_per_scan"); 469c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande params.report_threshold_percent = getIntField(env, settings, "report_threshold_percent"); 470c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande params.report_threshold_num_scans = getIntField(env, settings, "report_threshold_num_scans"); 471aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 472c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGD("Initialized common fields %d, %d, %d, %d", params.base_period, params.max_ap_per_scan, 473c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande params.report_threshold_percent, params.report_threshold_num_scans); 474e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 475e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *bucket_array_type = "[Lcom/android/server/wifi/WifiNative$BucketSettings;"; 476e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *channel_array_type = "[Lcom/android/server/wifi/WifiNative$ChannelSettings;"; 477aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 478e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray buckets = (jobjectArray)getObjectField(env, settings, "buckets", bucket_array_type); 479e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.num_buckets = getIntField(env, settings, "num_buckets"); 480aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 481e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized num_buckets to %d", params.num_buckets); 482e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 483e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (int i = 0; i < params.num_buckets; i++) { 484e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject bucket = getObjectArrayField(env, settings, "buckets", bucket_array_type, i); 485aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 486e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].bucket = getIntField(env, bucket, "bucket"); 487e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].band = (wifi_band) getIntField(env, bucket, "band"); 488e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].period = getIntField(env, bucket, "period_ms"); 489aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 490e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized common bucket fields %d:%d:%d", params.buckets[i].bucket, 491e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].band, params.buckets[i].period); 492e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 493e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde int report_events = getIntField(env, bucket, "report_events"); 494e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].report_events = report_events; 495aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 496e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized report events to %d", params.buckets[i].report_events); 497e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 498e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray channels = (jobjectArray)getObjectField( 499e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env, bucket, "channels", channel_array_type); 500aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 501e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].num_channels = getIntField(env, bucket, "num_channels"); 502e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized num_channels to %d", params.buckets[i].num_channels); 503e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 504e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (int j = 0; j < params.buckets[i].num_channels; j++) { 505e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject channel = getObjectArrayField(env, bucket, "channels", channel_array_type, j); 506aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 507e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].channels[j].channel = getIntField(env, channel, "frequency"); 508e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].channels[j].dwellTimeMs = getIntField(env, channel, "dwell_time_ms"); 509aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 510e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde bool passive = getBoolField(env, channel, "passive"); 511e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].channels[j].passive = (passive ? 1 : 0); 512e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 513e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized channel %d", params.buckets[i].channels[j].channel); 514e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 515e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 516e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 517e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized all fields"); 518e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 519e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_scan_result_handler handler; 520e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&handler, 0, sizeof(handler)); 521e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_scan_results_available = &onScanResultsAvailable; 522f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde handler.on_full_scan_result = &onFullScanResult; 523b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande handler.on_scan_event = &onScanEvent; 524e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 525ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_start_gscan(id, handle, params, handler) == WIFI_SUCCESS; 526e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 527e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 528b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jboolean android_net_wifi_stopScan(JNIEnv *env, jclass cls, jint iface, jint id) { 529b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 530e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("stopping scan on interface[%d] = %p", iface, handle); 531e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 532ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_stop_gscan(id, handle) == WIFI_SUCCESS; 533e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 534e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 535c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpandestatic int compare_scan_result_timestamp(const void *v1, const void *v2) { 536c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande const wifi_scan_result *result1 = static_cast<const wifi_scan_result *>(v1); 537c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande const wifi_scan_result *result2 = static_cast<const wifi_scan_result *>(v2); 538c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return result1->ts - result2->ts; 539c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande} 540c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 541e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jobject android_net_wifi_getScanResults( 542b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jboolean flush) { 543e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 544c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande wifi_cached_scan_results scan_data[64]; 545c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande int num_scan_data = 64; 546e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 547b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 548e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("getting scan results on interface[%d] = %p", iface, handle); 549c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 550c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande byte b = flush ? 0 : 0xFF; 551ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_cached_gscan_results(handle, b, num_scan_data, scan_data, &num_scan_data); 552e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (result == WIFI_SUCCESS) { 553c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobjectArray scanData = createObjectArray(env, 554c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande "android/net/wifi/WifiScanner$ScanData", num_scan_data); 555c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanData == NULL) { 556c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in allocating array of scanData"); 557e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 558e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 559e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 560c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande for (int i = 0; i < num_scan_data; i++) { 561c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 562c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobject data = createObject(env, "android/net/wifi/WifiScanner$ScanData"); 563c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (data == NULL) { 564c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in allocating scanData"); 565c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return NULL; 566c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 567e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 568c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, data, "mId", scan_data[i].scan_id); 569c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, data, "mFlags", scan_data[i].flags); 570e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 571c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande /* sort all scan results by timestamp */ 572c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande qsort(scan_data[i].results, scan_data[i].num_results, 573c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande sizeof(wifi_scan_result), compare_scan_result_timestamp); 574c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 575c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobjectArray scanResults = createObjectArray(env, 576c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande "android/net/wifi/ScanResult", scan_data[i].num_results); 577c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanResults == NULL) { 578c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in allocating scanResult array"); 579e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 580e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 581e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 582c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande wifi_scan_result *results = scan_data[i].results; 583c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande for (int j = 0; j < scan_data[i].num_results; j++) { 584c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 585c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 586c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanResult == NULL) { 587c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in creating scan result"); 588c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return NULL; 589c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 5907f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 591c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setStringField(env, scanResult, "SSID", results[j].ssid); 592e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 593c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande char bssid[32]; 594c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[j].bssid[0], 595c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande results[j].bssid[1], results[j].bssid[2], results[j].bssid[3], 596c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande results[j].bssid[4], results[j].bssid[5]); 597e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 598c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setStringField(env, scanResult, "BSSID", bssid); 599c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 600c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, scanResult, "level", results[j].rssi); 601c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, scanResult, "frequency", results[j].channel); 602c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setLongField(env, scanResult, "timestamp", results[j].ts); 603c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 604c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande env->SetObjectArrayElement(scanResults, j, scanResult); 605c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande env->DeleteLocalRef(scanResult); 606c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 607e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 608c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setObjectField(env, data, "mResults", "[Landroid/net/wifi/ScanResult;", scanResults); 609c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande env->SetObjectArrayElement(scanData, i, data); 610e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 611e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 612c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return scanData; 613e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } else { 614e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 615e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 616e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 617e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 618e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 619e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_getScanCapabilities( 620b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jobject capabilities) { 621e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 622b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 623e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("getting scan capabilities on interface[%d] = %p", iface, handle); 624e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 625e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_gscan_capabilities c; 626e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&c, 0, sizeof(c)); 627ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_gscan_capabilities(handle, &c); 628e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (result != WIFI_SUCCESS) { 629e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("failed to get capabilities : %d", result); 630e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return JNI_FALSE; 631e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 632e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 633e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_scan_cache_size", c.max_scan_cache_size); 634e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_scan_buckets", c.max_scan_buckets); 635e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_ap_cache_per_scan", c.max_ap_cache_per_scan); 636e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_rssi_sample_size", c.max_rssi_sample_size); 637e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_scan_reporting_threshold", c.max_scan_reporting_threshold); 638c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle setIntField(env, capabilities, "max_hotlist_bssids", c.max_hotlist_bssids); 639e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_significant_wifi_change_aps", 640e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde c.max_significant_wifi_change_aps); 641e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 642e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return JNI_TRUE; 643e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 644e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 645e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 646e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic byte parseHexChar(char ch) { 647e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (isdigit(ch)) 648e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - '0'; 649e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else if ('A' <= ch && ch <= 'F') 650e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - 'A' + 10; 651e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else if ('a' <= ch && ch <= 'f') 652e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - 'a' + 10; 653e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else { 654e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("invalid character in bssid %c", ch); 655e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return 0; 656e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 657e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 658e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 659e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic byte parseHexByte(const char * &str) { 660e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde byte b = parseHexChar(str[0]); 661e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (str[1] == ':' || str[1] == '\0') { 662e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde str += 2; 663e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return b; 664e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } else { 665e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde b = b << 4 | parseHexChar(str[1]); 666e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde str += 3; 667e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return b; 668e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 669e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 670e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 671e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic void parseMacAddress(const char *str, mac_addr addr) { 672e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[0] = parseHexByte(str); 673e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[1] = parseHexByte(str); 674e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2] = parseHexByte(str); 675e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[3] = parseHexByte(str); 676e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[4] = parseHexByte(str); 677e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[5] = parseHexByte(str); 678e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 679e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 680143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic bool parseMacAddress(JNIEnv *env, jobject obj, mac_addr addr) { 681143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jstring macAddrString = (jstring) getObjectField( 682143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande env, obj, "bssid", "Ljava/lang/String;"); 683143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 684143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (macAddrString == NULL) { 685143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error getting bssid field"); 686143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return false; 687143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 688143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 689143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande const char *bssid = env->GetStringUTFChars(macAddrString, NULL); 690143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (bssid == NULL) { 691143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error getting bssid"); 692143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return false; 693143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 694143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 695143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande parseMacAddress(bssid, addr); 696143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return true; 697143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 698143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 699e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic void onHotlistApFound(wifi_request_id id, 700e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde unsigned num_results, wifi_scan_result *results) { 701e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 702e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde JNIEnv *env = NULL; 703e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 704e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 705e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("onHotlistApFound called, vm = %p, obj = %p, env = %p, num_results = %d", 706b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mVM, mCls, env, num_results); 707e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 708e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); 7097f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (clsScanResult == NULL) { 7107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in accessing class"); 7117f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 7127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 7137f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7147f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); 7157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (scanResults == NULL) { 7167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in allocating array"); 7177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 7187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 7197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde for (unsigned i = 0; i < num_results; i++) { 7217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 722e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 7237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (scanResult == NULL) { 7247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in creating scan result"); 7257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 7267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 7277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setStringField(env, scanResult, "SSID", results[i].ssid); 7297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde char bssid[32]; 731e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], 7327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde results[i].bssid[2], results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); 7337f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setStringField(env, scanResult, "BSSID", bssid); 7357f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7367f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setIntField(env, scanResult, "level", results[i].rssi); 737e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, scanResult, "frequency", results[i].channel); 7387f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setLongField(env, scanResult, "timestamp", results[i].ts); 739e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 740e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->SetObjectArrayElement(scanResults, i, scanResult); 741e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 742e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Found AP %32s %s", results[i].ssid, bssid); 743e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 744e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 745b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onHotlistApFound", "(I[Landroid/net/wifi/ScanResult;)V", 746e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde id, scanResults); 747e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 748e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 749e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpandestatic void onHotlistApLost(wifi_request_id id, 750e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande unsigned num_results, wifi_scan_result *results) { 751e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 752e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande JNIEnv *env = NULL; 753e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande mVM->AttachCurrentThread(&env, NULL); 754e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 755e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGD("onHotlistApLost called, vm = %p, obj = %p, env = %p, num_results = %d", 756e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande mVM, mCls, env, num_results); 757e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 758e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); 759e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (clsScanResult == NULL) { 760e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGE("Error in accessing class"); 761e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 762e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 763e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 764e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); 765e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (scanResults == NULL) { 766e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGE("Error in allocating array"); 767e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 768e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 769e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 770e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande for (unsigned i = 0; i < num_results; i++) { 771e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 772e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 773e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (scanResult == NULL) { 774e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGE("Error in creating scan result"); 775e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 776e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 777e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 778e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setStringField(env, scanResult, "SSID", results[i].ssid); 779e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 780e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande char bssid[32]; 781e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], 782e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande results[i].bssid[2], results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); 783e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 784e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setStringField(env, scanResult, "BSSID", bssid); 785e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 786e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setIntField(env, scanResult, "level", results[i].rssi); 787e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setIntField(env, scanResult, "frequency", results[i].channel); 788e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setLongField(env, scanResult, "timestamp", results[i].ts); 789e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 790e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande env->SetObjectArrayElement(scanResults, i, scanResult); 791e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 792e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGD("Lost AP %32s %s", results[i].ssid, bssid); 793e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 794e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 795e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande reportEvent(env, mCls, "onHotlistApLost", "(I[Landroid/net/wifi/ScanResult;)V", 796e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande id, scanResults); 797e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande} 798e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 799e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 800e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_setHotlist( 801b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject ap) { 802e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 803b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 804e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("setting hotlist on interface[%d] = %p", iface, handle); 805e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 806e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_bssid_hotlist_params params; 807e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(¶ms, 0, sizeof(params)); 808e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 809e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande params.lost_ap_sample_size = getIntField(env, ap, "apLostThreshold"); 810e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 811e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray array = (jobjectArray) getObjectField(env, ap, 812b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande "bssidInfos", "[Landroid/net/wifi/WifiScanner$BssidInfo;"); 813c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle params.num_bssid = env->GetArrayLength(array); 814e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 815c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle if (params.num_bssid == 0) { 816e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in accesing array"); 817e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 818e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 819e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 820c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle for (int i = 0; i < params.num_bssid; i++) { 821e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject objAp = env->GetObjectArrayElement(array, i); 822e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 823e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jstring macAddrString = (jstring) getObjectField( 824e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env, objAp, "bssid", "Ljava/lang/String;"); 825e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (macAddrString == NULL) { 826e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid field"); 827e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 828e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 829e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 830e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *bssid = env->GetStringUTFChars(macAddrString, NULL); 831e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (bssid == NULL) { 832e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid"); 833e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 834e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 835a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande parseMacAddress(bssid, params.ap[i].bssid); 836e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 837e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mac_addr addr; 838a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande memcpy(addr, params.ap[i].bssid, sizeof(mac_addr)); 839e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 840e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssidOut[32]; 841e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde sprintf(bssidOut, "%0x:%0x:%0x:%0x:%0x:%0x", addr[0], addr[1], 842e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2], addr[3], addr[4], addr[5]); 843e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 844e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Added bssid %s", bssidOut); 845e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 846a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].low = getIntField(env, objAp, "low"); 847a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].high = getIntField(env, objAp, "high"); 848e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 849e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 850e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_hotlist_ap_found_handler handler; 851e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&handler, 0, sizeof(handler)); 852e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 853e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_hotlist_ap_found = &onHotlistApFound; 854e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande handler.on_hotlist_ap_lost = &onHotlistApLost; 855ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_set_bssid_hotlist(id, handle, params, handler) == WIFI_SUCCESS; 856e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 857e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 858e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_resetHotlist( 859b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id) { 860e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 861b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 862e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("resetting hotlist on interface[%d] = %p", iface, handle); 863e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 864ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_reset_bssid_hotlist(id, handle) == WIFI_SUCCESS; 865e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 866e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 867a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpandevoid onSignificantWifiChange(wifi_request_id id, 868a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande unsigned num_results, wifi_significant_change_result **results) { 869e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde JNIEnv *env = NULL; 870e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 871e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 872b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("onSignificantWifiChange called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 873e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 874e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); 875e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (clsScanResult == NULL) { 876e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in accessing class"); 877e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 878e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 879e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 880e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); 881e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (scanResults == NULL) { 882e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in allocating array"); 883e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 884e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 885e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 886e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (unsigned i = 0; i < num_results; i++) { 887e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 888d31a40e4c13481c0e70b0b6392bccf6a0f75c4e7Greg Hackmann wifi_significant_change_result &result = *(results[i]); 889a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande 890e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 891e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (scanResult == NULL) { 892e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in creating scan result"); 893e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 894e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 895e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 896a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande // setStringField(env, scanResult, "SSID", results[i].ssid); 897e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 898e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssid[32]; 899a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result.bssid[0], result.bssid[1], 900a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande result.bssid[2], result.bssid[3], result.bssid[4], result.bssid[5]); 901e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 902e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setStringField(env, scanResult, "BSSID", bssid); 903e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 9044dbfefd99e51ab1cca058026c90f8093b099198bVinit Deshpande setIntField(env, scanResult, "level", result.rssi[0]); 905a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande setIntField(env, scanResult, "frequency", result.channel); 906a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande // setLongField(env, scanResult, "timestamp", result.ts); 9077f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 9087f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde env->SetObjectArrayElement(scanResults, i, scanResult); 9097f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 9107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 911b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onSignificantWifiChange", "(I[Landroid/net/wifi/ScanResult;)V", 912e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde id, scanResults); 913e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 9147f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 9157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 916e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_trackSignificantWifiChange( 917b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject settings) { 9187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 919b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 920e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("tracking significant wifi change on interface[%d] = %p", iface, handle); 9217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 922e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_significant_change_params params; 9237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde memset(¶ms, 0, sizeof(params)); 9247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 925e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.rssi_sample_size = getIntField(env, settings, "rssiSampleSize"); 926e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.lost_ap_sample_size = getIntField(env, settings, "lostApSampleSize"); 927e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.min_breaching = getIntField(env, settings, "minApsBreachingThreshold"); 928e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 929b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande const char *bssid_info_array_type = "[Landroid/net/wifi/WifiScanner$BssidInfo;"; 930b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande jobjectArray bssids = (jobjectArray)getObjectField( 931b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande env, settings, "bssidInfos", bssid_info_array_type); 932c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle params.num_bssid = env->GetArrayLength(bssids); 933e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 934c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle if (params.num_bssid == 0) { 935aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGE("Error in accessing array"); 936e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 937e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 938e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 939e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized common fields %d, %d, %d, %d", params.rssi_sample_size, 940c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle params.lost_ap_sample_size, params.min_breaching, params.num_bssid); 941e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 942c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle for (int i = 0; i < params.num_bssid; i++) { 943b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande jobject objAp = env->GetObjectArrayElement(bssids, i); 944e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 945e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jstring macAddrString = (jstring) getObjectField( 946e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env, objAp, "bssid", "Ljava/lang/String;"); 947e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (macAddrString == NULL) { 948e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid field"); 949e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 950e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 951e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 952e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *bssid = env->GetStringUTFChars(macAddrString, NULL); 953e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (bssid == NULL) { 954e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid"); 955e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 956e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 957e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 958e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mac_addr addr; 959e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde parseMacAddress(bssid, addr); 960a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande memcpy(params.ap[i].bssid, addr, sizeof(mac_addr)); 961e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 962e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssidOut[32]; 9634dbfefd99e51ab1cca058026c90f8093b099198bVinit Deshpande sprintf(bssidOut, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], 964e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2], addr[3], addr[4], addr[5]); 965e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 966a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].low = getIntField(env, objAp, "low"); 967a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].high = getIntField(env, objAp, "high"); 968e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 969a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande ALOGD("Added bssid %s, [%04d, %04d]", bssidOut, params.ap[i].low, params.ap[i].high); 970e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 971e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 972c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle ALOGD("Added %d bssids", params.num_bssid); 973e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 974e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_significant_change_handler handler; 9757f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde memset(&handler, 0, sizeof(handler)); 9767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 977e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_significant_change = &onSignificantWifiChange; 978ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_set_significant_change_handler(id, handle, params, handler) == WIFI_SUCCESS; 9797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 9807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 981e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_untrackSignificantWifiChange( 982b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id) { 983e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 984b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 985e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("resetting significant wifi change on interface[%d] = %p", iface, handle); 9867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 987ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_reset_significant_change_handler(id, handle) == WIFI_SUCCESS; 9887f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 9897ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 990aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallewifi_iface_stat link_stat; 991200e8ee5097134010a6edee8d031bb02ff7eeb5avandwallewifi_radio_stat radio_stat; // L release has support for only one radio 992aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 993aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallevoid onLinkStatsResults(wifi_request_id id, wifi_iface_stat *iface_stat, 994200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle int num_radios, wifi_radio_stat *radio_stats) 995aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{ 996200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle if (iface_stat != 0) { 997200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memcpy(&link_stat, iface_stat, sizeof(wifi_iface_stat)); 998200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } else { 999200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memset(&link_stat, 0, sizeof(wifi_iface_stat)); 1000200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } 1001200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 1002200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle if (num_radios > 0 && radio_stats != 0) { 1003200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memcpy(&radio_stat, radio_stats, sizeof(wifi_radio_stat)); 1004200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } else { 1005200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memset(&radio_stat, 0, sizeof(wifi_radio_stat)); 1006200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } 1007aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 1008aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1009b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jobject android_net_wifi_getLinkLayerStats (JNIEnv *env, jclass cls, jint iface) { 1010aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1011aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle wifi_stats_result_handler handler; 1012aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle memset(&handler, 0, sizeof(handler)); 1013aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle handler.on_link_stats_results = &onLinkStatsResults; 1014b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1015ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_link_stats(0, handle, handler); 1016aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (result < 0) { 1017200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle ALOGE("android_net_wifi_getLinkLayerStats: failed to get link statistics\n"); 1018aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return NULL; 1019aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 1020aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1021aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jobject wifiLinkLayerStats = createObject(env, "android/net/wifi/WifiLinkLayerStats"); 1022aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (wifiLinkLayerStats == NULL) { 1023aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGE("Error in allocating wifiLinkLayerStats"); 1024aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return NULL; 1025aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 1026aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1027aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setIntField(env, wifiLinkLayerStats, "beacon_rx", link_stat.beacon_rx); 1028aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setIntField(env, wifiLinkLayerStats, "rssi_mgmt", link_stat.rssi_mgmt); 1029aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_be", link_stat.ac[WIFI_AC_BE].rx_mpdu); 1030aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_bk", link_stat.ac[WIFI_AC_BK].rx_mpdu); 1031aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_vi", link_stat.ac[WIFI_AC_VI].rx_mpdu); 1032aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_vo", link_stat.ac[WIFI_AC_VO].rx_mpdu); 1033aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_be", link_stat.ac[WIFI_AC_BE].tx_mpdu); 1034aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_bk", link_stat.ac[WIFI_AC_BK].tx_mpdu); 1035aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_vi", link_stat.ac[WIFI_AC_VI].tx_mpdu); 1036aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_vo", link_stat.ac[WIFI_AC_VO].tx_mpdu); 1037aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_be", link_stat.ac[WIFI_AC_BE].mpdu_lost); 1038aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_bk", link_stat.ac[WIFI_AC_BK].mpdu_lost); 1039aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_vi", link_stat.ac[WIFI_AC_VI].mpdu_lost); 1040aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_vo", link_stat.ac[WIFI_AC_VO].mpdu_lost); 1041aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_be", link_stat.ac[WIFI_AC_BE].retries); 1042aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_bk", link_stat.ac[WIFI_AC_BK].retries); 1043aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_vi", link_stat.ac[WIFI_AC_VI].retries); 1044aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_vo", link_stat.ac[WIFI_AC_VO].retries); 1045aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1046200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 1047200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "on_time", radio_stat.on_time); 1048200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "tx_time", radio_stat.tx_time); 1049200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "rx_time", radio_stat.rx_time); 1050200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "on_time_scan", radio_stat.on_time_scan); 1051200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 1052aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return wifiLinkLayerStats; 1053aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 1054e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 1055c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpandestatic jint android_net_wifi_getSupportedFeatures(JNIEnv *env, jclass cls, jint iface) { 1056c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1057a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande feature_set set = 0; 1058a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 1059a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande wifi_error result = WIFI_SUCCESS; 1060c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande /* 1061a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande set = WIFI_FEATURE_INFRA 1062a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_INFRA_5G 1063a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_HOTSPOT 1064a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_P2P 1065a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_SOFT_AP 1066a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_GSCAN 1067a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_PNO 1068a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_TDLS 1069a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_EPR; 1070c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande */ 1071a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 1072ec61e7731968be994a23f2bd138f6761c8aea498xinhe result = hal_fn.wifi_get_supported_feature_set(handle, &set); 1073a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande if (result == WIFI_SUCCESS) { 1074c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande ALOGD("wifi_get_supported_feature_set returned set = 0x%x", set); 1075a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande return set; 1076a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } else { 1077c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande ALOGD("wifi_get_supported_feature_set returned error = 0x%x", result); 1078a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande return 0; 1079a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } 1080a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande} 1081a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 108206a3ebada2343fe3f083339973f143b39d62b3c4xinhestatic void onRttResults(wifi_request_id id, unsigned num_results, wifi_rtt_result* results[]) { 1083143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande JNIEnv *env = NULL; 1084143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande mVM->AttachCurrentThread(&env, NULL); 1085143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1086143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGD("onRttResults called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 1087143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1088143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jclass clsRttResult = (env)->FindClass("android/net/wifi/RttManager$RttResult"); 1089143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (clsRttResult == NULL) { 1090143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error in accessing class"); 1091143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 1092143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1093143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1094143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jobjectArray rttResults = env->NewObjectArray(num_results, clsRttResult, NULL); 1095143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (rttResults == NULL) { 1096143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error in allocating array"); 1097143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 1098143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1099143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1100143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande for (unsigned i = 0; i < num_results; i++) { 1101143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 110206a3ebada2343fe3f083339973f143b39d62b3c4xinhe wifi_rtt_result *result = results[i]; 1103143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1104143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jobject rttResult = createObject(env, "android/net/wifi/RttManager$RttResult"); 1105143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (rttResult == NULL) { 1106143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error in creating rtt result"); 1107143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 1108143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1109143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1110143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande char bssid[32]; 111106a3ebada2343fe3f083339973f143b39d62b3c4xinhe sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result->addr[0], result->addr[1], 111206a3ebada2343fe3f083339973f143b39d62b3c4xinhe result->addr[2], result->addr[3], result->addr[4], result->addr[5]); 1113143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1114143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande setStringField(env, rttResult, "bssid", bssid); 111506a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "burstNumber", result->burst_num); 111606a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "measurementFrameNumber", result->measurement_number); 111706a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "successMeasurementFrameNumber", result->success_number); 111806a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "frameNumberPerBurstPeer", result->number_per_burst_peer); 111906a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "status", result->status); 112006a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "measurementType", result->type); 112106a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "retryAfterDuration", result->retry_after_duration); 112206a3ebada2343fe3f083339973f143b39d62b3c4xinhe setLongField(env, rttResult, "ts", result->ts); 112306a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "rssi", result->rssi); 112406a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "rssiSpread", result->rssi_spread); 112506a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "txRate", result->tx_rate.bitrate); 112606a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "rxRate", result->rx_rate.bitrate); 112706a3ebada2343fe3f083339973f143b39d62b3c4xinhe setLongField(env, rttResult, "rtt", result->rtt); 112806a3ebada2343fe3f083339973f143b39d62b3c4xinhe setLongField(env, rttResult, "rttStandardDeviation", result->rtt_sd); 112906a3ebada2343fe3f083339973f143b39d62b3c4xinhe setLongField(env, rttResult, "rttSpread", result->rtt_spread); 113006a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "distance", result->distance); 113106a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "distanceStandardDeviation", result->distance_sd); 113206a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "distanceSpread", result->distance_spread); 113306a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "burstDuration", result->burst_duration); 113406a3ebada2343fe3f083339973f143b39d62b3c4xinhe 113506a3ebada2343fe3f083339973f143b39d62b3c4xinhe /*if (result->LCI.len != 0) { 113612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe jobject LCI = createObject(env, "android/net/wifi/RttManager$wifiInformationElement"); 113712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setIntField(env, LCI, "id", (int) result.LCI.id); 113812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe //setStringField(env, LCI,"data", result.LCI.data); 113912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setObjectField(env, rttResult, "LCI", 114012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe "android/net/wifi/RttManager$WifiInformationElement;", LCI); 114112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe } 114212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 114312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe if (result.LCR.len != 0) { 114412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe jobject LCR = createObject(env, "android/net/wifi/RttManager$wifiInformationElement"); 114512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setIntField(env, LCR, "id", result.LCI.id); 114612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe //setStringField(env, LCR,"data", result.LCI.data); 114712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setObjectField(env, rttResult, "LCR", 114812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe "android/net/wifi/RttManager$WifiInformationElement;", LCR); 114906a3ebada2343fe3f083339973f143b39d62b3c4xinhe }*/ 1150143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1151143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande env->SetObjectArrayElement(rttResults, i, rttResult); 1152143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1153143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1154143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande reportEvent(env, mCls, "onRttResults", "(I[Landroid/net/wifi/RttManager$RttResult;)V", 1155143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande id, rttResults); 1156143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1157143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 115802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpandeconst int MaxRttConfigs = 16; 115902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 1160143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic jboolean android_net_wifi_requestRange( 1161143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject params) { 1162143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1163143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1164143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGD("sending rtt request [%d] = %p", id, handle); 1165143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 116602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande wifi_rtt_config configs[MaxRttConfigs]; 116702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande memset(&configs, 0, sizeof(configs)); 116802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 116902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande int len = env->GetArrayLength((jobjectArray)params); 117002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (len > MaxRttConfigs) { 117102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande return false; 117202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 117302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 117402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande for (int i = 0; i < len; i++) { 117502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 117602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande jobject param = env->GetObjectArrayElement((jobjectArray)params, i); 117702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (param == NULL) { 117802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande ALOGD("could not get element %d", i); 117902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande continue; 118002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1181143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 118202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande wifi_rtt_config &config = configs[i]; 118302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 118402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande parseMacAddress(env, param, config.addr); 118502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.type = (wifi_rtt_type)getIntField(env, param, "requestType"); 118602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.peer = (wifi_peer_type)getIntField(env, param, "deviceType"); 118702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.channel.center_freq = getIntField(env, param, "frequency"); 118812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.channel.width = (wifi_channel_width) getIntField(env, param, "channelWidth"); 118912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.channel.center_freq0 = getIntField(env, param, "centerFreq0"); 119012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.channel.center_freq1 = getIntField(env, param, "centerFreq1"); 119112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 119212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.num_burst = getIntField(env, param, "numberBurst"); 119312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.interval = (unsigned) getIntField(env, param, "interval"); 119412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.num_frames_per_burst = (unsigned) getIntField(env, param, "numSamplesPerBurst"); 119512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.num_retries_per_measurement_frame = (unsigned) getIntField(env, param, 119612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe "numRetriesPerMeasurementFrame"); 119712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.num_retries_per_ftmr = (unsigned) getIntField(env, param, "numRetriesPerFTMR"); 119812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.LCI_request = getBoolField(env, param, "LCIRequest") ? 1 : 0; 119912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.LCR_request = getBoolField(env, param, "LCRRequest") ? 1 : 0; 120012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.burst_timeout = (unsigned) getIntField(env, param, "burstTimeout"); 120112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.preamble = getIntField(env, param, "preamble"); 120212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.bw = getIntField(env, param, "bandwidth"); 120312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 120412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("RTT request destination %d: type is %d, peer is %d, bw is %d, center_freq is %d ", i, 120512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.type,config.peer, config.channel.width, config.channel.center_freq0); 120612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("center_freq0 is %d, center_freq1 is %d, num_burst is %d,interval is %d", 120712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.channel.center_freq0, config.channel.center_freq1, config.num_burst, 120812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.interval); 120912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("frames_per_burst is %d, retries of measurement frame is %d, retries_per_ftmr is %d", 121012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.num_frames_per_burst, config.num_retries_per_measurement_frame, 121112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.num_retries_per_ftmr); 121212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("LCI_requestis %d, LCR_request is %d, burst_timeout is %d, preamble is %d, bw is %d", 121312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.LCI_request, config.LCR_request, config.burst_timeout, config.preamble, 121412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.bw); 121502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1216143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1217143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_rtt_event_handler handler; 1218143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande handler.on_rtt_results = &onRttResults; 1219143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1220ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_rtt_range_request(id, handle, len, configs, handler) == WIFI_SUCCESS; 1221143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1222143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1223143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic jboolean android_net_wifi_cancelRange( 1224042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject params) { 1225143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1226143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1227143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGD("cancelling rtt request [%d] = %p", id, handle); 1228143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 122902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande mac_addr addrs[MaxRttConfigs]; 123002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande memset(&addrs, 0, sizeof(addrs)); 123102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 123202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande int len = env->GetArrayLength((jobjectArray)params); 123302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (len > MaxRttConfigs) { 123402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande return false; 123502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1236143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 123702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande for (int i = 0; i < len; i++) { 123802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 123902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande jobject param = env->GetObjectArrayElement((jobjectArray)params, i); 124002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (param == NULL) { 124102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande ALOGD("could not get element %d", i); 124202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande continue; 124302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 124402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 124502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande parseMacAddress(env, param, addrs[i]); 124602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1247143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1248ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_rtt_range_cancel(id, handle, len, addrs) == WIFI_SUCCESS; 1249143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1250143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1251042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpandestatic jboolean android_net_wifi_setScanningMacOui(JNIEnv *env, jclass cls, 1252042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande jint iface, jbyteArray param) { 1253042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1254042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1255042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGD("setting scan oui %p", handle); 1256042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1257042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande static const unsigned oui_len = 3; /* OUI is upper 3 bytes of mac_address */ 1258042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande int len = env->GetArrayLength(param); 1259042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande if (len != oui_len) { 1260042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGE("invalid oui length %d", len); 1261042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande return false; 1262042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande } 1263042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1264042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande jbyte* bytes = env->GetByteArrayElements(param, NULL); 1265042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande if (bytes == NULL) { 1266042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGE("failed to get array"); 1267042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande return false; 1268042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande } 1269042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1270ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_set_scanning_mac_oui(handle, (byte *)bytes) == WIFI_SUCCESS; 1271042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande} 1272042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1273efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpandestatic jintArray android_net_wifi_getValidChannels(JNIEnv *env, jclass cls, 1274efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande jint iface, jint band) { 1275efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1276efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1277efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande ALOGD("getting valid channels %p", handle); 1278efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1279efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande static const int MaxChannels = 64; 1280efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande wifi_channel channels[64]; 1281efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande int num_channels = 0; 1282ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error result = hal_fn.wifi_get_valid_channels(handle, band, MaxChannels, 1283efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande channels, &num_channels); 1284efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1285efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande if (result == WIFI_SUCCESS) { 1286efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande jintArray channelArray = env->NewIntArray(num_channels); 1287efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande if (channelArray == NULL) { 1288efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande ALOGE("failed to allocate channel list"); 1289efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return NULL; 1290efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } 1291efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1292efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande env->SetIntArrayRegion(channelArray, 0, num_channels, channels); 1293efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return channelArray; 1294efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } else { 1295efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande ALOGE("failed to get channel list : %d", result); 1296efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return NULL; 1297efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } 1298efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande} 1299efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 130090b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpandestatic jboolean android_net_wifi_setDfsFlag(JNIEnv *env, jclass cls, jint iface, jboolean dfs) { 130190b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 130290b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande ALOGD("setting dfs flag to %s, %p", dfs ? "true" : "false", handle); 130390b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande 130490b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande u32 nodfs = dfs ? 0 : 1; 1305ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error result = hal_fn.wifi_set_nodfs_flag(handle, nodfs); 130690b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande return result == WIFI_SUCCESS; 130790b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande} 130890b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande 130912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhestatic jobject android_net_wifi_get_rtt_capabilities(JNIEnv *env, jclass cls, jint iface) { 131012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe wifi_rtt_capabilities rtt_capabilities; 131112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1312ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error ret = hal_fn.wifi_get_rtt_capabilities(handle, &rtt_capabilities); 131312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 131412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe if(WIFI_SUCCESS == ret) { 131512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe jobject capabilities = createObject(env, "android/net/wifi/RttManager$RttCapabilities"); 131612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setBooleanField(env, capabilities, "oneSidedRttSupported", 131712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.rtt_one_sided_supported == 1); 131812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setBooleanField(env, capabilities, "twoSided11McRttSupported", 131912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.rtt_ftm_supported == 1); 132012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setBooleanField(env, capabilities, "lciSupported", 132112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.lci_support); 132212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setBooleanField(env,capabilities, "lcrSupported", 132312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.lcr_support); 132412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setIntField(env, capabilities, "preambleSupported", 132512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.preamble_support); 132612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setIntField(env, capabilities, "bwSupported", 132712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.bw_support); 132812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("One side RTT is: %s", rtt_capabilities.rtt_one_sided_supported ==1 ? "support" : 132912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe "not support"); 133012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("Two side RTT is: %s", rtt_capabilities.rtt_ftm_supported == 1 ? "support" : 133112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe "not support"); 133212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("LCR is: %s", rtt_capabilities.lcr_support == 1 ? "support" : "not support"); 133312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 133412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("LCI is: %s", rtt_capabilities.lci_support == 1 ? "support" : "not support"); 133512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 133612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("Support Preamble is : %d support BW is %d", rtt_capabilities.preamble_support, 133712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.bw_support); 133812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe return capabilities; 133912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe } else { 134012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe return NULL; 134112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe } 134212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe} 134312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 1344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// ---------------------------------------------------------------------------- 1345a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle// Debug framework 1346a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle// ---------------------------------------------------------------------------- 1347a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1348a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwallestatic void onRingBufferData(wifi_request_id id, wifi_ring_buffer_id ring_id, char * buffer, 1349a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalleint buffer_size, wifi_ring_buffer_status *status) { 1350a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle JNIEnv *env = NULL; 1351a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle mVM->AttachCurrentThread(&env, NULL); 1352a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1353a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle ALOGD("onRingBufferData called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 1354a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1355a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle reportEvent(env, mCls, "onDataAvailable", "(I[Landroid/net/wifi/WiFiLogger$LogData;)V", 1356a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 0, 0); 1357a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle} 1358a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 13597d6301ead19afdf3de37455e9ed133c25b4938cdVinit Deshpandestatic jboolean android_net_wifi_start_logging(JNIEnv *env, jclass cls, jint iface) { 1360a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1361a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 13627d6301ead19afdf3de37455e9ed133c25b4938cdVinit Deshpande ALOGD("android_net_wifi_start_logging = %p", handle); 1363a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1364a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle if (handle == 0) { 1365a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle return WIFI_ERROR_UNINITIALIZED; 1366a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle } 1367a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle wifi_ring_buffer_data_handler handler; 1368a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle handler.on_ring_buffer_data = &onRingBufferData; 1369a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1370a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle wifi_error result = WIFI_SUCCESS; //ifi_start_logging(handle, 1, 0, 5, 4*1024,(u8*)"wifi_connectivity_events", handler); 1371a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1372a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle return result; 1373a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle} 1374a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1375a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1376155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// ---------------------------------------------------------------------------- 1377155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1378155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* 1379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * JNI registration. 1380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic JNINativeMethod gWifiMethods[] = { 1382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* name, signature, funcPtr */ 1383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1384155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "loadDriver", "()Z", (void *)android_net_wifi_loadDriver }, 1385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "isDriverLoaded", "()Z", (void *)android_net_wifi_isDriverLoaded }, 1386155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "unloadDriver", "()Z", (void *)android_net_wifi_unloadDriver }, 1387155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "startSupplicant", "(Z)Z", (void *)android_net_wifi_startSupplicant }, 1388155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "killSupplicant", "(Z)Z", (void *)android_net_wifi_killSupplicant }, 1389155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "connectToSupplicantNative", "()Z", (void *)android_net_wifi_connectToSupplicant }, 1390155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "closeSupplicantConnectionNative", "()V", 1391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande (void *)android_net_wifi_closeSupplicantConnection }, 1392155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "waitForEventNative", "()Ljava/lang/String;", (void*)android_net_wifi_waitForEvent }, 1393155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doBooleanCommandNative", "(Ljava/lang/String;)Z", (void*)android_net_wifi_doBooleanCommand }, 1394155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doIntCommandNative", "(Ljava/lang/String;)I", (void*)android_net_wifi_doIntCommand }, 1395155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doStringCommandNative", "(Ljava/lang/String;)Ljava/lang/String;", 1396155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande (void*) android_net_wifi_doStringCommand }, 13977ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "startHalNative", "()Z", (void*) android_net_wifi_startHal }, 13987ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "stopHalNative", "()V", (void*) android_net_wifi_stopHal }, 13997ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "waitForHalEventNative", "()V", (void*) android_net_wifi_waitForHalEvents }, 14007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde { "getInterfacesNative", "()I", (void*) android_net_wifi_getInterfaces}, 14017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde { "getInterfaceNameNative", "(I)Ljava/lang/String;", (void*) android_net_wifi_getInterfaceName}, 1402e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "getScanCapabilitiesNative", "(ILcom/android/server/wifi/WifiNative$ScanCapabilities;)Z", 1403e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void *) android_net_wifi_getScanCapabilities}, 1404e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "startScanNative", "(IILcom/android/server/wifi/WifiNative$ScanSettings;)Z", 1405e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_startScan}, 1406e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "stopScanNative", "(II)Z", (void*) android_net_wifi_stopScan}, 1407c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande { "getScanResultsNative", "(IZ)[Landroid/net/wifi/WifiScanner$ScanData;", 1408e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void *) android_net_wifi_getScanResults}, 1409e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "setHotlistNative", "(IILandroid/net/wifi/WifiScanner$HotlistSettings;)Z", 1410e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_setHotlist}, 1411e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "resetHotlistNative", "(II)Z", (void*) android_net_wifi_resetHotlist}, 1412e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "trackSignificantWifiChangeNative", "(IILandroid/net/wifi/WifiScanner$WifiChangeSettings;)Z", 1413e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_trackSignificantWifiChange}, 1414e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "untrackSignificantWifiChangeNative", "(II)Z", 1415aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle (void*) android_net_wifi_untrackSignificantWifiChange}, 1416aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle { "getWifiLinkLayerStatsNative", "(I)Landroid/net/wifi/WifiLinkLayerStats;", 1417a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande (void*) android_net_wifi_getLinkLayerStats}, 1418c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande { "getSupportedFeatureSetNative", "(I)I", 1419143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande (void*) android_net_wifi_getSupportedFeatures}, 1420143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande { "requestRangeNative", "(II[Landroid/net/wifi/RttManager$RttParams;)Z", 1421143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande (void*) android_net_wifi_requestRange}, 1422143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande { "cancelRangeRequestNative", "(II[Landroid/net/wifi/RttManager$RttParams;)Z", 1423042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande (void*) android_net_wifi_cancelRange}, 142490b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande { "setScanningMacOuiNative", "(I[B)Z", (void*) android_net_wifi_setScanningMacOui}, 142590b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande { "getChannelsForBandNative", "(II)[I", (void*) android_net_wifi_getValidChannels}, 1426b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe { "setDfsFlagNative", "(IZ)Z", (void*) android_net_wifi_setDfsFlag}, 142712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe { "toggleInterfaceNative", "(I)Z", (void*) android_net_wifi_toggle_interface}, 142812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe { "getRttCapabilitiesNative", "(I)Landroid/net/wifi/RttManager$RttCapabilities;", 1429a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle (void*) android_net_wifi_get_rtt_capabilities}, 14307d6301ead19afdf3de37455e9ed133c25b4938cdVinit Deshpande { "startLogging", "(I)Z", (void*) android_net_wifi_start_logging} 1431155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 1432155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1433155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeint register_android_net_wifi_WifiNative(JNIEnv* env) { 1434155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return AndroidRuntime::registerNativeMethods(env, 1435155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com/android/server/wifi/WifiNative", gWifiMethods, NELEM(gWifiMethods)); 1436155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 1437155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1438155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1439155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* User to register native functions */ 1440155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeextern "C" 1441155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandejint Java_com_android_server_wifi_WifiNative_registerNatives(JNIEnv* env, jclass clazz) { 1442155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return AndroidRuntime::registerNativeMethods(env, 1443155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com/android/server/wifi/WifiNative", gWifiMethods, NELEM(gWifiMethods)); 1444155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 1445155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1446155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; // namespace android 1447