From 12cf388ecf3b2aa5ba66ed680b931fa356ab75b5 Mon Sep 17 00:00:00 2001 From: xinhe Date: Thu, 12 Mar 2015 18:38:54 -0700 Subject: Change rtt Framework interface Bug:19735392 Change-Id: Ie64e4609c9804c904836bb37255d4efe9211f39f --- service/jni/com_android_server_wifi_WifiNative.cpp | 117 ++++++++++++++++++--- service/jni/jni_helper.cpp | 18 ++++ service/jni/jni_helper.h | 1 + 3 files changed, 120 insertions(+), 16 deletions(-) (limited to 'service/jni') diff --git a/service/jni/com_android_server_wifi_WifiNative.cpp b/service/jni/com_android_server_wifi_WifiNative.cpp index 7677ec708..32bcd4f9c 100644 --- a/service/jni/com_android_server_wifi_WifiNative.cpp +++ b/service/jni/com_android_server_wifi_WifiNative.cpp @@ -29,6 +29,7 @@ #include "wifi.h" #include "wifi_hal.h" #include "jni_helper.h" +#include "rtt.h" #define REPLY_BUF_SIZE 4096 // wpa_supplicant's maximum size. #define EVENT_BUF_SIZE 2048 @@ -1058,18 +1059,41 @@ static void onRttResults(wifi_request_id id, unsigned num_results, wifi_rtt_resu result.addr[2], result.addr[3], result.addr[4], result.addr[5]); setStringField(env, rttResult, "bssid", bssid); - setIntField(env, rttResult, "status", result.status); - setIntField(env, rttResult, "requestType", result.type); - setLongField(env, rttResult, "ts", result.ts); - setIntField(env, rttResult, "rssi", result.rssi); - setIntField(env, rttResult, "rssi_spread", result.rssi_spread); - setIntField(env, rttResult, "tx_rate", result.tx_rate.bitrate); - setLongField(env, rttResult, "rtt_ns", result.rtt); - setLongField(env, rttResult, "rtt_sd_ns", result.rtt_sd); - setLongField(env, rttResult, "rtt_spread_ns", result.rtt_spread); - setIntField(env, rttResult, "distance_cm", result.distance); - setIntField(env, rttResult, "distance_sd_cm", result.distance_sd); - setIntField(env, rttResult, "distance_spread_cm", result.distance_spread); + setIntField(env, rttResult, "burstNumber", result.burst_num); + setIntField(env, rttResult, "measurementFrameNumber", result.measurement_number); + setIntField(env, rttResult, "successMeasurementFrameNumber", result.success_number); + setIntField(env, rttResult, "frameNumberPerBurstPeer", result.number_per_burst_peer); + setIntField(env, rttResult, "status", result.status); + setIntField(env, rttResult, "measurementType", result.type); + setIntField(env, rttResult, "retryAfterDuration", result.retry_after_duration); + setLongField(env, rttResult, "ts", result.ts); + setIntField(env, rttResult, "rssi", result.rssi); + setIntField(env, rttResult, "rssiSpread", result.rssi_spread); + setIntField(env, rttResult, "txRate", result.tx_rate.bitrate); + setIntField(env, rttResult, "RxRate", result.rx_rate.bitrate); + setLongField(env, rttResult, "rtt", result.rtt); + setLongField(env, rttResult, "rttStandardDeviation", result.rtt_sd); + setLongField(env, rttResult, "rttSpread", result.rtt_spread); + setIntField(env, rttResult, "distance", result.distance); + setIntField(env, rttResult, "distanceStandardDeviation", result.distance_sd); + setIntField(env, rttResult, "distanceSpread", result.distance_spread); + setIntField(env, rttResult, "burstDuration", result.burst_duration); + + if (result.LCI.len != 0) { + jobject LCI = createObject(env, "android/net/wifi/RttManager$wifiInformationElement"); + setIntField(env, LCI, "id", (int) result.LCI.id); + //setStringField(env, LCI,"data", result.LCI.data); + setObjectField(env, rttResult, "LCI", + "android/net/wifi/RttManager$WifiInformationElement;", LCI); + } + + if (result.LCR.len != 0) { + jobject LCR = createObject(env, "android/net/wifi/RttManager$wifiInformationElement"); + setIntField(env, LCR, "id", result.LCI.id); + //setStringField(env, LCR,"data", result.LCI.data); + setObjectField(env, rttResult, "LCR", + "android/net/wifi/RttManager$WifiInformationElement;", LCR); + } env->SetObjectArrayElement(rttResults, i, rttResult); } @@ -1108,9 +1132,33 @@ static jboolean android_net_wifi_requestRange( config.type = (wifi_rtt_type)getIntField(env, param, "requestType"); config.peer = (wifi_peer_type)getIntField(env, param, "deviceType"); config.channel.center_freq = getIntField(env, param, "frequency"); - config.channel.width = (wifi_channel_width)getIntField(env, param, "channelWidth"); - config.num_frames_per_burst = getIntField(env, param, "num_samples"); - config.num_retries_per_measurement_frame = getIntField(env, param, "num_retries"); + config.channel.width = (wifi_channel_width) getIntField(env, param, "channelWidth"); + config.channel.center_freq0 = getIntField(env, param, "centerFreq0"); + config.channel.center_freq1 = getIntField(env, param, "centerFreq1"); + + config.num_burst = getIntField(env, param, "numberBurst"); + config.interval = (unsigned) getIntField(env, param, "interval"); + config.num_frames_per_burst = (unsigned) getIntField(env, param, "numSamplesPerBurst"); + config.num_retries_per_measurement_frame = (unsigned) getIntField(env, param, + "numRetriesPerMeasurementFrame"); + config.num_retries_per_ftmr = (unsigned) getIntField(env, param, "numRetriesPerFTMR"); + config.LCI_request = getBoolField(env, param, "LCIRequest") ? 1 : 0; + config.LCR_request = getBoolField(env, param, "LCRRequest") ? 1 : 0; + config.burst_timeout = (unsigned) getIntField(env, param, "burstTimeout"); + config.preamble = getIntField(env, param, "preamble"); + config.bw = getIntField(env, param, "bandwidth"); + + ALOGD("RTT request destination %d: type is %d, peer is %d, bw is %d, center_freq is %d ", i, + config.type,config.peer, config.channel.width, config.channel.center_freq0); + ALOGD("center_freq0 is %d, center_freq1 is %d, num_burst is %d,interval is %d", + config.channel.center_freq0, config.channel.center_freq1, config.num_burst, + config.interval); + ALOGD("frames_per_burst is %d, retries of measurement frame is %d, retries_per_ftmr is %d", + config.num_frames_per_burst, config.num_retries_per_measurement_frame, + config.num_retries_per_ftmr); + ALOGD("LCI_requestis %d, LCR_request is %d, burst_timeout is %d, preamble is %d, bw is %d", + config.LCI_request, config.LCR_request, config.burst_timeout, config.preamble, + config.bw); } wifi_rtt_event_handler handler; @@ -1205,6 +1253,41 @@ static jboolean android_net_wifi_setDfsFlag(JNIEnv *env, jclass cls, jint iface, return result == WIFI_SUCCESS; } +static jobject android_net_wifi_get_rtt_capabilities(JNIEnv *env, jclass cls, jint iface) { + wifi_rtt_capabilities rtt_capabilities; + wifi_interface_handle handle = getIfaceHandle(env, cls, iface); + wifi_error ret = wifi_get_rtt_capabilities(handle, &rtt_capabilities); + + if(WIFI_SUCCESS == ret) { + jobject capabilities = createObject(env, "android/net/wifi/RttManager$RttCapabilities"); + setBooleanField(env, capabilities, "oneSidedRttSupported", + rtt_capabilities.rtt_one_sided_supported == 1); + setBooleanField(env, capabilities, "twoSided11McRttSupported", + rtt_capabilities.rtt_ftm_supported == 1); + setBooleanField(env, capabilities, "lciSupported", + rtt_capabilities.lci_support); + setBooleanField(env,capabilities, "lcrSupported", + rtt_capabilities.lcr_support); + setIntField(env, capabilities, "preambleSupported", + rtt_capabilities.preamble_support); + setIntField(env, capabilities, "bwSupported", + rtt_capabilities.bw_support); + ALOGD("One side RTT is: %s", rtt_capabilities.rtt_one_sided_supported ==1 ? "support" : + "not support"); + ALOGD("Two side RTT is: %s", rtt_capabilities.rtt_ftm_supported == 1 ? "support" : + "not support"); + ALOGD("LCR is: %s", rtt_capabilities.lcr_support == 1 ? "support" : "not support"); + + ALOGD("LCI is: %s", rtt_capabilities.lci_support == 1 ? "support" : "not support"); + + ALOGD("Support Preamble is : %d support BW is %d", rtt_capabilities.preamble_support, + rtt_capabilities.bw_support); + return capabilities; + } else { + return NULL; + } +} + // ---------------------------------------------------------------------------- /* @@ -1256,7 +1339,9 @@ static JNINativeMethod gWifiMethods[] = { { "setScanningMacOuiNative", "(I[B)Z", (void*) android_net_wifi_setScanningMacOui}, { "getChannelsForBandNative", "(II)[I", (void*) android_net_wifi_getValidChannels}, { "setDfsFlagNative", "(IZ)Z", (void*) android_net_wifi_setDfsFlag}, - { "toggleInterfaceNative", "(I)Z", (void*) android_net_wifi_toggle_interface} + { "toggleInterfaceNative", "(I)Z", (void*) android_net_wifi_toggle_interface}, + { "getRttCapabilitiesNative", "(I)Landroid/net/wifi/RttManager$RttCapabilities;", + (void*) android_net_wifi_get_rtt_capabilities} }; int register_android_net_wifi_WifiNative(JNIEnv* env) { diff --git a/service/jni/jni_helper.cpp b/service/jni/jni_helper.cpp index b5a1ad177..001d27ec4 100644 --- a/service/jni/jni_helper.cpp +++ b/service/jni/jni_helper.cpp @@ -222,6 +222,24 @@ void setIntField(JNIEnv *env, jobject obj, const char *name, jint value) env->DeleteLocalRef(cls); } +void setBooleanField(JNIEnv *env, jobject obj, const char *name, jboolean value) +{ + jclass cls = (env)->GetObjectClass(obj); + if (cls == NULL) { + THROW(env, "Error in accessing class"); + return; + } + + jfieldID field = (env)->GetFieldID(cls, name, "Z"); + if (field == NULL) { + THROW(env, "Error in accessing field"); + return; + } + + (env)->SetBooleanField(obj, field, value); + env->DeleteLocalRef(cls); +} + void setLongField(JNIEnv *env, jobject obj, const char *name, jlong value) { jclass cls = (env)->GetObjectClass(obj); diff --git a/service/jni/jni_helper.h b/service/jni/jni_helper.h index f10e8c75b..e20ec0719 100644 --- a/service/jni/jni_helper.h +++ b/service/jni/jni_helper.h @@ -11,6 +11,7 @@ jobject getObjectField(JNIEnv *env, jobject obj, const char *name, const char *t jlong getLongArrayField(JNIEnv *env, jobject obj, const char *name, int index); jobject getObjectArrayField(JNIEnv *env, jobject obj, const char *name, const char *type, int index); void setIntField(JNIEnv *env, jobject obj, const char *name, jint value); +void setBooleanField(JNIEnv *env, jobject obj, const char *name, jboolean value); void setLongField(JNIEnv *env, jobject obj, const char *name, jlong value); void setLongArrayField(JNIEnv *env, jobject obj, const char *name, jlongArray value); void setLongArrayElement(JNIEnv *env, jobject obj, const char *name, int index, jlong value); -- cgit v1.2.3