/** @file
  This library is only intended to be used by UEFI network stack modules.
  It provides the combined IpIo layer on the EFI IP4 Protocol and EFI IP6 protocol.

Copyright (c) 2005 - 2016, 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 that 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.

**/

#ifndef _IP_IO_H_
#define _IP_IO_H_

#include <Protocol/Ip4.h>
#include <Protocol/Ip6.h>

#include <Library/NetLib.h>

//
// type and code define for ICMP protocol error 
// from IP
//
#define ICMP_TYPE_UNREACH              3
#define ICMP_TYPE_TIMXCEED             11
#define ICMP_TYPE_PARAMPROB            12
#define ICMP_TYPE_SOURCEQUENCH         4

#define ICMP_CODE_UNREACH_NET          0
#define ICMP_CODE_UNREACH_HOST         1
#define ICMP_CODE_UNREACH_PROTOCOL     2
#define ICMP_CODE_UNREACH_PORT         3
#define ICMP_CODE_UNREACH_NEEDFRAG     4
#define ICMP_CODE_UNREACH_SRCFAIL      5
#define ICMP_CODE_UNREACH_NET_UNKNOWN  6
#define ICMP_CODE_UNREACH_HOST_UNKNOWN 7
#define ICMP_CODE_UNREACH_ISOLATED     8
#define ICMP_CODE_UNREACH_NET_PROHIB   9
#define ICMP_CODE_UNREACH_HOST_PROHIB  10
#define ICMP_CODE_UNREACH_TOSNET       11
#define ICMP_CODE_UNREACH_TOSHOST      12

/**
  Get the IP header length from the struct EFI_IP4_HEADER. HeaderLength is
  Internet header length in 32-bit words, so HeaderLength<<2 is the real
  length of IP header.
  
  @param[out] HdrPtr   A pointer to EFI_IP4_HEADER.
  
  @return The IP header length.
**/
#define EFI_IP4_HEADER_LEN(HdrPtr) ((HdrPtr)->HeaderLength << 2)

/**
  To types of ICMP error which consist of ICMP header, IP header and original 
  datagram's data, get length from sum of ICMP header length, IP header length 
  and first 64 bits of datagram's data length.
  
  @param[in] IpHdr   A pointer to EFI_IP4_HEADER.
  
  @return The ICMP error length.
**/
#define ICMP_ERRLEN(IpHdr) \
  (sizeof(IP4_ICMP_HEAD) + EFI_IP4_HEADER_LEN(IpHdr) + 8)

/**
  Get the packet header from NET_BUF.
  
  @param[out]  Buf    A pointer to NET_BUF.
  @param[in]   Type   Header type.
  
  @return The pointer to packet header.
**/
#define NET_PROTO_HDR(Buf, Type)  ((Type *) ((Buf)->BlockOp[0].Head))

  
extern EFI_IP4_CONFIG_DATA  mIp4IoDefaultIpConfigData;
extern EFI_IP6_CONFIG_DATA  mIp6IoDefaultIpConfigData;


///
/// This error will be delivered to the
/// listening transportation layer protocol
/// that consumes IpIO.
///

#define  ICMP_ERR_UNREACH_NET           0
#define  ICMP_ERR_UNREACH_HOST          1
#define  ICMP_ERR_UNREACH_PROTOCOL      2
#define  ICMP_ERR_UNREACH_PORT          3
#define  ICMP_ERR_MSGSIZE               4
#define  ICMP_ERR_UNREACH_SRCFAIL       5
#define  ICMP_ERR_TIMXCEED_INTRANS      6
#define  ICMP_ERR_TIMXCEED_REASS        7
#define  ICMP_ERR_QUENCH                8
#define  ICMP_ERR_PARAMPROB             9

#define  ICMP6_ERR_UNREACH_NET          0
#define  ICMP6_ERR_UNREACH_HOST         1
#define  ICMP6_ERR_UNREACH_PROTOCOL     2
#define  ICMP6_ERR_UNREACH_PORT         3
#define  ICMP6_ERR_PACKAGE_TOOBIG       4
#define  ICMP6_ERR_TIMXCEED_HOPLIMIT    5
#define  ICMP6_ERR_TIMXCEED_REASS       6
#define  ICMP6_ERR_PARAMPROB_HEADER     7
#define  ICMP6_ERR_PARAMPROB_NEXHEADER  8
#define  ICMP6_ERR_PARAMPROB_IPV6OPTION 9

///
/// The helper struct for IpIoGetIcmpErrStatus(). It is for internal use only.
///
typedef struct {
  BOOLEAN                   IsHard;
  BOOLEAN                   Notify;
} ICMP_ERROR_INFO;

typedef union {
  EFI_IP4_COMPLETION_TOKEN  Ip4Token;
  EFI_IP6_COMPLETION_TOKEN  Ip6Token;
} IP_IO_IP_COMPLETION_TOKEN;

typedef union {
  EFI_IP4_TRANSMIT_DATA     Ip4TxData;
  EFI_IP6_TRANSMIT_DATA     Ip6TxData;
} IP_IO_IP_TX_DATA;

typedef union {
  EFI_IP4_RECEIVE_DATA      Ip4RxData;
  EFI_IP6_RECEIVE_DATA      Ip6RxData;
} IP_IO_IP_RX_DATA;

typedef union {
  EFI_IP4_OVERRIDE_DATA     Ip4OverrideData;
  EFI_IP6_OVERRIDE_DATA     Ip6OverrideData;
} IP_IO_OVERRIDE;

typedef union {
  EFI_IP4_CONFIG_DATA       Ip4CfgData;
  EFI_IP6_CONFIG_DATA       Ip6CfgData;
} IP_IO_IP_CONFIG_DATA;

typedef union {
  EFI_IP4_HEADER            *Ip4Hdr;
  EFI_IP6_HEADER            *Ip6Hdr;
} IP_IO_IP_HEADER;

typedef union {
  IP4_ADDR                  SubnetMask;
  UINT8                     PrefixLength;
} IP_IO_IP_MASK;

typedef union {
  EFI_IP4_PROTOCOL  *Ip4;
  EFI_IP6_PROTOCOL  *Ip6;
} IP_IO_IP_PROTOCOL;

///
/// The IP session for an IP receive packet.
///
typedef struct _EFI_NET_SESSION_DATA {
  EFI_IP_ADDRESS        Source;     ///< Source IP of the received packet.
  EFI_IP_ADDRESS        Dest;       ///< Destination IP of the received packet.
  IP_IO_IP_HEADER       IpHdr;      ///< IP header of the received packet.
  UINT32                IpHdrLen;   ///< IP header length of the received packet. 
                                    ///< For IPv6, it includes the IP6 header 
                                    ///< length and extension header length. For
                                    ///< IPv4, it includes the IP4 header length
                                    ///< and options length.
  UINT8                 IpVersion;  ///< The IP version of the received packet.
} EFI_NET_SESSION_DATA;

/**
  The prototype is called back when an IP packet is received.
  
  @param[in] Status        The result of the receive request.
  @param[in] IcmpErr       Valid when Status is EFI_ICMP_ERROR.
  @param[in] NetSession    The IP session for the received packet.
  @param[in] Pkt           The packet received.
  @param[in] Context       The data provided by the user for the received packet when
                           the callback is registered in IP_IO_OPEN_DATA::RcvdContext.
  
**/
typedef
VOID
(EFIAPI *PKT_RCVD_NOTIFY) (
  IN EFI_STATUS           Status, 
  IN UINT8                IcmpErr,
  IN EFI_NET_SESSION_DATA *NetSession,
  IN NET_BUF              *Pkt,
  IN VOID                 *Context
  );

/**
  The prototype is called back when an IP packet is sent.
  
  @param[in] Status        Result of the IP packet being sent.
  @param[in] Context       The data provided by user for the received packet when
                           the callback is registered in IP_IO_OPEN_DATA::SndContext.
  @param[in] Sender        A Union type to specify a pointer of EFI_IP4_PROTOCOL 
                           or EFI_IP6_PROTOCOL.
  @param[in] NotifyData    The Context data specified when calling IpIoSend()
  
**/
typedef
VOID
(EFIAPI *PKT_SENT_NOTIFY) (
  IN EFI_STATUS        Status,
  IN VOID              *Context,
  IN IP_IO_IP_PROTOCOL Sender,
  IN VOID              *NotifyData
  );

///
/// This data structure wraps Ip4/Ip6 instances. The IpIo Library uses it for all
/// Ip4/Ip6 operations.
///
typedef struct _IP_IO {
  ///
  /// The node used to link this IpIo to the active IpIo list.
  ///
  LIST_ENTRY                    Entry;

  ///
  /// The list used to maintain the IP instance for different sending purpose.
  ///
  LIST_ENTRY                    IpList;
  
  EFI_HANDLE                    Controller;
  EFI_HANDLE                    Image;
  EFI_HANDLE                    ChildHandle;
  //
  // The IP instance consumed by this IP_IO
  //
  IP_IO_IP_PROTOCOL             Ip;
  BOOLEAN                       IsConfigured;

  ///
  /// Some ip configuration data can be changed.
  ///
  UINT8                         Protocol;

  ///
  /// Token and event used to get data from IP.
  ///
  IP_IO_IP_COMPLETION_TOKEN     RcvToken; 

  ///
  /// List entry used to link the token passed to IP_IO.
  ///
  LIST_ENTRY                    PendingSndList;

  //
  // User interface used to get notify from IP_IO
  //
  VOID                          *RcvdContext;    ///< See IP_IO_OPEN_DATA::RcvdContext.
  VOID                          *SndContext;     ///< See IP_IO_OPEN_DATA::SndContext.
  PKT_RCVD_NOTIFY               PktRcvdNotify;   ///< See IP_IO_OPEN_DATA::PktRcvdNotify.
  PKT_SENT_NOTIFY               PktSentNotify;   ///< See IP_IO_OPEN_DATA::PktSentNotify.
  UINT8                         IpVersion;
  IP4_ADDR                      StationIp;
  IP4_ADDR                      SubnetMask;
} IP_IO;

///
/// The struct is for the user to pass IP configuration and callbacks to IP_IO.
/// It is used by IpIoOpen().
///
typedef struct _IP_IO_OPEN_DATA {
  IP_IO_IP_CONFIG_DATA IpConfigData;    ///< Configuration of the IP instance.
  VOID                 *RcvdContext;    ///< Context data used by receive callback.
  VOID                 *SndContext;     ///< Context data used by send callback.
  PKT_RCVD_NOTIFY      PktRcvdNotify;   ///< Receive callback.
  PKT_SENT_NOTIFY      PktSentNotify;   ///< Send callback.
} IP_IO_OPEN_DATA;

///
/// Internal struct book-keeping send request of IP_IO.
///
/// An IP_IO_SEND_ENTRY will be created each time a send request is issued to
/// IP_IO via IpIoSend().
///
typedef struct _IP_IO_SEND_ENTRY {
  LIST_ENTRY                Entry;
  IP_IO                     *IpIo;
  VOID                      *Context;
  VOID                      *NotifyData;
  IP_IO_IP_PROTOCOL         Ip;
  NET_BUF                   *Pkt;
  IP_IO_IP_COMPLETION_TOKEN SndToken;
} IP_IO_SEND_ENTRY;

///
/// The IP_IO_IP_INFO is used in IpIoSend() to override the default IP instance
/// in IP_IO.
///
typedef struct _IP_IO_IP_INFO {
  EFI_IP_ADDRESS            Addr;
  IP_IO_IP_MASK             PreMask;
  LIST_ENTRY                Entry;
  EFI_HANDLE                ChildHandle;
  IP_IO_IP_PROTOCOL         Ip;
  IP_IO_IP_COMPLETION_TOKEN DummyRcvToken;
  INTN                      RefCnt;
  UINT8                     IpVersion;
} IP_IO_IP_INFO;

/**
  Create a new IP_IO instance.
  
  This function uses IP4/IP6 service binding protocol in Controller to create
  an IP4/IP6 child (aka IP4/IP6 instance).

  @param[in]  Image             The image handle of the driver or application that
                                consumes IP_IO.
  @param[in]  Controller        The controller handle that has IP4 or IP6 service
                                binding protocol installed.
  @param[in]  IpVersion         The version of the IP protocol to use, either
                                IPv4 or IPv6.                            

  @return The pointer to a newly created IP_IO instance, or NULL if failed.

**/
IP_IO *
EFIAPI
IpIoCreate (
  IN EFI_HANDLE Image,
  IN EFI_HANDLE Controller,
  IN UINT8      IpVersion
  );

/**
  Destroy an IP_IO instance.
  
  This function is paired with IpIoCreate(). The IP_IO will be closed first.
  Resource will be freed afterwards. See IpIoClose().

  @param[in, out]  IpIo         The pointer to the IP_IO instance that needs to be
                                destroyed.

  @retval          EFI_SUCCESS  The IP_IO instance was destroyed successfully.
  @retval          Others       An error condition occurred.

**/
EFI_STATUS
EFIAPI
IpIoDestroy (
  IN OUT IP_IO *IpIo
  );

/**
  Stop an IP_IO instance.
  
  This function is paired with IpIoOpen(). The IP_IO will be unconfigured, and all
  pending send/receive tokens will be canceled.

  @param[in, out]  IpIo            The pointer to the IP_IO instance that needs to stop.

  @retval          EFI_SUCCESS     The IP_IO instance stopped successfully.
  @retval          Others          Anrror condition occurred.

**/
EFI_STATUS
EFIAPI
IpIoStop (
  IN OUT IP_IO *IpIo
  );

/**
  Open an IP_IO instance for use.
  
  This function is called after IpIoCreate(). It is used for configuring the IP
  instance and register the callbacks and their context data for sending and
  receiving IP packets.

  @param[in, out]  IpIo               The pointer to an IP_IO instance that needs
                                      to open.
  @param[in]       OpenData           The configuration data and callbacks for
                                      the IP_IO instance.

  @retval          EFI_SUCCESS        The IP_IO instance opened with OpenData
                                      successfully.
  @retval          EFI_ACCESS_DENIED  The IP_IO instance is configured; avoid  
                                      reopening it.
  @retval          Others             An error condition occurred.

**/
EFI_STATUS
EFIAPI
IpIoOpen (
  IN OUT IP_IO           *IpIo,
  IN     IP_IO_OPEN_DATA *OpenData
  );

/**
  Send out an IP packet.
  
  This function is called after IpIoOpen(). The data to be sent are wrapped in
  Pkt. The IP instance wrapped in IpIo is used for sending by default, but can be
  overriden by Sender. Other sending configurations, such as source address and gateway
  address, are specified in OverrideData.

  @param[in, out]  IpIo                  The pointer to an IP_IO instance used for sending IP
                                         packet.
  @param[in, out]  Pkt                   The pointer to the IP packet to be sent.
  @param[in]       Sender                Optional. The IP protocol instance used for sending.
  @param[in]       Context               The optional context data.
  @param[in]       NotifyData            The optional notify data.
  @param[in]       Dest                  The destination IP address to send this packet to.
  @param[in]       OverrideData          The data to override some configuration of the IP
                                         instance used for sending.

  @retval          EFI_SUCCESS           The operation completed successfully.
  @retval          EFI_NOT_STARTED       The IpIo is not configured.
  @retval          EFI_OUT_OF_RESOURCES  Failed due to resource limitations.

**/
EFI_STATUS
EFIAPI
IpIoSend (
  IN OUT IP_IO          *IpIo,
  IN OUT NET_BUF        *Pkt,
  IN     IP_IO_IP_INFO  *Sender        OPTIONAL,
  IN     VOID           *Context       OPTIONAL,
  IN     VOID           *NotifyData    OPTIONAL,
  IN     EFI_IP_ADDRESS *Dest,
  IN     IP_IO_OVERRIDE *OverrideData  OPTIONAL
  );

/**
  Cancel the IP transmit token that wraps this Packet.

  @param[in]  IpIo                  The pointer to the IP_IO instance.
  @param[in]  Packet                The pointer to the packet of NET_BUF to cancel.

**/
VOID
EFIAPI
IpIoCancelTxToken (
  IN IP_IO  *IpIo,
  IN VOID   *Packet
  );

/**
  Add a new IP instance for sending data.
  
  The function is used to add the IP_IO to the IP_IO sending list. The caller
  can later use IpIoFindSender() to get the IP_IO and call IpIoSend() to send
  data.

  @param[in, out]  IpIo               The pointer to an IP_IO instance to add a new IP
                                      instance for sending purposes.

  @return The pointer to the created IP_IO_IP_INFO structure; NULL if failed.

**/
IP_IO_IP_INFO *
EFIAPI
IpIoAddIp (
  IN OUT IP_IO  *IpIo
  );

/**
  Configure the IP instance of this IpInfo and start the receiving if IpConfigData
  is not NULL.

  @param[in, out]  IpInfo          The pointer to the IP_IO_IP_INFO instance.
  @param[in, out]  IpConfigData    The IP4 or IP6 configure data used to configure 
                                   the IP instance. If NULL, the IP instance is reset.
                                   If UseDefaultAddress is set to TRUE, and the configure
                                   operation succeeds, the default address information
                                   is written back in this IpConfigData.

  @retval          EFI_SUCCESS     The IP instance of this IpInfo was configured successfully,
                                   or there is no need to reconfigure it.
  @retval          Others          The configuration failed.

**/
EFI_STATUS
EFIAPI
IpIoConfigIp (
  IN OUT IP_IO_IP_INFO        *IpInfo,
  IN OUT VOID                 *IpConfigData OPTIONAL
  );

/**
  Destroy an IP instance maintained in IpIo->IpList for
  sending purpose.
  
  This function pairs with IpIoAddIp(). The IpInfo is previously created by
  IpIoAddIp(). The IP_IO_IP_INFO::RefCnt is decremented and the IP instance
  will be dstroyed if the RefCnt is zero.

  @param[in]  IpIo                  The pointer to the IP_IO instance.
  @param[in]  IpInfo                The pointer to the IpInfo to be removed.

**/
VOID
EFIAPI
IpIoRemoveIp (
  IN IP_IO            *IpIo,
  IN IP_IO_IP_INFO    *IpInfo
  );

/**
  Find the first IP protocol maintained in IpIo whose local
  address is the same as Src.
  
  This function is called when the caller needs the IpIo to send data to the
  specified Src. The IpIo was added previously by IpIoAddIp().

  @param[in, out]  IpIo              The pointer to the pointer of the IP_IO instance.
  @param[in]       IpVersion         The version of the IP protocol to use, either
                                     IPv4 or IPv6.
  @param[in]       Src               The local IP address.

  @return The pointer to the IP protocol can be used for sending purpose and its local
          address is the same with Src.

**/
IP_IO_IP_INFO *
EFIAPI
IpIoFindSender (
  IN OUT IP_IO           **IpIo,
  IN     UINT8           IpVersion,
  IN     EFI_IP_ADDRESS  *Src
  );

/**
  Get the ICMP error map information.
  
  The ErrorStatus will be returned. The IsHard and Notify are optional. If they
  are not NULL, this routine will fill them.

  @param[in]   IcmpError             IcmpError Type.
  @param[in]   IpVersion             The version of the IP protocol to use,
                                     either IPv4 or IPv6. 
  @param[out]  IsHard                If TRUE, indicates that it is a hard error.
  @param[out]  Notify                If TRUE, SockError needs to be notified.

  @return The ICMP Error Status, such as EFI_NETWORK_UNREACHABLE.

**/
EFI_STATUS
EFIAPI
IpIoGetIcmpErrStatus (
  IN  UINT8       IcmpError,
  IN  UINT8       IpVersion,
  OUT BOOLEAN     *IsHard  OPTIONAL,
  OUT BOOLEAN     *Notify  OPTIONAL
  );

/**
  Refresh the remote peer's Neighbor Cache entries.

  This function is called when the caller needs the IpIo to refresh the existing
  IPv6 neighbor cache entries since the neighbor is considered reachable by the 
  node has recently received a confirmation that packets sent recently to the 
  neighbor were received by its IP layer. 

  @param[in]   IpIo                  The pointer to an IP_IO instance
  @param[in]   Neighbor              The IP address of the neighbor
  @param[in]   Timeout               The time in 100-ns units that this entry will
                                     remain in the neighbor cache. A value of 
                                     zero means that the entry is permanent. 
                                     A value of non-zero means that the entry is 
                                     dynamic and will be deleted after Timeout.

  @retval      EFI_SUCCESS           The operation completed successfully.
  @retval      EFI_NOT_STARTED       The IpIo is not configured.
  @retval      EFI_INVALID_PARAMETER The Neighbor Address is invalid.
  @retval      EFI_NOT_FOUND         The neighbor cache entry is not in the 
                                     neighbor table.  
  @retval      EFI_OUT_OF_RESOURCES  Failed due to resource limitations.

**/
EFI_STATUS
IpIoRefreshNeighbor (
  IN IP_IO           *IpIo,
  IN EFI_IP_ADDRESS  *Neighbor,
  IN UINT32          Timeout  
  );

#endif

