Merge "Add dump info to IpSecService" am: ec5fc4872e
am: 3f3c4f6da4

Change-Id: Iaa81bf94573f06dc2dbd00e30df283c0ce7a7a76
diff --git a/core/java/android/net/IpSecAlgorithm.java b/core/java/android/net/IpSecAlgorithm.java
index 48b095d..5ae3400 100644
--- a/core/java/android/net/IpSecAlgorithm.java
+++ b/core/java/android/net/IpSecAlgorithm.java
@@ -16,8 +16,10 @@
 package android.net;
 
 import android.annotation.StringDef;
+import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
+import com.android.internal.util.HexDump;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -182,4 +184,17 @@
                 return false;
         }
     }
+
+    @Override
+    public String toString() {
+        return new StringBuilder()
+                .append("{mName=")
+                .append(mName)
+                .append(", mKey=")
+                .append(Build.IS_DEBUGGABLE ? HexDump.toHexString(mKey) : "<hidden>")
+                .append(", mTruncLenBits=")
+                .append(mTruncLenBits)
+                .append("}")
+                .toString();
+    }
 };
diff --git a/core/java/android/net/IpSecConfig.java b/core/java/android/net/IpSecConfig.java
index 8b80f2b..5a5c740 100644
--- a/core/java/android/net/IpSecConfig.java
+++ b/core/java/android/net/IpSecConfig.java
@@ -47,9 +47,22 @@
 
         // Authentication Algorithm
         IpSecAlgorithm authentication;
+
+        @Override
+        public String toString() {
+            return new StringBuilder()
+                    .append("{spiResourceId=")
+                    .append(spiResourceId)
+                    .append(", encryption=")
+                    .append(encryption)
+                    .append(", authentication=")
+                    .append(authentication)
+                    .append("}")
+                    .toString();
+        }
     }
 
-    Flow[] flow = new Flow[] {new Flow(), new Flow()};
+    final Flow[] flow = new Flow[] {new Flow(), new Flow()};
 
     // For tunnel mode IPv4 UDP Encapsulation
     // IpSecTransform#ENCAP_ESP_*, such as ENCAP_ESP_OVER_UDP_IKE
@@ -166,6 +179,35 @@
         encapRemotePort = in.readInt();
     }
 
+    @Override
+    public String toString() {
+        StringBuilder strBuilder = new StringBuilder();
+        strBuilder
+                .append("{mode=")
+                .append(mode == IpSecTransform.MODE_TUNNEL ? "TUNNEL" : "TRANSPORT")
+                .append(", localAddress=")
+                .append(localAddress)
+                .append(", remoteAddress=")
+                .append(remoteAddress)
+                .append(", network=")
+                .append(network)
+                .append(", encapType=")
+                .append(encapType)
+                .append(", encapLocalPortResourceId=")
+                .append(encapLocalPortResourceId)
+                .append(", encapRemotePort=")
+                .append(encapRemotePort)
+                .append(", nattKeepaliveInterval=")
+                .append(nattKeepaliveInterval)
+                .append(", flow[OUT]=")
+                .append(flow[IpSecTransform.DIRECTION_OUT])
+                .append(", flow[IN]=")
+                .append(flow[IpSecTransform.DIRECTION_IN])
+                .append("}");
+
+        return strBuilder.toString();
+    }
+
     public static final Parcelable.Creator<IpSecConfig> CREATOR =
             new Parcelable.Creator<IpSecConfig>() {
                 public IpSecConfig createFromParcel(Parcel in) {
diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java
index 8e3a612..cfbac58b 100644
--- a/core/java/android/net/IpSecTransform.java
+++ b/core/java/android/net/IpSecTransform.java
@@ -67,10 +67,10 @@
     public @interface TransformDirection {}
 
     /** @hide */
-    private static final int MODE_TUNNEL = 0;
+    public static final int MODE_TUNNEL = 0;
 
     /** @hide */
-    private static final int MODE_TRANSPORT = 1;
+    public static final int MODE_TRANSPORT = 1;
 
     /** @hide */
     public static final int ENCAP_NONE = 0;
diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java
index f72cbc9..3fec6ad 100644
--- a/services/core/java/com/android/server/IpSecService.java
+++ b/services/core/java/com/android/server/IpSecService.java
@@ -214,6 +214,21 @@
          * <p>Calls to this are always guarded by IpSecService#this
          */
         protected abstract void releaseResources() throws RemoteException;
+
+        @Override
+        public String toString() {
+            return new StringBuilder()
+                    .append("{mResourceId=")
+                    .append(mResourceId)
+                    .append(", pid=")
+                    .append(pid)
+                    .append(", uid=")
+                    .append(uid)
+                    .append(", mReferenceCount=")
+                    .append(mReferenceCount.get())
+                    .append("}")
+                    .toString();
+        }
     };
 
     /**
@@ -240,6 +255,11 @@
         void remove(int key) {
             mArray.remove(key);
         }
+
+        @Override
+        public String toString() {
+            return mArray.toString();
+        }
     }
 
     private final class TransformRecord extends ManagedResource {
@@ -309,6 +329,24 @@
                 mSocket.removeReference();
             }
         }
+
+        @Override
+        public String toString() {
+            StringBuilder strBuilder = new StringBuilder();
+            strBuilder
+                    .append("{super=")
+                    .append(super.toString())
+                    .append(", mSocket=")
+                    .append(mSocket)
+                    .append(", mSpis[OUT].mResourceId=")
+                    .append(mSpis[IpSecTransform.DIRECTION_OUT].mResourceId)
+                    .append(", mSpis[IN].mResourceId=")
+                    .append(mSpis[IpSecTransform.DIRECTION_IN].mResourceId)
+                    .append(", mConfig=")
+                    .append(mConfig)
+                    .append("}");
+            return strBuilder.toString();
+        }
     }
 
     private final class SpiRecord extends ManagedResource {
@@ -372,6 +410,26 @@
 
             mOwnedByTransform = true;
         }
+
+        @Override
+        public String toString() {
+            StringBuilder strBuilder = new StringBuilder();
+            strBuilder
+                    .append("{super=")
+                    .append(super.toString())
+                    .append(", mSpi=")
+                    .append(mSpi)
+                    .append(", mDirection=")
+                    .append(mDirection)
+                    .append(", mLocalAddress=")
+                    .append(mLocalAddress)
+                    .append(", mRemoteAddress=")
+                    .append(mRemoteAddress)
+                    .append(", mOwnedByTransform=")
+                    .append(mOwnedByTransform)
+                    .append("}");
+            return strBuilder.toString();
+        }
     }
 
     private final class UdpSocketRecord extends ManagedResource {
@@ -399,6 +457,19 @@
         public FileDescriptor getSocket() {
             return mSocket;
         }
+
+        @Override
+        public String toString() {
+            return new StringBuilder()
+                    .append("{super=")
+                    .append(super.toString())
+                    .append(", mSocket=")
+                    .append(mSocket)
+                    .append(", mPort=")
+                    .append(mPort)
+                    .append("}")
+                    .toString();
+        }
     }
 
     /**
@@ -734,11 +805,18 @@
     }
 
     @Override
-    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+    protected synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         mContext.enforceCallingOrSelfPermission(DUMP, TAG);
-        // TODO: Add dump code to print out a log of all the resources being tracked
-        pw.println("IpSecService Log:");
+
+        pw.println("IpSecService dump:");
         pw.println("NetdNativeService Connection: " + (isNetdAlive() ? "alive" : "dead"));
         pw.println();
+
+        pw.println("mTransformRecords:");
+        pw.println(mTransformRecords);
+        pw.println("mUdpSocketRecords:");
+        pw.println(mUdpSocketRecords);
+        pw.println("mSpiRecords:");
+        pw.println(mSpiRecords);
     }
 }