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