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" 207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande#include "JniConstants.h" 21155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <ScopedUtfChars.h> 227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande#include <ScopedBytes.h> 23155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <utils/misc.h> 24155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <utils/Log.h> 25155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <utils/String16.h> 26e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#include <ctype.h> 27956f54b391677d78379729dd14518edddf3c7660Etan Cohen#include <stdlib.h> 28be3b27a3749af234b5fd7340aefb9f25060fb433xinhe#include <sys/socket.h> 297e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande#include <sys/klog.h> 30be3b27a3749af234b5fd7340aefb9f25060fb433xinhe#include <linux/if.h> 31e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen#include <linux/if_arp.h> 32aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 33aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal#include <algorithm> 34aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal#include <limits> 35aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal#include <vector> 36aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 37155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include "wifi.h" 387ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde#include "wifi_hal.h" 397f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde#include "jni_helper.h" 4012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe#include "rtt.h" 41ec61e7731968be994a23f2bd138f6761c8aea498xinhe#include "wifi_hal_stub.h" 42bbbafda1be6182f25fb3e5b43a4e7e2cc9830d6aVinit Deshpande#define REPLY_BUF_SIZE 4096 + 1 // wpa_supplicant's maximum size + 1 for nul 43155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#define EVENT_BUF_SIZE 2048 446bf6986d359556010638dfae332b585162f06520Roshan Pius#define WAKE_REASON_TYPE_MAX 10 45155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 46155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandenamespace android { 47155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 48956f54b391677d78379729dd14518edddf3c7660Etan Cohenextern "C" 49956f54b391677d78379729dd14518edddf3c7660Etan Cohenjint Java_com_android_server_wifi_WifiNative_registerNanNatives(JNIEnv* env, jclass clazz); 50956f54b391677d78379729dd14518edddf3c7660Etan Cohen 51155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jint DBG = false; 52e8beda2579d277fb6b27f1792c4ed45c136ee15aNingyuan Wangconstexpr int SAFE_NET_LOG_ID = 0x534e4554; 53155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 54ec61e7731968be994a23f2bd138f6761c8aea498xinhe//Please put all HAL function call here and call from the function table instead of directly call 55956f54b391677d78379729dd14518edddf3c7660Etan Cohenwifi_hal_fn hal_fn; 56155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic bool doCommand(JNIEnv* env, jstring javaCommand, 57155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char* reply, size_t reply_len) { 58155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ScopedUtfChars command(env, javaCommand); 59155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (command.c_str() == NULL) { 60155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; // ScopedUtfChars already threw on error. 61155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 62155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 63155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) { 64155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ALOGD("doCommand: %s", command.c_str()); 65155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 66155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 67155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande --reply_len; // Ensure we have room to add NUL termination. 68155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (::wifi_command(command.c_str(), reply, &reply_len) != 0) { 69155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 70155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 71155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 72155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Strip off trailing newline. 73155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (reply_len > 0 && reply[reply_len-1] == '\n') { 74155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande reply[reply_len-1] = '\0'; 75155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 76155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande reply[reply_len] = '\0'; 77155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 78155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return true; 79155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 80155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 81155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jint doIntCommand(JNIEnv* env, jstring javaCommand) { 82155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char reply[REPLY_BUF_SIZE]; 83155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!doCommand(env, javaCommand, reply, sizeof(reply))) { 84155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return -1; 85155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 86155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return static_cast<jint>(atoi(reply)); 87155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 88155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 89155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jboolean doBooleanCommand(JNIEnv* env, jstring javaCommand) { 90155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char reply[REPLY_BUF_SIZE]; 91155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!doCommand(env, javaCommand, reply, sizeof(reply))) { 92155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return JNI_FALSE; 93155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 94bbbafda1be6182f25fb3e5b43a4e7e2cc9830d6aVinit Deshpande jboolean result = (strcmp(reply, "OK") == 0); 95bbbafda1be6182f25fb3e5b43a4e7e2cc9830d6aVinit Deshpande if (!result) { 96bbbafda1be6182f25fb3e5b43a4e7e2cc9830d6aVinit Deshpande ScopedUtfChars command(env, javaCommand); 97bbbafda1be6182f25fb3e5b43a4e7e2cc9830d6aVinit Deshpande ALOGI("command '%s' returned '%s", command.c_str(), reply); 98bbbafda1be6182f25fb3e5b43a4e7e2cc9830d6aVinit Deshpande } 99bbbafda1be6182f25fb3e5b43a4e7e2cc9830d6aVinit Deshpande return result; 100155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Send a command to the supplicant, and return the reply as a String. 103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic jstring doStringCommand(JNIEnv* env, jstring javaCommand) { 104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char reply[REPLY_BUF_SIZE]; 105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!doCommand(env, javaCommand, reply, sizeof(reply))) { 106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NULL; 107155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 108155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return env->NewStringUTF(reply); 109155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 11118786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic jboolean android_net_wifi_isDriverLoaded(JNIEnv* env, jclass) 112155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::is_wifi_driver_loaded() == 1); 114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 115155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 11618786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic jboolean android_net_wifi_loadDriver(JNIEnv* env, jclass) 117155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 118155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_load_driver() == 0); 119155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 120155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 12118786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic jboolean android_net_wifi_unloadDriver(JNIEnv* env, jclass) 122155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 123155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_unload_driver() == 0); 124155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 12618786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic jboolean android_net_wifi_startSupplicant(JNIEnv* env, jclass, jboolean p2pSupported) 127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_start_supplicant(p2pSupported) == 0); 129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 13118786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic jboolean android_net_wifi_killSupplicant(JNIEnv* env, jclass, jboolean p2pSupported) 132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_stop_supplicant(p2pSupported) == 0); 134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 13618786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jclass) 137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return (::wifi_connect_to_supplicant() == 0); 139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 14118786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic void android_net_wifi_closeSupplicantConnection(JNIEnv* env, jclass) 142155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 143155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ::wifi_close_supplicant_connection(); 144155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 145155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 14618786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic jstring android_net_wifi_waitForEvent(JNIEnv* env, jclass) 147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande{ 148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande char buf[EVENT_BUF_SIZE]; 149155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int nread = ::wifi_wait_for_event(buf, sizeof buf); 150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (nread > 0) { 151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return env->NewStringUTF(buf); 152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NULL; 154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 15718786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jclass, jstring javaCommand) { 158155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return doBooleanCommand(env, javaCommand); 159155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 160155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 16118786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic jint android_net_wifi_doIntCommand(JNIEnv* env, jclass, jstring javaCommand) { 162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return doIntCommand(env, javaCommand); 163155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 16518786eca942042388748b0d98979f21c9dff4a89Mitchell Willsstatic jstring android_net_wifi_doStringCommand(JNIEnv* env, jclass, jstring javaCommand) { 166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return doStringCommand(env,javaCommand); 167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 168155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde/* wifi_hal <==> WifiNative bridge */ 1707f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 171b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jclass mCls; /* saved WifiNative object */ 1727f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndestatic JavaVM *mVM; /* saved JVM pointer */ 1737f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 174aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallestatic const char *WifiHandleVarName = "sWifiHalHandle"; 175aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallestatic const char *WifiIfaceHandleVarName = "sWifiIfaceHandles"; 1767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 177956f54b391677d78379729dd14518edddf3c7660Etan Cohenwifi_handle getWifiHandle(JNIHelper &helper, jclass cls) { 1787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return (wifi_handle) helper.getStaticLongField(cls, WifiHandleVarName); 1797f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 1807f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 181956f54b391677d78379729dd14518edddf3c7660Etan Cohenwifi_interface_handle getIfaceHandle(JNIHelper &helper, jclass cls, jint index) { 1827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return (wifi_interface_handle) helper.getStaticLongArrayField(cls, WifiIfaceHandleVarName, index); 1837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 1847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 1857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandejboolean setSSIDField(JNIHelper helper, jobject scanResult, const char *rawSsid) { 1865cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe 1875cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe int len = strlen(rawSsid); 1885cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe 1895cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe if (len > 0) { 1907d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jbyteArray> ssidBytes = helper.newByteArray(len); 1917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setByteArrayRegion(ssidBytes, 0, len, (jbyte *) rawSsid); 1927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jboolean ret = helper.callStaticMethod(mCls, 1937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "setSsid", "([BLandroid/net/wifi/ScanResult;)Z", ssidBytes.get(), scanResult); 1945cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe return ret; 1955cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe } else { 1965cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe //empty SSID or SSID start with \0 1975cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe return true; 1985cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe } 1995cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe} 2001ab129e587d334a144a0bca5323c27985397a403Randy Panstatic JNIObject<jobject> createScanResult(JNIHelper &helper, wifi_scan_result *result, 2011ab129e587d334a144a0bca5323c27985397a403Randy Pan bool fill_ie) { 202b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande // ALOGD("creating scan result"); 2037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> scanResult = helper.createObject("android/net/wifi/ScanResult"); 204f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde if (scanResult == NULL) { 205f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde ALOGE("Error in creating scan result"); 2067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return JNIObject<jobject>(helper, NULL); 207f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde } 208f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 209e73629f79c8bd59f0f0857a5101160a4d93b1190Vinit Deshpande ALOGV("setting SSID to %s", result->ssid); 2105cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe 2117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande if (!setSSIDField(helper, scanResult, result->ssid)) { 2125cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe ALOGE("Error on set SSID"); 2137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return JNIObject<jobject>(helper, NULL); 2145cfd8d8b9f241dcad874125a1b5538ee0d6860fexinhe } 215f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 216f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde char bssid[32]; 217b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result->bssid[0], result->bssid[1], 218b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande result->bssid[2], result->bssid[3], result->bssid[4], result->bssid[5]); 219f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 2207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setStringField(scanResult, "BSSID", bssid); 221f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 2227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(scanResult, "level", result->rssi); 2237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(scanResult, "frequency", result->channel); 2247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(scanResult, "timestamp", result->ts); 225f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 2261ab129e587d334a144a0bca5323c27985397a403Randy Pan if (fill_ie) { 2271ab129e587d334a144a0bca5323c27985397a403Randy Pan JNIObject<jbyteArray> elements = helper.newByteArray(result->ie_length); 2281ab129e587d334a144a0bca5323c27985397a403Randy Pan if (elements == NULL) { 229259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in allocating elements array, length=%d", result->ie_length); 2301ab129e587d334a144a0bca5323c27985397a403Randy Pan return JNIObject<jobject>(helper, NULL); 2311ab129e587d334a144a0bca5323c27985397a403Randy Pan } 2321ab129e587d334a144a0bca5323c27985397a403Randy Pan jbyte * bytes = (jbyte *)&(result->ie_data[0]); 2331ab129e587d334a144a0bca5323c27985397a403Randy Pan helper.setByteArrayRegion(elements, 0, result->ie_length, bytes); 2341ab129e587d334a144a0bca5323c27985397a403Randy Pan helper.setObjectField(scanResult, "bytes", "[B", elements); 2351ab129e587d334a144a0bca5323c27985397a403Randy Pan } 2361ab129e587d334a144a0bca5323c27985397a403Randy Pan 237f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde return scanResult; 238f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde} 239f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 24064e816ff5483030636e1815f69a6cbaf8cef289eNingyuan Wangint set_iface_flags(const char *ifname, bool 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) { 2826414301b7b685307e8ae8cea6976ed05cc49b254Vinit Deshpande ALOGE("Could not set interface %s flags: %d\n", ifname, errno); 2836414301b7b685307e8ae8cea6976ed05cc49b254Vinit Deshpande ret = errno ? -errno : -999; 284be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 285be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return ret; 286be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } else { 287be3b27a3749af234b5fd7340aefb9f25060fb433xinhe ALOGD("set interface %s flags (%s)\n", ifname, dev_up ? "UP" : "DOWN"); 288be3b27a3749af234b5fd7340aefb9f25060fb433xinhe } 289be3b27a3749af234b5fd7340aefb9f25060fb433xinhe close(sock); 290be3b27a3749af234b5fd7340aefb9f25060fb433xinhe return 0; 291be3b27a3749af234b5fd7340aefb9f25060fb433xinhe} 292be3b27a3749af234b5fd7340aefb9f25060fb433xinhe 2933b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wangstatic jboolean android_net_wifi_set_interface_up(JNIEnv* env, jclass cls, jboolean up) { 2943b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wang return (set_iface_flags("wlan0", (bool)up) == 0); 295b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe} 296b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe 297b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jboolean android_net_wifi_startHal(JNIEnv* env, jclass cls) { 2987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 2997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_handle halHandle = getWifiHandle(helper, cls); 3007ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde if (halHandle == NULL) { 301ec61e7731968be994a23f2bd138f6761c8aea498xinhe 302be62c038644a39d9441b70cfafb95f9518878541Etan Cohen if(init_wifi_stub_hal_func_table(&hal_fn) != 0 ) { 303386acac84b22423d36796838adca2060fea81149Mitchell Wills ALOGE("Can not initialize the basic function pointer table"); 304ec61e7731968be994a23f2bd138f6761c8aea498xinhe return false; 305ec61e7731968be994a23f2bd138f6761c8aea498xinhe } 306ec61e7731968be994a23f2bd138f6761c8aea498xinhe 307ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error res = init_wifi_vendor_hal_func_table(&hal_fn); 308ec61e7731968be994a23f2bd138f6761c8aea498xinhe if (res != WIFI_SUCCESS) { 309386acac84b22423d36796838adca2060fea81149Mitchell Wills ALOGE("Can not initialize the vendor function pointer table"); 310ec61e7731968be994a23f2bd138f6761c8aea498xinhe return false; 311ec61e7731968be994a23f2bd138f6761c8aea498xinhe } 312ec61e7731968be994a23f2bd138f6761c8aea498xinhe 3133b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wang int ret = set_iface_flags("wlan0", true); 3143b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wang if(ret != 0) { 3153b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wang return false; 3163b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wang } 3173b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wang 318ec61e7731968be994a23f2bd138f6761c8aea498xinhe res = hal_fn.wifi_initialize(&halHandle); 3197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (res == WIFI_SUCCESS) { 3207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setStaticLongField(cls, WifiHandleVarName, (jlong)halHandle); 321aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGD("Did set static halHandle = %p", halHandle); 3227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde env->GetJavaVM(&mVM); 324b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mCls = (jclass) env->NewGlobalRef(cls); 325b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("halHandle = %p, mVM = %p, mCls = %p", halHandle, mVM, mCls); 3267ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde return res == WIFI_SUCCESS; 3273b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wang } else { 3283b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wang return (set_iface_flags("wlan0", true) == 0); 3297ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde } 3307ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3317ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 3327ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapndevoid android_net_wifi_hal_cleaned_up_handler(wifi_handle handle) { 3337ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde ALOGD("In wifi cleaned up handler"); 3347f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 3367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setStaticLongField(mCls, WifiHandleVarName, 0); 3377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 3387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.deleteGlobalRef(mCls); 339b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande mCls = NULL; 3407f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde mVM = NULL; 3417ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3427ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 343b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic void android_net_wifi_stopHal(JNIEnv* env, jclass cls) { 3447ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde ALOGD("In wifi stop Hal"); 345b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe 3467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 3477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_handle halHandle = getWifiHandle(helper, cls); 348f49a59bda006b13e0118d144e0a4a5f569b2251eVinit Deshpande if (halHandle == NULL) 349f49a59bda006b13e0118d144e0a4a5f569b2251eVinit Deshpande return; 350f49a59bda006b13e0118d144e0a4a5f569b2251eVinit Deshpande 351f49a59bda006b13e0118d144e0a4a5f569b2251eVinit Deshpande ALOGD("halHandle = %p, mVM = %p, mCls = %p", halHandle, mVM, mCls); 352ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn.wifi_cleanup(halHandle, android_net_wifi_hal_cleaned_up_handler); 3537ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3547ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 355b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic void android_net_wifi_waitForHalEvents(JNIEnv* env, jclass cls) { 3567f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 357b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande ALOGD("waitForHalEvents called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 3587f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 3607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_handle halHandle = getWifiHandle(helper, cls); 361ec61e7731968be994a23f2bd138f6761c8aea498xinhe hal_fn.wifi_event_loop(halHandle); 3623b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wang set_iface_flags("wlan0", false); 3637ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde} 3647ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 365b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic int android_net_wifi_getInterfaces(JNIEnv *env, jclass cls) { 3667f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde int n = 0; 3677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 3687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 3697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 3707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_handle halHandle = getWifiHandle(helper, cls); 3717f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde wifi_interface_handle *ifaceHandles = NULL; 372ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_ifaces(halHandle, &n, &ifaceHandles); 3737f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (result < 0) { 3747f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return result; 3757f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 37707ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande if (n < 0) { 3787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande THROW(helper,"android_net_wifi_getInterfaces no interfaces"); 379aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 380aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 381aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 382aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (ifaceHandles == NULL) { 3837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande THROW(helper,"android_net_wifi_getInterfaces null interface array"); 384aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return 0; 385aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 386aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 38707ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande if (n > 8) { 3887d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande THROW(helper,"Too many interfaces"); 38907ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande return 0; 39007ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande } 39107ce33c64db470e749f580ef2c83d21e50fbbb27Vinit Deshpande 3927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlongArray array = (env)->NewLongArray(n); 3937f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (array == NULL) { 3947d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande THROW(helper,"Error in accessing array"); 3957f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return 0; 3967f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 3977f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 3987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde jlong elems[8]; 3997f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde for (int i = 0; i < n; i++) { 4007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde elems[i] = reinterpret_cast<jlong>(ifaceHandles[i]); 4017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 4027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 4037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongArrayRegion(array, 0, n, elems); 4047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setStaticLongArrayField(cls, WifiIfaceHandleVarName, array); 4057f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 4067f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return (result < 0) ? result : n; 4077f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 4087f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 409b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jstring android_net_wifi_getInterfaceName(JNIEnv *env, jclass cls, jint i) { 4107d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 4117f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde char buf[EVENT_BUF_SIZE]; 4127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 4137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 4147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 4157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong value = helper.getStaticLongArrayField(cls, WifiIfaceHandleVarName, i); 4167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde wifi_interface_handle handle = (wifi_interface_handle) value; 417ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_iface_name(handle, buf, sizeof(buf)); 4187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (result < 0) { 4197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return NULL; 4207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } else { 4217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jstring> name = helper.newStringUTF(buf); 4227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return name.detach(); 4237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 4247f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 4257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 426b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 4272a6d76f0899289cd3b96e3428f02076fdbc0363eMitchell Willsstatic void onScanEvent(wifi_request_id id, wifi_scan_event event) { 4287d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 4297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 430b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 431c5cdba4fa88dd5653be476377ad97665fe2d4872Vinit Deshpande // ALOGD("onScanStatus called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 432b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 4332a6d76f0899289cd3b96e3428f02076fdbc0363eMitchell Wills helper.reportEvent(mCls, "onScanStatus", "(II)V", id, event); 434b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande} 435b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 4363571366ac36c70746b9f013ec2b54482861c9292Randy Panstatic void onFullScanResult(wifi_request_id id, wifi_scan_result *result, 4373571366ac36c70746b9f013ec2b54482861c9292Randy Pan unsigned buckets_scanned) { 438f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 4397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 440f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 441f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande //ALOGD("onFullScanResult called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 442f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 4431ab129e587d334a144a0bca5323c27985397a403Randy Pan JNIObject<jobject> scanResult = createScanResult(helper, result, true); 444f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 4451ab129e587d334a144a0bca5323c27985397a403Randy Pan if (scanResult == NULL) { 446f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde return; 447f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde } 448f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 4491ab129e587d334a144a0bca5323c27985397a403Randy Pan helper.reportEvent(mCls, "onFullScanResult", "(ILandroid/net/wifi/ScanResult;II)V", id, 4501ab129e587d334a144a0bca5323c27985397a403Randy Pan scanResult.get(), buckets_scanned, (jint) result->capability); 451f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde} 452f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde 453e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_startScan( 454b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject settings) { 455e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 4567d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 4577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 458d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande // ALOGD("starting scan on interface[%d] = %p", iface, handle); 459e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 460e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_scan_cmd_params params; 461e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(¶ms, 0, sizeof(params)); 462aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 4637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.base_period = helper.getIntField(settings, "base_period_ms"); 4647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.max_ap_per_scan = helper.getIntField(settings, "max_ap_per_scan"); 4657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.report_threshold_percent = helper.getIntField(settings, "report_threshold_percent"); 4667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.report_threshold_num_scans = helper.getIntField(settings, "report_threshold_num_scans"); 467aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 468c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande ALOGD("Initialized common fields %d, %d, %d, %d", params.base_period, params.max_ap_per_scan, 469c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande params.report_threshold_percent, params.report_threshold_num_scans); 470e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 471e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *bucket_array_type = "[Lcom/android/server/wifi/WifiNative$BucketSettings;"; 472e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde const char *channel_array_type = "[Lcom/android/server/wifi/WifiNative$ChannelSettings;"; 473aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 4747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.num_buckets = helper.getIntField(settings, "num_buckets"); 475aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 476d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande // ALOGD("Initialized num_buckets to %d", params.num_buckets); 477e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 478e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (int i = 0; i < params.num_buckets; i++) { 4797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> bucket = helper.getObjectArrayField( 4807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande settings, "buckets", bucket_array_type, i); 481aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 4827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.buckets[i].bucket = helper.getIntField(bucket, "bucket"); 4837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.buckets[i].band = (wifi_band) helper.getIntField(bucket, "band"); 4847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.buckets[i].period = helper.getIntField(bucket, "period_ms"); 485062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan params.buckets[i].max_period = helper.getIntField(bucket, "max_period_ms"); 486062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan // Although HAL API allows configurable base value for the truncated 487062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan // exponential back off scan. Native API and above support only 488062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan // truncated binary exponential back off scan. 489062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan // Hard code value of base to 2 here. 490062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan params.buckets[i].base = 2; 491062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan params.buckets[i].step_count = helper.getIntField(bucket, "step_count"); 492aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 4937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande int report_events = helper.getIntField(bucket, "report_events"); 494e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].report_events = report_events; 495aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 496062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan if (DBG) { 497062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan ALOGD("bucket[%d] = %d:%d:%d:%d:%d:%d:%d", i, params.buckets[i].bucket, 498062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan params.buckets[i].band, params.buckets[i].period, 499062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan params.buckets[i].max_period, params.buckets[i].base, 500062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan params.buckets[i].step_count, report_events); 501062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan } 502e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 5037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.buckets[i].num_channels = helper.getIntField(bucket, "num_channels"); 504d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande // 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++) { 5077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> channel = helper.getObjectArrayField( 5087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande bucket, "channels", channel_array_type, j); 509aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 5107d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.buckets[i].channels[j].channel = helper.getIntField(channel, "frequency"); 5117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.buckets[i].channels[j].dwellTimeMs = helper.getIntField(channel, "dwell_time_ms"); 512aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 5137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande bool passive = helper.getBoolField(channel, "passive"); 514e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde params.buckets[i].channels[j].passive = (passive ? 1 : 0); 515e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 516bb6942c6b6d129fd8904e341c9ce4a4118ed3e0bVinit Deshpande // ALOGD("Initialized channel %d", params.buckets[i].channels[j].channel); 517e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 518e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 519e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 520f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande // ALOGD("Initialized all fields"); 521e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 522e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_scan_result_handler handler; 523e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&handler, 0, sizeof(handler)); 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) { 5317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 5327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 5337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 534d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande // ALOGD("stopping scan on interface[%d] = %p", iface, handle); 535e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 536ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_stop_gscan(id, handle) == WIFI_SUCCESS; 537e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 538e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 539c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpandestatic int compare_scan_result_timestamp(const void *v1, const void *v2) { 540c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande const wifi_scan_result *result1 = static_cast<const wifi_scan_result *>(v1); 541c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande const wifi_scan_result *result2 = static_cast<const wifi_scan_result *>(v2); 542c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return result1->ts - result2->ts; 543c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande} 544c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 545e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jobject android_net_wifi_getScanResults( 546b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jboolean flush) { 547c8b61ce3b41d92a0f17a4b3f39ccdbf819060939Navtej Singh Mann 5487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 549c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande wifi_cached_scan_results scan_data[64]; 550c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande int num_scan_data = 64; 551c8b61ce3b41d92a0f17a4b3f39ccdbf819060939Navtej Singh Mann 5527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 553f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande // ALOGD("getting scan results on interface[%d] = %p", iface, handle); 554c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 555c8b61ce3b41d92a0f17a4b3f39ccdbf819060939Navtej Singh Mann byte b = flush ? 0xFF : 0; 556ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_cached_gscan_results(handle, b, num_scan_data, scan_data, &num_scan_data); 557e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (result == WIFI_SUCCESS) { 5587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> scanData = helper.createObjectArray( 559c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande "android/net/wifi/WifiScanner$ScanData", num_scan_data); 560c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanData == NULL) { 561259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in allocating array of scanData for getScanResults, length=%d", 562259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills num_scan_data); 563e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 564e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 565e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 566c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande for (int i = 0; i < num_scan_data; i++) { 567c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 5687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> data = helper.createObject("android/net/wifi/WifiScanner$ScanData"); 569c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (data == NULL) { 570259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in allocating scanData for getScanResults"); 571c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return NULL; 572c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 573e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 5747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(data, "mId", scan_data[i].scan_id); 5757d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(data, "mFlags", scan_data[i].flags); 576c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills helper.setIntField(data, "mBucketsScanned", scan_data[i].buckets_scanned); 577e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 578c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande /* sort all scan results by timestamp */ 579c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande qsort(scan_data[i].results, scan_data[i].num_results, 580c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande sizeof(wifi_scan_result), compare_scan_result_timestamp); 581c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 5827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> scanResults = helper.createObjectArray( 583c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande "android/net/wifi/ScanResult", scan_data[i].num_results); 584c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanResults == NULL) { 585259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in allocating scanResult array for getScanResults, length=%d", 586259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills scan_data[i].num_results); 587e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 588e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 589e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 590c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande wifi_scan_result *results = scan_data[i].results; 591c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande for (int j = 0; j < scan_data[i].num_results; j++) { 592c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande 5931ab129e587d334a144a0bca5323c27985397a403Randy Pan JNIObject<jobject> scanResult = createScanResult(helper, &results[j], false); 594c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande if (scanResult == NULL) { 595259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in creating scan result for getScanResults"); 596c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande return NULL; 597c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 5987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 5997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectArrayElement(scanResults, j, scanResult); 600c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande } 601e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 6027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectField(data, "mResults", "[Landroid/net/wifi/ScanResult;", scanResults); 6037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectArrayElement(scanData, i, data); 604e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 605e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 606c5cdba4fa88dd5653be476377ad97665fe2d4872Vinit Deshpande // ALOGD("retrieved %d scan data from interface[%d] = %p", num_scan_data, iface, handle); 6077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return scanData.detach(); 608e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } else { 609e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return NULL; 610e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 611e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 612e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 613e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 614e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_getScanCapabilities( 615b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jobject capabilities) { 616e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 6177d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 6187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 619f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande // ALOGD("getting scan capabilities on interface[%d] = %p", iface, handle); 620e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 621e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_gscan_capabilities c; 622e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&c, 0, sizeof(c)); 623ec61e7731968be994a23f2bd138f6761c8aea498xinhe int result = hal_fn.wifi_get_gscan_capabilities(handle, &c); 624e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (result != WIFI_SUCCESS) { 625e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("failed to get capabilities : %d", result); 626e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return JNI_FALSE; 627e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 628e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 6297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(capabilities, "max_scan_cache_size", c.max_scan_cache_size); 6307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(capabilities, "max_scan_buckets", c.max_scan_buckets); 6317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(capabilities, "max_ap_cache_per_scan", c.max_ap_cache_per_scan); 6327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(capabilities, "max_rssi_sample_size", c.max_rssi_sample_size); 6337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(capabilities, "max_scan_reporting_threshold", c.max_scan_reporting_threshold); 6347d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(capabilities, "max_hotlist_bssids", c.max_hotlist_bssids); 6357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(capabilities, "max_significant_wifi_change_aps", 636d34e3a7b98d51f684100483151fceb233fd95215Roshan Pius c.max_significant_wifi_change_aps); 637d34e3a7b98d51f684100483151fceb233fd95215Roshan Pius helper.setIntField(capabilities, "max_bssid_history_entries", c.max_bssid_history_entries); 638d34e3a7b98d51f684100483151fceb233fd95215Roshan Pius helper.setIntField(capabilities, "max_number_epno_networks", c.max_number_epno_networks); 639d34e3a7b98d51f684100483151fceb233fd95215Roshan Pius helper.setIntField(capabilities, "max_number_epno_networks_by_ssid", 640d34e3a7b98d51f684100483151fceb233fd95215Roshan Pius c.max_number_epno_networks_by_ssid); 641d34e3a7b98d51f684100483151fceb233fd95215Roshan Pius helper.setIntField(capabilities, "max_number_of_white_listed_ssid", 642d34e3a7b98d51f684100483151fceb233fd95215Roshan Pius c.max_number_of_white_listed_ssid); 643e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 644e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return JNI_TRUE; 645e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 646e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 647e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 648e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic byte parseHexChar(char ch) { 649e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (isdigit(ch)) 650e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - '0'; 651e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else if ('A' <= ch && ch <= 'F') 652e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - 'A' + 10; 653e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else if ('a' <= ch && ch <= 'f') 654e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return ch - 'a' + 10; 655e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde else { 656e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("invalid character in bssid %c", ch); 657e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return 0; 658e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 659e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 660e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 661e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic byte parseHexByte(const char * &str) { 6621921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart if (str[0] == '\0') { 6631921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart ALOGE("Passed an empty string"); 6641921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart return 0; 6651921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart } 666e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde byte b = parseHexChar(str[0]); 6671921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart if (str[1] == '\0' || str[1] == ':') { 6681921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart str ++; 669e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } else { 670e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde b = b << 4 | parseHexChar(str[1]); 6711921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart str += 2; 6721921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart } 6731921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart 6741921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart // Skip trailing delimiter if not at the end of the string. 6751921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart if (str[0] != '\0') { 6761921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart str++; 677e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 6781921acbf2c82dd0813b3734f2609fe6f971c9c2fPaul Stewart return b; 679e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 680e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 681e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic void parseMacAddress(const char *str, mac_addr addr) { 682e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[0] = parseHexByte(str); 683e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[1] = parseHexByte(str); 684e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2] = parseHexByte(str); 685e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[3] = parseHexByte(str); 686e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[4] = parseHexByte(str); 687e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[5] = parseHexByte(str); 688e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 689e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 690143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic bool parseMacAddress(JNIEnv *env, jobject obj, mac_addr addr) { 6917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 6927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jstring> macAddrString = helper.getStringField(obj, "bssid"); 693143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (macAddrString == NULL) { 694143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error getting bssid field"); 695143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return false; 696143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 697143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 6987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ScopedUtfChars chars(env, macAddrString); 6997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande const char *bssid = chars.c_str(); 700143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (bssid == NULL) { 701143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande ALOGE("Error getting bssid"); 702143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return false; 703143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 704143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 705143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande parseMacAddress(bssid, addr); 706143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return true; 707143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 708143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 709e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic void onHotlistApFound(wifi_request_id id, 710e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde unsigned num_results, wifi_scan_result *results) { 711e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 7127d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 7137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("onHotlistApFound called, vm = %p, obj = %p, num_results = %d", mVM, mCls, num_results); 714e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 7157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> scanResults = helper.newObjectArray(num_results, 7167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "android/net/wifi/ScanResult", NULL); 7177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (scanResults == NULL) { 718259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in allocating ScanResult array in onHotlistApFound, length=%d", num_results); 7197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 7207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 7217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde for (unsigned i = 0; i < num_results; i++) { 7237f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7241ab129e587d334a144a0bca5323c27985397a403Randy Pan JNIObject<jobject> scanResult = createScanResult(helper, &results[i], false); 7257f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde if (scanResult == NULL) { 726259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in creating scan result in onHotlistApFound"); 7277f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde return; 7287f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 7297f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectArrayElement(scanResults, i, scanResult); 7317f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 7327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("Found AP %32s", results[i].ssid); 733e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 734e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 7357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.reportEvent(mCls, "onHotlistApFound", "(I[Landroid/net/wifi/ScanResult;)V", 7367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande id, scanResults.get()); 737e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 738e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 739e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpandestatic void onHotlistApLost(wifi_request_id id, 740e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande unsigned num_results, wifi_scan_result *results) { 741e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 7427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 7437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("onHotlistApLost called, vm = %p, obj = %p, num_results = %d", mVM, mCls, num_results); 744e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 7457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> scanResults = helper.newObjectArray(num_results, 7467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "android/net/wifi/ScanResult", NULL); 747e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (scanResults == NULL) { 748259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in allocating ScanResult array onHotlistApLost, length=%d", num_results); 749e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 750e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 751e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 752e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande for (unsigned i = 0; i < num_results; i++) { 753e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 7541ab129e587d334a144a0bca5323c27985397a403Randy Pan JNIObject<jobject> scanResult = createScanResult(helper, &results[i], false); 755e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande if (scanResult == NULL) { 756259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in creating scan result in onHotlistApLost"); 757e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande return; 758e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 759e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 7607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectArrayElement(scanResults, i, scanResult); 761e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 7627d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("Lost AP %32s", results[i].ssid); 763e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande } 764e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 7657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.reportEvent(mCls, "onHotlistApLost", "(I[Landroid/net/wifi/ScanResult;)V", 7667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande id, scanResults.get()); 767e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande} 768e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 769e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 770e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_setHotlist( 771b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject ap) { 772e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 7737d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 7747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 775e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("setting hotlist on interface[%d] = %p", iface, handle); 776e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 777e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_bssid_hotlist_params params; 778e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(¶ms, 0, sizeof(params)); 779e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 7807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.lost_ap_sample_size = helper.getIntField(ap, "apLostThreshold"); 781e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande 7827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> array = helper.getArrayField( 7837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ap, "bssidInfos", "[Landroid/net/wifi/WifiScanner$BssidInfo;"); 7847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.num_bssid = helper.getArrayLength(array); 785e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 786c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle if (params.num_bssid == 0) { 787259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("setHotlist array length was 0"); 788e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 789e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 790e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 79129a2baf3195256bab6a0a4a2d07b7f2efa46b614Ningyuan Wang if (params.num_bssid > 792a5a18239096f6faee80f15f3fff39c3311898484Ningyuan Wang static_cast<int>(sizeof(params.ap) / sizeof(params.ap[0]))) { 793a5a18239096f6faee80f15f3fff39c3311898484Ningyuan Wang ALOGE("setHotlist array length is too long"); 794e8beda2579d277fb6b27f1792c4ed45c136ee15aNingyuan Wang android_errorWriteLog(SAFE_NET_LOG_ID, "31856351"); 795a5a18239096f6faee80f15f3fff39c3311898484Ningyuan Wang return false; 796e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 797e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 798c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle for (int i = 0; i < params.num_bssid; i++) { 7997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> objAp = helper.getObjectArrayElement(array, i); 800e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jstring> macAddrString = helper.getStringField(objAp, "bssid"); 802e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (macAddrString == NULL) { 803e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid field"); 804e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 805e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 806e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ScopedUtfChars chars(env, macAddrString); 8087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande const char *bssid = chars.c_str(); 809e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (bssid == NULL) { 810e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid"); 811e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 812e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 813a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande parseMacAddress(bssid, params.ap[i].bssid); 814e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 815e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mac_addr addr; 816a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande memcpy(addr, params.ap[i].bssid, sizeof(mac_addr)); 817e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 818e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssidOut[32]; 819e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde sprintf(bssidOut, "%0x:%0x:%0x:%0x:%0x:%0x", addr[0], addr[1], 820e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2], addr[3], addr[4], addr[5]); 821e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 822e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Added bssid %s", bssidOut); 823e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.ap[i].low = helper.getIntField(objAp, "low"); 8257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.ap[i].high = helper.getIntField(objAp, "high"); 826e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 827e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 828e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_hotlist_ap_found_handler handler; 829e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde memset(&handler, 0, sizeof(handler)); 830e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 831e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_hotlist_ap_found = &onHotlistApFound; 832e9fa5dcd292f2b8bad2c567773c74a1568c513adVinit Deshpande handler.on_hotlist_ap_lost = &onHotlistApLost; 833ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_set_bssid_hotlist(id, handle, params, handler) == WIFI_SUCCESS; 834e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 835e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandestatic jboolean android_net_wifi_resetHotlist(JNIEnv *env, jclass cls, jint iface, jint id) { 837e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 8397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 840e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("resetting hotlist on interface[%d] = %p", iface, handle); 841e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 842ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_reset_bssid_hotlist(id, handle) == WIFI_SUCCESS; 843e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde} 844e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 845a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpandevoid onSignificantWifiChange(wifi_request_id id, 846a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande unsigned num_results, wifi_significant_change_result **results) { 847e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 849e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("onSignificantWifiChange called, vm = %p, obj = %p", mVM, mCls); 851e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> scanResults = helper.newObjectArray( 8537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande num_results, "android/net/wifi/ScanResult", NULL); 854e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (scanResults == NULL) { 855259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in allocating ScanResult array in onSignificantWifiChange, length=%d", 856259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills num_results); 857e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 858e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 859e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 860e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde for (unsigned i = 0; i < num_results; i++) { 861e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 862d31a40e4c13481c0e70b0b6392bccf6a0f75c4e7Greg Hackmann wifi_significant_change_result &result = *(results[i]); 863a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande 8647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> scanResult = helper.createObject("android/net/wifi/ScanResult"); 865e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (scanResult == NULL) { 866259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in creating scan result in onSignificantWifiChange"); 867e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return; 868e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 869e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande // helper.setStringField(scanResult, "SSID", results[i].ssid); 871e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 872e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssid[32]; 873a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result.bssid[0], result.bssid[1], 874a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande result.bssid[2], result.bssid[3], result.bssid[4], result.bssid[5]); 875e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setStringField(scanResult, "BSSID", bssid); 877e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(scanResult, "level", result.rssi[0]); 8797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(scanResult, "frequency", result.channel); 8807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande // helper.setLongField(scanResult, "timestamp", result.ts); 8817f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 8827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectArrayElement(scanResults, i, scanResult); 8837f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 8847f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 8857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.reportEvent(mCls, "onSignificantWifiChange", "(I[Landroid/net/wifi/ScanResult;)V", 8867d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande id, scanResults.get()); 887e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 8887f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 8897f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 890e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_trackSignificantWifiChange( 891b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject settings) { 8927f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 8937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 8947d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 895e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("tracking significant wifi change on interface[%d] = %p", iface, handle); 8967f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 897e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_significant_change_params params; 8987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde memset(¶ms, 0, sizeof(params)); 8997f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 9007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.rssi_sample_size = helper.getIntField(settings, "rssiSampleSize"); 9017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.lost_ap_sample_size = helper.getIntField(settings, "lostApSampleSize"); 9027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.min_breaching = helper.getIntField(settings, "minApsBreachingThreshold"); 903e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 904b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande const char *bssid_info_array_type = "[Landroid/net/wifi/WifiScanner$BssidInfo;"; 9057d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> bssids = helper.getArrayField( 9067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande settings, "bssidInfos", bssid_info_array_type); 9077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.num_bssid = helper.getArrayLength(bssids); 908e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 909c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle if (params.num_bssid == 0) { 910259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("BssidInfo array length was 0"); 911e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 912e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 913e8beda2579d277fb6b27f1792c4ed45c136ee15aNingyuan Wang if (params.num_bssid > 914e8beda2579d277fb6b27f1792c4ed45c136ee15aNingyuan Wang static_cast<int>(sizeof(params.ap) / sizeof(params.ap[0]))) { 915e8beda2579d277fb6b27f1792c4ed45c136ee15aNingyuan Wang ALOGE("trackSignificantWifiChange array length is too long"); 916e8beda2579d277fb6b27f1792c4ed45c136ee15aNingyuan Wang android_errorWriteLog(SAFE_NET_LOG_ID, "37775935"); 917e8beda2579d277fb6b27f1792c4ed45c136ee15aNingyuan Wang return false; 918e8beda2579d277fb6b27f1792c4ed45c136ee15aNingyuan Wang } 919e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("Initialized common fields %d, %d, %d, %d", params.rssi_sample_size, 920c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle params.lost_ap_sample_size, params.min_breaching, params.num_bssid); 921e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 922c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle for (int i = 0; i < params.num_bssid; i++) { 9237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> objAp = helper.getObjectArrayElement(bssids, i); 924e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 9257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jstring> macAddrString = helper.getStringField(objAp, "bssid"); 926e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (macAddrString == NULL) { 927e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid field"); 928e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 929e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 930e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 9317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ScopedUtfChars chars(env, macAddrString.get()); 9327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande const char *bssid = chars.c_str(); 933e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde if (bssid == NULL) { 934e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGE("Error getting bssid"); 935e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde return false; 936e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 937e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 938e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde mac_addr addr; 939e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde parseMacAddress(bssid, addr); 940a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande memcpy(params.ap[i].bssid, addr, sizeof(mac_addr)); 941e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 942e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde char bssidOut[32]; 9434dbfefd99e51ab1cca058026c90f8093b099198bVinit Deshpande sprintf(bssidOut, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], 944e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde addr[2], addr[3], addr[4], addr[5]); 945e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 9467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.ap[i].low = helper.getIntField(objAp, "low"); 9477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande params.ap[i].high = helper.getIntField(objAp, "high"); 948e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 949a59fae6bd96ead6d3c8772b3cc5e69cd08444400Vinit Deshpande ALOGD("Added bssid %s, [%04d, %04d]", bssidOut, params.ap[i].low, params.ap[i].high); 950e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 951e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 952c03c14696493a3763948feed7f1e75e77e2a2f9bPierre Vandwalle ALOGD("Added %d bssids", params.num_bssid); 953e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 954e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde wifi_significant_change_handler handler; 9557f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde memset(&handler, 0, sizeof(handler)); 9567f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 957e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde handler.on_significant_change = &onSignificantWifiChange; 958ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_set_significant_change_handler(id, handle, params, handler) == WIFI_SUCCESS; 9597f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 9607f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 961e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic jboolean android_net_wifi_untrackSignificantWifiChange( 962b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id) { 963e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 9647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 9657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 966e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde ALOGD("resetting significant wifi change on interface[%d] = %p", iface, handle); 9677f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 968ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_reset_significant_change_handler(id, handle) == WIFI_SUCCESS; 9697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 9707ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 971aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallewifi_iface_stat link_stat; 972200e8ee5097134010a6edee8d031bb02ff7eeb5avandwallewifi_radio_stat radio_stat; // L release has support for only one radio 97384e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Piusu32 *tx_time_per_level_arr = 0; 974ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius// Let's cache the supported feature set to avoid unnecessary HAL invocations. 975ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Piusfeature_set cached_feature_set = 0; 976ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius 977ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Piusbool isTxLevelStatsPresent(wifi_radio_stat *radio_stats) { 978ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius if (IS_SUPPORTED_FEATURE(WIFI_FEATURE_TX_TRANSMIT_POWER, cached_feature_set)) { 979ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius if(radio_stats->tx_time_per_levels != 0 && radio_stats->num_tx_levels > 0) { 980ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius return true; 981ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius } else { 982ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius ALOGE("Ignoring invalid tx_level info in radio_stats"); 983ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius } 984ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius } 985ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius return false; 986ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius} 987aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 988aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwallevoid onLinkStatsResults(wifi_request_id id, wifi_iface_stat *iface_stat, 989200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle int num_radios, wifi_radio_stat *radio_stats) 990aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle{ 991200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle if (iface_stat != 0) { 992200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memcpy(&link_stat, iface_stat, sizeof(wifi_iface_stat)); 993200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } else { 994200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memset(&link_stat, 0, sizeof(wifi_iface_stat)); 995200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } 996200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 997200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle if (num_radios > 0 && radio_stats != 0) { 998200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memcpy(&radio_stat, radio_stats, sizeof(wifi_radio_stat)); 999ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius if (isTxLevelStatsPresent(radio_stats)) { 100084e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius // This realloc should be a no-op after the first allocation because for a given 100184e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius // device, the number of power levels should not change. 100284e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius u32 arr_size = sizeof(u32) * radio_stats->num_tx_levels; 100384e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius tx_time_per_level_arr = (u32 *)realloc(tx_time_per_level_arr, arr_size); 100484e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius memcpy(tx_time_per_level_arr, radio_stats->tx_time_per_levels, arr_size); 100584e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius radio_stat.tx_time_per_levels = tx_time_per_level_arr; 100684e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius } else { 1007ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius radio_stat.num_tx_levels = 0; 100884e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius radio_stat.tx_time_per_levels = 0; 100984e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius } 1010200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } else { 1011200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle memset(&radio_stat, 0, sizeof(wifi_radio_stat)); 1012200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } 1013aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 1014aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 1015d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwallestatic void android_net_wifi_setLinkLayerStats (JNIEnv *env, jclass cls, jint iface, int enable) { 10167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 10177d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1018d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwalle 1019d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwalle wifi_link_layer_params params; 1020d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwalle params.aggressive_statistics_gathering = enable; 1021d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwalle params.mpdu_size_threshold = 128; 10227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 10237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("android_net_wifi_setLinkLayerStats: %u\n", enable); 1024d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwalle 1025d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwalle hal_fn.wifi_set_link_stats(handle, params); 1026d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwalle} 1027d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwalle 1028b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpandestatic jobject android_net_wifi_getLinkLayerStats (JNIEnv *env, jclass cls, jint iface) { 1029aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 10307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 1031aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle wifi_stats_result_handler handler; 1032aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle memset(&handler, 0, sizeof(handler)); 1033aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle handler.on_link_stats_results = &onLinkStatsResults; 10347d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1035ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius int result; 1036ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius // Cache the features supported by the device to determine if tx level stats are present or not 1037ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius if (cached_feature_set == 0) { 1038ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius result = hal_fn.wifi_get_supported_feature_set(handle, &cached_feature_set); 1039ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius if (result != WIFI_SUCCESS) { 1040ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius cached_feature_set = 0; 1041ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius } 1042ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius } 1043ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius 1044ff866c96ff5456bb0741aecbc26a4b097e798eceRoshan Pius result = hal_fn.wifi_get_link_stats(0, handle, handler); 1045aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (result < 0) { 1046200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle ALOGE("android_net_wifi_getLinkLayerStats: failed to get link statistics\n"); 1047aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return NULL; 1048aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 1049aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 10507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> wifiLinkLayerStats = helper.createObject( 10517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "android/net/wifi/WifiLinkLayerStats"); 1052aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle if (wifiLinkLayerStats == NULL) { 1053aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle ALOGE("Error in allocating wifiLinkLayerStats"); 1054aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle return NULL; 1055aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle } 1056aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle 105784e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius JNIObject<jintArray> tx_time_per_level = helper.newIntArray(radio_stat.num_tx_levels); 105884e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius if (tx_time_per_level == NULL) { 105984e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius ALOGE("Error in allocating wifiLinkLayerStats"); 106084e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius return NULL; 106184e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius } 106284e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius 10637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(wifiLinkLayerStats, "beacon_rx", link_stat.beacon_rx); 10647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(wifiLinkLayerStats, "rssi_mgmt", link_stat.rssi_mgmt); 10657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "rxmpdu_be", link_stat.ac[WIFI_AC_BE].rx_mpdu); 10667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "rxmpdu_bk", link_stat.ac[WIFI_AC_BK].rx_mpdu); 10677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "rxmpdu_vi", link_stat.ac[WIFI_AC_VI].rx_mpdu); 10687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "rxmpdu_vo", link_stat.ac[WIFI_AC_VO].rx_mpdu); 10697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "txmpdu_be", link_stat.ac[WIFI_AC_BE].tx_mpdu); 10707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "txmpdu_bk", link_stat.ac[WIFI_AC_BK].tx_mpdu); 10717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "txmpdu_vi", link_stat.ac[WIFI_AC_VI].tx_mpdu); 10727d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "txmpdu_vo", link_stat.ac[WIFI_AC_VO].tx_mpdu); 10737d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "lostmpdu_be", link_stat.ac[WIFI_AC_BE].mpdu_lost); 10747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "lostmpdu_bk", link_stat.ac[WIFI_AC_BK].mpdu_lost); 10757d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "lostmpdu_vi", link_stat.ac[WIFI_AC_VI].mpdu_lost); 10767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "lostmpdu_vo", link_stat.ac[WIFI_AC_VO].mpdu_lost); 10777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "retries_be", link_stat.ac[WIFI_AC_BE].retries); 10787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "retries_bk", link_stat.ac[WIFI_AC_BK].retries); 10797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "retries_vi", link_stat.ac[WIFI_AC_VI].retries); 10807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(wifiLinkLayerStats, "retries_vo", link_stat.ac[WIFI_AC_VO].retries); 10817d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 10827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(wifiLinkLayerStats, "on_time", radio_stat.on_time); 10837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(wifiLinkLayerStats, "tx_time", radio_stat.tx_time); 10847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(wifiLinkLayerStats, "rx_time", radio_stat.rx_time); 10857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(wifiLinkLayerStats, "on_time_scan", radio_stat.on_time_scan); 108684e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius if (radio_stat.tx_time_per_levels != 0) { 108784e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius helper.setIntArrayRegion(tx_time_per_level, 0, radio_stat.num_tx_levels, 108884e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius (jint *)radio_stat.tx_time_per_levels); 108984e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius } 109084e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius helper.setObjectField(wifiLinkLayerStats, "tx_time_per_level", "[I", tx_time_per_level); 109184e6c0c94f692c9327e1c5ee708cafad640cfa18Roshan Pius 10927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 10937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return wifiLinkLayerStats.detach(); 1094aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle} 1095e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 1096c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpandestatic jint android_net_wifi_getSupportedFeatures(JNIEnv *env, jclass cls, jint iface) { 10977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 10987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 10997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1100a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande feature_set set = 0; 1101a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 1102a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande wifi_error result = WIFI_SUCCESS; 1103c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande /* 1104a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande set = WIFI_FEATURE_INFRA 1105a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_INFRA_5G 1106a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_HOTSPOT 1107a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_P2P 1108a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_SOFT_AP 1109a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_GSCAN 1110a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_PNO 1111a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_TDLS 1112a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande | WIFI_FEATURE_EPR; 1113c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande */ 1114a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 1115ec61e7731968be994a23f2bd138f6761c8aea498xinhe result = hal_fn.wifi_get_supported_feature_set(handle, &set); 1116a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande if (result == WIFI_SUCCESS) { 1117f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande // ALOGD("wifi_get_supported_feature_set returned set = 0x%x", set); 1118a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande return set; 1119a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } else { 1120f3bc3c6dcde09a8e39f0a30febf6ae47e882ce90Vinit Deshpande ALOGE("wifi_get_supported_feature_set returned error = 0x%x", result); 1121a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande return 0; 1122a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } 1123a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande} 1124a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 112506a3ebada2343fe3f083339973f143b39d62b3c4xinhestatic void onRttResults(wifi_request_id id, unsigned num_results, wifi_rtt_result* results[]) { 1126143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 11277d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 1128143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1129f4bd8974d7f3ce05eb6e7325cabcb706d6ac5999Wei Wang if (DBG) ALOGD("onRttResults called, vm = %p, obj = %p", mVM, mCls); 1130143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 11317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> rttResults = helper.newObjectArray( 11327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande num_results, "android/net/wifi/RttManager$RttResult", NULL); 1133143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (rttResults == NULL) { 1134259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in allocating RttResult array in onRttResults, length=%d", num_results); 1135143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 1136143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1137143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1138143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande for (unsigned i = 0; i < num_results; i++) { 1139143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 114006a3ebada2343fe3f083339973f143b39d62b3c4xinhe wifi_rtt_result *result = results[i]; 1141143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 11427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> rttResult = helper.createObject("android/net/wifi/RttManager$RttResult"); 1143143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande if (rttResult == NULL) { 1144259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("Error in creating rtt result in onRttResults"); 1145143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande return; 1146143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1147143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1148143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande char bssid[32]; 114906a3ebada2343fe3f083339973f143b39d62b3c4xinhe sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result->addr[0], result->addr[1], 115006a3ebada2343fe3f083339973f143b39d62b3c4xinhe result->addr[2], result->addr[3], result->addr[4], result->addr[5]); 1151143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 11527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setStringField(rttResult, "bssid", bssid); 11537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "burstNumber", result->burst_num); 11547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "measurementFrameNumber", result->measurement_number); 11557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "successMeasurementFrameNumber", result->success_number); 11567d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(rttResult, "frameNumberPerBurstPeer", result->number_per_burst_peer); 11577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "status", result->status); 11587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "measurementType", result->type); 11597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(rttResult, "retryAfterDuration", result->retry_after_duration); 1160ad34e89a3f383d785f84242037b460de81576827Wei Wang helper.setLongField(rttResult, "ts", result->ts); 11617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "rssi", result->rssi); 11627d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "rssiSpread", result->rssi_spread); 11637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "txRate", result->tx_rate.bitrate); 11647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "rxRate", result->rx_rate.bitrate); 11657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(rttResult, "rtt", result->rtt); 11667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setLongField(rttResult, "rttStandardDeviation", result->rtt_sd); 116700c3a8c9dbb0e84f59375ac27054fbcb95a724fdEtan Cohen helper.setIntField( rttResult, "distance", result->distance_mm / 10); 116868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang helper.setIntField( rttResult, "distanceStandardDeviation", result->distance_sd_mm / 10); 116968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang helper.setIntField( rttResult, "distanceSpread", result->distance_spread_mm / 10); 11707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "burstDuration", result->burst_duration); 11717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField( rttResult, "negotiatedBurstNum", result->negotiated_burst_num); 11727d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 11737d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> LCI = helper.createObject( 11747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "android/net/wifi/RttManager$WifiInformationElement"); 11757d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande if (result->LCI != NULL && result->LCI->len > 0) { 11767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setByteField(LCI, "id", result->LCI->id); 11777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jbyteArray> elements = helper.newByteArray(result->LCI->len); 11787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jbyte *bytes = (jbyte *)&(result->LCI->data[0]); 11797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setByteArrayRegion(elements, 0, result->LCI->len, bytes); 11807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectField(LCI, "data", "[B", elements); 11817d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } else { 11827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setByteField(LCI, "id", (byte)(0xff)); 11837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 11847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectField(rttResult, "LCI", 11857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "Landroid/net/wifi/RttManager$WifiInformationElement;", LCI); 11867d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 11877d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> LCR = helper.createObject( 11887d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "android/net/wifi/RttManager$WifiInformationElement"); 11897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande if (result->LCR != NULL && result->LCR->len > 0) { 11907d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setByteField(LCR, "id", result->LCR->id); 11917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jbyteArray> elements = helper.newByteArray(result->LCI->len); 11927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jbyte *bytes = (jbyte *)&(result->LCR->data[0]); 11937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setByteArrayRegion(elements, 0, result->LCI->len, bytes); 11947d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectField(LCR, "data", "[B", elements); 11957d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } else { 11967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setByteField(LCR, "id", (byte)(0xff)); 11977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 11987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectField(rttResult, "LCR", 11997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "Landroid/net/wifi/RttManager$WifiInformationElement;", LCR); 12007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 12017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectArrayElement(rttResults, i, rttResult); 12027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 120393a1dbd961f05335635ede08eae6481284690c7dxinhe 12047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.reportEvent(mCls, "onRttResults", "(I[Landroid/net/wifi/RttManager$RttResult;)V", 12057d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande id, rttResults.get()); 1206143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1207143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 120802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpandeconst int MaxRttConfigs = 16; 120902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 1210143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic jboolean android_net_wifi_requestRange( 1211143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject params) { 1212143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 12137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 12147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 12157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1216f4bd8974d7f3ce05eb6e7325cabcb706d6ac5999Wei Wang if (DBG) ALOGD("sending rtt request [%d] = %p", id, handle); 1217202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang if (params == NULL) { 1218202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang ALOGE("ranging params are empty"); 1219202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang return false; 1220202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang } 1221143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 122202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande wifi_rtt_config configs[MaxRttConfigs]; 122302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande memset(&configs, 0, sizeof(configs)); 122402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 12257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande int len = helper.getArrayLength((jobjectArray)params); 122602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (len > MaxRttConfigs) { 122702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande return false; 122802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 122902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 123002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande for (int i = 0; i < len; i++) { 123102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 12327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> param = helper.getObjectArrayElement((jobjectArray)params, i); 123302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (param == NULL) { 1234f4bd8974d7f3ce05eb6e7325cabcb706d6ac5999Wei Wang ALOGW("could not get element %d", i); 123502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande continue; 123602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1237143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 123802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande wifi_rtt_config &config = configs[i]; 123902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 124002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande parseMacAddress(env, param, config.addr); 12417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.type = (wifi_rtt_type)helper.getIntField(param, "requestType"); 12427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.peer = (rtt_peer_type)helper.getIntField(param, "deviceType"); 12437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.channel.center_freq = helper.getIntField(param, "frequency"); 12447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.channel.width = (wifi_channel_width) helper.getIntField(param, "channelWidth"); 12457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.channel.center_freq0 = helper.getIntField(param, "centerFreq0"); 12467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.channel.center_freq1 = helper.getIntField(param, "centerFreq1"); 12477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 12487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.num_burst = helper.getIntField(param, "numberBurst"); 12497d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.burst_period = (unsigned) helper.getIntField(param, "interval"); 12507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.num_frames_per_burst = (unsigned) helper.getIntField(param, "numSamplesPerBurst"); 12517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.num_retries_per_rtt_frame = (unsigned) helper.getIntField(param, 125212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe "numRetriesPerMeasurementFrame"); 12537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.num_retries_per_ftmr = (unsigned) helper.getIntField(param, "numRetriesPerFTMR"); 12547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.LCI_request = helper.getBoolField(param, "LCIRequest") ? 1 : 0; 12557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.LCR_request = helper.getBoolField(param, "LCRRequest") ? 1 : 0; 12567d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.burst_duration = (unsigned) helper.getIntField(param, "burstTimeout"); 12577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.preamble = (wifi_rtt_preamble) helper.getIntField(param, "preamble"); 12587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande config.bw = (wifi_rtt_bw) helper.getIntField(param, "bandwidth"); 125902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1260143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1261143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande wifi_rtt_event_handler handler; 1262143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande handler.on_rtt_results = &onRttResults; 1263143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1264ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_rtt_range_request(id, handle, len, configs, handler) == WIFI_SUCCESS; 1265143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1266143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1267143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandestatic jboolean android_net_wifi_cancelRange( 1268042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande JNIEnv *env, jclass cls, jint iface, jint id, jobject params) { 1269143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 12707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 12717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1272f4bd8974d7f3ce05eb6e7325cabcb706d6ac5999Wei Wang if (DBG) ALOGD("cancelling rtt request [%d] = %p", id, handle); 1273143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1274202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang if (params == NULL) { 1275202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang ALOGE("ranging params are empty"); 1276202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang return false; 1277202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang } 1278202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang 127902a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande mac_addr addrs[MaxRttConfigs]; 128002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande memset(&addrs, 0, sizeof(addrs)); 128102a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 12827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande int len = helper.getArrayLength((jobjectArray)params); 128302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (len > MaxRttConfigs) { 128402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande return false; 128502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1286143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 128702a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande for (int i = 0; i < len; i++) { 128802a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 12897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> param = helper.getObjectArrayElement(params, i); 129002a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande if (param == NULL) { 1291f4bd8974d7f3ce05eb6e7325cabcb706d6ac5999Wei Wang ALOGW("could not get element %d", i); 129202a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande continue; 129302a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 129402a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande 129502a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande parseMacAddress(env, param, addrs[i]); 129602a1f98f2cecb8ae2d466d6f9fab06b473f970ddVinit Deshpande } 1297143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1298ec61e7731968be994a23f2bd138f6761c8aea498xinhe return hal_fn.wifi_rtt_range_cancel(id, handle, len, addrs) == WIFI_SUCCESS; 1299143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande} 1300143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 130168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangstatic jobject android_net_wifi_enableResponder( 130268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang JNIEnv *env, jclass cls, jint iface, jint id, jint timeout_seconds, jobject channel_hint) { 130368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang JNIHelper helper(env); 130468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 130568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang if (DBG) ALOGD("enabling responder request [%d] = %p", id, handle); 130668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang wifi_channel_info channel; 130768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Get channel information from HAL if it's not provided by caller. 130868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang if (channel_hint == NULL) { 1309895cdc96a57c78108695fe32614f2bf7afa871c7Wei Wang wifi_rtt_responder responder_info_hint; 1310895cdc96a57c78108695fe32614f2bf7afa871c7Wei Wang bool status = hal_fn.wifi_rtt_get_responder_info(handle, &responder_info_hint); 131168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang if (status != WIFI_SUCCESS) { 131268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang ALOGE("could not get available channel for responder"); 131368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang return NULL; 131468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 1315895cdc96a57c78108695fe32614f2bf7afa871c7Wei Wang channel = responder_info_hint.channel; 131668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } else { 131768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.center_freq = helper.getIntField(channel_hint, "mPrimaryFrequency"); 131868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.center_freq0 = helper.getIntField(channel_hint, "mCenterFrequency0"); 131968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.center_freq1 = helper.getIntField(channel_hint, "mCenterFrequency1"); 132068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.width = (wifi_channel_width)helper.getIntField(channel_hint, "mChannelWidth"); 132168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 132268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 132368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang if (DBG) { 132468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang ALOGD("wifi_channel_width: %d, center_freq: %d, center_freq0: %d", 132568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.width, channel.center_freq, channel.center_freq0); 132668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 1327895cdc96a57c78108695fe32614f2bf7afa871c7Wei Wang 1328895cdc96a57c78108695fe32614f2bf7afa871c7Wei Wang wifi_rtt_responder responder_info_used; 132968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang bool status = hal_fn.wifi_enable_responder(id, handle, channel, timeout_seconds, 1330895cdc96a57c78108695fe32614f2bf7afa871c7Wei Wang &responder_info_used); 133168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang if (status != WIFI_SUCCESS) { 133268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang ALOGE("enabling responder mode failed"); 133368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang return NULL; 133468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 1335895cdc96a57c78108695fe32614f2bf7afa871c7Wei Wang wifi_channel_info channel_used = responder_info_used.channel; 133668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang if (DBG) { 133768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang ALOGD("wifi_channel_width: %d, center_freq: %d, center_freq0: %d", 133868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel_used.width, channel_used.center_freq, channel_used.center_freq0); 133968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 134068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang JNIObject<jobject> responderConfig = 134168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang helper.createObject("android/net/wifi/RttManager$ResponderConfig"); 134268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang if (responderConfig == NULL) return NULL; 134368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang helper.setIntField(responderConfig, "frequency", channel_used.center_freq); 134468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang helper.setIntField(responderConfig, "centerFreq0", channel_used.center_freq0); 134568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang helper.setIntField(responderConfig, "centerFreq1", channel_used.center_freq1); 134668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang helper.setIntField(responderConfig, "channelWidth", channel_used.width); 1347895cdc96a57c78108695fe32614f2bf7afa871c7Wei Wang helper.setIntField(responderConfig, "preamble", responder_info_used.preamble); 134868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang return responderConfig.detach(); 134968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang} 135068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 135168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangstatic jboolean android_net_wifi_disableResponder( 135268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang JNIEnv *env, jclass cls, jint iface, jint id) { 135368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang JNIHelper helper(env); 135468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 135568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang if (DBG) ALOGD("disabling responder request [%d] = %p", id, handle); 135668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang return hal_fn.wifi_disable_responder(id, handle) == WIFI_SUCCESS; 135768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang} 135868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 135968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 1360042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpandestatic jboolean android_net_wifi_setScanningMacOui(JNIEnv *env, jclass cls, 1361042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande jint iface, jbyteArray param) { 1362042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 13637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 13647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1365042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGD("setting scan oui %p", handle); 1366042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1367042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande static const unsigned oui_len = 3; /* OUI is upper 3 bytes of mac_address */ 13687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande int len = helper.getArrayLength(param); 1369042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande if (len != oui_len) { 1370042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande ALOGE("invalid oui length %d", len); 1371042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande return false; 1372042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande } 1373042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 137421e2d99bcd577eccd2cf3c0f99688814c213330fAndrew Hsieh ScopedBytesRW paramBytes(env, param); 137521e2d99bcd577eccd2cf3c0f99688814c213330fAndrew Hsieh jbyte* bytes = paramBytes.get(); 1376042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande if (bytes == NULL) { 1377259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("failed to get setScanningMacOui param array"); 1378042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande return false; 1379042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande } 1380042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1381bb377e447c30f5cccd606a8d05a4159ca86d0a45Vinit Deshpande return hal_fn.wifi_set_scanning_mac_oui(handle, (byte *)bytes) == WIFI_SUCCESS; 1382042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande} 1383042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 1384ee0a0132ebb0d7e9baf42e778ea9c094966ffb14xinhestatic jboolean android_net_wifi_is_get_channels_for_band_supported(JNIEnv *env, jclass cls){ 1385ee0a0132ebb0d7e9baf42e778ea9c094966ffb14xinhe return (hal_fn.wifi_get_valid_channels == wifi_get_valid_channels_stub); 1386ee0a0132ebb0d7e9baf42e778ea9c094966ffb14xinhe} 1387ee0a0132ebb0d7e9baf42e778ea9c094966ffb14xinhe 1388efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpandestatic jintArray android_net_wifi_getValidChannels(JNIEnv *env, jclass cls, 1389efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande jint iface, jint band) { 1390efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 13917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 13927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 13933161c10e00c2c8198809fc514cada0a43c5e66f1mukesh agrawal ALOGV("getting valid channels %p", handle); 1394efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1395efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande static const int MaxChannels = 64; 1396efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande wifi_channel channels[64]; 1397efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande int num_channels = 0; 1398ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error result = hal_fn.wifi_get_valid_channels(handle, band, MaxChannels, 1399efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande channels, &num_channels); 1400efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 1401efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande if (result == WIFI_SUCCESS) { 14027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jintArray> channelArray = helper.newIntArray(num_channels); 1403efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande if (channelArray == NULL) { 1404259210ed359a2bd34ef1d1c41b01d57c6b377e64Mitchell Wills ALOGE("failed to allocate channel list, num_channels=%d", num_channels); 1405efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return NULL; 1406efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } 1407efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 14087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntArrayRegion(channelArray, 0, num_channels, channels); 14097d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return channelArray.detach(); 1410efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } else { 1411efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande ALOGE("failed to get channel list : %d", result); 1412efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande return NULL; 1413efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande } 1414efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande} 1415efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande 141690b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpandestatic jboolean android_net_wifi_setDfsFlag(JNIEnv *env, jclass cls, jint iface, jboolean dfs) { 14177d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 14187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 14197d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 142090b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande ALOGD("setting dfs flag to %s, %p", dfs ? "true" : "false", handle); 142190b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande 142290b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande u32 nodfs = dfs ? 0 : 1; 1423ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error result = hal_fn.wifi_set_nodfs_flag(handle, nodfs); 142490b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande return result == WIFI_SUCCESS; 142590b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande} 142690b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande 142712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhestatic jobject android_net_wifi_get_rtt_capabilities(JNIEnv *env, jclass cls, jint iface) { 14287d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 14297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 143012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe wifi_rtt_capabilities rtt_capabilities; 14317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1432ec61e7731968be994a23f2bd138f6761c8aea498xinhe wifi_error ret = hal_fn.wifi_get_rtt_capabilities(handle, &rtt_capabilities); 143312cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 143412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe if(WIFI_SUCCESS == ret) { 14357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> capabilities = helper.createObject( 14367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "android/net/wifi/RttManager$RttCapabilities"); 14377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setBooleanField(capabilities, "oneSidedRttSupported", 143812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.rtt_one_sided_supported == 1); 14397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setBooleanField(capabilities, "twoSided11McRttSupported", 144012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.rtt_ftm_supported == 1); 14417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setBooleanField(capabilities, "lciSupported", 144212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.lci_support); 14437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setBooleanField(capabilities, "lcrSupported", 144412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.lcr_support); 14457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(capabilities, "preambleSupported", 144612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.preamble_support); 14477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(capabilities, "bwSupported", 144812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe rtt_capabilities.bw_support); 144953e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang helper.setBooleanField(capabilities, "responderSupported", 145053e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang rtt_capabilities.responder_supported == 1); 145153e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang if (DBG) { 145253e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang ALOGD("One side RTT is %s", rtt_capabilities.rtt_one_sided_supported == 1 ? 145353e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang "supported" : "not supported"); 145453e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang ALOGD("Two side RTT is %s", rtt_capabilities.rtt_ftm_supported == 1 ? 145553e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang "supported" : "not supported"); 145653e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang ALOGD("LCR is %s", rtt_capabilities.lcr_support == 1 ? "supported" : "not supported"); 145753e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang ALOGD("LCI is %s", rtt_capabilities.lci_support == 1 ? "supported" : "not supported"); 145853e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang ALOGD("Supported preamble is %d", rtt_capabilities.preamble_support); 145953e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang ALOGD("Supported bandwidth is %d", rtt_capabilities.bw_support); 146053e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang ALOGD("Sta responder is %s", 146153e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang rtt_capabilities.responder_supported == 1 ? "supported" : "not supported"); 146253e88b21052b5d953e157109b67dff6ea55fb9b5Wei Wang } 14637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return capabilities.detach(); 146412cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe } else { 146512cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe return NULL; 146612cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe } 146712cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe} 146812cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe 1469e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensenstatic jobject android_net_wifi_get_apf_capabilities(JNIEnv *env, jclass cls, 14706609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen jint iface) { 14716609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen 14726609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen JNIHelper helper(env); 14736609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen u32 version = 0, max_len = 0; 14746609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 14756609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen wifi_error ret = hal_fn.wifi_get_packet_filter_capabilities(handle, &version, &max_len); 14766609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen 14776609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen if (WIFI_SUCCESS == ret) { 1478e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen // Cannot just use createObject() because members are final and initializer values must be 1479e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen // passed via ApfCapabilities(). 1480e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen JNIObject<jclass> apf_cls(helper, env->FindClass("android/net/apf/ApfCapabilities")); 1481e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen if (apf_cls == NULL) { 1482e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen ALOGE("Error in finding class android/net/apf/ApfCapabilities"); 1483e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen return NULL; 1484e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen } 1485e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen jmethodID constructor = env->GetMethodID(apf_cls, "<init>", "(III)V"); 1486e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen if (constructor == 0) { 1487e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen ALOGE("Error in constructor ID for android/net/apf/ApfCapabilities"); 1488e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen return NULL; 1489e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen } 1490e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen JNIObject<jobject> capabilities(helper, env->NewObject(apf_cls, constructor, version, 1491e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen max_len, ARPHRD_ETHER)); 1492e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen if (capabilities == NULL) { 1493e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen ALOGE("Could not create new object of android/net/apf/ApfCapabilities"); 1494e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen return NULL; 1495e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen } 14966609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen ALOGD("APF version supported: %d", version); 14976609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen ALOGD("Maximum APF program size: %d", max_len); 14986609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen return capabilities.detach(); 14996609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen } else { 15006609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen return NULL; 15016609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen } 15026609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen} 15036609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen 15046609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensenstatic jboolean android_net_wifi_install_packet_filter(JNIEnv *env, jclass cls, jint iface, 15056609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen jbyteArray jfilter) { 15066609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen 15076609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen JNIHelper helper(env); 15086609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen const u8* filter = (uint8_t*)env->GetByteArrayElements(jfilter, NULL); 15096609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen const u32 filter_len = env->GetArrayLength(jfilter); 15106609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 15116609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen wifi_error ret = hal_fn.wifi_set_packet_filter(handle, filter, filter_len); 15126609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen env->ReleaseByteArrayElements(jfilter, (jbyte*)filter, JNI_ABORT); 15136609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen return WIFI_SUCCESS == ret; 15146609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen} 15156609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen 1516939177ff615062ec826601d536466875d8457375xinhestatic jboolean android_net_wifi_set_Country_Code_Hal(JNIEnv *env,jclass cls, jint iface, 1517939177ff615062ec826601d536466875d8457375xinhe jstring country_code) { 1518939177ff615062ec826601d536466875d8457375xinhe 15197d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 15207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 15217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 15227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ScopedUtfChars chars(env, country_code); 15237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande const char *country = chars.c_str(); 1524939177ff615062ec826601d536466875d8457375xinhe 1525939177ff615062ec826601d536466875d8457375xinhe ALOGD("set country code: %s", country); 152644787b543b9365fe0d40ec70fc8fe51e54264ff6xinhe wifi_error res = hal_fn.wifi_set_country_code(handle, country); 1527939177ff615062ec826601d536466875d8457375xinhe return res == WIFI_SUCCESS; 1528939177ff615062ec826601d536466875d8457375xinhe} 1529d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1530d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhestatic jboolean android_net_wifi_enable_disable_tdls(JNIEnv *env,jclass cls, jint iface, 1531d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe jboolean enable, jstring addr) { 15327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 15337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 15347d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1535d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1536d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe mac_addr address; 1537d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe parseMacAddress(env, addr, address); 1538d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe wifi_tdls_handler tdls_handler; 1539d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe //tdls_handler.on_tdls_state_changed = &on_tdls_state_changed; 1540d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1541d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe if(enable) { 1542d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe return (hal_fn.wifi_enable_tdls(handle, address, NULL, tdls_handler) == WIFI_SUCCESS); 1543d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe } else { 1544d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe return (hal_fn.wifi_disable_tdls(handle, address) == WIFI_SUCCESS); 1545d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe } 1546d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe} 1547d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1548d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhestatic void on_tdls_state_changed(mac_addr addr, wifi_tdls_status status) { 1549d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 15507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 15517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 15527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("on_tdls_state_changed is called: vm = %p, obj = %p", mVM, mCls); 1553d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1554d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe char mac[32]; 1555d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], addr[2], addr[3], addr[4], 1556d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe addr[5]); 1557d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 15587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jstring> mac_address = helper.newStringUTF(mac); 15597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.reportEvent(mCls, "onTdlsStatus", "(Ljava/lang/StringII;)V", 15607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mac_address.get(), status.state, status.reason); 1561d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1562d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe} 1563d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1564d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhestatic jobject android_net_wifi_get_tdls_status(JNIEnv *env,jclass cls, jint iface,jstring addr) { 15657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 15667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 15677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1568d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1569d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe mac_addr address; 1570d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe parseMacAddress(env, addr, address); 1571d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1572d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe wifi_tdls_status status; 1573d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1574d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe wifi_error ret; 1575d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe ret = hal_fn.wifi_get_tdls_status(handle, address, &status ); 1576d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1577d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe if (ret != WIFI_SUCCESS) { 1578d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe return NULL; 1579d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe } else { 15807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> tdls_status = helper.createObject( 15817d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "com/android/server/wifi/WifiNative$TdlsStatus"); 15827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(tdls_status, "channel", status.channel); 15837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(tdls_status, "global_operating_class", status.global_operating_class); 15847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(tdls_status, "state", status.state); 15857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(tdls_status, "reason", status.reason); 15867d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return tdls_status.detach(); 1587d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe } 1588d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe} 1589d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1590d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhestatic jobject android_net_wifi_get_tdls_capabilities(JNIEnv *env, jclass cls, jint iface) { 15917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 15927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 1593d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe wifi_tdls_capabilities tdls_capabilities; 15947d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1595d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe wifi_error ret = hal_fn.wifi_get_tdls_capabilities(handle, &tdls_capabilities); 1596d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 15977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande if (WIFI_SUCCESS == ret) { 15987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> capabilities = helper.createObject( 1599d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe "com/android/server/wifi/WifiNative$TdlsCapabilities"); 16007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(capabilities, "maxConcurrentTdlsSessionNumber", 1601d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe tdls_capabilities.max_concurrent_tdls_session_num); 16027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setBooleanField(capabilities, "isGlobalTdlsSupported", 1603d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe tdls_capabilities.is_global_tdls_supported == 1); 16047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setBooleanField(capabilities, "isPerMacTdlsSupported", 1605d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe tdls_capabilities.is_per_mac_tdls_supported == 1); 16067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setBooleanField(capabilities, "isOffChannelTdlsSupported", 1607d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe tdls_capabilities.is_off_channel_tdls_supported); 1608d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1609d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe ALOGD("TDLS Max Concurrent Tdls Session Number is: %d", 1610d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe tdls_capabilities.max_concurrent_tdls_session_num); 1611d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe ALOGD("Global Tdls is: %s", tdls_capabilities.is_global_tdls_supported == 1 ? "support" : 1612d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe "not support"); 1613d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe ALOGD("Per Mac Tdls is: %s", tdls_capabilities.is_per_mac_tdls_supported == 1 ? "support" : 1614d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe "not support"); 1615d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe ALOGD("Off Channel Tdls is: %s", tdls_capabilities.is_off_channel_tdls_supported == 1 ? 1616d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe "support" : "not support"); 1617d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 16187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return capabilities.detach(); 1619d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe } else { 1620d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe return NULL; 1621d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe } 1622d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe} 1623d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1624155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// ---------------------------------------------------------------------------- 1625a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle// Debug framework 1626a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle// ---------------------------------------------------------------------------- 162703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhestatic jint android_net_wifi_get_supported_logger_feature(JNIEnv *env, jclass cls, jint iface){ 162803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe //Not implemented yet 162903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return -1; 163003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe} 1631a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 163203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhestatic jobject android_net_wifi_get_driver_version(JNIEnv *env, jclass cls, jint iface) { 163303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe //Need to be fixed. The memory should be allocated from lower layer 163403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe //char *buffer = NULL; 16357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 163603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe int buffer_length = 256; 16376d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe char *buffer = (char *)malloc(buffer_length); 16386d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe if (!buffer) return NULL; 16396d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe memset(buffer, 0, buffer_length); 16407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 164103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 164203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe ALOGD("android_net_wifi_get_driver_version = %p", handle); 1643a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1644a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle if (handle == 0) { 1645e36fc349c67c02819804ecad6a7c6502718aaffbShun Iio free(buffer); 164603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return NULL; 164703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 164803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 16496d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe wifi_error result = hal_fn.wifi_get_driver_version(handle, buffer, buffer_length); 165003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 165103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (result == WIFI_SUCCESS) { 165203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe ALOGD("buffer is %p, length is %d", buffer, buffer_length); 16537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jstring> driver_version = helper.newStringUTF(buffer); 165403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe free(buffer); 16557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return driver_version.detach(); 165603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } else { 1657386acac84b22423d36796838adca2060fea81149Mitchell Wills ALOGE("Fail to get driver version"); 16587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande free(buffer); 165903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return NULL; 166003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 166103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe} 166203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 166303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhestatic jobject android_net_wifi_get_firmware_version(JNIEnv *env, jclass cls, jint iface) { 166403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 166503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe //char *buffer = NULL; 16667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 166703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe int buffer_length = 256; 166803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe char *buffer = (char *)malloc(buffer_length); 16696d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe if (!buffer) return NULL; 16706d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe memset(buffer, 0, buffer_length); 16717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 167203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 167303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe ALOGD("android_net_wifi_get_firmware_version = %p", handle); 167403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 167503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (handle == 0) { 1676e36fc349c67c02819804ecad6a7c6502718aaffbShun Iio free(buffer); 167703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return NULL; 167803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 167903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 16806d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe wifi_error result = hal_fn.wifi_get_firmware_version(handle, buffer, buffer_length); 168103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 168203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (result == WIFI_SUCCESS) { 168303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe ALOGD("buffer is %p, length is %d", buffer, buffer_length); 16847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jstring> firmware_version = helper.newStringUTF(buffer); 168503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe free(buffer); 16867d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return firmware_version.detach(); 168703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } else { 1688386acac84b22423d36796838adca2060fea81149Mitchell Wills ALOGE("Fail to get Firmware version"); 16897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande free(buffer); 169003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return NULL; 169103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 169203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe} 169303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 169403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhestatic jobject android_net_wifi_get_ring_buffer_status (JNIEnv *env, jclass cls, jint iface) { 169503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 16967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 16977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 169803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 16997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("android_net_wifi_get_ring_buffer_status = %p", handle); 170003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 170103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (handle == 0) { 170203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return NULL; 170303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 170403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 170503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe //wifi_ring_buffer_status *status = NULL; 170603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe u32 num_rings = 10; 170703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe wifi_ring_buffer_status *status = 170803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe (wifi_ring_buffer_status *)malloc(sizeof(wifi_ring_buffer_status) * num_rings); 17096d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe if (!status) return NULL; 17106d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe memset(status, 0, sizeof(wifi_ring_buffer_status) * num_rings); 17116d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe wifi_error result = hal_fn.wifi_get_ring_buffers_status(handle, &num_rings, status); 171203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (result == WIFI_SUCCESS) { 171303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe ALOGD("status is %p, number is %d", status, num_rings); 17147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 17157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> ringBuffersStatus = helper.newObjectArray( 17167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande num_rings, "com/android/server/wifi/WifiNative$RingBufferStatus", NULL); 17177d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 171803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe wifi_ring_buffer_status *tmp = status; 171903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 172003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe for(u32 i = 0; i < num_rings; i++, tmp++) { 17217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 17227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> ringStatus = helper.createObject( 17230bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande "com/android/server/wifi/WifiNative$RingBufferStatus"); 17247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 172503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (ringStatus == NULL) { 172603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe ALOGE("Error in creating ringBufferStatus"); 172703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe free(status); 172803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return NULL; 172903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 17307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 173103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe char name[32]; 173203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe for(int j = 0; j < 32; j++) { 173303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe name[j] = tmp->name[j]; 173403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 17357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 17367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setStringField(ringStatus, "name", name); 17377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "flag", tmp->flags); 17387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "ringBufferId", tmp->ring_id); 17397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "ringBufferByteSize", tmp->ring_buffer_byte_size); 17407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "verboseLevel", tmp->verbose_level); 17417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "writtenBytes", tmp->written_bytes); 17427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "readBytes", tmp->read_bytes); 17437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "writtenRecords", tmp->written_records); 17447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 17457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setObjectArrayElement(ringBuffersStatus, i, ringStatus); 174603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 17477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 174803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe free(status); 17497d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return ringBuffersStatus.detach(); 175003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } else { 17516d0cd10057e479dfcb8c9e290b9d1d433644dc06xinhe free(status); 175203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return NULL; 175303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 175403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe} 175503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 175603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhestatic void on_ring_buffer_data(char *ring_name, char *buffer, int buffer_size, 175703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe wifi_ring_buffer_status *status) { 17580bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande 17596111ff7dddefcdba9453a5a9c0e19ef1dfd75253Jerry Lee if (!ring_name || !buffer || !status || 17606111ff7dddefcdba9453a5a9c0e19ef1dfd75253Jerry Lee (unsigned int)buffer_size <= sizeof(wifi_ring_buffer_entry)) { 176103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe ALOGE("Error input for on_ring_buffer_data!"); 17620bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande return; 176303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 17640bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande 17657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 17667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 17676414301b7b685307e8ae8cea6976ed05cc49b254Vinit Deshpande /* ALOGD("on_ring_buffer_data called, vm = %p, obj = %p, env = %p buffer size = %d", mVM, 17686414301b7b685307e8ae8cea6976ed05cc49b254Vinit Deshpande mCls, env, buffer_size); */ 176903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 17707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> ringStatus = helper.createObject( 17710bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande "com/android/server/wifi/WifiNative$RingBufferStatus"); 177203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (status == NULL) { 177303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe ALOGE("Error in creating ringBufferStatus"); 177403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return; 1775a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle } 177603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 17777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setStringField(ringStatus, "name", ring_name); 17787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "flag", status->flags); 17797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "ringBufferId", status->ring_id); 17807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "ringBufferByteSize", status->ring_buffer_byte_size); 17817d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "verboseLevel", status->verbose_level); 17827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "writtenBytes", status->written_bytes); 17837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "readBytes", status->read_bytes); 17847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setIntField(ringStatus, "writtenRecords", status->written_records); 17850bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande 17867d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jbyteArray> bytes = helper.newByteArray(buffer_size); 17877d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setByteArrayRegion(bytes, 0, buffer_size, (jbyte*)buffer); 178803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 17897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.reportEvent(mCls,"onRingBufferData", 17907d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande "(Lcom/android/server/wifi/WifiNative$RingBufferStatus;[B)V", 17917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ringStatus.get(), bytes.get()); 179203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe} 179303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 179403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhestatic void on_alert_data(wifi_request_id id, char *buffer, int buffer_size, int err_code){ 17957d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 17967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 17977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("on_alert_data called, vm = %p, obj = %p, buffer_size = %d, error code = %d" 17987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande , mVM, mCls, buffer_size, err_code); 179903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 180003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (buffer_size > 0) { 18017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jbyteArray> records = helper.newByteArray(buffer_size); 180203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe jbyte *bytes = (jbyte *) buffer; 18037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setByteArrayRegion(records, 0,buffer_size, bytes); 18047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.reportEvent(mCls,"onWifiAlert","([BI)V", records.get(), err_code); 180503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } else { 18067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.reportEvent(mCls,"onWifiAlert","([BI)V", NULL, err_code); 180703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 180803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe} 180903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 1810b0b0cc202b7d7aaad7b3f69d73e9b58ea2968b05Pierre Vandwalle 181103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhestatic jboolean android_net_wifi_start_logging_ring_buffer(JNIEnv *env, jclass cls, jint iface, 181203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe jint verbose_level,jint flags, jint max_interval,jint min_data_size, jstring ring_name) { 1813a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 18147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 18157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 181603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 181703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe ALOGD("android_net_wifi_start_logging_ring_buffer = %p", handle); 1818a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1819a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle if (handle == 0) { 182003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return false; 1821a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle } 182203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 18237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ScopedUtfChars chars(env, ring_name); 18247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande const char* ring_name_const_char = chars.c_str(); 18257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande int ret = hal_fn.wifi_start_logging(handle, verbose_level, 18267d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande flags, max_interval, min_data_size, const_cast<char *>(ring_name_const_char)); 1827a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 182803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (ret != WIFI_SUCCESS) { 18297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGE("Fail to start logging for ring %s", ring_name_const_char); 183003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } else { 18317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("start logging for ring %s", ring_name_const_char); 183203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 18337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 183403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return ret == WIFI_SUCCESS; 183503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe} 183603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 183703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhestatic jboolean android_net_wifi_get_ring_buffer_data(JNIEnv *env, jclass cls, jint iface, 183803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe jstring ring_name) { 183903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 18407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 18417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 18427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande // ALOGD("android_net_wifi_get_ring_buffer_data = %p", handle); 184303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 18447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ScopedUtfChars chars(env, ring_name); 18457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande const char* ring_name_const_char = chars.c_str(); 18467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande int result = hal_fn.wifi_get_ring_data(handle, const_cast<char *>(ring_name_const_char)); 184703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return result == WIFI_SUCCESS; 184803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe} 184903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 185003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 1851d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawalstatic void on_firmware_memory_dump(char *buffer, int buffer_size) { 18527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 18537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 18546414301b7b685307e8ae8cea6976ed05cc49b254Vinit Deshpande /* ALOGD("on_firmware_memory_dump called, vm = %p, obj = %p, env = %p buffer_size = %d" 18556414301b7b685307e8ae8cea6976ed05cc49b254Vinit Deshpande , mVM, mCls, env, buffer_size); */ 185603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 185703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (buffer_size > 0) { 18587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jbyteArray> dump = helper.newByteArray(buffer_size); 185903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe jbyte *bytes = (jbyte *) (buffer); 18607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.setByteArrayRegion(dump, 0, buffer_size, bytes); 18617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande helper.reportEvent(mCls,"onWifiFwMemoryAvailable","([B)V", dump.get()); 186203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 186303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe} 186403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 186503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhestatic jboolean android_net_wifi_get_fw_memory_dump(JNIEnv *env, jclass cls, jint iface){ 18667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 18677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 18687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 18696414301b7b685307e8ae8cea6976ed05cc49b254Vinit Deshpande // ALOGD("android_net_wifi_get_fw_memory_dump = %p", handle); 187003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 187103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe if (handle == NULL) { 187203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe ALOGE("Can not get wifi_interface_handle"); 187303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return false; 187403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 187503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 187603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe wifi_firmware_memory_dump_handler fw_dump_handle; 187703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe fw_dump_handle.on_firmware_memory_dump = on_firmware_memory_dump; 187803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe int result = hal_fn.wifi_get_firmware_memory_dump(handle, fw_dump_handle); 187903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe return result == WIFI_SUCCESS; 1880a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1881a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle} 1882a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1883d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawalstd::vector<jbyte>* driver_state_dump_buffer_for_callback = nullptr; 1884d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1885d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawalstatic void on_driver_state_dump(char *buffer, int buffer_size); 1886d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawalstatic wifi_driver_memory_dump_callbacks driver_state_dump_callbacks = { 1887d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal on_driver_state_dump 1888d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal}; 1889d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1890d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawalstatic void on_driver_state_dump(char *buffer, int buffer_size) { 1891d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1892d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal if (!driver_state_dump_buffer_for_callback) { 1893d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal ALOGE("Unexpected call from HAL implementation, into %s", __func__); 1894d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal return; 1895d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 1896d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1897d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal if (buffer_size > 0) { 1898d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal driver_state_dump_buffer_for_callback->insert( 1899d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal driver_state_dump_buffer_for_callback->end(), buffer, buffer + buffer_size); 1900d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 1901d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal} 1902d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1903d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal// TODO(quiche): Add unit tests. b/28072392 1904d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawalstatic jbyteArray android_net_wifi_get_driver_state_dump(JNIEnv *env, jclass cls, jint iface){ 1905d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1906d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal JNIHelper helper(env); 1907d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal wifi_interface_handle interface_handle = getIfaceHandle(helper, cls, iface); 1908d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1909d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal if (!interface_handle) { 1910d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal return nullptr; 1911d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 1912d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1913d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal int result; 1914d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal std::vector<jbyte> state_dump_buffer_local; 1915d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal driver_state_dump_buffer_for_callback = &state_dump_buffer_local; 1916d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal result = hal_fn.wifi_get_driver_memory_dump(interface_handle, driver_state_dump_callbacks); 1917d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal driver_state_dump_buffer_for_callback = nullptr; 1918d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1919d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal if (result != WIFI_SUCCESS) { 1920d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal ALOGW("HAL's wifi_get_driver_memory_dump returned %d", result); 1921d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal return nullptr; 1922d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 1923d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1924d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal if (state_dump_buffer_local.empty()) { 1925d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal ALOGW("HAL's wifi_get_driver_memory_dump provided zero bytes"); 1926d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal return nullptr; 1927d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 1928d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1929d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal const size_t dump_size = state_dump_buffer_local.size(); 1930d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal JNIObject<jbyteArray> driver_dump_java = helper.newByteArray(dump_size); 1931d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal if (!driver_dump_java) { 1932d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal ALOGW("Failed to allocate Java buffer for driver state dump"); 1933d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal return nullptr; 1934d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 1935d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1936d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal helper.setByteArrayRegion(driver_dump_java, 0, dump_size, state_dump_buffer_local.data()); 1937d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal return driver_dump_java.detach(); 1938d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal} 1939d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1940b797893fc1966803d0c013faac42e6396a37a384xinhestatic jboolean android_net_wifi_set_log_handler(JNIEnv *env, jclass cls, jint iface, jint id) { 19417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 19427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 19437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1944b797893fc1966803d0c013faac42e6396a37a384xinhe ALOGD("android_net_wifi_set_log_handler = %p", handle); 1945b797893fc1966803d0c013faac42e6396a37a384xinhe 1946b797893fc1966803d0c013faac42e6396a37a384xinhe //initialize the handler on first time 1947b797893fc1966803d0c013faac42e6396a37a384xinhe wifi_ring_buffer_data_handler handler; 1948b797893fc1966803d0c013faac42e6396a37a384xinhe handler.on_ring_buffer_data = &on_ring_buffer_data; 1949b797893fc1966803d0c013faac42e6396a37a384xinhe int result = hal_fn.wifi_set_log_handler(id, handle, handler); 1950b797893fc1966803d0c013faac42e6396a37a384xinhe if (result != WIFI_SUCCESS) { 1951b797893fc1966803d0c013faac42e6396a37a384xinhe ALOGE("Fail to set logging handler"); 1952b797893fc1966803d0c013faac42e6396a37a384xinhe return false; 1953b797893fc1966803d0c013faac42e6396a37a384xinhe } 1954b797893fc1966803d0c013faac42e6396a37a384xinhe 1955b797893fc1966803d0c013faac42e6396a37a384xinhe //set alter handler This will start alert too 1956b797893fc1966803d0c013faac42e6396a37a384xinhe wifi_alert_handler alert_handler; 1957b797893fc1966803d0c013faac42e6396a37a384xinhe alert_handler.on_alert = &on_alert_data; 1958b797893fc1966803d0c013faac42e6396a37a384xinhe result = hal_fn.wifi_set_alert_handler(id, handle, alert_handler); 1959b797893fc1966803d0c013faac42e6396a37a384xinhe if (result != WIFI_SUCCESS) { 1960b797893fc1966803d0c013faac42e6396a37a384xinhe ALOGE(" Fail to set alert handler"); 1961b797893fc1966803d0c013faac42e6396a37a384xinhe return false; 1962b797893fc1966803d0c013faac42e6396a37a384xinhe } 1963b797893fc1966803d0c013faac42e6396a37a384xinhe 1964b797893fc1966803d0c013faac42e6396a37a384xinhe return true; 1965b797893fc1966803d0c013faac42e6396a37a384xinhe} 1966b797893fc1966803d0c013faac42e6396a37a384xinhe 1967b797893fc1966803d0c013faac42e6396a37a384xinhestatic jboolean android_net_wifi_reset_log_handler(JNIEnv *env, jclass cls, jint iface, jint id) { 19687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 19697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 19707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 1971370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee 1972370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee //reset alter handler 1973370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee ALOGD("android_net_wifi_reset_alert_handler = %p", handle); 1974370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee int result = hal_fn.wifi_reset_alert_handler(id, handle); 1975370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee if (result != WIFI_SUCCESS) { 1976370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee ALOGE(" Fail to reset alert handler"); 1977370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee return false; 1978370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee } 1979370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee 1980370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee //reset log handler 1981b797893fc1966803d0c013faac42e6396a37a384xinhe ALOGD("android_net_wifi_reset_log_handler = %p", handle); 1982370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee result = hal_fn.wifi_reset_log_handler(id, handle); 1983370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee if (result != WIFI_SUCCESS) { 1984370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee ALOGE("Fail to reset logging handler"); 1985370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee return false; 1986370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee } 1987370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee 1988370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee return true; 1989b797893fc1966803d0c013faac42e6396a37a384xinhe} 1990370ad50a5f1dd907de8f4d201f73eb7139f79dd4Jerry Lee 1991aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawalstatic jint android_net_wifi_start_pkt_fate_monitoring(JNIEnv *env, jclass cls, jint iface) { 1992aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 1993aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal JNIHelper helper(env); 1994aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal return hal_fn.wifi_start_pkt_fate_monitoring( 1995aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal getIfaceHandle(helper, cls, iface)); 1996aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal} 1997aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 1998aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// Helper for make_default_fate(). 1999aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawaltemplate<typename T> void set_to_max(T* value) { 2000aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal if (!value) { 2001aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal return; 2002aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal } 2003aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal *value = std::numeric_limits<T>::max(); 2004aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal} 2005aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2006aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// make_default_fate() has two purposes: 2007aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// 1) Minimize the chances of data leakage. In case the HAL gives us an overlong long |frame_len|, 2008aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// for example, we want to return zeros, rather than other data from this process. 2009aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// 2) Make it obvious when the HAL doesn't set a field. We accomplish this by setting fields 2010aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// to "impossible" values, where possible. 2011aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// Normally, such work would be done in a ctor. However, doing so would make the HAL API 2012aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// incompatible with C. So we use a free-standing function instead. 2013aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// 2014aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// TODO(quiche): Add unit test for this function. b/27726696 2015aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawaltemplate<typename FateReportT> FateReportT make_default_fate() { 2016aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2017aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal FateReportT fate_report; 2018aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal set_to_max(&fate_report.fate); 2019aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal std::fill(std::begin(fate_report.md5_prefix), std::end(fate_report.md5_prefix), 0); 2020aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal set_to_max(&fate_report.frame_inf.payload_type); 2021aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal fate_report.frame_inf.frame_len = 0; 2022aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal fate_report.frame_inf.driver_timestamp_usec = 0; 2023aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal fate_report.frame_inf.firmware_timestamp_usec = 0; 2024aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal std::fill(std::begin(fate_report.frame_inf.frame_content.ieee_80211_mgmt_bytes), 2025aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal std::end(fate_report.frame_inf.frame_content.ieee_80211_mgmt_bytes), 0); 2026aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal return fate_report; 2027aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal} 2028aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2029aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal// TODO(quiche): Add unit test for this function. b/27726696 2030aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawaltemplate<typename FateReportT, typename HalFateFetcherT> wifi_error get_pkt_fates( 2031aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal HalFateFetcherT fate_fetcher_func, const char *java_fate_type, 2032aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal JNIEnv *env, jclass cls, jint iface, jobjectArray reports) { 2033aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2034aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal JNIHelper helper(env); 2035aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal const size_t n_reports_wanted = 2036aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal std::min(helper.getArrayLength(reports), MAX_FATE_LOG_LEN); 2037aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2038aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal std::vector<FateReportT> report_bufs(n_reports_wanted, make_default_fate<FateReportT>()); 2039aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal size_t n_reports_provided = 0; 2040aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal wifi_error result = fate_fetcher_func( 2041aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal getIfaceHandle(helper, cls, iface), 2042aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal report_bufs.data(), 2043aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal n_reports_wanted, 2044aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal &n_reports_provided); 2045aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal if (result != WIFI_SUCCESS) { 2046aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal return result; 2047aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal } 2048aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2049aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal if (n_reports_provided > n_reports_wanted) { 2050aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal LOG_ALWAYS_FATAL( 2051aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal "HAL data exceeds request; memory may be corrupt (provided: %zu, requested: %zu)", 2052aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal n_reports_provided, n_reports_wanted); 2053aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal } 2054aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2055aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal for (size_t i = 0; i < n_reports_provided; ++i) { 2056aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal const FateReportT& report(report_bufs[i]); 2057aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2058aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal const char *frame_bytes_native = nullptr; 2059aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal size_t max_frame_len; 2060aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal switch (report.frame_inf.payload_type) { 2061aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal case FRAME_TYPE_UNKNOWN: 2062aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal case FRAME_TYPE_ETHERNET_II: 2063aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal max_frame_len = MAX_FRAME_LEN_ETHERNET; 2064aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal frame_bytes_native = report.frame_inf.frame_content.ethernet_ii_bytes; 2065aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal break; 2066aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal case FRAME_TYPE_80211_MGMT: 2067aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal max_frame_len = MAX_FRAME_LEN_80211_MGMT; 2068aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal frame_bytes_native = report.frame_inf.frame_content.ieee_80211_mgmt_bytes; 2069aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal break; 2070aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal default: 2071aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal max_frame_len = 0; 2072aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal frame_bytes_native = 0; 2073aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal } 2074aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2075aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal size_t copy_len = report.frame_inf.frame_len; 2076aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal if (copy_len > max_frame_len) { 2077aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal ALOGW("Overly long frame (len: %zu, max: %zu)", copy_len, max_frame_len); 2078aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal copy_len = max_frame_len; 2079aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal } 2080aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2081aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal JNIObject<jbyteArray> frame_bytes_java = helper.newByteArray(copy_len); 2082aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal if (frame_bytes_java.isNull()) { 2083aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal ALOGE("Failed to allocate frame data buffer"); 2084aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal return WIFI_ERROR_OUT_OF_MEMORY; 2085aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal } 2086aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal helper.setByteArrayRegion(frame_bytes_java, 0, copy_len, 2087aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal reinterpret_cast<const jbyte *>(frame_bytes_native)); 2088aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2089aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal JNIObject<jobject> fate_report = helper.createObjectWithArgs( 2090aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal java_fate_type, 2091aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal "(BJB[B)V", // byte, long, byte, byte array 2092aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal static_cast<jbyte>(report.fate), 2093aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal static_cast<jlong>(report.frame_inf.driver_timestamp_usec), 2094aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal static_cast<jbyte>(report.frame_inf.payload_type), 2095aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal frame_bytes_java.get()); 2096aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal if (fate_report.isNull()) { 2097aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal ALOGE("Failed to create %s", java_fate_type); 2098aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal return WIFI_ERROR_OUT_OF_MEMORY; 2099aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal } 2100aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal helper.setObjectArrayElement(reports, i, fate_report); 2101aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal } 2102aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2103aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal return result; 2104aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal} 2105aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2106aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawalstatic jint android_net_wifi_get_tx_pkt_fates(JNIEnv *env, jclass cls, jint iface, 2107aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal jobjectArray reports) { 2108aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2109aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal return get_pkt_fates<wifi_tx_report>( 2110aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal hal_fn.wifi_get_tx_pkt_fates, "com/android/server/wifi/WifiNative$TxFateReport", 2111aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal env, cls, iface, reports); 2112aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal} 2113aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2114aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawalstatic jint android_net_wifi_get_rx_pkt_fates(JNIEnv *env, jclass cls, jint iface, 2115aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal jobjectArray reports) { 2116aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2117aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal return get_pkt_fates<wifi_rx_report>( 2118aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal hal_fn.wifi_get_rx_pkt_fates, "com/android/server/wifi/WifiNative$RxFateReport", 2119aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal env, cls, iface, reports); 2120aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal} 2121aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 2122dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle// ---------------------------------------------------------------------------- 2123dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle// ePno framework 2124dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle// ---------------------------------------------------------------------------- 2125dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 2126dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 2127dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwallestatic void onPnoNetworkFound(wifi_request_id id, 2128dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle unsigned num_results, wifi_scan_result *results) { 21297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(mVM); 21307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("onPnoNetworkFound called, vm = %p, obj = %p, num_results %u", mVM, mCls, num_results); 2131dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21321ab129e587d334a144a0bca5323c27985397a403Randy Pan if (results == NULL || num_results == 0) { 2133dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("onPnoNetworkFound: Error no results"); 2134dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return; 2135dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 2136dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21371ab129e587d334a144a0bca5323c27985397a403Randy Pan JNIObject<jobjectArray> scanResults = helper.newObjectArray(num_results, 21381ab129e587d334a144a0bca5323c27985397a403Randy Pan "android/net/wifi/ScanResult", NULL); 21391ab129e587d334a144a0bca5323c27985397a403Randy Pan if (scanResults == NULL) { 21401ab129e587d334a144a0bca5323c27985397a403Randy Pan ALOGE("onpnoNetworkFound: Error in allocating scanResults array"); 21411ab129e587d334a144a0bca5323c27985397a403Randy Pan return; 21421ab129e587d334a144a0bca5323c27985397a403Randy Pan } 2143dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21441ab129e587d334a144a0bca5323c27985397a403Randy Pan JNIObject<jintArray> beaconCaps = helper.newIntArray(num_results); 21451ab129e587d334a144a0bca5323c27985397a403Randy Pan if (beaconCaps == NULL) { 21461ab129e587d334a144a0bca5323c27985397a403Randy Pan ALOGE("onpnoNetworkFound: Error in allocating beaconCaps array"); 21471ab129e587d334a144a0bca5323c27985397a403Randy Pan return; 21481ab129e587d334a144a0bca5323c27985397a403Randy Pan } 2149dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21501ab129e587d334a144a0bca5323c27985397a403Randy Pan for (unsigned i=0; i<num_results; i++) { 2151dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21521ab129e587d334a144a0bca5323c27985397a403Randy Pan JNIObject<jobject> scanResult = createScanResult(helper, &results[i], true); 21531ab129e587d334a144a0bca5323c27985397a403Randy Pan if (scanResult == NULL) { 21541ab129e587d334a144a0bca5323c27985397a403Randy Pan ALOGE("Error in creating scan result"); 2155dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return; 21561ab129e587d334a144a0bca5323c27985397a403Randy Pan } 2157dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21581ab129e587d334a144a0bca5323c27985397a403Randy Pan helper.setObjectArrayElement(scanResults, i, scanResult); 21591ab129e587d334a144a0bca5323c27985397a403Randy Pan helper.setIntArrayRegion(beaconCaps, i, 1, (jint *)&(results[i].capability)); 2160dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21611ab129e587d334a144a0bca5323c27985397a403Randy Pan if (DBG) { 21621ab129e587d334a144a0bca5323c27985397a403Randy Pan ALOGD("ScanResult: IE length %d, i %u, <%s> rssi=%d %02x:%02x:%02x:%02x:%02x:%02x", 21631ab129e587d334a144a0bca5323c27985397a403Randy Pan results->ie_length, i, results[i].ssid, results[i].rssi, 21641ab129e587d334a144a0bca5323c27985397a403Randy Pan results[i].bssid[0], results[i].bssid[1],results[i].bssid[2], 21651ab129e587d334a144a0bca5323c27985397a403Randy Pan results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); 21661ab129e587d334a144a0bca5323c27985397a403Randy Pan } 2167dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 2168dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21693571366ac36c70746b9f013ec2b54482861c9292Randy Pan helper.reportEvent(mCls, "onPnoNetworkFound", "(I[Landroid/net/wifi/ScanResult;[I)V", id, 21701ab129e587d334a144a0bca5323c27985397a403Randy Pan scanResults.get(), beaconCaps.get()); 2171dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle} 2172dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 2173dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwallestatic jboolean android_net_wifi_setPnoListNative( 21749bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius JNIEnv *env, jclass cls, jint iface, jint id, jobject settings) { 2175dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 2177dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle wifi_epno_handler handler; 2178dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle handler.on_network_found = &onPnoNetworkFound; 2179dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 2181dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGD("configure ePno list request [%d] = %p", id, handle); 2182dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21839bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius if (settings == NULL) { 21849bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius return false; 2185dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 2186dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21879bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius JNIObject<jobjectArray> list = helper.getArrayField(settings, "networkList", 2188ef3ea1092bc17673c0a85a845b053151b7c10e07Roshan Pius "[Lcom/android/server/wifi/WifiNative$PnoNetwork;"); 21899bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius if (list == NULL) { 21909bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius return false; 21919bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius } 2192dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21939bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius size_t len = helper.getArrayLength(list); 21942a6d76f0899289cd3b96e3428f02076fdbc0363eMitchell Wills if (len > (size_t)MAX_EPNO_NETWORKS) { 2195dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return false; 2196dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 2197dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 21989bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius wifi_epno_params params; 21999bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius memset(¶ms, 0, sizeof(params)); 22009bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius 2201dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle for (unsigned int i = 0; i < len; i++) { 2202dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 22039bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius JNIObject<jobject> pno_net = helper.getObjectArrayElement(list, i); 2204dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (pno_net == NULL) { 2205386acac84b22423d36796838adca2060fea81149Mitchell Wills ALOGE("setPnoListNative: could not get element %d", i); 2206dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle continue; 2207dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 2208dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 22099bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius JNIObject<jstring> sssid = helper.getStringField(pno_net, "ssid"); 2210dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (sssid == NULL) { 2211dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("Error setPnoListNative: getting ssid field"); 2212dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return false; 2213dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 2214dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 22157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ScopedUtfChars chars(env, (jstring)sssid.get()); 22167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande const char *ssid = chars.c_str(); 2217dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (ssid == NULL) { 2218dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("Error setPnoListNative: getting ssid"); 2219dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return false; 2220dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 2221dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle int ssid_len = strnlen((const char*)ssid, 33); 2222dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (ssid_len > 32) { 2223e2605f2df94a3696b468d6c7c86e3112e341c2f8Stephen Hines ALOGE("Error setPnoListNative: long ssid %zu", strnlen((const char*)ssid, 256)); 2224dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return false; 2225dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 22267d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 2227386acac84b22423d36796838adca2060fea81149Mitchell Wills if (ssid_len > 1 && ssid[0] == '"' && ssid[ssid_len-1] == '"') 2228dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle { 2229dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle // strip leading and trailing '"' 2230dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ssid++; 2231dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ssid_len-=2; 2232dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 2233dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle if (ssid_len == 0) { 2234dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle ALOGE("Error setPnoListNative: zero length ssid, skip it"); 2235dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle continue; 2236dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 22372a6d76f0899289cd3b96e3428f02076fdbc0363eMitchell Wills memcpy(params.networks[i].ssid, ssid, ssid_len); 2238dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 2239ef3ea1092bc17673c0a85a845b053151b7c10e07Roshan Pius params.networks[i].auth_bit_field = helper.getByteField(pno_net, "auth_bit_field"); 2240ef3ea1092bc17673c0a85a845b053151b7c10e07Roshan Pius params.networks[i].flags = helper.getByteField(pno_net, "flags"); 2241ef3ea1092bc17673c0a85a845b053151b7c10e07Roshan Pius ALOGD(" setPnoListNative: idx %u auth %x flags %x [%s]", i, 2242ef3ea1092bc17673c0a85a845b053151b7c10e07Roshan Pius params.networks[i].auth_bit_field, params.networks[i].flags, 22432a6d76f0899289cd3b96e3428f02076fdbc0363eMitchell Wills params.networks[i].ssid); 2244dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle } 22459bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius params.min5GHz_rssi = helper.getIntField(settings, "min5GHzRssi"); 22469bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius params.min24GHz_rssi = helper.getIntField(settings, "min24GHzRssi"); 22479bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius params.initial_score_max = helper.getIntField(settings, "initialScoreMax"); 22489bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius params.current_connection_bonus = helper.getIntField(settings, "currentConnectionBonus"); 22499bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius params.same_network_bonus = helper.getIntField(settings, "sameNetworkBonus"); 22509bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius params.secure_bonus = helper.getIntField(settings, "secureBonus"); 22519bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius params.band5GHz_bonus = helper.getIntField(settings, "band5GHzBonus"); 22522a6d76f0899289cd3b96e3428f02076fdbc0363eMitchell Wills params.num_networks = len; 2253dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 22542a6d76f0899289cd3b96e3428f02076fdbc0363eMitchell Wills int result = hal_fn.wifi_set_epno_list(id, handle, ¶ms, handler); 2255386acac84b22423d36796838adca2060fea81149Mitchell Wills ALOGD(" setPnoListNative: result %d", result); 2256dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 2257dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle return result >= 0; 2258dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle} 2259a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 22609bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Piusstatic jboolean android_net_wifi_resetPnoListNative( 22619bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius JNIEnv *env, jclass cls, jint iface, jint id) { 22629bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius 22639bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius JNIHelper helper(env); 22649bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius 22659bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 22669bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius ALOGD("reset ePno list request [%d] = %p", id, handle); 22679bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius 22689bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius // stop pno 22699bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius int result = hal_fn.wifi_reset_epno_list(id, handle); 22709bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius ALOGD(" ressetPnoListNative: result = %d", result); 22719bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius return result >= 0; 22729bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius} 22739bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius 22749ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwallestatic jboolean android_net_wifi_setBssidBlacklist( 22759ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle JNIEnv *env, jclass cls, jint iface, jint id, jobject list) { 22769ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle 22777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper helper(env); 22787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 22795caa43b34e0445ff08bff5931b84ffbc850b2a66Pierre Vandwalle ALOGD("configure BSSID black list request [%d] = %p", id, handle); 22809ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle 22819ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle wifi_bssid_params params; 22829ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle memset(¶ms, 0, sizeof(params)); 22839ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle 22849ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle if (list != NULL) { 22857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande size_t len = helper.getArrayLength((jobjectArray)list); 22869ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle if (len > (size_t)MAX_BLACKLIST_BSSID) { 22879ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle return false; 22889ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle } 22899ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle for (unsigned int i = 0; i < len; i++) { 22909ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle 22917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> jbssid = helper.getObjectArrayElement(list, i); 22929ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle if (jbssid == NULL) { 2293386acac84b22423d36796838adca2060fea81149Mitchell Wills ALOGE("configure BSSID blacklist: could not get element %d", i); 22949ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle continue; 22959ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle } 22967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 22977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ScopedUtfChars chars(env, (jstring)jbssid.get()); 22987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande const char *bssid = chars.c_str(); 22999ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle if (bssid == NULL) { 23007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGE("Error getting bssid"); 23017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return false; 23029ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle } 23039ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle 23049ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle mac_addr addr; 23059ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle parseMacAddress(bssid, addr); 23069ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle memcpy(params.bssids[i], addr, sizeof(mac_addr)); 23079ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle 23089ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle char bssidOut[32]; 23099ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle sprintf(bssidOut, "%0x:%0x:%0x:%0x:%0x:%0x", addr[0], addr[1], 23109ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle addr[2], addr[3], addr[4], addr[5]); 23119ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle 23129ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle ALOGD("BSSID blacklist: added bssid %s", bssidOut); 23139ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle 23149ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle params.num_bssid++; 23159ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle } 23169ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle } 23179ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle 23189ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle ALOGD("Added %d bssids", params.num_bssid); 23199ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle return hal_fn.wifi_set_bssid_blacklist(id, handle, params) == WIFI_SUCCESS; 23209ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle} 23219ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle 2322c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadhamstatic jint android_net_wifi_start_sending_offloaded_packet(JNIEnv *env, jclass cls, jint iface, 2323c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham jint idx, jbyteArray srcMac, jbyteArray dstMac, jbyteArray pkt, jint period) { 2324da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande JNIHelper helper(env); 2325da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 2326c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ALOGD("Start packet offload [%d] = %p", idx, handle); 2327c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham wifi_error ret; 2328c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham wifi_request_id id = idx; 23292a6d76f0899289cd3b96e3428f02076fdbc0363eMitchell Wills 2330da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande ScopedBytesRO pktBytes(env, pkt), srcMacBytes(env, srcMac), dstMacBytes(env, dstMac); 2331da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande 2332da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande byte * pkt_data = (byte*) pktBytes.get(); 2333c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham unsigned short pkt_len = env->GetArrayLength(pkt); 2334da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande byte* src_mac_addr = (byte*) srcMacBytes.get(); 2335da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande byte* dst_mac_addr = (byte*) dstMacBytes.get(); 2336c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham int i; 2337c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham char macAddr[32]; 2338c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham sprintf(macAddr, "%0x:%0x:%0x:%0x:%0x:%0x", src_mac_addr[0], src_mac_addr[1], 2339c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham src_mac_addr[2], src_mac_addr[3], src_mac_addr[4], src_mac_addr[5]); 2340c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ALOGD("src_mac_addr %s", macAddr); 2341c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham sprintf(macAddr, "%0x:%0x:%0x:%0x:%0x:%0x", dst_mac_addr[0], dst_mac_addr[1], 2342c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham dst_mac_addr[2], dst_mac_addr[3], dst_mac_addr[4], dst_mac_addr[5]); 2343c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ALOGD("dst_mac_addr %s", macAddr); 2344c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ALOGD("pkt_len %d\n", pkt_len); 2345c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ALOGD("Pkt data : "); 2346c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham for(i = 0; i < pkt_len; i++) { 2347c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ALOGD(" %x ", pkt_data[i]); 2348c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham } 2349c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ALOGD("\n"); 2350c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ret = hal_fn.wifi_start_sending_offloaded_packet(id, handle, pkt_data, pkt_len, 2351c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham src_mac_addr, dst_mac_addr, period); 2352c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ALOGD("ret= %d\n", ret); 2353c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham return ret; 2354c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham} 2355c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham 2356c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadhamstatic jint android_net_wifi_stop_sending_offloaded_packet(JNIEnv *env, jclass cls, 2357c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham jint iface, jint idx) { 2358c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham int ret; 2359da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande JNIHelper helper(env); 2360da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 2361c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ALOGD("Stop packet offload [%d] = %p", idx, handle); 2362c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ret = hal_fn.wifi_stop_sending_offloaded_packet(idx, handle); 2363c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham ALOGD("ret= %d\n", ret); 2364c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham return ret; 2365c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham} 2366c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham 2367c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadhamstatic void onRssiThresholdbreached(wifi_request_id id, u8 *cur_bssid, s8 cur_rssi) { 2368c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham 2369c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham ALOGD("RSSI threshold breached, cur RSSI - %d!!\n", cur_rssi); 2370c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham ALOGD("BSSID %02x:%02x:%02x:%02x:%02x:%02x\n", 2371c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham cur_bssid[0], cur_bssid[1], cur_bssid[2], 2372c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham cur_bssid[3], cur_bssid[4], cur_bssid[5]); 2373da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande JNIHelper helper(mVM); 2374c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham //ALOGD("onRssiThresholdbreached called, vm = %p, obj = %p, env = %p", mVM, mCls, env); 2375da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande helper.reportEvent(mCls, "onRssiThresholdBreached", "(IB)V", id, cur_rssi); 2376c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham} 2377c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham 2378c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadhamstatic jint android_net_wifi_start_rssi_monitoring_native(JNIEnv *env, jclass cls, jint iface, 2379c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham jint idx, jbyte maxRssi, jbyte minRssi) { 2380c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham 2381da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande JNIHelper helper(env); 2382da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 2383c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham ALOGD("Start Rssi monitoring = %p", handle); 2384c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham ALOGD("MinRssi %d MaxRssi %d", minRssi, maxRssi); 2385c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham wifi_error ret; 2386c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham wifi_request_id id = idx; 2387c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham wifi_rssi_event_handler eh; 2388c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham eh.on_rssi_threshold_breached = onRssiThresholdbreached; 2389c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham ret = hal_fn.wifi_start_rssi_monitoring(id, handle, maxRssi, minRssi, eh); 2390c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham return ret; 2391c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham} 2392c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham 2393c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadhamstatic jint android_net_wifi_stop_rssi_monitoring_native(JNIEnv *env, jclass cls, 2394c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham jint iface, jint idx) { 2395da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande JNIHelper helper(env); 2396da515a82e79abdf603b290c9fed4d4198ca75519Vinit Deshpande wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 2397c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham ALOGD("Stop Rssi monitoring = %p", handle); 2398c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham wifi_error ret; 2399c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham wifi_request_id id = idx; 2400c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham ret = hal_fn.wifi_stop_rssi_monitoring(id, handle); 2401c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham return ret; 2402c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham} 2403c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham 2404bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadhamstatic jobject android_net_wifi_get_wlan_wake_reason_count(JNIEnv *env, jclass cls, jint iface) { 2405bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 2406bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham JNIHelper helper(env); 2407bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham WLAN_DRIVER_WAKE_REASON_CNT wake_reason_cnt; 24086bf6986d359556010638dfae332b585162f06520Roshan Pius int cmd_event_wake_cnt_array[WAKE_REASON_TYPE_MAX]; 24096bf6986d359556010638dfae332b585162f06520Roshan Pius int driver_fw_local_wake_cnt_array[WAKE_REASON_TYPE_MAX]; 2410bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham wifi_interface_handle handle = getIfaceHandle(helper, cls, iface); 2411bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham wifi_error ret; 2412bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 24136bf6986d359556010638dfae332b585162f06520Roshan Pius wake_reason_cnt.cmd_event_wake_cnt = cmd_event_wake_cnt_array; 24146bf6986d359556010638dfae332b585162f06520Roshan Pius wake_reason_cnt.cmd_event_wake_cnt_sz = WAKE_REASON_TYPE_MAX; 24156bf6986d359556010638dfae332b585162f06520Roshan Pius wake_reason_cnt.cmd_event_wake_cnt_used = 0; 24166bf6986d359556010638dfae332b585162f06520Roshan Pius 24176bf6986d359556010638dfae332b585162f06520Roshan Pius wake_reason_cnt.driver_fw_local_wake_cnt = driver_fw_local_wake_cnt_array; 24186bf6986d359556010638dfae332b585162f06520Roshan Pius wake_reason_cnt.driver_fw_local_wake_cnt_sz = WAKE_REASON_TYPE_MAX; 24196bf6986d359556010638dfae332b585162f06520Roshan Pius wake_reason_cnt.driver_fw_local_wake_cnt_used = 0; 24206bf6986d359556010638dfae332b585162f06520Roshan Pius 2421bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham ret = hal_fn.wifi_get_wake_reason_stats(handle, &wake_reason_cnt); 2422bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 2423bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham if (ret != WIFI_SUCCESS) { 2424bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham ALOGE("android_net_wifi_get_wlan_wake_reason_count: failed to get wake reason count\n"); 2425bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham return NULL; 2426bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham } 2427bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 2428bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham JNIObject<jobject> stats = helper.createObject( "android/net/wifi/WifiWakeReasonAndCounts"); 2429bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham if (stats == NULL) { 2430bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham ALOGE("android_net_wifi_get_wlan_wake_reason_count: error allocating object\n"); 2431bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham return NULL; 2432bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham } 24336bf6986d359556010638dfae332b585162f06520Roshan Pius JNIObject<jintArray> cmd_wake_arr = 24346bf6986d359556010638dfae332b585162f06520Roshan Pius helper.newIntArray(wake_reason_cnt.cmd_event_wake_cnt_used); 24356bf6986d359556010638dfae332b585162f06520Roshan Pius if (cmd_wake_arr == NULL) { 24366bf6986d359556010638dfae332b585162f06520Roshan Pius ALOGE("android_net_wifi_get_wlan_wake_reason_count: error allocating array object\n"); 24376bf6986d359556010638dfae332b585162f06520Roshan Pius return NULL; 24386bf6986d359556010638dfae332b585162f06520Roshan Pius } 24396bf6986d359556010638dfae332b585162f06520Roshan Pius JNIObject<jintArray> local_wake_arr = 24406bf6986d359556010638dfae332b585162f06520Roshan Pius helper.newIntArray(wake_reason_cnt.driver_fw_local_wake_cnt_used); 24416bf6986d359556010638dfae332b585162f06520Roshan Pius if (local_wake_arr == NULL) { 24426bf6986d359556010638dfae332b585162f06520Roshan Pius ALOGE("android_net_wifi_get_wlan_wake_reason_count: error allocating array object\n"); 24436bf6986d359556010638dfae332b585162f06520Roshan Pius return NULL; 24446bf6986d359556010638dfae332b585162f06520Roshan Pius } 2445bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 2446bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "totalCmdEventWake", wake_reason_cnt.total_cmd_event_wake); 2447bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "totalDriverFwLocalWake", wake_reason_cnt.total_driver_fw_local_wake); 2448bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "totalRxDataWake", wake_reason_cnt.total_rx_data_wake); 2449bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "rxUnicast", wake_reason_cnt.rx_wake_details.rx_unicast_cnt); 2450bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "rxMulticast", wake_reason_cnt.rx_wake_details.rx_multicast_cnt); 2451bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "rxBroadcast", wake_reason_cnt.rx_wake_details.rx_broadcast_cnt); 2452bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "icmp", wake_reason_cnt.rx_wake_pkt_classification_info.icmp_pkt); 2453bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "icmp6", wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_pkt); 2454bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "icmp6Ra", wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_ra); 2455bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "icmp6Na", wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_na); 2456bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "icmp6Ns", wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_ns); 2457bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "ipv4RxMulticast", 2458bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham wake_reason_cnt.rx_multicast_wake_pkt_info.ipv4_rx_multicast_addr_cnt); 2459bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "ipv6Multicast", 2460bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham wake_reason_cnt.rx_multicast_wake_pkt_info.ipv6_rx_multicast_addr_cnt); 2461bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham helper.setIntField(stats, "otherRxMulticast", 2462bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham wake_reason_cnt.rx_multicast_wake_pkt_info.other_rx_multicast_addr_cnt); 24636bf6986d359556010638dfae332b585162f06520Roshan Pius helper.setIntArrayRegion(cmd_wake_arr, 0, wake_reason_cnt.cmd_event_wake_cnt_used, 24646bf6986d359556010638dfae332b585162f06520Roshan Pius wake_reason_cnt.cmd_event_wake_cnt); 24656bf6986d359556010638dfae332b585162f06520Roshan Pius helper.setIntArrayRegion(local_wake_arr, 0, wake_reason_cnt.driver_fw_local_wake_cnt_used, 24666bf6986d359556010638dfae332b585162f06520Roshan Pius wake_reason_cnt.driver_fw_local_wake_cnt); 24676bf6986d359556010638dfae332b585162f06520Roshan Pius helper.setObjectField(stats, "cmdEventWakeCntArray", "[I", cmd_wake_arr); 24686bf6986d359556010638dfae332b585162f06520Roshan Pius helper.setObjectField(stats, "driverFWLocalWakeCntArray", "[I", local_wake_arr); 2469bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham return stats.detach(); 2470bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham} 2471bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 24727e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpandestatic jbyteArray android_net_wifi_readKernelLog(JNIEnv *env, jclass cls) { 24737e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande JNIHelper helper(env); 24747e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGV("Reading kernel logs"); 24757e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 24767e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande int size = klogctl(/* SYSLOG_ACTION_SIZE_BUFFER */ 10, 0, 0); 24777e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande if (size < 1) { 24787e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGD("no kernel logs"); 24797e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande return helper.newByteArray(0).detach(); 24807e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } 24817e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 24827e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande char *buf = (char *)malloc(size); 24837e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande if (buf == NULL) { 24847e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGD("can't allocate temporary storage"); 24857e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande return helper.newByteArray(0).detach(); 24867e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } 24877e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 24887e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande int read = klogctl(/* SYSLOG_ACTION_READ_ALL */ 3, buf, size); 24897e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande if (read < 0) { 24907e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGD("can't read logs - %d", read); 24917e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande free(buf); 24927e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande return helper.newByteArray(0).detach(); 24937e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } else { 24947e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGV("read %d bytes", read); 24957e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } 24967e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 24977e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande if (read != size) { 24987e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGV("read %d bytes, expecting %d", read, size); 24997e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } 25007e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 25017e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande JNIObject<jbyteArray> result = helper.newByteArray(read); 25027e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande if (result.isNull()) { 25037e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGD("can't allocate array"); 25047e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande free(buf); 25057e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande return result.detach(); 25067e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } 25077e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 25087e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande helper.setByteArrayRegion(result, 0, read, (jbyte*)buf); 25097e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande free(buf); 25107e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande return result.detach(); 25117e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande} 2512bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 25133dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Klinestatic jint android_net_wifi_configure_nd_offload(JNIEnv *env, jclass cls, 25143dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline jint iface, jboolean enable) { 25153dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline JNIHelper helper(env); 25163dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline return hal_fn.wifi_configure_nd_offload( 25173dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline getIfaceHandle(helper, cls, iface), 25183dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline static_cast<int>(enable)); 25193dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline} 25203dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline 25213dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline 2522155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// ---------------------------------------------------------------------------- 2523155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2524155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* 2525155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * JNI registration. 2526155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2527155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic JNINativeMethod gWifiMethods[] = { 2528155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* name, signature, funcPtr */ 2529155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 253018786eca942042388748b0d98979f21c9dff4a89Mitchell Wills { "loadDriverNative", "()Z", (void *)android_net_wifi_loadDriver }, 253118786eca942042388748b0d98979f21c9dff4a89Mitchell Wills { "isDriverLoadedNative", "()Z", (void *)android_net_wifi_isDriverLoaded }, 253218786eca942042388748b0d98979f21c9dff4a89Mitchell Wills { "unloadDriverNative", "()Z", (void *)android_net_wifi_unloadDriver }, 253318786eca942042388748b0d98979f21c9dff4a89Mitchell Wills { "startSupplicantNative", "(Z)Z", (void *)android_net_wifi_startSupplicant }, 253418786eca942042388748b0d98979f21c9dff4a89Mitchell Wills { "killSupplicantNative", "(Z)Z", (void *)android_net_wifi_killSupplicant }, 2535155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "connectToSupplicantNative", "()Z", (void *)android_net_wifi_connectToSupplicant }, 2536155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "closeSupplicantConnectionNative", "()V", 2537155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande (void *)android_net_wifi_closeSupplicantConnection }, 2538155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "waitForEventNative", "()Ljava/lang/String;", (void*)android_net_wifi_waitForEvent }, 2539155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doBooleanCommandNative", "(Ljava/lang/String;)Z", (void*)android_net_wifi_doBooleanCommand }, 2540155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doIntCommandNative", "(Ljava/lang/String;)I", (void*)android_net_wifi_doIntCommand }, 2541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande { "doStringCommandNative", "(Ljava/lang/String;)Ljava/lang/String;", 2542155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande (void*) android_net_wifi_doStringCommand }, 25437ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "startHalNative", "()Z", (void*) android_net_wifi_startHal }, 25447ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "stopHalNative", "()V", (void*) android_net_wifi_stopHal }, 25457ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde { "waitForHalEventNative", "()V", (void*) android_net_wifi_waitForHalEvents }, 25467f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde { "getInterfacesNative", "()I", (void*) android_net_wifi_getInterfaces}, 25477f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde { "getInterfaceNameNative", "(I)Ljava/lang/String;", (void*) android_net_wifi_getInterfaceName}, 2548e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "getScanCapabilitiesNative", "(ILcom/android/server/wifi/WifiNative$ScanCapabilities;)Z", 2549e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void *) android_net_wifi_getScanCapabilities}, 2550e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "startScanNative", "(IILcom/android/server/wifi/WifiNative$ScanSettings;)Z", 2551e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_startScan}, 2552e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "stopScanNative", "(II)Z", (void*) android_net_wifi_stopScan}, 2553c591ab3b5ff4ac8dade1c7eb88ec83f3572f999bVinit Deshpande { "getScanResultsNative", "(IZ)[Landroid/net/wifi/WifiScanner$ScanData;", 2554e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void *) android_net_wifi_getScanResults}, 2555e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "setHotlistNative", "(IILandroid/net/wifi/WifiScanner$HotlistSettings;)Z", 2556e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_setHotlist}, 2557e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "resetHotlistNative", "(II)Z", (void*) android_net_wifi_resetHotlist}, 2558e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "trackSignificantWifiChangeNative", "(IILandroid/net/wifi/WifiScanner$WifiChangeSettings;)Z", 2559e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde (void*) android_net_wifi_trackSignificantWifiChange}, 2560e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde { "untrackSignificantWifiChangeNative", "(II)Z", 2561aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle (void*) android_net_wifi_untrackSignificantWifiChange}, 2562aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalle { "getWifiLinkLayerStatsNative", "(I)Landroid/net/wifi/WifiLinkLayerStats;", 2563a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande (void*) android_net_wifi_getLinkLayerStats}, 2564d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwalle { "setWifiLinkLayerStatsNative", "(II)V", 2565d745a52dc4f929d4a4030f205ed173bdf60eaf10Pierre Vandwalle (void*) android_net_wifi_setLinkLayerStats}, 2566c35361d54d4885c3174499e4ad46d3324387a9bbVinit Deshpande { "getSupportedFeatureSetNative", "(I)I", 2567143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande (void*) android_net_wifi_getSupportedFeatures}, 2568143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande { "requestRangeNative", "(II[Landroid/net/wifi/RttManager$RttParams;)Z", 2569143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande (void*) android_net_wifi_requestRange}, 2570143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande { "cancelRangeRequestNative", "(II[Landroid/net/wifi/RttManager$RttParams;)Z", 2571042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande (void*) android_net_wifi_cancelRange}, 257268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang { "enableRttResponderNative", 257368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang "(IIILcom/android/server/wifi/WifiNative$WifiChannelInfo;)Landroid/net/wifi/RttManager$ResponderConfig;", 257468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang (void*) android_net_wifi_enableResponder}, 257568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang { "disableRttResponderNative", "(II)Z", 257668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang (void*) android_net_wifi_disableResponder}, 257768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 257890b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande { "setScanningMacOuiNative", "(I[B)Z", (void*) android_net_wifi_setScanningMacOui}, 257990b902d2b5c02af02edd7e60f385196af8823128Vinit Deshpande { "getChannelsForBandNative", "(II)[I", (void*) android_net_wifi_getValidChannels}, 2580b830d76fbf5fa4077531b516066faa2fdbb92e81xinhe { "setDfsFlagNative", "(IZ)Z", (void*) android_net_wifi_setDfsFlag}, 25813b51fd1bb8356b284822f4f677ad941524e616ebNingyuan Wang { "setInterfaceUpNative", "(Z)Z", (void*) android_net_wifi_set_interface_up}, 258212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe { "getRttCapabilitiesNative", "(I)Landroid/net/wifi/RttManager$RttCapabilities;", 2583a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle (void*) android_net_wifi_get_rtt_capabilities}, 2584e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen { "getApfCapabilitiesNative", "(I)Landroid/net/apf/ApfCapabilities;", 2585e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensen (void*) android_net_wifi_get_apf_capabilities}, 25866609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen { "installPacketFilterNative", "(I[B)Z", (void*) android_net_wifi_install_packet_filter}, 2587939177ff615062ec826601d536466875d8457375xinhe {"setCountryCodeHalNative", "(ILjava/lang/String;)Z", 2588dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle (void*) android_net_wifi_set_Country_Code_Hal}, 25899bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius { "setPnoListNative", "(IILcom/android/server/wifi/WifiNative$PnoSettings;)Z", 2590d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe (void*) android_net_wifi_setPnoListNative}, 25919bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius { "resetPnoListNative", "(II)Z", (void*) android_net_wifi_resetPnoListNative}, 2592d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe {"enableDisableTdlsNative", "(IZLjava/lang/String;)Z", 2593d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe (void*) android_net_wifi_enable_disable_tdls}, 2594d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe {"getTdlsStatusNative", "(ILjava/lang/String;)Lcom/android/server/wifi/WifiNative$TdlsStatus;", 2595d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe (void*) android_net_wifi_get_tdls_status}, 2596d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe {"getTdlsCapabilitiesNative", "(I)Lcom/android/server/wifi/WifiNative$TdlsCapabilities;", 259703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe (void*) android_net_wifi_get_tdls_capabilities}, 259803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe {"getSupportedLoggerFeatureSetNative","(I)I", 259903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe (void*) android_net_wifi_get_supported_logger_feature}, 260003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe {"getDriverVersionNative", "(I)Ljava/lang/String;", 260103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe (void*) android_net_wifi_get_driver_version}, 260203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe {"getFirmwareVersionNative", "(I)Ljava/lang/String;", 260303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe (void*) android_net_wifi_get_firmware_version}, 26040bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande {"getRingBufferStatusNative", "(I)[Lcom/android/server/wifi/WifiNative$RingBufferStatus;", 260503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe (void*) android_net_wifi_get_ring_buffer_status}, 260603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe {"startLoggingRingBufferNative", "(IIIIILjava/lang/String;)Z", 260703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe (void*) android_net_wifi_start_logging_ring_buffer}, 260803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe {"getRingBufferDataNative", "(ILjava/lang/String;)Z", 260903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe (void*) android_net_wifi_get_ring_buffer_data}, 2610d4c25fd76644d5490700ae69fada4669de5193a1Pierre Vandwalle {"getFwMemoryDumpNative","(I)Z", (void*) android_net_wifi_get_fw_memory_dump}, 2611d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal {"getDriverStateDumpNative","(I)[B", (void*) android_net_wifi_get_driver_state_dump}, 26129ccffbb6c3fe8eaa7d70cc3076d0dc3c6a9073e7Pierre Vandwalle { "setBssidBlacklistNative", "(II[Ljava/lang/String;)Z", 26135caa43b34e0445ff08bff5931b84ffbc850b2a66Pierre Vandwalle (void*)android_net_wifi_setBssidBlacklist}, 2614b797893fc1966803d0c013faac42e6396a37a384xinhe {"setLoggingEventHandlerNative", "(II)Z", (void *) android_net_wifi_set_log_handler}, 2615c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham {"resetLogHandlerNative", "(II)Z", (void *) android_net_wifi_reset_log_handler}, 2616aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal {"startPktFateMonitoringNative", "(I)I", (void*) android_net_wifi_start_pkt_fate_monitoring}, 2617aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal {"getTxPktFatesNative", "(I[Lcom/android/server/wifi/WifiNative$TxFateReport;)I", 2618aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal (void*) android_net_wifi_get_tx_pkt_fates}, 2619aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal {"getRxPktFatesNative", "(I[Lcom/android/server/wifi/WifiNative$RxFateReport;)I", 2620aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal (void*) android_net_wifi_get_rx_pkt_fates}, 2621c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham { "startSendingOffloadedPacketNative", "(II[B[B[BI)I", 2622c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham (void*)android_net_wifi_start_sending_offloaded_packet}, 2623c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham { "stopSendingOffloadedPacketNative", "(II)I", 2624c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham (void*)android_net_wifi_stop_sending_offloaded_packet}, 2625c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham {"startRssiMonitoringNative", "(IIBB)I", 2626c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham (void*)android_net_wifi_start_rssi_monitoring_native}, 2627c2b197d7475ccfbcc84cab83c57ba4f678e67db8Prerepa Viswanadham {"stopRssiMonitoringNative", "(II)I", 26289dc6bda43f0767a1ecb3f901d9be0f523e9463f1xinhe (void*)android_net_wifi_stop_rssi_monitoring_native}, 26295e5aa7059e474895c6719738d9def61eecc15973Prerepa Viswanadham { "getWlanWakeReasonCountNative", "(I)Landroid/net/wifi/WifiWakeReasonAndCounts;", 26305e5aa7059e474895c6719738d9def61eecc15973Prerepa Viswanadham (void*) android_net_wifi_get_wlan_wake_reason_count}, 2631ee0a0132ebb0d7e9baf42e778ea9c094966ffb14xinhe {"isGetChannelsForBandSupportedNative", "()Z", 2632956f54b391677d78379729dd14518edddf3c7660Etan Cohen (void*)android_net_wifi_is_get_channels_for_band_supported}, 26333dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline {"readKernelLogNative", "()[B", (void*)android_net_wifi_readKernelLog}, 26343dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline {"configureNeighborDiscoveryOffload", "(IZ)I", (void*)android_net_wifi_configure_nd_offload}, 2635155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 2636155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2637155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* User to register native functions */ 2638155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeextern "C" 2639155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandejint Java_com_android_server_wifi_WifiNative_registerNatives(JNIEnv* env, jclass clazz) { 264087a33d221f8f8dea7782023da2ee5d66453e37cbEtan Cohen // initialization needed for unit test APK 264187a33d221f8f8dea7782023da2ee5d66453e37cbEtan Cohen JniConstants::init(env); 264287a33d221f8f8dea7782023da2ee5d66453e37cbEtan Cohen 26430d83625c25353c92c123f552939eea4b33074b60Mitchell Wills return jniRegisterNativeMethods(env, 2644155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com/android/server/wifi/WifiNative", gWifiMethods, NELEM(gWifiMethods)); 2645155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 2646155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2647155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; // namespace android 2648