1155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* 2b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Copyright 2017, 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 17b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius#define LOG_TAG "wifi-jni" 18155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 19e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#include <ctype.h> 20956f54b391677d78379729dd14518edddf3c7660Etan Cohen#include <stdlib.h> 217e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande#include <sys/klog.h> 22aaa79f0ef5b0f91e0525408a4a45f6c4cd5dfd94mukesh agrawal 23b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius#include <log/log.h> 24b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius#include <nativehelper/JniConstants.h> 25b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius#include <nativehelper/ScopedBytes.h> 26b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius#include <nativehelper/ScopedUtfChars.h> 279907358e1374c55440d8fcf5175633315678dbe5Steven Moreland#include <jni.h> 28bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 29b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius#include "jni_helper.h" 30bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 31b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Piusnamespace android { 32bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 33bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 347e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpandestatic jbyteArray android_net_wifi_readKernelLog(JNIEnv *env, jclass cls) { 357e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande JNIHelper helper(env); 367e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGV("Reading kernel logs"); 377e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 387e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande int size = klogctl(/* SYSLOG_ACTION_SIZE_BUFFER */ 10, 0, 0); 397e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande if (size < 1) { 407e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGD("no kernel logs"); 417e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande return helper.newByteArray(0).detach(); 427e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } 437e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 447e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande char *buf = (char *)malloc(size); 457e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande if (buf == NULL) { 467e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGD("can't allocate temporary storage"); 477e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande return helper.newByteArray(0).detach(); 487e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } 497e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 507e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande int read = klogctl(/* SYSLOG_ACTION_READ_ALL */ 3, buf, size); 517e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande if (read < 0) { 527e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGD("can't read logs - %d", read); 537e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande free(buf); 547e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande return helper.newByteArray(0).detach(); 557e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } else { 567e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGV("read %d bytes", read); 577e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } 587e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 597e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande if (read != size) { 607e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGV("read %d bytes, expecting %d", read, size); 617e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } 627e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 637e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande JNIObject<jbyteArray> result = helper.newByteArray(read); 647e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande if (result.isNull()) { 657e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande ALOGD("can't allocate array"); 667e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande free(buf); 677e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande return result.detach(); 687e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande } 697e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande 707e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande helper.setByteArrayRegion(result, 0, read, (jbyte*)buf); 717e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande free(buf); 727e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande return result.detach(); 737e0315140767e6f12200f7dbbe7aff43b4f75089Vinit Deshpande} 74bf3fe9cc00c04f1438ceee8dbb7f8c5568c1f804Prerepa Viswanadham 75155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// ---------------------------------------------------------------------------- 76155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 77155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* 78155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * JNI registration. 79155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 80155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandestatic JNINativeMethod gWifiMethods[] = { 81155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* name, signature, funcPtr */ 823dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline {"readKernelLogNative", "()[B", (void*)android_net_wifi_readKernelLog}, 83155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 84155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 85155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* User to register native functions */ 86155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeextern "C" 87155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandejint Java_com_android_server_wifi_WifiNative_registerNatives(JNIEnv* env, jclass clazz) { 8887a33d221f8f8dea7782023da2ee5d66453e37cbEtan Cohen // initialization needed for unit test APK 8987a33d221f8f8dea7782023da2ee5d66453e37cbEtan Cohen JniConstants::init(env); 9087a33d221f8f8dea7782023da2ee5d66453e37cbEtan Cohen 910d83625c25353c92c123f552939eea4b33074b60Mitchell Wills return jniRegisterNativeMethods(env, 92155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com/android/server/wifi/WifiNative", gWifiMethods, NELEM(gWifiMethods)); 93155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 94155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 95155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; // namespace android 96