198a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall/*
298a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall * Copyright 2011, The Android Open Source Project
398a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall *
498a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall * Licensed under the Apache License, Version 2.0 (the "License");
598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall * you may not use this file except in compliance with the License.
698a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall * You may obtain a copy of the License at
798a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall *
898a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall *     http://www.apache.org/licenses/LICENSE-2.0
998a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall *
1098a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall * Unless required by applicable law or agreed to in writing, software
1198a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall * distributed under the License is distributed on an "AS IS" BASIS,
1298a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall * See the License for the specific language governing permissions and
1498a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall * limitations under the License.
1598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall */
1698a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
1798a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall#define LOG_TAG "NMST_QTagUidNative"
1898a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall#include <utils/Log.h>
1998a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
2098a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall#include "JNIHelp.h"
2198a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
2298a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall#include "jni.h"
2398a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall#include <utils/misc.h>
2498a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall#include <cutils/qtaguid.h>
2598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
2698a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall#include <errno.h>
2798a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall#include <fcntl.h>
2898a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall#include <sys/types.h>
2998a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall#include <sys/socket.h>
3098a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
3198a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrallnamespace android {
3298a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
3398a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrallstatic jint QTagUid_tagSocketFd(JNIEnv* env, jclass,
3498a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall                                jobject fileDescriptor,
3598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall                                jint tagNum, jint uid) {
3698a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor);
3798a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
3898a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  if (env->ExceptionOccurred() != NULL) {
393762c311729fe9f3af085c14c5c1fb471d994c03Steve Block    ALOGE("Can't get FileDescriptor num");
4098a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall    return (jint)-1;
4198a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  }
4298a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
4398a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  int res = qtaguid_tagSocket(userFd, tagNum, uid);
4498a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  if (res < 0) {
4598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall    return (jint)-errno;
4698a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  }
4798a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  return (jint)res;
4898a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall}
4998a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
50f5df700e6ce056ebfa322314d970e52d6facc35aAshok Bhatstatic jint QTagUid_untagSocketFd(JNIEnv* env, jclass,
51f5df700e6ce056ebfa322314d970e52d6facc35aAshok Bhat                                  jobject fileDescriptor) {
5298a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor);
5398a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
5498a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  if (env->ExceptionOccurred() != NULL) {
553762c311729fe9f3af085c14c5c1fb471d994c03Steve Block    ALOGE("Can't get FileDescriptor num");
5698a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall    return (jint)-1;
5798a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  }
5898a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
5998a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  int res = qtaguid_untagSocket(userFd);
6098a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  if (res < 0) {
6198a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall    return (jint)-errno;
6298a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  }
6398a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  return (jint)res;
6498a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall}
6598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
6698a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrallstatic jint QTagUid_setCounterSet(JNIEnv* env, jclass,
6798a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall                                  jint setNum, jint uid) {
6898a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
6998a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  int res = qtaguid_setCounterSet(setNum, uid);
7098a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  if (res < 0) {
7198a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall    return (jint)-errno;
7298a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  }
7398a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  return (jint)res;
7498a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall}
7598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
7698a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrallstatic jint QTagUid_deleteTagData(JNIEnv* env, jclass,
7798a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall                                  jint tagNum, jint uid) {
7898a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
7998a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  int res = qtaguid_deleteTagData(tagNum, uid);
8098a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  if (res < 0) {
8198a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall    return (jint)-errno;
8298a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  }
8398a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  return (jint)res;
8498a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall}
8598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
8698a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrallstatic JNINativeMethod gQTagUidMethods[] = {
8798a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  { "native_tagSocketFd", "(Ljava/io/FileDescriptor;II)I", (void*)QTagUid_tagSocketFd},
8898a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  { "native_untagSocketFd", "(Ljava/io/FileDescriptor;)I", (void*)QTagUid_untagSocketFd},
8998a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  { "native_setCounterSet", "(II)I", (void*)QTagUid_setCounterSet},
9098a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  { "native_deleteTagData", "(II)I", (void*)QTagUid_deleteTagData},
9198a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall};
9298a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
9398a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrallint register_android_server_NetworkManagementSocketTagger(JNIEnv* env) {
9498a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall  return jniRegisterNativeMethods(env, "com/android/server/NetworkManagementSocketTagger", gQTagUidMethods, NELEM(gQTagUidMethods));
9598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall}
9698a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall
9798a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall};
98