Merge "Add new method to update Layer2 information when L2 roaming happens." am: b844596d02 am: b652d668bc

Change-Id: I85eabccb6f5d5f322c8e3df556ceef6647616f5a
diff --git a/common/moduleutils/Android.bp b/common/moduleutils/Android.bp
index 81475d2..f32f8d8 100644
--- a/common/moduleutils/Android.bp
+++ b/common/moduleutils/Android.bp
@@ -23,6 +23,7 @@
         "src/android/net/util/SharedLog.java",
         "src/android/net/shared/InitialConfiguration.java",
         "src/android/net/shared/IpConfigurationParcelableUtil.java",
+        "src/android/net/shared/Layer2Information.java",
         "src/android/net/shared/LinkPropertiesParcelableUtil.java",
         "src/android/net/shared/ParcelableUtil.java",
         "src/android/net/shared/NetdUtils.java",
diff --git a/common/moduleutils/src/android/net/shared/Layer2Information.java b/common/moduleutils/src/android/net/shared/Layer2Information.java
new file mode 100644
index 0000000..77956a7
--- /dev/null
+++ b/common/moduleutils/src/android/net/shared/Layer2Information.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2020 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 android.net.shared;
+
+import android.net.Layer2InformationParcelable;
+import android.net.MacAddress;
+
+import java.util.Objects;
+
+/** @hide */
+public class Layer2Information {
+    private final String mL2Key;
+    private final String mGroupHint;
+    private final MacAddress mBssid;
+
+    /**
+     * Create a Layer2Information with the specified configuration.
+     */
+    public Layer2Information(String l2Key, String groupHint, MacAddress bssid) {
+        mL2Key = l2Key;
+        mGroupHint = groupHint;
+        mBssid = bssid;
+    }
+
+    @Override
+    public String toString() {
+        StringBuffer str = new StringBuffer();
+        str.append("L2Key: ").append(mL2Key);
+        str.append(", GroupHint: ").append(mGroupHint);
+        str.append(", bssid: ").append(mBssid.toString());
+        return str.toString();
+    }
+
+    /**
+     * Convert Layer2 Information to a {@link Layer2InformationParcelable}.
+     */
+    public Layer2InformationParcelable toStableParcelable() {
+        final Layer2InformationParcelable p = new Layer2InformationParcelable();
+        p.l2Key = mL2Key;
+        p.groupHint = mGroupHint;
+        p.bssid = mBssid;
+        return p;
+    }
+
+    /**
+     * Create an instance of {@link Layer2Information} based on the contents of the specified
+     * {@link Layer2InformationParcelable}.
+     */
+    public Layer2Information fromStableParcelable(Layer2InformationParcelable p) {
+        if (p == null) return null;
+        return new Layer2Information(p.l2Key, p.groupHint, p.bssid);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof Layer2Information)) return false;
+        final Layer2Information other = (Layer2Information) obj;
+        return Objects.equals(mL2Key, other.mL2Key)
+                && Objects.equals(mGroupHint, other.mGroupHint)
+                && Objects.equals(mBssid, other.mBssid);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mL2Key, mGroupHint, mBssid);
+    }
+}
diff --git a/common/networkstackclient/Android.bp b/common/networkstackclient/Android.bp
index 0965eb9..9081af4 100644
--- a/common/networkstackclient/Android.bp
+++ b/common/networkstackclient/Android.bp
@@ -62,6 +62,7 @@
         "src/android/net/INetworkStackStatusCallback.aidl",
         "src/android/net/InitialConfigurationParcelable.aidl",
         "src/android/net/InformationElementParcelable.aidl",
+        "src/android/net/Layer2InformationParcelable.aidl",
         "src/android/net/Layer2PacketParcelable.aidl",
         "src/android/net/NattKeepalivePacketDataParcelable.aidl",
         "src/android/net/PrivateDnsConfigParcel.aidl",
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2InformationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2InformationParcelable.aidl
new file mode 100644
index 0000000..c733188
--- /dev/null
+++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2InformationParcelable.aidl
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.net;
+parcelable Layer2InformationParcelable {
+  String l2Key;
+  String groupHint;
+  android.net.MacAddress bssid;
+}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClient.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClient.aidl
index 250f855..6c2d86b 100644
--- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClient.aidl
+++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClient.aidl
@@ -32,4 +32,5 @@
   oneway void setL2KeyAndGroupHint(in String l2Key, in String groupHint);
   oneway void addNattKeepalivePacketFilter(int slot, in android.net.NattKeepalivePacketDataParcelable pkt);
   oneway void notifyPreconnectionComplete(boolean success);
+  oneway void updateLayer2Information(in android.net.Layer2InformationParcelable info);
 }
diff --git a/common/networkstackclient/src/android/net/Layer2InformationParcelable.aidl b/common/networkstackclient/src/android/net/Layer2InformationParcelable.aidl
new file mode 100644
index 0000000..496d291
--- /dev/null
+++ b/common/networkstackclient/src/android/net/Layer2InformationParcelable.aidl
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2020 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 android.net;
+
+import android.net.MacAddress;
+
+parcelable Layer2InformationParcelable {
+    String l2Key;
+    String groupHint;
+    MacAddress bssid;
+}
diff --git a/common/networkstackclient/src/android/net/ip/IIpClient.aidl b/common/networkstackclient/src/android/net/ip/IIpClient.aidl
index ad94aee..0027949 100644
--- a/common/networkstackclient/src/android/net/ip/IIpClient.aidl
+++ b/common/networkstackclient/src/android/net/ip/IIpClient.aidl
@@ -15,6 +15,7 @@
  */
 package android.net.ip;
 
+import android.net.Layer2InformationParcelable;
 import android.net.ProxyInfo;
 import android.net.ProvisioningConfigurationParcelable;
 import android.net.NattKeepalivePacketDataParcelable;
@@ -36,4 +37,5 @@
     void setL2KeyAndGroupHint(in String l2Key, in String groupHint);
     void addNattKeepalivePacketFilter(int slot, in NattKeepalivePacketDataParcelable pkt);
     void notifyPreconnectionComplete(boolean success);
+    void updateLayer2Information(in Layer2InformationParcelable info);
 }
diff --git a/src/android/net/ip/IpClient.java b/src/android/net/ip/IpClient.java
index ebb31c6..bb5565d 100644
--- a/src/android/net/ip/IpClient.java
+++ b/src/android/net/ip/IpClient.java
@@ -28,6 +28,7 @@
 import android.net.DhcpResults;
 import android.net.INetd;
 import android.net.IpPrefix;
+import android.net.Layer2InformationParcelable;
 import android.net.Layer2PacketParcelable;
 import android.net.LinkAddress;
 import android.net.LinkProperties;
@@ -705,6 +706,12 @@
         }
 
         @Override
+        public void updateLayer2Information(Layer2InformationParcelable info) {
+            enforceNetworkStackCallingPermission();
+            IpClient.this.updateLayer2Information(info);
+        }
+
+        @Override
         public int getInterfaceVersion() {
             return this.VERSION;
         }
@@ -878,6 +885,13 @@
     }
 
     /**
+     * Update the network bssid, L2Key and GroupHint layer2 information.
+     */
+    public void updateLayer2Information(@NonNull Layer2InformationParcelable info) {
+        // TODO: add specific implementation.
+    }
+
+    /**
      * Dump logs of this IpClient.
      */
     public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {