/*
 * 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@1.0;

import IWifiIface;
import IWifiNanIfaceEventCallback;

/**
 * Interface used to represent a single NAN(Neighbour Aware Network) iface.
 *
 * References to "NAN Spec" are to the Wi-Fi Alliance "Wi-Fi Neighbor Awareness
 * Networking (NAN) Technical Specification".
 */
interface IWifiNanIface extends IWifiIface {
  /**
   * Requests notifications of significant events on this iface. Multiple calls
   * to this must register multiple callbacks each of which must receive all
   * events.
   *
   * @param callback An instance of the |IWifiNanIfaceEventCallback| HIDL interface
   *        object.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|
   */
  registerEventCallback(IWifiNanIfaceEventCallback callback)
      generates (WifiStatus status);

  /**
   * Get NAN capabilities. Asynchronous response is with
   * |IWifiNanIfaceEventCallback.notifyCapabilitiesResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  getCapabilitiesRequest(CommandIdShort cmdId) generates (WifiStatus status);

  /**
   * Enable NAN: configures and activates NAN clustering (does not start
   * a discovery session or set up data-interfaces or data-paths). Use the
   * |IWifiNanIface.configureRequest| method to change the configuration of an already enabled
   * NAN interface.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyEnableResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @param msg Instance of |NanEnableRequest|.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_INVALID_ARGS|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  enableRequest(CommandIdShort cmdId, NanEnableRequest msg)
      generates (WifiStatus status);

  /**
   * Configure NAN: configures an existing NAN functionality (i.e. assumes
   * |IWifiNanIface.enableRequest| already submitted and succeeded).
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyConfigResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @param msg Instance of |NanConfigRequest|.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_INVALID_ARGS|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  configRequest(CommandIdShort cmdId, NanConfigRequest msg)
      generates (WifiStatus status);

  /**
   * Disable NAN functionality.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyDisableResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  disableRequest(CommandIdShort cmdId) generates (WifiStatus status);

  /**
   * Publish request to start advertising a discovery service.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyStartPublishResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @param msg Instance of |NanPublishRequest|.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_INVALID_ARGS|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  startPublishRequest(CommandIdShort cmdId, NanPublishRequest msg)
      generates (WifiStatus status);

  /**
   * Stop publishing a discovery service.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyStopPublishResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @param sessionId ID of the publish discovery session to be stopped.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  stopPublishRequest(CommandIdShort cmdId, uint8_t sessionId)
      generates (WifiStatus status);

  /**
   * Subscribe request to start searching for a discovery service.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyStartSubscribeResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @param msg Instance of |NanSubscribeRequest|.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_INVALID_ARGS|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  startSubscribeRequest(CommandIdShort cmdId, NanSubscribeRequest msg)
      generates (WifiStatus status);

  /**
   * Stop subscribing to a discovery service.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyStopSubscribeResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @param sessionId ID of the subscribe discovery session to be stopped.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  stopSubscribeRequest(CommandIdShort cmdId, uint8_t sessionId)
      generates (WifiStatus status);

  /**
   * NAN transmit follow up message request.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyTransmitFollowupResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @param msg Instance of |NanTransmitFollowupRequest|.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_INVALID_ARGS|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  transmitFollowupRequest(CommandIdShort cmdId, NanTransmitFollowupRequest msg)
      generates (WifiStatus status);

  /**
   * Create a NAN Data Interface.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyCreateDataInterfaceResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  createDataInterfaceRequest(CommandIdShort cmdId, string ifaceName)
      generates (WifiStatus status);

  /**
   * Delete a NAN Data Interface.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyDeleteDataInterfaceResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  deleteDataInterfaceRequest(CommandIdShort cmdId, string ifaceName)
      generates (WifiStatus status);

  /**
   * Initiate a data-path (NDP) setup operation: Initiator.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyInitiateDataPathResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @param msg Instance of |NanInitiateDataPathRequest|.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_INVALID_ARGS|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  initiateDataPathRequest(CommandIdShort cmdId, NanInitiateDataPathRequest msg)
      generates (WifiStatus status);

  /**
   * Respond to a received data indication as part of a data-path (NDP) setup operation. An
   * indication is received by the Responder from the Initiator.
   * Asynchronous response is with
   * |IWifiNanIfaceEventCallback.notifyRespondToDataPathIndicationResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @param msg Instance of |NanRespondToDataPathIndicationRequest|.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_INVALID_ARGS|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  respondToDataPathIndicationRequest(CommandIdShort cmdId,
                                     NanRespondToDataPathIndicationRequest msg)
      generates (WifiStatus status);

  /**
   * Data-path (NDP) termination request: executed by either Initiator or Responder.
   * Asynchronous response is with |IWifiNanIfaceEventCallback.notifyTerminateDataPathResponse|.
   *
   * @param cmdId command Id to use for this invocation.
   * @param ndpInstanceId Data-path instance ID to be terminated.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  terminateDataPathRequest(CommandIdShort cmdId, uint32_t ndpInstanceId)
      generates (WifiStatus status);
};