/** @file
  EFI DHCP protocol implementation.
  RFCs supported are:
  RFC 2131: Dynamic Host Configuration Protocol
  RFC 2132: DHCP Options and BOOTP Vendor Extensions
  RFC 1534: Interoperation Between DHCP and BOOTP
  RFC 3396: Encoding Long Options in DHCP.

Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __EFI_DHCP4_IMPL_H__
#define __EFI_DHCP4_IMPL_H__

#include <Uefi.h>

#include <Protocol/Dhcp4.h>
#include <Protocol/Udp4.h>
#include <IndustryStandard/Dhcp.h>
#include <Library/DebugLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/BaseLib.h>
#include <Library/NetLib.h>

typedef struct _DHCP_SERVICE   DHCP_SERVICE;
typedef struct _DHCP_PROTOCOL  DHCP_PROTOCOL;

#include "Dhcp4Option.h"
#include "Dhcp4Io.h"

#define DHCP_SERVICE_SIGNATURE   SIGNATURE_32 ('D', 'H', 'C', 'P')
#define DHCP_PROTOCOL_SIGNATURE  SIGNATURE_32 ('d', 'h', 'c', 'p')

#define DHCP_CHECK_MEDIA_WAITING_TIME  EFI_TIMER_PERIOD_SECONDS(20)

//
// The state of the DHCP service. It starts as UNCONFIGED. If
// and active child configures the service successfully, it
// goes to CONFIGED. If the active child configures NULL, it
// goes back to UNCONFIGED. It becomes DESTROY if it is (partly)
// destroyed.
//
#define DHCP_UNCONFIGED  0
#define DHCP_CONFIGED    1
#define DHCP_DESTROY     2

struct _DHCP_PROTOCOL {
  UINT32                              Signature;
  EFI_DHCP4_PROTOCOL                  Dhcp4Protocol;
  LIST_ENTRY                          Link;
  EFI_HANDLE                          Handle;
  DHCP_SERVICE                        *Service;

  BOOLEAN                             InDestroy;

  EFI_EVENT                           CompletionEvent;
  EFI_EVENT                           RenewRebindEvent;

  EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN    *Token;
  UDP_IO                              *UdpIo; // The UDP IO used for TransmitReceive.
  UINT32                              Timeout;
  UINT16                              ElaspedTime;
  NET_BUF_QUEUE                       ResponseQueue;
};

//
// DHCP driver is specical in that it is a singleton. Although it
// has a service binding, there can be only one active child.
//
struct _DHCP_SERVICE {
  UINT32                          Signature;
  EFI_SERVICE_BINDING_PROTOCOL    ServiceBinding;

  INTN                            ServiceState; // CONFIGED, UNCONFIGED, and DESTROY

  EFI_HANDLE                      Controller;
  EFI_HANDLE                      Image;

  LIST_ENTRY                      Children;
  UINTN                           NumChildren;

  INTN                            DhcpState;
  EFI_STATUS                      IoStatus;   // the result of last user operation
  UINT32                          Xid;

  IP4_ADDR                        ClientAddr; // lease IP or configured client address
  IP4_ADDR                        Netmask;
  IP4_ADDR                        ServerAddr;

  EFI_DHCP4_PACKET                *LastOffer; // The last received offer
  EFI_DHCP4_PACKET                *Selected;
  DHCP_PARAMETER                  *Para;

  UINT32                          Lease;
  UINT32                          T1;
  UINT32                          T2;
  INTN                            ExtraRefresh; // This refresh is reqested by user

  UDP_IO                          *UdpIo;       // Udp child receiving all DHCP message
  UDP_IO                          *LeaseIoPort; // Udp child with lease IP
  EFI_DHCP4_PACKET                *LastPacket;  // The last sent packet for retransmission
  EFI_MAC_ADDRESS                 Mac;
  UINT8                           HwType;
  UINT8                           HwLen;
  UINT8                           ClientAddressSendOut[16];

  DHCP_PROTOCOL                   *ActiveChild;
  EFI_DHCP4_CONFIG_DATA           ActiveConfig;
  UINT32                          UserOptionLen;

  //
  // Timer event and various timer
  //
  EFI_EVENT                       Timer;

  UINT32                          PacketToLive; // Retransmission timer for our packets
  UINT32                          LastTimeout;  // Record the init value of PacketToLive every time
  INTN                            CurRetry;
  INTN                            MaxRetries;
  UINT32                          LeaseLife;
};

typedef struct {
  EFI_DHCP4_PACKET_OPTION    **Option;
  UINT32                     OptionCount;
  UINT32                     Index;
} DHCP_PARSE_CONTEXT;

#define DHCP_INSTANCE_FROM_THIS(Proto)  \
  CR ((Proto), DHCP_PROTOCOL, Dhcp4Protocol, DHCP_PROTOCOL_SIGNATURE)

#define DHCP_SERVICE_FROM_THIS(Sb)      \
  CR ((Sb), DHCP_SERVICE, ServiceBinding, DHCP_SERVICE_SIGNATURE)

extern EFI_DHCP4_PROTOCOL  mDhcp4ProtocolTemplate;

/**
  Give up the control of the DHCP service to let other child
  resume. Don't change the service's DHCP state and the Client
  address and option list configure as required by RFC2131.

  @param  DhcpSb                 The DHCP service instance.

**/
VOID
DhcpYieldControl (
  IN DHCP_SERVICE  *DhcpSb
  );

/**
  Complete a Dhcp4 transaction and signal the upper layer.

  @param Instance      Dhcp4 instance.

**/
VOID
PxeDhcpDone (
  IN DHCP_PROTOCOL  *Instance
  );

/**
  Free the resource related to the configure parameters.
  DHCP driver will make a copy of the user's configure
  such as the time out value.

  @param  Config                 The DHCP configure data

**/
VOID
DhcpCleanConfigure (
  IN OUT EFI_DHCP4_CONFIG_DATA  *Config
  );

/**
  Callback of Dhcp packet. Does nothing.

  @param Arg           The context.

**/
VOID
EFIAPI
DhcpDummyExtFree (
  IN VOID  *Arg
  );

/**
  Set the elapsed time based on the given instance and the pointer to the
  elapsed time option.

  @param[in]      Elapsed       The pointer to the position to append.
  @param[in]      Instance      The pointer to the Dhcp4 instance.
**/
VOID
SetElapsedTime (
  IN     UINT16         *Elapsed,
  IN     DHCP_PROTOCOL  *Instance
  );

#endif
