/*
 * Copyright (C) 2019 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.ResolverExperimentalOptionsParcel;

/**
 * Configuration for a resolver parameters.
 *
 * {@hide}
 */
parcelable ResolverParamsParcel {
    /**
     * The network ID of the network for which information should be configured.
     */
    int netId;

    /**
     * Sample lifetime in seconds.
     */
    int sampleValiditySeconds;

    /**
     * Use to judge if the server is considered broken.
     */
    int successThreshold;

    /**
     * Min. # samples.
     */
    int minSamples;

    /**
     * Max # samples.
     */
    int maxSamples;

    /**
     * Retransmission interval in milliseconds.
     */
    int baseTimeoutMsec;

    /**
     * Number of retries.
     */
    int retryCount;

    /**
     * The DNS servers to configure for the network.
     */
    @utf8InCpp String[] servers;

    /**
     * The search domains to configure.
     */
    @utf8InCpp String[] domains;

    /**
     * The TLS subject name to require for all servers, or empty if there is none.
     */
    @utf8InCpp String   tlsName;

    /**
     * The DNS servers to configure for strict mode Private DNS.
     */
    @utf8InCpp String[] tlsServers;

    /**
     * An array containing TLS public key fingerprints (pins) of which each server must match
     * at least one, or empty if there are no pinned keys.
     */
    // DEPRECATED:Superseded by caCertificate below.
    @utf8InCpp String[] tlsFingerprints = {};

    /**
     * Certificate authority that signed the certificate; only used by DNS-over-TLS tests.
     *
     */
    @utf8InCpp String caCertificate = "";

    /**
     * The timeout for the connection attempt to a Private DNS server.
     * It's initialized to 0 to use the predefined default value.
     * Setting a non-zero value to it takes no effect anymore. The timeout is configurable only
     * by the experiement flag.
     */
    int tlsConnectTimeoutMs = 0;

    /**
    * Knobs for OEM to control alternative behavior.
    */
    ResolverExperimentalOptionsParcel experimentalOptions;
}
