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