/*
 * Copyright 2016 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.hardware.wifi.supplicant@1.0;

import ISupplicantNetwork;
import ISupplicantStaNetworkCallback;

/**
 * Interface exposed by the supplicant for each station mode network
 * configuration it controls.
 */
interface ISupplicantStaNetwork extends ISupplicantNetwork {
  /**
   * Size limits for some of the params used in this interface.
   */
  enum ParamSizeLimits : uint32_t {
    /** Max length of SSID param. */
    SSID_MAX_LEN_IN_BYTES = 32,

    /** Min length of PSK passphrase param. */
    PSK_PASSPHRASE_MIN_LEN_IN_BYTES = 8,

    /** Max length of PSK passphrase param. */
    PSK_PASSPHRASE_MAX_LEN_IN_BYTES = 63,

    /** Max number of WEP keys param. */
    WEP_KEYS_MAX_NUM = 4,

    /** Length of each WEP40 keys param. */
    WEP40_KEY_LEN_IN_BYTES = 5,
    /** Length of each WEP104 keys param. */
    WEP104_KEY_LEN_IN_BYTES = 13,
  };

  /** Possble mask of values for KeyMgmt param. */
  enum KeyMgmtMask : uint32_t {
    WPA_EAP = 1 << 0,
    WPA_PSK = 1 << 1,
    NONE = 1 << 2,
    IEEE8021X = 1 << 3,
    FT_EAP = 1 << 5,
    FT_PSK = 1 << 6,
    OSEN = 1 << 15
  };

  /** Possble mask of values for Proto param. */
  enum ProtoMask : uint32_t {
    WPA = 1 << 0,
    RSN = 1 << 1,
    /** Unused 1 << 2 */
    OSEN = 1 << 3
  };

  /** Possble mask of values for AuthAlg param. */
  enum AuthAlgMask : uint32_t {
    OPEN = 1 << 0,
    SHARED = 1 << 1,
    LEAP = 1 << 2
  };

  /** Possble mask of values for GroupCipher param. */
  enum GroupCipherMask : uint32_t {
    WEP40 = 1 << 1,
    WEP104 = 1 << 2,
    TKIP = 1 << 3,
    CCMP = 1 << 4,
    GTK_NOT_USED = 1 << 14
  };

  /** Possble mask of values for PairwiseCipher param. */
  enum PairwiseCipherMask : uint32_t {
    NONE = 1 << 0,
    TKIP = 1 << 3,
    CCMP = 1 << 4
  };

  /** Possble values for EapMethod param. */
  enum EapMethod : uint32_t {
    PEAP = 0,
    TLS = 1,
    TTLS = 2,
    PWD = 3,
    SIM = 4,
    AKA = 5,
    AKA_PRIME = 6,
    WFA_UNAUTH_TLS = 7
  };

  /** Possble values for Phase2Method param. */
  enum EapPhase2Method : uint32_t {
    NONE = 0,
    PAP = 1,
    MSPAP = 2,
    MSPAPV2 = 3,
    GTC = 4,
    SIM = 5,
    AKA = 6,
    AKA_PRIME = 7
  };

  /** Params of |sendNetworkEapSimGsmAuthResponse| request. (Refer RFC 4186) */
  struct NetworkResponseEapSimGsmAuthParams {
    uint8_t[8] kc;
    uint8_t[4] sres;
  };

  /** Params of |sendNetworkEapSimUmtsAuthResponse| request. (Refer RFC 4187) */
  struct NetworkResponseEapSimUmtsAuthParams {
    vec<uint8_t> res;
    uint8_t[16] ik;
    uint8_t[16] ck;
  };

  /**
   * Register for callbacks from this network.
   *
   * These callbacks are invoked for events that are specific to this network.
   * Registration of multiple callback objects is supported. These objects must
   * be automatically deleted when the corresponding client process is dead or
   * if this network is removed.
   *
   * @param callback An instance of the |ISupplicantStaNetworkCallback| HIDL
   *        interface object.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  registerCallback(ISupplicantStaNetworkCallback callback)
      generates (SupplicantStatus status);

  /**
   * Setters for the various network params.
   * These correspond to elements of |wpa_sssid| struct used internally by
   * the supplicant to represent each network.
   */
  /**
   * Set SSID for this network.
   *
   * @param ssid value to set.
   *        Max length of |ParamSizeLimits.SSID_MAX_LEN_IN_BYTES|.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setSsid(Ssid ssid) generates (SupplicantStatus status);

  /**
   * Set the network to only connect to an AP with provided BSSID.
   *
   * @param bssid value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setBssid(Bssid bssid) generates (SupplicantStatus status);

  /**
   * Set whether to send probe requests for this network (hidden).
   *
   * @param enable true to set, false otherwise.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setScanSsid(bool enable) generates (SupplicantStatus status);

  /**
   * Set key management mask for the network.
   *
   * @param keyMgmtMask value to set.
   *        Combination of |KeyMgmtMask| values.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setKeyMgmt(bitfield<KeyMgmtMask> keyMgmtMask) generates (SupplicantStatus status);

  /**
   * Set proto mask for the network.
   *
   * @param protoMask value to set.
   *        Combination of |ProtoMask| values.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setProto(bitfield<ProtoMask> protoMask) generates (SupplicantStatus status);

  /**
   * Set auth alg mask for the network.
   *
   * @param authAlgMask value to set.
   *        Combination of |ProtoMask| values.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setAuthAlg(bitfield<AuthAlgMask> authAlgMask) generates (SupplicantStatus status);

  /**
   * Set group cipher mask for the network.
   *
   * @param groupCipherMask value to set.
   *        Combination of |ProtoMask| values.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setGroupCipher(bitfield<GroupCipherMask> groupCipherMask)
      generates (SupplicantStatus status);

  /**
   * Set pairwise cipher mask for the network.
   *
   * @param pairwiseCipherMask value to set.
   *        Combination of |ProtoMask| values.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setPairwiseCipher(bitfield<PairwiseCipherMask> pairwiseCipherMask)
      generates (SupplicantStatus status);

  /**
   * Set passphrase for WPA_PSK network.
   *
   * @param psk value to set.
   *        Length of value must be between
   *        |ParamSizeLimits.PSK_PASSPHRASE_MIN_LEN_IN_BYTES| and
   *        |ParamSizeLimits.PSK_PASSPHRASE_MAX_LEN_IN_BYTES|.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setPskPassphrase(string psk) generates (SupplicantStatus status);

  /**
   * Set raw psk for WPA_PSK network.
   *
   * @param psk value to set as specified in IEEE 802.11i-2004 standard.
   *        This is the calculated using 'wpa_passphrase <ssid> [passphrase]'
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setPsk(uint8_t[32] psk) generates (SupplicantStatus status);

  /**
   * Set WEP key for WEP network.
   *
   * @param keyIdx Index of wep key to set.
   *        Max of |ParamSizeLimits.WEP_KEYS_MAX_NUM|.
   * @param wepKey value to set.
   *        Length of each key must be either
   *        |ParamSizeLimits.WEP40_KEY_LEN_IN_BYTES| or
   *        |ParamSizeLimits.WEP104_KEY_LEN_IN_BYTES|.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setWepKey(uint32_t keyIdx, vec<uint8_t> wepKey)
      generates (SupplicantStatus status);

  /**
   * Set default Tx key index for WEP network.
   *
   * @param KeyIdx value to set.
   *        Max of |ParamSizeLimits.WEP_KEYS_MAX_NUM|.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setWepTxKeyIdx(uint32_t keyIdx)
      generates (SupplicantStatus status);

  /**
   * Set whether RequirePmf is enabled for this network.
   *
   * @param enable true to set, false otherwise.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setRequirePmf(bool enable) generates (SupplicantStatus status);

  /**
   * Set EAP Method for this network.
   *
   * @param method value to be set.
   *        Must be one of |EapMethod| values.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapMethod(EapMethod method)
      generates (SupplicantStatus status);

  /**
   * Set EAP Phase2 Method for this network.
   *
   * EAP method needs to be set for this to work.
   *
   * @param method value to set.
   *        Must be one of |EapPhase2Method| values.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapPhase2Method(EapPhase2Method method)
      generates (SupplicantStatus status);

  /**
   * Set EAP Identity for this network.
   *
   * @param identity value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapIdentity(vec<uint8_t> identity)
      generates (SupplicantStatus status);

  /**
   * Set EAP Anonymous Identity for this network.
   *
   * @param identity value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapAnonymousIdentity(vec<uint8_t> identity)
      generates (SupplicantStatus status);

  /**
   * Set EAP Password for this network.
   *
   * @param password value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapPassword(vec<uint8_t> password)
      generates (SupplicantStatus status);

  /**
   * Set EAP CA certificate file path for this network.
   *
   * @param path value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapCACert(string path) generates (SupplicantStatus status);

  /**
   * Set EAP CA certificate directory path for this network.
   *
   * @param path value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapCAPath(string path) generates (SupplicantStatus status);

  /**
   * Set EAP Client certificate file path for this network.
   *
   * @param path value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapClientCert(string path) generates (SupplicantStatus status);

  /**
   * Set EAP private key Id for this network.
   * This is used if private key operations for EAP-TLS are performed
   * using a smartcard.
   *
   * @param id value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapPrivateKeyId(string id) generates (SupplicantStatus status);

  /**
   * Set EAP subject match for this network.
   *
   * @param match value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapSubjectMatch(string match) generates (SupplicantStatus status);

  /**
   * Set EAP Alt subject match for this network.
   *
   * @param match value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapAltSubjectMatch(string match)
      generates (SupplicantStatus status);

  /**
   * Enable EAP Open SSL Engine for this network.
   *
   * @param enable true to set, false otherwise.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapEngine(bool enable) generates (SupplicantStatus status);

  /**
   * Set EAP Open SSL Engine ID for this network.
   *
   * @param id value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapEngineID(string id) generates (SupplicantStatus status);

  /**
   * Set EAP Domain suffix match for this network.
   *
   * @param match value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setEapDomainSuffixMatch(string match)
      generates (SupplicantStatus status);

  /**
   * This field can be used to enable proactive key caching which is also
   * known as opportunistic PMKSA caching for WPA2. This is disabled (0)
   * by default unless default value is changed with the global okc=1
   * parameter.
   *
   * Proactive key caching is used to make supplicant assume that the APs
   * are using the same PMK and generate PMKSA cache entries without
   * doing RSN pre-authentication. This requires support from the AP side
   * and is normally used with wireless switches that co-locate the
   * authenticator.
   *
   * @param enable true to set, false otherwise.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setProactiveKeyCaching(bool enable) generates (SupplicantStatus status);

  /**
   * Set ID string for this network.
   * Network identifier string for external scripts.
   *
   * @return idStr ID string value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setIdStr(string idStr) generates (SupplicantStatus status);

  /**
   * Set PPS MO ID for this network.
   * (Hotspot 2.0 PerProviderSubscription/UpdateIdentifier)
   *
   * @return id ID value to set.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  setUpdateIdentifier(uint32_t id) generates (SupplicantStatus status);

  /**
   * Getters for the various network params.
   */
  /**
   * Get SSID for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return ssid value set.
   */
  getSsid() generates (SupplicantStatus status, Ssid ssid);

  /**
   * Get the BSSID set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return bssid value set.
   */
  getBssid() generates (SupplicantStatus status, Bssid bssid);

  /**
   * Get whether Probe Requests are being sent for this network (hidden).
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return enabled true if set, false otherwise.
   */
  getScanSsid() generates (SupplicantStatus status, bool enabled);

  /**
   * Get the key mgmt mask set for the network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return keyMgmtMask Combination of |KeyMgmtMask| values.
   */
  getKeyMgmt()
      generates (SupplicantStatus status, bitfield<KeyMgmtMask> keyMgmtMask);

  /**
   * Get the proto mask set for the network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return protoMask Combination of |ProtoMask| values.
   */
  getProto() generates (SupplicantStatus status, bitfield<ProtoMask> protoMask);

  /**
   * Get the auth alg mask set for the network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return authAlgMask Combination of |AuthAlgMask| values.
   */
  getAuthAlg()
      generates (SupplicantStatus status, bitfield<AuthAlgMask> authAlgMask);

  /**
   * Get the group cipher mask set for the network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return groupCipherMask Combination of |GroupCipherMask| values.
   */
  getGroupCipher()
      generates (SupplicantStatus status,
                 bitfield<GroupCipherMask> groupCipherMask);

  /**
   * Get the pairwise cipher mask set for the network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return pairwiseCipherMask Combination of |PairwiseCipherMask| values.
   */
  getPairwiseCipher()
      generates (SupplicantStatus status,
                 bitfield<PairwiseCipherMask> pairwiseCipherMask);

  /**
   * Get passphrase for WPA_PSK network.
   * Must return a failure if network has no passphrase set (use |getPsk| if
   * network was configured with raw psk instead).
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return psk value set.
   */
  getPskPassphrase() generates (SupplicantStatus status, string psk);

  /**
   * Get raw psk for WPA_PSK network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @param psk value set.
   */
  getPsk() generates (SupplicantStatus status, uint8_t[32] psk);

  /**
   * Get WEP key for WEP network.
   *
   * @param keyIdx Index of wep key to be fetched.
   *        Max of |WEP_KEYS_MAX_NUM|.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return wepKey value set.
   */
  getWepKey(uint32_t keyIdx)
      generates (SupplicantStatus status, vec<uint8_t> wepKey);

  /**
   * Get default Tx key index for WEP network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return keyIdx value set.
   */
  getWepTxKeyIdx()
      generates (SupplicantStatus status, uint32_t keyIdx);

  /**
   * Get whether RequirePmf is enabled for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return enabled true if set, false otherwise.
   */
  getRequirePmf() generates (SupplicantStatus status, bool enabled);

  /**
   * Get EAP Method set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return method value set.
   *        Must be one of |EapMethod| values.
   */
  getEapMethod()
      generates (SupplicantStatus status, EapMethod method);

  /**
   * Get EAP Phase2 Method set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return method value set.
   *        Must be one of |EapPhase2Method| values.
   */
  getEapPhase2Method()
      generates (SupplicantStatus status, EapPhase2Method method);

  /**
   * Get EAP Identity set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return identity value set.
   */
  getEapIdentity()
      generates (SupplicantStatus status, vec<uint8_t> identity);

  /**
   * Get EAP Anonymous Identity set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return identity value set.
   */
  getEapAnonymousIdentity()
      generates (SupplicantStatus status, vec<uint8_t> identity);

  /**
   * Get EAP Password set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return password value set.
   */
  getEapPassword()
      generates (SupplicantStatus status, vec<uint8_t> password);

  /**
   * Get EAP CA certificate file path set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return path value set.
   */
  getEapCACert() generates (SupplicantStatus status, string path);

  /**
   * Get EAP CA certificate directory path set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return path value set.
   */
  getEapCAPath() generates (SupplicantStatus status, string path);

  /**
   * Get EAP Client certificate file path set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return path value set.
   */
  getEapClientCert() generates (SupplicantStatus status, string path);

  /**
   * Get EAP private key Id set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return id value set.
   */
  getEapPrivateKeyId() generates (SupplicantStatus status, string id);

  /**
   * Get EAP subject match set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return match value set.
   */
  getEapSubjectMatch() generates (SupplicantStatus status, string match);

  /**
   * Get EAP Alt subject match set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return match value set.
   */
  getEapAltSubjectMatch()
      generates (SupplicantStatus status, string match);

  /**
   * Get if EAP Open SSL Engine is enabled for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return enabled true if set, false otherwise.
   */
  getEapEngine() generates (SupplicantStatus status, bool enabled);

  /**
   * Get EAP Open SSL Engine ID set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return id value set.
   */
  getEapEngineID() generates (SupplicantStatus status, string id);

  /**
   * Get EAP Domain suffix match set for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return match value set.
   */
  getEapDomainSuffixMatch()
      generates (SupplicantStatus status, string match);

  /**
   * Get ID string set for this network.
   * Network identifier string for external scripts.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return idStr ID string set.
   */
  getIdStr() generates (SupplicantStatus status, string idStr);

  /**
   * Retrieves a WPS-NFC configuration token for this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   * @return token Bytes representing WPS-NFC configuration token.
   *         This is a dump of all the WPS atrributes of the AP configuration
   *         as specified in the Wi-Fi Protected Setup Specification.
   */
  getWpsNfcConfigurationToken()
      generates (SupplicantStatus status, vec<uint8_t> token);

  /**
   * Enable the network for connection purposes.
   *
   * This must trigger a connection to the network if:
   * a) |noConnect| is false, and
   * b) This is the only network configured, and
   * c) Is visible in the current scan results.
   *
   * @param noConnect Only enable the network, dont trigger a connect.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  enable(bool noConnect) generates (SupplicantStatus status);

  /**
   * Disable the network for connection purposes.
   *
   * This must trigger a disconnection from the network, if currently
   * connected to this one.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  disable() generates (SupplicantStatus status);

  /**
   * Initiate connection to this network.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  select() generates (SupplicantStatus status);

  /**
   * Used to send a response to the
   * |ISupplicantNetworkCallback.onNetworkEapSimGsmAuthRequest| request.
   *
   * @param params Params to be used for EAP GSM authentication.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  sendNetworkEapSimGsmAuthResponse(vec<NetworkResponseEapSimGsmAuthParams> params)
      generates (SupplicantStatus status);

  /**
   * Used to send a response to the
   * |ISupplicantNetworkCallback.onNetworkEapSimGsmAuthRequest| request.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  sendNetworkEapSimGsmAuthFailure() generates (SupplicantStatus status);

  /**
   * Used to send a response to the
   * |ISupplicantNetworkCallback.onNetworkEapSimUmtsAuthRequest| request.
   *
   * @param params Params to be used for EAP UMTS authentication.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  sendNetworkEapSimUmtsAuthResponse(NetworkResponseEapSimUmtsAuthParams params)
      generates (SupplicantStatus status);

  /**
   * Used to send a response to the
   * |ISupplicantNetworkCallback.onNetworkEapSimUmtsAuthRequest| request.
   *
   * @param auts Params to be used for EAP UMTS authentication.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  sendNetworkEapSimUmtsAutsResponse(uint8_t[14] auts)
      generates (SupplicantStatus status);

  /**
   * Used to send a response to the
   * |ISupplicantNetworkCallback.onNetworkEapSimUmtsAuthRequest| request.
   *
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  sendNetworkEapSimUmtsAuthFailure() generates (SupplicantStatus status);

  /**
   * Used to send a response to the
   * |ISupplicantNetworkCallback.onNetworkEapIdentityRequest| request.
   *
   * @param identity Identity to be used for the network.
   * @return status Status of the operation.
   *         Possible status codes:
   *         |SupplicantStatusCode.SUCCESS|,
   *         |SupplicantStatusCode.FAILURE_UNKNOWN|,
   *         |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
   */
  sendNetworkEapIdentityResponse(vec<uint8_t> identity)
      generates (SupplicantStatus status);
};
