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

Commit 96c6d201 authored by Erik Kline's avatar Erik Kline Committed by android-build-merger
Browse files

Merge "Support registration of offload control callbacks." am: 7ee96625

am: 66cc06c2

Change-Id: Ieab0ae324ccf8ddfea02adfe647407df6c12b945
parents 255b69ac 66cc06c2
Loading
Loading
Loading
Loading
+14 −4
Original line number Original line Diff line number Diff line
@@ -52,6 +52,7 @@ import android.net.util.SharedLog;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager;
import android.os.Binder;
import android.os.Binder;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.INetworkManagementService;
import android.os.INetworkManagementService;
import android.os.Looper;
import android.os.Looper;
import android.os.Message;
import android.os.Message;
@@ -195,8 +196,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
        mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper);
        mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper);
        mTetherMasterSM.start();
        mTetherMasterSM.start();


        mOffloadController = new OffloadController(mTetherMasterSM.getHandler(),
        final Handler smHandler = mTetherMasterSM.getHandler();
                deps.getOffloadHardwareInterface(), mLog);
        mOffloadController = new OffloadController(smHandler,
                deps.getOffloadHardwareInterface(smHandler, mLog),
                mLog);
        mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(
        mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(
                mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK, mLog);
                mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK, mLog);
        mForwardedDownstreams = new HashSet<>();
        mForwardedDownstreams = new HashSet<>();
@@ -1083,7 +1086,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
        TetherMasterSM(String name, Looper looper) {
        TetherMasterSM(String name, Looper looper) {
            super(name, looper);
            super(name, looper);


            //Add states
            mInitialState = new InitialState();
            mInitialState = new InitialState();
            mTetherModeAliveState = new TetherModeAliveState();
            mTetherModeAliveState = new TetherModeAliveState();
            mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState();
            mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState();
@@ -1397,10 +1399,11 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering


                mSimChange.startListening();
                mSimChange.startListening();
                mUpstreamNetworkMonitor.start();
                mUpstreamNetworkMonitor.start();
                mOffloadController.start();


                // TODO: De-duplicate with updateUpstreamWanted() below.
                if (upstreamWanted()) {
                if (upstreamWanted()) {
                    mUpstreamWanted = true;
                    mUpstreamWanted = true;
                    mOffloadController.start();
                    chooseUpstreamType(true);
                    chooseUpstreamType(true);
                    mTryCell = false;
                    mTryCell = false;
                }
                }
@@ -1419,6 +1422,13 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
            private boolean updateUpstreamWanted() {
            private boolean updateUpstreamWanted() {
                final boolean previousUpstreamWanted = mUpstreamWanted;
                final boolean previousUpstreamWanted = mUpstreamWanted;
                mUpstreamWanted = upstreamWanted();
                mUpstreamWanted = upstreamWanted();
                if (mUpstreamWanted != previousUpstreamWanted) {
                    if (mUpstreamWanted) {
                        mOffloadController.start();
                    } else {
                        mOffloadController.stop();
                    }
                }
                return previousUpstreamWanted;
                return previousUpstreamWanted;
            }
            }


+20 −2
Original line number Original line Diff line number Diff line
@@ -49,12 +49,30 @@ public class OffloadController {
            mConfigInitialized = mHwInterface.initOffloadConfig();
            mConfigInitialized = mHwInterface.initOffloadConfig();
            if (!mConfigInitialized) {
            if (!mConfigInitialized) {
                mLog.i("tethering offload config not supported");
                mLog.i("tethering offload config not supported");
                stop();
                return;
                return;
            }
            }
        }
        }


        // TODO: Create and register ITetheringOffloadCallback.
        mControlInitialized = mHwInterface.initOffloadControl(
        mControlInitialized = mHwInterface.initOffloadControl();
                new OffloadHardwareInterface.ControlCallback() {
                    @Override
                    public void onOffloadEvent(int event) {
                        mLog.log("got offload event: " + event);
                    }

                    @Override
                    public void onNatTimeoutUpdate(int proto,
                                                   String srcAddr, int srcPort,
                                                   String dstAddr, int dstPort) {
                        mLog.log(String.format("NAT timeout update: %s (%s,%s) -> (%s,%s)",
                                proto, srcAddr, srcPort, dstAddr, dstPort));
                    }
                });
        if (!mControlInitialized) {
            mLog.i("tethering offload control not supported");
            stop();
        }
    }
    }


    public void stop() {
    public void stop() {
+80 −22
Original line number Original line Diff line number Diff line
@@ -17,9 +17,11 @@
package com.android.server.connectivity.tethering;
package com.android.server.connectivity.tethering;


import android.hardware.tetheroffload.control.V1_0.IOffloadControl;
import android.hardware.tetheroffload.control.V1_0.IOffloadControl;
import android.hardware.tetheroffload.control.V1_0.IOffloadControl.stopOffloadCallback;
import android.hardware.tetheroffload.control.V1_0.ITetheringOffloadCallback;
import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate;
import android.os.Handler;
import android.os.RemoteException;
import android.os.RemoteException;
import android.util.Log;
import android.net.util.SharedLog;




/**
/**
@@ -32,46 +34,102 @@ public class OffloadHardwareInterface {


    private static native boolean configOffload();
    private static native boolean configOffload();


    private final Handler mHandler;
    private final SharedLog mLog;
    private IOffloadControl mOffloadControl;
    private IOffloadControl mOffloadControl;
    private TetheringOffloadCallback mTetheringOffloadCallback;
    private ControlCallback mControlCallback;


    public OffloadHardwareInterface() {}
    public static class ControlCallback {
        public void onOffloadEvent(int event) {}

        public void onNatTimeoutUpdate(int proto,
                                       String srcAddr, int srcPort,
                                       String dstAddr, int dstPort) {}
    }

    public OffloadHardwareInterface(Handler h, SharedLog log) {
        mHandler = h;
        mLog = log.forSubComponent(TAG);
    }


    public boolean initOffloadConfig() {
    public boolean initOffloadConfig() {
        return configOffload();
        return configOffload();
    }
    }


    // TODO: Extend this to take a TetheringControlCallback for registration.
    public boolean initOffloadControl(ControlCallback controlCb) {
    public boolean initOffloadControl() {
        mControlCallback = controlCb;

        if (mOffloadControl == null) {
        if (mOffloadControl == null) {
            try {
            try {
                mOffloadControl = IOffloadControl.getService();
                mOffloadControl = IOffloadControl.getService();
            } catch (RemoteException e) {
            } catch (RemoteException e) {
                Log.d(TAG, "tethering offload control not supported: " + e);
                mLog.e("tethering offload control not supported: " + e);
                return false;
                return false;
            }
            }
        }
        }


        // TODO: call mOffloadControl.initOffload(...callback...);
        mTetheringOffloadCallback = new TetheringOffloadCallback(mHandler, mControlCallback);
        final CbResults results = new CbResults();
        try {
            mOffloadControl.initOffload(
                    mTetheringOffloadCallback,
                    (boolean success, String errMsg) -> {
                        results.success = success;
                        results.errMsg = errMsg;
                    });
        } catch (RemoteException e) {
            mLog.e("failed to initOffload: " + e);
            return false;
        }


        return true;
        if (!results.success) mLog.e("initOffload failed: " + results.errMsg);
        return results.success;
    }
    }


    public void stopOffloadControl() {
    public void stopOffloadControl() {
        if (mOffloadControl == null) return;
        if (mOffloadControl != null) {

            try {
            try {
            final stopOffloadCallback cb = new stopOffloadCallback() {
                mOffloadControl.stopOffload(
                        (boolean success, String errMsg) -> {
                            if (!success) mLog.e("stopOffload failed: " + errMsg);
                        });
            } catch (RemoteException e) {
                mLog.e("failed to stopOffload: " + e);
            }
        }
        mOffloadControl = null;
        mTetheringOffloadCallback = null;
        mControlCallback = null;
    }

    private static class TetheringOffloadCallback extends ITetheringOffloadCallback.Stub {
        public final Handler handler;
        public final ControlCallback controlCb;

        public TetheringOffloadCallback(Handler h, ControlCallback cb) {
            handler = h;
            controlCb = cb;
        }

        @Override
        @Override
                public void onValues(boolean success, String errMsg) {
        public void onEvent(int event) {
                    if (success) return;
            handler.post(() -> { controlCb.onOffloadEvent(event); });
        }


                    Log.e(TAG, "stopOffload failed: " + errMsg);
        @Override
        public void updateTimeout(NatTimeoutUpdate params) {
            handler.post(() -> {
                    controlCb.onNatTimeoutUpdate(
                        params.proto,
                        params.src.addr, params.src.port,
                        params.dst.addr, params.dst.port);
            });
        }
        }
            };
            mOffloadControl.stopOffload(cb);
        } catch (RemoteException e) {
            Log.d(TAG, "failed to stopOffload: " + e);
    }
    }
        mOffloadControl = null;

    private static class CbResults {
        boolean success;
        String errMsg;
    }
    }
}
}
+5 −2
Original line number Original line Diff line number Diff line
@@ -16,6 +16,9 @@


package com.android.server.connectivity.tethering;
package com.android.server.connectivity.tethering;


import android.os.Handler;
import android.net.util.SharedLog;



/**
/**
 * Capture tethering dependencies, for injection.
 * Capture tethering dependencies, for injection.
@@ -23,7 +26,7 @@ package com.android.server.connectivity.tethering;
 * @hide
 * @hide
 */
 */
public class TetheringDependencies {
public class TetheringDependencies {
    public OffloadHardwareInterface getOffloadHardwareInterface() {
    public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) {
        return new OffloadHardwareInterface();
        return new OffloadHardwareInterface(h, log);
    }
    }
}
}
+3 −2
Original line number Original line Diff line number Diff line
@@ -43,6 +43,7 @@ import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
import android.net.INetworkStatsService;
import android.net.InterfaceConfiguration;
import android.net.InterfaceConfiguration;
import android.net.NetworkRequest;
import android.net.NetworkRequest;
import android.net.util.SharedLog;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Handler;
@@ -142,8 +143,8 @@ public class TetheringTest {
        };
        };
        mServiceContext.registerReceiver(mBroadcastReceiver,
        mServiceContext.registerReceiver(mBroadcastReceiver,
                new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED));
                new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED));
        when(mTetheringDependencies.getOffloadHardwareInterface())
        when(mTetheringDependencies.getOffloadHardwareInterface(
                .thenReturn(mOffloadHardwareInterface);
                any(Handler.class), any(SharedLog.class))).thenReturn(mOffloadHardwareInterface);
        mTethering = new Tethering(mServiceContext, mNMService, mStatsService, mPolicyManager,
        mTethering = new Tethering(mServiceContext, mNMService, mStatsService, mPolicyManager,
                                   mLooper.getLooper(), mSystemProperties,
                                   mLooper.getLooper(), mSystemProperties,
                                   mTetheringDependencies);
                                   mTetheringDependencies);