com_android_server_wifi_WifiNative.cpp revision f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90
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; 616f7fe1cb242de8bec6c3e5c143bf4730aa51f718xin He hal_fn->wifi_get_cached_gscan_results = wifi_get_cached_gscan_results_stub; 62ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_bssid_hotlist = wifi_set_bssid_hotlist_stub; 63ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_reset_bssid_hotlist = wifi_reset_bssid_hotlist_stub; 64ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_significant_change_handler = wifi_set_significant_change_handler_stub; 65ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_reset_significant_change_handler = wifi_reset_significant_change_handler_stub; 66ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_gscan_capabilities = wifi_get_gscan_capabilities_stub; 67ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_link_stats = wifi_set_link_stats_stub; 68ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_link_stats = wifi_get_link_stats_stub; 69ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_clear_link_stats = wifi_clear_link_stats_stub; 70ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_valid_channels = wifi_get_valid_channels_stub; 71ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_rtt_range_request = wifi_rtt_range_request_stub; 72ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_rtt_range_cancel = wifi_rtt_range_cancel_stub; 73ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_get_rtt_capabilities = wifi_get_rtt_capabilities_stub; 74ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_nodfs_flag = wifi_set_nodfs_flag_stub; 75ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_start_logging = wifi_start_logging_stub; 76ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_epno_list = wifi_set_epno_list_stub; 77ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn->wifi_set_country_code = wifi_set_country_code_stub; 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 222dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("setting SSID to %s", result->ssid); 223dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //jstring jssid = env->NewStringUTF(result->ssid); 224b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setStringField(env, scanResult, "SSID", result->ssid); 225f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 226f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde char bssid[32]; 227b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result->bssid[0], result->bssid[1], 228b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande result->bssid[2], result->bssid[3], result->bssid[4], result->bssid[5]); 229dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //jstring jbssid = env->NewStringUTF(bssid); 230f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 231f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde setStringField(env, scanResult, "BSSID", bssid); 232f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 233b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setIntField(env, scanResult, "level", result->rssi); 234b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setIntField(env, scanResult, "frequency", result->channel); 235b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande setLongField(env, scanResult, "timestamp", result->ts); 236f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 237f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde return scanResult; 238f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde} 239f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 240be3b27a3749af234b5fd7340aefb9f25060fb433xinheint set_iface_flags(const char *ifname, int dev_up) { 241be3b27a3749af234b5fd7340aefb9f25060fb433xinhe struct ifreq ifr; 242be3b27a3749af234b5fd7340aefb9f25060fb433xinhe int ret; 243be3b27a3749af234b5fd7340aefb9f25060fb433xinhe int sock = socket(PF_INET, SOCK_DGRAM, 0); 244be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (sock < 0) { 245be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("Bad socket: %d\n", sock); 246be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return -errno; 247be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 248be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 249dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //ALOGD("setting interface %s flags (%s)\n", ifname, dev_up ? "UP" : "DOWN"); 250be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 251be3b27a3749af234b5fd7340aefb9f25060fb433xinhe memset(&ifr, 0, sizeof(ifr)); 252be3b27a3749af234b5fd7340aefb9f25060fb433xinhe strlcpy(ifr.ifr_name, ifname, IFNAMSIZ); 253be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 254dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //ALOGD("reading old value\n"); 255be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 256be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (ioctl(sock, SIOCGIFFLAGS, &ifr) != 0) { 257be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ret = errno ? -errno : -999; 258bb6942c6b6d129fd8904e341c9ce4a4118ed3e0bVinit Deshpande ALOGE("Could not read interface %s flags: %d\n", ifname, errno); 259be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 260be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return ret; 261be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } else { 262dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //ALOGD("writing new value\n"); 263be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 264be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 265be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (dev_up) { 266be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (ifr.ifr_flags & IFF_UP) { 267bb6942c6b6d129fd8904e341c9ce4a4118ed3e0bVinit Deshpande // ALOGD("interface %s is already up\n", ifname); 268be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 269be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return 0; 270be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 271be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ifr.ifr_flags |= IFF_UP; 272be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } else { 273be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (!(ifr.ifr_flags & IFF_UP)) { 274bb6942c6b6d129fd8904e341c9ce4a4118ed3e0bVinit Deshpande // ALOGD("interface %s is already down\n", ifname); 275be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 276be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return 0; 277be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 278be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ifr.ifr_flags &= ~IFF_UP; 279be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 280be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 281be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if (ioctl(sock, SIOCSIFFLAGS, &ifr) != 0) { 282bb6942c6b6d129fd8904e341c9ce4a4118ed3e0bVinit Deshpande ALOGE("Could not set interface %s flags \n", ifname); 283be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 284be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return ret; 285be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } else { 286be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("set interface %s flags (%s)\n", ifname, dev_up ? "UP" : "DOWN"); 287be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 288be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 289be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return 0; 290be3b27a3749af234b5fd7340aefb9f25060fb433xinhe} 291be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 292b830d76fbf5fa4077531b516066faa2fdbb92e81xinhestatic jboolean android_net_wifi_toggle_interface(JNIEnv* env, jclass cls, int toggle) { 293b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe return(set_iface_flags("wlan0", toggle) == 0); 294b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe} 295b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe 296b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jboolean android_net_wifi_startHal(JNIEnv* env, jclass cls) { 297b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 2987ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde if (halHandle == NULL) { 299ec61e7731968be994a23f2bd138f6761c8aea498xinhe 300ec61e7731968be994a23f2bd138f6761c8aea498xinhe if(init_wifi_hal_func_table(&hal_fn) != 0 ) { 301ec61e7731968be994a23f2bd138f6761c8aea498xinhe ALOGD("Can not initialize the basic function pointer table"); 302ec61e7731968be994a23f2bd138f6761c8aea498xinhe return false; 303ec61e7731968be994a23f2bd138f6761c8aea498xinhe } 304ec61e7731968be994a23f2bd138f6761c8aea498xinhe 305ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error res = init_wifi_vendor_hal_func_table(&hal_fn); 306ec61e7731968be994a23f2bd138f6761c8aea498xinhe if (res != WIFI_SUCCESS) { 307ec61e7731968be994a23f2bd138f6761c8aea498xinhe ALOGD("Can not initialize the vendor function pointer table"); 308ec61e7731968be994a23f2bd138f6761c8aea498xinhe return false; 309ec61e7731968be994a23f2bd138f6761c8aea498xinhe } 310ec61e7731968be994a23f2bd138f6761c8aea498xinhe 311be3b27a3749af234b5fd7340aefb9f25060fb433xinhe int ret = set_iface_flags("wlan0", 1); 312be3b27a3749af234b5fd7340aefb9f25060fb433xinhe if(ret != 0) { 313be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return false; 314be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 315ec61e7731968be994a23f2bd138f6761c8aea498xinhe 316ec61e7731968be994a23f2bd138f6761c8aea498xinhe res = hal_fn.wifi_initialize(&halHandle); 3177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (res == WIFI_SUCCESS) { 318b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongField(env, cls, WifiHandleVarName, (jlong)halHandle); 319aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGD("Did set static halHandle = %p", halHandle); 3207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde env->GetJavaVM(&mVM); 322b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mCls = (jclass) env->NewGlobalRef(cls); 323b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("halHandle = %p, mVM = %p, mCls = %p", halHandle, mVM, mCls); 3247ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde return res == WIFI_SUCCESS; 3257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 326826282265badbd85c5386573fbced1755696fe83xinhe return (set_iface_flags("wlan0", 1) == 0); 3277ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde } 3287ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3297ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 3307ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapndevoid android_net_wifi_hal_cleaned_up_handler(wifi_handle handle) { 3317ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde ALOGD("In wifi cleaned up handler"); 3327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3337f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde JNIEnv * env = getEnv(); 334b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongField(env, mCls, WifiHandleVarName, 0); 335b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande env->DeleteGlobalRef(mCls); 336b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mCls = NULL; 3377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde mVM = NULL; 3387ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3397ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 340b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic void android_net_wifi_stopHal(JNIEnv* env, jclass cls) { 3417ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde ALOGD("In wifi stop Hal"); 342b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe 343b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 344ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn.wifi_cleanup(halHandle, android_net_wifi_hal_cleaned_up_handler); 345be3b27a3749af234b5fd7340aefb9f25060fb433xinhe set_iface_flags("wlan0", 0); 3467ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3477ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 348b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic void android_net_wifi_waitForHalEvents(JNIEnv* env, jclass cls) { 3497f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 350b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("waitForHalEvents called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 3517f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 352b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 353ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn.wifi_event_loop(halHandle); 3547ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3557ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 356b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic int android_net_wifi_getInterfaces(JNIEnv *env, jclass cls) { 3577f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde int n = 0; 358b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_handle halHandle = getWifiHandle(env, cls); 3597f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde wifi_interface_handle *ifaceHandles = NULL; 360ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_ifaces(halHandle, &n, &ifaceHandles); 3617f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (result < 0) { 3627f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return result; 3637f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3647f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 36507ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande if (n < 0) { 36607ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande THROW(env, "android_net_wifi_getInterfaces no interfaces"); 367aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 368aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 369aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 370aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (ifaceHandles == NULL) { 371aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle THROW(env, "android_net_wifi_getInterfaces null interface array"); 372aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 373aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 374aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 37507ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande if (n > 8) { 37607ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande THROW(env, "Too many interfaces"); 37707ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande return 0; 37807ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande } 37907ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande 3807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlongArray array = (env)->NewLongArray(n); 3817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (array == NULL) { 3827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde THROW(env, "Error in accessing array"); 3837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return 0; 3847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3857f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3867f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlong elems[8]; 3877f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde for (int i = 0; i < n; i++) { 3887f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde elems[i] = reinterpret_cast<jlong>(ifaceHandles[i]); 3897f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3907f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde env->SetLongArrayRegion(array, 0, n, elems); 391b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande setStaticLongArrayField(env, cls, WifiIfaceHandleVarName, array); 3927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return (result < 0) ? result : n; 3947f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 3957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 396b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jstring android_net_wifi_getInterfaceName(JNIEnv *env, jclass cls, jint i) { 3977f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde char buf[EVENT_BUF_SIZE]; 3987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 399b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande jlong value = getStaticLongArrayField(env, cls, WifiIfaceHandleVarName, i); 4007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde wifi_interface_handle handle = (wifi_interface_handle) value; 401ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_iface_name(handle, buf, sizeof(buf)); 4027f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (result < 0) { 4037f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return NULL; 4047f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 4057f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return env->NewStringUTF(buf); 4067f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 4077f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 4087f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 409b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 410766cb4b1fa3b93c146952eacbf6756f67f172ec1Vinit Deshapndestatic void onScanResultsAvailable(wifi_request_id id, unsigned num_results) { 411766cb4b1fa3b93c146952eacbf6756f67f172ec1Vinit Deshapnde 4127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde JNIEnv *env = NULL; 4137f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 4147f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 415b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("onScanResultsAvailable called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 416766cb4b1fa3b93c146952eacbf6756f67f172ec1Vinit Deshapnde 417b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onScanResultsAvailable", "(I)V", id); 418e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 419e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 420b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpandestatic void onScanEvent(wifi_scan_event event, unsigned status) { 421b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande JNIEnv *env = NULL; 422b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande mVM->AttachCurrentThread(&env, NULL); 423b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 424b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande ALOGD("onScanStatus called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 425b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 426827bc400bfb327a7c0bb2ed03f17d88c56cf85aaNavtej Singh Mann reportEvent(env, mCls, "onScanStatus", "(I)V", event); 427b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande} 428b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 429f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapndestatic void onFullScanResult(wifi_request_id id, wifi_scan_result *result) { 430f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 431f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde JNIEnv *env = NULL; 432f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 433f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 434f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande //ALOGD("onFullScanResult called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 435f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 436b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande jobject scanResult = createScanResult(env, result); 437f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 438f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande //ALOGD("Creating a byte array of length %d", result->ie_length); 439f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 440f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde jbyteArray elements = env->NewByteArray(result->ie_length); 441f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde if (elements == NULL) { 442f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGE("Error in allocating array"); 443f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde return; 444f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde } 445f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 446f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande // ALOGD("Setting byte array"); 447f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 448f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde jbyte *bytes = (jbyte *)&(result->ie_data[0]); 449f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde env->SetByteArrayRegion(elements, 0, result->ie_length, bytes); 450f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 451f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande // ALOGD("Returning result"); 452f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 453b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onFullScanResult", "(ILandroid/net/wifi/ScanResult;[B)V", id, 454f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde scanResult, elements); 455b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 456b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande env->DeleteLocalRef(scanResult); 457b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande env->DeleteLocalRef(elements); 458f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde} 459f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 460e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_startScan( 461b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject settings) { 462e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 463b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 464e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("starting scan on interface[%d] = %p", iface, handle); 465e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 466e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_scan_cmd_params params; 467e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(¶ms, 0, sizeof(params)); 468aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 469e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.base_period = getIntField(env, settings, "base_period_ms"); 470e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.max_ap_per_scan = getIntField(env, settings, "max_ap_per_scan"); 471c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande params.report_threshold_percent = getIntField(env, settings, "report_threshold_percent"); 472c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande params.report_threshold_num_scans = getIntField(env, settings, "report_threshold_num_scans"); 473aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 474c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGD("Initialized common fields %d, %d, %d, %d", params.base_period, params.max_ap_per_scan, 475c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande params.report_threshold_percent, params.report_threshold_num_scans); 476e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 477e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *bucket_array_type = "[Lcom/android/server/wifi/WifiNative$BucketSettings;"; 478e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *channel_array_type = "[Lcom/android/server/wifi/WifiNative$ChannelSettings;"; 479aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 480e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray buckets = (jobjectArray)getObjectField(env, settings, "buckets", bucket_array_type); 481e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.num_buckets = getIntField(env, settings, "num_buckets"); 482aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 483e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized num_buckets to %d", params.num_buckets); 484e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 485e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (int i = 0; i < params.num_buckets; i++) { 486e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject bucket = getObjectArrayField(env, settings, "buckets", bucket_array_type, i); 487aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 488e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].bucket = getIntField(env, bucket, "bucket"); 489e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].band = (wifi_band) getIntField(env, bucket, "band"); 490e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].period = getIntField(env, bucket, "period_ms"); 491aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 492e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized common bucket fields %d:%d:%d", params.buckets[i].bucket, 493e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].band, params.buckets[i].period); 494e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 495e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde int report_events = getIntField(env, bucket, "report_events"); 496e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].report_events = report_events; 497aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 498e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized report events to %d", params.buckets[i].report_events); 499e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 500e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray channels = (jobjectArray)getObjectField( 501e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env, bucket, "channels", channel_array_type); 502aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 503e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].num_channels = getIntField(env, bucket, "num_channels"); 504e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized num_channels to %d", params.buckets[i].num_channels); 505e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 506e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (int j = 0; j < params.buckets[i].num_channels; j++) { 507e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject channel = getObjectArrayField(env, bucket, "channels", channel_array_type, j); 508aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 509e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].channels[j].channel = getIntField(env, channel, "frequency"); 510e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].channels[j].dwellTimeMs = getIntField(env, channel, "dwell_time_ms"); 511aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 512e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde bool passive = getBoolField(env, channel, "passive"); 513e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].channels[j].passive = (passive ? 1 : 0); 514e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 515bb6942c6b6d129fd8904e341c9ce4a4118ed3e0bVinit Deshpande // ALOGD("Initialized channel %d", params.buckets[i].channels[j].channel); 516e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 517e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 518e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 519f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande // ALOGD("Initialized all fields"); 520e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 521e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_scan_result_handler handler; 522e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&handler, 0, sizeof(handler)); 523e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_scan_results_available = &onScanResultsAvailable; 524f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde handler.on_full_scan_result = &onFullScanResult; 525b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande handler.on_scan_event = &onScanEvent; 526e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 527ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_start_gscan(id, handle, params, handler) == WIFI_SUCCESS; 528e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 529e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 530b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jboolean android_net_wifi_stopScan(JNIEnv *env, jclass cls, jint iface, jint id) { 531b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 532e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("stopping scan on interface[%d] = %p", iface, handle); 533e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 534ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_stop_gscan(id, handle) == WIFI_SUCCESS; 535e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 536e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 537c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpandestatic int compare_scan_result_timestamp(const void *v1, const void *v2) { 538c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande const wifi_scan_result *result1 = static_cast<const wifi_scan_result *>(v1); 539c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande const wifi_scan_result *result2 = static_cast<const wifi_scan_result *>(v2); 540c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return result1->ts - result2->ts; 541c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande} 542c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 543e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jobject android_net_wifi_getScanResults( 544b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jboolean flush) { 545e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 546c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande wifi_cached_scan_results scan_data[64]; 547c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande int num_scan_data = 64; 548e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 549b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 550f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande // ALOGD("getting scan results on interface[%d] = %p", iface, handle); 551c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 552c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande byte b = flush ? 0 : 0xFF; 553ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_cached_gscan_results(handle, b, num_scan_data, scan_data, &num_scan_data); 554e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (result == WIFI_SUCCESS) { 555c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobjectArray scanData = createObjectArray(env, 556c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande "android/net/wifi/WifiScanner$ScanData", num_scan_data); 557c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanData == NULL) { 558c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in allocating array of scanData"); 559e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 560e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 561e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 562c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande for (int i = 0; i < num_scan_data; i++) { 563c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 564c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobject data = createObject(env, "android/net/wifi/WifiScanner$ScanData"); 565c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (data == NULL) { 566c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in allocating scanData"); 567c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return NULL; 568c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 569e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 570c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, data, "mId", scan_data[i].scan_id); 571c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, data, "mFlags", scan_data[i].flags); 572e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 573c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande /* sort all scan results by timestamp */ 574c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande qsort(scan_data[i].results, scan_data[i].num_results, 575c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande sizeof(wifi_scan_result), compare_scan_result_timestamp); 576c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 577c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobjectArray scanResults = createObjectArray(env, 578c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande "android/net/wifi/ScanResult", scan_data[i].num_results); 579c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanResults == NULL) { 580c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in allocating scanResult array"); 581e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 582e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 583e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 584c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande wifi_scan_result *results = scan_data[i].results; 585c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande for (int j = 0; j < scan_data[i].num_results; j++) { 586c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 587c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 588c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanResult == NULL) { 589c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGE("Error in creating scan result"); 590c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return NULL; 591c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 5927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 593c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setStringField(env, scanResult, "SSID", results[j].ssid); 594e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 595c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande char bssid[32]; 596c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[j].bssid[0], 597c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande results[j].bssid[1], results[j].bssid[2], results[j].bssid[3], 598c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande results[j].bssid[4], results[j].bssid[5]); 599e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 600c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setStringField(env, scanResult, "BSSID", bssid); 601c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 602c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, scanResult, "level", results[j].rssi); 603c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setIntField(env, scanResult, "frequency", results[j].channel); 604c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setLongField(env, scanResult, "timestamp", results[j].ts); 605c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 606c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande env->SetObjectArrayElement(scanResults, j, scanResult); 607c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande env->DeleteLocalRef(scanResult); 608c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 609e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 610c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande setObjectField(env, data, "mResults", "[Landroid/net/wifi/ScanResult;", scanResults); 611c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande env->SetObjectArrayElement(scanData, i, data); 612e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 613e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 614f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande ALOGD("retrieved %d scan data from interface[%d] = %p", num_scan_data, iface, handle); 615c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return scanData; 616e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } else { 617e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 618e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 619e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 620e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 621e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 622e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_getScanCapabilities( 623b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jobject capabilities) { 624e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 625b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 626f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande // ALOGD("getting scan capabilities on interface[%d] = %p", iface, handle); 627e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 628e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_gscan_capabilities c; 629e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&c, 0, sizeof(c)); 630ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_gscan_capabilities(handle, &c); 631e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (result != WIFI_SUCCESS) { 632e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("failed to get capabilities : %d", result); 633e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return JNI_FALSE; 634e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 635e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 636e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_scan_cache_size", c.max_scan_cache_size); 637e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_scan_buckets", c.max_scan_buckets); 638e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_ap_cache_per_scan", c.max_ap_cache_per_scan); 639e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_rssi_sample_size", c.max_rssi_sample_size); 640e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_scan_reporting_threshold", c.max_scan_reporting_threshold); 641c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle setIntField(env, capabilities, "max_hotlist_bssids", c.max_hotlist_bssids); 642e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, capabilities, "max_significant_wifi_change_aps", 643e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde c.max_significant_wifi_change_aps); 644e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 645e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return JNI_TRUE; 646e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 647e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 648e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 649e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic byte parseHexChar(char ch) { 650e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (isdigit(ch)) 651e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - '0'; 652e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else if ('A' <= ch && ch <= 'F') 653e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - 'A' + 10; 654e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else if ('a' <= ch && ch <= 'f') 655e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - 'a' + 10; 656e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else { 657e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("invalid character in bssid %c", ch); 658e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return 0; 659e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 660e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 661e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 662e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic byte parseHexByte(const char * &str) { 663e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde byte b = parseHexChar(str[0]); 664e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (str[1] == ':' || str[1] == '\0') { 665e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde str += 2; 666e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return b; 667e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } else { 668e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde b = b << 4 | parseHexChar(str[1]); 669e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde str += 3; 670e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return b; 671e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 672e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 673e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 674e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic void parseMacAddress(const char *str, mac_addr addr) { 675e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[0] = parseHexByte(str); 676e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[1] = parseHexByte(str); 677e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2] = parseHexByte(str); 678e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[3] = parseHexByte(str); 679e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[4] = parseHexByte(str); 680e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[5] = parseHexByte(str); 681e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 682e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 683143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic bool parseMacAddress(JNIEnv *env, jobject obj, mac_addr addr) { 684143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jstring macAddrString = (jstring) getObjectField( 685143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande env, obj, "bssid", "Ljava/lang/String;"); 686143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 687143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (macAddrString == NULL) { 688143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error getting bssid field"); 689143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return false; 690143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 691143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 692143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande const char *bssid = env->GetStringUTFChars(macAddrString, NULL); 693143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (bssid == NULL) { 694143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error getting bssid"); 695143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return false; 696143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 697143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 698143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande parseMacAddress(bssid, addr); 699143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return true; 700143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 701143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 702e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic void onHotlistApFound(wifi_request_id id, 703e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde unsigned num_results, wifi_scan_result *results) { 704e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 705e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde JNIEnv *env = NULL; 706e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 707e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 708e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("onHotlistApFound called, vm = %p, obj = %p, env = %p, num_results = %d", 709b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mVM, mCls, env, num_results); 710e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 711e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); 7127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (clsScanResult == NULL) { 7137f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in accessing class"); 7147f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 7157f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 7167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); 7187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (scanResults == NULL) { 7197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in allocating array"); 7207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 7217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 7227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde for (unsigned i = 0; i < num_results; i++) { 7247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 725e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 7267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (scanResult == NULL) { 7277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde ALOGE("Error in creating scan result"); 7287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 7297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 7307f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setStringField(env, scanResult, "SSID", results[i].ssid); 7327f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7337f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde char bssid[32]; 734e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], 7357f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde results[i].bssid[2], results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); 7367f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7377f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setStringField(env, scanResult, "BSSID", bssid); 7387f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7397f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setIntField(env, scanResult, "level", results[i].rssi); 740e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setIntField(env, scanResult, "frequency", results[i].channel); 7417f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde setLongField(env, scanResult, "timestamp", results[i].ts); 742e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 743e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env->SetObjectArrayElement(scanResults, i, scanResult); 744e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 745e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Found AP %32s %s", results[i].ssid, bssid); 746e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 747e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 748b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onHotlistApFound", "(I[Landroid/net/wifi/ScanResult;)V", 749e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde id, scanResults); 750e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 751e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 752e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpandestatic void onHotlistApLost(wifi_request_id id, 753e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande unsigned num_results, wifi_scan_result *results) { 754e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 755e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande JNIEnv *env = NULL; 756e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande mVM->AttachCurrentThread(&env, NULL); 757e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 758e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGD("onHotlistApLost called, vm = %p, obj = %p, env = %p, num_results = %d", 759e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande mVM, mCls, env, num_results); 760e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 761e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); 762e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (clsScanResult == NULL) { 763e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGE("Error in accessing class"); 764e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 765e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 766e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 767e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); 768e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (scanResults == NULL) { 769e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGE("Error in allocating array"); 770e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 771e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 772e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 773e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande for (unsigned i = 0; i < num_results; i++) { 774e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 775e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 776e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (scanResult == NULL) { 777e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGE("Error in creating scan result"); 778e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 779e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 780e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 781e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setStringField(env, scanResult, "SSID", results[i].ssid); 782e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 783e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande char bssid[32]; 784e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], 785e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande results[i].bssid[2], results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); 786e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 787e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setStringField(env, scanResult, "BSSID", bssid); 788e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 789e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setIntField(env, scanResult, "level", results[i].rssi); 790e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setIntField(env, scanResult, "frequency", results[i].channel); 791e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande setLongField(env, scanResult, "timestamp", results[i].ts); 792e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 793e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande env->SetObjectArrayElement(scanResults, i, scanResult); 794e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 795e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande ALOGD("Lost AP %32s %s", results[i].ssid, bssid); 796e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 797e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 798e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande reportEvent(env, mCls, "onHotlistApLost", "(I[Landroid/net/wifi/ScanResult;)V", 799e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande id, scanResults); 800e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande} 801e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 802e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 803e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_setHotlist( 804b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject ap) { 805e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 806b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 807e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("setting hotlist on interface[%d] = %p", iface, handle); 808e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 809e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_bssid_hotlist_params params; 810e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(¶ms, 0, sizeof(params)); 811e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 812e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande params.lost_ap_sample_size = getIntField(env, ap, "apLostThreshold"); 813e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 814e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray array = (jobjectArray) getObjectField(env, ap, 815b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande "bssidInfos", "[Landroid/net/wifi/WifiScanner$BssidInfo;"); 816c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle params.num_bssid = env->GetArrayLength(array); 817e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 818c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle if (params.num_bssid == 0) { 819e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in accesing array"); 820e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 821e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 822e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 823c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle for (int i = 0; i < params.num_bssid; i++) { 824e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject objAp = env->GetObjectArrayElement(array, i); 825e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 826e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jstring macAddrString = (jstring) getObjectField( 827e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env, objAp, "bssid", "Ljava/lang/String;"); 828e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (macAddrString == NULL) { 829e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid field"); 830e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 831e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 832e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 833e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *bssid = env->GetStringUTFChars(macAddrString, NULL); 834e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (bssid == NULL) { 835e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid"); 836e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 837e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 838a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande parseMacAddress(bssid, params.ap[i].bssid); 839e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 840e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mac_addr addr; 841a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande memcpy(addr, params.ap[i].bssid, sizeof(mac_addr)); 842e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 843e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssidOut[32]; 844e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde sprintf(bssidOut, "%0x:%0x:%0x:%0x:%0x:%0x", addr[0], addr[1], 845e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2], addr[3], addr[4], addr[5]); 846e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 847e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Added bssid %s", bssidOut); 848e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 849a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].low = getIntField(env, objAp, "low"); 850a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].high = getIntField(env, objAp, "high"); 851e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 852e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 853e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_hotlist_ap_found_handler handler; 854e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&handler, 0, sizeof(handler)); 855e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 856e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_hotlist_ap_found = &onHotlistApFound; 857e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande handler.on_hotlist_ap_lost = &onHotlistApLost; 858ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_set_bssid_hotlist(id, handle, params, handler) == WIFI_SUCCESS; 859e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 860e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 861e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_resetHotlist( 862b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id) { 863e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 864b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 865e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("resetting hotlist on interface[%d] = %p", iface, handle); 866e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 867ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_reset_bssid_hotlist(id, handle) == WIFI_SUCCESS; 868e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 869e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 870a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpandevoid onSignificantWifiChange(wifi_request_id id, 871a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande unsigned num_results, wifi_significant_change_result **results) { 872e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde JNIEnv *env = NULL; 873e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mVM->AttachCurrentThread(&env, NULL); 874e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 875b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("onSignificantWifiChange called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 876e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 877e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); 878e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (clsScanResult == NULL) { 879e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in accessing class"); 880e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 881e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 882e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 883e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); 884e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (scanResults == NULL) { 885e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in allocating array"); 886e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 887e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 888e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 889e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (unsigned i = 0; i < num_results; i++) { 890e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 891d31a40e4c13481c0e70b0b6392bccf6a0f75c4e7Greg Hackmann wifi_significant_change_result &result = *(results[i]); 892a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande 893e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); 894e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (scanResult == NULL) { 895e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error in creating scan result"); 896e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 897e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 898e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 899a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande // setStringField(env, scanResult, "SSID", results[i].ssid); 900e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 901e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssid[32]; 902a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result.bssid[0], result.bssid[1], 903a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande result.bssid[2], result.bssid[3], result.bssid[4], result.bssid[5]); 904e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 905e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde setStringField(env, scanResult, "BSSID", bssid); 906e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 9074dbfefd99e51ab1cca058026c90f8093b099198bVinit Deshpande setIntField(env, scanResult, "level", result.rssi[0]); 908a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande setIntField(env, scanResult, "frequency", result.channel); 909a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande // setLongField(env, scanResult, "timestamp", result.ts); 9107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 9117f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde env->SetObjectArrayElement(scanResults, i, scanResult); 9127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 9137f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 914b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande reportEvent(env, mCls, "onSignificantWifiChange", "(I[Landroid/net/wifi/ScanResult;)V", 915e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde id, scanResults); 916e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 9177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 9187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 919e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_trackSignificantWifiChange( 920b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject settings) { 9217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 922b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 923e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("tracking significant wifi change on interface[%d] = %p", iface, handle); 9247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 925e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_significant_change_params params; 9267f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde memset(¶ms, 0, sizeof(params)); 9277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 928e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.rssi_sample_size = getIntField(env, settings, "rssiSampleSize"); 929e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.lost_ap_sample_size = getIntField(env, settings, "lostApSampleSize"); 930e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.min_breaching = getIntField(env, settings, "minApsBreachingThreshold"); 931e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 932b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande const char *bssid_info_array_type = "[Landroid/net/wifi/WifiScanner$BssidInfo;"; 933b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande jobjectArray bssids = (jobjectArray)getObjectField( 934b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande env, settings, "bssidInfos", bssid_info_array_type); 935c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle params.num_bssid = env->GetArrayLength(bssids); 936e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 937c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle if (params.num_bssid == 0) { 938aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGE("Error in accessing array"); 939e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 940e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 941e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 942e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized common fields %d, %d, %d, %d", params.rssi_sample_size, 943c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle params.lost_ap_sample_size, params.min_breaching, params.num_bssid); 944e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 945c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle for (int i = 0; i < params.num_bssid; i++) { 946b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande jobject objAp = env->GetObjectArrayElement(bssids, i); 947e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 948e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde jstring macAddrString = (jstring) getObjectField( 949e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde env, objAp, "bssid", "Ljava/lang/String;"); 950e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (macAddrString == NULL) { 951e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid field"); 952e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 953e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 954e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 955e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *bssid = env->GetStringUTFChars(macAddrString, NULL); 956e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (bssid == NULL) { 957e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid"); 958e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 959e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 960e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 961e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mac_addr addr; 962e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde parseMacAddress(bssid, addr); 963a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande memcpy(params.ap[i].bssid, addr, sizeof(mac_addr)); 964e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 965e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssidOut[32]; 9664dbfefd99e51ab1cca058026c90f8093b099198bVinit Deshpande sprintf(bssidOut, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], 967e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2], addr[3], addr[4], addr[5]); 968e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 969a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].low = getIntField(env, objAp, "low"); 970a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande params.ap[i].high = getIntField(env, objAp, "high"); 971e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 972a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande ALOGD("Added bssid %s, [%04d, %04d]", bssidOut, params.ap[i].low, params.ap[i].high); 973e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 974e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 975c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle ALOGD("Added %d bssids", params.num_bssid); 976e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 977e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_significant_change_handler handler; 9787f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde memset(&handler, 0, sizeof(handler)); 9797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 980e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_significant_change = &onSignificantWifiChange; 981ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_set_significant_change_handler(id, handle, params, handler) == WIFI_SUCCESS; 9827f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 9837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 984e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_untrackSignificantWifiChange( 985b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id) { 986e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 987b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 988e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("resetting significant wifi change on interface[%d] = %p", iface, handle); 9897f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 990ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_reset_significant_change_handler(id, handle) == WIFI_SUCCESS; 9917f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 9927ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 993aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallewifi_iface_stat link_stat; 994200e8ee5097134010a6edee8d031bb02ff7eeb5avandwallewifi_radio_stat radio_stat; // L release has support for only one radio 995aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 996aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallevoid onLinkStatsResults(wifi_request_id id, wifi_iface_stat *iface_stat, 997200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle int num_radios, wifi_radio_stat *radio_stats) 998aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{ 999200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle if (iface_stat != 0) { 1000200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memcpy(&link_stat, iface_stat, sizeof(wifi_iface_stat)); 1001200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } else { 1002200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memset(&link_stat, 0, sizeof(wifi_iface_stat)); 1003200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } 1004200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 1005200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle if (num_radios > 0 && radio_stats != 0) { 1006200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memcpy(&radio_stat, radio_stats, sizeof(wifi_radio_stat)); 1007200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } else { 1008200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memset(&radio_stat, 0, sizeof(wifi_radio_stat)); 1009200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } 1010aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 1011aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1012b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jobject android_net_wifi_getLinkLayerStats (JNIEnv *env, jclass cls, jint iface) { 1013aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1014aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle wifi_stats_result_handler handler; 1015aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle memset(&handler, 0, sizeof(handler)); 1016aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle handler.on_link_stats_results = &onLinkStatsResults; 1017b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1018ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_link_stats(0, handle, handler); 1019aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (result < 0) { 1020200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle ALOGE("android_net_wifi_getLinkLayerStats: failed to get link statistics\n"); 1021aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return NULL; 1022aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 1023aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1024aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle jobject wifiLinkLayerStats = createObject(env, "android/net/wifi/WifiLinkLayerStats"); 1025aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (wifiLinkLayerStats == NULL) { 1026aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGE("Error in allocating wifiLinkLayerStats"); 1027aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return NULL; 1028aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 1029aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1030aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setIntField(env, wifiLinkLayerStats, "beacon_rx", link_stat.beacon_rx); 1031aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setIntField(env, wifiLinkLayerStats, "rssi_mgmt", link_stat.rssi_mgmt); 1032aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_be", link_stat.ac[WIFI_AC_BE].rx_mpdu); 1033aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_bk", link_stat.ac[WIFI_AC_BK].rx_mpdu); 1034aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_vi", link_stat.ac[WIFI_AC_VI].rx_mpdu); 1035aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "rxmpdu_vo", link_stat.ac[WIFI_AC_VO].rx_mpdu); 1036aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_be", link_stat.ac[WIFI_AC_BE].tx_mpdu); 1037aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_bk", link_stat.ac[WIFI_AC_BK].tx_mpdu); 1038aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_vi", link_stat.ac[WIFI_AC_VI].tx_mpdu); 1039aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "txmpdu_vo", link_stat.ac[WIFI_AC_VO].tx_mpdu); 1040aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_be", link_stat.ac[WIFI_AC_BE].mpdu_lost); 1041aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_bk", link_stat.ac[WIFI_AC_BK].mpdu_lost); 1042aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_vi", link_stat.ac[WIFI_AC_VI].mpdu_lost); 1043aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "lostmpdu_vo", link_stat.ac[WIFI_AC_VO].mpdu_lost); 1044aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_be", link_stat.ac[WIFI_AC_BE].retries); 1045aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_bk", link_stat.ac[WIFI_AC_BK].retries); 1046aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_vi", link_stat.ac[WIFI_AC_VI].retries); 1047aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle setLongField(env, wifiLinkLayerStats, "retries_vo", link_stat.ac[WIFI_AC_VO].retries); 1048aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1049200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 1050200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "on_time", radio_stat.on_time); 1051200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "tx_time", radio_stat.tx_time); 1052200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "rx_time", radio_stat.rx_time); 1053200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle setIntField(env, wifiLinkLayerStats, "on_time_scan", radio_stat.on_time_scan); 1054200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 1055aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return wifiLinkLayerStats; 1056aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 1057e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 1058c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpandestatic jint android_net_wifi_getSupportedFeatures(JNIEnv *env, jclass cls, jint iface) { 1059c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1060a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande feature_set set = 0; 1061a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 1062a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande wifi_error result = WIFI_SUCCESS; 1063c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande /* 1064a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande set = WIFI_FEATURE_INFRA 1065a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_INFRA_5G 1066a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_HOTSPOT 1067a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_P2P 1068a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_SOFT_AP 1069a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_GSCAN 1070a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_PNO 1071a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_TDLS 1072a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_EPR; 1073c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande */ 1074a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 1075ec61e7731968be994a23f2bd138f6761c8aea498xinhe result = hal_fn.wifi_get_supported_feature_set(handle, &set); 1076a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande if (result == WIFI_SUCCESS) { 1077f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande // ALOGD("wifi_get_supported_feature_set returned set = 0x%x", set); 1078a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande return set; 1079a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } else { 1080f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande ALOGE("wifi_get_supported_feature_set returned error = 0x%x", result); 1081a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande return 0; 1082a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } 1083a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande} 1084a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 108506a3ebada2343fe3f083339973f143b39d62b3c4xinhestatic void onRttResults(wifi_request_id id, unsigned num_results, wifi_rtt_result* results[]) { 1086143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande JNIEnv *env = NULL; 1087143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande mVM->AttachCurrentThread(&env, NULL); 1088143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1089143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGD("onRttResults called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 1090143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1091143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jclass clsRttResult = (env)->FindClass("android/net/wifi/RttManager$RttResult"); 1092143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (clsRttResult == NULL) { 1093143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error in accessing class"); 1094143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 1095143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1096143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1097143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jobjectArray rttResults = env->NewObjectArray(num_results, clsRttResult, NULL); 1098143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (rttResults == NULL) { 1099143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error in allocating array"); 1100143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 1101143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1102143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1103143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande for (unsigned i = 0; i < num_results; i++) { 1104143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 110506a3ebada2343fe3f083339973f143b39d62b3c4xinhe wifi_rtt_result *result = results[i]; 1106143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1107143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande jobject rttResult = createObject(env, "android/net/wifi/RttManager$RttResult"); 1108143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (rttResult == NULL) { 1109143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error in creating rtt result"); 1110143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 1111143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1112143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1113143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande char bssid[32]; 111406a3ebada2343fe3f083339973f143b39d62b3c4xinhe sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result->addr[0], result->addr[1], 111506a3ebada2343fe3f083339973f143b39d62b3c4xinhe result->addr[2], result->addr[3], result->addr[4], result->addr[5]); 1116143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1117143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande setStringField(env, rttResult, "bssid", bssid); 111806a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "burstNumber", result->burst_num); 111906a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "measurementFrameNumber", result->measurement_number); 112006a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "successMeasurementFrameNumber", result->success_number); 112106a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "frameNumberPerBurstPeer", result->number_per_burst_peer); 112206a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "status", result->status); 112306a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "measurementType", result->type); 112406a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "retryAfterDuration", result->retry_after_duration); 112506a3ebada2343fe3f083339973f143b39d62b3c4xinhe setLongField(env, rttResult, "ts", result->ts); 112606a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "rssi", result->rssi); 112706a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "rssiSpread", result->rssi_spread); 112806a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "txRate", result->tx_rate.bitrate); 112906a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "rxRate", result->rx_rate.bitrate); 113006a3ebada2343fe3f083339973f143b39d62b3c4xinhe setLongField(env, rttResult, "rtt", result->rtt); 113106a3ebada2343fe3f083339973f143b39d62b3c4xinhe setLongField(env, rttResult, "rttStandardDeviation", result->rtt_sd); 113206a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "distance", result->distance); 113306a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "distanceStandardDeviation", result->distance_sd); 113406a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "distanceSpread", result->distance_spread); 113506a3ebada2343fe3f083339973f143b39d62b3c4xinhe setIntField(env, rttResult, "burstDuration", result->burst_duration); 1136c96feb800590f43b7be76d1000ab5d949e5c6790xinhe setIntField(env, rttResult, "negotiatedBurstNum", result->negotiated_burst_num); 1137c96feb800590f43b7be76d1000ab5d949e5c6790xinhe jobject LCI = createObject(env, "android/net/wifi/RttManager$WifiInformationElement"); 1138c96feb800590f43b7be76d1000ab5d949e5c6790xinhe if (result->LCI != NULL && result->LCI->len > 0) { 1139c96feb800590f43b7be76d1000ab5d949e5c6790xinhe ALOGD("Add LCI in result"); 1140c96feb800590f43b7be76d1000ab5d949e5c6790xinhe setByteField(env, LCI, "id", result->LCI->id); 1141c96feb800590f43b7be76d1000ab5d949e5c6790xinhe jbyteArray elements = env->NewByteArray(result->LCI->len); 1142c96feb800590f43b7be76d1000ab5d949e5c6790xinhe jbyte *bytes = (jbyte *)&(result->LCI->data[0]); 1143c96feb800590f43b7be76d1000ab5d949e5c6790xinhe env->SetByteArrayRegion(elements, 0, result->LCI->len, bytes); 1144c96feb800590f43b7be76d1000ab5d949e5c6790xinhe setObjectField(env, LCI, "data", "[B", elements); 114593a1dbd961f05335635ede08eae6481284690c7dxinhe env->DeleteLocalRef(elements); 1146c96feb800590f43b7be76d1000ab5d949e5c6790xinhe } else { 1147c96feb800590f43b7be76d1000ab5d949e5c6790xinhe ALOGD("No LCI in result"); 1148c96feb800590f43b7be76d1000ab5d949e5c6790xinhe setByteField(env, LCI, "id", (byte)(0xff)); 1149c96feb800590f43b7be76d1000ab5d949e5c6790xinhe } 1150c96feb800590f43b7be76d1000ab5d949e5c6790xinhe setObjectField(env, rttResult, "LCI", 1151c96feb800590f43b7be76d1000ab5d949e5c6790xinhe "Landroid/net/wifi/RttManager$WifiInformationElement;", LCI); 1152c96feb800590f43b7be76d1000ab5d949e5c6790xinhe 1153c96feb800590f43b7be76d1000ab5d949e5c6790xinhe jobject LCR = createObject(env, "android/net/wifi/RttManager$WifiInformationElement"); 1154c96feb800590f43b7be76d1000ab5d949e5c6790xinhe if (result->LCR != NULL && result->LCR->len > 0) { 1155c96feb800590f43b7be76d1000ab5d949e5c6790xinhe ALOGD("Add LCR in result"); 1156c96feb800590f43b7be76d1000ab5d949e5c6790xinhe setByteField(env, LCR, "id", result->LCR->id); 1157c96feb800590f43b7be76d1000ab5d949e5c6790xinhe jbyteArray elements = env->NewByteArray(result->LCI->len); 1158c96feb800590f43b7be76d1000ab5d949e5c6790xinhe jbyte *bytes = (jbyte *)&(result->LCR->data[0]); 1159c96feb800590f43b7be76d1000ab5d949e5c6790xinhe env->SetByteArrayRegion(elements, 0, result->LCI->len, bytes); 1160c96feb800590f43b7be76d1000ab5d949e5c6790xinhe setObjectField(env, LCR, "data", "[B", elements); 116193a1dbd961f05335635ede08eae6481284690c7dxinhe env->DeleteLocalRef(elements); 1162c96feb800590f43b7be76d1000ab5d949e5c6790xinhe } else { 116393a1dbd961f05335635ede08eae6481284690c7dxinhe ALOGD("No LCR in result"); 1164c96feb800590f43b7be76d1000ab5d949e5c6790xinhe setByteField(env, LCR, "id", (byte)(0xff)); 1165c96feb800590f43b7be76d1000ab5d949e5c6790xinhe } 1166c96feb800590f43b7be76d1000ab5d949e5c6790xinhe setObjectField(env, rttResult, "LCR", 1167c96feb800590f43b7be76d1000ab5d949e5c6790xinhe "Landroid/net/wifi/RttManager$WifiInformationElement;", LCR); 1168143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1169143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande env->SetObjectArrayElement(rttResults, i, rttResult); 117093a1dbd961f05335635ede08eae6481284690c7dxinhe env->DeleteLocalRef(LCI); 117193a1dbd961f05335635ede08eae6481284690c7dxinhe env->DeleteLocalRef(LCR); 117293a1dbd961f05335635ede08eae6481284690c7dxinhe env->DeleteLocalRef(rttResult); 1173143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1174143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1175143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande reportEvent(env, mCls, "onRttResults", "(I[Landroid/net/wifi/RttManager$RttResult;)V", 1176143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande id, rttResults); 117793a1dbd961f05335635ede08eae6481284690c7dxinhe 117893a1dbd961f05335635ede08eae6481284690c7dxinhe //clean the local reference 117993a1dbd961f05335635ede08eae6481284690c7dxinhe env->DeleteLocalRef(rttResults); 118093a1dbd961f05335635ede08eae6481284690c7dxinhe env->DeleteLocalRef(clsRttResult); 118193a1dbd961f05335635ede08eae6481284690c7dxinhe 1182143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1183143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 118402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpandeconst int MaxRttConfigs = 16; 118502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 1186143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic jboolean android_net_wifi_requestRange( 1187143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject params) { 1188143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1189143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1190143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGD("sending rtt request [%d] = %p", id, handle); 1191143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 119202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande wifi_rtt_config configs[MaxRttConfigs]; 119302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande memset(&configs, 0, sizeof(configs)); 119402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 119502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande int len = env->GetArrayLength((jobjectArray)params); 119602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (len > MaxRttConfigs) { 119702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande return false; 119802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 119902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 120002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande for (int i = 0; i < len; i++) { 120102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 120202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande jobject param = env->GetObjectArrayElement((jobjectArray)params, i); 120302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (param == NULL) { 120402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande ALOGD("could not get element %d", i); 120502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande continue; 120602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1207143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 120802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande wifi_rtt_config &config = configs[i]; 120902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 121002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande parseMacAddress(env, param, config.addr); 121102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.type = (wifi_rtt_type)getIntField(env, param, "requestType"); 1212c96feb800590f43b7be76d1000ab5d949e5c6790xinhe config.peer = (rtt_peer_type)getIntField(env, param, "deviceType"); 121302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande config.channel.center_freq = getIntField(env, param, "frequency"); 121412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.channel.width = (wifi_channel_width) getIntField(env, param, "channelWidth"); 121512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.channel.center_freq0 = getIntField(env, param, "centerFreq0"); 121612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.channel.center_freq1 = getIntField(env, param, "centerFreq1"); 121712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 121812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.num_burst = getIntField(env, param, "numberBurst"); 1219c96feb800590f43b7be76d1000ab5d949e5c6790xinhe config.burst_period = (unsigned) getIntField(env, param, "interval"); 122012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.num_frames_per_burst = (unsigned) getIntField(env, param, "numSamplesPerBurst"); 1221c96feb800590f43b7be76d1000ab5d949e5c6790xinhe config.num_retries_per_rtt_frame = (unsigned) getIntField(env, param, 122212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe "numRetriesPerMeasurementFrame"); 122312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.num_retries_per_ftmr = (unsigned) getIntField(env, param, "numRetriesPerFTMR"); 122412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.LCI_request = getBoolField(env, param, "LCIRequest") ? 1 : 0; 122512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.LCR_request = getBoolField(env, param, "LCRRequest") ? 1 : 0; 1226c96feb800590f43b7be76d1000ab5d949e5c6790xinhe config.burst_duration = (unsigned) getIntField(env, param, "burstTimeout"); 1227c96feb800590f43b7be76d1000ab5d949e5c6790xinhe config.preamble = (wifi_rtt_preamble) getIntField(env, param, "preamble"); 1228c96feb800590f43b7be76d1000ab5d949e5c6790xinhe config.bw = (wifi_rtt_bw) getIntField(env, param, "bandwidth"); 122912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 123012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("RTT request destination %d: type is %d, peer is %d, bw is %d, center_freq is %d ", i, 123112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.type,config.peer, config.channel.width, config.channel.center_freq0); 123212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("center_freq0 is %d, center_freq1 is %d, num_burst is %d,interval is %d", 123312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.channel.center_freq0, config.channel.center_freq1, config.num_burst, 1234c96feb800590f43b7be76d1000ab5d949e5c6790xinhe config.burst_period); 123512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("frames_per_burst is %d, retries of measurement frame is %d, retries_per_ftmr is %d", 1236c96feb800590f43b7be76d1000ab5d949e5c6790xinhe config.num_frames_per_burst, config.num_retries_per_rtt_frame, 123712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.num_retries_per_ftmr); 123812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("LCI_requestis %d, LCR_request is %d, burst_timeout is %d, preamble is %d, bw is %d", 1239c96feb800590f43b7be76d1000ab5d949e5c6790xinhe config.LCI_request, config.LCR_request, config.burst_duration, config.preamble, 124012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe config.bw); 124102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1242143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1243143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_rtt_event_handler handler; 1244143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande handler.on_rtt_results = &onRttResults; 1245143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1246ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_rtt_range_request(id, handle, len, configs, handler) == WIFI_SUCCESS; 1247143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1248143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1249143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic jboolean android_net_wifi_cancelRange( 1250042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject params) { 1251143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1252143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1253143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGD("cancelling rtt request [%d] = %p", id, handle); 1254143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 125502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande mac_addr addrs[MaxRttConfigs]; 125602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande memset(&addrs, 0, sizeof(addrs)); 125702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 125802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande int len = env->GetArrayLength((jobjectArray)params); 125902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (len > MaxRttConfigs) { 126002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande return false; 126102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1262143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 126302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande for (int i = 0; i < len; i++) { 126402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 126502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande jobject param = env->GetObjectArrayElement((jobjectArray)params, i); 126602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (param == NULL) { 126702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande ALOGD("could not get element %d", i); 126802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande continue; 126902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 127002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 127102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande parseMacAddress(env, param, addrs[i]); 127202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1273143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1274ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_rtt_range_cancel(id, handle, len, addrs) == WIFI_SUCCESS; 1275143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1276143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1277042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpandestatic jboolean android_net_wifi_setScanningMacOui(JNIEnv *env, jclass cls, 1278042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande jint iface, jbyteArray param) { 1279042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1280042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1281042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGD("setting scan oui %p", handle); 1282042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1283042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande static const unsigned oui_len = 3; /* OUI is upper 3 bytes of mac_address */ 1284042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande int len = env->GetArrayLength(param); 1285042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande if (len != oui_len) { 1286042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGE("invalid oui length %d", len); 1287042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande return false; 1288042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande } 1289042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1290042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande jbyte* bytes = env->GetByteArrayElements(param, NULL); 1291042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande if (bytes == NULL) { 1292042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGE("failed to get array"); 1293042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande return false; 1294042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande } 1295042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1296ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_set_scanning_mac_oui(handle, (byte *)bytes) == WIFI_SUCCESS; 1297042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande} 1298042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1299efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpandestatic jintArray android_net_wifi_getValidChannels(JNIEnv *env, jclass cls, 1300efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande jint iface, jint band) { 1301efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1302efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1303efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande ALOGD("getting valid channels %p", handle); 1304efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1305efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande static const int MaxChannels = 64; 1306efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande wifi_channel channels[64]; 1307efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande int num_channels = 0; 1308ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error result = hal_fn.wifi_get_valid_channels(handle, band, MaxChannels, 1309efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande channels, &num_channels); 1310efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1311efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande if (result == WIFI_SUCCESS) { 1312efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande jintArray channelArray = env->NewIntArray(num_channels); 1313efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande if (channelArray == NULL) { 1314efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande ALOGE("failed to allocate channel list"); 1315efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return NULL; 1316efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } 1317efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1318efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande env->SetIntArrayRegion(channelArray, 0, num_channels, channels); 1319efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return channelArray; 1320efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } else { 1321efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande ALOGE("failed to get channel list : %d", result); 1322efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return NULL; 1323efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } 1324efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande} 1325efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 132690b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpandestatic jboolean android_net_wifi_setDfsFlag(JNIEnv *env, jclass cls, jint iface, jboolean dfs) { 132790b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 132890b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande ALOGD("setting dfs flag to %s, %p", dfs ? "true" : "false", handle); 132990b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande 133090b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande u32 nodfs = dfs ? 0 : 1; 1331ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error result = hal_fn.wifi_set_nodfs_flag(handle, nodfs); 133290b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande return result == WIFI_SUCCESS; 133390b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande} 133490b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande 133512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhestatic jobject android_net_wifi_get_rtt_capabilities(JNIEnv *env, jclass cls, jint iface) { 133612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe wifi_rtt_capabilities rtt_capabilities; 133712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1338ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error ret = hal_fn.wifi_get_rtt_capabilities(handle, &rtt_capabilities); 133912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 134012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe if(WIFI_SUCCESS == ret) { 134112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe jobject capabilities = createObject(env, "android/net/wifi/RttManager$RttCapabilities"); 134212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setBooleanField(env, capabilities, "oneSidedRttSupported", 134312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.rtt_one_sided_supported == 1); 134412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setBooleanField(env, capabilities, "twoSided11McRttSupported", 134512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.rtt_ftm_supported == 1); 134612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setBooleanField(env, capabilities, "lciSupported", 134712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.lci_support); 134812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setBooleanField(env,capabilities, "lcrSupported", 134912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.lcr_support); 135012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setIntField(env, capabilities, "preambleSupported", 135112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.preamble_support); 135212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe setIntField(env, capabilities, "bwSupported", 135312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.bw_support); 135412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("One side RTT is: %s", rtt_capabilities.rtt_one_sided_supported ==1 ? "support" : 135512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe "not support"); 135612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("Two side RTT is: %s", rtt_capabilities.rtt_ftm_supported == 1 ? "support" : 135712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe "not support"); 135812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("LCR is: %s", rtt_capabilities.lcr_support == 1 ? "support" : "not support"); 135912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 136012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("LCI is: %s", rtt_capabilities.lci_support == 1 ? "support" : "not support"); 136112cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 136212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe ALOGD("Support Preamble is : %d support BW is %d", rtt_capabilities.preamble_support, 136312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.bw_support); 136412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe return capabilities; 136512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe } else { 136612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe return NULL; 136712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe } 136812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe} 136912cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 1370939177ff615062ec826601d536466875d8457375xinhestatic jboolean android_net_wifi_set_Country_Code_Hal(JNIEnv *env,jclass cls, jint iface, 1371939177ff615062ec826601d536466875d8457375xinhe jstring country_code) { 1372939177ff615062ec826601d536466875d8457375xinhe 1373939177ff615062ec826601d536466875d8457375xinhe wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1374939177ff615062ec826601d536466875d8457375xinhe const char *country = env->GetStringUTFChars(country_code, NULL); 1375939177ff615062ec826601d536466875d8457375xinhe 1376939177ff615062ec826601d536466875d8457375xinhe ALOGD("set country code: %s", country); 137744787b543b9365fe0d40ec70fc8fe51e54264ff6xinhe wifi_error res = hal_fn.wifi_set_country_code(handle, country); 1378939177ff615062ec826601d536466875d8457375xinhe env->ReleaseStringUTFChars(country_code, country); 1379939177ff615062ec826601d536466875d8457375xinhe 1380939177ff615062ec826601d536466875d8457375xinhe return res == WIFI_SUCCESS; 1381939177ff615062ec826601d536466875d8457375xinhe} 1382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// ---------------------------------------------------------------------------- 1383a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle// Debug framework 1384a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle// ---------------------------------------------------------------------------- 1385a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 13865faa29da989a82096e1e17c46126604eecfc0780Pierre Vandwallestatic void onRingBufferData(char * ring_name, char * buffer, 1387a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalleint buffer_size, wifi_ring_buffer_status *status) { 1388a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle JNIEnv *env = NULL; 1389a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle mVM->AttachCurrentThread(&env, NULL); 1390a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1391a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle ALOGD("onRingBufferData called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 1392a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1393a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle reportEvent(env, mCls, "onDataAvailable", "(I[Landroid/net/wifi/WiFiLogger$LogData;)V", 1394a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 0, 0); 1395a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle} 1396a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 13977d6301ead19afdf3de37455e9ed133c25b4938cdVinit Deshpandestatic jboolean android_net_wifi_start_logging(JNIEnv *env, jclass cls, jint iface) { 1398a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1399a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 14007d6301ead19afdf3de37455e9ed133c25b4938cdVinit Deshpande ALOGD("android_net_wifi_start_logging = %p", handle); 1401a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1402a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle if (handle == 0) { 1403a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle return WIFI_ERROR_UNINITIALIZED; 1404a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle } 1405a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle wifi_ring_buffer_data_handler handler; 1406a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle handler.on_ring_buffer_data = &onRingBufferData; 1407a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1408a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle wifi_error result = WIFI_SUCCESS; //ifi_start_logging(handle, 1, 0, 5, 4*1024,(u8*)"wifi_connectivity_events", handler); 1409a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1410a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle return result; 1411a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle} 1412a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1413dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle// ---------------------------------------------------------------------------- 1414dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle// ePno framework 1415dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle// ---------------------------------------------------------------------------- 1416dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1417dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1418dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwallestatic void onPnoNetworkFound(wifi_request_id id, 1419dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle unsigned num_results, wifi_scan_result *results) { 1420dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle JNIEnv *env = NULL; 1421dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle mVM->AttachCurrentThread(&env, NULL); 1422dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1423dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGD("onPnoNetworkFound called, vm = %p, obj = %p, env = %p, num_results %u", 1424dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle mVM, mCls, env, num_results); 1425dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1426dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (results == 0 || num_results == 0) { 1427dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("onPnoNetworkFound: Error no results"); 1428dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return; 1429dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1430dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1431dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle jobject scanResult; 1432dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle jbyte *bytes; 1433dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle jobjectArray scanResults; 1434dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //jbyteArray elements; 1435dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1436dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle for (unsigned i=0; i<num_results; i++) { 1437dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1438dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle scanResult = createScanResult(env, &results[i]); 1439dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (i == 0) { 1440dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle scanResults = env->NewObjectArray(num_results, 1441dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle env->FindClass("android/net/wifi/ScanResult"), scanResult); 1442dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (scanResults == 0) { 1443dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGD("cant allocate array"); 1444dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } else { 1445dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGD("allocated array %u", env->GetArrayLength(scanResults)); 1446dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1447dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } else { 1448dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle env->SetObjectArrayElement(scanResults, i, scanResult); 1449dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1450dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1451dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGD("Scan result with ie length %d, i %u, <%s> rssi=%d %02x:%02x:%02x:%02x:%02x:%02x", results->ie_length, i, 1452dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle results[i].ssid, results[i].rssi, results[i].bssid[0], results[i].bssid[1], 1453dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle results[i].bssid[2], results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); 1454dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1455dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle /*elements = env->NewByteArray(results->ie_length); 1456dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (elements == NULL) { 1457dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("Error in allocating array"); 1458dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return; 1459dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle }*/ 1460dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1461dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //ALOGD("onPnoNetworkFound: Setting byte array"); 1462dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1463dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //bytes = (jbyte *)&(results->ie_data[0]); 1464dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //env->SetByteArrayRegion(elements, 0, results->ie_length, bytes); 1465dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1466dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //ALOGD("onPnoNetworkFound: Returning result"); 1467dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1468dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1469dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1470dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGD("calling report"); 1471dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1472dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle reportEvent(env, mCls, "onPnoNetworkFound", "(I[Landroid/net/wifi/ScanResult;)V", id, 1473dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle scanResults); 1474dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGD("free ref"); 1475dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1476dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle env->DeleteLocalRef(scanResults); 1477dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //env->DeleteLocalRef(elements); 1478dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle} 1479dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1480dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwallestatic jboolean android_net_wifi_setPnoListNative( 1481dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle JNIEnv *env, jclass cls, jint iface, jint id, jobject list) { 1482dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1483dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle wifi_epno_handler handler; 1484dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle handler.on_network_found = &onPnoNetworkFound; 1485dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1486dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle wifi_interface_handle handle = getIfaceHandle(env, cls, iface); 1487dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGD("configure ePno list request [%d] = %p", id, handle); 1488dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1489dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (list == NULL) { 1490dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle // stop pno 1491dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle int result = hal_fn.wifi_set_epno_list(id, handle, 0, NULL, handler); 1492dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE(" setPnoListNative: STOP result = %d", result); 1493dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return result; 1494dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1495dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1496dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle wifi_epno_network net_list[MAX_PNO_SSID]; 1497dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle memset(&net_list, 0, sizeof(net_list)); 1498dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1499dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle size_t len = env->GetArrayLength((jobjectArray)list); 1500dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (len > (size_t)MAX_PNO_SSID) { 1501dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return false; 1502dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1503dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1504dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle for (unsigned int i = 0; i < len; i++) { 1505dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1506dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle jobject pno_net = env->GetObjectArrayElement((jobjectArray)list, i); 1507dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (pno_net == NULL) { 1508dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGD("setPnoListNative: could not get element %d", i); 1509dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle continue; 1510dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1511dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1512dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle jstring sssid = (jstring) getObjectField( 1513dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle env, pno_net, "SSID", "Ljava/lang/String;"); 1514dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (sssid == NULL) { 1515dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("Error setPnoListNative: getting ssid field"); 1516dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return false; 1517dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1518dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1519dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle const char *ssid = env->GetStringUTFChars(sssid, NULL); 1520dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (ssid == NULL) { 1521dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("Error setPnoListNative: getting ssid"); 1522dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return false; 1523dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1524dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle int ssid_len = strnlen((const char*)ssid, 33); 1525dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (ssid_len > 32) { 1526dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("Error setPnoListNative: long ssid %u", strnlen((const char*)ssid, 256)); 1527dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return false; 1528dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1529dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (ssid_len > 1 && ssid[0] == '"' && ssid[ssid_len-1]) 1530dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle { 1531dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle // strip leading and trailing '"' 1532dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ssid++; 1533dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ssid_len-=2; 1534dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1535dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (ssid_len == 0) { 1536dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("Error setPnoListNative: zero length ssid, skip it"); 1537dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle continue; 1538dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1539dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle memcpy(net_list[i].ssid, ssid, ssid_len); 1540dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1541dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle int rssit = getIntField(env, pno_net, "rssi_threshold"); 1542dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle net_list[i].rssi_threshold = (byte)rssit; 1543dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle int a = getIntField(env, pno_net, "auth"); 1544dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle net_list[i].auth_bit_field = a; 1545dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle int f = getIntField(env, pno_net, "flags"); 1546dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle net_list[i].flags = f; 1547dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE(" setPnoListNative: idx %u rssi %d/%d auth %x/%x flags %x/%x [%s]", i, (signed byte)net_list[i].rssi_threshold, net_list[i].rssi_threshold, net_list[i].auth_bit_field, a, net_list[i].flags, f, net_list[i].ssid); 1548dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 1549dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1550dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle int result = hal_fn.wifi_set_epno_list(id, handle, len, net_list, handler); 1551dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE(" setPnoListNative: result %d", result); 1552dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1553dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return result >= 0; 1554dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle} 1555a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1556155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// ---------------------------------------------------------------------------- 1557155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1558155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* 1559155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * JNI registration. 1560155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1561155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic JNINativeMethod gWifiMethods[] = { 1562155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* name, signature, funcPtr */ 1563155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1564155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "loadDriver", "()Z", (void *)android_net_wifi_loadDriver }, 1565155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "isDriverLoaded", "()Z", (void *)android_net_wifi_isDriverLoaded }, 1566155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "unloadDriver", "()Z", (void *)android_net_wifi_unloadDriver }, 1567155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "startSupplicant", "(Z)Z", (void *)android_net_wifi_startSupplicant }, 1568155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "killSupplicant", "(Z)Z", (void *)android_net_wifi_killSupplicant }, 1569155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "connectToSupplicantNative", "()Z", (void *)android_net_wifi_connectToSupplicant }, 1570155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "closeSupplicantConnectionNative", "()V", 1571155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande (void *)android_net_wifi_closeSupplicantConnection }, 1572155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "waitForEventNative", "()Ljava/lang/String;", (void*)android_net_wifi_waitForEvent }, 1573155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doBooleanCommandNative", "(Ljava/lang/String;)Z", (void*)android_net_wifi_doBooleanCommand }, 1574155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doIntCommandNative", "(Ljava/lang/String;)I", (void*)android_net_wifi_doIntCommand }, 1575155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doStringCommandNative", "(Ljava/lang/String;)Ljava/lang/String;", 1576155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande (void*) android_net_wifi_doStringCommand }, 15777ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "startHalNative", "()Z", (void*) android_net_wifi_startHal }, 15787ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "stopHalNative", "()V", (void*) android_net_wifi_stopHal }, 15797ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "waitForHalEventNative", "()V", (void*) android_net_wifi_waitForHalEvents }, 15807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde { "getInterfacesNative", "()I", (void*) android_net_wifi_getInterfaces}, 15817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde { "getInterfaceNameNative", "(I)Ljava/lang/String;", (void*) android_net_wifi_getInterfaceName}, 1582e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "getScanCapabilitiesNative", "(ILcom/android/server/wifi/WifiNative$ScanCapabilities;)Z", 1583e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void *) android_net_wifi_getScanCapabilities}, 1584e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "startScanNative", "(IILcom/android/server/wifi/WifiNative$ScanSettings;)Z", 1585e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_startScan}, 1586e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "stopScanNative", "(II)Z", (void*) android_net_wifi_stopScan}, 1587c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande { "getScanResultsNative", "(IZ)[Landroid/net/wifi/WifiScanner$ScanData;", 1588e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void *) android_net_wifi_getScanResults}, 1589e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "setHotlistNative", "(IILandroid/net/wifi/WifiScanner$HotlistSettings;)Z", 1590e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_setHotlist}, 1591e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "resetHotlistNative", "(II)Z", (void*) android_net_wifi_resetHotlist}, 1592e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "trackSignificantWifiChangeNative", "(IILandroid/net/wifi/WifiScanner$WifiChangeSettings;)Z", 1593e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_trackSignificantWifiChange}, 1594e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "untrackSignificantWifiChangeNative", "(II)Z", 1595aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle (void*) android_net_wifi_untrackSignificantWifiChange}, 1596aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle { "getWifiLinkLayerStatsNative", "(I)Landroid/net/wifi/WifiLinkLayerStats;", 1597a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande (void*) android_net_wifi_getLinkLayerStats}, 1598c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande { "getSupportedFeatureSetNative", "(I)I", 1599143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande (void*) android_net_wifi_getSupportedFeatures}, 1600143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande { "requestRangeNative", "(II[Landroid/net/wifi/RttManager$RttParams;)Z", 1601143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande (void*) android_net_wifi_requestRange}, 1602143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande { "cancelRangeRequestNative", "(II[Landroid/net/wifi/RttManager$RttParams;)Z", 1603042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande (void*) android_net_wifi_cancelRange}, 160490b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande { "setScanningMacOuiNative", "(I[B)Z", (void*) android_net_wifi_setScanningMacOui}, 160590b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande { "getChannelsForBandNative", "(II)[I", (void*) android_net_wifi_getValidChannels}, 1606b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe { "setDfsFlagNative", "(IZ)Z", (void*) android_net_wifi_setDfsFlag}, 160712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe { "toggleInterfaceNative", "(I)Z", (void*) android_net_wifi_toggle_interface}, 160812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe { "getRttCapabilitiesNative", "(I)Landroid/net/wifi/RttManager$RttCapabilities;", 1609a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle (void*) android_net_wifi_get_rtt_capabilities}, 1610939177ff615062ec826601d536466875d8457375xinhe { "startLogging", "(I)Z", (void*) android_net_wifi_start_logging}, 1611939177ff615062ec826601d536466875d8457375xinhe {"setCountryCodeHalNative", "(ILjava/lang/String;)Z", 1612dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle (void*) android_net_wifi_set_Country_Code_Hal}, 1613dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle { "setPnoListNative", "(II[Lcom/android/server/wifi/WifiNative$WifiPnoNetwork;)Z", 1614dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle (void*) android_net_wifi_setPnoListNative} 1615155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 1616155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1617155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeint register_android_net_wifi_WifiNative(JNIEnv* env) { 1618155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return AndroidRuntime::registerNativeMethods(env, 1619155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com/android/server/wifi/WifiNative", gWifiMethods, NELEM(gWifiMethods)); 1620155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 1621155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1622155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1623155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* User to register native functions */ 1624155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeextern "C" 1625155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandejint Java_com_android_server_wifi_WifiNative_registerNatives(JNIEnv* env, jclass clazz) { 1626155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return AndroidRuntime::registerNativeMethods(env, 1627155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com/android/server/wifi/WifiNative", gWifiMethods, NELEM(gWifiMethods)); 1628155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 1629155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1630155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; // namespace android 1631