1330e1089da80cddcd68758512370d217b19f8890Nathan Harold/*
2330e1089da80cddcd68758512370d217b19f8890Nathan Harold * Copyright (C) 2017 The Android Open Source Project
3330e1089da80cddcd68758512370d217b19f8890Nathan Harold *
4330e1089da80cddcd68758512370d217b19f8890Nathan Harold * Licensed under the Apache License, Version 2.0 (the "License");
5330e1089da80cddcd68758512370d217b19f8890Nathan Harold * you may not use this file except in compliance with the License.
6330e1089da80cddcd68758512370d217b19f8890Nathan Harold * You may obtain a copy of the License at
7330e1089da80cddcd68758512370d217b19f8890Nathan Harold *
8330e1089da80cddcd68758512370d217b19f8890Nathan Harold *      http://www.apache.org/licenses/LICENSE-2.0
9330e1089da80cddcd68758512370d217b19f8890Nathan Harold *
10330e1089da80cddcd68758512370d217b19f8890Nathan Harold * Unless required by applicable law or agreed to in writing, software
11330e1089da80cddcd68758512370d217b19f8890Nathan Harold * distributed under the License is distributed on an "AS IS" BASIS,
12330e1089da80cddcd68758512370d217b19f8890Nathan Harold * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13330e1089da80cddcd68758512370d217b19f8890Nathan Harold * See the License for the specific language governing permissions and
14330e1089da80cddcd68758512370d217b19f8890Nathan Harold * limitations under the License.
15330e1089da80cddcd68758512370d217b19f8890Nathan Harold */
16330e1089da80cddcd68758512370d217b19f8890Nathan Haroldpackage android.net;
17330e1089da80cddcd68758512370d217b19f8890Nathan Harold
18330e1089da80cddcd68758512370d217b19f8890Nathan Haroldimport android.os.Parcel;
19330e1089da80cddcd68758512370d217b19f8890Nathan Haroldimport android.os.Parcelable;
20a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
21a10003d5de52339f4d30fedd7294941378e5f13cNathan Haroldimport com.android.internal.annotations.VisibleForTesting;
22330e1089da80cddcd68758512370d217b19f8890Nathan Harold
23c61b70d12d23da97013ee5e44f101609215d1bffJonathan Basseri/**
24c61b70d12d23da97013ee5e44f101609215d1bffJonathan Basseri * This class encapsulates all the configuration parameters needed to create IPsec transforms and
25c61b70d12d23da97013ee5e44f101609215d1bffJonathan Basseri * policies.
26c61b70d12d23da97013ee5e44f101609215d1bffJonathan Basseri *
27c61b70d12d23da97013ee5e44f101609215d1bffJonathan Basseri * @hide
28c61b70d12d23da97013ee5e44f101609215d1bffJonathan Basseri */
29330e1089da80cddcd68758512370d217b19f8890Nathan Haroldpublic final class IpSecConfig implements Parcelable {
3093962f34ce21f5aac825afbcebf2f3e8c7a30910Nathan Harold    private static final String TAG = "IpSecConfig";
31330e1089da80cddcd68758512370d217b19f8890Nathan Harold
32a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    // MODE_TRANSPORT or MODE_TUNNEL
33a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    private int mMode = IpSecTransform.MODE_TRANSPORT;
34330e1089da80cddcd68758512370d217b19f8890Nathan Harold
35a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    // Preventing this from being null simplifies Java->Native binder
36a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    private String mSourceAddress = "";
37330e1089da80cddcd68758512370d217b19f8890Nathan Harold
38a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    // Preventing this from being null simplifies Java->Native binder
39a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    private String mDestinationAddress = "";
40330e1089da80cddcd68758512370d217b19f8890Nathan Harold
41d6f50b260d60ca2b7e1e547fe6b4a2592652b2f7Nathan Harold    // The underlying Network that represents the "gateway" Network
42a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    // for outbound packets. It may also be used to select packets.
43a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    private Network mNetwork;
44330e1089da80cddcd68758512370d217b19f8890Nathan Harold
45a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    // Minimum requirements for identifying a transform
46a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    // SPI identifying the IPsec SA in packet processing
47a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    // and a destination IP address
48a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    private int mSpiResourceId = IpSecManager.INVALID_RESOURCE_ID;
49a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold
50a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    // Encryption Algorithm
51a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    private IpSecAlgorithm mEncryption;
52a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold
53a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    // Authentication Algorithm
54a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    private IpSecAlgorithm mAuthentication;
55330e1089da80cddcd68758512370d217b19f8890Nathan Harold
56a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    // Authenticated Encryption Algorithm
57a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    private IpSecAlgorithm mAuthenticatedEncryption;
58330e1089da80cddcd68758512370d217b19f8890Nathan Harold
59330e1089da80cddcd68758512370d217b19f8890Nathan Harold    // For tunnel mode IPv4 UDP Encapsulation
60330e1089da80cddcd68758512370d217b19f8890Nathan Harold    // IpSecTransform#ENCAP_ESP_*, such as ENCAP_ESP_OVER_UDP_IKE
61a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    private int mEncapType = IpSecTransform.ENCAP_NONE;
62a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    private int mEncapSocketResourceId = IpSecManager.INVALID_RESOURCE_ID;
63a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    private int mEncapRemotePort;
64330e1089da80cddcd68758512370d217b19f8890Nathan Harold
65330e1089da80cddcd68758512370d217b19f8890Nathan Harold    // An interval, in seconds between the NattKeepalive packets
66a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    private int mNattKeepaliveInterval;
67a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
680b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    // XFRM mark and mask
690b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    private int mMarkValue;
700b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    private int mMarkMask;
710b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu
72a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    /** Set the mode for this IPsec transform */
73a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    public void setMode(int mode) {
74a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mMode = mode;
75a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
76a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
77a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    /** Set the source IP addres for this IPsec transform */
78a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public void setSourceAddress(String sourceAddress) {
79a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mSourceAddress = sourceAddress;
80a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
81a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
82a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    /** Set the destination IP address for this IPsec transform */
83a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public void setDestinationAddress(String destinationAddress) {
84a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mDestinationAddress = destinationAddress;
85a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
86a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
87a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    /** Set the SPI by resource ID */
88a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public void setSpiResourceId(int resourceId) {
89a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mSpiResourceId = resourceId;
90a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
91a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
92a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    /** Set the encryption algorithm */
93a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public void setEncryption(IpSecAlgorithm encryption) {
94a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mEncryption = encryption;
95a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
96a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
97a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    /** Set the authentication algorithm */
98a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public void setAuthentication(IpSecAlgorithm authentication) {
99a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mAuthentication = authentication;
100a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
101a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
102a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    /** Set the authenticated encryption algorithm */
103a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public void setAuthenticatedEncryption(IpSecAlgorithm authenticatedEncryption) {
104a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mAuthenticatedEncryption = authenticatedEncryption;
1050febe5ece542cf16bc680e72d1484a3f603a18e0Benedict Wong    }
1060febe5ece542cf16bc680e72d1484a3f603a18e0Benedict Wong
107a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    /** Set the underlying network that will carry traffic for this transform */
108a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    public void setNetwork(Network network) {
109a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mNetwork = network;
110a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
111a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
112a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    public void setEncapType(int encapType) {
113a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mEncapType = encapType;
114a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
115a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
116a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    public void setEncapSocketResourceId(int resourceId) {
117a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mEncapSocketResourceId = resourceId;
118a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
119a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
120a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    public void setEncapRemotePort(int port) {
121a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mEncapRemotePort = port;
122a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
123a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
124a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    public void setNattKeepaliveInterval(int interval) {
125a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mNattKeepaliveInterval = interval;
126a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    }
127330e1089da80cddcd68758512370d217b19f8890Nathan Harold
1280b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    public void setMarkValue(int mark) {
1290b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu        mMarkValue = mark;
1300b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    }
1310b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu
1320b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    public void setMarkMask(int mask) {
1330b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu        mMarkMask = mask;
1340b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    }
1350b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu
13693962f34ce21f5aac825afbcebf2f3e8c7a30910Nathan Harold    // Transport or Tunnel
13793962f34ce21f5aac825afbcebf2f3e8c7a30910Nathan Harold    public int getMode() {
138a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        return mMode;
13993962f34ce21f5aac825afbcebf2f3e8c7a30910Nathan Harold    }
14093962f34ce21f5aac825afbcebf2f3e8c7a30910Nathan Harold
141a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public String getSourceAddress() {
142a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        return mSourceAddress;
143330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
144330e1089da80cddcd68758512370d217b19f8890Nathan Harold
145a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public int getSpiResourceId() {
146a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        return mSpiResourceId;
147330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
148330e1089da80cddcd68758512370d217b19f8890Nathan Harold
149a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public String getDestinationAddress() {
150a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        return mDestinationAddress;
151330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
152330e1089da80cddcd68758512370d217b19f8890Nathan Harold
153a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public IpSecAlgorithm getEncryption() {
154a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        return mEncryption;
155330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
156330e1089da80cddcd68758512370d217b19f8890Nathan Harold
157a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public IpSecAlgorithm getAuthentication() {
158a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        return mAuthentication;
159330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
160330e1089da80cddcd68758512370d217b19f8890Nathan Harold
161a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold    public IpSecAlgorithm getAuthenticatedEncryption() {
162a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        return mAuthenticatedEncryption;
1630febe5ece542cf16bc680e72d1484a3f603a18e0Benedict Wong    }
1640febe5ece542cf16bc680e72d1484a3f603a18e0Benedict Wong
16593962f34ce21f5aac825afbcebf2f3e8c7a30910Nathan Harold    public Network getNetwork() {
166a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        return mNetwork;
167330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
168330e1089da80cddcd68758512370d217b19f8890Nathan Harold
169330e1089da80cddcd68758512370d217b19f8890Nathan Harold    public int getEncapType() {
170a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        return mEncapType;
171330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
172330e1089da80cddcd68758512370d217b19f8890Nathan Harold
173a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    public int getEncapSocketResourceId() {
174a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        return mEncapSocketResourceId;
175330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
176330e1089da80cddcd68758512370d217b19f8890Nathan Harold
177330e1089da80cddcd68758512370d217b19f8890Nathan Harold    public int getEncapRemotePort() {
178a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        return mEncapRemotePort;
179330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
180330e1089da80cddcd68758512370d217b19f8890Nathan Harold
18193962f34ce21f5aac825afbcebf2f3e8c7a30910Nathan Harold    public int getNattKeepaliveInterval() {
182a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        return mNattKeepaliveInterval;
183330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
184330e1089da80cddcd68758512370d217b19f8890Nathan Harold
1850b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    public int getMarkValue() {
1860b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu        return mMarkValue;
1870b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    }
1880b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu
1890b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    public int getMarkMask() {
1900b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu        return mMarkMask;
1910b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu    }
1920b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu
193330e1089da80cddcd68758512370d217b19f8890Nathan Harold    // Parcelable Methods
194330e1089da80cddcd68758512370d217b19f8890Nathan Harold
195330e1089da80cddcd68758512370d217b19f8890Nathan Harold    @Override
196330e1089da80cddcd68758512370d217b19f8890Nathan Harold    public int describeContents() {
197330e1089da80cddcd68758512370d217b19f8890Nathan Harold        return 0;
198330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
199330e1089da80cddcd68758512370d217b19f8890Nathan Harold
200330e1089da80cddcd68758512370d217b19f8890Nathan Harold    @Override
201330e1089da80cddcd68758512370d217b19f8890Nathan Harold    public void writeToParcel(Parcel out, int flags) {
202a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        out.writeInt(mMode);
203a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        out.writeString(mSourceAddress);
204a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        out.writeString(mDestinationAddress);
205a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        out.writeParcelable(mNetwork, flags);
206a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        out.writeInt(mSpiResourceId);
207a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        out.writeParcelable(mEncryption, flags);
208a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        out.writeParcelable(mAuthentication, flags);
209a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        out.writeParcelable(mAuthenticatedEncryption, flags);
210a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        out.writeInt(mEncapType);
211a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        out.writeInt(mEncapSocketResourceId);
212a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        out.writeInt(mEncapRemotePort);
21319ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold        out.writeInt(mNattKeepaliveInterval);
2140b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu        out.writeInt(mMarkValue);
2150b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu        out.writeInt(mMarkMask);
216330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
217330e1089da80cddcd68758512370d217b19f8890Nathan Harold
218a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    @VisibleForTesting
219a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold    public IpSecConfig() {}
220a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold
2219dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong    /** Copy constructor */
2229dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong    @VisibleForTesting
2239dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong    public IpSecConfig(IpSecConfig c) {
2249dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mMode = c.mMode;
2259dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mSourceAddress = c.mSourceAddress;
2269dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mDestinationAddress = c.mDestinationAddress;
2279dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mNetwork = c.mNetwork;
2289dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mSpiResourceId = c.mSpiResourceId;
2299dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mEncryption = c.mEncryption;
2309dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mAuthentication = c.mAuthentication;
2319dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mAuthenticatedEncryption = c.mAuthenticatedEncryption;
2329dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mEncapType = c.mEncapType;
2339dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mEncapSocketResourceId = c.mEncapSocketResourceId;
2349dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mEncapRemotePort = c.mEncapRemotePort;
2359dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mNattKeepaliveInterval = c.mNattKeepaliveInterval;
2369dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mMarkValue = c.mMarkValue;
2379dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong        mMarkMask = c.mMarkMask;
2389dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong    }
2399dd3a385279403ff94dd07b052424da3acd3a1f4Benedict Wong
240330e1089da80cddcd68758512370d217b19f8890Nathan Harold    private IpSecConfig(Parcel in) {
241a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mMode = in.readInt();
242a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mSourceAddress = in.readString();
243a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mDestinationAddress = in.readString();
244a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mNetwork = (Network) in.readParcelable(Network.class.getClassLoader());
245a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mSpiResourceId = in.readInt();
246a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mEncryption =
247330e1089da80cddcd68758512370d217b19f8890Nathan Harold                (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
248a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mAuthentication =
249330e1089da80cddcd68758512370d217b19f8890Nathan Harold                (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
250a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold        mAuthenticatedEncryption =
2510febe5ece542cf16bc680e72d1484a3f603a18e0Benedict Wong                (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
252a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mEncapType = in.readInt();
253a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mEncapSocketResourceId = in.readInt();
254a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold        mEncapRemotePort = in.readInt();
25519ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold        mNattKeepaliveInterval = in.readInt();
2560b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu        mMarkValue = in.readInt();
2570b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu        mMarkMask = in.readInt();
258330e1089da80cddcd68758512370d217b19f8890Nathan Harold    }
259330e1089da80cddcd68758512370d217b19f8890Nathan Harold
260b0c95b19ab4384bfc7141abfe3840736d52b4a44ludi    @Override
261b0c95b19ab4384bfc7141abfe3840736d52b4a44ludi    public String toString() {
262b0c95b19ab4384bfc7141abfe3840736d52b4a44ludi        StringBuilder strBuilder = new StringBuilder();
263b0c95b19ab4384bfc7141abfe3840736d52b4a44ludi        strBuilder
264a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append("{mMode=")
265a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(mMode == IpSecTransform.MODE_TUNNEL ? "TUNNEL" : "TRANSPORT")
266a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(", mSourceAddress=")
267a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(mSourceAddress)
268a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(", mDestinationAddress=")
269a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(mDestinationAddress)
270a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(", mNetwork=")
271a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(mNetwork)
272a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(", mEncapType=")
273a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(mEncapType)
274a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(", mEncapSocketResourceId=")
275a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(mEncapSocketResourceId)
276a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(", mEncapRemotePort=")
277a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(mEncapRemotePort)
278a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(", mNattKeepaliveInterval=")
279a10003d5de52339f4d30fedd7294941378e5f13cNathan Harold                .append(mNattKeepaliveInterval)
280a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append("{mSpiResourceId=")
281a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(mSpiResourceId)
282a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(", mEncryption=")
283a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(mEncryption)
284a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(", mAuthentication=")
285a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(mAuthentication)
286a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(", mAuthenticatedEncryption=")
287a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                .append(mAuthenticatedEncryption)
2880b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu                .append(", mMarkValue=")
2890b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu                .append(mMarkValue)
2900b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu                .append(", mMarkMask=")
2910b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu                .append(mMarkMask)
292b0c95b19ab4384bfc7141abfe3840736d52b4a44ludi                .append("}");
293b0c95b19ab4384bfc7141abfe3840736d52b4a44ludi
294b0c95b19ab4384bfc7141abfe3840736d52b4a44ludi        return strBuilder.toString();
295b0c95b19ab4384bfc7141abfe3840736d52b4a44ludi    }
296b0c95b19ab4384bfc7141abfe3840736d52b4a44ludi
297330e1089da80cddcd68758512370d217b19f8890Nathan Harold    public static final Parcelable.Creator<IpSecConfig> CREATOR =
298330e1089da80cddcd68758512370d217b19f8890Nathan Harold            new Parcelable.Creator<IpSecConfig>() {
299330e1089da80cddcd68758512370d217b19f8890Nathan Harold                public IpSecConfig createFromParcel(Parcel in) {
300330e1089da80cddcd68758512370d217b19f8890Nathan Harold                    return new IpSecConfig(in);
301330e1089da80cddcd68758512370d217b19f8890Nathan Harold                }
302330e1089da80cddcd68758512370d217b19f8890Nathan Harold
303330e1089da80cddcd68758512370d217b19f8890Nathan Harold                public IpSecConfig[] newArray(int size) {
304330e1089da80cddcd68758512370d217b19f8890Nathan Harold                    return new IpSecConfig[size];
305330e1089da80cddcd68758512370d217b19f8890Nathan Harold                }
306330e1089da80cddcd68758512370d217b19f8890Nathan Harold            };
30719ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold
30819ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold    @VisibleForTesting
309d6f50b260d60ca2b7e1e547fe6b4a2592652b2f7Nathan Harold    /** Equals method used for testing */
31019ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold    public static boolean equals(IpSecConfig lhs, IpSecConfig rhs) {
31119ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold        if (lhs == null || rhs == null) return (lhs == rhs);
31219ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold        return (lhs.mMode == rhs.mMode
313a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                && lhs.mSourceAddress.equals(rhs.mSourceAddress)
314a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                && lhs.mDestinationAddress.equals(rhs.mDestinationAddress)
31519ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold                && ((lhs.mNetwork != null && lhs.mNetwork.equals(rhs.mNetwork))
31619ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold                        || (lhs.mNetwork == rhs.mNetwork))
31719ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold                && lhs.mEncapType == rhs.mEncapType
31819ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold                && lhs.mEncapSocketResourceId == rhs.mEncapSocketResourceId
31919ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold                && lhs.mEncapRemotePort == rhs.mEncapRemotePort
32019ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold                && lhs.mNattKeepaliveInterval == rhs.mNattKeepaliveInterval
321a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                && lhs.mSpiResourceId == rhs.mSpiResourceId
322a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                && IpSecAlgorithm.equals(lhs.mEncryption, rhs.mEncryption)
323a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                && IpSecAlgorithm.equals(
324a25233123b2d29fde83dd686f6313f0a232c5b2aNathan Harold                        lhs.mAuthenticatedEncryption, rhs.mAuthenticatedEncryption)
3250b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu                && IpSecAlgorithm.equals(lhs.mAuthentication, rhs.mAuthentication)
3260b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu                && lhs.mMarkValue == rhs.mMarkValue
3270b611f496e9dd6be62419d8cd7f2d164efefad1cDi Lu                && lhs.mMarkMask == rhs.mMarkMask);
32819ce70b089310bc4ecb193b728e2ea7d3471ba20Nathan Harold    }
329330e1089da80cddcd68758512370d217b19f8890Nathan Harold}
330