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

Commit 3cab2906 authored by Chalard Jean's avatar Chalard Jean Committed by Xiao Ma
Browse files

Add a mechanism to pass the L2Key and group hint to IpClient

Test: IpClientTest
Change-Id: I399b20ce29a385a74971b7a7248a48cb4d66deb6
parent 4d71a578
Loading
Loading
Loading
Loading
+46 −0
Original line number Original line Diff line number Diff line
@@ -51,6 +51,7 @@ import android.os.SystemClock;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.LocalLog;
import android.util.LocalLog;
import android.util.Log;
import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
import android.util.SparseArray;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
@@ -298,6 +299,7 @@ public class IpClient extends StateMachine {
    private static final int EVENT_READ_PACKET_FILTER_COMPLETE    = 12;
    private static final int EVENT_READ_PACKET_FILTER_COMPLETE    = 12;
    private static final int CMD_ADD_KEEPALIVE_PACKET_FILTER_TO_APF = 13;
    private static final int CMD_ADD_KEEPALIVE_PACKET_FILTER_TO_APF = 13;
    private static final int CMD_REMOVE_KEEPALIVE_PACKET_FILTER_FROM_APF = 14;
    private static final int CMD_REMOVE_KEEPALIVE_PACKET_FILTER_FROM_APF = 14;
    private static final int CMD_UPDATE_L2KEY_GROUPHINT = 15;


    // Internal commands to use instead of trying to call transitionTo() inside
    // Internal commands to use instead of trying to call transitionTo() inside
    // a given State's enter() method. Calling transitionTo() from enter/exit
    // a given State's enter() method. Calling transitionTo() from enter/exit
@@ -364,6 +366,8 @@ public class IpClient extends StateMachine {
    private String mTcpBufferSizes;
    private String mTcpBufferSizes;
    private ProxyInfo mHttpProxy;
    private ProxyInfo mHttpProxy;
    private ApfFilter mApfFilter;
    private ApfFilter mApfFilter;
    private String mL2Key; // The L2 key for this network, for writing into the memory store
    private String mGroupHint; // The group hint for this network, for writing into the memory store
    private boolean mMulticastFiltering;
    private boolean mMulticastFiltering;
    private long mStartTimeMillis;
    private long mStartTimeMillis;


@@ -524,6 +528,11 @@ public class IpClient extends StateMachine {
            IpClient.this.stop();
            IpClient.this.stop();
        }
        }
        @Override
        @Override
        public void setL2KeyAndGroupHint(String l2Key, String groupHint) {
            checkNetworkStackCallingPermission();
            IpClient.this.setL2KeyAndGroupHint(l2Key, groupHint);
        }
        @Override
        public void setTcpBufferSizes(String tcpBufferSizes) {
        public void setTcpBufferSizes(String tcpBufferSizes) {
            checkNetworkStackCallingPermission();
            checkNetworkStackCallingPermission();
            IpClient.this.setTcpBufferSizes(tcpBufferSizes);
            IpClient.this.setTcpBufferSizes(tcpBufferSizes);
@@ -651,6 +660,13 @@ public class IpClient extends StateMachine {
        sendMessage(CMD_UPDATE_TCP_BUFFER_SIZES, tcpBufferSizes);
        sendMessage(CMD_UPDATE_TCP_BUFFER_SIZES, tcpBufferSizes);
    }
    }


    /**
     * Set the L2 key and group hint for storing info into the memory store.
     */
    public void setL2KeyAndGroupHint(String l2Key, String groupHint) {
        sendMessage(CMD_UPDATE_L2KEY_GROUPHINT, new Pair<>(l2Key, groupHint));
    }

    /**
    /**
     * Set the HTTP Proxy configuration to use.
     * Set the HTTP Proxy configuration to use.
     *
     *
@@ -1068,6 +1084,10 @@ public class IpClient extends StateMachine {
            return true;
            return true;
        }
        }
        final int delta = setLinkProperties(newLp);
        final int delta = setLinkProperties(newLp);
        // Most of the attributes stored in the memory store are deduced from
        // the link properties, therefore when the properties update the memory
        // store record should be updated too.
        maybeSaveNetworkToIpMemoryStore();
        if (sendCallbacks) {
        if (sendCallbacks) {
            dispatchCallback(delta, newLp);
            dispatchCallback(delta, newLp);
        }
        }
@@ -1083,6 +1103,7 @@ public class IpClient extends StateMachine {
            Log.d(mTag, "onNewDhcpResults(" + Objects.toString(dhcpResults) + ")");
            Log.d(mTag, "onNewDhcpResults(" + Objects.toString(dhcpResults) + ")");
        }
        }
        mCallback.onNewDhcpResults(dhcpResults);
        mCallback.onNewDhcpResults(dhcpResults);
        maybeSaveNetworkToIpMemoryStore();
        dispatchCallback(delta, newLp);
        dispatchCallback(delta, newLp);
    }
    }


@@ -1213,6 +1234,10 @@ public class IpClient extends StateMachine {
        mInterfaceCtrl.clearAllAddresses();
        mInterfaceCtrl.clearAllAddresses();
    }
    }


    private void maybeSaveNetworkToIpMemoryStore() {
        // TODO : implement this
    }

    class StoppedState extends State {
    class StoppedState extends State {
        @Override
        @Override
        public void enter() {
        public void enter() {
@@ -1258,6 +1283,13 @@ public class IpClient extends StateMachine {
                    handleLinkPropertiesUpdate(NO_CALLBACKS);
                    handleLinkPropertiesUpdate(NO_CALLBACKS);
                    break;
                    break;


                case CMD_UPDATE_L2KEY_GROUPHINT: {
                    final Pair<String, String> args = (Pair<String, String>) msg.obj;
                    mL2Key = args.first;
                    mGroupHint = args.second;
                    break;
                }

                case CMD_SET_MULTICAST_FILTER:
                case CMD_SET_MULTICAST_FILTER:
                    mMulticastFiltering = (boolean) msg.obj;
                    mMulticastFiltering = (boolean) msg.obj;
                    break;
                    break;
@@ -1357,6 +1389,20 @@ public class IpClient extends StateMachine {
                    }
                    }
                    break;
                    break;


                case CMD_UPDATE_L2KEY_GROUPHINT: {
                    final Pair<String, String> args = (Pair<String, String>) msg.obj;
                    mL2Key = args.first;
                    mGroupHint = args.second;
                    // TODO : attributes should be saved to the memory store with
                    // these new values if they differ from the previous ones.
                    // If the state machine is in pure StartedState, then the values to input
                    // are not known yet and should be updated when the LinkProperties are updated.
                    // If the state machine is in RunningState (which is a child of StartedState)
                    // then the next NUD check should be used to store the new values to avoid
                    // inputting current values for what may be a different L3 network.
                    break;
                }

                case EVENT_PROVISIONING_TIMEOUT:
                case EVENT_PROVISIONING_TIMEOUT:
                    handleProvisioningFailure();
                    handleProvisioningFailure();
                    break;
                    break;
+22 −0
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@ import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


import android.app.AlarmManager;
import android.app.AlarmManager;
@@ -40,7 +41,9 @@ import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.LinkProperties;
import android.net.MacAddress;
import android.net.MacAddress;
import android.net.NetworkStackIpMemoryStore;
import android.net.RouteInfo;
import android.net.RouteInfo;
import android.net.ipmemorystore.NetworkAttributes;
import android.net.shared.InitialConfiguration;
import android.net.shared.InitialConfiguration;
import android.net.shared.ProvisioningConfiguration;
import android.net.shared.ProvisioningConfiguration;
import android.net.util.InterfaceParams;
import android.net.util.InterfaceParams;
@@ -81,6 +84,8 @@ public class IpClientTest {
    // See RFC 7042#section-2.1.2 for EUI-48 documentation values.
    // See RFC 7042#section-2.1.2 for EUI-48 documentation values.
    private static final MacAddress TEST_MAC = MacAddress.fromString("00:00:5E:00:53:01");
    private static final MacAddress TEST_MAC = MacAddress.fromString("00:00:5E:00:53:01");
    private static final int TEST_TIMEOUT_MS = 400;
    private static final int TEST_TIMEOUT_MS = 400;
    private static final String TEST_L2KEY = "some l2key";
    private static final String TEST_GROUPHINT = "some grouphint";


    @Mock private Context mContext;
    @Mock private Context mContext;
    @Mock private ConnectivityManager mCm;
    @Mock private ConnectivityManager mCm;
@@ -92,6 +97,7 @@ public class IpClientTest {
    @Mock private IpClient.Dependencies mDependencies;
    @Mock private IpClient.Dependencies mDependencies;
    @Mock private ContentResolver mContentResolver;
    @Mock private ContentResolver mContentResolver;
    @Mock private NetworkStackService.NetworkStackServiceManager mNetworkStackServiceManager;
    @Mock private NetworkStackService.NetworkStackServiceManager mNetworkStackServiceManager;
    @Mock private NetworkStackIpMemoryStore mIpMemoryStore;


    private NetworkObserver mObserver;
    private NetworkObserver mObserver;
    private InterfaceParams mIfParams;
    private InterfaceParams mIfParams;
@@ -141,6 +147,12 @@ public class IpClientTest {
        return empty;
        return empty;
    }
    }


    private void verifyNetworkAttributesStored(final String l2Key,
            final NetworkAttributes attributes) {
        // TODO : when storing is implemented, turn this on
        // verify(mIpMemoryStore).storeNetworkAttributes(eq(l2Key), eq(attributes), any());
    }

    @Test
    @Test
    public void testNullInterfaceNameMostDefinitelyThrows() throws Exception {
    public void testNullInterfaceNameMostDefinitelyThrows() throws Exception {
        setTestInterfaceParams(null);
        setTestInterfaceParams(null);
@@ -173,6 +185,7 @@ public class IpClientTest {
        setTestInterfaceParams(TEST_IFNAME);
        setTestInterfaceParams(TEST_IFNAME);
        final IpClient ipc = new IpClient(mContext, TEST_IFNAME, mCb, mObserverRegistry,
        final IpClient ipc = new IpClient(mContext, TEST_IFNAME, mCb, mObserverRegistry,
                mNetworkStackServiceManager, mDependencies);
                mNetworkStackServiceManager, mDependencies);
        verifyNoMoreInteractions(mIpMemoryStore);
        ipc.shutdown();
        ipc.shutdown();
    }
    }


@@ -183,6 +196,7 @@ public class IpClientTest {
                mNetworkStackServiceManager, mDependencies);
                mNetworkStackServiceManager, mDependencies);
        ipc.startProvisioning(new ProvisioningConfiguration());
        ipc.startProvisioning(new ProvisioningConfiguration());
        verify(mCb, times(1)).onProvisioningFailure(any());
        verify(mCb, times(1)).onProvisioningFailure(any());
        verify(mIpMemoryStore, never()).storeNetworkAttributes(any(), any(), any());
        ipc.shutdown();
        ipc.shutdown();
    }
    }


@@ -202,6 +216,7 @@ public class IpClientTest {
        verify(mCb, times(1)).setNeighborDiscoveryOffload(true);
        verify(mCb, times(1)).setNeighborDiscoveryOffload(true);
        verify(mCb, timeout(TEST_TIMEOUT_MS).times(1)).setFallbackMulticastFilter(false);
        verify(mCb, timeout(TEST_TIMEOUT_MS).times(1)).setFallbackMulticastFilter(false);
        verify(mCb, never()).onProvisioningFailure(any());
        verify(mCb, never()).onProvisioningFailure(any());
        verify(mIpMemoryStore, never()).storeNetworkAttributes(any(), any(), any());


        ipc.shutdown();
        ipc.shutdown();
        verify(mNetd, timeout(TEST_TIMEOUT_MS).times(1)).interfaceSetEnableIPv6(iface, false);
        verify(mNetd, timeout(TEST_TIMEOUT_MS).times(1)).interfaceSetEnableIPv6(iface, false);
@@ -214,6 +229,8 @@ public class IpClientTest {
    public void testProvisioningWithInitialConfiguration() throws Exception {
    public void testProvisioningWithInitialConfiguration() throws Exception {
        final String iface = TEST_IFNAME;
        final String iface = TEST_IFNAME;
        final IpClient ipc = makeIpClient(iface);
        final IpClient ipc = makeIpClient(iface);
        final String l2Key = TEST_L2KEY;
        final String groupHint = TEST_GROUPHINT;


        String[] addresses = {
        String[] addresses = {
            "fe80::a4be:f92:e1f7:22d1/64",
            "fe80::a4be:f92:e1f7:22d1/64",
@@ -232,6 +249,7 @@ public class IpClientTest {
        verify(mCb, times(1)).setNeighborDiscoveryOffload(true);
        verify(mCb, times(1)).setNeighborDiscoveryOffload(true);
        verify(mCb, timeout(TEST_TIMEOUT_MS).times(1)).setFallbackMulticastFilter(false);
        verify(mCb, timeout(TEST_TIMEOUT_MS).times(1)).setFallbackMulticastFilter(false);
        verify(mCb, never()).onProvisioningFailure(any());
        verify(mCb, never()).onProvisioningFailure(any());
        ipc.setL2KeyAndGroupHint(l2Key, groupHint);


        for (String addr : addresses) {
        for (String addr : addresses) {
            String[] parts = addr.split("/");
            String[] parts = addr.split("/");
@@ -253,12 +271,16 @@ public class IpClientTest {
        LinkProperties want = linkproperties(links(addresses), routes(prefixes));
        LinkProperties want = linkproperties(links(addresses), routes(prefixes));
        want.setInterfaceName(iface);
        want.setInterfaceName(iface);
        verify(mCb, timeout(TEST_TIMEOUT_MS).times(1)).onProvisioningSuccess(want);
        verify(mCb, timeout(TEST_TIMEOUT_MS).times(1)).onProvisioningSuccess(want);
        verifyNetworkAttributesStored(l2Key, new NetworkAttributes.Builder()
                .setGroupHint(groupHint)
                .build());


        ipc.shutdown();
        ipc.shutdown();
        verify(mNetd, timeout(TEST_TIMEOUT_MS).times(1)).interfaceSetEnableIPv6(iface, false);
        verify(mNetd, timeout(TEST_TIMEOUT_MS).times(1)).interfaceSetEnableIPv6(iface, false);
        verify(mNetd, timeout(TEST_TIMEOUT_MS).times(1)).interfaceClearAddrs(iface);
        verify(mNetd, timeout(TEST_TIMEOUT_MS).times(1)).interfaceClearAddrs(iface);
        verify(mCb, timeout(TEST_TIMEOUT_MS).times(1))
        verify(mCb, timeout(TEST_TIMEOUT_MS).times(1))
                .onLinkPropertiesChange(makeEmptyLinkProperties(iface));
                .onLinkPropertiesChange(makeEmptyLinkProperties(iface));
        verifyNoMoreInteractions(mIpMemoryStore);
    }
    }


    @Test
    @Test
+1 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ oneway interface IIpClient {
    void shutdown();
    void shutdown();
    void startProvisioning(in ProvisioningConfigurationParcelable req);
    void startProvisioning(in ProvisioningConfigurationParcelable req);
    void stop();
    void stop();
    void setL2KeyAndGroupHint(in String l2Key, in String groupHint);
    void setTcpBufferSizes(in String tcpBufferSizes);
    void setTcpBufferSizes(in String tcpBufferSizes);
    void setHttpProxy(in ProxyInfo proxyInfo);
    void setHttpProxy(in ProxyInfo proxyInfo);
    void setMulticastFilter(boolean enabled);
    void setMulticastFilter(boolean enabled);