/** @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 |