/*
 * 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.
 */
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.
   *
   * @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
   * |configureRequest| method to change the configuration of an already enabled
   * NAN interface.
   *
   * @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
   * |enableRequest| already submitted and succeeded).
   *
   * @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.
   *
   * @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.
   *
   * @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.
   *
   * @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, uint16_t sessionId)
      generates (WifiStatus status);

  /**
   * Subscribe request to start searching for a discovery service.
   *
   * @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.
   *
   * @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, uint16_t sessionId)
      generates (WifiStatus status);

  /**
   * NAN transmit follow up message request.
   *
   * @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.
   *
   * @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.
   *
   * @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.
   *
   * @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.
   *
   * @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.
   *
   * @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);

  /**
   * Configure NAN Beacon or SDF payload to include vendor-specific payload.
   *
   * @param cmdId command Id to use for this invocation.
   * @param msg Instance of |NanBeaconSdfPayloadRequest|.
   * @return status WifiStatus of the operation.
   *         Possible status codes:
   *         |WifiStatusCode.SUCCESS|,
   *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
   *         |WifiStatusCode.ERROR_INVALID_ARGS|,
   *         |WifiStatusCode.ERROR_UNKNOWN|
   */
  beaconSdfPayloadRequest(CommandIdShort cmdId, NanBeaconSdfPayloadRequest msg)
      generates (WifiStatus status);
};
