/** @file
  EFI IPsec Configuration Protocol Definition
  The EFI_IPSEC_CONFIG_PROTOCOL provides the mechanism to set and retrieve security and 
  policy related information for the EFI IPsec protocol driver.

  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

  @par Revision Reference:          
  This Protocol is introduced in UEFI Specification 2.2

**/

#ifndef __EFI_IPSE_CCONFIG_PROTOCOL_H__
#define __EFI_IPSE_CCONFIG_PROTOCOL_H__


#define EFI_IPSEC_CONFIG_PROTOCOL_GUID \
  { \
    0xce5e5929, 0xc7a3, 0x4602, {0xad, 0x9e, 0xc9, 0xda, 0xf9, 0x4e, 0xbf, 0xcf } \
  }

typedef struct _EFI_IPSEC_CONFIG_PROTOCOL EFI_IPSEC_CONFIG_PROTOCOL;

///
/// EFI_IPSEC_CONFIG_DATA_TYPE
///
typedef enum {
  /// 
  /// The IPsec Security Policy Database (aka SPD) setting.  In IPsec, 
  /// an essential element of Security Association (SA) processing is 
  /// underlying SPD that specifies what services are to be offered to 
  /// IP datagram and in what fashion. The SPD must be consulted 
  /// during the processing of all traffic (inbound and outbound), 
  /// including traffic not protected by IPsec, that traverses the IPsec 
  /// boundary. With this DataType, SetData() function is to set 
  /// the SPD entry information, which may add one new entry, delete 
  /// one existed entry or flush the whole database according to the 
  /// parameter values. The corresponding Data is of type 
  /// EFI_IPSEC_SPD_DATA
  /// 
  IPsecConfigDataTypeSpd,
  /// 
  /// The IPsec Security Association Database (aka SAD) setting. A 
  /// SA is a simplex connection that affords security services to the 
  /// traffic carried by it. Security services are afforded to an SA by the 
  /// use of AH, or ESP, but not both. The corresponding Data is of 
  /// type EFI_IPSEC_SAD_DATA.
  /// 
  IPsecConfigDataTypeSad,
  /// 
  /// The IPsec Peer Authorization Database (aka PAD) setting, which 
  /// provides the link between the SPD and a security association 
  /// management protocol. The PAD entry specifies the 
  /// authentication protocol (e.g. IKEv1, IKEv2) method used and the 
  /// authentication data. The corresponding Data is of type 
  /// EFI_IPSEC_PAD_DATA.
  ///
  IPsecConfigDataTypePad,
  IPsecConfigDataTypeMaximum
} EFI_IPSEC_CONFIG_DATA_TYPE;

///
/// EFI_IP_ADDRESS_INFO
///
typedef struct _EFI_IP_ADDRESS_INFO {
  EFI_IP_ADDRESS  Address;      ///< The IPv4 or IPv6 address
  UINT8           PrefixLength; ///< The length of the prefix associated with the Address.
} EFI_IP_ADDRESS_INFO;


///
/// EFI_IPSEC_SPD_SELECTOR
///
typedef struct _EFI_IPSEC_SPD_SELECTOR {
  /// 
  /// Specifies the actual number of entries in LocalAddress.
  /// 
  UINT32                          LocalAddressCount;
  /// 
  /// A list of ranges of IPv4 or IPv6 addresses, which refers to the 
  /// addresses being protected by IPsec policy.
  /// 
  EFI_IP_ADDRESS_INFO             *LocalAddress;
  /// 
  /// Specifies the actual number of entries in RemoteAddress.
  /// 
  UINT32                          RemoteAddressCount;
  /// 
  /// A list of ranges of IPv4 or IPv6 addresses, which are peer entities 
  /// to LocalAddress. 
  /// 
  EFI_IP_ADDRESS_INFO             *RemoteAddress;
  /// 
  /// Next layer protocol. Obtained from the IPv4 Protocol or the IPv6 
  /// Next Header fields. The next layer protocol is whatever comes 
  /// after any IP extension headers that are present. A zero value is a 
  /// wildcard that matches any value in NextLayerProtocol field.
  /// 
  UINT16                          NextLayerProtocol; 
  /// 
  /// Local Port if the Next Layer Protocol uses two ports (as do TCP, 
  /// UDP, and others). A zero value is a wildcard that matches any 
  /// value in LocalPort field.
  /// 
  UINT16                          LocalPort;
  /// 
  /// A designed port range size. The start port is LocalPort, and 
  /// the total number of ports is described by LocalPortRange. 
  /// This field is ignored if NextLayerProtocol does not use 
  /// ports. 
  /// 
  UINT16                          LocalPortRange;
  /// 
  /// Remote Port if the Next Layer Protocol uses two ports. A zero 
  /// value is a wildcard that matches any value in RemotePort field.
  /// 
  UINT16                          RemotePort;
  /// 
  /// A designed port range size. The start port is RemotePort, and 
  /// the total number of ports is described by RemotePortRange. 
  /// This field is ignored if NextLayerProtocol does not use ports.
  /// 
  UINT16                          RemotePortRange;
} EFI_IPSEC_SPD_SELECTOR;
 
///
/// EFI_IPSEC_TRAFFIC_DIR
/// represents the directionality in an SPD entry.
///
typedef enum {
  ///
  /// The EfiIPsecInBound refers to traffic entering an IPsec implementation via 
  /// the unprotected interface or emitted by the implementation on the unprotected
  /// side of the boundary and directed towards the protected interface. 
  ///
  EfiIPsecInBound,
  ///
  /// The EfiIPsecOutBound refers to traffic entering the implementation via 
  /// the protected interface, or emitted by the implementation on the protected side
  /// of the boundary and directed toward the unprotected interface.
  ///
  EfiIPsecOutBound
} EFI_IPSEC_TRAFFIC_DIR;

///
/// EFI_IPSEC_ACTION
/// represents three possible processing choices.
///
typedef enum {
  /// 
  /// Refers to traffic that is not allowed to traverse the IPsec boundary.
  /// 
  EfiIPsecActionDiscard,
  /// 
  /// Refers to traffic that is allowed to cross the IPsec boundary 
  /// without protection.
  /// 
  EfiIPsecActionBypass,
  /// 
  /// Refers to traffic that is afforded IPsec protection, and for such 
  /// traffic the SPD must specify the security protocols to be 
  /// employed, their mode, security service options, and the 
  /// cryptographic algorithms to be used. 
  ///
  EfiIPsecActionProtect
} EFI_IPSEC_ACTION;

///
/// EFI_IPSEC_SA_LIFETIME
/// defines the lifetime of an SA, which represents when a SA must be 
/// replaced or terminated. A value of all 0 for each field removes 
/// the limitation of a SA lifetime.
///
typedef struct _EFI_IPSEC_SA_LIFETIME {
  /// 
  /// The number of bytes to which the IPsec cryptographic algorithm
  /// can be applied. For ESP, this is the encryption algorithm and for
  /// AH, this is the authentication algorithm. The ByteCount 
  /// includes pad bytes for cryptographic operations.
  /// 
  UINT64        ByteCount;
  /// 
  /// A time interval in second that warns the implementation to 
  /// initiate action such as setting up a replacement SA.
  /// 
  UINT64        SoftLifetime;
  /// 
  /// A time interval in second when the current SA ends and is 
  /// destroyed.
  /// 
  UINT64        HardLifetime;
} EFI_IPSEC_SA_LIFETIME;

///
/// EFI_IPSEC_MODE
/// There are two modes of IPsec operation: transport mode and tunnel mode. In 
/// EfiIPsecTransport mode, AH and ESP provide protection primarily for next layer protocols; 
/// In EfiIPsecTunnel mode, AH and ESP are applied to tunneled IP packets.
///
typedef enum {
  EfiIPsecTransport,
  EfiIPsecTunnel
} EFI_IPSEC_MODE;

///
/// EFI_IPSEC_TUNNEL_DF_OPTION
/// The option of copying the DF bit from an outbound package to
/// the tunnel mode header that it emits, when traffic is carried
/// via a tunnel mode SA. This applies to SAs where both inner and
/// outer headers are IPv4.
///
typedef enum {
  EfiIPsecTunnelClearDf,  ///< Clear DF bit from inner header.
  EfiIPsecTunnelSetDf,    ///< Set DF bit from inner header.
  EfiIPsecTunnelCopyDf    ///< Copy DF bit from inner header.
} EFI_IPSEC_TUNNEL_DF_OPTION;

///
/// EFI_IPSEC_TUNNEL_OPTION
///
typedef struct _EFI_IPSEC_TUNNEL_OPTION {
  /// 
  /// Local tunnel address when IPsec mode is EfiIPsecTunnel.
  /// 
  EFI_IP_ADDRESS              LocalTunnelAddress;
  /// 
  /// Remote tunnel address when IPsec mode is EfiIPsecTunnel.
  /// 
  EFI_IP_ADDRESS              RemoteTunnelAddress;
  /// 
  /// The option of copying the DF bit from an outbound package
  /// to the tunnel mode header that it emits, when traffic is 
  /// carried via a tunnel mode SA. 
  /// 
  EFI_IPSEC_TUNNEL_DF_OPTION  DF;
} EFI_IPSEC_TUNNEL_OPTION;

///
/// EFI_IPSEC_PROTOCOL_TYPE
///
typedef enum {
  EfiIPsecAH,  ///< IP Authentication Header protocol which is specified in RFC 4302.
  EfiIPsecESP  ///< IP Encapsulating Security Payload which is specified in RFC 4303. 
} EFI_IPSEC_PROTOCOL_TYPE;

///
/// EFI_IPSEC_PROCESS_POLICY
/// describes a policy list for traffic processing.
///
typedef struct _EFI_IPSEC_PROCESS_POLICY {
  /// 
  /// Extended Sequence Number. Is this SA using extended sequence 
  /// numbers. 64 bit counter is used if TRUE.
  /// 
  BOOLEAN                 ExtSeqNum;
  /// 
  /// A flag indicating whether overflow of the sequence number 
  /// counter should generate an auditable event and prevent 
  /// transmission of additional packets on the SA, or whether rollover 
  /// is permitted.
  /// 
  BOOLEAN                 SeqOverflow;
  /// 
  /// Is this SA using stateful fragment checking. TRUE represents 
  /// stateful fragment checking.
  /// 
  BOOLEAN                 FragCheck;
  /// 
  /// A time interval after which a SA must be replaced with a new SA 
  /// (and new SPI) or terminated. 
  /// 
  EFI_IPSEC_SA_LIFETIME   SaLifetime;
  /// 
  /// IPsec mode: tunnel or transport.
  /// 
  EFI_IPSEC_MODE          Mode;
  /// 
  /// Tunnel Option. TunnelOption is ignored if Mode is EfiIPsecTransport.
  /// 
  EFI_IPSEC_TUNNEL_OPTION *TunnelOption;
  /// 
  /// IPsec protocol: AH or ESP
  /// 
  EFI_IPSEC_PROTOCOL_TYPE Proto;
  ///  
  /// Cryptographic algorithm type used for authentication.
  /// 
  UINT8                   AuthAlgoId;
  /// 
  /// Cryptographic algorithm type used for encryption. EncAlgo is 
  /// NULL when IPsec protocol is AH. For ESP protocol, EncAlgo 
  /// can also be used to describe the algorithm if a combined mode 
  /// algorithm is used.
  ///
  UINT8                   EncAlgoId;
} EFI_IPSEC_PROCESS_POLICY;

///
/// EFI_IPSEC_SA_ID
/// A triplet to identify an SA, consisting of the following members.
///
typedef struct _EFI_IPSEC_SA_ID {
  /// 
  /// Security Parameter Index (aka SPI).  An arbitrary 32-bit value 
  /// that is used by a receiver to identity the SA to which an incoming 
  /// package should be bound.
  /// 
  UINT32                          Spi;
  /// 
  /// IPsec protocol: AH or ESP
  /// 
  EFI_IPSEC_PROTOCOL_TYPE         Proto;
  /// 
  /// Destination IP address. 
  /// 
  EFI_IP_ADDRESS                  DestAddress;
} EFI_IPSEC_SA_ID;


#define MAX_PEERID_LEN     128

///
/// EFI_IPSEC_SPD_DATA
///
typedef struct _EFI_IPSEC_SPD_DATA {
  /// 
  /// A null-terminated ASCII name string which is used as a symbolic 
  /// identifier for an IPsec Local or Remote address.
  /// 
  UINT8                           Name[MAX_PEERID_LEN];
  /// 
  /// Bit-mapped list describing Populate from Packet flags. When 
  /// creating a SA, if PackageFlag bit is set to TRUE, instantiate 
  /// the selector from the corresponding field in the package that 
  /// triggered the creation of the SA, else from the value(s) in the 
  /// corresponding SPD entry. The PackageFlag bit setting for 
  /// corresponding selector field of EFI_IPSEC_SPD_SELECTOR:
  ///     Bit 0: EFI_IPSEC_SPD_SELECTOR.LocalAddress 
  ///     Bit 1: EFI_IPSEC_SPD_SELECTOR.RemoteAddress 
  ///     Bit 2: 
  /// EFI_IPSEC_SPD_SELECTOR.NextLayerProtocol 
  ///     Bit 3: EFI_IPSEC_SPD_SELECTOR.LocalPort 
  ///     Bit 4: EFI_IPSEC_SPD_SELECTOR.RemotePort 
  ///     Others: Reserved.
  ///
  UINT32                          PackageFlag;
  /// 
  /// The traffic direction of data gram.
  /// 
  EFI_IPSEC_TRAFFIC_DIR           TrafficDirection;
  /// 
  /// Processing choices to indicate which action is required by this 
  /// policy. 
  /// 
  EFI_IPSEC_ACTION                Action;
  /// 
  /// The policy and rule information for a SPD entry.
  /// 
  EFI_IPSEC_PROCESS_POLICY        *ProcessingPolicy;
  /// 
  /// Specifies the actual number of entries in SaId list.
  /// 
  UINTN                           SaIdCount;
  /// 
  /// The SAD entry used for the traffic processing. The 
  /// existed SAD entry links indicate this is the manual key case.
  /// 
  EFI_IPSEC_SA_ID                 SaId[1];
} EFI_IPSEC_SPD_DATA;

///
/// EFI_IPSEC_AH_ALGO_INFO
/// The security algorithm selection for IPsec AH authentication.
/// The required authentication algorithm is specified in RFC 4305.
///
typedef struct _EFI_IPSEC_AH_ALGO_INFO {
  UINT8                           AuthAlgoId;
  UINTN                           AuthKeyLength;
  VOID                            *AuthKey;
} EFI_IPSEC_AH_ALGO_INFO;

///
/// EFI_IPSEC_ESP_ALGO_INFO
/// The security algorithm selection for IPsec ESP encryption and authentication.
/// The required authentication algorithm is specified in RFC 4305. 
/// EncAlgoId fields can also specify an ESP combined mode algorithm 
/// (e.g. AES with CCM mode, specified in RFC 4309), which provides both 
/// confidentiality and authentication services.
///
typedef struct _EFI_IPSEC_ESP_ALGO_INFO {
  UINT8                     EncAlgoId;
  UINTN                     EncKeyLength;
  VOID                      *EncKey;
  UINT8                     AuthAlgoId;
  UINTN                     AuthKeyLength;
  VOID                      *AuthKey;
} EFI_IPSEC_ESP_ALGO_INFO;

///
/// EFI_IPSEC_ALGO_INFO
///
typedef union {
  EFI_IPSEC_AH_ALGO_INFO          AhAlgoInfo;
  EFI_IPSEC_ESP_ALGO_INFO         EspAlgoInfo;
} EFI_IPSEC_ALGO_INFO;

///
/// EFI_IPSEC_SA_DATA
///
typedef struct _EFI_IPSEC_SA_DATA {
  /// 
  /// IPsec mode: tunnel or transport.
  /// 
  EFI_IPSEC_MODE                  Mode;
  /// 
  /// Sequence Number Counter. A 64-bit counter used to generate the 
  /// sequence number field in AH or ESP headers.
  /// 
  UINT64                          SNCount;
  /// 
  /// Anti-Replay Window. A 64-bit counter and a bit-map used to 
  /// determine whether an inbound AH or ESP packet is a replay.
  /// 
  UINT8                           AntiReplayWindows;
  /// 
  /// AH/ESP cryptographic algorithm, key and parameters. 
  /// 
  EFI_IPSEC_ALGO_INFO             AlgoInfo;
  /// 
  /// Lifetime of this SA. 
  /// 
  EFI_IPSEC_SA_LIFETIME           SaLifetime;
  /// 
  /// Any observed path MTU and aging variables. The Path MTU 
  /// processing is defined in section 8 of RFC 4301.
  /// 
  UINT32                          PathMTU;
  /// 
  /// Link to one SPD entry.
  /// 
  EFI_IPSEC_SPD_SELECTOR          *SpdSelector;
  /// 
  /// Indication of whether it's manually set or negotiated automatically. 
  /// If ManualSet is FALSE, the corresponding SA entry is inserted through 
  /// IKE protocol negotiation.
  ///
  BOOLEAN                         ManualSet;
} EFI_IPSEC_SA_DATA;

///
/// EFI_IPSEC_SA_DATA2
///
typedef struct _EFI_IPSEC_SA_DATA2 { 
  ///
  /// IPsec mode: tunnel or transport
  ///
  EFI_IPSEC_MODE             Mode; 
  ///
  /// Sequence Number Counter. A 64-bit counter used to generate the sequence 
  /// number field in AH or ESP headers. 
  ///
  UINT64                     SNCount; 
  ///
  /// Anti-Replay Window. A 64-bit counter and a bit-map used to determine 
  /// whether an inbound AH or ESP packet is a replay.
  ///
  UINT8                      AntiReplayWindows; 
  ///
  /// AH/ESP cryptographic algorithm, key and parameters.
  ///
  EFI_IPSEC_ALGO_INFO        AlgoInfo; 
  ///
  /// Lifetime of this SA.
  ///
  EFI_IPSEC_SA_LIFETIME      SaLifetime; 
  ///
  /// Any observed path MTU and aging variables. The Path MTU processing is 
  /// defined in section 8 of RFC 4301.
  ///
  UINT32                     PathMTU; 
  ///
  /// Link to one SPD entry
  ///
  EFI_IPSEC_SPD_SELECTOR     *SpdSelector; 
  ///
  /// Indication of whether it's manually set or negotiated automatically. 
  /// If ManualSet is FALSE, the corresponding SA entry is inserted through IKE 
  /// protocol negotiation
  ///
  BOOLEAN                    ManualSet;
  ///
  /// The tunnel header IP source address.
  ///
  EFI_IP_ADDRESS             TunnelSourceAddress;
  ///
  /// The tunnel header IP destination address.
  ///
  EFI_IP_ADDRESS             TunnelDestinationAddress;
} EFI_IPSEC_SA_DATA2; 


///
/// EFI_IPSEC_PAD_ID
/// specifies the identifier for PAD entry, which is also used for SPD lookup.
/// IpAddress Pointer to the IPv4 or IPv6 address range.
///
typedef struct _EFI_IPSEC_PAD_ID {
  ///
  /// Flag to identify which type of PAD Id is used.
  /// 
  BOOLEAN               PeerIdValid;    
  union {
    ///
    /// Pointer to the IPv4 or IPv6 address range.
    ///
    EFI_IP_ADDRESS_INFO   IpAddress;
    ///
    /// Pointer to a null terminated ASCII string
    /// representing the symbolic names. A PeerId can be a DNS 
    /// name, Distinguished Name, RFC 822 email address or Key ID 
    /// (specified in section 4.4.3.1 of RFC 4301)
    ///
    UINT8                 PeerId[MAX_PEERID_LEN];
  } Id;
} EFI_IPSEC_PAD_ID;

///
/// EFI_IPSEC_CONFIG_SELECTOR
/// describes the expected IPsec configuration data selector 
/// of type EFI_IPSEC_CONFIG_DATA_TYPE.
///
typedef union {
  EFI_IPSEC_SPD_SELECTOR              SpdSelector;
  EFI_IPSEC_SA_ID                     SaId;
  EFI_IPSEC_PAD_ID                    PadId;
} EFI_IPSEC_CONFIG_SELECTOR;

///
/// EFI_IPSEC_AUTH_PROTOCOL_TYPE
/// defines the possible authentication protocol for IPsec 
/// security association management.
///
typedef enum {
  EfiIPsecAuthProtocolIKEv1,
  EfiIPsecAuthProtocolIKEv2,
  EfiIPsecAuthProtocolMaximum
} EFI_IPSEC_AUTH_PROTOCOL_TYPE;

///
/// EFI_IPSEC_AUTH_METHOD
///
typedef enum {
  ///
  /// Using Pre-shared Keys for manual security associations.
  ///
  EfiIPsecAuthMethodPreSharedSecret,
  ///
  /// IKE employs X.509 certificates for SA establishment.
  ///
  EfiIPsecAuthMethodCertificates,
  EfiIPsecAuthMethodMaximum
} EFI_IPSEC_AUTH_METHOD;

///
/// EFI_IPSEC_PAD_DATA
///
typedef struct _EFI_IPSEC_PAD_DATA {
  /// 
  /// Authentication Protocol for IPsec security association  management.
  /// 
  EFI_IPSEC_AUTH_PROTOCOL_TYPE  AuthProtocol;
  /// 
  /// Authentication method used.
  /// 
  EFI_IPSEC_AUTH_METHOD         AuthMethod;
  /// 
  /// The IKE ID payload will be used as a symbolic name for SPD 
  /// lookup if IkeIdFlag is TRUE. Otherwise, the remote IP 
  /// address provided in traffic selector playloads will be used.
  /// 
  BOOLEAN                       IkeIdFlag;
  /// 
  /// The size of Authentication data buffer, in bytes.
  /// 
  UINTN                         AuthDataSize;
  /// 
  /// Buffer for Authentication data, (e.g., the pre-shared secret or the 
  /// trust anchor relative to which the peer's certificate will be 
  /// validated).
  /// 
  VOID                          *AuthData;
  /// 
  /// The size of RevocationData, in bytes
  /// 
  UINTN                         RevocationDataSize;
  /// 
  /// Pointer to CRL or OCSP data, if certificates are used for 
  /// authentication method.
  /// 
  VOID                          *RevocationData;
} EFI_IPSEC_PAD_DATA;


/**
  Set the security association, security policy and peer authorization configuration
  information for the EFI IPsec driver. 

  This function is used to set the IPsec configuration information of type DataType for
  the EFI IPsec driver.
  The IPsec configuration data has a unique selector/identifier separately to identify
  a data entry. The selector structure depends on DataType's definition.
  Using SetData() with a Data of NULL causes the IPsec configuration data entry identified
  by DataType and Selector to be deleted.        

  @param[in] This               Pointer to the EFI_IPSEC_CONFIG_PROTOCOL instance.
  @param[in] DataType           The type of data to be set.
  @param[in] Selector           Pointer to an entry selector on operated configuration data 
                                specified by DataType. A NULL Selector causes the entire 
                                specified-type configuration information to be flushed.
  @param[in] Data               The data buffer to be set. The structure of the data buffer is 
                                associated with the DataType.
  @param[in] InsertBefore       Pointer to one entry selector which describes the expected
                                position the new data entry will be added. If InsertBefore is NULL,
                                the new entry will be appended the end of database.
 
  @retval EFI_SUCCESS           The specified configuration entry data is set successfully.
  @retval EFI_INVALID_PARAMETER One or more of the following are TRUE:
                                - This is NULL.
  @retval EFI_UNSUPPORTED       The specified DataType is not supported.
  @retval EFI_OUT_OF_RESOURCED  The required system resource could not be allocated.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IPSEC_CONFIG_SET_DATA)(
  IN EFI_IPSEC_CONFIG_PROTOCOL        *This,
  IN EFI_IPSEC_CONFIG_DATA_TYPE       DataType,
  IN EFI_IPSEC_CONFIG_SELECTOR        *Selector,
  IN VOID                             *Data,
  IN EFI_IPSEC_CONFIG_SELECTOR        *InsertBefore   OPTIONAL
  );

/**
  Return the configuration value for the EFI IPsec driver. 

  This function lookup the data entry from IPsec database or IKEv2 configuration
  information. The expected data type and unique identification are described in
  DataType and Selector parameters.        

  @param[in]      This          Pointer to the EFI_IPSEC_CONFIG_PROTOCOL instance.
  @param[in]      DataType      The type of data to retrieve.
  @param[in]      Selector      Pointer to an entry selector which is an identifier of the IPsec 
                                configuration data entry.
  @param[in, out] DataSize      On output the size of data returned in Data.
  @param[out]     Data          The buffer to return the contents of the IPsec configuration data. 
                                The type of the data buffer is associated with the DataType. 
 
  @retval EFI_SUCCESS           The specified configuration data is got successfully.
  @retval EFI_INVALID_PARAMETER One or more of the followings are TRUE:
                                - This is NULL.
                                - Selector is NULL.
                                - DataSize is NULL.
                                - Data is NULL and *DataSize is not zero
  @retval EFI_NOT_FOUND         The configuration data specified by Selector is not found.
  @retval EFI_UNSUPPORTED       The specified DataType is not supported.
  @retval EFI_BUFFER_TOO_SMALL  The DataSize is too small for the result. DataSize has been
                                updated with the size needed to complete the request.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IPSEC_CONFIG_GET_DATA)(
  IN EFI_IPSEC_CONFIG_PROTOCOL        *This,
  IN EFI_IPSEC_CONFIG_DATA_TYPE       DataType,
  IN EFI_IPSEC_CONFIG_SELECTOR        *Selector,
  IN OUT UINTN                        *DataSize,
  OUT VOID                            *Data
  );

/**
  Enumerates the current selector for IPsec configuration data entry. 

  This function is called multiple times to retrieve the entry Selector in IPsec
  configuration database. On each call to GetNextSelector(), the next entry 
  Selector are retrieved into the output interface.
 
  If the entire IPsec configuration database has been iterated, the error 
  EFI_NOT_FOUND is returned.
  If the Selector buffer is too small for the next Selector copy, an 
  EFI_BUFFER_TOO_SMALL error is returned, and SelectorSize is updated to reflect 
  the size of buffer needed.

  On the initial call to GetNextSelector() to start the IPsec configuration database
  search, a pointer to the buffer with all zero value is passed in Selector. Calls 
  to SetData() between calls to GetNextSelector may produce unpredictable results.         

  @param[in]      This          Pointer to the EFI_IPSEC_CONFIG_PROTOCOL instance.
  @param[in]      DataType      The type of IPsec configuration data to retrieve.
  @param[in, out] SelectorSize  The size of the Selector buffer.
  @param[in, out] Selector      On input, supplies the pointer to last Selector that was 
                                returned by GetNextSelector().
                                On output, returns one copy of the current entry Selector
                                of a given DataType. 
 
  @retval EFI_SUCCESS           The specified configuration data is got successfully.
  @retval EFI_INVALID_PARAMETER One or more of the followings are TRUE:
                                - This is NULL.
                                - SelectorSize is NULL.
                                - Selector is NULL.
  @retval EFI_NOT_FOUND         The next configuration data entry was not found.
  @retval EFI_UNSUPPORTED       The specified DataType is not supported.
  @retval EFI_BUFFER_TOO_SMALL  The SelectorSize is too small for the result. This parameter
                                has been updated with the size needed to complete the search 
                                request.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IPSEC_CONFIG_GET_NEXT_SELECTOR)(
  IN EFI_IPSEC_CONFIG_PROTOCOL        *This,
  IN EFI_IPSEC_CONFIG_DATA_TYPE       DataType,
  IN OUT UINTN                        *SelectorSize,
  IN OUT EFI_IPSEC_CONFIG_SELECTOR    *Selector
  );

/**
  Register an event that is to be signaled whenever a configuration process on the
  specified IPsec configuration information is done. 

  This function registers an event that is to be signaled whenever a configuration
  process on the specified IPsec configuration data is done (e.g. IPsec security 
  policy database configuration is ready). An event can be registered for different
  DataType simultaneously and the caller is responsible for determining which type 
  of configuration data causes the signaling of the event in such case.        

  @param[in] This               Pointer to the EFI_IPSEC_CONFIG_PROTOCOL instance.
  @param[in] DataType           The type of data to be registered the event for.
  @param[in] Event              The event to be registered.
 
  @retval EFI_SUCCESS           The event is registered successfully.
  @retval EFI_INVALID_PARAMETER This is NULL or Event is NULL.
  @retval EFI_ACCESS_DENIED     The Event is already registered for the DataType.
  @retval EFI_UNSUPPORTED       The notify registration unsupported or the specified
                                DataType is not supported.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IPSEC_CONFIG_REGISTER_NOTIFY)(
  IN EFI_IPSEC_CONFIG_PROTOCOL        *This,
  IN EFI_IPSEC_CONFIG_DATA_TYPE       DataType,
  IN EFI_EVENT                        Event
  );

/**
  Remove the specified event that is previously registered on the specified IPsec
  configuration data. 

  This function removes a previously registered event for the specified configuration data.        

  @param[in] This               Pointer to the EFI_IPSEC_CONFIG_PROTOCOL instance.
  @param[in] DataType           The configuration data type to remove the registered event for.
  @param[in] Event              The event to be unregistered.
 
  @retval EFI_SUCCESS           The event is removed successfully.
  @retval EFI_NOT_FOUND         The Event specified by DataType could not be found in the 
                                database.
  @retval EFI_INVALID_PARAMETER This is NULL or Event is NULL.
  @retval EFI_UNSUPPORTED       The notify registration unsupported or the specified
                                DataType is not supported.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IPSEC_CONFIG_UNREGISTER_NOTIFY)(
  IN EFI_IPSEC_CONFIG_PROTOCOL        *This,
  IN EFI_IPSEC_CONFIG_DATA_TYPE       DataType,
  IN EFI_EVENT                        Event
  );

///
/// EFI_IPSEC_CONFIG_PROTOCOL
/// provides the ability to set and lookup the IPsec SAD (Security Association Database),
/// SPD (Security Policy Database) data entry and configure the security association 
/// management protocol such as IKEv2. This protocol is used as the central 
/// repository of any policy-specific configuration for EFI IPsec driver.
/// EFI_IPSEC_CONFIG_PROTOCOL can be bound to both IPv4 and IPv6 stack. User can use this 
/// protocol for IPsec configuration in both IPv4 and IPv6 environment.
/// 
struct _EFI_IPSEC_CONFIG_PROTOCOL {
  EFI_IPSEC_CONFIG_SET_DATA           SetData;
  EFI_IPSEC_CONFIG_GET_DATA           GetData;
  EFI_IPSEC_CONFIG_GET_NEXT_SELECTOR  GetNextSelector;
  EFI_IPSEC_CONFIG_REGISTER_NOTIFY    RegisterDataNotify;
  EFI_IPSEC_CONFIG_UNREGISTER_NOTIFY  UnregisterDataNotify;
};

extern EFI_GUID gEfiIpSecConfigProtocolGuid;

#endif
