diff options
author | Vinit Deshpande <vinitd@google.com> | 2015-06-01 14:13:04 -0700 |
---|---|---|
committer | Vinit Deshpande <vinitd@google.com> | 2015-06-03 18:07:51 -0700 |
commit | 0bf150b2d69ec62df905bc6f8603437dc4caee1f (patch) | |
tree | 4afa6fa87eddba5bbe3b2db3238784dfbcf5d6ca /service/jni | |
parent | 550ae0842c9ca95facfe8b310de5c6d2a0601a89 (diff) | |
download | android_frameworks_opt_net_wifi-0bf150b2d69ec62df905bc6f8603437dc4caee1f.tar.gz android_frameworks_opt_net_wifi-0bf150b2d69ec62df905bc6f8603437dc4caee1f.tar.bz2 android_frameworks_opt_net_wifi-0bf150b2d69ec62df905bc6f8603437dc4caee1f.zip |
Enable ring buffer logging and auto-logging of failures
This change extracts ring buffer data from firmware; and
automatically logs driver/firmware logs when any failure
is detected.
Change-Id: I20c8cc00e8ac1d1b4f35da6d309e972cd8ea5d19
Diffstat (limited to 'service/jni')
-rw-r--r-- | service/jni/com_android_server_wifi_WifiNative.cpp | 49 |
1 files changed, 14 insertions, 35 deletions
diff --git a/service/jni/com_android_server_wifi_WifiNative.cpp b/service/jni/com_android_server_wifi_WifiNative.cpp index 806e7aef8..d100060fb 100644 --- a/service/jni/com_android_server_wifi_WifiNative.cpp +++ b/service/jni/com_android_server_wifi_WifiNative.cpp @@ -1583,7 +1583,7 @@ static jobject android_net_wifi_get_ring_buffer_status (JNIEnv *env, jclass cls, if (result == WIFI_SUCCESS) { ALOGD("status is %p, number is %d", status, num_rings); jclass clsRingBufferStatus = - (env)->FindClass("com/android/server/wifi/WifiLogger$RingBufferStatus"); + (env)->FindClass("com/android/server/wifi/WifiNative$RingBufferStatus"); if (clsRingBufferStatus == NULL) { ALOGE("Error in accessing class"); free(status); @@ -1594,7 +1594,7 @@ static jobject android_net_wifi_get_ring_buffer_status (JNIEnv *env, jclass cls, for(u32 i = 0; i < num_rings; i++, tmp++) { jobject ringStatus = createObject(env, - "com/android/server/wifi/WifiLogger$RingBufferStatus"); + "com/android/server/wifi/WifiNative$RingBufferStatus"); if (ringStatus == NULL) { ALOGE("Error in creating ringBufferStatus"); free(status); @@ -1624,33 +1624,26 @@ static jobject android_net_wifi_get_ring_buffer_status (JNIEnv *env, jclass cls, static void on_ring_buffer_data(char *ring_name, char *buffer, int buffer_size, wifi_ring_buffer_status *status) { + if (!ring_name || !buffer || !status || (unsigned int)buffer_size <= sizeof(wifi_ring_buffer_entry)) { ALOGE("Error input for on_ring_buffer_data!"); + return; } + JNIEnv *env = NULL; mVM->AttachCurrentThread(&env, NULL); ALOGD("on_ring_buffer_data called, vm = %p, obj = %p, env = %p buffer size = %d", mVM, mCls, env, buffer_size); - jobject wifiLoggerEvent = createObject(env, - "com/android/server/wifi/WifiNative$WifiLoggerEvent"); - - //jstring reportBuffer = env->NewStringUTF(buffer); - //setStringField(env, wifiLoggerEvent, "buffer", buffer); - jobject ringStatus = createObject(env, - "com/android/server/wifi/WifiLogger$RingBufferStatus"); + "com/android/server/wifi/WifiNative$RingBufferStatus"); if (status == NULL) { ALOGE("Error in creating ringBufferStatus"); return; } - char name[32]; - for(int j = 0; j < 32; j++) { - name[j] = status->name[j]; - } - setStringField(env, ringStatus, "name", name); + setStringField(env, ringStatus, "name", ring_name); setIntField(env, ringStatus, "flag", status->flags); setIntField(env, ringStatus, "ringBufferId", status->ring_id); setIntField(env, ringStatus, "ringBufferByteSize", status->ring_buffer_byte_size); @@ -1658,29 +1651,15 @@ static void on_ring_buffer_data(char *ring_name, char *buffer, int buffer_size, setIntField(env, ringStatus, "writtenBytes", status->written_bytes); setIntField(env, ringStatus, "readBytes", status->read_bytes); setIntField(env, ringStatus, "writtenRecords", status->written_records); - setObjectField(env, wifiLoggerEvent, "status", - "Lcom/android/server/wifi/WifiLogger$RingBufferStatus;", ringStatus); - //set entry - wifi_ring_buffer_entry *buffer_entry = (wifi_ring_buffer_entry *) buffer; - setIntField(env,wifiLoggerEvent, "entrySize", buffer_entry->entry_size); - setIntField(env,wifiLoggerEvent, "flags", buffer_entry->flags); - setIntField(env,wifiLoggerEvent, "type", buffer_entry->type); - setLongField(env,wifiLoggerEvent, "timestamp", buffer_entry->timestamp); - //set records - int record_size = buffer_size - sizeof(wifi_ring_buffer_entry); - if (buffer_entry->entry_size > 0) { - jbyteArray records = env->NewByteArray(buffer_entry->entry_size); - jbyte *bytes = (jbyte *) (buffer_entry + 1); - env->SetByteArrayRegion(records, 0, buffer_entry->entry_size, bytes); - setObjectField(env,wifiLoggerEvent, "entry", "[B", records); - env->DeleteLocalRef(records); - } - reportEvent(env, mCls,"onWifiLoggerEvent", - "(Lcom/android/server/wifi/WifiNative$WifiLoggerEvent;)V", wifiLoggerEvent); + jbyteArray bytes = env->NewByteArray(buffer_size); + env->SetByteArrayRegion(bytes, 0, buffer_size, (jbyte*)buffer); + + reportEvent(env, mCls,"onRingBufferData", + "(Lcom/android/server/wifi/WifiNative$RingBufferStatus;[B)V", ringStatus, bytes); + env->DeleteLocalRef(bytes); env->DeleteLocalRef(ringStatus); - env->DeleteLocalRef(wifiLoggerEvent); } static void on_alert_data(wifi_request_id id, char *buffer, int buffer_size, int err_code){ @@ -2148,7 +2127,7 @@ static JNINativeMethod gWifiMethods[] = { (void*) android_net_wifi_get_driver_version}, {"getFirmwareVersionNative", "(I)Ljava/lang/String;", (void*) android_net_wifi_get_firmware_version}, - {"getRingBufferStatusNative", "(I)[Lcom/android/server/wifi/WifiLogger$RingBufferStatus;", + {"getRingBufferStatusNative", "(I)[Lcom/android/server/wifi/WifiNative$RingBufferStatus;", (void*) android_net_wifi_get_ring_buffer_status}, {"startLoggingRingBufferNative", "(IIIIILjava/lang/String;)Z", (void*) android_net_wifi_start_logging_ring_buffer}, |