/** @file
  WiFi profile sync protocol. Supports One Click Recovery or KVM OS recovery
  boot flow over WiFi. This protocol will hold the WiFi profile provided by AMT
  in its original structure, then convert the profile when the WifiConnectionManager
  is attempting a connection during a system recovery reboot, OCR or KVM. These
  converstion and operations are found in the WifiProfileSync driver and in
  the link provided below.

  This protocol facilitates the reporting and storing of the connection state
  incase of failure, to which a connection attempt will rety a maximum of 3 times.

  Pulbic links to speficiation document for KVM and One Click Recovery feature.
  https://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide/default.htm?turl=WordDocuments%2Foneclickrecovery.htm

  Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#pragma once

#include <WifiConnectionManagerDxe/WifiConnectionMgrConfig.h>

//
//  WiFi Profile Sync Protocol GUID variable.
//
extern EFI_GUID  gEdkiiWiFiProfileSyncProtocolGuid;

/**
  Used by the WiFi connection manager to get the WiFi profile that AMT shared
  and was stored in WiFi profile protocol. Aligns the AMT WiFi profile data to
  the WiFi connection manager profile structure fo connection use.

  @param[in, out]  WcmProfile       WiFi Connection Manager profile structure
  @param[in, out]  MacAddress       MAC address from AMT saved to NiC MAC address

  @retval EFI_SUCCESS               Stored WiFi profile converted and returned succefully
  @retval EFI_UNSUPPORTED           Profile protocol sharing not supported or enabled
  @retval EFI_NOT_FOUND             No profiles to returned
  @retval Others                    Error Occurred
**/
typedef
EFI_STATUS
(EFIAPI *WIFI_PROFILE_GET)(
  IN OUT  WIFI_MGR_NETWORK_PROFILE  *Profile,
  IN OUT  EFI_80211_MAC_ADDRESS     MacAddress
  );

/**
  Saves the WiFi connection status recieved by the WiFiConnectionManager when
  in a KVM OR One Click Recovery WLAN recovery flow. Input as
  EFI_80211_CONNECT_NETWORK_RESULT_CODE then converted and stored as EFI_STATUS type.

  @param[in] ConnectionStatus     WiFi connection attempt results
**/
typedef
VOID
(EFIAPI *WIFI_SET_CONNECT_STATE)(
  IN  EFI_80211_CONNECT_NETWORK_RESULT_CODE ConnectionStatus
  );

/**
  Retrieves the stored WiFi connection status when in either KVM OR One Click
  Recovery WLAN recovery flow.

  @retval EFI_SUCCESS               WiFi connection completed succesfully
  @retval Others                    Connection failure occurred
**/
typedef
EFI_STATUS
(EFIAPI *WIFI_GET_CONNECT_STATE)(
  VOID
  );

//
//  WiFi Profile Sync Protocol structure.
//
typedef struct {
  UINT32                    Revision;
  WIFI_SET_CONNECT_STATE    SetConnectState;
  WIFI_GET_CONNECT_STATE    GetConnectState;
  WIFI_PROFILE_GET          GetProfile;
} EDKII_WIFI_PROFILE_SYNC_PROTOCOL;

/**
  WiFi Profile Protocol revision number.

  Revision 1:   Initial version
**/
#define EDKII_WIFI_PROFILE_SYNC_PROTOCOL_REVISION  1
