Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ded23151 authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN
Browse files

Add NetworkStack app

The app is not started yet, and does not contain any service for now.

Test: built, booted
Bug: b/112869080
Change-Id: Id5a0fd02c891100e85d86b1040e53beec3581950
parents
Loading
Loading
Loading
Loading

Android.bp

0 → 100644
+38 −0
Original line number Diff line number Diff line
//
// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

// Library including the network stack, used to compile the network stack app, or linked into the
// system server on devices that run the stack there
java_library {
    name: "NetworkStackLib",
    installable: true,
    srcs: [
        "src/**/*.java",
    ],
}

// Updatable network stack packaged as an application
android_app {
    name: "NetworkStack",
    platform_apis: true,
    certificate: "platform",
    privileged: true,
    static_libs: [
        "NetworkStackLib"
    ],
    manifest: "AndroidManifest.xml",
}
 No newline at end of file

AndroidManifest.xml

0 → 100644
+38 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.google.android.networkstack"
          android:sharedUserId="android.uid.networkstack">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- Launch captive portal app as specific user -->
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
    <application
        android:label="NetworkStack"
        android:defaultToDeviceProtectedStorage="true"
        android:directBootAware="true"
        android:usesCleartextTraffic="true">
        <service android:name="com.android.server.NetworkStackService">
            <intent-filter>
                <action android:name="android.net.INetworkStackConnector"/>
            </intent-filter>
        </service>
    </application>
</manifest>
+74 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server;

import static android.os.Binder.getCallingUid;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Service;
import android.content.Intent;
import android.net.INetworkStackConnector;
import android.os.IBinder;
import android.os.Process;

import java.io.FileDescriptor;
import java.io.PrintWriter;

/**
 * Android service used to start the network stack when bound to via an intent.
 *
 * <p>The service returns a binder for the system server to communicate with the network stack.
 */
public class NetworkStackService extends Service {
    private static final String TAG = NetworkStackService.class.getSimpleName();

    /**
     * Create a binder connector for the system server to communicate with the network stack.
     *
     * <p>On platforms where the network stack runs in the system server process, this method may
     * be called directly instead of obtaining the connector by binding to the service.
     */
    public static IBinder makeConnector() {
        return new NetworkStackConnector();
    }

    @NonNull
    @Override
    public IBinder onBind(Intent intent) {
        return makeConnector();
    }

    private static class NetworkStackConnector extends INetworkStackConnector.Stub {
        // TODO: makeDhcpServer(), etc. will go here.

        @Override
        protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter fout,
                @Nullable String[] args) {
            checkCaller();
            fout.println("NetworkStack logs:");
            // TODO: dump logs here
        }
    }

    private static void checkCaller() {
        // TODO: check that the calling PID is the system server.
        if (getCallingUid() != Process.SYSTEM_UID && getCallingUid() != Process.ROOT_UID) {
            throw new SecurityException("Invalid caller: " + getCallingUid());
        }
    }
}